Jump to content

Search the Community

Showing results for tags 'c++' in content posted in C++ / Python / Server.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Forum board
    • M2Zone.tech
  • Strefa gracza
    • Server presentations
    • Discussions, Questions and Problems
  • Create private server
    • Pytania i Problemy - bez logowania
    • Problems and Questions
    • Cooperation
    • Tutorials / Video
    • C++ / Python / Server
    • Sources / Serverfiles / Clients
    • Homepage / Board
    • Quests
    • 2D Graphics
    • 3D Graphics
    • Recycling
  • Marketplace
    • Rynek - (Kupię, Sprzedam, Zamienię i Zlecę)
    • Archiwum
  • Hydepark
    • About all
    • Introduce yourself
    • My Creativity / Media
  • Others
    • Blokady i Ostrzeżenia
    • Trash

Categories

  • Programs
  • Plechito.com
    • Events
    • Maps
    • Mounts
    • Equipments
    • Monsters
    • NPC

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 289 results

  1. [!] You need Obj Scalling from Sash system for this "system". [!] Now I know you might have seen this system, but that code is so ugly. Open your UserInterface - InstanceBase.cpp and look for: const float c_fDefaultHorseRotationSpeed = 300.0f; Add below: #ifdef ENABLE_MOUNT_SCALE_SYSTEM inline float MountScale(const DWORD dwRaceIndex) { if ((dwRaceIndex >= 20110 && dwRaceIndex <= 20125) || (dwRaceIndex >= 20201 && dwRaceIndex <= 20270)) return 50.0f; return 0.0f; } #endif Now look for: const int c_iGuildSymbolRace = 14200; Add above: #ifdef ENABLE_MOUNT_SCALE_SYSTEM float fScale = MountScale(GetRace()); if (fScale) { fScale /= 100.0f; m_GraphicThingInstance.SetScale(fScale, fScale, fScale, true); } #endif Don't forget about Locale_inc.h: #define ENABLE_MOUNT_SCALE_SYSTEM
  2. Kiedyś na forum kokosza react wrzucał sporą paczke fixów, wam pewnie też się przydadzą [FIX] Dwie osoby kupują ten sam przedmiot w tym samym czasie (wywala klienta) [FIX] Wywalenie serwera za pomocą obiektów (dodanie do gildii) [FIX] Wywalanie yangów (obciążenie do tego stopnia aż kanał siada) [FIX] Expienie drugiej postaci na odległość (otrzymanie doświadczenia pomimo dwóch różnych lokacji) [FIX] Czarowane Ostrze (raczej każdy wie na czym on polega) [FIX] Prawdopodobny fix skoków hp/sp (podczas np. użycia sarży lub krycia się) [FIX] Naprawa slotów w Smoczej Alchemii [FIX] Niewidzialność postaci po zalogowaniu/teleporcie (pakiet) [FIX] Odbugowanie wojen gildii (komenda /war) [FIX] Brak możliwości stworzenia sklepu na wierzchowcu [FIX] -32k HP postaci po teleporcie bądź logowaniu [FIX] Teleportacja członka grupy do lidera (np. jesteśmy w m1, a poprzez kamer moda wzywamy gracza do siebie) [FIX] SQL Injection (Przyjaciele i Gildia) [FIX] Odbugowanie Zwoju Boga Smoków (+10% szans na ulepszenie)
  3. Przed: Po: Otwórz plik: game/src/input_db.cpp Znajdź: request blocked_country_ip { db_clientdesc->DBPacket(HEADER_GD_BLOCK_COUNTRY_IP, 0, NULL, 0); dev_log(LOG_DEB0, "<sent HEADER_GD_BLOCK_COUNTRY_IP>"); } I zakomentuj: // request blocked_country_ip // { // db_clientdesc->DBPacket(HEADER_GD_BLOCK_COUNTRY_IP, 0, NULL, 0); // dev_log(LOG_DEB0, "<sent HEADER_GD_BLOCK_COUNTRY_IP>"); // } ** Czyli po prostu usuwasz ** w tym przypadku wyłączasz kod
  4. [!] It can be used like this or even better than this: Open EterPythonLib - PythonWindowManagerModule.cpp and look for: else if (!stricmp(pszFlag, "ltr")) pWin->RemoveFlag(UI::CWindow::FLAG_RTL); Add below: else if (!stricmp(pszFlag, "alpha_sensitive")) pWin->AddFlag(UI::CWindow::FLAG_ALPHA_SENSITIVE); else if (!stricmp(pszFlag, "remove_limit")) pWin->AddFlag(UI::CWindow::FLAG_REMOVE_LIMIT); else if (!stricmp(pszFlag, "window_without_alpha")) pWin->AddFlag(UI::CWindow::FLAG_IS_BOARD_WITHOUT_ALPHA); Open EterPythonLib - PythonWindow.cpp and look for: if (IsFlag(CWindow::FLAG_NOT_PICK)) return NULL; Add below: if (IsFlag(CWindow::FLAG_IS_BOARD_WITHOUT_ALPHA)) // check flag { return NULL; } if (IsFlag(CWindow::FLAG_ALPHA_SENSITIVE)) // check flag { bool isFullTransparent = true; IsTransparentOnPixel(&x, &y, &isFullTransparent); // check transparency of the clicking position if (isFullTransparent) return NULL; // if transparent then return nothing, else give current window } After this: return (this); } Add the following code: void CWindow::IsTransparentOnPixel(long* x, long* y, bool* ret) { if (IsShow() && IsIn(*x, *y)) // check if the window is active and the cursor is in the window { if (m_windowType == WINDOW_TYPE_EX_IMAGE) // check if its an expanded_image { D3DXCOLOR pixel = ((CExpandedImageBox*)this)->GetPixelColor(*x - m_rect.left, *y - m_rect.top); // get current pixel color if ((BYTE)pixel.a != 0) // if the pixel is not trasparent then the whole window is not trasparent { *ret = false; return; } } else if (m_pChildList.empty()) // if its not ex_image and has no child then its NOT transparent [default for other components] { *ret = false; return; } } if (!m_pChildList.empty()) // check if all the childs are trasparent on the current position { std::list<CWindow*>::reverse_iterator ritor = m_pChildList.rbegin(); for (; ritor != m_pChildList.rend(); ritor++) { (*ritor)->IsTransparentOnPixel(x, y, ret); if (!*ret) return; } } } void CWindow::HaveSomeChildOnOnPixel(long* x, long* y, bool* ret) { if (IsShow() && IsIn(*x, *y)) // check if the window is active and the cursor is in the window { if (m_windowType == WINDOW_TYPE_EX_IMAGE) // check if its an expanded_image { D3DXCOLOR pixel = ((CExpandedImageBox*)this)->GetPixelColor(*x - m_rect.left, *y - m_rect.top); // get current pixel color if ((BYTE)pixel.a != 0) // if the pixel is not trasparent then the whole window is not trasparent { *ret = false; return; } } else if (m_pChildList.empty()) // if its not ex_image and has no child then its NOT transparent [default for other components] { *ret = false; return; } } if (!m_pChildList.empty()) // check if all the childs are trasparent on the current position { std::list<CWindow*>::reverse_iterator ritor = m_pChildList.rbegin(); for (; ritor != m_pChildList.rend(); ritor++) { (*ritor)->IsTransparentOnPixel(x, y, ret); if (!*ret) return; } } } Look for: CExpandedImageBox::CExpandedImageBox(PyObject * ppyObject) : CImageBox(ppyObject) Add inside: m_windowType = WINDOW_TYPE_EX_IMAGE; Look for: m_limitBiasRect.bottom = m_limitBiasRect.left = m_limitBiasRect.right = m_limitBiasRect.top = 0; Add below: m_windowType = WINDOW_TYPE_WINDOW; // setting all window type to window first Open EterPythonLib - PythonWindow.h and look for: FLAG_RTL = (1 << 11), Add below: FLAG_ALPHA_SENSITIVE = (1 << 12), // flag for activating alpha sensitive FLAG_REMOVE_LIMIT = (1 << 13), // flag for activating remove limit FLAG_IS_BOARD_WITHOUT_ALPHA = (1 << 14), Look for: int GetChildCount() { return m_pChildList.size(); } Add below: void IsTransparentOnPixel(long* x, long* y, bool* ret); void HaveSomeChildOnOnPixel(long* x, long* y, bool* ret); Look for: TWindowContainer m_pReserveChildList; Add below: BYTE m_windowType; // to recognize window type Look for: void SetRenderingMode(int iMode); Add below: D3DXCOLOR GetPixelColor(int x, int y) { if (m_pImageInstance) return m_pImageInstance->GetPixelColor(x, y); else return D3DXCOLOR(0, 0, 0, 0); } Look for: public: CWindow(PyObject * ppyObject); virtual ~CWindow(); Add before: enum WindowTypes // window type flags to recognize expanded_image class { WINDOW_TYPE_WINDOW, WINDOW_TYPE_EX_IMAGE, WINDOW_TYPE_MAX_NUM }; Open EterLib - GrpImageInstance.cpp and look for: CGraphicImageInstance::~CGraphicImageInstance() { Destroy(); } Add below: D3DXCOLOR CGraphicImageInstance::GetPixelColor(int x, int y) { // we first need the d3d texture, but its the "shortest" way to get it D3DXCOLOR dxClr = D3DXCOLOR(0, 0, 0, 0); CGraphicImage* pImage = m_roImage.GetPointer(); if (!pImage) return dxClr; CGraphicTexture* pTexture = pImage->GetTexturePointer(); if (!pTexture) return dxClr; LPDIRECT3DTEXTURE8 d3dTexture = pTexture->GetD3DTexture(); if (!d3dTexture) return dxClr; IDirect3DSurface8* surface; D3DSURFACE_DESC desc; D3DLOCKED_RECT rect; RECT rc; // we want just want to lock only one pixel rc.left = x; rc.right = x + 1; rc.top = y; rc.bottom = y + 1; if (FAILED(d3dTexture->GetSurfaceLevel(0, &surface))) // get the top surface of the image (it contains the whole image) return dxClr; if (FAILED(surface->GetDesc(&desc))) return dxClr; if (FAILED(surface->LockRect(&rect, &rc, D3DLOCK_READONLY | D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_NOSYSLOCK))) // lock the pixel return dxClr; PBYTE dwTexel = (PBYTE)rect.pBits; switch (desc.Format) { // there are several possible image formats, but its the most common one and as I saw its more than enough case D3DFMT_A8R8G8B8: dxClr.a = dwTexel[3]; dxClr.r = dwTexel[2]; dxClr.g = dwTexel[1]; dxClr.b = dwTexel[0]; break; } surface->UnlockRect(); // unlock the pixel for further using (like render) return dxClr; } Open EterLib - GrpImageInstance.h and look for: bool operator == (const CGraphicImageInstance & rhs) const; Add below: D3DXCOLOR GetPixelColor(int x, int y);
  5. Cześć przyjaciele Łapcie spoko poprawkę Co to robi? Naprawia otrzymywany damage przy dużej ilości potworów. JUŻ NIGDY NIE ZOBACZYSZ TEGO BŁĘDU Z HP Po dodaniu tego odświeżanie damage zostanie całkowicie naprawiony. Serverside: // game/src/packet.h -> Znajdź: typedef struct packet_damage_info { BYTE header; DWORD dwVID; BYTE flag; int damage; } TPacketGCDamageInfo; // Zamień: typedef struct packet_damage_info { BYTE header; DWORD dwVictimVID; DWORD dwAttackerVID; BYTE flag; int damage; } TPacketGCDamageInfo; // game/src/char_battle.cpp //In function void CHARACTER::SendDamagePacket search this: damageInfo.dwVID = (DWORD)GetVID(); // Zamień: damageInfo.dwVictimVID = (DWORD)GetVID(); damageInfo.dwAttackerVID = (DWORD)pAttacker->GetVID(); //W funkcji void CHARACTER::Dead(LPCHARACTER pkKiller, bool bImmediateDead) znajdź to: if (IsRevive() == false && HasReviverInParty() == true) { m_pkDeadEvent = event_create(dead_event, pEventInfo, bImmediateDead ? 1 : PASSES_PER_SEC(3)); } else { m_pkDeadEvent = event_create(dead_event, pEventInfo, bImmediateDead ? 1 : PASSES_PER_SEC(10)); } // Zamień: m_pkDeadEvent = event_create(dead_event, pEventInfo, bImmediateDead ? 1 : PASSES_PER_SEC(1)); Clientside: // UserInterface/Packet.h -> Znajdź: typedef struct packet_damage_info { BYTE header; DWORD dwVID; BYTE flag; int damage; } TPacketGCDamageInfo; // Zamień: typedef struct packet_damage_info { BYTE header; DWORD dwVictimVID; DWORD dwAttackerVID; BYTE flag; int damage; } TPacketGCDamageInfo; // UserInterface/InstanceBase.cpp -> Znajdź: ProcessDamage(); // Zamień: ProcessRemoveOldDamage(); ProcessDamage(); // UserInterface/InstanceBase.h -> Znajdź: struct SEffectDamage { DWORD damage; BYTE flag; BOOL bSelf; BOOL bTarget; }; typedef std::list<SEffectDamage> CommandDamageQueue; CommandDamageQueue m_DamageQueue; void ProcessDamage(); public: void AddDamageEffect(DWORD damage, BYTE flag, BOOL bSelf, BOOL bTarget); //Zamień struct SEffectDamage { DWORD damage; BYTE flag; BOOL bSelf; BOOL bTarget; DWORD dwVictimVID; DWORD dwAttackerVID; }; typedef std::list<SEffectDamage> CommandDamageQueue; CommandDamageQueue m_DamageQueue; void ProcessDamage(); void ProcessRemoveOldDamage(); public: void AddDamageEffect(DWORD damage, BYTE flag, BOOL bSelf, BOOL bTarget, DWORD dwVictimVID, DWORD dwAttackerVID);
  6. Dla własnych potrzeb przerobiłem delikatnie item_list. Na czym to polega? Normalnie robimy tak: Dzięki tej zmianie możemy stworzyć taki a'la range: Zaoszczędza to miejsca w item_list, a wszystko staje się mega czytelne. Jak dodać? W bince: Client/GameLib/ItemManager.cpp -> szukamy bool CItemManager::LoadItemList(const char * c_szFileName) i podmieniamy całą funkcję: bool CItemManager::LoadItemList(const char * c_szFileName) { CMappedFile File; LPCVOID pData; if (!CEterPackManager::Instance().Get(File, c_szFileName, &pData)) return false; CMemoryTextFileLoader textFileLoader; textFileLoader.Bind(File.Size(), pData); CTokenVector TokenVector; for (DWORD i = 0; i < textFileLoader.GetLineCount(); ++i) { if (!textFileLoader.SplitLine(i, &TokenVector, "\t")) continue; if (!(TokenVector.size() == 3 || TokenVector.size() == 4 || TokenVector.size() == 5)) { TraceError(" CItemManager::LoadItemList(%s) - StrangeLine in %d\n", c_szFileName, i); continue; } if (5 == TokenVector.size()) { const std::string & c_rstrID = TokenVector[0]; const std::string & c_rstrMaxID = TokenVector[1]; const std::string & c_rstrIcon = TokenVector[3]; const std::string & c_rstrModelFileName = TokenVector[4]; for(DWORD i2 = atoi(c_rstrID.c_str()); i2 <= atoi(c_rstrMaxID.c_str()); ++i2) { CItemData * pItemData = MakeItemData(i2); pItemData->SetDefaultItemData(c_rstrIcon.c_str(), c_rstrModelFileName.c_str()); } } else { const std::string & c_rstrID = TokenVector[0]; const std::string & c_rstrIcon = TokenVector[2]; DWORD dwItemVNum=atoi(c_rstrID.c_str()); CItemData * pItemData = MakeItemData(dwItemVNum); extern BOOL USE_VIETNAM_CONVERT_WEAPON_VNUM; if (USE_VIETNAM_CONVERT_WEAPON_VNUM) { extern DWORD Vietnam_ConvertWeaponVnum(DWORD vnum); DWORD dwMildItemVnum = Vietnam_ConvertWeaponVnum(dwItemVNum); if (dwMildItemVnum == dwItemVNum) { if (4 == TokenVector.size()) { const std::string & c_rstrModelFileName = TokenVector[3]; pItemData->SetDefaultItemData(c_rstrIcon.c_str(), c_rstrModelFileName.c_str()); } else { pItemData->SetDefaultItemData(c_rstrIcon.c_str()); } } else { DWORD dwMildBaseVnum = dwMildItemVnum / 10 * 10; char szMildIconPath[MAX_PATH]; sprintf(szMildIconPath, "icon/item/%.5d.tga", dwMildBaseVnum); if (4 == TokenVector.size()) { char szMildModelPath[MAX_PATH]; sprintf(szMildModelPath, "d:/ymir work/item/weapon/%.5d.gr2", dwMildBaseVnum); pItemData->SetDefaultItemData(szMildIconPath, szMildModelPath); } else { pItemData->SetDefaultItemData(szMildIconPath); } } } else { if (4 == TokenVector.size()) { const std::string & c_rstrModelFileName = TokenVector[3]; pItemData->SetDefaultItemData(c_rstrIcon.c_str(), c_rstrModelFileName.c_str()); } else { pItemData->SetDefaultItemData(c_rstrIcon.c_str()); } } } } return true; } Pozdrawiam.
  7. Wywołuje u 2 osoby odrzucił twoje zaproszenie ble ble ble więc koniec pierdolenia zaczynamy void MessengerManager::AuthToAdd(MessengerManager::keyA account, MessengerManager::keyA companion, bool bDeny) zmieniamy na Plik: messenger_manager.cpp bool MessengerManager::AuthToAdd(MessengerManager::keyA account, MessengerManager::keyA companion, bool bDeny) { DWORD dw1 = GetCRC32(companion.c_str(), companion.length()); DWORD dw2 = GetCRC32(account.c_str(), account.length()); char buf[64]; snprintf(buf, sizeof(buf), "%u:%u", dw1, dw2); DWORD dwComplex = GetCRC32(buf, strlen(buf)); if (m_set_requestToAdd.find(dwComplex) == m_set_requestToAdd.end()) { sys_log(0, "MessengerManager::AuthToAdd : request not exist %s -> %s", companion.c_str(), account.c_str()); return false; } m_set_requestToAdd.erase(dwComplex); if (!bDeny) { AddToList(companion, account); AddToList(account, companion); } } messenger_manager.h void AuthToAdd(keyA account, keyA companion, bool bDeny); zmieniamy na bool AuthToAdd(keyA account, keyA companion, bool bDeny); cmd_general.cpp Szukamy ACMD(do_messenger_auth) całość zmieniamy ACMD(do_messenger_auth) { if (ch->GetArena()) { ch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("대련장에서 사용하실 수 없습니다.")); return; } char arg1[256], arg2[256]; two_arguments(argument, arg1, sizeof(arg1), arg2, sizeof(arg2)); if (!*arg1 || !*arg2) return; char answer = LOWER(*arg1); bool bIsDenied = answer != 'y'; bool bIsAdded = MessengerManager::instance().AuthToAdd(ch->GetName(), arg2, bIsDenied); // DENY if (bIsAdded && bIsDenied) { LPCHARACTER tch = CHARACTER_MANAGER::instance().FindPC(arg2); if (tch) tch->ChatPacket(CHAT_TYPE_INFO, LC_TEXT("%s 님으로 부터 친구 등록을 거부 당했습니다."), ch->GetName()); } } Fix dzisiaj ogarniałem na potrzeby swojego src. o ile oto chodzi w tym.
  8. Cześć udostępniam wam nowe funkcje do przeładowania [Komenda /reload] bez potrzeby restartowania serwera. UWAGA: Nigdy nie używaj tego na publicznym serwerze gdzie jest więcej osób - Używaj tylko na testowym. Przeładujesz pliki takie jak - (etc_drop_item.txt, mob_drop_item.txt, special_item_group.txt, group.txt, group_group.txt, regen.txt, npc.txt, boss.txt, stone.txt) /reload p - Odświeża refine_proto / shop_item - Czyli NPC / item_attr & item_attr_rare /reload drop - etc_drop_item.txt, mob_drop_item.txt, special_item_group.txt /reload group - group.txt, group_group.txt /reload regen - regen.txt, npc.txt, boss.txt, stone.txt /p map - Niszczy wszystkie NPC, bossy, moby na mapie. /free_regen - Zapobiega wskrzeszaniu NPC, bossów, mobów na mapie Download paczki (Trochę kodu będzie): [Hidden Content] Virustotal: [Hidden Content]
  9. Cześć, Modyfikacja ta umożliwia: Wyświetlenie ilości sztuk danego przedmiotu na ziemi Wyświetlenie nazwy Księgi Umiejętności na ziemi 01. Otwórz plik game/item.cpp i w funkcji void CItem::EncodeInsertPacket(LPENTITY ent) znajdź: pack.bHeader = HEADER_GC_ITEM_GROUND_ADD; pack.x = c_pos.x; pack.y = c_pos.y; pack.z = c_pos.z; pack.dwVnum = GetVnum(); pack.dwVID = m_dwVID; Dodaj pod: for (int i = 0; i < ITEM_SOCKET_MAX_NUM; ++i) pack.alSockets[i] = m_alSockets[i]; pack.count = m_dwCount; 02. Otwórz plik game/packet.h i na końcu pakietu packet_item_ground_add dodaj: long alSockets[ITEM_SOCKET_MAX_NUM]; DWORD count; 03. Otwórz plik UserInterface/Packet.h i analogicznie dodaj: long alSockets[ITEM_SOCKET_SLOT_MAX_NUM]; DWORD count; 04. Otwórz plik UserInterface/PythonItem.cpp i znajdź w nim: void CPythonItem::CreateItem(DWORD dwVirtualID, DWORD dwVirtualNumber, float x, float y, float z, bool bDrop) Zamień na: void CPythonItem::CreateItem(DWORD dwVirtualID, DWORD dwVirtualNumber, long socket0, long socket1, long socket2, DWORD count, float x, float y, float z, bool bDrop) Następnie znajdź: CPythonTextTail& rkTextTail=CPythonTextTail::Instance(); rkTextTail.RegisterItemTextTail( dwVirtualID, pItemData->GetName(), &pGroundItemInstance->ThingInstance); Zamień na: char szText[1024]; if (pItemData->GetType() == 17) { CPythonSkill::SSkillData * c_pSkillData; CPythonSkill::Instance().GetSkillData(socket0, &c_pSkillData); sprintf(szText, "%s %s (x%d)", c_pSkillData->strName.c_str(), pItemData->GetName(), count); } else { sprintf(szText, "%s (x%d)", pItemData->GetName(), count); } CPythonTextTail& rkTextTail=CPythonTextTail::Instance(); rkTextTail.RegisterItemTextTail( dwVirtualID, szText, &pGroundItemInstance->ThingInstance); 05. Otwórz plik UserInterface/PythonItem.h i znajdź w nim: void CreateItem(DWORD dwVirtualID, DWORD dwVirtualNumber, float x, float y, float z, bool bDrop=true); Zamień na: void CreateItem(DWORD dwVirtualID, DWORD dwVirtualNumber, long socket0, long socket1, long socket2, DWORD count, float x, float y, float z, bool bDrop=true); 06. Otwórz plik UserInterface/PythonItemModule.cpp i w funkcji itemCreateItem znajdź: int iVirtualID; if (!PyTuple_GetInteger(poArgs, 0, &iVirtualID)) return Py_BadArgument(); int iVirtualNumber; if (!PyTuple_GetInteger(poArgs, 1, &iVirtualNumber)) return Py_BadArgument(); Dodaj pod: int socket0; if (!PyTuple_GetInteger(poArgs, 2, &socket0)) return Py_BadArgument(); int socket1; if (!PyTuple_GetInteger(poArgs, 3, &socket1)) return Py_BadArgument(); int socket2; if (!PyTuple_GetInteger(poArgs, 4, &socket2)) return Py_BadArgument(); int count; if (!PyTuple_GetInteger(poArgs, 5, &count)) return Py_BadArgument(); Następnie znajdź: CPythonItem::Instance().CreateItem(iVirtualID, iVirtualNumber, x, y, z, bDrop); Zamień na: CPythonItem::Instance().CreateItem(iVirtualID, iVirtualNumber, socket0, socket1, socket2, count, x, y, z, bDrop); 07. Otwórz plik UserInterface/PythonNetworkStreamPhaseGameItem.cpp i w funkcji RecvItemGroundAddPacket pod: packet_item_ground_add.dwVnum, Dodaj: packet_item_ground_add.alSockets[0], packet_item_ground_add.alSockets[1], packet_item_ground_add.alSockets[2], packet_item_ground_add.count, *08. Opcjonalnie dodaj #include "PythonSkill.h" w pliku PythonItem.cpp.
  10. Mały fix na poprawe outline przy graczach mobach etc.. Jezeli Ciezko doczytac (Przed jest 25 ~ 30 fpsów, Po masz 55 ~ 60) Tak wyglada po zmianie Sposób zostal wyciagniety z plikow serwera Eren3. ** SPOSÓB NIE JEST MÓJ, DODAWAC NA WLASNA ODPOWIEDZALNOSC!* MOB LAG FIX.7z Virustotal: [Hidden Content]
  11. Cześć niedługo wyjeżdżam a nie chce by polaki tym handlowali także walić ich na łeb, łapcie najbardziej prostą blokadę haksa o nazwie "Chmurka". Jest to jedna z prostszych blokad oraz nie obsługuje go limiter DMG, nie ważne jaki masz limiter - Twój limiter tego mnożnika dmg nie zablokuje! Przykład cheata Co robimy żeby zablokować tego skillhacka? Jest to jedna z prostszych zabezpieczeń iż nakładamy cooldown - (który został przeze mnie całkowicie przetestowany) nie da się w ciągu sekundy użyć dwóch skilli, jeżeli jednak będzie jakiś problem zawsze można skrócić czas sekundy na np. 0.5 sekund etc. Więc no tyle Idziemy do pliku char_skill.cpp i szukamy tego: bool CHARACTER::UseSkill(DWORD dwVnum, LPCHARACTER pkVictim, bool bUseGrandMaster) { if (false == CanUseSkill(dwVnum)) return false; Dodajemy pod if (SkillhackcooldownMuchomor > get_global_time()) { ChatPacket(CHAT_TYPE_INFO, ("Wykryto Skillhack od gracza %s", GetName())); GetDesc()->SetPhase(PHASE_CLOSE); return false; } else { SkillhackcooldownMuchomor = get_global_time() + 1; } Teraz idziemy do pliku char.h Szukamy void RefineSashMaterials(); Dodajemy pod time_t SkillhackcooldownMuchomor; I gotowe! cheat został zablokowany a każda próba użycia go kończy się wyrzuceniem z serwera.
  12. 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); }
  13. Tym razem coś wartościowego, myślę, że wszyscy mieliście problem z ograniczeniem prędkości kiedy masz więcej niż 255, a w sieci znajdziesz wszelkiego rodzaju bzdury i nie pojawiają się żadne moby. Cóż, spójrz tutaj za darmo, więc nie musisz już wydawać 5-10 euro za trochę kodu Char.cpp Dla szybkości ataku zmień tutaj Maksymalny limit: limit = 170; / limit = 250; case POINT_ATT_SPEED: min_limit = 0; if (IsPC()) limit = 170; else limit = 250; break; Aby zmienić prędkość ruchu tutaj Maksymalny limit: limit = 400; / limit = 470; case POINT_MOV_SPEED: min_limit = 0; if (IsPC()) limit = 400; else limit = 470; break; A jeśli chcesz zmienić podstawową prędkość, jaką postać otrzymuje na początku gry Wyszukaj i zmodyfikuj tutaj: void CHARACTER::ComputePoints() Poniżej masz: SetPoint(POINT_MOV_SPEED, 100); // Od tego momentu zmieniasz podstawową prędkość ruchu gracza SetPoint(POINT_ATT_SPEED, 100); // Od tego momentu zmieniasz podstawową szybkość ataku gracza A żeby to wszystko działało: Przejdź do pliku packet.h (Source Client oraz Game Source) Szukasz: typedef struct packet_add_char typedef struct packet_add_char2 packet_update_char packet_update_char2 Niektórzy z was mają tylko 1/2 lub wszystkie powyższe funkcje, Znajdź te 2 linie kodu: BYTE bMovingSpeed; BYTE bAttackSpeed; Zmieniasz je wszędzie w ten sposób: WORD bMovingSpeed; WORD bAttackSpeed; I bęc każdy problem naprawiony, muchomor król pozdrawiam
  14. Witajcie, przejdę od razu do rzeczy pokażę wam jak skasować typowe ostrzeżenia po kompilacji kodu źródłowego. DB GAME INNE
  15. [video=youtube] [align=left] Nieskończone Zaczarowanie Przedmiotu [/align] Nieskończone Wzmocnienie Przedmiotu Nieskończone Peleryny Męstwa Nieskończone Mikstury Nieskończone Strzały Nieskończone Rosy:
  16. Usprawnienie polega na tym, że gdy klikniemy w nazwę gracza na czacie ogólnym (!), otworzy nam się okno szeptu z tym graczem. Do prawidłowego działania tego usprawnienia niezbędne będzie usunięcie wymogu posiadania szkła intuicji do pokazywania przedmiotów na czacie. Jeśli wprowadzałeś już usunięcie tego wymogu, przejdź od razu do punktu drugiego. 01: Otwieramy input_main.cpp (source game srcs/server/game/src). Szukamy tego: if (nPrismCount < hyperlinks) return 1; I zmieniamy na to: if (nPrismCount < hyperlinks) return 0; 02: Otwieramy input_main.cpp (source game srcs/server/game/src). Szukamy tego: int len = snprintf(chatbuf, sizeof(chatbuf), "%s : %s", ch->GetName(), buf); I zmieniamy na to: int len; if (pinfo->type == CHAT_TYPE_SHOUT) { len = snprintf(chatbuf, sizeof(chatbuf), "|Hmsg:%s|h%s|h|r : %s", ch->GetName(), ch->GetName(), buf); } else { len = snprintf(chatbuf, sizeof(chatbuf), "%s : %s", ch->GetName(), buf); } 03: Otwieramy interfacemodule.py (client game pack/root). Szukamy tego: def MakeHyperlinkTooltip(self, hyperlink): tokens = hyperlink.split(":") if tokens and len(tokens): type = tokens[0] if "item" == type: self.hyperlinkItemTooltip.SetHyperlinkItem(tokens) I zmieniamy na to: def MakeHyperlinkTooltip(self, hyperlink): tokens = hyperlink.split(":") if tokens and len(tokens): type = tokens[0] if "item" == type: self.hyperlinkItemTooltip.SetHyperlinkItem(tokens) elif "msg" == type: self.OpenWhisperDialog(str(tokens[1])) I to wszystko
  17. GAME/PACKET.H SZUKACIE (w kilku miejscach) short sAlignment; zmieniacie na: int sAlignment; i szczerze nie jestem w 100% pewnych czy gdzieś jeszcze, dawno to robiłem ale sprawdźcie też w tables.h i char_battle / char.h czy gdzieś nie ma typu short, zamiast int (ctrl+f -> alignment) CLIENT/USERINTERFACE/Instancebase.cpp szukasz void CInstanceBase::SetAlignment(short sAlignment) zmieniasz na void CInstanceBase::SetAlignment(int sAlignment) CLIENT/USERINTERFACE/Instancebase.h szukasz short m_sAlignment; zmieniasz na int m_sAlignment; szukasz void SetAlignment(short sAlignment); zmieniasz na void SetAlignment(int sAlignment); szukasz short m_sAlignment; zmieniasz na int m_sAlignment; CLIENT/USERINTERFACE/NetworkActorManager.h szukasz 2x short m_sAlignment; zmieniasz na int m_sAlignment; CLIENT/USERINTERFACE/Packet.h szukasz (3x ) short sAlignment; zmieniasz na int sAlignment; cała filozofia, dziękuje za uwagę ps. mogłem o czymś zapomnieć bo ostatni raz robiłem to jakieś 4 lata temu więc jak coś nie działa dajcie znać(a najlepiej po prostu przeszukajcie kod pod hasłem alignment i sami sprawdźcie), ale powinno być okej
  18. 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
  19. Funkcja może powodować w losowych sytuacjach crash ch. 1. Otwórz questlua_npc.cpp i zamień zawartość funkcji npc_get_leader_vid na: { CQuestManager& q = CQuestManager::instance(); LPCHARACTER npc = q.GetCurrentNPCCharacterPtr(); LPPARTY party = npc->GetParty(); if (!party) { sys_err("npc_get_leader_vid: Function triggered without party"); return 1; } LPCHARACTER leader = party->GetLeader(); if (leader) lua_pushnumber(L, leader->GetVID()); else lua_pushnumber(L, 0); return 1; }
  20. 1. System Oznaczenia Dropu W bince otwieramy plik : PythonTextTail.cpp w include dopisujemy: #include "PythonPlayer.h" Szukamy pTextTail->pOwnerTextInstance->SetColor(1.0f, 1.0f, 0.0f); Dodajemy CInstanceBase * pInstanceBase = CPythonCharacterManager::Instance().GetMainInstancePtr(); if (pInstanceBase) { if (strcmp(pInstanceBase->GetNameString(), c_szName)) pTextTail->pOwnerTextInstance->SetColor(1.0f, 0.0f, 0.0f); }
  21. Witam. Błąd polega na tym, że gdy nadacie sobie komendą (/setsk 130 30/131 10) lub książką punkty konia to po każdym restarcie serwera punkty wam znikną. Pokaże wam jak to naprawić. 1.1 W pliku input_login.cpp który znajduje się w src/game szukamy: if (ch->GetHorseLevel() > 0) { DWORD pid = ch->GetPlayerID(); if (pid != 0 && CHorseNameManager::instance().GetHorseName(pid) == NULL) db_clientdesc->DBPacket(HEADER_GD_REQ_HORSE_NAME, 0, &pid, sizeof(DWORD)); } 1.2 Zmieniamy to na: if (ch->GetHorseLevel() > 0) { DWORD pid = ch->GetPlayerID(); if (pid != 0 && CHorseNameManager::instance().GetHorseName(pid) == NULL) db_clientdesc->DBPacket(HEADER_GD_REQ_HORSE_NAME, 0, &pid, sizeof(DWORD)); ch->SetHorseLevel(ch->GetHorseLevel()); ch->SkillLevelPacket(); } Teraz wystarczy skompilować game oraz je podmienić. Plik jest przepisany, więc nie powinien posiadać złego kodowania.
  22. 1. Otwórz plik game/war_map.cpp i znajdź w nim funkcje: void CWarMap::STeamData::RemoveMember(LPCHARACTER ch) Zamień ją na: void CWarMap::STeamData::RemoveMember(LPCHARACTER ch) { set_pidJoiner.erase(ch->GetPlayerID());//RemoveMember fix --iMemberCount; }
  23. @Add service.h #define ENABLE_REGEN_RENEWAL @Find char_battle.cpp CHARACTER::Dead @Add End Function #ifdef ENABLE_REGEN_RENEWAL if (!IsPC() && !GetDungeon()) { if (GetRegen() != NULL) regen_event_create(GetRegen()); } #endif @Find cmd_gm.cpp struct FuncPurge @Find Second M2_DESTROY_CHARACTER(pkChr); @Add Upper #ifdef ENABLE_REGEN_RENEWAL if (!pkChr->IsPC() && !pkChr->GetDungeon()) if (pkChr->GetRegen() != NULL) regen_event_create(pkChr->GetRegen()); #endif @Find regen.cpp EVENTFUNC(regen_event) @Find Second return PASSES_PER_SEC(regen->time); @Change #ifdef ENABLE_REGEN_RENEWAL regen->event = NULL; return 0; #else return PASSES_PER_SEC(regen->time); #endif @Find regen.cpp bool regen_load @Find Second regen_event_info* info = AllocEventInfo<regen_event_info>(); info->regen = regen; regen->event = event_create(regen_event, info, PASSES_PER_SEC(regen->time)); @Change #ifndef ENABLE_REGEN_RENEWAL regen_event_info* info = AllocEventInfo<regen_event_info>(); info->regen = regen; regen->event = event_create(regen_event, info, PASSES_PER_SEC(regen->time)); #endif @Find regen.cpp @Add End #ifdef ENABLE_REGEN_RENEWAL void regen_event_create(LPREGEN regen) { if (!regen) return; if (regen->time != 0) { regen_event_info* info = AllocEventInfo<regen_event_info>(); info->regen = regen; regen->event = event_create(regen_event, info, PASSES_PER_SEC(regen->time)); } } #endif @Find regen.h @Add End #ifdef ENABLE_REGEN_RENEWAL extern void regen_event_create(LPREGEN regen); #endif @Find char.h @Add public: #ifdef ENABLE_REGEN_RENEWAL LPREGEN GetRegen(); #endif @Find char.cpp @Add End LPREGEN CHARACTER::GetRegen() { return m_pkRegen; }
  24. Siema. Nie testowałem ale jestem ciekawy tego fixa Ja ogólnie tego nie wrzucam bo dla mnie ten bug to już jakaś tam część metina ale może komuś się przyda. @EDIT PORADNIK: 1. Znajdź w char_state.cpp i zakomentuj cały ten kod: if (GetRaceNum() == 2191 && number(1, 20) == 1 && get_dword_time() - m_pkMobInst->m_dwLastWarpTime > 1000) { float fx, fy; GetDeltaByDegree(victim->GetRotation(), 400, &fx, &fy); long new_x = victim->GetX() + (long)fx; long new_y = victim->GetY() + (long)fy; SetRotation(GetDegreeFromPositionXY(new_x, new_y, victim->GetX(), victim->GetY())); Show(victim->GetMapIndex(), new_x, new_y, 0, true); GotoState(m_stateBattle); m_dwStateDuration = 1; ResetMobSkillCooltime(); m_pkMobInst->m_dwLastWarpTime = get_dword_time(); return; Otwórz motlist.txt w folderze od żółwia w kliencie gry (giant_desert_turtle) i zamień całą zawartość na to: GENERAL WAIT 00.msa 65 GENERAL WAIT1 00_1.msa 35 GENERAL RUN 03.msa 100 GENERAL NORMAL_ATTACK 20.msa 50 GENERAL NORMAL_ATTACK1 20_1.msa 50 GENERAL FRONT_DAMAGE 30.msa 100 GENERAL FRONT_DEAD 31.msa 100 GENERAL BACK_DAMAGE 34.msa 100 GENERAL SPECIAL 24.msa 100 GENERAL SPECIAL1 25.msa 100 Pamiętajcie, że rzułf posiada też domyślnie 100% odporności na wszystkie bronie. Ustawcie resist_sword, dagger, bell, fan itd. w mob_proto serwerowym na mniejsze wartości. Np. 0 lub 20%.
  25. Siemka udostępniam wam Team System w systemie został poprawiony błąd błędem było to że jak ktoś z Team się zalogował to w oknie Przyjaciele i tp w Zakładce Administracja / Team Wyświetlał się on nam Offline chociaż że był Online i widoczny w grze za ten błąd odpowiadała ta funkcja "SELECT '%s',mName FROM common.gmlist WHERE mName!='%s'", account.c_str(), account.c_str()); Która była źle napisana poprawiłem ją i u mnie działa poprawnie po wylogowaniu się i zalogowaniu osoba z Team jest Online po zresetowaniu Maszyny i ponownym uruchomieniu serwera i zalogowania się jako członek Team ta osoba jest zaś widoczna Online w Zakładce Administracja / Team Ps. u góry podana funkcja jest prawidłowa Jeżeli już ten system istnieje na forum to proszę usunąć Temat ;) Pobierz: Team System.zip Skan: [Hidden Content]
×
×
  • Create New...