Jump to content

Search the Community

Showing results for tags 'c++'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Forum board
    • M2Zone.tech
  • Create private server
    • Problems and Questions
    • Looking for...
    • Cooperation
    • Tutorials / Video
    • C++ / Python / Server
    • Sources / Serverfiles / Clients
    • Quests
    • Graphics
    • Programs
  • Marketplace
    • Sell
    • Buy
  • Hydepark
    • About all
    • Introduce yourself
    • Media
    • My Creativity
  • Others
    • Archives
    • Trash

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Sex


Country


Facebook


Discord


Telegram


Gadu-Gadu

Found 122 results

  1. Zdaje się, że początkowo przeszywające uderzenie miało mieć swój efekt wizualny (podobny do tego przy uderzeniu krytycznym), ale z jakiegoś powodu nie zostało to finalnie wdrożone. Zatem jakbyśmy chcieli taki efekt to... 01: Otwieramy char_battle.cpp (source game Srcs/Server/game/src) i szukamy tego: { IsPenetrate = true; if (test_server) ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°üĹë Ăß°ˇ µĄąĚÁö %d"), GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100); dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100; if (IsAffectFlag(AFF_MANASHIELD)) { I zmieniamy na to: { IsPenetrate = true; if (test_server) ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°üĹë Ăß°ˇ µĄąĚÁö %d"), GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100); dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100; EffectPacket(SE_PENETRATE); if (IsAffectFlag(AFF_MANASHIELD)) { Szukamy tego: { IsPenetrate = true; if (test_server) ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°üĹë Ăß°ˇ µĄąĚÁö %d"), GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100); dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100; } I zmieniamy na to: { IsPenetrate = true; if (test_server) ChatPacket(CHAT_TYPE_INFO, LC_TEXT("°üĹë Ăß°ˇ µĄąĚÁö %d"), GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100); dam += GetPoint(POINT_DEF_GRADE) * (100 + GetPoint(POINT_DEF_BONUS)) / 100; EffectPacket(SE_PENETRATE); }
  2. Kupiłem to kiedyś ale nie użyłem jeszcze, może komuś się przyda :v [Hidden Content] DewsPlus.rar
  3. Witam Dziś pokaże wam co zrobić by wszyscy widzieli poprawnie zaktualizowany lv. Wersja Packet <-- Poprawna. Source Game: packet.h Szukaj: typedef struct packet_update_char Niżej: short sAlignment; Dodaj: DWORD dwLevel; char.cpp Szukaj: void CHARACTER::UpdatePacket() Niżej: pack.sAlignment = m_iAlignment / 10; Dodaj pod: pack.dwLevel = GetLevel(); Source Bin: Packet.h typedef struct packet_update_char Niżej short sAlignment; Dodaj pod: DWORD dwLevel; PythonNetworkStreamPhaseGameActor.cpp Szukaj: bool CPythonNetworkStream::RecvCharacterUpdatePacket() Niżej: kNetUpdateActorData.m_sAlignment=chrUpdatePacket.sAlignment; Dodaj pod:: kNetUpdateActorData.m_dwLevel=chrUpdatePacket.dwLevel; NetworkActorManager.cpp Szukaj: void CNetworkActorManager::UpdateActor(const SNetworkUpdateActorData& c_rkNetUpdateActorData) Niżej: pkInstFind->SetAlignment(c_rkNetUpdateActorData.m_sAlignment); Dodaj pod: pkInstFind->SetLevel(c_rkNetUpdateActorData.m_dwLevel); NetworkActorManager.h Szukaj: struct SNetworkUpdateActorData Niżej: short m_sAlignment; Dodaj pod: DWORD m_dwLevel; InstanceBaseEffect.cpp Szukaj: void CInstanceBase::SetAlignment(short sAlignment) Pod funkcją dodaj tą funkcję: void CInstanceBase::SetLevel(DWORD level) { m_dwLevel = level; UpdateTextTailLevel(m_dwLevel); } Szukaj: void CInstanceBase::UpdateTextTailLevel(DWORD level) Zamień funkcję na: void CInstanceBase::UpdateTextTailLevel(DWORD level) { if (IsPC()) { static D3DXCOLOR s_kLevelColor = D3DXCOLOR(152.0f/255.0f, 255.0f/255.0f, 51.0f/255.0f, 1.0f); char szText[256]; sprintf(szText, "Lv %d", level); CPythonTextTail::Instance().AttachLevel(GetVirtualID(), szText, s_kLevelColor); } } InstanceBase.h Szukaj: void SetAlignment(short sAlignment); Dodaj pod: void SetLevel(DWORD level);
  4. Won system Won Sistemi.rar Nie testowane. [Hidden Content]
  5. Witam Pokaże Wam jak usunąć błąd dotyczący wywalenia serwera przez upuszczanie itemów. Teraz gdy ktoś użyje skryptu np. w m2bob ("Wyrzuć wszystko") zostanie wylogowany, a z jego ekwipunku zostaną upuszczone maksymalnie 4 przedmioty. Exploit Wyrzucanie Itemów Wejdź do char_item.cpp w /src/game/ Wejdź do char.h w /src/game/ Wejdź do char.cpp w /src/game/ Pozdrawiam
  6. Cześć! Nudziło mi się, wiec edytowałem podstawowy wykrywacz kamieni metin na wykrywacz metinów i bossów. System posiada: Wykrywanie metinów na danej mapie. Wykrywanie bossów na danej mapie (rank 5 potwora ustawione w mysql - mob_proto!). Implementacja wykorzystuje pakiety i questflagi. Edytowane naliczanie użyć na socket. Łączenie się wykrywaczy. Nakłada limit czasowy po teleportacji. Dodatkowo: USE_COUNT_MOB_SEARCH - ilość użyć przedmiotu domyślnie podczas tworzenia - CreateItem(...) MAX_COUNT_MOB_SEARCH- Maksymalna ilość wykrywaczy w stacku. ID wykrywaczy domyślne tj. 27989 oraz 76006. Oczywiście takie rzeczy jak nazewnictwo itd. pozostawiam wam + jeżeli ktoś znajdzie jakiś błąd proszę pisać ! Gify poglądowe: Teleportacja natychmiastowa: Teleportacja z przeładowaniem: Łączenie przedmiotów: Tak wiec edycję zaczniemy od game'a! W pliku: "../game/src/main.cpp" na dole wśród include'ów dodajemy: #ifdef ENABLE_MOB_SEARCH #include "mobsearch.h" #endif Następnie np pod "CSkillManager skill_manager;" dodajemy: #ifdef ENABLE_MOB_SEARCH MobSearchManager mobsearch; #endif W pliku: "../game/src/Makefile" na przykład po "OXEvent.cpp " dodajemy: mobsearch.cpp W pliku: "../game/src/packet.h" W enum'ie pod "HEADER_CG_EMPIRE = 90," dodajemy: #ifdef ENABLE_MOB_SEARCH HEADER_CG_MOB_SEARCH_CONFIRM = 91, #endif Następnie pod "HEADER_GC_PARTY_UNLINK = 92," dodajemy: #ifdef ENABLE_MOB_SEARCH HEADER_GC_SEARCH_SUCCESS = 93, HEADER_GC_SEARCH_FAILL = 94, #endif Dalej nad struktura "typedef struct command_whisper" dodajemy: #ifdef ENABLE_MOB_SEARCH typedef struct command_searchSuccess_packet{ BYTE bHeader; long mobVnum; }TPacketSearchSuccess; typedef struct command_searchFaill_packet{ BYTE bHeader; BYTE failConfirm; }TPacketSearchFaill; typedef struct command_searchConfim_packet{ BYTE bHeader; BYTE bConfirm; }TPacketCGSearchConfirm; #endif W pliku: "../game/src/packet_info.cpp" W CPacketInfoCG na przyklad nad: "Set(HEADER_CG_GUILD_SYMBOL_UPLOAD, sizeof(TPacketCGGuildSymbolUpload), "SymbolUpload", false);" dodajemy: #ifdef ENABLE_MOB_SEARCH Set(HEADER_CG_MOB_SEARCH_CONFIRM, sizeof(TPacketCGSearchConfirm), "MobSearchConfirm", true); #endif W pliku: "../game/src/safebox.cpp" W funkcji MoveItem(...) nad "if ((item2 = GetItem(bDestCell)) && item != item2 && item2->IsStackable() &&" dodajemy: #ifdef ENABLE_MOB_SEARCH if((item2 = GetItem(bDestCell)) && (item2->GetVnum() == 27989 || item2->GetVnum() == 76006) && (item2->GetVnum() == 27989 || item2->GetVnum() == 76006)) { if(item->GetSocket(0) <= 0 || item2->GetSocket(0) <= 0) return false; if((item->GetSocket(0) + item2->GetSocket(0)) > MAX_COUNT_MOB_SEARCH) { if(item->GetSocket(0) <= MAX_COUNT_MOB_SEARCH && item2->GetSocket(0) <= MAX_COUNT_MOB_SEARCH) { int iItemCount = item->GetSocket(0); int iItemCount2 = item2->GetSocket(0); item2->SetSocket(0, MAX_COUNT_MOB_SEARCH); item->SetSocket(0, iItemCount - (MAX_COUNT_MOB_SEARCH - iItemCount2)); } }else{ item2->SetSocket(0, item->GetSocket(0) + item2->GetSocket(0)); M2_DESTROY_ITEM(item); return true; } } #endif W pliku: "../game/src/char.cpp" W funkcji CanWarp() dodajemy: #ifdef ENABLE_MOB_SEARCH if ((iPulse - GetSearchMobTime()) < limit_time) return false; #endif W pliku: "../game/src/char.h" Gdzieś w sekcji public dodajemy następujące deklaracje: #ifdef ENABLE_MOB_SEARCH int GetSearchMobTime() const {return m_iSearchMobTime;} void SetSearchMobTime() { m_iSearchMobTime = thecore_pulse();} int m_iSearchMobTime; #endif W pliku: "../game/src/char_item.cpp" Na górze wśród include'ów dodajemy: #ifdef ENABLE_MOB_SEARCH #include "mobsearch.h" #endif W funkcji UseItemEX(...) wyszukujemy:: case 27989: case 76006: Kod poniżej tych case'ów sprowadzamy do następującej postaci: case 27989: case 76006: { #ifdef ENABLE_MOB_SEARCH MobSearchManager::instance().mobSearchFind(this, item); #endif } break; (można zamienić składnie na ifdef else endif jezeli chcecie zachować poprzednia funkcjonalność) W funkcji MoveItem(...) nad "if ((item2 = GetItem(DestCell)) && item != item2 && item2->IsStackable() &&" dodajemy: #ifdef ENABLE_MOB_SEARCH if((item2 = GetItem(DestCell)) && (item2->GetVnum() == 27989 || item2->GetVnum() == 76006) && (item2->GetVnum() == 27989 || item2->GetVnum() == 76006)) { if(item->GetSocket(0) <= 0 || item2->GetSocket(0) <= 0) return false; if((item->GetSocket(0) + item2->GetSocket(0)) > MAX_COUNT_MOB_SEARCH) { if(item->GetSocket(0) <= MAX_COUNT_MOB_SEARCH && item2->GetSocket(0) <= MAX_COUNT_MOB_SEARCH) { int iItemCount = item->GetSocket(0); int iItemCount2 = item2->GetSocket(0); item2->SetSocket(0, MAX_COUNT_MOB_SEARCH); item->SetSocket(0, iItemCount - (MAX_COUNT_MOB_SEARCH - iItemCount2)); } }else{ item2->SetSocket(0, item->GetSocket(0) + item2->GetSocket(0)); M2_DESTROY_ITEM(item); return true; } } #endif W funkcji PickupItem(...) "if (item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK))" zamieniamy na:" #ifdef ENABLE_MOB_SEARCH if ((item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK)) || (item->GetVnum() == 27989 || item->GetVnum() == 76006)) #else if (item->IsStackable() && !IS_SET(item->GetAntiFlag(), ITEM_ANTIFLAG_STACK)) #endif W tej samej funkcji nad "if (item2->GetVnum() == item->GetVnum())" dodajemy: #ifdef ENABLE_MOB_SEARCH if(item->GetVnum() == 27989 || item->GetVnum() == 76006){ if(item2->GetVnum() == 27989 || item2->GetVnum() == 76006){ if(item->GetSocket(0) <= 0 || item2->GetSocket(0) <= 0) return false; if((item->GetSocket(0) + item2->GetSocket(0)) > MAX_COUNT_MOB_SEARCH) { if(item->GetSocket(0) <= MAX_COUNT_MOB_SEARCH && item2->GetSocket(0) <= MAX_COUNT_MOB_SEARCH) { int iItemCount = item->GetSocket(0); int iItemCount2 = item2->GetSocket(0); item2->SetSocket(0, MAX_COUNT_MOB_SEARCH); item->SetSocket(0, iItemCount - (MAX_COUNT_MOB_SEARCH - iItemCount2)); } }else{ item2->SetSocket(0, item->GetSocket(0) + item2->GetSocket(0)); M2_DESTROY_ITEM(item); return true; } } } #endif W pliku "../game/src/input_main.cpp" Na górze wśród include'ów dodajemy: #ifdef ENABLE_MOB_SEARCH #include "mobsearch.h" #endif W funkcji Analyze(...) np nad case HEADER_CG_SAFEBOX_CHECKIN: dodajemy: #ifdef ENABLE_MOB_SEARCH case HEADER_CG_MOB_SEARCH_CONFIRM: { MobSearchManager::instance().mobSearchGoto(ch, c_pData); } break; #endif W pliku: "../game/src/item_manager.cpp" W funkcji LPITEM ITEM_MANAGER::CreateItem(...) na końcu przed return item dodajemy: #ifdef ENABLE_MOB_SEARCH if(vnum == 27989 || vnum == 76006) item->SetSocket(0, USE_COUNT_MOB_SEARCH); #endif Teraz pobieracie z załącznika pliki: mobsearch.cpp mobsearch.h I wrzucacie je do katalogu "../game/src/" W pliku "../common/service.h" Dodajemy: #ifndef ENABLE_MOB_SEARCH #define ENABLE_MOB_SEARCH #define MAX_COUNT_MOB_SEARCH 200 #define USE_COUNT_MOB_SEARCH 6 #endif Teraz source klient! W pliku: "../UserInterface/Locale_inc.h" Dodajemy: #define ENABLE_MOB_SEARCH W pliku: "../UserInterface/Packet.h" Pod "HEADER_CG_EMPIRE = 90," dodajemy: #ifdef ENABLE_MOB_SEARCH HEADER_CG_MOB_SEARCH_CONFIRM = 91, #endif Następnie pod: "HEADER_GC_PARTY_UNLINK = 92," dodajemy: #ifdef ENABLE_MOB_SEARCH HEADER_GC_SEARCH_SUCCESS = 93, HEADER_GC_SEARCH_FAILL = 94, #endif Dalej nad: "typedef struct packet_ground_del_item" dodajemy: #ifdef ENABLE_MOB_SEARCH typedef struct command_searchSuccess_packet{ BYTE bHeader; long mobVnum; }TPacketGCSearchSuccess; typedef struct command_searchFaill_packet{ BYTE bHeader; BYTE failConfirm; }TPacketGCSearchFaill; typedef struct command_searchConfim_packet{ BYTE bHeader; BYTE bConfirm; }TPacketCGSearchConfirm; #endif W pliku: "../UserInterface/PythonApplicationModule.cpp" Na przykład nad: "#ifdef ENABLE_DRAGON_SOUL_SYSTEM" dodajemy: #ifdef ENABLE_MOB_SEARCH PyModule_AddIntConstant(poModule, "ENABLE_MOB_SEARCH", 1); #else PyModule_AddIntConstant(poModule, "ENABLE_MOB_SEARCH", 0); #endif W pliku: "../UserInterface/PythonNetworkStream.cpp" Na przyklad pod: "Set(HEADER_GC_CHANGE_NAME, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCChangeName), STATIC_SIZE_PACKET));" dodajemy: #ifdef ENABLE_MOB_SEARCH Set(HEADER_GC_SEARCH_SUCCESS, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCSearchSuccess), STATIC_SIZE_PACKET)); Set(HEADER_GC_SEARCH_FAILL, CNetworkPacketHeaderMap::TPacketType(sizeof(TPacketGCSearchFaill), STATIC_SIZE_PACKET)); #endif W pliku: "../UserInterface/PythonApplicationModule.cpp" Na przykład nad: "#ifdef ENABLE_DRAGON_SOUL_SYSTEM" dodajemy: #ifdef ENABLE_MOB_SEARCH PyModule_AddIntConstant(poModule, "ENABLE_MOB_SEARCH", 1); #else PyModule_AddIntConstant(poModule, "ENABLE_MOB_SEARCH", 0); #endif W pliku: "../UserInterface/PythonNetworkStreamPhaseGame.cpp" Na przykład nad: "case HEADER_GC_CHARACTER_UPDATE:" dodajemy: #ifdef ENABLE_MOB_SEARCH case HEADER_GC_SEARCH_SUCCESS: ret = RecvSearchSuccess(); break; case HEADER_GC_SEARCH_FAILL: ret = RecvSearchFaill(); break; #endif Dalej na przykład nad: "bool CPythonNetworkStream::RecvChannelPacket()" #ifdef ENABLE_MOB_SEARCH bool CPythonNetworkStream::RecvSearchSuccess(){ TPacketGCSearchSuccess searchSuccessGC; if (!Recv(sizeof(TPacketGCSearchSuccess), &searchSuccessGC)){ return false; } PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OpenSearchSuccessDialog", Py_BuildValue("(i)", searchSuccessGC.mobVnum)); return true; } bool CPythonNetworkStream::RecvSearchFaill(){ TPacketGCSearchFaill searchFaillGC; if (!Recv(sizeof(TPacketGCSearchFaill), &searchFaillGC)){ return false; } PyCallClassMemberFunc(m_apoPhaseWnd[PHASE_WINDOW_GAME], "OpenMobSearchFaillDialog", Py_BuildValue("(i)", searchFaillGC.failConfirm)); return true; } bool CPythonNetworkStream::SendMobSearchConfirmPacket(BYTE bData){ TPacketCGSearchConfirm SearchConfirm; SearchConfirm.bHeader = HEADER_CG_MOB_SEARCH_CONFIRM; SearchConfirm.bConfirm = bData; if (!Send(sizeof(TPacketCGSearchConfirm), &SearchConfirm)){ return false; } return SendSequence(); } #endif W pliku: "../UserInterface/PythonNetworkStreamModule.cpp" Na przykład nad: "PyObject* netSendSelectItemPacket(PyObject* poSelf, PyObject* poArgs)" dodajemy: #ifdef ENABLE_MOB_SEARCH PyObject* netCallMobSearchConfirmPacket(PyObject* poSelf, PyObject* poArgs){ BYTE bData; if (!PyTuple_GetByte(poArgs, 0, &bData)){ return Py_BuildException(); } CPythonNetworkStream& rns = CPythonNetworkStream::Instance(); rns.SendMobSearchConfirmPacket(bData); return Py_BuildNone(); } #endif Następnie np pod: "{ "SendEnterGamePacket", netSendEnterGamePacket, METH_VARARGS }," dodajemy: #ifdef ENABLE_MOB_SEARCH { "SendMobSearchConfirm", netCallMobSearchConfirmPacket, METH_VARARGS }, #endif W pliku: "../UserInterface/PythonNetworkStream.h" Na przykład pod "bool RecvMainCharacter4_BGM_VOL();" dodajemy: #ifdef ENABLE_MOB_SEARCH public: bool RecvSearchSuccess(); bool RecvSearchFaill(); bool SendMobSearchConfirmPacket(BYTE bData); protected: #endif Już pozostał tylko klient (py) W pliku: "root/uitooltip.py" Pod if'em "if 27989 == itemVnum or 76006 == itemVnum:" linijkę "self.AppendTextLine(...)" zmieniamy na: self.AppendTextLine(localeInfo.TOOLTIP_REST_USABLE_COUNT % (useCount), self.NORMAL_COLOR) W pliku: "../root/uicommon.py" Nad: "class QuestionDialogWithTimeLimit(QuestionDialog2):" dodajemy: class QuestionMobSearch(QuestionDialog): def __init__(self): QuestionDialog.__init__(self) self.__CreateMobSearch() def __del__(self): QuestionDialog.__del__(self) def __CreateMobSearch(self): pyScrLoader = ui.PythonScriptLoader() pyScrLoader.LoadScriptFile(self, "uiscript/questionsearch.py") self.board = self.GetChild("board") self.textSearch1 = self.GetChild("txtSearch1") self.textSearch2 = self.GetChild("txtSearch2") self.aInstantButton = self.GetChild("acceptInstant") self.aReloadButton = self.GetChild("acceptReload") self.cNormalButton = self.GetChild("cancelNormal") def SetSearchText1(self, text): self.textSearch1.SetText(text) def SetSearchText2(self, text): self.textSearch2.SetText(text) def SetASearchEvent1(self, event): self.aInstantButton.SetEvent(event) def SetASearchEvent2(self, event): self.aReloadButton.SetEvent(event) def SetDSearchEvent1(self, event): self.cNormalButton.SetEvent(event) W pliku: "root/game.py" Na przykład nad: "def OpenRefineDialog(self, targetItemPos, nextGradeItemVnum, cost, prob, type=0):" dodajemy: if app.ENABLE_MOB_SEARCH: def AcceptSearchDialog(self, arg): net.SendMobSearchConfirm(arg) self.mobSearchSystem.Close() if app.ENABLE_MOB_SEARCH: def OpenSearchSuccessDialog(self, msg): mobSearchSystem = uiCommon.QuestionMobSearch() mobSearchSystem.SetSearchText1("Znaleziono potowra: "+nonplayer.GetMonsterName(msg)) mobSearchSystem.SetSearchText2("Czy teleportowac Cie do niego?") mobSearchSystem.SetASearchEvent1(lambda arg=1: self.AcceptSearchDialog(arg)) mobSearchSystem.SetASearchEvent2(lambda arg=2: self.AcceptSearchDialog(arg)) mobSearchSystem.SetDSearchEvent1(lambda arg=0: self.AcceptSearchDialog(arg)) mobSearchSystem.Open() self.mobSearchSystem = mobSearchSystem if app.ENABLE_MOB_SEARCH: def OpenMobSearchFaillDialog(self, msg): self.stream.popupWindow.Close() if msg == 1: self.stream.popupWindow.Open(localeInfo.MOB_SEARCH_FAILL, msg, localeInfo.UI_OK) elif msg == 2: self.stream.popupWindow.Open(localeInfo.MOB_SEARCH_CANNOT_WARP, msg, localeInfo.UI_OK) elif msg == 3: self.stream.popupWindow.Open(localeInfo.MOB_SEARCH_ERROR, msg, localeInfo.UI_OK) W pliku: "../root/locale/pl/locale_game.txt" MOB_SEARCH_FAILL Nie znaleziono bossa ani metina na mapie! MOB_SEARCH_CANNOT_WARP Nie mozna aktualnie wykonac tej operacji! MOB_SEARCH_ERROR Nieautoryzowana operacja! W pliku: "../root/locale/pl/locale_interface.txt" Dodajemy: YES_INSTANT Tak natychmiast YES_RELOAD Tak przeladuj Teraz jeszcze wrzucamy załączony przeze mnie plik: "questionsearch.py" I wrzucamy go do: "root/uiscript/" To chyba na tyle, podczas pisania tematu mogłem o czymś zapomnieć wiec, jak czegoś będzie brakowało piszcie to to dorzucę! Również, jeżeli macie jakieś błędy proszę o wiadomość! Pozdro #edit: Zgodnie z radą @itamm Jeżeli chcecie aby postać znajdowała się obok metina/bossa po teleportacji zmieniacie w pliku ".../game/src/mobsearch.cpp" int x = ch->GetQuestFlag("mobSearchData_position.x"); int y = ch->GetQuestFlag("mobSearchData_position.y"); np tak: int x = ch->GetQuestFlag("mobSearchData_position.x") + (number(-100,100)*10); int y = ch->GetQuestFlag("mobSearchData_position.y") + (number(-100,100)*10); questionsearch.py mobsearch.h mobsearch.cpp
  7. Zwoje zwyczajnie wykorzystują dodawanie id potwora do socketu przedmiotu. ID_PRZEDMIOTU = 30200! Drop zwoju przywołania Stopień 5 boss'a ( Należy uważać i dobrze ustawić w bazie !) 50lv + metin'a lub boss'a Szansa dropu po liczeniu dodatkowego bonusu w ekwipunku ("Dodatkowa szansa na drop %d") - domyślna wartość (50%) Spawn potwora zaklętego w zwoju Spełnienie warunków odpowiedniej lokalizacji itd. Szansa spawnu po liczeniu dodatkowego bonusu w ekwipunku ("Dodatkowa szansa na zrespienie %d") - domyślna wartość (50%) Koszt yang - 100kk. Dodatkowo: Dopisek "zaklętego" potwora na przedmiocie - na ziemi / w eq / podczas podnoszenia Komenda GM do tworzenia przedmiotu - podstawowa! Użycie komendy : /spawn_item mob_vnum count Oczywiście finalna konfiguracja id przedmiotu, kwoty, bonusów, prawdopodobieństw itd leży po waszej stronie! Modyfikacja nie jest niczym specjalnym zdaje sobie z tego sprawę, natomiast zapraszam do dyskusji jej temat! Ingame: W pierwszej kolejności source server: Plik: "../common/service.h" Wewnątrz ifdef'a dodajemy: #define ENABLE_SPAWN_SYSTEM W Pliku "../common/service.h" pod "APPLY_ANTI_PENETRATE_PCT," dodajemy (Jeżeli dodawaliście inne bonusy dodawajcie pod tymi wcześniej dodanymi): #ifdef ENABLE_SPAWN_SYSTEM APPLY_SPAWN_DROP, APPLY_SPAWN_USAGE, #endif Plik "../game/src/char.cpp" W funkcji void CHARACTER::ComputePoints() dodajemy: #ifdef ENABLE_SPAWN_SYSTEM long lSPAWN_DROP = GetPoint(POINT_SPAWN_DROP); long lSPAWN_USAGE = GetPoint(POINT_SPAWN_USAGE); #endif W tej samej funkcji przy SetPoint'ach dodajemy: #ifdef ENABLE_SPAWN_SYSTEM SetPoint(POINT_SPAWN_DROP, lSPAWN_DROP); SetPoint(POINT_SPAWN_USAGE, lSPAWN_USAGE); #endif W funkcji void CHARACTER::PointChange(BYTE type, int amount, bool bAmount, bool bBroadcast) np. nad case POINT_PARTY_ATTACKER_BONUS dodajemy: #ifdef ENABLE_SPAWN_SYSTEM case POINT_SPAWN_DROP: case POINT_SPAWN_USAGE: #endif W funkcji void CHARACTER::ApplyPoint(BYTE bApplyType, int iVal) np. pod "case APPLY_MAGIC_ATTBONUS_PER:" dodajemy: #ifdef ENABLE_SPAWN_SYSTEM case APPLY_SPAWN_DROP: case APPLY_SPAWN_USAGE: #endif W pliku "../game/src/char.h" pod POINT_RESIST_PENETRATE = 137, dodajemy: (Jeżeli dodawaliście inne bonusy dodawajcie pod tymi wcześniej dodanymi) #ifdef ENABLE_SPAWN_SYSTEM POINT_SPAWN_DROP, POINT_SPAWN_USAGE, #endif W sekcji public class'y np. pod deklaracja funkcji "UseItem(TItemPos Cell, TItemPos DestCell = NPOS);" dodajemy: #ifdef ENABLE_SPAWN_SYSTEM bool SPAWN_SCROLL_ITEM(LPITEM item); #endif W pliku "../game/src/char_item.cpp" pod "case ITEM_MATERIAL:" dodajemy: #ifdef ENABLE_SPAWN_SYSTEM { if(item->GetVnum() == 30200){ SPAWN_SCROLL_ITEM(item); } } break; #endif W tym samym pliku dodajemy funkcję: #ifdef ENABLE_SPAWN_SYSTEM bool CHARACTER::SPAWN_SCROLL_ITEM(LPITEM item){ short mapIndex = GetMapIndex(); DWORD dwVnum = item->GetSocket(0); DWORD dwCena = 100000000; if(!IS_SUMMONABLE_ZONE(mapIndex)){ ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Znajdujesz sie w nieodpowiedniej lokalizacji!")); return false; } switch(mapIndex){ case 1: case 3: case 4: case 21: case 23: case 24: case 41: case 43: case 44: ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Znajdujesz sie w nieodpowiedniej lokalizacji!")); return false; } if(IsStun() || item->GetCount() <= 0 || !CanWarp()) return false; if(dwCena > GetGold()){ ChatPacket(CHAT_TYPE_INFO, "Nie posiadasz wystarczajacej ilosci yang! [%d]", dwCena); return false; } if(dwVnum == 0){ ChatPacket(CHAT_TYPE_INFO, "Error vnum: %d", dwVnum); item->SetCount(0); return false; } PIXEL_POSITION pos; pos.x = GetX() + (number(-10,10) * 20); pos.y = GetY() + (number(-10,10) * 20); pos.z = GetZ(); SECTREE *sectree = NULL; sectree = GetSectree(); if (sectree && (sectree->IsAttr(pos.x, pos.y, ATTR_BANPK) || sectree->IsAttr(pos.x, pos.y, ATTR_BLOCK | ATTR_OBJECT))){ ChatPacket(CHAT_TYPE_INFO, LC_TEXT("Miejsce w ktorym sie znajdujesz jest nieodpowiednie!")); return false; } int spawnItemUsageChance = 50 + GetPoint(POINT_SPAWN_USAGE); if(spawnItemUsageChance < number(1,100)){ ChatPacket(CHAT_TYPE_INFO, "Nie udalo sie przywolac potwora! (Szansa: %d)", spawnItemUsageChance); item->SetCount(item->GetCount() - 1); PointChange(POINT_GOLD, -dwCena); return false; } LPCHARACTER ch = CHARACTER_MANAGER::instance().SpawnMob(dwVnum, GetMapIndex(), pos.x, pos.y, pos.z, true, -1); if(0 == ch){ ChatPacket(CHAT_TYPE_INFO, "Nie udalo sie przywolac potwora! (Szansa: %d)", spawnItemUsageChance); return false; } item->SetCount(item->GetCount() - 1); ChatPacket(CHAT_TYPE_INFO, "Udalo sie przywolac potwora: %s (Szansa: %d)", ch->GetName(), spawnItemUsageChance); PointChange(POINT_GOLD, -dwCena); return true; } #endif W pliku "../game/src/cmd_general.cpp" , Funkcji - "FN_point_string(int apply_number)" np. pod - "case POINT_RESIST_SHAMAN: return LC_TEXT(...)" dodajemy: #ifdef ENABLE_SPAWN_SYSTEM case POINT_SPAWN_DROP: return LC_TEXT("Dodatkowa szansa na drop +%d%%"); case POINT_SPAWN_USAGE: return LC_TEXT("Dodatkowa szansa na zrespienie +%d%%"); #endif W pliku "../game/src/constants.cpp" Pod "{ POINT_RESIST_PENETRATE, }, // APPLY_ANTI_PENETRATE_PCT, 91" , dodajemy: #ifdef ENABLE_SPAWN_SYSTEM { POINT_SPAWN_DROP, }, { POINT_SPAWN_USAGE, }, #endif W tym samym pliku pod "{ "MELEE_MAGIC_ATTBONUS_PER", APPLY_MELEE_MAGIC_ATTBONUS_PER }," dodajemy: #ifdef ENABLE_SPAWN_SYSTEM { "SPAWN_DROP", POINT_SPAWN_DROP}, { "SPAWN_USAGE", POINT_SPAWN_USAGE}, #endif W pliku "../game/src/item.h" Deklarację: "const char * GetName() { return m_pProto ? m_pProto->szLocaleName : NULL; }" zmieniamy na: #ifndef ENABLE_SPAWN_SYSTEM const char * GetName() { return m_pProto ? m_pProto->szLocaleName : NULL; } #else const char * GetName(); #endif W pliku "../game/src/item_manager.cpp" dodajemy funkcję: #ifdef ENABLE_SPAWN_SYSTEM bool ITEM_MANAGER::DropPrzywolania(LPCHARACTER pkChr, LPCHARACTER pkKiller){ if(pkChr->GetLevel() < 50){return false;} int spawnItemDropChance = 50; spawnItemDropChance += pkKiller->GetPoint(POINT_SPAWN_DROP); if(number(1,100) <= spawnItemDropChance){ PIXEL_POSITION pos; LPITEM item; if ((item = ITEM_MANAGER::instance().CreateItem(30200, 1))) { pos.x = pkKiller->GetX() + (number(-10, 10) * 20); pos.y = pkKiller->GetY() + (number(-10, 10) * 20); item->SetSocket(0, pkChr->GetRaceNum()); item->SetOwnership(pkKiller); item->AddToGround(pkKiller->GetMapIndex(), pos); item->StartDestroyEvent(); } } return false; } #endif W tym samym pliku, w funkcji ITEM_MANAGER::CreateDropItem(...), np. pod "LPITEM item = NULL;" dodajemy: #ifdef ENABLE_SPAWN_SYSTEM if((pkChr->GetMobRank() >= MOB_RANK_BOSS || pkChr->IsStone()) && !pkChr->IsPC()){ DropPrzywolania(pkChr, pkKiller); } #endif W pliku "../game/src/item_manager.h" np. pod deklaracją "CreateDropItem(...)" dodajemy: #ifdef ENABLE_SPAWN_SYSTEM bool DropPrzywolania(LPCHARACTER pkChr, LPCHARACTER pkKiller); #endif W pliku "../game/src/packet.h" zamieniamy całą strukturę "typedef struct packet_item_ground_add" na: typedef struct packet_item_ground_add { #ifdef ENABLE_SPAWN_SYSTEM packet_item_ground_add() { memset(&alSockets, 0, sizeof(alSockets)); } #endif BYTE bHeader; long x, y, z; DWORD dwVID; DWORD dwVnum; #ifdef ENABLE_SPAWN_SYSTEM long alSockets[ITEM_SOCKET_MAX_NUM]; #endif } TPacketGCItemGroundAdd; W pliku "../game/src/item.cpp" w funkcji "void CItem::EncodeInsertPacket(LPENTITY ent)" pod "pack.dwVID = m_dwVID;" dodajemy: #ifdef ENABLE_SPAWN_SYSTEM for (size_t i = 0; i < ITEM_SOCKET_MAX_NUM; ++i) pack.alSockets[i] = GetSocket(i); #endif W tym samym pliku dodajemy: #ifdef ENABLE_SPAWN_SYSTEM const char * CItem::GetName(){ if(GetVnum() == 30200){ const DWORD dwMobVnum = GetSocket(0); const CMob* pMob = CMobManager::instance().Get(dwMobVnum); if (pMob){ std::string mob_name = pMob->m_table.szLocaleName; std::string item_name = GetProto()->szLocaleName; item_name = item_name + ": " + mob_name; return item_name.c_str(); } else{ return m_pProto ? m_pProto->szLocaleName : NULL; } } return m_pProto ? m_pProto->szLocaleName : NULL; } #endif W pliku "../game/src/cmd.cpp" jeżeli nie ma dodajemy include! (#include "../common/service.h") po za tym w odpowiednich miejscach np. pod "do_item" dodajemy: #ifdef ENABLE_SPAWN_SYSTEM ACMD(do_spawn_item); #endif #ifdef ENABLE_SPAWN_SYSTEM { "spawn_item", do_spawn_item, 0, POS_DEAD, GM_GOD }, #endif W pliku "../game/src/cmd_gm.cpp" jeżeli nie ma dodajemy include! (#include "../common/service.h") dodajemy funkcję: #ifdef ENABLE_SPAWN_SYSTEM ACMD(do_spawn_item){ char arg1[256], arg2[256]; two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)); DWORD dwVnum = 30200, dwMobVnum, dwCount; const CMob * pkMob; if (isdigit(*arg1) && isdigit(*arg2)) { str_to_number(dwMobVnum, arg1); str_to_number(dwCount, arg2); } LPITEM item = ITEM_MANAGER::instance().CreateItem(dwVnum, dwCount, 0, true); item->SetSocket(0, dwMobVnum); int iEmptyPos = ch->GetEmptyInventory(item->GetSize()); if (iEmptyPos != -1){ item->AddToCharacter(ch, TItemPos(INVENTORY, iEmptyPos)); LogManager::instance().ItemLog(ch, item, "GM", item->GetName()); }else M2_DESTROY_ITEM(item); } #endif W pliku "../db/src/ProtoReader.cpp" pod "APPLY_ANTI_PENETRATE_PCT", dodajemy: #ifdef ENABLE_SPAWN_SYSTEM "APPLY_SPAWN_DROP","APPLY_SPAWN_USAGE", #endif To już chyba wszystko teraz source klient: W pliku "UserInterface/PythonItem.cpp" jeżeli nie ma dodajemy: #ifdef ENABLE_SPAWN_SYSTEM #include "PythonNonPlayer.h" #endif W tym samym pliku, sam początek funkcji "void CPythonItem::CreateItem()" zmieniamy na: #ifdef ENABLE_SPAWN_SYSTEM void CPythonItem::CreateItem(DWORD dwVirtualID, DWORD dwVirtualNumber, float x, float y, float z, bool bDrop, long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]) #else void CPythonItem::CreateItem(DWORD dwVirtualID, DWORD dwVirtualNumber, float x, float y, float z, bool bDrop) #endif Pod "CPythonTextTail& rkTextTail = CPythonTextTail::Instance();" w tej samej funkcji zamieniamy koniec na: #ifdef ENABLE_SPAWN_SYSTEM std::string item_name = pItemData->GetName(); if (pItemData->GetIndex() == 30200){ std::string mob_name = CPythonNonPlayer::Instance().GetMonsterName(alSockets[0]); item_name = item_name + ": " + mob_name; } rkTextTail.RegisterItemTextTail( dwVirtualID, item_name.c_str(), &pGroundItemInstance->ThingInstance); #else rkTextTail.RegisterItemTextTail( dwVirtualID, pItemData->GetName(), &pGroundItemInstance->ThingInstance); #endif } W pliku "UserInterface/PythonItem.h" zamieniamy deklarację void CreateItem(...) na: #ifdef ENABLE_SPAWN_SYSTEM void CreateItem(DWORD dwVirtualID, DWORD dwVirtualNumber, float x, float y, float z, bool bDrop = true, long alSockets[ITEM_SOCKET_SLOT_MAX_NUM] = {}); #else void CreateItem(DWORD dwVirtualID, DWORD dwVirtualNumber, float x, float y, float z, bool bDrop = true); #endif W pliku "UserInterface/PythonItemModule.cpp" pod APPLY_ANTI_PENETRATE_PCT, (Ponownie jeżeli nie dodawaliście wcześniej bonusów) dodajemy: #ifdef ENABLE_SPAWN_SYSTEM PyModule_AddIntConstant(poModule, "APPLY_SPAWN_DROP", CItemData::APPLY_SPAWN_DROP); PyModule_AddIntConstant(poModule, "APPLY_SPAWN_USAGE", CItemData::APPLY_SPAWN_USAGE); #endif W pliku "UserInterface/Locale_inc.h" dodajemy: #define ENABLE_SPAWN_SYSTEM W pliku "UserInterface/Packet.h" w "EPointTypes" np pod "POINT_HIT_RATE," dodajemy: #ifdef ENABLE_SPAWN_SYSTEM POINT_SPAWN_DROP, POINT_SPAWN_USAGE, #endif W tym samym pliku w sprowadzamy strukturę "typedef struct packet_ground_add_item" do następującej postaci: typedef struct packet_ground_add_item { #ifdef ENABLE_SPAWN_SYSTEM packet_ground_add_item() { memset(&alSockets, 0, sizeof(alSockets)); } #endif BYTE bHeader; long lX; long lY; long lZ; DWORD dwVID; DWORD dwVnum; #ifdef ENABLE_SPAWN_SYSTEM long alSockets[ITEM_SOCKET_SLOT_MAX_NUM];//3 #endif } TPacketGCItemGroundAdd; W pliku "UserInterface/PythonNetworkStreamPhaseGameItem.cpp", funkcji CPythonNetworkStream::RecvItemGroundAddPacket(), CPythonItem::Instance().CreateItem(...) sprowadzamy do następującej postaci: CPythonItem::Instance().CreateItem(packet_item_ground_add.dwVID, packet_item_ground_add.dwVnum, packet_item_ground_add.lX, packet_item_ground_add.lY, packet_item_ground_add.lZ #ifdef ENABLE_SPAWN_SYSTEM ,true, packet_item_ground_add.alSockets #endif ); W pliku "UserInterface/PythonApplicationModule.cpp" dodajemy: #ifdef ENABLE_SPAWN_SYSTEM PyModule_AddIntConstant(poModule, "ENABLE_SPAWN_SYSTEM", 1); #else PyModule_AddIntConstant(poModule, "ENABLE_SPAWN_SYSTEM", 0); #endif W pliku "GameLib/ItemData.h" (Jeżeli nie ma dodajemy: #include "../UserInterface/Locale_inc.h") po APPLY_ANTI_PENETRATE_PCT (Ponownie jeżeli nie dodawaliście wcześniej bonusów) , dodajemy: #ifdef ENABLE_SPAWN_SYSTEM APPLY_SPAWN_DROP, APPLY_SPAWN_USAGE, #endif Chyba wszystko, teraz dump_proto: Jeżeli nie mamy stworzonego dodajemy plik z definami np "defines.h" do którego dodajemy: #define ENABLE_SPAWN_SYSTEM W pliku "ItemCSVReader.cpp" pod "APPLY_ANTI_PENETRATE_PCT", (Ponownie jeżeli nie dodawaliście wcześniej bonusów) , dodajemy: #ifdef ENABLE_SPAWN_SYSTEM "APPLY_SPAWN_DROP", "APPLY_SPAWN_USAGE", #endif Chyba wszytko, jeżeli używacie pliku Generacja.py do konwersji item_proto pod "APPLY_ANTI_PENETRATE_PCT", dodajemy: 92: "APPLY_SPAWN_DROP", 93: "APPLY_SPAWN_USAGE", Chyba wszystko, teraz klient W pliku "root/uitooltip.py" def __SetItemTitle(self, itemVnum, metinSlot, attrSlot): sprowadzamy do postaci: def __SetItemTitle(self, itemVnum, metinSlot, attrSlot): if localeInfo.IsCANADA(): if 72726 == itemVnum or 72730 == itemVnum: self.AppendTextLine(item.GetItemName(), grp.GenerateColor(1.0, 0.7843, 0.0, 1.0)) return if self.__IsPolymorphItem(itemVnum): self.__SetPolymorphItemTitle(metinSlot[0]) elif 30200 == itemVnum and app.ENABLE_SPAWN_SYSTEM: self.__SetSpawnName(metinSlot[0]) else: if self.__IsAttr(attrSlot): self.__SetSpecialItemTitle() return self.__SetNormalItemTitle() W tym samym pliku np nad "def __SetNormalItemTitle(self):" dodajemy: def __SetSpawnName(self, monsterVnum): if app.ENABLE_SPAWN_SYSTEM: itemName=item.GetItemName() itemName+=": " itemName+=nonplayer.GetMonsterName(monsterVnum) self.SetTitle(itemName) Przykładowe query do item_attr - jeżeli nie dodawaliście innych bonusów, jeżeli tak edytujcie pod siebie!!!! ALTER IGNORE TABLE item_attr MODIFY COLUMN apply enum('MAX_HP', 'MAX_SP', 'CON', 'INT', 'STR', 'DEX', 'ATT_SPEED', 'MOV_SPEED', 'CAST_SPEED', 'HP_REGEN', 'SP_REGEN', 'POISON_PCT', 'STUN_PCT', 'SLOW_PCT', 'CRITICAL_PCT', 'PENETRATE_PCT', 'ATTBONUS_HUMAN', 'ATTBONUS_ANIMAL', 'ATTBONUS_ORC', 'ATTBONUS_MILGYO', 'ATTBONUS_UNDEAD', 'ATTBONUS_DEVIL', 'STEAL_HP', 'STEAL_SP', 'MANA_BURN_PCT', 'DAMAGE_SP_RECOVER', 'BLOCK', 'DODGE', 'RESIST_SWORD', 'RESIST_TWOHAND', 'RESIST_DAGGER', 'RESIST_BELL', 'RESIST_FAN', 'RESIST_BOW', 'RESIST_FIRE', 'RESIST_ELEC', 'RESIST_MAGIC', 'RESIST_WIND', 'REFLECT_MELEE', 'REFLECT_CURSE', 'POISON_REDUCE', 'KILL_SP_RECOVER', 'EXP_DOUBLE_BONUS', 'GOLD_DOUBLE_BONUS', 'ITEM_DROP_BONUS', 'POTION_BONUS', 'KILL_HP_RECOVER', 'IMMUNE_STUN', 'IMMUNE_SLOW', 'IMMUNE_FALL', 'SKILL', 'BOW_DISTANCE', 'ATT_GRADE_BONUS', 'DEF_GRADE_BONUS', 'MAGIC_ATT_GRADE', 'MAGIC_DEF_GRADE', 'CURSE_PCT', 'MAX_STAMINA', 'ATTBONUS_WARRIOR', 'ATTBONUS_ASSASSIN', 'ATTBONUS_SURA', 'ATTBONUS_SHAMAN', 'ATTBONUS_MONSTER', 'MALL_ATTBONUS', 'MALL_DEFBONUS', 'MALL_EXPBONUS', 'MALL_ITEMBONUS', 'MALL_GOLDBONUS', 'MAX_HP_PCT', 'MAX_SP_PCT', 'SKILL_DAMAGE_BONUS', 'NORMAL_HIT_DAMAGE_BONUS', 'SKILL_DEFEND_BONUS', 'NORMAL_HIT_DEFEND_BONUS', 'PC_BANG_EXP_BONUS', 'PC_BANG_DROP_BONUS', 'EXTRACT_HP_PCT', 'RESIST_WARRIOR', 'RESIST_ASSASSIN', 'RESIST_SURA', 'RESIST_SHAMAN', 'ENERGY', 'DEF_GRADE', 'COSTUME_ATTR_BONUS', 'MAGIC_ATTBONUS_PER', 'MELEE_MAGIC_ATTBONUS_PER', 'RESIST_ICE', 'RESIST_EARTH', 'RESIST_DARK', 'ANTI_CRITICAL_PCT', 'ANTI_PENETRATE_PCT', 'SPAWN_DROP', 'SPAWN_USAGE'); INSERT INTO item_attr VALUES('SPAWN_DROP', 30, 5, 5, 10, 15, 20, 5, 0, 0, 0, 0, 0, 0, 0); INSERT INTO item_attr VALUES('SPAWN_USAGE', 30, 5, 5, 10, 15, 20, 5, 0, 0, 0, 0, 0, 0, 0); Query na item INSERT INTO `item_proto` VALUES (30200, 0x3330323030, 0x50727A79776F6C616E6965, 5, 0, 0, 1, 221568, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, -1, -1, -1, -1, -1, 0, 0, 0); Opis bonusów Plik: "root/locale/pl/locale_game.txt" TOOLTIP_APPLY_SPAWN_DROP Dodatkowa szansa na drop +%d%% SA TOOLTIP_APPLY_SPAWN_USAGE Dodatkowa szansa na zrespienie +%d%% SA Plik "root/locale/pl/item_list.txt" 30200 ETC icon/item/30200.tga Plik "root/locale/pl/item_desc.txt" 30200 Przywolanie Potezny zwój mogacy zeslac zakleta istote! [Koszt 100kk] Wykorzystana ikona jest publicznie dostępna, dodam w załączniku. Chyba wszystko, tak jak pisałem na wstępie zapraszam do dyskusji. Jeżeli macie jakieś pytania/błędy/rady piszcie! Jeżeli o czymś zapomniałem, dam edit'a. Znane błędy: Brak znanych błędów 30200.tga
  8. Witajcie. Wrzucam Wam na nowo paczuszkę z systemem Lśnienia ? [Hidden Content] [Hidden Content]
  9. Granny (2.4 -> 2.9) [align=center] [Hidden Content] [Hidden Content]== [/align] Python (2.2 -> 2.7) [align=center] [Hidden Content] [Hidden Content]== [/align] [align=center]Kilka zwrotów jest po angielsku, ale z tym to sobie nawet tłumacz Google poradzi. Dziękuje za uwage i pozdrawiam.[/align]
  10. Witam Pokaże Wam jak zablokować stworzenie gildii poniżej wymaganego lv. tak by zablokować np. założenie jej na KamerMod. Wchodzimy do pliku input_main.cpp w /game/src/ Szukamy: if (ch->GetGold() < 200000) return; Pod dodajemy: if (ch->GetLevel() < 40) return; Jeśli chcesz przetestować jakąkolwiek poprawkę rób to na zwykłym graczu bez dodanych uprawnień. Pozdrawiam * To tylko przedsmak tego co dla Was przygotowałem proszę daj + by zmotywować mnie do dalszego działania.
  11. Witam Pokaże wam jak naprawić błąd, który powoduje, że czasem nasza postać pozostaje niewidzialna dla innych graczy przez dłuższy okres czasu. Błąd ten najczęściej występuje zaraz po przeteleportowaniu, gdy zaczniemy atakować, nim nasza postać stanie się widoczna. 01: Otwieramy "char_affect.cpp" (source game Srcs/Server/game/src). Szukamy tego: if (AFFECT_REVIVE_INVISIBLE != pkAff->dwType) { ComputePoints(); } I zmieniamy na to: if (AFFECT_REVIVE_INVISIBLE != pkAff->dwType) ComputePoints(); else UpdatePacket(); Gotowe! Pozdrawiam * To tylko przedsmak tego co dla Was przygotowałem proszę daj + by zmotywować mnie do dalszego działania.
  12. Cześć jak wiecie standardowo w Metinie czas gry wyświetlany jest w minutach, chodzi mi o ekran wyboru postaci. Łapcie krótki i prosty tut jak zmienić to na Dni/Godziny/Minuty. Zaczynając wchodzicie w root->introselect.py Szukacie: self.PlayTime.SetText(str(playTime)) Zamieniacie na: ( i tutaj uwaga jeżeli importujecie locale to zamiast localeInfo.SecondToDHM(playTime*60) zamianieniacie locale.SecondToDHM(playTime*60). self.PlayTime.SetText(str(localeInfo.SecondToDHM(playTime*60))) Teraz te minuty zostaną odpowiednio przekonwertowane, ale wasz ParameterSlot ( czyli ten slot w którym jest wypisywany ten czas ) będzie za mały czyli musicie go zmienić na większy (taki jak przy nazwie i poziomie postaci) Wchodzicie do locale->ui->selectcharacterwindow.py I szukacie: "name" : "character_play_time_slot", "type" : "image", "x" : 83, "y" : -2, "image" : "d:/ymir work/ui/public/Parameter_Slot_03.sub", Podmieniacie na: "name" : "character_play_time_slot", "type" : "image", "x" : 43, "y" : -2, "image" : "d:/ymir work/ui/public/Parameter_Slot_05.sub", Nasze powiększone "okienko", "slot" zamieniliśmy na większy i przesuneliśmy tak, żeby nie wystawał za thinboarda z informacjami o postaci. Teraz musimy przesunąć napis który zawiera ten czas gry, więc szukamy: "name" : "character_play_time_value", "type" : "text", "x" : 83 + 91/2, "y" : 0, "text" : "", "text_horizontal_align" : "center", Zamieniamy na: "name" : "character_level_value", "type" : "text", "x" : 43 + 130/2, "y" : 0, "text" : "", "text_horizontal_align" : "center",
  13. Usunięcie sklepu z przedmiotami po kliknięciu w obracającą się monetę. W pliku uitaskbar.py Szukaj klasy: class TaskBar(ui.ScriptWindow): Znajdź tego def def LoadWindow(self): I znajdź tą część: if constInfo.IN_GAME_SHOP_ENABLE: pyScrLoader.LoadScriptFile(self, uiScriptLocale.LOCALE_UISCRIPT_PATH + "TaskBar.py") else: pyScrLoader.LoadScriptFile(self, "UIScript/TaskBar.py") Zostaw tylko to: pyScrLoader.LoadScriptFile(self, "UIScript/TaskBar.py") Usuń: if constInfo.IN_GAME_SHOP_ENABLE: self.rampageGauge1 = self.GetChild("RampageGauge") self.rampageGauge1.OnMouseOverIn = ui.__mem_func__(self.__RampageGauge_OverIn) self.rampageGauge2 = self.GetChild("RampageGauge2") self.rampageGauge2.OnMouseOverOut = ui.__mem_func__(self.__RampageGauge_OverOut) self.rampageGauge2.OnMouseLeftButtonUp = ui.__mem_func__(self.__RampageGauge_Click) self.__RampageGauge_OverOut() def __RampageGauge_OverIn(self): print "rampage_over_in" self.rampageGauge2.Show() self.rampageGauge1.Hide() def __RampageGauge_OverOut(self): print "rampage_over_out" self.rampageGauge2.Hide() self.rampageGauge1.Show() def __RampageGauge_Click(self): print "rampage_up" net.SendChatPacket("/in_game_mall") # gift icon hide when click mall icon self.wndGiftBox.Hide() W pliku interfacemodule.py Usuń: self.wndWeb = None def __MakeWebWindow(self): if constInfo.IN_GAME_SHOP_ENABLE: import uiWeb self.wndWeb = uiWeb.WebWindow() self.wndWeb.LoadWindow() self.wndWeb.Hide() self.__MakeWebWindow() if self.wndWeb: self.wndWeb.Destroy() self.wndWeb = None Szukaj: def ToggleChat(self): Zamień tego def na: def ToggleChat(self): if True == self.wndChat.IsEditMode(): self.wndChat.CloseChat() else: self.wndChat.OpenChat() Usuń: def OpenWebWindow(self, url): self.wndWeb.Open(url) # 웹페이지를 열면 채팅을 닫는다 self.wndChat.CloseChat() def CloseWbWindow(self): self.wndWeb.Close() W pliku game.py Usuń: def __InGameShop_Show(self, url): if constInfo.IN_GAME_SHOP_ENABLE: self.interface.OpenWebWindow(url) W tym def: def OnKeyDown(self, key): Usuń tego if: if self.interface.wndWeb and self.interface.wndWeb.IsShow(): return Szukaj: def __ServerCommand_Build(self): W tym def niżej usuń: "mall" : self.__InGameShop_Show, W pliku consolemodule.py Szukaj i usuń: def ShowWeb(self): "ShowWeb" if app.IsWebPageMode(): app.HideWebPage() else: app.ShowWebPage("[Hidden Content]", (0, 0, 320, 600)) self.AddFunction("web", Console.ShowWeb) W pliku: uishop.py Szukasz i usuwasz cała klasę mall: class MallPageDialog(ui.ScriptWindow): def __init__(self): ui.ScriptWindow.__init__(self) def __del__(self): ui.ScriptWindow.__del__(self) def Destroy(self): self.ClearDictionary() def Open(self): scriptLoader = ui.PythonScriptLoader() scriptLoader.LoadScriptFile(self, "uiscript/mallpagedialog.py") self.GetChild("titlebar").SetCloseEvent(ui.__mem_func__(self.Close)) (x, y)=self.GetGlobalPosition() x+=10 y+=30 MALL_PAGE_WIDTH = 600 MALL_PAGE_HEIGHT = 480 app.ShowWebPage( "[Hidden Content]", (x, y, x+MALL_PAGE_WIDTH, y+MALL_PAGE_HEIGHT)) self.Lock() self.Show() def Close(self): app.HideWebPage() self.Unlock() self.Hide() def OnPressEscapeKey(self): self.Close() return TRUE W root usuwasz plik: uiweb.py W locale i uiscript plik: webwindow.py
  14. Typical

    Bonusy

    Cześć, w którym miejscu w source będę mógł ustawić bonusy polimorfi, dowodzenia i konia? Z góry dzięki.
  15. Pokaże wam jak naprawić system wysyłania komunikatów Game Mastera. Przed tym jednak wytłumaczę wam, co to w ogóle jest i w czym problem. A więc ten system to ten komunikat w ramce, który pojawia się na środku ekranu, gdy bogowie przelewają swoje złote myśli, poprzedzając je komendą /b. Problem jednak w tym, że taką wiadomość widzi tylko ten, kto ją wysłał. I wszystko jasne PRZYGOTOWANIE: Lecimy po ścieżce do /usr/src/mainline_released/mainline_sg/Srcs/Server/game/src i zabezpieczamy sobie pliki, które będziemy edytować: - cmd.h - cmd_general.cpp - cmd_gm.cpp - input_db.cpp - input_p2p.cpp - packet.h 01: Rozpoczęcie poradnika - Otwieramy i edytujemy plik cmd.h - szukamy: extern void SendNotice(const char * c_pszBuf); i zmieniamy na to: extern void SendNotice(const char * c_pszBuf, bool IsBig = false); - szukamy: extern void BroadcastNotice(const char * c_pszBuf); i zmieniamy na to: extern void BroadcastNotice(const char * c_pszBuf, bool IsBig = false); 02: Otwieramy i edytujemy plik cmd_general.cpp - szukamy: extern void BroadcastNotice(const char * c_pszBuf); i zmieniamy na to: extern void BroadcastNotice(const char * c_pszBuf, bool IsBig); 03: Otwieramy i edytujemy plik cmd_gm.cpp - szukamy: void BroadcastNotice(const char * c_pszBuf) i zmieniamy na to: void BroadcastNotice(const char * c_pszBuf, bool IsBig) - szukamy: void SendNotice(const char * c_pszBuf) i zmieniamy na to: void SendNotice(const char * c_pszBuf, bool IsBig) - szukamy: struct notice_packet_func i zmieniamy całą funkcję (1111-1126) na to: struct notice_packet_func { const char * m_str; bool m_big; notice_packet_func(const char * str, bool big = false) : m_str(str), m_big(big) { } void operator () (LPDESC d) { if (!d->GetCharacter()) return; d->GetCharacter()->ChatPacket(m_big == true ? CHAT_TYPE_BIG_NOTICE : CHAT_TYPE_NOTICE, "%s", m_str); } }; - szukamy: std::for_each(c_ref_set.begin(), c_ref_set.end(), notice_packet_func(c_pszBuf)); i zmieniamy na to: std::for_each(c_ref_set.begin(), c_ref_set.end(), notice_packet_func(c_pszBuf, IsBig)); - szukamy: ch->ChatPacket(CHAT_TYPE_BIG_NOTICE, "%s", argument); i zmieniamy na to: BroadcastNotice(argument, true); - szukamy: p.lSize = strlen(c_pszBuf) + 1; (1217) i pod tym dodajemy to: p.bIsBig = IsBig; - szukamy: SendNotice(c_pszBuf); i zmieniamy na to: SendNotice(c_pszBuf, IsBig); 04: Otwieramy i edytujemy input_db.cpp - szukamy: extern void SendNotice(const char * c_pszBuf); i zmieniamy na to: extern void SendNotice(const char * c_pszBuf, bool IsBig = false); 05: Otwieramy i edytujemy input_p2p.cpp - szukamy: SendNotice(szBuf); i zmieniamy na to: SendNotice(szBuf, p->bIsBig); 06: Otwieramy i edytujemy packet.h - szukamy: TPacketGGNotice; i nad tym dodajemy to: bool bIsBig; Zapisujemy pliki, kompilujemy wszystko i gotowe. Kod należy do szalonego profesora Atomusa! Który miał eksperymentalny plan, stworzyć idealny kod z plusów, minusów i różnych równości. Niestety podczas opracowywania kodu Atomus został popchnięty przez laboratoryjnego pomocnika i nawciskał klawiszy X, które dostały się do kodu i tak powstał... W każdym bądź razie to nie jest mój kod, jakby to dla kogoś miało być ważne
  16. Podczas sprzedaży przedmiotu, gdy wyskakuje informacja, jaki przedmiot zostanie sprzedany wyświetlana, jest zła nazwa przedmiotu. Przed zmianą ➤ Po zmianie 1. Przechodzimy do UserInterface\PythonPlayerModule.cpp i szukamy: PyObject * playerIsValuableItem(PyObject* poSelf, PyObject* poArgs) { TItemPos SlotIndex; switch (PyTuple_Size (poArgs)) { case 1: if (!PyTuple_GetInteger(poArgs, 0, &SlotIndex.cell)) return Py_BuildException(); break; case 2: if (!PyTuple_GetInteger(poArgs, 0, &SlotIndex.window_type)) return Py_BuildException(); if (!PyTuple_GetInteger(poArgs, 0, &SlotIndex.cell)) return Py_BuildException(); break; default: return Py_BuildException(); } 2. Zamieniamy na: PyObject * playerIsValuableItem(PyObject* poSelf, PyObject* poArgs) { TItemPos SlotIndex; switch (PyTuple_Size (poArgs)) { case 1: if (!PyTuple_GetInteger(poArgs, 0, &SlotIndex.cell)) return Py_BuildException(); break; case 2: if (!PyTuple_GetInteger(poArgs, 0, &SlotIndex.window_type)) return Py_BuildException(); if (!PyTuple_GetInteger(poArgs, 1, &SlotIndex.cell)) return Py_BuildException(); break; default: return Py_BuildException(); }
  17. Dobry. Na niektórych serwerach (sprawdźcie u siebie) przypada błąd z obserwatorem na wojnie, przez co idzie zabijać oglądającego, no i punkty idą dla drużyny która zabiła widza. Jakkolwiek to brzmi, tak to działa. Rozwiązanie problemu jest banalnie proste, mianowicie musimy dopisać sobie do funkcji: battle.cpp
  18. Cześć, Myślę, że ta zmiana przyda się każdemu, kto jakkolwiek modyfikuje clienta. Otwórz EterBase\Debug.cpp, a w nim znajdź i zamień: void OpenLogFile(bool bUseLogFIle) na: void OpenLogFile(bool bUseLogFIle) { time_t rawtime; struct tm * timeinfo; char buffer[80]; time(&rawtime); timeinfo = localtime(&rawtime); strftime(buffer, sizeof(buffer), "./syserr/%d-%m-%Y-%H-%M-%S-syserr.txt", timeinfo); const char* str(buffer); #if !defined(_DISTRIBUTE) || defined(_USE_LOG_FILE) freopen(str, "w", stderr); if (bUseLogFIle) { isLogFile = true; CLogFile::Instance().Initialize(); } #endif } W efekcie po każdym uruchomieniu clienta utworzy Ci się plik podpisany datą i godziną w folderze syserr (stwórz folder sam) - plik nie będzie się nadpisywał.
  19. Pokaże Wam jak zablokować wyrzucanie Yang po stronie kodu źródłowego jest wiele możliwości wykorzystania tego EXPLOITA do obciążenia serwera, bugowania Yang itp. Blokada Wyrzucania Yang Wejdź do pliku char_item.cpp w /game/src/ Szukamy: bool CHARACTER::DropGold(int gold) { if (gold <= 0 || gold > GetGold()) return false; if (!CanHandleItem()) return false; if (0 != g_GoldDropTimeLimitValue) { if (get_dword_time() < m_dwLastGoldDropTime+g_GoldDropTimeLimitValue) { ChatPacket(CHAT_TYPE_INFO, LC_TEXT("ľĆÁ÷ °ńµĺ¸¦ ąö¸± Ľö ľř˝Ŕ´Ď´Ů.")); return false; } } m_dwLastGoldDropTime = get_dword_time(); LPITEM item = ITEM_MANAGER::instance().CreateItem(1, gold); if (item) { PIXEL_POSITION pos = GetXYZ(); if (item->AddToGround(GetMapIndex(), pos)) { //Motion(MOTION_PICKUP); PointChange(POINT_GOLD, -gold, true); // şę¶óÁúżˇ µ·ŔĚ ľřľîÁř´Ů´Â ąö±×°ˇ ŔִµĄ, // °ˇ´ÉÇŃ ˝ĂłŞ¸®żŔ Áßżˇ ÇĎłŞ´Â, // ¸ŢĹ©·ÎłŞ, ÇŮŔ» ˝áĽ­ 1000żř ŔĚÇĎŔÇ µ·Ŕ» °čĽÓ ąö·Á °ńµĺ¸¦ 0Ŕ¸·Î ¸¸µé°í, // µ·ŔĚ ľřľîÁł´Ů°í şą±¸ ˝ĹĂ»ÇĎ´Â °ÍŔĎ Ľöµµ ŔÖ´Ů. // µű¶óĽ­ ±×·± °ćżě¸¦ Ŕâ±â Ŕ§ÇŘ ł·Ŕş ĽöġŔÇ °ńµĺżˇ ´ëÇŘĽ­µµ ·Î±×¸¦ ł˛±č. if (LC_IsBrazil() == true) { if (gold >= 213) LogManager::instance().CharLog(this, gold, "DROP_GOLD", ""); } else { if (gold > 1000) // õżř ŔĚ»ó¸¸ ±â·ĎÇŃ´Ů. LogManager::instance().CharLog(this, gold, "DROP_GOLD", ""); } if (false == LC_IsBrazil()) { item->StartDestroyEvent(150); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¶łľîÁř ľĆŔĚĹŰŔş %dşĐ ČÄ »ç¶óÁý´Ď´Ů."), 150/60); } else { item->StartDestroyEvent(60); ChatPacket(CHAT_TYPE_INFO, LC_TEXT("¶łľîÁř ľĆŔĚĹŰŔş %dşĐ ČÄ »ç¶óÁý´Ď´Ů."), 1); } } Save(); return true; } return false; } Zamieniamy cała funkcję na: bool CHARACTER::DropGold(int gold) { return false; } AKTUALIZACJA #1 Wejdź do uiinventory.py Szukaj i skomentuj znakiem #: ( spowoduje to wyłączenie małego okienka po naciśnięciu na slot Yang ) # self.dlgPickMoney.SetTitleName(localeInfo.PICK_MONEY_TITLE) # self.dlgPickMoney.SetAcceptEvent(ui.__mem_func__(self.OnPickMoney)) # self.dlgPickMoney.Open(curMoney) # self.dlgPickMoney.SetMax(7) # ŔÎşĄĹ丮 990000 Á¦ÇŃ ąö±× ĽöÁ¤ Gotowe ! Kompilujemy Game&DB * To tylko przedsmak tego co dla Was przygotowałem proszę daj + by zmotywować mnie do dalszego działania.
  20. Wejdź w input_main.cpp Znajdź: if (CHAT_TYPE_SHOUT == pinfo->type) { LogManager::instance().ShoutLog(g_bChannel, ch->GetEmpire(), chatbuf); } Dodaj pod: #ifdef BLOCK_CHAT_OX if (ch->GetGMLevel() == GM_PLAYER) { if((ch->GetMapIndex() == 113) && (pinfo->type == CHAT_TYPE_TALKING)) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("BLOCK_CHAT_OX")); return iExtraLen; } } #endif common/service.h Dodaj: #define BLOCK_CHAT_OX
  21. Witam Pokaże Wam jak zablokować popularnego kickhacka który działa poprzez wysyłanie masowych prywatnych wiadomości do gracza przez co go wywala z gry. Blokada KickHack Kompilujemy Game&DB * To tylko przedsmak tego co dla Was przygotowałem proszę daj + by zmotywować mnie do dalszego działania.
  22. Witam Pokaże Wam jak usunąć podatek 3% Podatek 3% Kompilujemy Game&DB * To tylko przedsmak tego co dla Was przygotowałem proszę daj + by zmotywować mnie do dalszego działania.
  23. Witam Pokaże jak naprawić komendę /shutdown, żeby nikt Wam nic nie zrobił z serwerem. Poradnik: * To tylko przedsmak tego co dla Was przygotowałem proszę daj + by zmotywować mnie do dalszego działania.
  24. Pokaże Wam jak naprawić Zwój Boga Smoków by dodawał +10% do szansy na ulepszenie. Wejdź do pliku char_item.cpp w /game/src/ Szukamy: if (pkItemScroll->GetValue(0) == YONGSIN_SCROLL) { if (LC_IsYMIR() == true || LC_IsKorea() == true) success_prob = hyuniron_prob_euckr[MINMAX(0, item->GetRefineLevel(), 8)]; else success_prob = hyuniron_prob[MINMAX(0, item->GetRefineLevel(), 8)]; } Zamień na: if (pkItemScroll->GetValue(0) == YONGSIN_SCROLL) { success_prob = MINMAX(1, prt->prob+10, 100); } Szukamy: p.prob = prt->prob; Pod dodajemy: LPITEM itemScroll = GetInventoryItem(iAdditionalCell); if (itemScroll && itemScroll->GetValue(0) == YONGSIN_SCROLL) p.prob = MIN(100, prt->prob + 10); Szukamy i komentujemy: const char hyuniron_prob[9] = { 100, 75, 65, 55, 45, 40, 35, 25, 20 }; const char hyuniron_prob_euckr[9] = { 100, 75, 65, 55, 45, 40, 35, 30, 25 }; Gotowe! Skompiluj Game&DB Pozdrawiam * To tylko przedsmak tego co dla Was przygotowałem proszę daj + by zmotywować mnie do dalszego działania.[/align]
×
×
  • Create New...