Jump to content

V3ct0r

Administrators
  • Content Count

    2,889
  • Joined

  • Last visited

  • Days Won

    519

Everything posted by V3ct0r

  1. 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
  2. Hello, @FapFap Show your check_can_enter_garner2 function from garner2\entry.lua
  3. 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
  4. Да, здесь суть защиты от GM команд заключается в том, что GM команды могут использовать только персонажи с ID 1 и 2 в базе данных GameDB (поле cha_id, в таблице character). Команду &lua вообще никто не может использовать. Команду &updateall можно использовать раз в 5 секунд. P.S. Можно на "ты"
  5. Замени на function HandleChat(role, message) return 1 end
  6. @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.
  7. Line 15305: AllExAttrSet(role) 'role' is undefined variable. I think you can remove this line without any damage.
  8. Hello! What is Pirate Club System?
  9. Ищи в скриптах строку "trying to use gm command!". Notepad++ умеет искать сразу по нескольким файлам.
  10. Это всего лишь инструкции, вопрос в том, за что отвечает пропатченный код и из-за чего возникла проблема запуска клиента. По его словам, он выполнял эту разовую работу по заказу Нивала.
  11. Персонажи отмечаются на всех картах кроме Священной войны (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 можно найти в гугле.
  12. Проблема в том, что эта функция, по словам ТС, без изменений работала годами, а в последнее время на нее грешат логи и сервер падает. В логах Lua пишет, что недостаточно памяти
  13. V3ct0r

    Website

    @FapFap, make sure that module 'rewrite_module' is loaded. httpd.conf LoadModule rewrite_module modules/mod_rewrite.so Note: solution for Apache web server
  14. Better check Medal of Valor before player entered the map.
  15. Эта DLL движка была пропатчена Инсом (insider) для поддержки русских символов на ру. оф. клиенте. А в чем там конкретно проблема?
  16. @FapFap, make sure that characters have item Medal of Valor (ID: 3849)
  17. V3ct0r

    Website

    Put .htaccess file with the following contents in each directory which must be protected: deny from all
  18. Compiler: system\game.exe startgame table_bin Game editor: system\game.exe startgame editor
  19. Hello, @daim2604! Make sure that ItemInfo is successfully compiled without errors on server side.
  20. Hello, @Rinor! Find where this function is used in AI scripts (IsPlayer) and check its parameter.
  21. Hello! I do not have time and interest to enable antibot in each GameServer.exe.
  22. Hello, @ahmad! You can try make the limit in a function after_enter_<mapname>(role), file ctrl.lua of required map. 1) Get MAC of role using LuaSQL; 2) Check that the MAC was used no more than X times (N <= X); 3) if the limit is exceeded, then kick the character from the map; 4) else increment N - number of MAC uses. Also you will need decrease N in function before_leave_<mapname>(role), when role leaves the map. Another way: 1) Execute the following SQL query using LuaSQL (example): SELECT l.last_login_mac, COUNT (c.cha_id) AS n FROM GameDB.dbo.character AS c LEFT JOIN GameDB.dbo.account AS a ON (a.act_id = c.act_id) LEFT JOIN AccountServer.dbo.account_login AS l ON (l.name = a.act_name COLLATE Cyrillic_General_CI_AS) WHERE c.mem_addr = 0 AND c.map = 'garner' GROUP BY l.last_login_mac It will return the number of each MAC (N) used in the map. 2) Get MAC of role using LuaSQL; 3) Find role's MAC in the query result and get N; 4) Check that the MAC was used no more than X times (N <= X); 5) ...
  23. Hello, @gatero! You can find functions to encrypt and decrypt inventory in GameDB database (dbo.encrypt and dbo.decrypt) ALTER FUNCTION [dbo].[encrypt] ( @input char(3500) ) RETURNS char(3500) AS BEGIN DECLARE @prefix varchar(8) DECLARE @result varchar(3500) DECLARE @key varchar(8) DECLARE @input_length integer DECLARE @key_length integer DECLARE @i integer SET @i = CHARINDEX('#', @input) SET @prefix = SUBSTRING(@input, 0, @i + 1) SET @input = SUBSTRING(@input, @i + 1, 3500) SET @result = '' SET @key = '19800216' SET @input_length = LEN(@input) SET @key_length = LEN(@key) SET @i = 0 WHILE @i < @input_length BEGIN SET @result = @result + CHAR(ASCII(SUBSTRING(@input, @i + 1, 1)) + ASCII(SUBSTRING(@key, @i % @key_length + 1, 1))) SET @i = @i + 1 END SET @result = @prefix + @result RETURN @result END ALTER FUNCTION [dbo].[decrypt] ( @input char(3500) ) RETURNS char(3500) AS BEGIN DECLARE @prefix varchar(8) DECLARE @result varchar(3500) DECLARE @key varchar(8) DECLARE @input_length integer DECLARE @key_length integer DECLARE @i integer SET @i = CHARINDEX('#', @input) SET @prefix = SUBSTRING(@input, 0, @i + 1) SET @input = SUBSTRING(@input, @i + 1, 3500) SET @result = '' SET @key = '19800216' SET @input_length = LEN(@input) SET @key_length = LEN(@key) SET @i = 0 WHILE @i < @input_length BEGIN SET @result = @result + CHAR(ASCII(SUBSTRING(@input, @i + 1, 1)) - ASCII(SUBSTRING(@key, @i % @key_length + 1, 1))) SET @i = @i + 1 END SET @result = @prefix + @result RETURN @result END PHP equivalent (by Matt): <?php define('CRYPT_KEY', '19800216'); function encrypt($input, $key) { $keyLen = strlen($key); $inputLen = strlen($input); $result = ''; for ($i = 0 ; $i < $inputLen ; $i++ ) { $result .= chr(ord($input[$i]) + ord($key[$i % $keyLen])); } return $result; } function decrypt($input, $key) { $keyLen = strlen($key); $inputLen = strlen($input); $result = ''; for ($i = 0 ; $i < $inputLen ; $i++ ) { $result .= chr(ord($input[$i]) - ord($key[$i % $keyLen])); } return $result; } $example = 'btmk`^cnjei\abafaei``babaeh\`^abaeh\a^dl]kddg^bbaeh\`^abaehka^gjbei\abafaei``babaeh\`^abaeh\a^do]jdcf^cbaeh\`^abaehkb^ibbei``babbih``^abaeh\`^abaei\cf]geeke\cibaeh\`^abaehkc^gfajda\b]f]id`\b]f]id`\blj]okgh^bbaeh\`^abaeh\`^abbejf\b]hieh\bk]heejg\e]iaehkgehkf'; print(decrypt($example, CRYPT_KEY)); ?> Output: 1;5;0,289,1,10000,10000,0,0,0,0,0,0,1,36,2,47,1,0,0,0,0,0,0;1,641,1,10000,10000,0,0,0,0,0,0,1,39,1,36,2,0,0,0,0,0,0;2,8,1,10000,10000,0,0,0,0,0,0,1,34,14,35,18,0,0,0,0,0,0;3,6001,1,0,0,0,0,0,0,0,0,0;4,6378,1,0,0,0,0,0,0,0,0,1,26,0,28,0,29,24,27,3,30,0;73755
  24. Check that role is a valid descriptor of monster. Show your script where you use the CheckMonsterDead function.
×
×
  • Create New...