Jump to content

Search the Community

Showing results for tags 'Мод'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

  • Russian Section
    • Новости и объявления
    • Пиратия: Документация
    • Пиратия: Релизы
    • Пиратия: Разработка
    • Пиратия: Web
    • Пиратия: Помощь
    • Совместные проекты / набор команды
    • Доска объявлений
    • Программирование
    • Оффтопик
    • Корзина
  • English Section
    • News & Announcements
    • Guides
    • Releases
    • Development
    • Web
    • Questions & Help
    • Shared Projects / Team search
    • Paid services & Requests
    • Programming
    • Offtopic
    • Recycle bin
  • Portuguese Section
    • Dúvidas & Ajuda
  • Spanish Section
    • Preguntas y Ayuda
  • Servers
    • Russian servers
    • English servers

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Found 40 results

  1. Идеи для модов В данной теме обсуждаются идеи для создания новых модов, а так же для улучшения уже существующих.
  2. [Мод] Отображение списка предметов, выпадающих с монстров (ресурсов) Мод добавляет в игру форму со списком предметов, которые с определенным шансом выпадают из выбранного монстра, (см. скриншот выше). Монстр выбирается следующим образом: Правая кнопка мыши по монстру -> пункт контекстного меню "List of items". Дополнительно, мод позволяет выводить список предметов при наведении курсора мыши на монстра, либо при зажатии клавиши SHIFT на клавиатуре (данное поведение отключается в настройках игры) : Некоторые особенности мода: 1) Каждый предмет выводится в виде иконки, названия предмета и шанса выпадения в процентах; 2) Список отсортирован по убыванию процента шанса выпадения; 3) Предметы выделяются цветом в зависимости от шанса выпадения: зеленый - высокий шанс выпадения, красный - низкий шанс выпадения. Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.mobdrop; Версия: 1.1; Автор: @V3ct0r. Особая благодарность @Graf за предоставленные скрипты и текстуры для формы со списком предметов; Тип: для клиента (Game.exe); Поддерживаемые исполняемые .exe файлы: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4, GAME_13X_5. Установка 1) Поместите файл DLL-библиотеки мода "pkodev.mod.mobdrop.13x_<ID>.dll" для Вашей версии Game.exe и файл настроек "pkodev.mod.mobdrop.cfg" в папку "mods\pkodev.mod.mobdrop" игрового клиента; 2) В файл настроек "pkodev.mod.mobdrop.cfg" запишите рейты сервера на дроп: 1.0 3) Добавить GUI-скрипты из файла "Add to system.clu.txt" в файл "Клиент\scripts\lua\forms\system.clu"; 4) Добавить GUI-скрипты из файла "Add to player.clu.txt" в файл "Клиент\scripts\lua\forms\player.clu"; 5) При необходимости, перевести GUI-скрипты из п. (3) и (4) на русский язык; 6) По умолчанию отображение списка предметов рядом с монстрами при наведении на них курсора мыши отключено. При необходимости включить данное поведение в настройках игры: Список изменений Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2022 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  3. [Мод] Выделение друзей и врагов цветом Данная модификация выделяет на экране дружественных и враждебных игроков: имена персонажей меняют цвет, а под персонажами отображаются цветные круги (см. скриншот выше). Если поблизости с персонажем игрока есть враждебные игроки, то рядом с аватаром персонажа отображается предупреждающая иконка: Персонажи считаются дружественными, если они: 1) Находятся в одном отряде; 2) Находятся в одной гильдии; 3) Находятся в одной фракции. Мод работает только на PvP-картах, которые указаны в настройках. Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.enemy; Версия: 1.0; Автор: V3ct0r; Тип: для клиента (Game.exe); Поддерживаемые исполняемые .exe файлы: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4 и GAME_13X_5. Установка 1) В директории "mods" Вашего клиента создайте папку "pkodev.mod.enemy"; 2) Поместите в неё файл DLL-библиотеки мода "pkodev.mod.enemy.client.13x_<x>.dll" для Вашей версии Game.exe. 3) Поместите в неё файл настроек мода "pkodev.mod.enemy.cfg" и настройте его по своему усмотрению: // pkodev.mod.enemy settings file // (c) V3ct0r from PKOdev.NET // 02/16/2022 [show] main_cha = true // Выделять ли персонажа игрока как дружественного? colored_name = true // Выделять ли имена персонажей цветом? colored_circle = true // Отображать ли цветные круги под персонажами? [color] enemy_color = FFFF0000 // Цвет имени враждебного персонажа (в шестнадцатеричной форме: FFRRGGBB) friend_color = FF00FF00 // Цвет имени дружественного персонажа (в шестнадцатеричной форме: FFRRGGBB) [icon] warning_show = true // Отображать ли предупреждающую иконку когда рядом враги? warning_x = 208 // Координата X иконки на экране warning_y = 16 // Координата Y иконки на экране [map] maps = garner,magicsea,darkblue // Карты на которых работает мод 4) В директории "texture" игрового клиента создайте папку "mods", а в ней подпапку "pkodev.mod.enemy". Поместите в данную подпапку иконку "warning.png" из архива с модом. Вы можете заменить эту иконку на любую другую с тем с же именем, размерами 32 на 32 пикселя и в формате .png. Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  4. [Мод] Эффект полета для крыльев Данная модификация для клиента позволяет добавлять к любым Крыльям (предметы с типом 44) эффект полета, аналогичный эффекту Крыльев перерождения. Информация о модификации Название: pkodev.mod.wings; Версия: 1.1; Автор: V3ct0r; Тип: для клиента (Game.exe); Поддерживаемые исполняемые .exe файлы: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4 и GAME_13X_5. Установка модификации 1. Установите систему загрузки модов pkodev.mod.loader, если она не была установлена ранее. 2. Поместите файл DLL-библиотеки мода pkodev.mod.wings.client.13x_{ID}.dll для Вашей версии Game.exe и файл настроек мода pkodev.mod.wings.cfg в папку mods\pkodev.mod.wings игрового клиента. 3. Откройте файл настроек мода pkodev.mod.wings.cfg и запишите в него список ID крыльев, к которым необходимо применить эффект полета. Каждый ID записывается с новой строки, например: 935 936 937 В результате эффект полета будет применен к Эльфийским крыльям, Крыльям бабочки и Ангельским крыльям соответственно. 4. Установка модификации завершена! Запустите игровой клиент и убедитесь, что модификация работает. Скачать 1) Бинарные файлы модификации для клиента (.dll); 2) Репозиторий на GitHub с исходным кодом модификации для Visual Studio 2022 Community на языке C++. 3) Система загрузки модов pkodev.mod.loader. Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  5. [Гайд] Пример создания модификации: Вывод дополнительных характеристик персонажа Привет! В данной статье я расскажу как создать мод для клиента игры, который позволит выводить дополнительные характеристики персонажа на форме "Персонаж" (см. скриншот выше). Благодарю участника нашего форума @Graf за идею мода и гайда: Вам понадобится 1) Game.exe для которого будет создаваться модификация; 2) OllyDbg v1.10; 3) IDA Pro (необязательно, можно пользоваться только OllyDbg); 4) Visual Studio 2022 Community Edition и библиотека MS Detours; 5) Исходный код клиента; 6) Знание основ программирования на C/C++ и ассемблере. Навыки написания DLL-библиотек. Опыт работы с вышеуказанными программами. Создание мода В качестве примера реализуем вывод трех дополнительных характеристик: удача (ATTR_LUK ), шанс критического удара (ATTR_CRT ) и шанс дропа (ATTR_MF). 1) Поместим на форму с характеристиками (frmState) персонажа 3 текстовые метки: удача (labLukShow), шанс критического удара (labCriticalShow), шанс дропа (labMfShow). preperty.clu: -- Lucky labLukShow = UI_CreateCompent( frmState, LABELEX_TYPE, "labLukShow", 26, 8, 16, 370 ) UI_SetCaption( labLukShow, "L" ) UI_SetTextColor( labLukShow, COLOR_PURPLE ) UI_SetLabelExFont( labLukShow, DEFAULT_FONT, TRUE, COLOR_WHITE ) -- Critical chance labCriticalShow = UI_CreateCompent( frmState, LABELEX_TYPE, "labCriticalShow", 26, 8, 80, 370 ) UI_SetCaption( labCriticalShow, "C" ) UI_SetTextColor( labCriticalShow, COLOR_PURPLE ) UI_SetLabelExFont( labCriticalShow, DEFAULT_FONT, TRUE, COLOR_WHITE ) -- Drop chance labMfShow = UI_CreateCompent( frmState, LABELEX_TYPE, "labMfShow", 26, 8, 144, 370 ) UI_SetCaption( labMfShow, "M" ) UI_SetTextColor( labMfShow, COLOR_PURPLE ) UI_SetLabelExFont( labMfShow, DEFAULT_FONT, TRUE, COLOR_WHITE ) 2) Изучив исходный код клиента, находим функцию void CStateMgr::RefreshStateFrm(), в которой происходит обновление меток с характеристиками персонажа. Далее нам будет необходимо перехватывать её вызов и обновлять наши новые метки. Так же есть функция void CStateMgr::_evtMainShow(CGuiData *pSender), она вызывается при открытии формы характеристик персонажа и её можно использовать для получения указателей на объекты текстовых меток в памяти игры. Параметр pSender это указатель на форму frmState, объекта класса CCompent, у которого есть метод CCompent* CForm::Find(const char* str), этот метод понадобится для получения указателей на метки по их именам, указанных в lua скриптах GUI клиента. Чтобы установить текст меток, нам будет нужен метод void CLabel::SetCaption(const char * str). Наконец, для доступа к параметрам нашего персонажа, нам будет нужен указатель на персонажа, которым управляет игрок. 3) Для поиска адресов в Game.exe будем использовать программу IDA Pro. void CStateMgr::RefreshStateFrm(). Данный метод можно найти по какой-либо уникальной строке, например, "%4.2f%%". Ищем эту строку в IDA Pro и находим её использование только в одной функции по адресу 0x0047F190 - это и есть искомый метод. void CStateMgr::_evtMainShow(CGuiData *pSender). Это обработчик события открытия формы характеристик персонажа, значит он где-то "вешается" на объект в формы. Проверим в исходном коде клиента игры в методе инициализации формы frmState: bool CStateMgr::Init() { CFormMgr &mgr = CFormMgr::s_Mgr; frmState = _FindForm("frmState"); if( !frmState ) return false; frmState->evtShow = _evtMainShow; labStateName = dynamic_cast<CLabelEx*>(frmState->Find("labStateName")); if( !labStateName ) return Error( g_oLangRec.GetString(45), frmState->GetName(), "labStateName" ); labStateName->SetIsCenter(true); Теперь необходимо найти этот код в Game.exe. Для этого выполняем поиск по строке "frmState". В этот раз нам повезло меньше, найдено 3 использования такой строки: Смотрим первое использование: Рядом так же видно использование строк "btnState", "btnSkill", и "frmSkill". Но в искомом коде таких строк рядом нет. Очевидно, этот адрес нам не подходит. Смотрим второе использование: Строка находится в самом начале функции и рядом есть строка "labStateName". Судя по всему, это наш искомый метод инициализации. Здесь видно, как загружается указатель на форму frmState в регистр EAX, а далее по смещению 0x78, относительно адреса в регистре EAX, помещается какая-то функция. Наверняка, это и есть метод void CStateMgr::_evtMainShow(CGuiData *pSender). Итак, адрес метода void CStateMgr::_evtMainShow(CGuiData *pSender) - 0x0047F7F0. CCompent* CForm::Find(const char* str). Этот метод скорее всего находится в функции инициализации формы, такую мы уже видели: bool CStateMgr::Init(). Просмотрев исходный код, видим следующее: labStateName = dynamic_cast<CLabelEx*>(frmState->Find("labStateName")); if( !labStateName ) return Error( g_oLangRec.GetString(45), frmState->GetName(), "labStateName" ); labStateName->SetIsCenter(true); Это код получения указателя на метку labStateName, нам предстоит сделать то же самое с нашими новыми метками. Идем по адресу 0x0047F9F0 метода bool CStateMgr::Init() в IDA Pro и видим следующий код: .text:0047FA25 push offset aLabstatename ; "labStateName" .text:0047FA2A call dword ptr [eax+48h] Похоже на вызов метода CCompent* CForm::Find(const char* str) для получения указателя на метку labStateName, но его адрес не указан явно. Это говорит о том, что метод виртуальный. Проверим это в исходном коде: virtual CCompent* Find( const char* str ) { return _frmOwn->Find( str ); } Метод действительно является виртуальным. Как же получить его адрес? Как вариант, открыть Game.exe в отладчике, поставить точку останова на адрес 0x0047FA2A и проверить адрес вызываемой функции, но есть проблема - мы не можем запустить клиент напрямую через отладчик, а после запуска эта функция уже не вызывается. Есть второй вариант: поставить точку останова на метод void CStateMgr::_evtMainShow(CGuiData *pSender) (его адрес мы уже знаем), получить адрес формы frmState через параметр pSender, прибавить к нему смещение 0x48 и посмотреть адрес искомого метода. Идем в игру и открываем форму характеристик персонажа: На стеке смотрим адрес параметра pSender - 0x109D5568. По этому адресу находится адрес объекта CStateMgr - 0x006089B4. Прибавляем к этому адресу смещение 0x48, получаем адрес 0x006089FC и переходим по данному адресу в окне отображения памяти процесса: Итак, адрес метода CCompent* CForm::Find(const char* str) равен 0x004941F0. void CLabel::SetCaption(const char * str), в исходном коде вызов этого метода встретится в методе void CStateMgr::RefreshStateFrm(), например: if ( labStateEXP) { if (max!=0) sprintf( pszCha , "%4.2f%%" , num*100.0f/max ); else sprintf( pszCha , "0.00%"); labStateEXP->SetCaption( pszCha ); } Снова ищем строку "%4.2f%%" в IDA Pro и переходим по адресу её использования: Очевидно, что вызов неизвестной функции после двух вызовов библиотечной функции sprintf устанавливает текст метки labStateEXP. Функция является виртуальной, поэтому вновь открываем отладчик, ставим точку останова по адресу 0x0047F2A1 и открываем форму характеристик персонажа в игре: Отладчик подсказывает нам, что по адресу [EDX+3C] находится адрес метода void CLabel::SetCaption(const char * str) - 0x0042B1A0. Указатель на персонажа игрока можно посмотреть в том же методе void CStateMgr::RefreshStateFrm(): CForm * f = g_stUIState.frmState; if( !f->GetIsShow() ) return; CCharacter* pCha = g_stUIBoat.GetHuman(); if( !pCha ) return; SGameAttr* pCChaAttr = pCha->getGameAttr(); if (!pCChaAttr ) return; Переходим на начало метода в IDA Pro: Анализ ассемблерного листинга показывает, что указатель на персонажа игрока находится по адресу 0x00668B6C. Мы нашли все необходимые адреса: 0x0047F7F0 void CStateMgr::_evtMainShow(CGuiData *pSender) 0x0047F190 void CStateMgr::RefreshStateFrm() 0x004941F0 CCompent* CForm::Find(const char* str) 0x0042B1A0 void CLabel::SetCaption(const char * str) 0x00668B6C CCharacter* CBoatMgr::_pHuman 4) Все готово для создания DLL. В качестве языка программирования будем использовать C++. Создаем новый проект Dynamic-Link Library (DLL) в Visual Studio 2022 Community. Поскольку мы будем перехватывать вызовы void CStateMgr::_evtMainShow(CGuiData *pSender) и void CStateMgr::RefreshStateFrm(), то нам понадобится библиотека MS Detours, подключаем её к проекту. Записываем код DLL: #include <windows.h> #include <detours.h> #include <cstdio> namespace pkodev { // Addresses of imported functions from Game.exe namespace address { // void CStateMgr::_evtMainShow(CGuiData *pSender) const unsigned int CStateMgr___evtMainShow = 0x0047F7F0; // void CStateMgr::RefreshStateFrm() const unsigned int CStateMgr__RefreshStateFrm = 0x0047F190; // CCompent* CForm::Find( const char* str ) const unsigned int CForm__Find = 0x004941F0; // void CLabel::SetCaption( const char * str ) const unsigned int CLabel__SetCaption = 0x0042B1A0; // CCharacter* CBoatMgr::_pHuman const unsigned int CBoatMgr___pHuman = 0x00668B6C; } namespace pointer { // void CStateMgr::_evtMainShow(CGuiData *pSender) typedef void(__cdecl* CStateMgr___evtMainShow__Ptr)(void*); CStateMgr___evtMainShow__Ptr CStateMgr___evtMainShow = (CStateMgr___evtMainShow__Ptr)(void*)(address::CStateMgr___evtMainShow); // void CStateMgr::RefreshStateFrm() typedef void(__cdecl* CStateMgr__RefreshStateFrm__Ptr)(void*); CStateMgr__RefreshStateFrm__Ptr CStateMgr__RefreshStateFrm = (CStateMgr__RefreshStateFrm__Ptr)(void*)(address::CStateMgr__RefreshStateFrm); // CCompent* CForm::Find( const char* str ) typedef void* (__thiscall* CForm__Find__Ptr)(void*, const char*); CForm__Find__Ptr CForm__Find = (CForm__Find__Ptr)(void*)(address::CForm__Find); // void CLabel::SetCaption( const char * str ) typedef void (__thiscall* CLabel__SetCaption__Ptr)(void*, const char*); CLabel__SetCaption__Ptr CLabel__SetCaption = (CLabel__SetCaption__Ptr)(void*)(address::CLabel__SetCaption); } namespace hook { // void CStateMgr::_evtMainShow(CGuiData *pSender) void __cdecl CStateMgr___evtMainShow(void* pSender); // void CStateMgr::RefreshStateFrm() void __fastcall CStateMgr__RefreshStateFrm(void* This, void* NotUsed); } // Label "labLukShow" void* labLukShow = nullptr; // Label "labCriticalShow" void* labCriticalShow = nullptr; // Label "labMfShow" void* labMfShow = nullptr; } // Entry point BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { // DLL attached to the proccess case DLL_PROCESS_ATTACH: // Enable hooks DetourRestoreAfterWith(); DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourAttach(&(PVOID&)pkodev::pointer::CStateMgr___evtMainShow, pkodev::hook::CStateMgr___evtMainShow); DetourAttach(&(PVOID&)pkodev::pointer::CStateMgr__RefreshStateFrm, pkodev::hook::CStateMgr__RefreshStateFrm); DetourTransactionCommit(); break; // DLL detached from the proccess case DLL_PROCESS_DETACH: // Disable hooks DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach(&(PVOID&)pkodev::pointer::CStateMgr___evtMainShow, pkodev::hook::CStateMgr___evtMainShow); DetourDetach(&(PVOID&)pkodev::pointer::CStateMgr__RefreshStateFrm, pkodev::hook::CStateMgr__RefreshStateFrm); DetourTransactionCommit(); break; } return TRUE; } // void CStateMgr::_evtMainShow(CGuiData *pSender) void __cdecl pkodev::hook::CStateMgr___evtMainShow(void* pSender) { // Get pointers to the labels pkodev::labLukShow = pkodev::pointer::CForm__Find(pSender, "labLukShow"); pkodev::labCriticalShow = pkodev::pointer::CForm__Find(pSender, "labCriticalShow"); pkodev::labMfShow = pkodev::pointer::CForm__Find(pSender, "labMfShow"); // Call original CStateMgr___evtMainShow() function pkodev::pointer::CStateMgr___evtMainShow(pSender); } // void CStateMgr::RefreshStateFrm() void __fastcall pkodev::hook::CStateMgr__RefreshStateFrm(void* This, void* NotUsed) { // Call original function CStateMgr::RefreshStateFrm() pkodev::pointer::CStateMgr__RefreshStateFrm(This); // Get pointer to the main character // CCharacter* pCha = g_stUIBoat.GetHuman(); void* pCha = reinterpret_cast<void*>( *reinterpret_cast<unsigned int*>(pkodev::address::CBoatMgr___pHuman) ); if (pCha == nullptr) { // Exit from the hook return; } // Define ATTR constants const unsigned int ATTR_LUK = 30; const unsigned int ATTR_MF = 38; const unsigned int ATTR_CRT = 39; // Get offset to the attribute auto attr_get = [&pCha](unsigned int id) -> unsigned int { return *reinterpret_cast<unsigned int*>( (0xD0 + 4 * id + reinterpret_cast<unsigned int>(pCha)) ); }; // Buffer for labels captions char buf[128]{ 0x00 }; // Show character's ATTR_LUK if (pkodev::labLukShow != nullptr) { sprintf_s(buf, sizeof(buf), "LUK: %d", attr_get(ATTR_LUK)); pkodev::pointer::CLabel__SetCaption(pkodev::labLukShow, buf); } // Show character's ATTR_CRT if (pkodev::labCriticalShow != nullptr) { sprintf_s(buf, sizeof(buf), "CRT: %d", attr_get(ATTR_CRT)); pkodev::pointer::CLabel__SetCaption(pkodev::labCriticalShow, buf); } // Show character's ATTR_MF if (pkodev::labMfShow != nullptr) { sprintf_s(buf, sizeof(buf), "MF: %d", attr_get(ATTR_MF)); pkodev::pointer::CLabel__SetCaption(pkodev::labMfShow, buf); } } 1. В начале определяем найденные нами в пункте 3 адреса методов, функций и объектов; 2. Далее определяем указатели на необходимые функции и методы; 3. Затем определяем функции-перехватчики и глобальные переменные под указатели на текстовые метки; 4. В функции DllMain() записываем код для установки и снятия перехватчиков с помощью библиотеки Detours; 5. Реализуем перехватчик pkodev::hook::CStateMgr___evtMainShow(). В этой функции получаем указатели на объекты новых меток labLukShow, labCriticalShow и labMfShow с помощью метода CCompent* CForm::Find(const char* str); 6. Реализуем перехватчик pkodev::hook::CStateMgr__RefreshStateFrm(). Сначала получаем указатель на персонажа, которым управляет игрок. Далее записываем константы, обозначающие ID требуемых характеристик. Теперь стоит задача получения этих характеристик из памяти игры. В исходном коде клиента для этого используется указатель на объект типа SGameAttr, связанный с персонажем: SGameAttr* pCChaAttr = pCha->getGameAttr(); if (!pCChaAttr ) return; Анализ ассемблерного листинга показывает, что этот указатель находится по смещению 0xD0 относительно указателя на персонажа: .text:0047F1D2 mov ebx, dword_668B6C . . . .text:0047F1E4 add ebx, 0D0h Посмотрим что представляет собой объект SGameAttr в исходном коде: struct SGameAttr { long lAttr[MAX_ATTR_CLIENT]; // MAX_ATTR_CLIENT = 74 . . . }; Это структура, которая содержит только одно поле - массив из 74 целых чисел по 4 байта каждое, индексы элементов которого соответствует ID характеристик персонажа (см. файл AttrType.lua из скриптов GameServer). Из курса программирования мы знаем, что все элементы массива хранятся в памяти друг за другом. Значит, чтобы получить адрес характеристики персонажа с определенным ID, мы можем воспользоваться следующей формулой: 0xD0 + 4 * <ID> + <Адрес персонажа в памяти> Осталось самое простое: вывести требуемые характеристики персонажа в новые текстовые метки с помощью метода void CLabel::SetCaption(const char * str). 5) Компилируем проект и присоединяем DLL библиотеку к процессу игры. В результате мы получим следующее: После успешного тестирования, процесс создания модификации клиента завершен. Отмечу, что в примере я использовал GAME_13X_2, в Вашем Game.exe найденные адреса могут отличаться. Если у Вас возникли вопросы, то смело задавайте их в этой теме. Ниже прикладываю проект DLL-библиотеки и DLL-библиотеку мода. Скачать Архив с проектом DLL библиотеки модификации для Visual Studio 2022 Community и DLL библиотекой модификации из примера (286 Кб) Также на основе данной статьи был создан полноценный мод для вывода характеристик персонажа, который не ограничивается тремя характеристиками:
  6. [Новость] Исходные коды модов были перенесены на GitHub Исходные коды всех модов за моим авторством из раздела "Моды для клиента и сервера (PKOdev.NET mod loader)" теперь можно найти в соответствующих репозиториях на GitHub. Там же можно скачать последние бинарные релизы модов в виде .dll-библиотек, а также все необходимые ресурсы для их работы: .cfg-файлы настроек, скрипты, текстуры и другие файлы. Ранее моды хранились в облачном хранилище Google Диск, что не очень удобно для подобного рода проектов.
  7. Система "оффлайн" ларьков Одним из игровых аспектов игры является торговля между персонажами посредством особых ларьков (лавок), которые могут открывать игроки изучив специальное умение. Игрок выставляет свои предметы за определенную цену, а остальные игроки могут покупать их. Однако, для такой торговли игрок должен находиться в игре, то есть быть подключенным к серверу, что вынуждает его оставлять свой компьютер постоянно включенным и держать игровой клиент свернутым. Это очень неудобно, поэтому была придумана система "оффлайн" ларьков, которая позволяет игрокам отключаться от сервера и при этом оставаться торговать в ларьках. Возможно несколько способов реализации такой системы, но наиболее распространена система "оффлайн" ларьков через прокси-сервер: 1) Игровой клиент (Game.exe) подключается к прокси-серверу; 2) Прокси-сервер, в свою очередь, открывает соединение с GateServer.exe; 3) Далее, прокси-сервер передает все пакеты между Game.exe и GateServer.exe, при этом анализируя их; 4) Когда игрок открывает торговый ларек, прокси-сервер фиксирует это (GateServer.exe отправил Game.exe пакет успешного открытия ларька); 5) Если игрок отключается от сервера будучи в торговом ларьке, то прокси-сервер закрывает соединение с Game.exe, но при этом сохраняет соединение с GateServer.exe и начинает имитировать Game.exe. Таким образом, GateServer.exe не подозревает о факте отключения Game.exe и персонаж игрока остается торговать в ларьке на сервере. Game.exe | Game.exe | <---------> pkodev.stallserver.exe <---------> GateServer.exe Game.exe | В данной теме обсуждается разработка такого прокси-сервера - PKOdev.NET Stall Server. Внимание! Сервер находится на стадии разработки и не предназначен для применения в "продакшене". Это означает что приложение полностью не протестировано и может содержать ошибки, баги и критические уязвимости. Возможности 1) Система оффлайн ларьков; 2) Ограничение количества оффлайн ларьков с одного IP-адреса; 3) Ограничение времени торговли в оффлайн-ларьке; 4) Автоматическое отключение аккаунта, торгующего в оффлайн ларьке, при подключении игрока с использованием того же аккаунта; 5) Оповещение игроков в чат о том, что персонаж находится в оффлайн ларьке и в данный момент не в сети (при обращении в ЛС); 6) Исправление SQL-инъекций в пакетах авторизации и создания (смены) секретного кода; 7) Установка максимального числа подключений к серверу с одного IP-адреса и интервала между подключениями. To-do: 1) Перевод комментариев в файлах Server.h and Server.cpp на английский язык; 2) Исправление падения сервера при обработке пакетов от клиента; 3) Исправление падения сервера при запуске, когда локальный порт занят; 4) Исправление зависания моста при блокировке пакета при включенном шифровании (спасибо @small666 за обнаруженный баг); 5) Синхронизация между потоками при обработке пакетов; 6) Закрытие оффлайн ларька, если все предметы проданы; 7) Модификация GateServer.exe для определения IP-адресов клиентов, которые находятся за сервером оффлайн ларьков. В данный момент в логах и базе данных IP-адреса всех клиентов будут записываться как 127.0.0.1 (если GateServer.exe и pkodev.stallserver.exe запущены на одной машине). 8 ) Совместимость с исходным кодом Corsairs Online (CO). Сборка и запуск 1) Выполните клонирование репозитория с проектом сервера к себе на диск (ссылка будет ниже); 2) Откройте файл решения pkodev.stallserver.sln в Visual Studio 2022 Community; 3) Соберите решение. Исполняемые файлы сервера появятся в папке bin; 4) Поместите конфигурационный файл pkodev.stallserver.cfg из папки cfg в одну директорию с исполняемым файлом сервера pkodev.stallserver.exe; 5) Настройте конфигурационный файл pkodev.stallserver.cfg по своему усмотрению (файл хорошо прокомментирован); 6) Для подключения игрового клиента (Game.exe) к серверу оффлайн ларьков нужно установить мод pkodev.mod.stallserver; 7) Для подключения сервера оффлайн ларьков к GateServer.exe, последний должен быть без каких-либо модификаций ("чистым"), например, из сборки PKO 1.38; 8 ) Запустите исполняемый файл сервера оффлайн ларьков pkodev.stallserver.exe. Репозиторий Git https://github.com/V3ct0r1024/pkodev.stallserver
  8. [Мод] Система контрактов Данная система представляет собой квест типа: "Охота на монстров", целью которого является добыча персонажем игрока некоторого количества определенных монстров. Игроку выдается специальный предмет - "Контракт", в котором указано на какого монстра и в каком количестве игроку предстоит охотиться. По мере охоты, в контракте обновляется текущий прогресс игрока. После добычи необходимого числа монстров контракт считается выполненным, и игрок может получить награду, использовав предмет "Контракта". Система состоит из двух частей: модификация pkodev.mod.loader для игрового клиента (Game.exe) и Lua-скрипт для игрового сервера (GameServer.exe). Модификация клиента необходима для визуализации заданных характеристик предмета в поле-подсказке для предмета "Контракта" при наведении на него курсора мыши. ID монстра-цели, количество добытых монстров и количество монстров, необходимых для завершения "Контракта", записываются в следующие характеристики предмета: ITEMATTR_VAL_STR, ITEMATTR_VAL_DEX и ITEMATTR_VAL_AGI соответственно. Задачей мода является отображение этих характеристик в понятном для игрока виде. Например, если ITEMATTR_VAL_STR = 103, ITEMATTR_VAL_DEX = 5, а ITEMATTR_VAL_AGI = 10, то игрок при наведении мыши на "Контракт" увидит следующую информацию: Охота: 'Лесной дух' x 10 Добыто: 5 / 10 Lua-скрипт для игрового сервера является ядром Системы контрактов, в котором содержатся настройки системы и логика её работы. Например, при добыче очередного монстра, скрипт будет искать в инвентаре персонажа подходящий активный "Контракт", и если такой предмет будет найден, то Система обновит его состояние. Важной настройкой скрипта является функция, которая необходима для выдачи награды после успешного завершения "Контракта" игроком. Некоторые особенности системы: 1) "Контракт" можно подобрать, выбросить, передать другому игроку, положить в банк или продать; 2) Если у игрока в инвентаре несколько "Контрактов" на охоту на одного и того же монстра, то при добыче данного монстра "Контракт" выбирается случайным образом; 3) Для получения награды после завершения "Контракта", игрок должен использовать предмет "Контракта", например, с помощью двойного клика мыши по нему. Если "Контракт" еще не завершен, то игрок увидит соответствующее сообщение в систему; 4) Состав и количество награды определяются администратором в специальной функции скрипта системы; 5) ID и тип предмета для "Контракта" должны быть уникальными и задаются администратором в настройках Системы. Тип предмета по умолчанию равен 99, ID предмета по умолчанию не определен. Информация о модификации Название: pkodev.mod.contract; Версия: 1.1; Автор: V3ct0r; Тип: для игрового клиента (Game.exe); Поддерживаемые исполняемые файлы (.exe): GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4 и GAME_13X_5. Установка Системы контрактов Игровой сервер 1. Добавьте в файл GameServer\resource\ItemInfo.txt предмет для "Контракта". Для этого выберите подходящий ID (XXXX) и тип предмета (по умолчанию 99): XXXX Контракт n0184 10130005 0 0 0 0 0 00 99 0 0 0 0 0 1 1 1 1 1 1 0 -1 0 -1 0 0 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0 10,10 0,0 0 0 0 0 0 0 0 0 0 ItemUse_PKOdevContract 0 0 0 0 0 0 После завершения Вы получите награду! где XXXX - любой незанятый ID. 2. Поместите Lua-скрипт pkodev.contract.lua в директорию GameServer\resource\script\calculate\mods (при необходимости создайте каталог mods). Примечание: Скрипт pkodev.contract.lua отправляет игрокам различные сообщения на английском языке. Вероятно, Вам будет необходимо перевести эти сообщения на русский язык. 3. Откройте файл pkodev.contract.lua и настройте его следующим образом: 3.1 В переменную item_id запишите ID предмета из ItemInfo.txt (XXXX): item_id = XXXX, 3.2 В функции CompletionCallback() запишите код, который будет выдавать игроку награду после выполнения "Контракта". По умолчанию функция выдает игроку 1,000 золотых монет, случайный предмет (Очищающий самоцвет x 1, или Самоцвет ярости x 2, или Кекс x 60, или Фея удачи x 1) и запускает фейерверк: CompletionCallback = function(role, item) -- Выдать 1,000 золотых монет AddMoney (role, 0, 1000) -- Список предметов local arr = { {id = 885, count = 1 }, -- Очищающий самоцвет x 1 {id = 863, count = 2 }, -- Самоцвет ярости x 2 {id = 1849, count = 60}, -- Кекс x 60 {id = 231, count = 1 } -- Фея удачи x 1 } -- Выдать случайный предмет local idx = math.random(1, table.getn(arr)) GiveItem(role, 0, arr[idx].id , arr[idx].count, 4) -- Запустить фейерверк PlayEffect(role, 361) end 3.3 Откройте файл GameServer\resource\script\calculate\SkillEffect.lua и в самом начале запишите строку: dofile(GetResPath("script\\calculate\\mods\\pkodev.contract.lua")) 4. Система контрактов была успешно установлена на Ваш сервер. Поздравляю! Также обратите внимание на реализацию скрипта Системы контрактов от @Angelix. Она более гибкая и продвинутая по сравнению с той, что предлагается выше. Описание скрипта и инструкцию по установке можно найти в соответствующей теме: Игровой клиент 1. Добавьте в файл Клиент\scripts\table\ItemInfo.txt предмет для "Контракта" (см. выше "Установка Системы контрактов" > "Игровой сервер" > пункт 1. Скомпилируйте ItemInfo.txt. 2. Добавьте в файл Клиент\scripts\table\StringSet.txt следующие строки, которые увидит игрок при наведении курсора мыши на предмет "Контракта": [1000] "(Выполнен)" [1001] "(Выполняется)" [1002] "Охота: '{0}' x {1}" [1003] "Добыто: {0} / {1}" Примечание 1: Если ID строк 1000 - 1003 уже заняты, то вместо них запишите свободные ID. Примечание 2: После добавления данных строк в файл StringSet.txt, удалите файл StringSet.bin, если он существует, иначе изменения не применятся. Примечание 3: В строке 1002 маркер {0} обозначает название монстра, а {1} - количество монстров, которое необходимо добыть. В строке 1003 маркер {0} обозначает число уже добытых монстров, маркер {1} по значению аналогичен строке 1002. 3. Установите систему загрузки модов pkodev.mod.loader, если она не была установлена ранее. 4. Поместите файл DLL-библиотеки мода pkodev.mod.contract.client.13x_{ID}.dll для Вашей версии Game.exe и файл настроек мода pkodev.mod.contract.json в папку mods\pkodev.mod.contract игрового клиента. 5. Откройте файл настроек мода pkodev.mod.contract.json и запишите в него следующие параметры по Вашему усмотрению: 1. itemType - тип предмета "Контракта", указанный в ItemInfo.txt. По умолчанию 99. 2. colorCompleted - Цвет метки "(Выполнен)" во всплывающей подсказке предмета "Контракта" в формате 0xAARRGGBB. По умолчанию 0xFF00FF00 (Зеленый). 3. colorActive - Цвет метки "(Выполняется)" во всплывающей подсказке предмета "Контракта" в формате 0xAARRGGBB. По умолчанию 0xFFFFA500 (Оранжевый). 4. STRING_001 - ID строки для метки "(Выполнен)" из файла StringSet.txt. По умолчанию 1000. 5. STRING_002 - ID строки для метки "(Выполняется)" из файла StringSet.txt. По умолчанию 1001. 6. STRING_003 - ID строки для метки "Охота: '{0}' x {1}" из файла StringSet.txt. По умолчанию 1002. 7. STRING_004 - ID строки для метки "Добыто: {0} / {1}" из файла StringSet.txt. По умолчанию 1003. Примечание: Данный файл можно не редактировать, если Вы использовали значения по умолчанию в файлах ItemInfo.txt и StringSet.txt. 6. Настройка клиента завершена! Создание "Контрактов" и их выдача игрокам "Контракты" создаются с помощью функции contract.create(), которая в качестве своих аргументов принимает дескриптор персонажа, которому выдается контракт, ID монстра, на которого игроку предстоит охотиться, и количество монстров, которое игрок должен добыть. В результате функция возвращает кортеж из трех элементов: флаг успеха, дескриптор созданного предмета и номер ячейки в инвентаре персонажа. Синтаксис: local <Результат (LUA_TRUE или LUA_FALSE)>, <Дескриптор предмета>, <Ячейка в инвентаре> = contract.create(<Дескриптор персонажа>, <ID монстра>, <Число монстров>) Пример: local ret, item, pos = contract.create(role, 103, 7) Синтаксис: local <Результат LUA_TRUE|LUA_FALSE>, <Дескриптор предмета>, <Ячейка предмета> = contract.create(<Дескриптор персонажа>, <ID монстра>, <Число монстров>) В результате будет создан "Контракт" на охоту на семерых Лесных духов, который появится в инвентаре персонажа role. В случае ошибки функция вернет в переменную ret значение LUA_FALSE и запишет лог в файл pkodev.contract.txt. Примечание: Выдачу "Контрактов" можно организовать, например, через специального NPC или другой предмет. Полезные ссылки 1) Lua-скрипт системы для игрового сервера; 2) ItemInfo.txt с примером предмета "Контракта"; 3) Строки для файла StringSet.txt; 4) Бинарные файлы модификации для клиента (.dll); 5) Файл с настройками модификации для клиента; 6) Репозиторий на GitHub с исходным кодом модификации для Visual Studio 2022 Community на языке C++; 7) Система загрузки модов pkodev.mod.loader. Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  9. [Мод] Отображение координат под NPC Данная модификация отображает координаты под неигровыми персонажами (NPC) и выделяет названия NPC желтым цветом. Информация о модификации Название: pkodev.mod.npcpos; Версия: 1.1; Автор: V3ct0r; Тип: для клиента (Game.exe); Поддерживаемые исполняемые .exe файлы: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4 и GAME_13X_5. Установка модификации 1. Установите систему загрузки модов pkodev.mod.loader, если она не была установлена ранее. 2. Поместите файл DLL-библиотеки мода pkodev.mod.npcpos.client.13x_{ID}.dll для Вашей версии Game.exe в папку mods игрового клиента. 3. Модификация установлена! Настройка модификации (необязательно) При необходимости формат вывода координат редактируется в файле "dllmain.cpp" в функции "void __fastcall hook::CHeadSay__Render(void* This, void*, structure::D3DXVECTOR3& Pos)": const std::string text = std::format("({0}, {1})", cha->GetX(), cha->GetY()); Цвет, которым выделяются названия NPC, изменяется в той же функции: utils::set<unsigned int, 0x38>(This, 0xFFFFFF00); // Set NPC color name (Yellow) Примечание: После произведенных изменений необходимо пересобрать модификацию. Скачать 1) Бинарные файлы модификации для клиента (.dll); 2) Репозиторий на GitHub с исходным кодом модификации для Visual Studio 2022 Community на языке C++; 3) Система загрузки модов pkodev.mod.loader. Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  10. [Мод] Улучшение характеристик персонажа зажатием левой кнопки мыши Модификация добавляет в клиент игры возможность автоматической прокачки характеристик персонажа путем зажатия левой кнопки мыши на кнопке "+" рядом с соответствующей характеристикой на форме "Персонаж". Мод по мотивам темы от @Graf'а: Информация о модификации Название: pkodev.mod.statsclicker; Версия: 1.0; Автор: V3ct0r; Тип: для клиента (Game.exe); Поддерживаемые исполняемые .exe файлы: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4 и GAME_13X_5. Установка модификации 1. Установите систему загрузки модов pkodev.mod.loader, если она не была установлена ранее. 2. Поместите файл DLL-библиотеки мода pkodev.mod.statsclicker.client.13x_{ID}.dll для Вашей версии Game.exe в папку mods игрового клиента. 3. Модификация установлена! Скачать 1) Бинарные файлы модификации для клиента (.dll); 2) Репозиторий на GitHub с исходным кодом модификации для Visual Studio 2022 Community на языке C++; 3) Система загрузки модов pkodev.mod.loader. Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  11. [Мод] Панель побежденных персонажей Мод добавляет в игру панель побежденных персонажей, по аналогии с FPS-играми по типу Counter-Strike, Call of Duty, Battlefield и других. Некоторые особенности мода: 1) Панель представляет собой список из записей вида: [Имя персонажа-победителя] [Иконка умения или оружия, которым нанесено поражение] [Имя побежденного персонажа] (см. скриншот выше); 2) Имена персонажей-победителя и побежденного выделяются цветом в зависимости от степени дружественности по отношению к персонажу игрока: зеленый цвет - союзник, красный цвет - враг; 3) Панель можно кастомизировать. Процесс кастомизиации будет рассмотрен далее. Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.defeated; Версия: 1.0; Автор: V3ct0r; Тип: для клиента (Game.exe) и сервера (GameServer.exe); Поддерживаемые исполняемые .exe файлы: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4, GAME_13X_5, GAMESERVER_136 и GAMESERVER_138. Установка 1. Сервер 1.1 Поместите файл DLL-библиотеки мода "pkodev.mod.defeated.server.<VERSION>.dll" для Вашей версии GameServer.exe и файл настроек "pkodev.mod.defeated.json" (v1.0.0-server) в папку "GameServer\mods\pkodev.mod.defeated"; 1.2 Откройте файл настроек мода "GameServer\mods\pkodev.mod.defeated\pkodev.mod.defeated.json" в любом текстовом редакторе и запишите в него список карт (данжей), на которых будет действовать мод: { "maps" : [ "garner", "magicsea", "darkblue" ] } 2. Клиент 2.1 Поместите файл DLL-библиотеки мода "pkodev.mod.defeated.client.13x_<ID>.dll" для Вашей версии Game.exe и файл настроек "pkodev.mod.defeated.json" (v1.0.0-client) в папку "Клиент\mods\pkodev.mod.defeated" игрового клиента; 2.2 Откройте файл настроек мода "Клиент\mods\pkodev.mod.defeated\pkodev.mod.defeated.json" в любом текстовом редакторе и запишите в него требуемые параметры: { "debug":false, "hideTime":5000, "maxItems":5, "itemStep":24, "pos":{ "x":460, "y":8 }, "align": { "x":"right", "y":"top" } } debug - режим отладки. true - включен, false - выключен; hideTime - время в миллисекундах, после которого очередная запись на панели будет скрыта; maxItem - максимальное число записей на панели; itemStep - вертикальный шаг между записями в пикселях; pos - координаты (X, Y) панели; align - параметр задает относительность координат (X, Y) панели. Для X: left - координата будет отсчитываться относительного левого края окна клиента, right - относительно правого края. Для Y: top - координата будет отсчитываться относительно верхнего края окна клиента, bottom - относительно нижнего края. Для настройки положения панели удобно включить режим отладки ("debug":true). В таком случае на заданных координатах (X, Y) появится панель в рамке, отображающей максимальные размеры панели: Скачать 1) Бинарные файлы мода (.dll) и файл настроек (.json) для сервера (GameServer.exe); 2) Бинарные файлы мода (.dll) и файл настроек (.json) для клиента (Game.exe); 3) Исходный код мода для Visual Studio 2022 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  12. [Мод] Функция GMNotice() Мод добавляет в LUA-скрипты GameServer.exe функцию GMNotice(), которая позволяет отправлять сообщения игрокам в канал GM-чата (ALT + P): GMNotice("Hello PKOdev.NET! This is a GM message.") Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader) версии не ниже 1.1. Информация о моде Название: pkodev.mod.gmnotice; Версия: 1.0; Автор: V3ct0r; Тип: для сервера (GameServer.exe и GroupServer.exe); Поддерживаемые исполняемые .exe файлы: GAMESERVER_136, GAMESERVER_138 и GROUPSERVER_138. Установка 1) Поместите файл DLL-библиотеки мода "pkodev.mod.gmnotice.server.<VERSION>.dll" для Вашей версии GameServer.exe в папку "GameServer\mods"; 2) Поместите файл DLL-библиотеки мода "pkodev.mod.gmnotice.group.<VERSION>.dll" для Вашей версии GroupServer.exe в папку "GroupServer\mods". Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2022 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  13. Загрузчик модов для сервера и клиента (PKOdev.NET mod loader) Проблема Многим разработчикам и администраторам серверов Пиратии в нашем сообществе известно, что функциональность клиента и сервера можно изменять так называемыми модами (аддонами, плагинами, дополнениями, патчами). Например: 1) Исправление SQL-инъекций в AccountServer.exe и GroupServer.exe; 2) Увеличение лимитов для .txt/.bin файлов (ItemInfo, CharacterInfo, SkillInfo и других); 3) Обработка сообщений в канал местного чата с помощью lua функции HandleChat(); 4) Трансформация персонажей с помощью lua функции TransformCha(); 5) Панель наложенных на персонажа эффектов; 6) Отображение уровня ЖЗ и МН под персонажами и монстрами. Таким образом, с помощью модов можно исправлять критические баги и уязвимости, изменять настройки, добавлять новый функционал и возможности. Изначально появление модов было вызвано отсутствием в открытом доступе исходных кодов клиента и сервера: разработчикам ничего не оставалось, кроме того, как редактировать исполняемые .exe файлы, развивая и применяя навыки реверс-инжиниринга. После публикации "исходников" популярность модов по-прежнему остается на высоком уровне. Этому способствует ряд причин: 1) Низкое качество полученных исходных кодов, отсутствие опыта их использования. Чтобы ими пользоваться, администратору нужно обладать широкими знаниями языка программирования C++, разбираться в клиент-серверной архитектуре, понимать как устроен сервер и клиент. Кроме того, исходные коды требуют длительного изучения и исследования на предмет багов и уязвимостей, включая процесс тестирования; 2) Существующие официальные сборки сервера и клиента в полной мере удовлетворяют требованиям большинства администраторов и игроков, кроме того, их работоспособность и надежность подтверждена годами практического применения. Для них было создано множество программ, скриптов и модов, которые могут быть несовместимы с исполняемыми файлами сервера и клиента, собранными из исходных кодов; 3) Изучение исходных кодов позволяет лучше понять устройство исполняемых файлов сервера и клиента Пиратии. Такие полученные знания делают возможным создавать моды повышенной сложности. Администраторы и разработчики при реализации своих игровых проектов могут пойти по двум путям: использовать старые, официальные сборки сервера и клиента, и изменять их функционал с помощью модов, либо развиваться в направлении разработки исходных кодов. Как уже должно быть понятно, данная тема поддерживает первый путь. В настоящий момент разработка модов связана с некоторыми проблемами: 1) В нашем сообществе отсутствует четкий стандарт и культура написания модов. Кто-то внедряет код непосредственно в исполняемый .exe файл методом "патчинга", другие предпочитают писать DLL-библиотеки. Некоторые моды могут конфликтовать друг с другом, что приводит к ошибкам и трудноуловимым багам; 2) Как следствие, установка модов сопряжена с определенными трудностями: например, как перенести мод из одного GameServer.exe в другой? Каждый раз необходимо заниматься редактированием ("патчингом") исполняемых .exe файлов, а для этого нужно обладать специальными знаниями и навыками. Если моды выполнены в виде DLL-библиотек, то каждый мод необходимо вручную вносить в таблицу импорта исполняемого .exe файла. Все это неудобно, отнимает много времени и создает вероятность совершения ошибок в процессе установки и появления багов; 3) Существует некоторое множество версий GameServer.exe и Game.exe (остальные серверные исполняемые .exe файлы не принимаем во внимание), которые имеют различную двоичную структуру. Иными словами, разработанный мод для GameServer.exe версии 1.36 не будет работать с GameServer.exe версии 1.38 – Вам необходимо разрабатывать мод под конкретный .exe файл. Вследствие этого возникает путаница с версиями исполняемых файлов. Яркий пример – адреса лимитов для .txt/.bin: думаю, многие заметили что они разные для разных .exe. Исходя из вышесказанного, было принято решение создать систему, которая исправит текущее положение вещей в отношении модов и упростит их использование – Загрузчик модов для клиента и сервера. Загрузчик модов Загрузчик модов выполняет несколько задач: 1) Унификация процесса создания, установки и запуска модов; 2) Определение типа и версии исполняемого .exe файла, который подлежит модификации; 3) Поиск установленных модов, определение их версии и совместимости с целевым исполняемым .exe файлом, подключение модов к исполняемому .exe файлу клиента или сервера. Представляет собой DLL-библиотеку, которая единоразово подключается к исполняемому .exe файлу клиента или сервера . Моды так же являются DLL-библиотеками, которые помещаются в определенную директорию и автоматически запускаются загрузчиком при запуске клиента или сервера. Перед запуском исполняемого .exe файла клиента или сервера управление передается загрузчику. Загрузчик определяет тип и версию .exe файла, к которому он привязан, и начинает процесс поиска DLL-библиотек в директории "mods" из корневой папки клиента/сервера. Текущая найденная DLL-библиотека динамически подключается к процессу клиента/сервера, после чего загрузчик запрашивает у библиотеки информацию о моде: название мода, тип и версия целевого .exe файла, версия мода, имя автора модификации. Если тип и версия .exe файла с загрузчиком совпадает с типом и версией .exe файла, полученными из DLL-библиотеки мода, то загрузчик дает моду команду на запуск. Далее мод вносит изменения в код процесса исполняемого файла, тем самым осуществляя модификацию. Перед завершением процесса клиента/сервера управление снова передается загрузчику, который по очереди отключает от процесса все моды. Текущая версия загрузчика может работать с официальными 1.3x версиями Game.exe (клиент) и GameServer.exe (сервер). Определение типа исполняемого файла (GameServer.exe или Game.exe) и его версии производится по метке времени компиляции (linker timestamp), которая записана в COFF-заголовке каждого исполняемого файла. Поддерживаемые Game.exe и GameServer.exe ---------------------+----+----------------+-------------- Название | ID | Обозначение | Метка времени ---------------------+----+----------------+-------------- GameServer.exe 1.36 | 1 | GAMESERVER_136 | 1204708785 ---------------------+----+----------------+-------------- GameServer.exe 1.38 | 2 | GAMESERVER_138 | 1204708785 ---------------------+---+----------------+-------------- Game.exe | 3 | GAME_13X_0 | 1222073761 ---------------------+----+----------------+-------------- Game.exe | 4 | GAME_13X_1 | 1243412597 ---------------------+----+----------------+-------------- Game.exe | 5 | GAME_13X_2 | 1252912474 ---------------------+----+----------------+-------------- Game.exe | 6 | GAME_13X_3 | 1244511158 ---------------------+----+----------------+-------------- Game.exe | 7 | GAME_13X_4 | 1585009030 ---------------------+----+----------------+-------------- Game.exe | 8 | GAME_13X_5 | 1207214236 ---------------------+----+----------------+-------------- GateServer.exe 1.38 | 101| GATESERVER_138 | 1224838480 ---------------------+----+----------------+-------------- Установка загрузчика модов 1) В корневой директории исполняемого .exe файла, к которому подключается загрузчик модов, создайте папку с названием "mods"*. В этой папке будут храниться DLL-библиотеки модов; 2) Откройте исполняемый .exe файл в программе CFF Explorer. Перейдите на вкладку "Import adder" (1); 3) Нажмите кнопку "Add" (2) и выберите файл pkodev.mod.loader.dll; 4) В списке "Exported functions" выберите "ExportedFunction" (3); 5) Нажмите кнопку "Import By Name" (4); 6) Снимите флажок "Rebuild OFTs" (5); 7) Нажмите кнопку "Rebuild Import Table" (6); 8 ) Сохраните файл (7). 9) Запустите исполняемый .exe файл. В окне консоли вы должны увидеть следующее сообщение: [pkodev.mod.loader] ----------------------------------------------- [pkodev.mod.loader] PKOdev.NET mod loader ver. 1.0 by V3ct0r [pkodev.mod.loader] ----------------------------------------------- Если у исполняемого файла нет окна консоли, например, у Game.exe, то запустите его следующим образом: system\Game.exe startgame > output.txt Теперь вывод в консоль будет перенаправлен в текстовый файл output.txt. * Примечание: для Game.exe папка "mods" должна находиться в корневой директории игрового клиента, а не в папке system. Установка модов Чтобы установить мод достаточно поместить его DLL-библиотеку в папку "mods". Для удобства каждый мод можно помещать в отдельную папку. Пример структуры папок для GameServer.exe: GameServer | -> Mods | -> .disabled | -> .priority | -> pkodev.mod.example1.server.138.dll | -> pkodev.mod.example2 | -> pkodev.mod.example2.server.138.dll | -> pkodev.mod.example3 | -> pkodev.mod.example3.server.138.dll После запуска исполняемого .exe файла Вы должны увидеть новый мод в списке загруженных модов: Удаление модов Чтобы удалить мод, необходимо удалить его DLL-библиотеку из папки "mods". Временное отключение модов Чтобы отменить загрузку тех или иных модов, создайте в корневой директории с модами (папка "mods") файл ".disabled" и запишите в него названия модов, которые необходимо временно отключить, с новой строки. Например: // Файл: mods\.disabled // Запишите ниже названия модов, которые необходимо отключить pkodev.mod.fullmap pkodev.mod.tablelimit Таким образом, моды "pkodev.mod.fullmap" и "pkodev.mod.tablelimit" будут проигнорированы загрузчиком. Приоритет загрузки модов Загрузчик модов позволяет загружать те или иные моды в указанном порядке. Для этого создайте в корневой директории с модами (папка "mods") файл ".priority" и запишите в него названия модов в порядке убывания приоритета. Моды, не записанные в данном файле, будут загружены после модов с приоритетом, в случайном порядке. Например: // Файл mods\.priority // Запишите ниже названия модов в порядке убывания приоритета загрузки pkodev.mod.power pkodev.mod.tablelimit pkodev.mod.fullmap Моды будут загружены в следующем порядке: 1. pkodev.mod.power; 2. pkodev.mod.tablelimit; 3. pkodev.mod.fullmap; 4. Далее - все остальные обнаруженные в папке "mods" моды в случайном порядке. Создание мода Для того, чтобы мод мог быть загружен загрузчиком, он должен соответствовать следующим требованиям: 1) Название DLL-библиотеки мода должно быть вида: pkodev.mod.<название мода>.<client или server>.<обозначение версии.exe >.dll Например: pkodev.mod.tablelimit.client.13x_0.dll pkodev.mod.mobspawn.server.138.dll 2) DLL-библиотека мода должна экспортировать 3 функции: __declspec(dllexport) void __cdecl GetModInformation(mod_info& info) Заполнить структуру типа mod_info. Данная структура содержит основную информацию о моде: название, версию, имя автора, ID типа и версии исполняемого .exe файла, для которого предназначен мод. // Mod information structure struct mod_info { // Название мода char name[128]; // Версия мода char version[64]; // Имя автора char author[64]; // Тип и версия целевого .exe файла (см. таблицу) unsigned int exe_version; }; __declspec(dllexport) void __cdecl Start(const char* path) Запустить мод и произвести модификацию процесса исполняемого файла. В переменной path содержится путь до корневой директории мода. В данной функции мод должен выполнить свою инициализацию, загрузить необходимые настройки и произвести модификацию процесса исполняемого файла. __declspec(dllexport) void __cdecl Stop() Остановить мод. В данной функции мод должен сохранить свои настройки, откатить модификацию процесса (необязательно) и освободить ресурсы. 3) Тип и версия исполняемого файла, указанная в DLL-библиотеке мода (структура modinfo, поле exe_version), должны совпадать с типом и версией исполняемого файла, для которого он предназначен. Если загрузчик определил тип и версию исполняемого файла как GameServer.exe 1.38 (GAMESERVER_138) с ID 2 (см. таблицу выше), то DLL-библиотека мода должна записывать в поле exe_version значение 2. Пример разработки мода Для разработки мода можно использовать любой язык программирования, который поддерживает создание DLL-библиотек. Я буду использовать язык C++ и среду разработки Visual Studio 2019 Community. В качестве примера создадим мод для GameServer.exe версии 1.38 (ID 2), который будет выводить в его окно сообщение "Hello world!". 1) Определим название мода, пусть оно будет: pkodev.mod.helloworld Тогда название DLL-библиотеки мода будет: pkodev.mod.helloworld.server.138.dll 2) Создадим проект динамически подключаемой библиотеки .DLL; 3) Подключаем к проекту файл loader.h (см. вложения в конце данного сообщения); 4) Реализуем функцию GetModInformation(): void GetModInformation(mod_info& info) { strcpy_s(info.name, "pkodev.mod.helloworld"); strcpy_s(info.version, "1.0"); strcpy_s(info.author, "V3ct0r"); info.exe_version = GAMESERVER_138; } 5) Реализуем функцию Start(): void Start(const char* path) { std::cout << "Hello world!" << std::endl; std::cout << "path = " << path << std::endl << std::endl; } 6) Реализуем функцию Stop(): void Stop() { } 7) Скомпилируем проект. В результате мы получим файл pkodev.mod.helloworld.server.138.dll; 8 ) Устанавливаем и тестируем мод. В окне GameServer.exe мы должны увидеть сообщение "Hello world!" и путь до корневой директории мода: Проект примера мода можно найти во вложении. Скачать 1) Загрузчик модов; 2) Исходный код загрузчика модов для Visual Studio 2019 Community (C++); 3) Интерфейс для создания модов (файл loader.h); 4) Проект примера мода "Hello world!" для Visual Studio 2019 Community (C++); 5) Образцы исполняемых файлов клиента и сервера из таблицы (7.3 Мб); 6) Шаблон проекта мода PKOdev.NET loader для Visual Studio 2019 Community (C++). Доступные моды 1) Подключение Game.exe к Stall Server (сервер "оффлайн" ларьков); 2) Исправление мгновенного возрождения убитых монстров после перезапуска сервера; 3) Редактирование лимитов .txt таблиц; 4) Система рейтинга игроков; 5) Система ежедневных наград за вход в игру; 6) Отображение времени отката ("кулдауна") умений; 7) Отображение координат под NPC; 8 ) Автоматическое подключение к серверу / вход в игру; 9) Социальные кнопки (Discord, Youtube, Twitch и др.); 10) Медали (ожерелья) со званиями; 11) Отображение уровня персонажа игрока рядом с его именем; 12) Отображение дополнительных параметров на форме с характеристиками персонажа (frmState); 13) Время сервера; 14) Антибот; 15) Отображение уровня предметов на иконках ("умные иконки"); 16) Отображение названия предмета в аппарели; 17) Изменение размера персонажей; 18) Отображение времени отклика ("пинг") на форме выбора сервера; 19) Система контрактов; 20) Отключение проверки пароля при входе во внутриигровой Интернет-магазин; 21) Отключение сообщений об ошибках при компиляции .txt-таблиц (table_bin); 22) Очистка чатов; 23) Исправление сброса профессии персонажей при переподключении к серверу ("слёт профессии"); 24) Цветные GM-сообщения (GM notice); 25) 60 кадров в секунду (60 FPS); 26) Эффект полета для крыльев; 27) Полная карта местности для региона; 28) Выделение друзей и врагов цветом. (Обновлено 18.02.2022) Если у Вас есть какие-либо вопросы или возникли проблемы, то смело спрашивайте в данной теме!
  14. [Мод] 60 кадров в секунду (60 FPS) Данный мод увеличивает скорость отрисовки графики игровым клиентом с 30 до 60 кадров в секунду. У мода есть несколько проблем: 1) При быстром беге персонажа игрока может отбрасывать назад; 2) При быстром беге могут не успевать прогружаться карта, NPC, монстры и игроки; 3) Анимации персонажей и объектов проигрываются слишком быстро. Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.60fps; Версия: 1.0; Автор: V3ct0r, BotPRO; Тип: для клиента (Game.exe); Поддерживаемые исполняемые .exe файлы: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4, GAME_13X_5. Установка 1) В директории "mods" игрового клиента создайте папку "pkodev.mod.60fps"; 2) Поместите файл DLL-библиотеки мода "pkodev.mod.60fps.client.13x_<ID>.dll" для Вашей версии Game.exe в папку "mods\pkodev.mod.60fps" игрового клиента; 3) Поместите файл DLL-библиотеки мода "pkodev.mod.60fps.impl_<ID>.dll" для Вашей версии Game.exe в папку "mods\pkodev.mod.60fps\impl" игрового клиента. Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  15. [Мод] Отключение сообщений об ошибках при компиляции .txt-таблиц (table_bin) Данный мод отключает многочисленный вывод ошибок в диалоговом окне (MessageBox) при отсутствии некоторых .txt-таблиц в процессе их компиляции с помощью параметра запуска клиента table_bin. Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.nomsgbin; Версия: 1.0; Автор: V3ct0r; Тип: для клиента (Game.exe); Поддерживаемые исполняемые .exe файлы: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4, GAME_13X_5. Установка Поместите файл DLL-библиотеки мода "pkodev.mod.nomsgbin.client.13x_<ID>.dll" для Вашей версии Game.exe в папку "mods" игрового клиента. Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  16. [Мод] Подключение Game.exe к Stall Server (сервер "оффлайн" ларьков) Для реализации шифрования протокола в сервере "оффлайн" ларьков, последнему необходимо знать MD5-хэш пароля игрового аккаунта, но клиент версии 1.3x отправляет на сервер хэш пароля в зашифрованном виде. Данный мод для системы "PKODev.NET mod loader" необходим для отключения шифрования MD5-хэша пароля на стороне клиента и подключения к серверу "оффлайн" ларьков. Без данной модификации, при подключении к серверу с установленной системой "оффлайн" ларьков, пользователь будет получать ошибку "Неверный пароль!". Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.stallserver; Версия: 1.0; Автор: V3ct0r; Тип: для клиента (Game.exe); Поддерживаемые исполняемые .exe файлы: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4, GAME_13X_5. Установка Поместите файл DLL-библиотеки мода "pkodev.mod.stallserver.client.13x_<ID>.dll" для Вашей версии Game.exe в папку "mods" игрового клиента. Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  17. [Мод] Расширение GateServer для сервера "оффлайн" ларьков (StallServer) Данная модификация GateServer предназначена для определения IP-адресов клиентов, которые находятся за сервером "оффлайн" ларьков (StallServer). Поскольку StallServer по своей сути является прокси-сервером, через который клиент (Game) подключается к игровому серверу (GateServer), то последний не будет "видеть" реальный IP-адрес клиента, а в логах и базе данных у всех игроков будет одинаковый IP-адрес StallServer (например, 127.0.0.1 если GateServer и StallServer запущены на одной машине). Для решения этой проблемы StallServer дописывает IP-адрес клиента в логин-пакет, что требует модификации GateServer для чтения IP-адреса из пакета и его привязки к клиенту. Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.stallip; Версия: 1.0; Автор: V3ct0r; Тип: для сервера (GateServer.exe); Поддерживаемые исполняемые .exe файлы: GATESERVER_138. Установка Поместите файл DLL-библиотеки мода "pkodev.mod.stallip.gate.138.dll" в папку "mods" GateServer.exe. Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  18. [Мод] Система ежедневных наград за вход в игру Данный мод реализует систему ежедневных наград за вход в игру. Игрокам необходимо каждый день заходить в игру, чтобы получить очередную награду - с каждым новым днем награда становится ценнее. Если игрок пропускает день, то цепочка сбрасывается и начинается заново с первого дня. Каждую неделю цепочка так же сбрасывается. Цепочка наград настраивается администратором в специальной lua функции и рассчитывается на неделю вперед, после чего сохраняется в базе данных сервера. Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.reward; Версия: 1.0; Автор: V3ct0r; Тип: для клиента и сервера (Game.exe и GameServer.exe); Поддерживаемые исполняемые .exe файлы: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4, GAME_13X_5, GAMESERVER_136 и GAMESERVER_138. Установка Сервер: 1) В директории "GameServer\mods" Вашего сервера создайте папку "pkodev.mod.reward"; 2) Поместите в неё файл DLL-библиотеки мода "pkodev.mod.reward.server.13<x>.dll" для Вашей версии GameServer.exe; 3) В файл functions.lua ("GameServer\resource\script\calculate\") запишите следующий скрипт: -- Daily reward system (pkodev.mod.reward) -- Transfer the list of items to the system function GetRewardArrayAdapter(role) -- Get a list of items for daily reward local arr = GetRewardArray(role) -- Transfer the list to the system return arr[1].id, arr[1].number, arr[2].id, arr[2].number, arr[3].id, arr[3].number, arr[4].id, arr[4].number, arr[5].id, arr[5].number, arr[6].id, arr[6].number, arr[7].id, arr[7].number end -- Daily reward system (pkodev.mod.reward) -- Get a list of items for daily reward function GetRewardArray(role) -- Select an item depending on character race local hairstyle_book = function(role) -- List of items -- ID: 931 Lance Trendy Hairstyle Book -- ID: 932 Carsise Trendy Hairstyle Book -- ID: 933 Phyllis Trendy Hairstyle Book -- ID: 934 Ami Trendy Hairstyle Book local items = {931, 932, 933, 934} -- Get character type ID local id = GetChaTypeID(role) -- Return item id depending on the type ID return items[id] or 0 end -- Make a list of items for daily reward local items = { -- Day 1 (Short Sword x 1 or Long Sword x 1 or Fencing Sword x 1) {id = math.random(1, 3), number = 1}, -- Day 2 (Apple x 99 or Bread x 99 or Cake x 99) {id = math.random(1847, 1849), number = 99}, -- Day 3 (Fairy Coin x 50) {id = 855, number = 50}, -- Day 4 (Random fairy ID 183 ... 193 x 1) {id = math.random(183, 193), number = 1}, -- Day 5 (Hairstyle Book x 1) {id = hairstyle_book(role), number = 1}, -- Day 6 (Fairy Ration x 10) {id = 227, number = 10}, -- Day 7 (Refining Gem x 1) {id = 885, number = 1} } -- We have to return an array of items to caller function return items end 4) В MSSQL Management Studio выполните SQL-запрос: USE GameDB ALTER TABLE character ADD reward VARCHAR(128) NOT NULL DEFAULT '0' WITH VALUES Клиент: 1) В директории "mods" Вашего клиента создайте папку "pkodev.mod.reward"; 2) Поместите в неё файл DLL-библиотеки мода "pkodev.mod.reward.client.13x_<x>.dll" для Вашей версии Game.exe; 3) Поместите файлы текстур формы "main.png" и "buttons.tga" в директорию "texture\mods\pkodev.mod.reward" Вашего клиента; 4) В файл скриптов "main.clu" ("scripts\lua\forms") добавьте код формы ежедневной награды: ---------------------------------------------------------------------------------------------------- -- Daily login reward form ---------------------------------------------------------------------------------------------------- -- The form frmReward = UI_CreateForm( "frmReward", FALSE, 366, 158, 150, 200, TRUE, FALSE ) UI_SetFormStyle( frmReward , 0 ) UI_AddFormToTemplete( frmReward, FORM_MAIN ) UI_FormSetIsEscClose( frmReward, FALSE ) UI_SetIsDrag( frmReward, TRUE ) -- Form background frmRewardImg = UI_CreateCompent( frmReward, IMAGE_TYPE, "frmRewardImg", 366, 158, 0, 0 ) UI_LoadImage( frmRewardImg, "texture/mod/pkodev.mod.reward/main.png", NORMAL, 366, 158, 0, 0 ) -- Form title labTitle = UI_CreateCompent( frmReward, LABELEX_TYPE, "labTitle", 400, 150, 10, 7 ) UI_SetCaption( labTitle, "\197\230\229\228\237\229\226\237\224\255 \237\224\227\240\224\228\224!") UI_SetTextColor( labTitle, COLOR_WHITE ) -- Reward button btnGetReward = UI_CreateCompent( frmReward, BUTTON_TYPE, "btnGetReward", 67, 24, 150, 120 ) UI_LoadButtonImage( btnGetReward, "texture/mod/pkodev.mod.reward/main.png", 67, 24, 0, 158, TRUE ) -- Close button btnClose = UI_CreateCompent( frmReward, BUTTON_TYPE, "btnClose", 21, 21, 343, 2 ) UI_LoadButtonImage( btnClose, "texture/mod/pkodev.mod.reward/buttons.tga", 21, 21, 270, 0, TRUE ) UI_SetButtonModalResult( btnClose, BUTTON_CLOSE ) -- Item slots cmdItemSlot0 = UI_CreateCompent( frmReward, COMMAND_ONE_TYPE, "cmdItemSlot0", 32, 32, 20, 73 ) UI_SetIsDrag( cmdItemSlot0, FALSE ) cmdItemSlot1 = UI_CreateCompent( frmReward, COMMAND_ONE_TYPE, "cmdItemSlot1", 32, 32, 69, 73 ) UI_SetIsDrag( cmdItemSlot1, FALSE ) cmdItemSlot2 = UI_CreateCompent( frmReward, COMMAND_ONE_TYPE, "cmdItemSlot2", 32, 32, 118, 73 ) UI_SetIsDrag( cmdItemSlot2, FALSE ) cmdItemSlot3 = UI_CreateCompent( frmReward, COMMAND_ONE_TYPE, "cmdItemSlot3", 32, 32, 167, 73 ) UI_SetIsDrag( cmdItemSlot3, FALSE ) cmdItemSlot4 = UI_CreateCompent( frmReward, COMMAND_ONE_TYPE, "cmdItemSlot4", 32, 32, 216, 73 ) UI_SetIsDrag( cmdItemSlot4, FALSE ) cmdItemSlot5 = UI_CreateCompent( frmReward, COMMAND_ONE_TYPE, "cmdItemSlot5", 32, 32, 265, 73 ) UI_SetIsDrag( cmdItemSlot5, FALSE ) cmdItemSlot6 = UI_CreateCompent( frmReward, COMMAND_ONE_TYPE, "cmdItemSlot6", 32, 32, 314, 73 ) UI_SetIsDrag( cmdItemSlot6, FALSE ) ---------------------------------------------------------------------------------------------------- Настройка мода 1) В функции GetRewardArray(role) запишите код, который будет генерировать цепочку наград для персонажа role на следующие семь дней. Функция должна вернуть таблицу из 7 элементов с полями id и number, где id - это ID предмета, который выдается в качестве награды, а number - количество предметов. Каждый элемент соответствует своему дню (1-й элемент - первый день, 2-ой элемент - второй день и так далее). Пример: function GetRewardArray(role) local items = { -- День 1: Яблоко x 20 {id = 1847, number = 20}, -- День 2: Хлеб x 40 {id = 1848, number = 40}, -- День 3: Кекс x 60 {id = 1849, number = 60}, -- День 4: Монета феи x 55 {id = 855, number = 55}, -- День 5: Питание для феи x 15 {id = 227, number = 15}, -- День 6: Хлеб x 99 {id = 1848, number = 99}, -- День 7: Кекс x 99 {id = 1849, number = 99} } return items end ID предметов и их количество можно генерировать случайным образом или в зависимости от расы персонажа, его профессии и тому подобного. 2) По умолчанию период награды составляет 24 часа. Вы можете изменить это значение в исходном коде серверной части мода (проект pkodev.mod.reward.server, файл structure.h), после чего скомпилируйте проект: // Reward interval in seconds static const unsigned int interval{ 24 * 60 * 60 }; // 24 hours 3) Настройка на стороне клиента не требуется. Старая версия GUI (большое спасибо пользователю @Masuka00!) Скачать текстуру В main.clu нужно записать новый код для кнопки "Apply": -- Close button btnClose = UI_CreateCompent( frmReward, BUTTON_TYPE, "btnClose", 14, 14, 342, 4 ) UI_LoadButtonImage( btnClose, "texture/mods/pkodev.mod.reward/main.png", 14, 14, 271, 174, TRUE ) UI_SetButtonModalResult( btnClose, BUTTON_CLOSE ) Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  19. [Мод] Изменение размера персонажей Данный мод позволяет редактировать масштаб персонажей (см. скриншот выше). Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.mobsize; Версия: 1.0; Авторы: @VItal13, V3ct0r; Тип: для клиента (Game.exe); Поддерживаемые исполняемые .exe файлы: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4 и GAME_13X_5. Установка 1) В директории "mods" Вашего клиента создайте папку "pkodev.mod.mobsize"; 2) Поместите в неё файл DLL-библиотеки мода "pkodev.mod.mobsize.client.13x_<x>.dll" для Вашей версии Game.exe. 3) Поместите в неё файл настроек мода "pkodev.mod.mobsize.cfg" и запишите в него список масштабов* персонажей в следующем формате: <ID монстра>{<Масштаб X>;<Масштаб Y>;<Масштаб Z>} Например, для "Лесного духа" ID 103: 103{2.5;2.5;2.5} * Каждый новый персонаж записывается с новой строки. Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  20. [Мод] Редактирование лимитов .txt таблиц С помощью данного мода для системы "PKODev.NET mod loader" можно легко редактировать лимиты для .txt/.bin файлов клиента и сервера без необходимости редактирования Game.exe и GameServer.exe соответственно в HEX-редакторе. Лимиты редактируются в текстовом файле pkodev.mod.tablelimit.cfg: areaset = 300 character_lvup = 120 characterinfo = 2500 forgeitem = 12 hairs = 500 int_cha_item = 32 iteminfo = 6000 lifelvup = 1000 saillvup = 1000 shipinfo = 120 shipiteminfo = 500 skilleff = 240 skillinfo = 500 characterposeinfo = 100 chaticons = 100 elfskillinfo = 100 eventsound = 30 itempre = 100 itemrefineeffectinfo = 5000 itemrefineinfo = 20000 itemtype = 100 magicgroupinfo = 10 magicsingleinfo = 100 mapinfo = 100 musicinfo = 500 notifyset = 100 objevent = 10 resourceinfo = 3000 sceneffectinfo = 14000 sceneobjinfo = 800 selectcha = 60 serverset = 100 shadeinfo = 14000 stoneinfo = 100 terraininfo = 100 Необязательно перечислять все таблицы, если требуется отредактировать лимиты только некоторых: iteminfo = 12000 characterinfo = 6000 mapinfo = 500 Таблицы GameServer.exe (13) Таблицы Game.exe (31) Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.tablelimit; Версия: 1.0; Автор: V3ct0r; Тип: для клиента и сервера (Game.exe и GameServer.exe); Поддерживаемые исполняемые .exe файлы: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4, GAME_13X_5, GAMESERVER_136 и GAMESERVER_138. Установка 1) В директории "mods" Вашего сервера или клиента создайте папку "pkodev.mod.tablelimit"; 2) Поместите в неё файл DLL-библиотеки мода "pkodev.mod.tablelimit.<client/server>.<x>.dll" для Вашей версии Game.exe или GameServer.exe; 3) Поместите в неё файл настроек мода "pkodev.mod.tablelimit.cfg"; 4) Отредактируйте файл "pkodev.mod.tablelimit.cfg" по своему усмотрению - укажите требуемые значения лимитов для каждого файла .txt/.bin таблиц: <Название таблицы> = <Значение лимита> Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  21. [Мод] Время сервера Мод добавляет в игру текстовую метку с часами - текущее время сервера. Время сервера берется из пакета ID: 940, который сервер отправляет клиенту при подключении, например: [01-17 10:44:47:879] Метка с часами привязывается к форме миникарты "frmMinimap" из файла GUI-скриптов "\scripts\lua\forms\minimap.clu". Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.clock; Версия: 1.0; Автор: V3ct0r; Тип: для клиента (Game.exe); Поддерживаемые исполняемые .exe файлы: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4 иGAME_13X_5). Установка 1) В директории "mods" Вашего клиента создайте папку "pkodev.mod.clock"; 2) Поместите в неё файл DLL-библиотеки мода "pkodev.mod.clock.client.13x_<x>.dll" для Вашей версии Game.exe. 3) Поместите в неё файл настроек мода "pkodev.mod.clock.cfg" и запишите в него желаемый формат вывода времени сервера в соответствии с документацией на функцию strftime(). Например, формат: Время сервера: %H:%M:%S %d.%m.%y Может дать следующий вывод: Время сервера: 10:51:20 17.01.2022 4) В файл GUI-скриптов "\scripts\lua\forms\minimap.clu" добавьте код для текстовой метки "labClock", которая будет отвечать за вывод времени сервера: ------------------------------------------------------------------------------------------ -- Clock label ------------------------------------------------------------------------------------------ labClock = UI_CreateCompent(frmMinimap, LABELEX_TYPE, "labClock", 20, 15, 20, 220) UI_SetCaption(labClock, "Clock") UI_SetTextColor(labClock, COLOR_WHITE) UI_SetLabelExFont(labClock, DEFAULT_FONT, TRUE, COLOR_BLACK) ------------------------------------------------------------------------------------------ Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  22. [Мод] Отключение проверки пароля при входе во внутриигровой Интернет-магазин При входе во внутриигровой Интернет-магазин предметов требуется ввести секретный код от аккаунта игрока. Только при верном секретном коде производится вход в магазин. Некоторые администраторы считают это не очень удобным, поэтому было принято решение разработать модификацию для клиента и сервера, которые позволят отключить проверку секретного кода. Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.noigspwd; Версия: 1.0; Автор: V3ct0r; Тип: для сервера (GameServer.exe) и клиента (Game.exe); Поддерживаемые исполняемые .exe файлы: GAMESERVER_136, GAMESERVER_138, GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4, GAME_13X_5. Установка 1) Поместите файл DLL-библиотеки мода "pkodev.mod.noigspwd.client.13x_<ID>.dll" для Вашей версии Game.exe в папку "mods" игрового клиента; 2) Поместите файл DLL-библиотеки мода "pkodev.mod.noigspwd.server.<ID>.dll" для Вашей версии GameServer.exe в папку "mods" GameServer. Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  23. Баги В данной теме публикуются и обсуждаются баги, которые были обнаружены в тех или иных модах по результатам их тестирования и использования. 1. Изменение размера персонажей - Через неопределенное время увеличенная модель персонажа снова становится обычного размера (@Fomin). 2. Отображение времени отката ("кулдауна") умений - При телепортации или перезаходе в игру отображения времени отката умений исчезает (@Fomin). 3. Отображение координат под NPC - Иногда вместо имени персонажа игрока отображения название случайного NPC (@dragontechi). 4. 60 кадров в секунду (60 FPS) - После установки мода частота кадров не изменяется (@dragontechi, @squaller). 5. Отключение проверки пароля при входе во внутриигровой Интернет-магазин - В магазине не отображается количество кристаллов на счете (@Tera). 6. Редактирование лимитов .txt таблиц - При изменении лимита для skillinfo.txt у GameServer.exe появляется неопределенное поведение. Например, у входа в Аргент спавнятся одни Сонные улитки (@Greaux). 7. Отображение уровня предметов на иконках ("умные иконки") - Клиент закрывается с версией мода для Game.exe GAME_13X_1 (@small666). Обновлено 03.03.2022 Благодарю всех за обратную связь и прошу рассказывать о всех найденных багах в этой теме, либо непосредственно в темах с модами. При публикации отчета о баге напишите следующую информацию: 1) Название мода; 2) Описание бага; 3) ID версии Вашего .exe файла (GAME_13X_0 ... GAME_13X_5, GAMESERVER_136, GAMESERVER_138); 4) Есть ли в .exe файле сторонние модификации и патчи? 5) Какие еще моды PKOdev.NET mod loader установлены?
  24. Цветные GM-сообщения (GM notice) Данный мод позволяет отправлять игрокам цветные GM-сообщения (см. скриншот выше) с помощью поля ввода в игровом клиента (ALT + P), либо с использованием функции GMNotice(). Чтобы сделать текст сообщения цветным, в самом начале сообщения необходимо прописать следующий код: {color:Цвет}Сообщение Цвет сообщения указывается в формате RGB в виде шестнадцатеричного числа (FFRRGGBB). Следующий пример выведет игрокам GM-сообщение "Hello PKOdev.NET" оранжевого цвета: {color:FFFF8000}Hello PKOdev.NET! Так же можно использовать функцию GMNotice(): GMNotice("{color:FFFF8000}Hello PKOdev.NET!") Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.colorgmnotice; Версия: 1.0; Автор: V3ct0r; Тип: для клиента (Game.exe); Поддерживаемые исполняемые .exe файлы: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4, GAME_13X_5. Установка Поместите файл DLL-библиотеки мода "pkodev.mod.colorgmnotice.client.13x_<ID>.dll" для Вашей версии Game.exe в папку "mods" игрового клиента. Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  25. [Мод] Исправление сброса профессии персонажей при переподключении к серверу ("слёт профессии") Некоторые администраторы сталкиваются с проблемой, когда получивший профессию персонаж после перезахода в игру снова становится "Новичком", т.е. происходит так называемый "слет" профессии. Данный мод исправляет этот баг. Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.jobfix; Версия: 1.0; Автор: V3ct0r; Тип: для сервера (GameServer.exe); Поддерживаемые исполняемые .exe файлы: GAMESERVER_136 и GAMESERVER_138. Установка В директории "mods" Вашего GameServer создайте папку "pkodev.mod.jobfix" и поместите в неё файл DLL-библиотеки мода "pkodev.mod.jobfix.server.<x>_<l>.dll" для Вашей версии GameServer.exe, где <x> - версия GameServer.exe (136 или 138), а <l> - язык профессий (rus или eng). Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
×
×
  • Create New...