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
  • 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 36 results

  1. Идеи для модов В данной теме обсуждаются идеи для создания новых модов, а так же для улучшения уже существующих.
  2. Система "оффлайн" ларьков Одним из игровых аспектов игры является торговля между персонажами посредством особых ларьков (лавок), которые могут открывать игроки изучив специальное умение. Игрок выставляет свои предметы за определенную цену, а остальные игроки могут покупать их. Однако, для такой торговли игрок должен находиться в игре, то есть быть подключенным к серверу, что вынуждает его оставлять свой компьютер постоянно включенным и держать игровой клиент свернутым. Это очень неудобно, поэтому была придумана система "оффлайн" ларьков, которая позволяет игрокам отключаться от сервера и при этом оставаться торговать в ларьках. Возможно несколько способов реализации такой системы, но наиболее распространена система "оффлайн" ларьков через прокси-сервер: 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
  3. [Мод] 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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  4. [Мод] Отключение сообщений об ошибках при компиляции .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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  5. [Мод] Подключение 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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  6. [Мод] Расширение 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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  7. Загрузчик модов для сервера и клиента (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) Если у Вас есть какие-либо вопросы или возникли проблемы, то смело спрашивайте в данной теме!
  8. [Мод] Система ежедневных наград за вход в игру Данный мод реализует систему ежедневных наград за вход в игру. Игрокам необходимо каждый день заходить в игру, чтобы получить очередную награду - с каждым новым днем награда становится ценнее. Если игрок пропускает день, то цепочка сбрасывается и начинается заново с первого дня. Каждую неделю цепочка так же сбрасывается. Цепочка наград настраивается администратором в специальной 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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  9. [Мод] Изменение размера персонажей Данный мод позволяет редактировать масштаб персонажей (см. скриншот выше). Требования Установленный Загрузчик модов для сервера и клиента (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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  10. [Мод] Редактирование лимитов .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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  11. [Мод] Время сервера Мод добавляет в игру текстовую метку с часами - текущее время сервера. Время сервера берется из пакета 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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  12. [Мод] Система контрактов Данная система представляет собой импровизированный квест типа "Охота на монстров", целью которого является убийство некоторого числа определенных монстров. Игроку выдается специальный предмет - "Контракт", в котором написано на какого монстра необходимо охотиться. Так же в нем записывается число монстров и текущий прогресс. После убийства необходимого числа монстров контракт считается выполненным, а игрок получает награду. Некоторые особенности системы: 1) Тип предмета для контракта должен быть 99. Для предмета также выбирается уникальный ID; 2) Контракт можно подобрать, выбросить, передать другому игроку, положить в банк или продать; 3) Для получения награды после завершения контракта, игрок должен использовать предмет контракта двойным кликом. Если контракт не был завершен, то игрок увидит соответствующее сообщение в систему; 4) Состав и количество награды определяется администратором в специальной функции в скрипте системы; 5) Если у игрока в инвентаре несколько контрактов на убийство одного и того же монстра, то при убийстве данного монстра тот или иной контракт выбирается случайным образом. Установка Все необходимые файлы и скрипты можно скачать в конце темы. Сервер 1) Добавьте в файл ItemInfo.txt предмет для контракта: XXXX Contract 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 After completion you will receive a reward! где XXXX - любой незанятый ID. 2) Создайте файл с названием "pkodev.contract.lua" в директории "GameServer\resource\script\calculate\mods"; 3) Поместите в данный файл следующий код: -------------------------------------------------------------- -- The contract system script -- -- Author: V3ct0r from PKOdev.NET -- Version: 1.0 (01/12/2022) -- -- How to install the system: -- 1) Put this file to '\GameServer\resource\script\calculate\mods' folder -- 2) Put the following line at the beginning of 'SkillEffect.lua' file: -- dofile(GetResPath("script\\calculate\\mods\\pkodev.contract.lua")) -- 3) Add the contract item in the ItemInfo.txt file -- XXXX Contract 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 Upon completion, you are entitled to a reward -- 4) Specify the item ID in 'contract.conf.item_id' table below: -- item_id = XXXX -- 5) Write the code for issuing a reward for completing a contract in the 'contract.conf.reward_cb' function -- 6) To create a new contract use the function 'contract.create': -- local <result (0 or 1)>, <item_descriptor>, <slot (from 0 to bag_size - 1)> -- = contract.create(<character_descriptor>, <monster_id>, <monster_number>) -- For example: -- local ret, item, slot = contract.create(role, 103, 7) -- 7) Done! -------------------------------------------------------------- -- Print a log print("Loading pkodev.contract.lua") -- The contract system contract = contract or {} --------------------------------------- -- Settings --------------------------------------- contract.conf = { -- Contract item ID item_id = XXXX, -- User-defined function for reward reward_cb = function(role, item) -- Give 1,000 gold AddMoney (role, 0, 1000) -- Give an random item local arr = { -- Refining Gem x 1 {id = 885, count = 1}, -- or Gem of Rage x 2 {id = 863, count = 2}, -- or Cake x 60 {id = 1849, count = 60}, -- or Fairy of Luck x 1 {id = 231, count = 1} } local r = math.random(1, table.getn(arr)) GiveItem(role, 0, arr[r].id , arr[r].count, 4) -- Launch fireworks PlayEffect(role, 361) end } --------------------------------------- -- Constants --------------------------------------- contract.const = { item_type = 99, -- Contract item type target_id = ITEMATTR_VAL_STR, -- Item attribute ID with the ID of target monster target_max = ITEMATTR_VAL_AGI, -- Item attribute ID with the total amount of monsters to hunt target_cur = ITEMATTR_VAL_DEX -- Item attribute ID with the total amount of monsters already hunted } --------------------------------------- -- Hooks --------------------------------------- -- Adding an item to inventory event contract.Creat_Item__original = Creat_Item Creat_Item = function(item, item_type, item_lv, item_event) -- Check the item type if ( item_type == contract.const['item_type'] ) then -- Reset the previous attrbiutes Reset_item_add() -- Add new attributes to the item Add_Item_Attr(contract.const['target_id'], 0) Add_Item_Attr(contract.const['target_max'], 0) Add_Item_Attr(contract.const['target_cur'], 0) return item_add.cnt, item_add.attr[1][1], item_add.attr[1][2], item_add.attr[2][1], item_add.attr[2][2], item_add.attr[3][1], item_add.attr[3][2], item_add.attr[4][1], item_add.attr[4][2], item_add.attr[5][1], item_add.attr[5][2], item_add.attr[6][1], item_add.attr[6][2], item_add.attr[7][1], item_add.attr[7][2] end -- Call the original function Creat_Item(item, item_type, item_lv, item_event) return contract.Creat_Item__original(item, item_type, item_lv, item_event) end -- Player killed monster event contract.GetExp_PKM__original = GetExp_PKM GetExp_PKM = function(monster, role) -- Call the original function GetExp_PKM(dead, atk) contract.GetExp_PKM__original(monster, role) -- Get the main character's descriptor role = TurnToCha(role) -- Number of contracts in the player's bag local ret = CheckBagItem(role, contract.conf['item_id']) -- Check that player has contracts if ( ret > 0 ) then -- Monster ID local id = GetChaTypeID(monster) -- List of contracts in the bag local arr = {} local k = 0 -- Build the list of contracts for i = 0, ( GetKbCap(role) - 1 ), 1 do -- Get the item descriptor local item = GetChaItem(role, 2, i) -- Check the item ID if ( GetItemID(item) == contract.conf['item_id'] ) then -- Get the monster ID from contract local target_id = GetItemAttr(item, contract.const['target_id']) -- Check the monster ID if ( id == target_id ) then -- Get amount of monsters to hunt local target_cur = GetItemAttr(item, contract.const['target_cur']) local target_max = GetItemAttr(item, contract.const['target_max']) -- Check that the contract is not completed if ( target_cur < target_max ) then -- Add the item to the list k = k + 1 arr[k] = { item_ = item, cur_ = target_cur, max_ = target_max } end end end end -- Check that matching contracts have been found if ( k > 0 ) then -- Randomly select a contract local r = math.random(1, k) -- Increase the number of hunted monsters arr[r].cur_ = arr[r].cur_ + 1 -- Update amount of hunted monsters SetItemAttr(arr[r].item_, contract.const['target_cur'], arr[r].cur_) -- Synchronize the bag SynChaKitbag(role, 13) -- Check that the contract is not completed if ( arr[r].cur_ < arr[r].max_ ) then -- Write a message BickerNotice( role, string.format( "Contract: Remaining '%s' to hunt: %d / %d!", GetMonsterName(id), arr[r].cur_, arr[r].max_ ) ) else -- Write a message BickerNotice( role, string.format( "Contract: All '%s' are killed! The contract is completed.", GetMonsterName(id) ) ) end end end end --------------------------------------- -- Useful functions --------------------------------------- -- Create a contract contract.create = function(role, target_id, number) -- Get the main character's descriptor role = TurnToCha(role) -- Check that the bag is not locked if ( KitbagLock(role, 0) == LUA_FALSE ) then -- Error LG("pkodev.contract", "Can't create the contract item (id:", contract.conf['item_id'], ") because the bag is locked!") return LUA_FALSE, nil, 0 end -- Check that the bag has one free slot if ( GetChaFreeBagGridNum(role) == 0 ) then -- Error LG("pkodev.contract", "Can't create the contract item (id:", contract.conf['item_id'], ") because there are no free slots in the bag!") return LUA_FALSE, nil, 0 end -- Create an item local r1, r2 = MakeItem(role, contract.conf['item_id'], 1, 4) -- Check the result if ( r1 == 0 ) then -- Error LG("pkodev.contract", "Can't create the contract item (id:", contract.conf['item_id'], ")!") return LUA_FALSE, nil, 0 end -- Get the item descriptor local item = GetChaItem(role, 2, r2) -- Set contract data local a1 = SetItemAttr(item, contract.const['target_id'], target_id) local a2 = SetItemAttr(item, contract.const['target_max'], number) local a3 = SetItemAttr(item, contract.const['target_cur'], 0) -- Check that the data is set if ( (a1 == 0) or (a2 == 0) or (a3 == 0) ) then -- Error LG("pkodev.contract", "Can't set the contract data! a1 = ", a1, ", a2 = ", a2, ", a3 = ", a3) return LUA_FALSE, item, r2 end -- Synchronize the kitbag SynChaKitbag(role, 13) -- Write a message to the player SystemNotice(role, string.format("You received a monster hunt contract [%s] x %d!", GetMonsterName(target_id), number)) -- The contract is successfully created! return LUA_TRUE, item, r2 end -- Contract item use event ItemUse_PKOdevContract = function(role, item) -- Get the main character's descriptor role = TurnToCha(role) -- Get contract data local target_id = GetItemAttr(item, contract.const['target_id']) local target_max = GetItemAttr(item, contract.const['target_max']) local target_cur = GetItemAttr(item, contract.const['target_cur']) -- Check that the contract is not completed if ( target_cur < target_max ) then -- Print a message SystemNotice( role, string.format("You have to kill [%s] x %d more to complete this contract!", GetMonsterName(target_id), (target_max - target_cur) ) ) -- Cancel the item usage UseItemFailed(role) else -- Print a message SystemNotice(role, "You have successfully completed the contract, congratulations!") -- Call user-defined reward function if ( contract.conf['reward_cb'] ~= nil ) then contract.conf['reward_cb'](role, item) end end end 5) Запишите в скрипт системы ID предмета контракта из ItemInfo.txt: contract.conf = { -- Contract item ID item_id = XXXX, . . . 6) Запишите в функцию reward_cb() код для выдачи награды за выполнение контракта: -- User-defined function for reward reward_cb = function(role, item) -- Give 1,000 gold AddMoney (role, 0, 1000) -- Give an random item local arr = { -- Refining Gem x 1 {id = 885, count = 1}, -- or Gem of Rage x 2 {id = 863, count = 2}, -- or Cake x 60 {id = 1849, count = 60}, -- or Fairy of Luck x 1 {id = 231, count = 1} } local r = math.random(1, table.getn(arr)) GiveItem(role, 0, arr[r].id , arr[r].count, 4) -- Launch fireworks PlayEffect(role, 361) end 7) Откройте файл "GameServer\resource\script\calculate\SkillEffect.lua" и в самом начале запишите строку: dofile(GetResPath("script\\calculate\\mods\\pkodev.contract.lua")) Клиент 1) Установите загрузчик модов PKOdev.NET mod loader; 2) Поместите файл DLL-библиотеки мода "pkodev.mod.contract.client.13x_<ID>.dll" для Вашей версии Game.exe в папку "mods" игрового клиента; 3) Добавьте в файл ItemInfo.txt предмет для контракта (см. пункт 1 инструкции по установке системы на сервер). Создание и выдача контрактов Каждый контракт должен быть создан только с использованием функции contract.create(). Использовать функции GiveItem(), MakeItem(), либо GM-команду &make и другие способы создания предметов не допускается. Синтаксис: local <Результат LUA_TRUE|LUA_FALSE>, <Дескриптор предмета>, <Ячейка предмета> = contract.create(<Дескриптор персонажа>, <ID монстра>, <Число монстров>) Пример: local ret, item, pos = contract.create(role, 103, 7) В результате будет создан контракт на убийство семи "Лесных духов" как на изображении из шапки темы. Выдавать контракты можно, например, через специального NPC или с помощью другого предмета. Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  13. [Мод] Отключение проверки пароля при входе во внутриигровой Интернет-магазин При входе во внутриигровой Интернет-магазин предметов требуется ввести секретный код от аккаунта игрока. Только при верном секретном коде производится вход в магазин. Некоторые администраторы считают это не очень удобным, поэтому было принято решение разработать модификацию для клиента и сервера, которые позволят отключить проверку секретного кода. Требования Установленный Загрузчик модов для сервера и клиента (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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  14. [Мод] Выделение друзей и врагов цветом Данная модификация выделяет на экране дружественных и враждебных игроков: имена персонажей меняют цвет, а под персонажами отображаются цветные круги (см. скриншот выше). Если поблизости с персонажем игрока есть враждебные игроки, то рядом с аватаром персонажа отображается предупреждающая иконка: Персонажи считаются дружественными, если они: 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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  15. Баги В данной теме публикуются и обсуждаются баги, которые были обнаружены в тех или иных модах по результатам их тестирования и использования. 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 установлены?
  16. [Новость] Исходные коды модов были перенесены на GitHub Исходные коды всех модов за моим авторством из раздела "Моды для клиента и сервера (PKOdev.NET mod loader)" теперь можно найти в соответствующих репозиториях на GitHub. Там же можно скачать последние бинарные релизы модов в виде .dll-библиотек, а также все необходимые ресурсы для их работы: .cfg-файлы настроек, скрипты, текстуры и другие файлы. Ранее моды хранились в облачном хранилище Google Диск, что не очень удобно для подобного рода проектов.
  17. Цветные 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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  18. [Мод] Исправление сброса профессии персонажей при переподключении к серверу ("слёт профессии") Некоторые администраторы сталкиваются с проблемой, когда получивший профессию персонаж после перезахода в игру снова становится "Новичком", т.е. происходит так называемый "слет" профессии. Данный мод исправляет этот баг. Требования Установленный Загрузчик модов для сервера и клиента (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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  19. [Мод] Полная карта местности для региона Как известно, полную карту имеют только основные регионы (Аскарон, Магический океан и Великий синий океан). Когда игрок нажимает кнопку "Карта" под миникартой, чтобы открыть полную карту местности, клиент отправляет серверу пакет с соответствующим запросом. Сервер читает этот пакет, решает, имеет ли регион, в котором в данный момент находится игрок, полную карту, и отправляет ответ клиенту. Если ответ "положительный", то клиент открывает игроку большую карту. Если "отрицательный", то игрок получает в систему сообщение "Эта местность не имеет полной карты": Данный мод позволяет добавлять полные карты местности для любого региона: Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.fullmap; Версия: 1.0; Автор: V3ct0r; Тип: для сервера (GameServer.exe); Поддерживаемые исполняемые .exe файлы: GAMESERVER_136, GAMESERVER_138. Установка 1) В директории "mods" Вашего GameServer создайте папку "pkodev.mod.fullmap"; 2) Поместите в неё файл DLL-библиотеки мода "pkodev.mod.fullmap.server.<x>.dll" для Вашей версии Game.exe; 3) Поместите в неё файл настроек мода "pkodev.mod.fullmap.cfg" и запишите в него список названий карт, для которых необходимо добавить полную карту местности. Название каждой карты записывается с новой строки: darkswamp garner2 puzzleworld puzzleworld2 Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  20. [Мод] Эффект полета для крыльев Мод позволяет добавлять к любым крыльям (предметам с типом 44) эффект полета. Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.wings; Версия: 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.wings"; 2) Поместите в неё файл DLL-библиотеки мода "pkodev.mod.wings.client.13x_<x>.dll" для Вашей версии Game.exe. 3) Поместите в неё файл настроек мода "pkodev.mod.wings.cfg" и запишите в него список ID крыльев (из ItemInfo.txt) с эффектом полета. Каждый новый ID записывается с новой строки: 935 936 937 Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  21. [Мод] Очистка чатов Мод позволяет администраторам игрового сервера удалять все сообщения в чатах у игроков (местный, мир, торг, отряд, гильдия, ЛС, лагерь). Для этого на стороне сервера для GameServer реализована LUA-функция ClearChat(role), в которую передается дескриптор персонажа, которым управляет администратор. Таким образом, можно, к примеру, реализовать GM-команду, которая будет очищать чаты (при наличии функций HandleChat() и GetGmLv() в GameServer.exe). function HandleChat(role, msg) if (msg == "&clearchat") then if (GetGmLv(role) == 99) then ClearChat(role) else SystemNotice(role, "Not enough access!") end return 0 end return 1 end Недостатком мода является то, что он удаляет сразу все чаты без возможности указания конкретных каналов. Т.е. вместе с общими каналами (мир, торг, местный) будут так же очищены и каналы с сообщениями в гильдию, отряд, лагерь и ЛС. Так же следует помнить, что игрок может удалить .dll библиотеку мода из клиента и чаты перестанут очищаться по команде от сервера. Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.clearchat; Версия: 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.clearchat.client.13x_<ID>.dll" для Вашей версии Game.exe в папку "mods" игрового клиента. Сервер: 1) Создайте файл с названием "pkodev.mod.clearchat.lua" в следующей директории сервера: \GameServer\resource\script\calculate\mods 2) Запишите в него следующий код: -- Print a log print("Loading pkodev.mod.clearchat.lua") -- Clear all chats function ClearChat(role) -- Get moderator's name local name = GetChaDefaultName(TurnToCha(role)) -- Send system command Notice("{system:clearchat}") -- Send message to all players Notice(string.format("Chats have been cleared by moderator [%s]!", name)) end 3) Подключите файл "pkodev.mod.clearchat.lua" в начале файла SkillEffect.lua (\GameServer\resource\script\calculate) : dofile(GetResPath("script\\calculate\\mods\\pkodev.mod.clearchat.lua")) 4) Реализуйте сценарий работы функции ClearChat() для очистки чатов по Вашему усмотрению. Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  22. [Мод] Медали (ожерелья) со званиями Модификация позволяет создавать медали (ожерелья) с различными званиями, которые отображаются в скобках перед именем персонажа (см. скриншот). Так же такие ожерелья позволяют менять цвет имен персонажей. Текст, цвет звания и цвет имени персонажей указываются в ItemInfo.txt для предметов с типом 25 (ожерелье). 1) Текст звания указывается в описании предмета. Максимальная длина звания составляет 15 символов. 2) Цвет звания в формате FFRRGGBB - вместо модели на Ланса в 5-ом поле. 3) Цвет имени персонажа в формате FFRRGGBB - вместо модели на Карциза в 6-ом поле. Примеры медалей со званиями: XXXX Medal 1 (Red Admin) l0005 10130005 FFFF0000 0 0 0 0 0 25 0 0 0 0 0 1 1 1 1 1 1 32 -1 1 -1 0 0 5 -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 0,1000 10000,10000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 Admin XXXX Medal 2 (Green maindev) l0005 10130005 FF00FF00 0 0 0 0 0 25 0 0 0 0 0 1 1 1 1 1 1 32 -1 1 -1 0 0 5 -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 0,1000 10000,10000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 maindev XXXX Medal 3 (Blue PkoDEV) l0005 10130005 FF0000FF 0 0 0 0 0 25 0 0 0 0 0 1 1 1 1 1 1 32 -1 1 -1 0 0 5 -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 0,1000 10000,10000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 PkoDEV Пример ожерелья со званием и цветным именем: XXXX Medal 2 l0005 10130005 FF00FF00 FFFF8000 0 0 0 0 25 0 0 0 0 0 1 1 1 1 1 1 32 -1 1 -1 0 0 5 -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 0,1000 10000,10000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 PKOdev.NET Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.title; Версия: 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.title"; 2) Поместите в неё файл DLL-библиотеки мода "pkodev.mod.title.13x_<ID>.dll" для Вашей версии Game.exe; 3) Добавьте в ItemInfo.txt сервера и клиента новые медали (ожерелья) со званиями в соответствии с примером из шапки темы. Скомпилируйте ItemInfo.txt для клиента. Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  23. [Мод] Отображение времени отката ("кулдауна") умений Мод показывает время на иконках умений, которое осталось до полного восстановления (см. анимацию выше). Основан на коде @Snre3n, опубликованном в теме "Source Code Features/Concepts Releases": Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.cooldown; Версия: 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.cooldown.client.13x_<ID>.dll" для Вашей версии Game.exe в папку "mods" игрового клиента. Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  24. [Мод] Отображение времени отклика ("пинг") на форме выбора сервера Рядом с каждым сервером на форме выбора сервера отображается время его отклика ("пинг"). Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.ping; Версия: 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.ping.client.13x_<ID>.dll" для Вашей версии Game.exe в папку "mods" игрового клиента. При необходимости настройте GUI-скрипты формы выбора сервера "frmServer" (файл "\scripts\lua\forms\login.clu"). Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  25. Шаблон проекта мода PKOdev.NET loader для Visual Studio 2019 Community Выкладываю шаблонный проект под Visual Studio 2019 Community, который предназначен для разработки модов для PKOdev.NET mod loader на языке программирования C++. Проект включает в себя 1) Структуру файлов (address.h, pointer.h, hook.h, structure.h, dllmain.cpp); В файл address.h записываются адреса импортируемых функций и объектов из .exe файла. В данном файле также определены пространства имен для соответствующих версий .exe файла, в пределах которых необходимо указать адреса для каждой версии исполняемого файла. Все адреса должны находится в пространстве имен address. namespace address { // Game.exe 2 (1252912474) namespace GAME_13X_2 { // void CHeadSay::Render(D3DXVECTOR3& pos) const unsigned int CHeadSay__Render = 0x00470770; } // Game.exe 4 (1585009030) namespace GAME_13X_4 { // void CHeadSay::Render(D3DXVECTOR3& pos) const unsigned int CHeadSay__Render = 0x004707D0; } } В файле pointer.h находятся указатели на импортируемые функции из .exe файла. Все указатели должны находиться в пространстве имен pointer. namespace pointer { // void CHeadSay::Render(D3DXVECTOR3& pos) typedef void(__thiscall* CHeadSay__Render__Ptr)(void*, D3DXVECTOR3&); CHeadSay__Render__Ptr CHeadSay__Render = (CHeadSay__Render__Ptr)(void*)(address::MOD_EXE_VERSION::CHeadSay__Render); } В файле hook.h находятся определения функций-перехватчиков оригинальных функций из .exe файла. Все перехватчики должны находиться в пространстве имен hook. namespace hook { // void CHeadSay::Render(D3DXVECTOR3& pos) void __fastcall CHeadSay__Render(void* This, void* NotUsed, D3DXVECTOR3& Pos); } В файле structure.h находятся различные структуры данных, необходимые для работы мода. // 3D vector structure struct D3DXVECTOR3 { float x; float y; float z; }; В файле dllmain.cpp находятся точка входа, реализация функций интерфейса загрузчика, реализация функций-перехватчиков и непосредственно код мода. 2) Интерфейс загрузчика модов (loader.h) и его реализацию. 3) Конфигурации сборки для всех поддерживаемых .exe файлов с соответствующими определениями препроцессора. 4) Библиотеку MS Detours для перехвата вызова функций в .exe файлах. DetourAttach(&(PVOID&)pkodev::pointer::CHeadSay__Render, pkodev::hook::CHeadSay__Render); Как настроить проект 1) Переименуйте файлы проекта (pkodev.mod.dummy) на название Вашего мода; 2) Удалите ненужные конфигурации сборки; 3) Для каждой конфигурации сборки укажите название выходной DLL-библиотеки мода (Target Name); 4) Для каждой конфигурации сборки укажите определения препроцессора MOD_NAME, MOD_AUTHOR и MOD_VERSION. Скачать Шаблон проекта мода для Visual Studio 2019 Community (C++).
×
×
  • Create New...