-
Content Count
2,889 -
Joined
-
Last visited
-
Days Won
519
Everything posted by V3ct0r
-
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
-
Hello, @FapFap Show your check_can_enter_garner2 function from garner2\entry.lua
-
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
-
Да, здесь суть защиты от GM команд заключается в том, что GM команды могут использовать только персонажи с ID 1 и 2 в базе данных GameDB (поле cha_id, в таблице character). Команду &lua вообще никто не может использовать. Команду &updateall можно использовать раз в 5 секунд. P.S. Можно на "ты"
-
Замени на function HandleChat(role, message) return 1 end
-
@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.
-
Line 15305: AllExAttrSet(role) 'role' is undefined variable. I think you can remove this line without any damage.
-
Hello! What is Pirate Club System?
-
Ищи в скриптах строку "trying to use gm command!". Notepad++ умеет искать сразу по нескольким файлам.
-
Это всего лишь инструкции, вопрос в том, за что отвечает пропатченный код и из-за чего возникла проблема запуска клиента. По его словам, он выполнял эту разовую работу по заказу Нивала.
-
Персонажи отмечаются на всех картах кроме Священной войны (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 можно найти в гугле.
-
Проблема в том, что эта функция, по словам ТС, без изменений работала годами, а в последнее время на нее грешат логи и сервер падает. В логах Lua пишет, что недостаточно памяти
-
@FapFap, make sure that module 'rewrite_module' is loaded. httpd.conf LoadModule rewrite_module modules/mod_rewrite.so Note: solution for Apache web server
-
Better check Medal of Valor before player entered the map.
-
Эта DLL движка была пропатчена Инсом (insider) для поддержки русских символов на ру. оф. клиенте. А в чем там конкретно проблема?
-
@FapFap, make sure that characters have item Medal of Valor (ID: 3849)
-
Put .htaccess file with the following contents in each directory which must be protected: deny from all
-
Compiler: system\game.exe startgame table_bin Game editor: system\game.exe startgame editor
-
Hello, @daim2604! Make sure that ItemInfo is successfully compiled without errors on server side.
-
Hello, @Rinor! Find where this function is used in AI scripts (IsPlayer) and check its parameter.
-
Hello! I do not have time and interest to enable antibot in each GameServer.exe.
-
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) ...
-
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
- 1 reply
-
- 1
-
Check that role is a valid descriptor of monster. Show your script where you use the CheckMonsterDead function.