Jump to content

V3ct0r

Administrators
  • Content Count

    2,902
  • Joined

  • Last visited

  • Days Won

    519

Everything posted by V3ct0r

  1. Вытащи ID предмета из слота экипировки. По другому вроде никак
  2. local con = GetItemAttrRange(<ID предмета из ItemInfo.txt>, ITEMATTR_VAL_CON, 0)
  3. Попробуй сделать как в этом гайде. Только вместо времени проверяй какой-то признак персонажа, в зависимости от которого выбирается язык.
  4. puzzleworld\entry.lua В функции after_create_entry( ) вызывается функция GetMapEntryCopyObj( )? function after_create_entry(entry) local copy_mgr = GetMapEntryCopyObj(entry, 0) // !!! именно 0 . . . end
  5. А смысл? Ты её отключишь, а сервер отправит 3 запроса на капчу и не получит ответа. В результате тебя кикнет. Я бы попробовал написать DLL'ку, которая перехватывает нажатия клавиш и отправляет соответствующие пакеты на сервер.
  6. Очень жду, интересно почитать. Или ты ждешь, пока тебе здесь ответят как обойти данный антибот?
  7. Ничего подобного. В данном случае, помогать просто так не хочешь именно ты, и при этом проецируешь свое странное поведение на весь форум. Напиши пару статей, выложи разработанные тобой программы или скрипты, внеси вклад в наш форум, и все будут тебе рады. Понятное дело, это гораздо сложнее, чем писать глупые комментарии.
  8. А как её надо написать, чтобы работало как надо? Все что эта штука учитывает задано в исходнике и про пати, как было отмечено выше, здесь речи нет: if ( pMainCha != nullptr && pCha != nullptr ) { if ( pMainCha->get_id() != pCha->get_id() ) { // Проверим, что персонажи не находятся в СВ if ( OurMap != "guildwar" && OurMap != "guildwar2") { if (pMainCha->get_guild_id() == pCha->get_guild_id()) { // Если персонажи в одной гильдии // то устанавливаем зеленый круг side_id = 1; } else { // Если персонажи не в одной гильдии // то устанавливаем красный круг side_id = 2; } } } }
  9. @mkhzaleh, this version of DLL works only with Russian client. You need to find the following addresses in Game.exe from your client and correct the source code: // Main Character address const DWORD MainChaStaticAddr = 0x0067061C; // Address of the function NetSwitchMap( ) const DWORD NetSwitchMapAddr = 0x005071A0; // Address of the method CCharacter::setSideID( ) const DWORD SetSideIdAddr = 0x004A2950; // Given addresses are for Russian client
  10. line 50: replace 'null' to 'nil'
  11. Чтобы не редактировать каждую функцию, так как их может быть много, можно перехватывать каждую begin- и end-функцию и подставлять наш исправленный код. В папке GameServer\resource\script\calculate создаем скрипт manufacture_fix.lua со следующим содержимым: print("Loading file manufacture_fix.lua") -- Таблица функций мануфактуры -- которые необходимо исправить local manufacture_fix_table = { --[[ [ID предмета] = { func_beg = "begin-функция", func_end = "end-функция" }, ]]-- [1136] = { func_beg = "Skill_ShanGD1_Begin", func_end = "Skill_ShanGD1_End" }, [1137] = { func_beg = "Skill_FuShe1_Begin", func_end = "Skill_FuShe1_End", } } -- Begin - функция function manufacture_fix_begin_func(role, sklv) local NocLock = KitbagLock(role, 0) if NocLock == LUA_FALSE then SystemNotice( role , "Inventory has been binded") return 0 end end -- End - функция function manufacture_fix_end_func(ATKER, DEFER, sklv, item_id) -- Наш код local atk_role = TurnToCha(ATKER) local item_count = CheckBagItem(atk_role, item_id) if item_count <= 0 then SkillUnable(atk_role) SystemNotice(atk_role, "Does not possess required item to use skill") return 0 end DelBagItem(atk_role, item_id, 1) -- Вызываем оригинальную функцию _G[manufacture_fix_table[item_id].func_end .. "_original"](ATKER, DEFER, sklv) end -- Связать end - функцию с ID предмета function bind_func(item_id) return function(ATKER, DEFER, sklv) return manufacture_fix_end_func(ATKER, DEFER, sklv, item_id) end end -- Перехватываем функции мануфактуры for item_id, data in pairs(manufacture_fix_table) do _G[data.func_beg] = manufacture_fix_begin_func _G[data.func_end .. "_original"] = _G[data.func_end] _G[data.func_end] = bind_func(item_id) end Заполняем таблицу manufacture_fix_table и подключаем скрипт manufacture_fix.lua в конце файла skilleffect.lua dofile(GetResPath("script\\calculate\\manufacture_fix.lua")) В результате скрипт автоматически исправит баг с мануфаком и вам не придется вручную редактировать каждую функцию. P.S. Не тестировал, но должно работать
  12. V3ct0r

    Team Error

    This is GameServer.exe problem void CEventHandler::Event_ChaDie(CCharacter *pDead, CCharacter *pAtk) pPlayer = pHarm->pAtk->GetPlayer(); if(pPlayer == NULL) { LG("team_error", "it appear especially error when check teammate experience assign, player finger is null!, character name[%s]\n", pHarm->pAtk->GetName()); break; } I think you can ignore that
  13. Hello, @FapFap Show your check_can_enter_garner2 function from garner2\entry.lua
  14. Hello, @Java Script! I think you can see how to install it on the official site (Installing Zend Server on Windows) http://www.zend.com/en/resources/zend-documentation
  15. Да, здесь суть защиты от GM команд заключается в том, что GM команды могут использовать только персонажи с ID 1 и 2 в базе данных GameDB (поле cha_id, в таблице character). Команду &lua вообще никто не может использовать. Команду &updateall можно использовать раз в 5 секунд. P.S. Можно на "ты"
  16. Замени на function HandleChat(role, message) return 1 end
  17. @FapFap, do you see any messages in the system chat after you perform apparel strengthening? Look for them in file forge.lua and you will find code that removes Strengthening Crystals.
  18. Line 15305: AllExAttrSet(role) 'role' is undefined variable. I think you can remove this line without any damage.
  19. Hello! What is Pirate Club System?
  20. Ищи в скриптах строку "trying to use gm command!". Notepad++ умеет искать сразу по нескольким файлам.
  21. Это всего лишь инструкции, вопрос в том, за что отвечает пропатченный код и из-за чего возникла проблема запуска клиента. По его словам, он выполнял эту разовую работу по заказу Нивала.
  22. Персонажи отмечаются на всех картах кроме Священной войны (guildwar и guildwar2). Выкладываю исходный код C++ DLL, которая заставляет ру. оф. 1.3x клиент отмечать персонажей кругами. dllmain.cpp #include <string> #include <windows.h> #include <detours.h> // Адрес персонажа игрока const DWORD MainChaStaticAddr = 0x0067061C; // Для EN клиента 0x0067052C; // Адрес функции NetSwitchMap( ) const DWORD NetSwitchMapAddr = 0x005071A0; // Для EN клиента 0x00507090; // Адрес метода CCharacter::setSideID( ) const DWORD SetSideIdAddr = 0x004A2950; //Для EN клиента 0x004A2840; // Класс персонажа class CCharacter { public: // Получить ID персонажа int get_id() const { return m_id; } // Получить ID гильдии int get_guild_id() const { return m_guildId; } private: char m_nop1[0x04E4]; // Смещение 1 int m_guildId; // ID гильдии char m_nop2[0x07FC]; // Смещение 2 int m_id; // ID персонажа }; // Структура с информацией о смене карты struct stNetSwitchMap { short sEnterRet; char *szMapName; char chEnterType; bool bIsNewCha; bool bCanTeam; }; // Тип указателя на оригинальный // метод void CCharacter::setSideID(long side_id) typedef void (__thiscall *setSideIdPtr)(void *, unsigned int); // Тип указателя на оригинальную функцию // void NetSwitchMap(stNetSwitchMap &switchmap) typedef void (__cdecl *netSwitchMapPtr)(stNetSwitchMap&); // Указатель на оригинальный метод // void CCharacter::setSideID(long side_id) setSideIdPtr original_SetChaSide = (setSideIdPtr)(void *)(SetSideIdAddr); // Указатель на оригинальную функцию // void NetSwitchMap(stNetSwitchMap &switchmap) netSwitchMapPtr original_SwitchMap = (netSwitchMapPtr)(void *)(NetSwitchMapAddr); // Текущая карта персонажа std::string OurMap = ""; // Прочитать целое число из памяти по // указанному адресу DWORD ReadDword(DWORD address) { DWORD Temp = 0; ReadProcessMemory( GetCurrentProcess(), (void *)address, &Temp, sizeof(Temp), 0 ); return Temp; } // Функция, которая выполняет перехват функции смены карты void __cdecl hooked_SwitchMap(stNetSwitchMap &switchmap) { // Получим текущую карту персонажа OurMap = switchmap.szMapName; // Вызываем оригинальную функцию original_SwitchMap(switchmap); } // Функция, которая выполняет перехват установки цветного круга // в зависимости от стороны персонажа void __fastcall hooked_SetChaSide(void *This, void *notUsed, unsigned int side_id) { // Указатель на нашего персонажа CCharacter *pMainCha = reinterpret_cast<CCharacter *>( ReadDword(MainChaStaticAddr) ); // Указатель на персонажа CCharacter *pCha = reinterpret_cast<CCharacter *>(This); if ( pMainCha != nullptr && pCha != nullptr ) { if ( pMainCha->get_id() != pCha->get_id() ) { // Проверим, что персонажи не находятся в СВ if ( OurMap != "guildwar" && OurMap != "guildwar2") { if (pMainCha->get_guild_id() == pCha->get_guild_id()) { // Если персонажи в одной гильдии // то устанавливаем зеленый круг side_id = 1; } else { // Если персонажи не в одной гильдии // то устанавливаем красный круг side_id = 2; } } } } // Вызываем оригинальный метод original_SetChaSide(This, side_id); } // Точка входа BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: // Устанавливаем хуки DetourRestoreAfterWith(); DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(&(PVOID&)original_SwitchMap, hooked_SwitchMap); DetourAttach(&(PVOID&)original_SetChaSide, hooked_SetChaSide); DetourTransactionCommit(); break; case DLL_PROCESS_DETACH: // Снимаем хуки DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach(&(PVOID&)original_SwitchMap, hooked_SwitchMap); DetourDetach(&(PVOID&)original_SetChaSide, hooked_SetChaSide); DetourTransactionCommit(); break; } return TRUE; } Предоставляю замечательную возможность изучить код и скомпилировать DLL, а также подключить её к клиенту самостоятельно. Для этого понадобятся Microsoft Visual Studio Community 2017 и библиотека Microsoft Detours. Как собрать библиотеку Detours можно почитать на Хабре. Как присоединить DLL к Game.exe можно найти в гугле.
×
×
  • Create New...