Jump to content

Leaderboard


Popular Content

Showing content with the highest reputation since 07/05/2019 in all areas

  1. 16 points
    Hello friends! There have been changes in the system of user groups: 1) "Moderators" group is returned. The forum is currently recruiting moderators; 2) "Community" group no longer has moderation rights. User groups have been updated: Moderators These guys are keeping order on the forum: @Snowfall, @Dan, @patrick13. Server administrator They are currently have game projects and thanks to them our game lives on: @Faller, @estrangulador, @Fisal Moha, @Phai, @Sultan, @Hard Wood, @xEvo7, @emofc, @Дракан, @Buccaneers Online, @V1k1NGO, @noanshadow, @luamaster, @Pirate X-Z, @NobleNutz, @[email protected], @Kraken Online, @Awatawa, @K1D0, @Chudik, @Kara Online, @HappinessMAPKO, @Tempest, @Vehd, @kiberhack, @Dimasik, @jordan. Community Made a great contribution to the development of the forum and the community as a whole: @Graf, @BETEP/macs509, @Fomin, @NMS3RR, @1g0rS1lv4, @small666, @yagura2k, @Snre3n, @wolfenx, @Duduf, @Angelix, @aleksandr, @mkhzaleh, @Lua, @patrick13, @Danny, @Eviles, @Greaux, @Engrain, @GustavoHMA, @cpworkerz, @xSeth, @e1mer, @Tera, @Kovu, @Spidpex, @Madwizard, @DangThao, @Ximboliex, @Jap, @Totoka, @Billy, @Foxseiz, @Rinor, @Vasil, @FapFap, @Shako, @blazi10, @Lucky, @Darling, @Home, @Nobre, @Jones, @Onioni, @OldHero, @Anthoni, @x3w0r, @flamyman1412, @BlackBarba, @J0k3r, @iZae, @RedMAN, @saa0d, @DevMorgan, @Knight, @XXD, @Xeon, @Wrexor, @deguix, @Blanquitoh, @mangojkee, @Gamez Pirates, @Masuka00, @Silfro, @MonkeyCode. Thank you for attention!
  2. 14 points
    Установка сервера Пиратии (Tales of Pirates, Pirate King Online) Всем привет! В данном гайде я расскажу как установить и настроить сервер Пиратии шаг за шагом на примере серверных файлов версии 1.3х. Под версией 1.3x подразумеваются самые распространенные версии игры, которые сегодня используются большинством проектов: 1.35, 1.36, 1.38 и 1.39. Это деление условно и все версии 1.3x совместимы между собой. Например, клиент версии 1.36 может работать с сервером версии 1.39. Также существуют серверные файлы версии 2.x и скомпилированные из исходных кодов, например, файлы Corsairs Online. Их так же можно установить и настроить следуя настоящей инструкции, но процесс установки может в определенной мере отличаться. Гайд предназначен для новичков в нашем Сообществе администраторов и разработчиков серверов Пиратии и содержит подробную инструкцию с изображениями, которая позволит установить сервер с нуля. По прочтении статьи читатель сможет запустить свой игровой мир и войти в него используя игровой клиент. Содержание гайда: 1. Вам понадобится; 2. Архитектура сервера Пиратии; 3. Установка Microsoft SQL Server и SQL Server Management Studio; 4. Установка и настройка серверных файлов; 5. Запуск сервера; 6. Проверка соединения с игровым сервером; 7. Остановка игрового сервера; 8. Подключение игрового клиента к серверу; 9. Распространенные ошибки и их исправление. Приступим к установке и настройке нового игрового мира. Первым шагом определим инструменты, которые понадобятся для успешного выполнения поставленной задачи. 1. Вам понадобится 0. Теоретическая подготовка. Основы работы с операционной системой семейства Windows, базовые знания архитектуры "клиент-сервер", понимание терминов "База данных (БД)" и "Система управления базами данных (СУБД)". Поскольку те или иные программы, а также сообщения об ошибках могут быть на английском языке, то понадобится знание английского языка начального уровня. 1. Компьютер под управлением операционной системы семейства Windows (серверные редакции Server и пользовательские XP/Vista/7/8/10). Исполняемые файлы сервера скомпилированы под архитектуру x86 (Win32), поэтому система должна поддерживать 32-разрядный режим работы. К аппаратной части предъявляются следующие требования: многоядерный процессор с частотой от 2.0 ГГц; от 4 Гб оперативной памяти; 2 Гб свободного места на диске для серверных файлов, баз данных и файлов журнала ("логов"); сетевое подключение со скоростью от 10 Мбит/с на 1000 клиентов. Таким образом, исходя из современных реалий, можно сделать вывод, что игровой сервер предъявляет невысокие требования к железу, поэтому вышеприведенные характеристики носят скорее рекомендательный и условный характер. Например, Вы можете запустить игровой сервер и на более слабом компьютере, но это, в свою очередь, может привести к замедлению его работы, а значит и к задержкам у игроков, что отразится на комфорте процесса игры. Если же Вы планируете запустить сервер только для себя (одиночная игра, проведение различных тестов, написание скриптов), то Вам не нужно заботиться о производительности сервера, а требования к железу будут менее строгими. 2. Система управления базами данных (СУБД) Microsoft SQL Server. Именно такую СУБД выбрали разработчики игрового сервера Пиратии для хранения состояния игрового процесса: учетных записей пользователей, персонажей, гильдий, кораблей и других объектов. Существует много версий Microsoft SQL Server. В гайде я буду использовать бесплатную версию Microsoft SQL Server 2017 Express, которую можно скачать с официального сайта Microsoft. Несмотря на ограничения Express редакции, её возможностей вполне хватит для обеспечения работы игрового сервера. Для управления SQL-сервером Вам понадобится SQL Server Management Studio, который также можно найти на сайте Microsoft. 3. Серверные файлы ("сборка"). Это приложения, файлы и скрипты, которые служат для создания и поддержания игрового процесса. В минимальной конфигурации должны включать в себя серверные приложения AccountServer.exe, GroupServer.exe, GameServer.exe и GateServer.exe. Функции и задачи данных приложений будут рассмотрены далее. Найти сборку сервера можно в разделе "Сборки серверов" на нашем форуме или в Архиве полезных файлов для сервера и клиента. В качестве примера я буду использовать серверные файлы Pirate King Online 1.38. 4. Базы данных. В соответствии с пунктом (2) определяют структуру хранения игровых объектов на диске и используются игровым сервером для хранения информации о состоянии игрового мира. Представлены файлами GameDB_Data.mdf, GameDB_log.ldf, AccountServer_Data.mdf и AccountServer_log.ldf. Как правило, поставляются вместе с серверными файлами. Если в скачанных Вами серверных файлах нет баз данных, то их можно найти в другой сборке, либо в Архиве полезных файлов для сервера и клиента. 5. Генератор паролей для .cfg. Кроме прочих настроек, в конфигурационных файлах сервера (.cfg) указываются данные для подключения к SQL-серверу, в том числе и пароли пользователей баз данных GameDB и AccountServer. В целях безопасности пароли в конфигурационных файлах должны быть зашифрованы специальным алгоритмом, для чего служит данная программа. 6. Текстовый редактор для редактирования конфигурационных файлов сервера. Подойдет стандартный блокнот (notepad.exe), но я рекомендую программу Notepad++, которая на порядок удобнее обычного блокнота. 7. Игровой клиент для подключения к установленному игровому серверу и его тестирования. Вы можете подобрать игровой клиент к выбранной сборке сервера в теме "Официальные клиенты" на нашем форуме. 8. IP Changer. Перед подключением к серверу игровому клиенту необходимо задать сетевой адрес по которому подключаться. Данная программа предназначена для настройки адреса игрового сервера в клиенте. 9. Программа для создания аккаунтов. Для того, чтобы войти в игровой мир, Вам нужна учетная запись игрока или администратора, которую можно зарегистрировать с помощью приведенной программы. После того, как мы сформулировали основные требования и определили необходимые инструменты для установки сервера Пиратии и подключения к нему клиента, проведем небольшой экскурс по архитектуре игрового сервера, чтобы получить понимание процесса его настройки и запуска в будущем. 2. Архитектура сервера Пиратии Архитектура сервера приведена на рисунке ниже. Она позволяет понять как в общем случае устроены серверные файлы и каковы взаимосвязи между серверным программным обеспечением: что в него входит, что является сервером и что является клиентом по отношению друг к другу. Как видно из схемы в состав системы входят AccountServer, GameServer, GroupServer, GateServer, Microsoft SQL Server с базами данных AccountServer и GameDB, а также игровой клиент (Client). Всё клиент-серверное взаимодействие между приложениями осуществляется с помощью сетевых пакетов по протоколу TCP. Изучим для чего нужен каждый элемент системы. 1. Игровой клиент (Client) - приложение с которым взаимодействует конечный пользователь (игрок). Визуализирует состояние игрового мира вокруг персонажа игрока, полученное от сервера через сеть Интернет. Под визуализацией понимается отрисовка игровой карты с объектами на ней (например, суша и море, деревья, здания, дороги), персонажей других игроков, монстров, неигровых персонажей (NPC) и так далее - всего того, что на своем мониторе видит игрок в процессе игры. Кроме визуализации клиент посредством графического интерфейса пользователя (GUI) предоставляет последнему возможность влиять на состояние игрового мира и процесс игры с помощью клавиатуры и мыши, отправляя на сервер различные действия, например, создание персонажа, перемещение персонажа в игровом мире, атака монстров, взаимодействие с NPC, отправка сообщений в чат и другие действия, которые разрешены на сервере правилами игры. Для пользователя клиент является игрой в обычном понимании. В рассматриваемой системе игровых клиентов может быть от 1 до нескольких тысяч. Подключается через 1973 порт к GateServer. 2. GateServer - принимает входящие соединения через 1973 порт от игровых клиентов и выступает в роли шлюза, через который игровой клиент взаимодействует с GroupServer, AccountServer и GameServer. Является сервером на 1971 порту по отношению к GameServer и клиентом на 1975 порту по отношению к GroupServer. Для распределения нагрузки в системе может быть несколько GateServer. Например, можно настроить сервер таким образом, что игроки из России подключаются к GateServer, который расположен в Москве, а игроки из Европы подключается к GateServer, который запущен на хостинге в дата-центре, расположенном в Германии, что позволит снизить задержки (пинг) при передаче сетевых пакетов от клиента на сервер и обратно. В целях безопасности игрового процесса GateServer шифрует весь сетевой трафик, который передается между сервером и клиентами. 3. GroupServer - отвечает за создание и удаление персонажей с аккаунта пользователя, систему друзей и отрядов, общение между игроками в чатах (мировой, торговый, отряд, гильдия, ЛС) и диалогах. GroupServer также участвует в процессе аутентификации игроков на сервере, передавая пакеты аутентификации, полученные от GateServer, далее в AccountServer. Является сервером на 1975 порту по отношению GateServer и клиентом по отношению к AccountServer на 1978 порту. Кроме того, подключается в роли клиента через 1433 порт к Microsoft SQL Server для работы с базой данных GameDB. Как и в случае с GateServer, в системе может быть несколько GroupServer для распределения нагрузки, но, как правило, в реальных проектах используется один экземпляр GroupServer. 4. AccountServer - нужен для аутентификации игроков на сервере путем сравнения полученных от пользователя логина и пароля с соответствующими логином и паролем в базе данных. Если игрок ввел верные логин и пароль, то он допускается к игре на сервере, в противном случае получает сообщение об ошибке авторизации и отключается от сервера. Является сервером по отношению к GroupServer на порту 1978. Работает с базой данных AccountServer, поэтому является клиентом Microsoft SQL Server на порту 1433. Как и в случае с GateServer, в системе может быть несколько AccountServer для распределения нагрузки, но обычно в реальных проектах используется один экземпляр AccountServer. 5. GameServer - основной игровой сервер, где осуществляется вся логика игры. Обеспечивает игровой процесс и синхронизацию состояния игрового мира с игровыми клиентами: является клиентом на 1971 порту по отношению к GateServer, через который принимает действия от игровых клиентов, проверяет их корректность, и, в случае соблюдения установленных правил игры, вносит изменения в состояние игрового мира, после чего оповещает об этом все остальные игровые клиенты. Параллельно с обработкой действий игровых клиентов, с определенной частотой (обычно 20 Гц) обновляет игровой мир, например, для создания погодных явлений или управления монстрами с помощью искусственного интеллекта (AI). Для сохранения состояния игрового мира использует базу данных GameDB и является клиентом Microsoft SQL Server на порту 1433. GameServer является самым высоконагруженным элементом в системе и потребляет больше всего вычислительных ресурсов и памяти, поэтому в реальных проектах нагрузка распределяется между от 3 до 5 GameServer. В игре существует три основные локации: Аскарон, Магический Океан и Великий Синий Океан размером 4096 x 4096 условных единиц - это самые большие локации в игре. Помимо того факта, что они будут занимать много памяти в ОЗУ, в этих локациях одновременно могут быть тысячи игроков, монстров и NPC, следовательно, целесообразно распределить нагрузку между несколькими экземплярами GameServer и запускать основные локации по одной вместе с частью второстепенных на разных GameServer. 6. Microsoft SQL Server и базы данных AccountServer, GameDB - Microsoft SQL Server является механизмом, с помощью которого AccountServer работает с одноименной базой данных AccountServer, а GameServer и GroupServer работают с базой данных GameDB, используя язык SQL. Является сервером на порту 1433 по отношению к AccountServer, GameServer и GroupServer. В базе данных AccountServer хранятся игровые аккаунты и различная служебная информация, например, логи. В базе данных GameDB хранятся персонажи, предметы, гильдии, корабли, списки друзей и менторов, дублируется список аккаунтов для их связи с персонажами, кроме того, каждому аккаунту здесь присваивается уровень GM и секретный код, так же присутствует и служебная информация. Следует отметить, что рассмотренная архитектура является самой распространенной и применяется в большинстве проектов, но Вы можете перестраивать её под свои нужды: 1. Вы можете изменить стандартные порты 1433, 1971, 1973, 1975, 1978 на любые другие не зарезервированные порты; 2. Вы можете переименовывать базы данных AccountServer и GameDB (потребуется редактирование некоторых исполняемых файлов сервера); 3. Вы можете запускать несколько экземпляров Microsoft SQL Server, GateServer, GroupServer, AccountServer, GameServer и настраивать взаимосвязи между ними в целях распределения нагрузки и повышения производительности игрового процесса; 4. В систему могут быть добавлены новые элементы, например, сервер встроенного в клиент магазина игровых предметов (IGS), сервер для фильтрации исходящих от клиентов пакетов (FilterServer), сервер "оффлайн" ларьков (StallServer), который позволяет игрокам торговать в ларьках не находясь в игре. Теперь, когда Вы получили представление об архитектуре и основных элементах сервера Пиратии, приступим к его установке и настройке. Начнем с установки Microsoft SQL Server. 3. Установка Microsoft SQL Server и SQL Server Management Studio 3.1 Установка Microsoft SQL Server Перейдите на страницу загрузки Microsoft SQL Server 2017 Express и нажмите кнопку "Скачать". На Ваш компьютер будет загружен дистрибутив SQLServer2017-SSEI-Expr.exe. Запустите дистрибутив SQLServer2017-SSEI-Expr.exe от имени администратора и выберите тип установки "Пользовательский". Выберите директорию на диске, куда будет загружен пакет установки, необходимый для установки экземпляра Microsoft SQL Server, и нажмите кнопку "Установить". Начнется процесс загрузки и распаковки пакета установки. Дождитесь его окончания. После загрузки и распаковки пакета установки должно открыться окно "Центр установки SQL Server". Если оно по какой-либо причине не открылось, перейдите в директорию, которую Вы указали в процессе загрузки пакета установки (расположение носителя), и запустите центр установки SQL Server вручную (файл SETUP.exe). В окне центра установки SQL Server на вкладке "Установка" выберите пункт меню "Новая установка изолированного экземпляра SQL Server или добавление компонентов к существующей установке". Начнется процесс установки экземпляра SQL Server 2017. Примите условия лицензионного соглашения и нажмите кнопку "Далее". Убедитесь, что в системе соблюдены все условия для успешной установки SQL Server на вкладке "Глобальные правила", после чего нажмите кнопку "Далее". При возникновении проблем примите меры для их устранения и продолжите установку. На странице "Центр обновления Майкрософт" по Вашему усмотрению установите флажок "Использовать Центр обновления Майкрософт для проверки наличия обновлений" и нажмите кнопку "Далее". Программа установки проверит наличие обновлений и при необходимости их установит. Далее программа установки еще раз проведет диагностику системы на наличие потенциальных проблем, которые могут возникнуть в процессе установки Microsoft SQL Server 2017. Убедитесь, что потенциальных проблем не обнаружено. Правило "Брандмауэр Windows" может быть в состоянии "Предупреждение", если включен Брандмауэр Windows. Для продолжения установки это не критично, но могут возникнуть проблемы в будущем, если Вы захотите обеспечить удаленный доступ к экземпляру SQL Server. Чтобы их избежать, Вам нужно будет открыть порт для подключения к SQL Server (по умолчанию 1433) в фаерволе Windows. Нажмите кнопку "Далее". На странице "Выбор компонентов" отметьте только компонент "Службы ядра СУБД" и укажите корневой каталог экземпляра. Нажмите кнопку "Далее". Затем Вам будет предложено указать имя и идентификатор экземпляра SQL Server. Выберите флажок "Экземпляр по умолчанию", а в поле "Идентификатор экземпляра" введите название экземпляра SQL Server по Вашему усмотрению. Нажмите кнопку "Далее". Страницу "Конфигурация сервера" оставьте без изменений и нажмите кнопку "Далее". При настройке ядра СУБД выберите флажок "Режим проверки подлинности Windows" и убедитесь, что в список администраторов SQL Server добавлен текущий пользователь. На остальных вкладках страницы "Настройка ядра СУБД" изменения не требуются. Нажмите кнопку "Далее". Далее начнется процесс копирования файлов, требующихся для работы экземпляра SQL Server, и их конфигурирование. Дождитесь окончания данного процесса. В результате экземпляр SQL Server должен быть успешно установлен. Закройте Программу установки SQL Server 2017. 3.2 Установка SQL Server Management Studio Перейдите на страницу загрузки Microsoft SQL Server Management Studio и нажмите ссылку "Скачайте SQL Server Management Studio (SSMS)". На Ваш компьютер будет загружен дистрибутив SSMS-Setup-RUS.exe. Запустите дистрибутив SSMS-Setup-RUS.exe от имени администратора. Появится окно программы установки среды Microsoft SQL Server Management Studio. Выберите директорию, в которую будет установлена среда, и нажмите кнопку "Установить". Начнется процесс загрузки и установки требуемых пакетов и компонентов, а также непосредственная установка SQL Server Management Studio. Дождитесь окончания процесса. После завершения процесса необходимо перезагрузить компьютер. 3.3 Проверка работоспособности Microsoft SQL Server и его настройка После перезагрузки компьютера установленный экземпляр SQL Server должен автоматически начать работу. Запустите программу Microsoft SQL Server Management Studio 18 от имени администратора и подключитесь ко вновь установленному экземпляру используя проверку подлинности Windows. Соединение должно быть успешно установлено, и в окне "Обозреватель объектов" появится текущий экземпляр SQL Server. Запомните название текущего экземпляра (1), оно понадобится далее при настройке конфигурационных файлов сервера (.cfg). Название экземпляра SQL Server: DESKTOP-XXXXXXX Кликните по серверу правой кнопкой мыши и в контекстном меню выберите пункт "Свойства". В появившемся окне "Свойства сервера" перейдите на страницу "Безопасность" и в группе "Серверная проверка подлинности" выберите "Проверка подлинности SQL Server и Windows". Нажмите кнопку "ОК". Для того, чтобы произведенные изменения вступили в силу, необходимо перезапустить SQL Server. Для этого снова кликните по серверу правой кнопкой мыши в окне "Обозреватель объектов" и в контекстном меню выберите пункт "Перезапустить". На вопрос о перезапуске службы SQL Server ответьте "Да". Экземпляр сервера будет перезапущен. Установка и настройка Microsoft SQL Server завершена. Далее установим и настроим серверные файлы игры. 4. Установка и настройка серверных файлов Выбор серверных файлов Скачайте интересующие Вас серверные файлы на Ваш компьютер и распакуйте их в любое удобное для Вас место на диске. Прикрепление баз данных к Microsoft SQL Server Вместе с серверными файлами должны поставляться базы данных AccountServer и GameDB. Если в загруженной Вами сборке сервера базы данных не обнаружены, то найдите их в другой сборке или в Архиве полезных файлов для сервера и клиента. Эти базы данных необходимо прикрепить к ранее установленному экземпляру SQL Server перед настройкой и запуском исполняемых файлов сервера Пиратии. Для этого запустите программу Microsoft SQL Server Management Studio 18 от имени администратора и подключитесь к Вашему экземпляру SQL Server используя проверку подлинности Windows. В обозревателе объектов кликните правкой кнопкой по папке "Базы данных" и в контекстном меню выберите задачу "Присоединить...". Появится окно "Присоединение баз данных", в котором Вам необходимо по очереди указать пути до баз данных AccountServer и GameDB (1), убедиться, что очередная база данных добавлена в список для присоединения (2) и нажать кнопку "ОК" (3). В папке "Базы данных" текущего экземпляра SQL Server в окне "Обозреватель объектов" должны появиться AccountServer и GameDB. Создание пользователей для баз данных Теперь необходимо создать пользователей баз данных AccountServer и GameDB для приложений AccountServer, GroupServer и GameServer. С помощью этих пользователей GroupServer и GameServer будут подключаться к Microsoft SQL Server и работать с базой данных GameDB, а AccountServer будет работать с одноименной базой данных AccountServer. В рамках гайда создадим двух пользователей: одного для базы данных GameDB, второго для базы данных AccountServer. Из-за особенностей шифрования паролей пользователей баз данных в конфигурационных файлах сервера Пиратии, пароль каждого пользователя должен быть длиной ровно 9 символов. Придумаем данные пользователей: GameDB База данных: GameDB Логин: PKODev_Game Пароль: pkodevnet AccountServer База данных: AccountServer Логин: PKODev_Account Пароль: netpkodev Далее по очереди добавим этих пользователей в экземпляр SQL Server и делегируем им доступ к соответствующим базам данных. Кликните правой кнопкой мыши по папке "Безопасность" текущего экземпляра SQL Server в окне "Обозреватель объектов" и в контекстном меню выберите команду "Создать - Вход..." (либо папка "Имена для входа" и команда "Создать имя для входа..."). В окне "Создание имени для входа" на странице "Общие" введите имя пользователя (1), выберите переключатель "Проверка подлинности SQL Server" (2), введите пароль и подтверждение пароля (3), снимите флажок "Требовать использование политики паролей" (4). Выберите базу данных по умолчанию: для пользователя PKODev_Game база данных GameDB и для пользователя PKODev_Account база данных AccountServer (5). Далее перейдите на страницу "Сопоставление пользователей" (6). На странице "Сопоставление пользователей" отметьте флажком базу данных GameDB для пользователя PKODev_Game или базу данных AccountServer для пользователя PKODev_Account (1). В списке "Членство в роли базы данных для: GameDB (AccountServer)" снимите флажок с db_owner (2) и установите флажки db_datawriter, db_datareader, db_ddladmin (3). На этом создание очередного пользователя завершено. Нажмите кнопку "ОК" (4). В подпапке "Имена для входа" папки "Безопасность" текущего экземпляра SQL Server в окне обозревателя объектов должны появиться два новых пользователя: PKODev_Game и PKODev_Account. В результате мы прикрепили базы данных GameDB и AccountServer к экземпляру SQL Server и создали для них пользователей PKODev_Game и PKODev_Account соответственно. Сейчас сервер Пиратии может работать с базами данных, поэтому приступаем к его настройке. Шифрование паролей пользователей баз данных для конфигурационных файлов (.cfg) сервера Как было отмечено выше, пароли пользователей баз данных указываются в конфигурационных файлах сервера (.cfg) в зашифрованном виде, соответственно их необходимо зашифровать. Скачайте Генератор паролей для .cfg, распакуйте загруженный архив и откройте файл passgen.ini в любом текстовом редакторе. Присвойте параметру "pass" пароль для пользователя базы данных GameDB и сохраните файл: pass=pkodevnet Запустите приложение passgen.exe. В консольном окне Вы получите зашифрованный пароль. Скопируйте зашифрованный пароль и сохраните его в текстовом файле. Он понадобится далее в процессе настройки конфигурационных файлов игрового сервера. Повторите операцию шифрования пароля для пользователя базы данных AccountServer: pass=netpkodev В итоге мы получили данные серверного программного обеспечения Пиратии для подключения к Microsoft SQL Server: Название экземпляра SQL Server: DESKTOP-XXXXXXX База данных: GameDB Пользователь: PKODev_Game Зашифрованный пароль для .cfg: SUOh8nJKCe125gImJdapNA== Название экземпляра SQL Server: DESKTOP-XXXXXXX База данных: AccountServer Пользователь: PKODev_Account Зашифрованный пароль для .cfg: 7y2CBBN+se+T5+9Lzp7IIw== Настройка AccountServer Начнем настройку игрового сервера с настройки AccountServer. Откройте конфигурационный файл AccountServer.cfg в любом текстовом редакторе. Найдите секцию db, которая отвечает за подключение к Microsoft SQL Server, и заполните соответствующие параметры: dbserver - адрес или название экземпляра Micrososft SQL Server; db - название базы данных для хранения информации об игровых аккаунтах. По умолчанию AccountServer; userid - Логин пользователя базы данных AccountServer; passwd - Зашифрованный пароль пользователя базы данных AccountServer. [db] dbserver = DESKTOP-XXXXXXX db = AccountServer userid = PKODev_Account passwd = 7y2CBBN+se+T5+9Lzp7IIw== В секции net укажите адрес и порт, на которых AccountServer будет принимать входящие соединения от GroupServer: listen_ip - IP-адрес AccountServer по отношению к GroupServer. Если AccountServer и GroupServer будут запускаться на одном и том же компьютере, то введите IP-адрес 127.0.0.1; listen_port - Сетевой TCP порт, на котором AccountServer будет принимать входящие соединения от GroupServer. По умолчанию 1978. [net] listen_port = 1978 listen_ip = 127.0.0.1 Сохраните файл AccountServer.cfg. Более изменений данного файла не требуется. Настройка GroupServer Откройте конфигурационный файл GroupServer.cfg в любом текстовом редакторе. По аналогии с AccountServer.cfg в данном конфигурационном файле необходимо настроить подключение к серверу баз данных. Для этого используется секция Database со следующими параметрами: IP - адрес или название экземпляра Micrososft SQL Server; DB - название базы данных для хранения информации о состоянии игрового мира. По умолчанию GameDB; Login - Логин пользователя базы данных GameDB; Password - Зашифрованный пароль пользователя базы данных GameDB. [Database] IP = DESKTOP-XXXXXXX DB = GameDB Login = PKODev_Game Password = SUOh8nJKCe125gImJdapNA== Настройте параметры подключения GroupServer к AccountServer в секции AccountServer: IP - IP-адрес AccountServer; Port - Сетевой TCP порт AccountServer. [AccountServer] IP = 127.0.0.1 Port = 1978 Как Вы помните, GroupServer является сервером по отношению к GateServer. В секции Main указываются адрес и порт, через которые GroupServer будет принимать входящие соединения от GateServer: Listen_IP - IP-адрес GroupServer по отношению к GateServer. Если GroupServer и GateServer будут запускаться на одном и том же компьютере, то введите IP-адрес 127.0.0.1; Listen_Port - Сетевой TCP порт, на котором GroupServer будет принимать входящие соединения от GateServer . По умолчанию 1975. [Main] Listen_Port = 1975 Listen_IP = 127.0.0.1 Сохраните файл GroupServer.cfg. Настройка GroupServer завершена. Настройка GateServer Откройте конфигурационный файл GateServer.cfg в любом текстовом редакторе. Настройте параметры подключения GateServer к GroupServer в секции GroupServer: IP - IP-адрес GroupServer; Port - Сетевой TCP порт GroupServer. [GroupServer] IP = 127.0.0.1 Port = 1975 В секции ToClient необходимо указать параметры подключения игровых клиентов к GateServer: IP - IP-адрес GateServer и соответственно адрес Вашего сервера, через который будут подключаться игровые клиенты (игроки). Введите адрес 0.0.0.0, который обозначает все IP-адреса данного компьютера. Например, к серверу можно будет подключиться одновременно через локальный адрес 127.0.0.1, локальную сеть 192.168.0.99 и внешний IP-адрес 54.36.6.113 через сеть Интернет (адреса выдуманы для примера); Port - Сетевой TCP порт, на котором GateServer будет принимать входящие соединения от игровых клиентов, то есть внешний порт Вашего сервера. По умолчанию 1973. Данный порт должен быть открыт в Брандмауэре Windows (и иных программах-межсетевых экранах), а также на стороне Вашего Интернет-провайдера или поставщика услуг хостинга. Если Ваш компьютер подключен к Интернету через маршрутизатор, то в маршрутизаторе необходимо пробросить внешний порт на Ваш компьютер для доступа к игровому серверу из сети Интернет. CommEncrypt - параметр, который отвечает за шифрование входящего и исходящего трафика, то есть сетевых пакетов данных, которые передаются от GateServer к игровым клиентам и от игровых клиентов к GateServer. При значении 1 шифрование включено, при значении 0 - выключено. Рекомендуется включить шифрование для повышения уровня защищенности сервера по отношению к различным вредоносным программам (боты, программы для редактирования и флуда пакетами типа WPE Pro/RPE, твики позволяющие отдельным игрокам получать преимущество над другими и так далее). [ToClient] IP = 0.0.0.0 Port = 1973 CommEncrypt = 1 Настройте адрес и порт, через которые GateServer будет принимать входящие соединения от GameServer в секции ToGameServer: IP - IP-адрес GateServer по отношению к GameServer. Если GateServer и GameServerбудут запускаться на одном и том же компьютере, то введите IP-адрес 127.0.0.1; Port - Сетевой TCP порт, на котором GateServer будет принимать входящие соединения от GameServer. По умолчанию 1971. [ToGameServer] IP = 127.0.0.1 Port = 1971 В секции Main в параметре Version укажите версию клиента, которая допускается для подключения к серверу. На стороне клиента данная версия "зашита" в Game.exe и передается двумя байтами в пакете аутентификации. Самое распространенное значение версии клиента 136: [Main] Version = 136 При несовпадении версии сервера и клиента пользователь получит сообщение об ошибке "Неверная версия игры": Сохраните файл GateServer.cfg. Настройка GateServer завершена. Настройка GameServer Первоначальная настройка GameServer сводится к указанию его уникального имени (идентификатора), параметров подключения к GateServer, параметров подключения к Micrososft SQL Server и списка локаций, которые будут запущены на текущем экземпляре GameServer. В начале данного гайда мы сделали вывод, что GameServer должно быть в системе от 3 до 5 экземпляров для распределения между ними нагрузки, поэтому необходимо создать несколько конфигурационных файлов (.cfg) - для каждого экземпляра GameServer отдельный .cfg-файл. В качестве примера создадим 3 конфигурационных файла: GameServer.cfg, GameServer2.cfg и GameServer3.cfg. Чтобы получить новые .cfg-файлы, скопируйте GameServer.cfg два раза и переименуйте копии в GameServer2.cfg и GameServer3.cfg. По очереди настройте каждый конфигурационный файл GameServer используя текстовый редактор. Так как к GateServer подключается более одного GameServer, GateServer необходимо однозначно различать подключенные GameServer для маршрутизации сетевых пакетов данных от игровых клиентов. Для этого у каждого GameServer есть свой уникальный идентификатор, который указывается в секции ID в виде произвольной текстовой строки. Для GameServer.cfg задайте идентификатор, который Вы можете выбрать по своему усмотрению: [ID] name = GameServer00 Для GameServer2.cfg: [ID] name = GameServer01 Для GameServer3.cfg: [ID] name = GameServer02 Далее настройте параметры подключения к GateServer в секции Gate, которые указываются с помощью ключа gate в виде строки "<IP-адрес>, <порт>", где <IP-адрес> это адрес GateServer, а <порт> соответственно порт, на котором GateServer принимает входящие соединения от GameServer: [Gate] gate = 127.0.0.1, 1971 Затем необходимо указать параметры подключения к Microsoft SQL Server в секции DB с помощью следующих параметров: db_ip - адрес или название экземпляра Micrososft SQL Server; db_usr - Логин пользователя базы данных GameDB; db_pass - Зашифрованный пароль пользователя базы данных GameDB. [DB] db_ip = DESKTOP-XXXXXXX db_usr = PKODev_Game db_pass = SUOh8nJKCe125gImJdapNA== Осталось указать список локаций в секции Map, которые будут запущены на текущем экземпляре GameServer. В отличие от игрового наименования локаций, в серверных файлах локации носят кодовые имена. К примеру, Аскарон называется garner, Магический Океан это magicsea, а Великий Синий Океан - darkblue. Очередная локация включается ключом map c новой строки: [Map] map = <локация 1> map = <локация 2> . . . map = <локация N> Например, следующая секция Map запустит карты Аскарон, Арену для командных сражений, Мир демонов и Мир демонов 2: [Map] map = garner map = teampk map = puzzleworld map = puzzleworld2 Полный список наименований игровых локаций, который связывает их с кодовыми именами, приведен ниже: garner - Аскарон magicsea - Магический Океан darkblue - Великий Синий Океан lonetower - Одинокая башня eastgoaf - Серебрянные шахты, заброшенные шахты, логово черного дракона, логово черного дракона 2 secretgarden - Сад Эдель darkswamp - Темная топь abandonedcity - Забытый Город abandonedcity2 - Забытый Город 2 abandonedcity3 - Забытый Город 3 puzzleworld - Мир Демонов puzzleworld2 - Мир Демонов 2 teampk - Арена jialebi - Небеса, база флота, остров сокровищ, остров скелетов garner2 - Серебряный Хаос hell(2-5) - Абаддон (2-5) guildwar - Священная война guildwar2 - Маленькая священная война leiting2 - Мираж Громограда shalan2 - Мираж Шайтана binglang2 - Мираж Ледыни yschurch - Церковь 07xmas - Новогодняя деревня 2007 07xmas2 - Снежная война prisonisland - Тюрьма winterland - Остров Зимы mjing1 - 1-ый край Авроры mjing2 - 2-ой край Авроры mjing3 - 1-ый край Тьмы mjing4 - 2-ой край Тьмы starena* - Арены heilong - Сундук черного дракона darkhouse - Дом тьмы mingyun - Комната судьбы Примечание: карты garner, magicsea и darkblue необходимо запускать на разных экземплярах GameServer. Определите для каждого конфигурационного файла GameServer набор локаций. Локации garner, maigcsea и darkblue в соответствии с примечанием должны быть записаны в разных конфигурационных файлах. Для примера можно настроить конфигурационные файлы таким образом: GameServer.cfg map = garner map = garner2 map = teampk map = lonetower map = puzzleworld map = puzzleworld2 map = eastgoaf map = leiting2 map = shalan2 map = binglang2 GameServer2.cfg [Map] map = magicsea map = abandonedcity map = abandonedcity2 map = abandonedcity3 map = darkswamp map = secretgarden map = guildwar map = guildwar2 GameServer3.cfg [Map] map = darkblue map = jialebi map = hell map = hell2 map = hell3 map = hell4 map = hell5 Сохраните очередной конфигурационный файл (.cfg) GameServer. После внесения изменений в последний конфигурационный файл, настройка экземпляров GameServer окончена. Процесс установки и настройки серверного программного обеспечения Пиратии завершен. Далее приступим к запуску игрового мира. 5. Запуск сервера Общие принципы и порядок запуска исполняемых файлов сервера Поскольку игровой сервер состоит из нескольких исполняемых файлов (AccountServer.exe, GateServer.exe, GameServer.exe, GroupServer.exe), то их необходимо запускать в определенном порядке: 1. AccountServer; 2. Экземпляры GameServer; 3. GroupServer; 4. GateServer. Для запуска AccountServer, GroupServer и GateServer достаточно запустить их исполняемые файлы из проводника. Если таким же образом запустить GameServer, то он будет использовать конфигурационный файл по умолчанию GameServer.cfg, поэтому при запуске очередного экземпляра GameServer необходимо дополнительно указать в параметрах его запуска конфигурационный файл, который необходимо использовать экземпляру для работы: GameServer.exe <Конфигурационный файл> Это можно сделать из Командной строки (cmd.exe), либо с помощью пакетного .bat-файла. Запуск GameServer из Командной строки (cmd.exe) cd C:\PKO Server\GameServer GameServer GameServer2.cfg Данная последовательность команд запустит исполняемый файл GameServer.exe с конфигурационным файлом GameServer2.cfg, которые находятся на диске в директории C:\PKO Server\GameServer. Запуск GameServer с помощью .bat-файла start GameServer.exe GameServer3.cfg Данный .bat-файл запустит исполняемый файл GameServer с конфигурационным файлом GameServer3.cfg при условии, что GameServer.exe и .bat-файл находятся в одной и той же директории. Чтобы запустить сразу несколько экземпляров GameServer с различными конфигурационными файлами, можно написать простой .bat-скрипт: @echo off start GameServer.exe GameServer.cfg start GameServer.exe GameServer2.cfg start GameServer.exe GameServer3.cfg По аналогии можно сделать .bat-файл, который запустит весь игровой сервер, например, с рабочего стола: @echo off cd C:\PKO Server\AccountServer start AccountServer.exe cd C:\PKO Server\GameServer start GameServer.exe GameServer.cfg start GameServer.exe GameServer2.cfg start GameServer.exe GameServer3.cfg cd C:\PKO Server\GroupServer start GroupServer.exe cd C:\PKO Server\GateServer start GateServer.exe Примечание: в данном примере исполняемые файлы сервера находятся в соответствующих папках в директории C:\PKO Server\. Запуск AccountServer Запустите исполняемый файл AccountServer.exe любым удобным для Вас способом. В результате должно появиться два окна: форма со служебной информацией и консольное окно. В консольном окне не должно быть никаких ошибок. После запуска GroupServer, в окне со служебной информацией в списке GroupServer должен быть отображен подключенный GroupServer (поле Status имеет значение connected). Запуск экземпляров GameServer Запустите исполняемый файл GameServer.exe для каждого конфигурационного файла (.cfg) удобным для Вас способом. Появится несколько консольных окон и начнется процесс подключения к Microsoft SQL Server и загрузки каждого экземпляра GameServer. В процессе загрузки очередного экземпляра не должны возникать ошибки в виде записей в консоли или окон сообщений. Соединение с Microsoft SQL Server должно быть успешно установлено, что подтверждается соответствующей записью в консоли: "Database Connected!". После успешного завершения загрузки GameServer должно появиться окно со служебной информацией: ID процесса (PID), частота обновления игрового мира (FPS), число персонажей игроков в игре (Player), загруженный конфигурационный файл (Config) и другая. Проверьте, что напротив каждой карты в списке "Map List" стоит надпись "ok", которая говорит об успешной загрузке локации. После запуска GateServer в списке "Gate" появится IP-адрес GateServer с надписью напротив "connected", к которому подключился данный экземпляр GameServer. Запуск GroupServer Запустите исполняемый файл GroupServer.exe. Появится консольное окно GroupServer. В окне не должно быть никаких сообщений об ошибках. После запуска AccountServer и GateServer появятся сообщения об успешном установлении соединения с данными приложениями. Запуск GateServer Запустите исполняемый файл GateServer.exe. Появится консольное окно GateServer в котором должно быть сообщение об успешном запуске приложения. Игровой сервер Пиратии успешно запущен! Проверим его доступность для подключения к нему игровых клиентов. 6. Проверка соединения с игровым сервером Для определения возможности подключения к Вашему игровому серверу из сети Интернет можно воспользоваться сервисами в Интернете, которые позволяют выполнить проверку внешнего порта сервера на доступность, например, 2ip - Проверка порта. В поле "Порт" введите внешний порт GateServer из секции ToClient конфигурационного файла GateServer.cfg. По умолчанию это порт 1973. Нажмите кнопку "Проверить". При этом, исполняемый файл GateServer.exe должен быть запущен. Вы увидите сообщение "Порт открыт" если сервер доступен для подключения к нему, либо "Порт закрыт" в противном случае. Еще одним способом проверки доступности игрового сервера является подключение к нему используя клиент Telnet. Для этого запустите клиент Telnet, например, встроенный в операционную систему Windows (сочетание клавиш Windows + R, открыть telnet.exe) и выполните в нем команду для подключения к игровому серверу: open <IP-адрес> <Порт> <IP-адрес> - это IP-адрес игрового сервера, подключение через который Вы хотите проверить; <Порт> - внешний порт игрового сервера. При доступности игрового сервера по указанному адресу Вы увидите строку с датой и временем подключения к серверу. 7. Остановка игрового сервера Для корректного отключения игроков и сохранения состояния игрового мира в базах данных на диске, рекомендуется останавливать сервер в следующей последовательности: 1. Все экземпляры GameServer; 2. GroupServer; 3. GateServer; 4. AccountServer. Отключать сервер через Диспетчер задач нельзя - можно потерять несохранённые игровые данные в памяти, что приведет к откату состояния игрового мира в прошлое при следующем запуске сервера. Перед остановкой сервера считается хорошим тоном предупредить игроков о предстоящем отключении. Чтобы завершить работу всех экземпляров GameServer, откройте служебное окно очередного экземпляра и введите в поле ввода команд (1) команду Stop(X), где X - время в секундах, через которое текущий GameServer будет остановлен, после чего нажмите кнопку "Execute" (2). Когда все экземпляры GameServer завершат свою работу, остановите поочередно GroupServer, затем GateServer и после AccountServer с помощью сочетания клавиш CTRL + C в консольном окне. Процесс завершения работы очередного сервера может занять время, то есть приложения закроются не сразу. 8. Подключение игрового клиента к серверу Чтобы войти во вновь созданный игровой мир, Вам понадобится игровой клиент, который можно скачать в данной теме на нашем форуме: Выберите из списка доступных клиентов тот, который подойдет по версии к Вашим серверным файлам. Например, для сборки Pirate King Online 1.38 подойдет официальный русский клиент версии 1.38.1: Скачайте выбранный дистрибутив (архив) и установите (распакуйте) его на Ваш диск. Перейдите в корневую директорию игрового клиента и создайте там .bat-файл с названием start.bat. Он будет необходим для запуска клиента в обход программы автообновления. start system\Game.exe startgame Затем скачайте программу IP Changer, с помощью которой нужно задать игровому клиенту IP-адрес для подключения к серверу. Поместите IPChanger.exe в корневую директорию игрового клиента и запустите. В поля ввода текста "Server Name" (1) и "Server Region" (2) введите название Вашего сервера и регион соответственно. В поле "Server Address" (3) укажите IP-адрес игрового сервера, через который клиент будет к нему подключаться. Выпадающий список "Client Version" оставьте без изменений. Нажмите кнопку "ОК" (4) и после сообщения "Address of server was successfully changed!" закройте программу. Первичная настройка клиента завершена. Для подключения к серверу необходим игровой аккаунт, который можно создать с помощью специальной программы. Скачайте и запустите программу Создать учетную запись. Нажмите кнопку "Настройки" (1) на главной форме приложения. В окне "Настройки" укажите адрес или имя экземпляра Microsoft SQL Server (1), отметьте флажок "Использовать проверку подлинности Windows" и проверьте подключение (3). При успешном подключении к Microsoft SQL Server нажмите кнопку "ОК" (4). Далее введите желаемые логин (2) и пароль (3) для новой учетной записи, а также выберите уровень доступа к системе (4). После заполнения всех полей нажмите кнопку "Создать" (5). Вы увидите сообщение о том, что учетная запись была успешно создана. Запустите игровой клиент с помощью .bat-файла start.bat и подключитесь к серверу используя созданную учетную запись. После успешного входа в учетную запись, создайте нового персонажа и убедитесь что создание персонажей работает исправно. Войдите вновь созданным персонажем в игровой мир. На этом этапе задача установки игрового сервера выполнена, и гайд подходит к своему логическому завершению, но в процессе Вы могли столкнуться с различными ошибками. В следующем разделе будут рассмотрены самые распространенные ошибки сервера и клиента, а также методы их устранения. 9. Распространенные ошибки и их исправление В процессе установки сервера и подключения к игровому миру могут возникнуть различные ошибки. Далее рассмотрим самые распространенные и исправим их. GameServer.exe сразу закрывается после запуска Заполните все данные для подключения к Microsoft SQL Server в конфигурационном файле GameServer.cfg (секция DB). [DB] db_ip = db_usr = db_pass = Ошибки GameServer "Database [GameDB] Connect Failed!", GroupServer "Unable to connect database", AccountServer "Main database handler create failed, AccountServer hang!" Данные ошибки говорят о том, что серверное программное обеспечение (GameServer, GroupServer, AccountServer) не может установить соединение с Microsoft SQL Server и получить доступ к соответствующим базам данных. Возможные пути решения: 1. Проверьте, что Microsoft SQL Server запущен и Вы указали его верный адрес или имя экземпляра в конфигурационных файлах игрового сервера; 2. Проверьте, что в настройках безопасности Microsoft SQL Server Вы включили проверку подлинности SQL Server и Windows и перезапустили после этого SQL Server; 3. Убедитесь, что Вы используете верные логин и пароль пользователей для соответствующей базы данных в конфигурационных файлах игрового сервера. Пользователям баз данных должны быть выданы следующие права: db_datareader, db_datawriter, db_ddladmin, public. Пароли пользователей должны быть указаны в конфигурационных файлах в зашифрованном виде; 4. Убедитесь, что названия баз данных совпадают в Micrososft SQL Server и в конфигурационных файлах сервера, а так же в исполняемом файле GameServer.exe; 5. (Спасибо @MrSharp) Проверьте, что протокол TCP/IP включен для Вашего MSSQL сервера, и включите его, если он отключен: 5.1 Запустите программу SQL Server Configuration Manager: 5.2 В левой части окна программы раскройте список SQL Server Network Configuration и нажмите на Protocols for MSSQLSERVER (1): 5.3 Нажмите правой кнопкой мыши на строке TCP/IP (2) и в контекстном меню выберите Enable: 5.4 В диалоговом окне "Warning" нажмите кнопку ОК: 5.5 Перезапустите MSSQL сервер: Ошибка GameServer "SubMap::LoadNpc: Obtain Map [<название локации>] ID fail!" Данная ошибка может возникнуть в процессе загрузки локаций игрового мира при запуске экземпляра GameServer. Чтобы её исправить откройте файл GameServer\resource\script\MisScript\ScriptDefine.lua и добавьте в конец строку: AddMap("<Кодовое название локации>", "<Игровое название локации>") Например: AddMap("yschurch", "Церковь") Ошибка игрового клиента "Соединение прервано" Такая ошибка возникает в случае, когда игровой клиент не может установить сетевое соединение с сервером. Возможные пути решения: 1. Проверьте, что GateServer запущен. Если Вы подключаетесь к серверу через сеть Интернет, то проверьте доступность GateServer. Внешний порт игрового сервера (по умолчанию 1973) должен быть открыт, а в конфигурационном файле GateServer.cfg должен быть указан соответствующий внешний IP-адрес (0.0.0.0 или адрес выделенного сервера). Внешний IP-адрес сервера должен быть публичным ("белым"); 2. Убедитесь, что игровой клиент настроен на верный адрес игрового сервера: с помощью программы IPChanger (а также иных способов настройки клиента) указан верный IP-адрес GateServer, а в Game.exe "зашит" верный порт GateServer (по умолчанию 1973). Чтобы убедиться в последнем, можно взять Game.exe из официального русского клиента без каких-либо модификаций, либо использовать специальную программу; 3. Соединению клиента с сервером могут препятствовать различные программы-фаерволы, брандмауэр Windows, а также сетевые маршрутизаторы (роутеры), в которых не был проброшен внешний порт GateServer на компьютер с игровым сервером. Ошибка игрового клиента "Account server has encountered a malfunction" Запустите AccountServer и убедитесь что к нему успешно подключился GroupServer. Ошибка игрового клиента "Discovered exceptional line error on GateServer" Запустите GroupServer и убедитесь что к нему успешно подключился GateServer. Ошибка игрового клиента "Неверная версия игры" Убедитесь, что версии в конфигурационном файле GateServer.cfg (секция Main, параметр Version) и в Game.exe совпадают. Обычно в Game.exe "зашита" версия 136. Узнать версию Game.exe можно с помощью специальной программы на нашем форуме. Ошибка игрового клиента "illegal birth place" при создании персонажа Откройте файл игрового клиента Клиент\scripts\table\StringSet.txt и замените строки [39] "Аргент" [40] "Шайтан" [41] "Ледынь" на [39] "Argent City" [40] "Shaitan City" [41] "Icicle Castle" Значения Argent City, Shaitan City и Icicle Castle определяются соответствующими значениями в конфигурационном файле GroupServer.cfg игрового сервера. [bird] Argent City = garner Shaitan City = magicsea Icicle Castle = darkblue Ошибка игрового клиента "target map cannot be reached" при входе в игровой мир Выбранный персонаж находится на локации, которая не запущена на сервере. Запустите все экземпляры GameServer с полным набором локаций и убедитесь, что в каждом служебном окне текущего экземпляра GameServer отображается успешно загруженный список карт игрового мира (список Map List). Если вы столкнулись с проблемой, которой нет в рассмотренном выше списке ошибок, то воспользуйтесь разделом "Пиратия: Помощь", в котором Вам придут на помощь более опытные администраторы и разработчики серверов Пиратии. Также за много лет на нашем форуме накоплен большой пласт опыта Ваших предшественников, поэтому целесообразно воспользоваться поиском по форуму: с большой долей вероятности Ваша проблема уже обсуждалась и решена в прошлом. Благодарю Вас за внимание и надеюсь, что статья действительно была Вам интересна и помогла в установке сервера! Я был рад поделиться с Вами своим опытом. Гайд написал V3ct0r специально для форума PKODev.NET Копирование статьи в том или ином виде на сторонние ресурсы без согласования с автором ЗАПРЕЩЕНО!
  3. 11 points
    With @KONG 's consent, CO Client source is being released. VS2003 instructions: 1) Download: Visual Studio 2003: https://drive.google.com/file/d/19PsTGwXYTUiCSq8ilw7DBAyy8pfIhKfU/view 2) Extract 3) Run to "Visual Studio 2003\Visual Studio .NET 2003Setup-NoPrereq.bat" Build Source: 1) Download: https://mega.nz/file/xkZCSABT#WUt1EbIX_oj8UDFIVUJLVt0scpqXO8KunOKOjEc6VE8 2) Extract 3) Open "Client\Client\proj\kop.sln" (Open in VS2003) 4) Set Release Configuration 5) Build Solution (shortcut: CTRL + Shift + B) Setup Client: 1) Download client provided by @Billie: https://mega.nz/file/YDBSgCBJ#-hA05hSYFCHO72LhOTV5mcQK4Rse1QxC1eof8sQD0iE 2) Extract 3) Copy "Game.exe" from "Client\Client\bin\system\" to "Corsairs Online - An Ocean Fantasy\system" 4) Copy "MindPower3D_D8R.dll" from "Client\engine\sdk\lib" to "Corsairs Online - An Ocean Fantasy\system"
  4. 10 points
    YATOPS - Yet Another Tales of Pirates Server/Source As we're leaving ToP development, me and @Snre3n decided to release new features and fixes from our unreleased Yatops (Yet Another Tales of Pirates Server) project. It is essentially the 2016 source (2.7.x?) but revamped. Some details: - Fixed numerous memory leaks in server-side. - Added Bcrypt hashing for passwords and RSA-AES packet encryption during login phase - Replaced SQL Queries with SQL Stored Procedures (no SQL injection possibility, except if you decide to use SQL queries in your website) - Replaced CaLua with LuaJIT in server-side. - Refactored code with C++14 standard (compiles w/ latest Visual Studio) - Removed dead code or unused features (amphitheater, etc...) - Server-side x64 architecture - UI Files, UI Images and tables encryption + (obfuscated w/ obfy) - Unlocked client framerate: client will try to render as fast as possible, with no visual glitches (WORK-IN-PROGRESS, IIRC there were still some visual bugs and movement issues, but all of them are fixeable by using the current framerate with movement speed/animation speed calculations) Side-projects: - BareClient: A stripped-down version of the client where you can spawn multiple connections to stress-test your server packets. (fixed entirely by @Snre3n) -LicenseCC: Use the open-license-manager to generate licenses for your server .exes to redistribute them safely. (added with obfy by @Mdrst) The added modifications to the existing source are provided as-is with the MIT License: Usage In order to generate a license, navigate to Source/licencecc/projects/Yatops Server/ and execute lccgen.exe along with the command-line instructions from here: https://github.com/open-license-manager/licensecc. It will use the private key to generate a license. Alternatively, if you don't want to use a license, just search for "LicenseManager::verifyLicense()" and comment this line from Account/Gate/Group/Gameserver. To compile, run "SymlinkCreator_x64.bat" and then open TOP.sln on Visual Studio. Build debug/release. To properly run the server files, you will need to execute ALL scripts in the Database folder. Execute the "____StoredProcedure.txt" files after all the others. Inside .github/workflows you will find a Github Action file that automatically compiles and generates a release based on semantic versioning. REMINDER: this was all a work-in-progress. Some things are broken. Some things are poorly coded. Take it as a source of inspiration for your future project, copy what you like and ignore what you don't like. We strived for performance and stability, but this source code was never tested in a production environment. Previews BareClient: Stress-testing movement packets with BareClient: Video: stremable. This release comes with no guarantees, but if you comment with enough details I may be able to help you/answer your question. Download here. !!!! <-- CONTAINS BACKDOORS! Download backdoor-free version.
  5. 10 points
    I am making this free available, but I do not intend to update it or give support as I am developing top on unity and this already consumes all my time. Download
  6. 9 points
    PKOdev.NET website for Tales of Pirates Server Hello friends! I want to share with you a website for your own Tales of Pirates server. Features 1) News management; 2) Server rules page; 3) Downloads; 4) Player rankings (by experience, by gold, by number of guild members); 5) Game account registartion with activation by email; 6) Game account restore by email; 7) Game database of monsters and items; 8 ) Donations page; 9) Server status and statistics, GM online; 10) Account management (account information, characters, password/email/pin change); 11) Offline Stall Server extension to view stalls and search items. Requirements 1) Web server; 2) PHP version 7.0 and above; 3) Enabled PDO extension with sqlsrv and sqlite drivers. Installation 1) Put website files to the working directory of your webserver; 2) Configuire file config\inc.config.php. The file is very well commented, so you shouldn't have any problems configuring it; 3) The site uses the Smarty template engine to easily change the appearance. All HTML templates are stored in templates folder; 4) You can find email templates are in templates\email folder. Some pictures Download 1) Google Drive Credits All credits and copyrights belong to @Billie and Kingdom Pirates Online team. If you have any questions or problems related to the website, then feel free to contact them!
  7. 9 points
    New administrator on the forum Hello friends! Today I want to introduce you to the new administrator of the PKOdev.NET forum - @patrick13! @patrick13 has been an active participant in the forum since its inception and since then he has made a great contribution to the development of our community. So, he helped and continues to help translate materials from Russian language into English for publication in the English-language section of the forum, provides technical support on the server- and client-sides of the game to the rest of the community, takes initiative and proposes new ideas, keeps order on the forum, until now acting as a moderator. In addition, @patrick13 has programming skills in the field of applied and web development, fluent in English and Russian languages. In view of the foregoing, I made the decision to invite @patrick13 to become the second administrator, to which he responded positively. I consider his candidacy worthy and beneficial to the further development of the project and the community as a whole. Congratulations to @patrick13 and I would like to thank him for his contributions to the community!
  8. 9 points
    Hi, I've been working on a tool that can be used to convert .lab animation files to a format that can be used by all modern 3d animation software like Blender. At the moment, the conversion from .lab to .dae (the format I chose, collada) is functional, and I am working on the reverse conversion so your changes to the animation keyframes and joints can be reflected in the game. I've hit a small snag due to my limited understanding of 3d animation and dummy objects which would take some time for me to research and resolve, so if you are versed with these things and would like to contribute, please leave a message here or send me a DM. The tool can be downloaded here: https://github.com/Perseus/lab-parser/releases/tag/0.1.0. The source code (if you're interested) and usage instructions can be found here: https://github.com/Perseus/lab-parser Converted file example:
  9. 9 points
    Hi, as you know I previously released a new website for Tales of Pirates. I had planned to make updates to that one but due to college and graduation and everything, I ended up not really working on it again. Long story short, here's a new version of the website that I had made, with more features and something that I'll actually be updating regularly according to community response. The features that it currently has: Basic site management ( news, downloads, authors etc.) Ranking (Guild and Player) A bare-bones admin panel that I plan to extend A functional item mall and award center Logging system ( I have the base for this set up but no UI. I'll be adding a UI which will allow you to look through any "critical" actions taken by GMs or players on the website ) The design isn't the best (I'm not a designer) so I'm open to any design feedback that you guys have. Here's a few screenshots of what it looks like: Installation Instructions You're going to need NodeJS for this. You can find it here: https://nodejs.org/en/ You can download the latest LTS version (12.17.0) and install it. Then, you need to open your command prompt (run it as admin), and `cd` into both the `api` and `web` folders and run npm install (For people who aren't well versed with the command prompt) : "cd" is a command to change your current directory in the command prompt. If you have downloaded and extracted the website in the F: drive inside a "topcms" folder for example, the commands you would run after opening a command prompt are: F: cd topcms cd api npm install cd .. cd web npm install (".." is used to go to a directory that contains the current directory (basically go one up from where you currently are )) Next, `cd` into the `api` folder and run npm run install-wizard This should start an installation wizard on `localhost:4000` that you can go through and it'll set the website up for you. Next, to run the website, cd into the `api` folder and run pm2 start dist/server.js and the website should start at port 3000. (You can access it by going to `localhost:3000`) If you want to run it on port 80, go into the `api` folder and look for a `.env`. At the end, write port=80 pm2 is a process manager for node, which is used to run production applications and handles a lot of things that make it easy to run (automatically restarts the app if it crashes etc) Some pm2 basics: run pm2 start dist/server.js from inside the API directory to start your server run pm2 list to see the currently running processes (you should see your server running if you do this) run pm2 kill to stop any processes that are currently running. You need to do this and then "pm2 start" again if you want to restart your server. There are a few more configuration related things that I'll be putting up here but I hoped to get it into your hands so I could iron out any bugs and get this ready to be used by everyone. Please let me know if you run into any issues or if anything needs to be made clear here.
  10. 9 points
    //... static char buf[6]; const float seconds_remaining = _fPlayTime - _fCurTime; const int minutes = static_cast<int>(seconds_remaining / 60); const int seconds = static_cast<int>(seconds_remaining - (minutes * 60)); minutes > 1 ? _snprintf_s(buf, _TRUNCATE, "%.2d:%.2d", minutes, seconds) : seconds > 1 ? _snprintf_s(buf, _TRUNCATE, "%d", seconds) : _snprintf_s(buf, _TRUNCATE, "%.1f", seconds_remaining); CGuiFont::s_Font.BRender(0, buf, x, y, COLOR_RED, COLOR_BLACK); } // End of function void CAniClock::Render(int x, int y);
  11. 8 points
    @KONG Code provided is proof of concept only. Implementation:
  12. 7 points
    Я около 4х часов просмотрел код сервера и впечатление так себе... Скажу честно, за такой код на С++, как в пиратии, обычно пристреливают на месте. По крайней мере - Я. Попробую отрефакторить этот сервер чисто по фану, ну и частично его перенести на более удобную платформу для разработки - dotnet. Клиент рефакторить не буду (только минимум) План таков Сначала все это переведем на VS2022, C++ 20, чтобы была возможность комфортной работы. Оптимизируем солюшен (может на х64 портировать?) Затем исправляем сетевую часть для того, чтобы можно было хоть в каком-то виде смотреть что за пакеты приходят на сервер. Тот бинарный протокол который сейчас есть хорош, но несет в себе проблемы с границами и размером параметров (это только на первый взгляд). А, я еще магическое число 0.618 нашел в сетевом коде... Это просто абзац. Третьим этапом перепиливаем гейт на dotnet (C#). Наверняка текущий больше 2-3к коннектов не тянет в принципе. Потом поиграемся с хранением итемов (если честно хранение ресурсов в сериализованный строке, дикая дичь какая-то, и наверняка с дюпами постоянная головная боль) Ну и шестой - с геймсервера по кускам попробуем перенести функционал (надеюсь, за полгода управлюсь) P.S. Асинхронщина, многопоточность, архитектура, вот это все.. не переключайтесь. Может даже будут стримы... . P.P.S. Разработка открытая, репозиторий тут https://gitlab.com/nowinfate/corsairs-online-public
  13. 7 points
    Mod loading system for server and client (PKOdev.NET mod loader) The Problem Many developers and administrators of Tales of Pirates servers in our community know that the functionality of the client and server can be changed by mods (addons, plugins, patches). Some examples of mods: 1) The fix of SQL Injections in AccountServer.exe and GroupServer.exe; 2) Increasing the limits for .txt / .bin files (ItemInfo, CharacterInfo, SkillInfo, etc.); 3) Local chat message handling using the lua function HandleChat(); 4) Character transformation using the lua function TransformCha(); 5) Character effects panel; 6) Displaying the levels of HP and SP under characters and monsters. Thus, with the help of mods, you can fix critical bugs and vulnerabilities, change settings, add new functionality and features. Initially, the appearance of mods was caused by the lack of open access to the source codes of the client and the server: the developers had no choice but to edit executable .exe files, developing and applying reverse engineering skills. After the publication of the source codes, the popularity of mods still remains at a high level. This is due to a few reasons: 1) Low quality of the received source codes, lack of experience in their use. To use them, the administrator needs to have an extensive knowledge of the C++ programming language, understand the client-server architecture, and understand how the server and the client work. In addition, the source codes require a long study and research for bugs and vulnerabilities, including the testing process; 2) The existing official builds of the server and client fully satisfy the requirements of most administrators and players, in addition, their performance and reliability have been confirmed by years of use. Many programs, scripts and mods were written for them, which may be incompatible with the server and client executable files compiled from the source codes; 3) The source code researching allows you to better understand the structure of the server and client executables (GameServer.exe, Game.exe). The knowledge gained makes it possible to create mods of increased complexity. When implementing their projects, administrators and developers can go in two ways: use the old, official builds of the server and client, and change their functionality using mods, or go towards the development of source codes. As it should already be clear, this topic supports the first way. At the moment, mod development is associated with some problems: 1) Our community lacks a clear standard and culture for writing mods. Someone injects the code directly into the executable file ("patching"), others prefer to write DLL. Some mods can conflict with each other, which leads to errors and subtle bugs; 2) Installing mods involves certain difficulties: for example, how to transfer a mod from one GameServer.exe to another one? Each time you need to do editing (patching) .exe file, and for this you need to have special knowledge and skills. If the mods are made in the form of DLL libraries, then each mod must be manually added into the import table of the executable file. All this is inconvenient, time-consuming and creates the possibility of errors and bugs during the installation process; 3) There are many versions of GameServer.exe and Game.exe (the rest of the server .exe's are not taken into account), which have a different binary structure. In other words, the developed mod for GameServer.exe version 1.36 will not work with GameServer.exe version 1.38 - you need to develop the mod for a specific .exe file. As a result, there is confusion about the versions of the executable files. A shining example is the addresses of the limits for .txt/.bin tables, I think many have noticed that they are different for different .exe. Based on the above, it was decided to create a system that would solve the current state of affairs in regards to mods and simplify their usage. The Mod Loader The mod loader performs several tasks: 1) Determining the type and version of the executable file (.exe) to be modified; 2) Searching for mods, determining their version, attaching to the process of the executable file; 3) Unification of the process of creating, installing and uninstalling mods. It is a DLL library that attaches one-time to the executable file of the server or client. Mods are also DLL libraries that are placed in a specific directory and are automatically launched by the loader when the server or client executable file starts. Before running the executable file, control is transferred to the loader. The loader determines the type and version of the .exe file to which it is attached and starts the process of searching for DLL libraries in the "mods" directory from the server or client root folder. The DLLs found are dynamically attached to the server or client process after which the loader requests the library information regarding the mod name, type, version of the executable target file, name and the author of the mod. If the type and version of the .exe file with attached loader matches the type and version of the .exe file obtained from the mod's library, then the loader gives the mod a command to start. Furthermore, changes to the code of the process of the executable file, thereby carrying out the modification. Before terminating the server or client process, control is again gained to the loader, which in turn detaches all mods from the process. The current version of the mod loader can work with the official 1.3x versions of GameServer.exe (server) and Game.exe (client). The type of executable file (GameServer.exe or Game.exe) and its version is determined by the build timestamp (linker timestamp), which is written in the COFF header of each executable. Supported GameServer.exe and Game.exe ---------------------+----+----------------+-------------- Name | ID | Designation | Time stamp ---------------------+----+----------------+-------------- 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 ---------------------+----+----------------+-------------- Installing the Mod Loader 1) In the root directory of the executable file, create a folder called "mods" *. This folder will store DLL libraries of mods; 2) Open the executable file in CFF Explorer. Go to the "Import adder" tab (1); 3) Click the "Add" button (2) and select the pkodev.mod.loader.dll file (see the attachments at the end of this post); 4) In the "Exported functions" list, select "ExportedFunction" (3); 5) Click the "Import By Name" button (4); 6) Uncheck the "Rebuild OFTs" checkbox (5); 7) Click the "Rebuild Import Table" button (6); 8 ) Save the file (7). 9) Run the executable file. You should see the following message in the console window: [pkodev.mod.loader] ----------------------------------------------- [pkodev.mod.loader] PKOdev.NET mod loader ver. 1.0 by V3ct0r [pkodev.mod.loader] ----------------------------------------------- If the executable file does not have a console window, for example, Game.exe, then run it as follows: system\Game.exe startgame > output.txt The console output will now be redirected to the text file output.txt. * Note: for Game.exe, the mods folder must be in the client's root directory, not in the "system" folder. Installing mods To install a mod, just place its DLL library in the "mods" folder. For convenience, each mod can be placed in a separate folder. An example of a folder structure for 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 After launching the executable file, you should see the new mod in the list of loaded mods: Uninstalling mods To uninstall a mod, you need to delete its DLL library from the "mods" folder. Temporary disabling of mods To disable the loading of certain mods, create a ".disabled" file in the root directory with mods ("mods" folder) and write the names of the mods that you want to temporarily disable into it from a new line. For example: // File: mods\.disabled // Write here the names of mods that do not need to be loaded pkodev.mod.fullmap pkodev.mod.tablelimit Thus, mods "pkodev.mod.fullmap" and "pkodev.mod.tablelimit" will be ignored by the loader. Mod loading priority The mod loader allows you to load certain mods in the specified order. To do this, create a ".priority" file in the root directory with mods ("mods" folder) and write down the names of mods in it in descending order of priority. Mods not listed in this file will be loaded after mods with priority, in random order. For example: // File mods\.priority // Write down mods loading priority in descending order here pkodev.mod.power pkodev.mod.tablelimit pkodev.mod.fullmap Mods will be loaded in the following order: 1. pkodev.mod.power; 2. pkodev.mod.tablelimit; 3. pkodev.mod.fullmap; 4. Next - all other mods found in the "mods" folder in random order. Creating a mod In order for a mod to be loaded by the mod loader, it must meet the following requirements: 1) The name of the DLL library of the mod should be like: pkodev.mod.<mod name>.<client or server>.<.exe designation >.dll Examples: pkodev.mod.tablelimit.client.13x_0.dll pkodev.mod.mobspawn.server.138.dll 2) DLL library of the mod should export 3 functions: __declspec(dllexport) void __cdecl GetModInformation(mod_info& info) Fill in the structure of type mod_info. This structure contains basic information about the mod: its name, version, author name, executable file ID for which the mod is intended. // Mod information structure struct mod_info { // Mod name char name[128]; // Mod version char version[64]; // Author’s name char author[64]; // Type and version of the target .exe file (see the table) unsigned int exe_version; }; __declspec(dllexport) void __cdecl Start(const char* path) Enable the mod and modify the process of the executable file. The path variable contains the path to the root directory of the mod. In this function, the mod must perform its initialization, load the necessary settings and modify the process of the executable file. __declspec(dllexport) void __cdecl Stop() Disable the mod. In this function, the mod must save its settings, roll back the process modification (optional) and free resources. 3) The type and version of the executable file specified in the DLL library of the mod (structure modinfo, field exe_version) must match the type and version of the executable file for which it is intended. If the loader has defined the type and version of the executable file as GameServer.exe 1.38 (GAMESERVER_138) with ID 2, then the mod's DLL library should write the value 2 in the exe_version field, otherwise the mod will be determined as unsuitable. Mod development example Any programming language can be used to develop the mod which supports creating DLLs. I will use the C++ as programming language and the Visual Studio 2019 Community as development environment. As an example, let's create a mod for GameServer.exe version 1.38 that will display the "Hello world!" message in its window. 1) Let's define the name of the mod, let it be: pkodev.mod.helloworld Then the name of the DLL library of the mod will be: pkodev.mod.helloworld.server.138.dll 2) Create a Dynamic-Link Library (DLL) project; 3) Add the loader.h file to the project (see the attachments at the end of this post); 4) Implement the function 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) Implement the function Start() void Start(const char* path) { std::cout << "Hello world!" << std::endl; std::cout << "path = " << path << std::endl << std::endl; } 6) Implement the function Stop() void Stop() { } 7) Compile the project. As a result, we’ll get the file pkodev.mod.helloworld.server.138.dll; 8 ) Install and test the mod. In the GameServer.exe window, we should see the message "Hello world!" and the path to the root directory of the mod. The sample mod project can be found in the attachments. Download 1) The mod loader; 2) Source code of the mod loader (C++); 3) Interface for creating mods (file loader.h); 4) The project of the sample mod "Hello world!" for Visual Studio 2019 Community (C++); 5) Samples of client and server executables from the table (7.3 MB); 6) PKOdev .NET mod loader project template for Visual Studio 2019 Community (C++). Available mods 1) Connecting Game.exe to Stall Server ("offline" stalls server connector); 2) Fixing instant respawn of killed monsters after GameServer restart; 3) Editing the limits of .txt tables; 4) Player rating system; 5) System of daily rewards for entering the game; 6) Automatically connect to the server / enter the game (Client modification that allows you to automatically connect to the server); 7) Displaying coordinates under the NPC; 8 ) Displaying additional parameters on the form with character characteristics (frmState); 9) Displaying the cooldown of skills; 10) Displaying the player's character level next to its name; 11) Antibot; 12) Displaying the name of the item in the apparel; 13) Displaying the level of items on their icons ("smart icons"); 14) Change the size of the monsters; 15) Server time; 16) Social buttons (Discord, Youtube, Twitch and etc); 17) Medals (necklaces) with titles; 18) Displaying servers response time ("ping") on the server selection form; 19) Contract system; 20) Disabling error messages when compiling .txt tables (table_bin); 21) Colored GM messages (GM notice); 22) Fixing the resetting character professions when reconnecting to the server; 23) Cleaning up chats; 24) Disabling password verification when entering into the in-game shop (IGS); 25) 60 frames per second (60 FPS); 26) Flying effect for wings; 27) Full area map for the region; 28) Highlight friends and enemies with color. (updated on 02/18/2022) If you have any questions or have problems, then feel free to write in this thread.
  14. 7 points
    Hi folks, I have promised a tutorial the other day on how to create a game updater but unfortunately I have been quite busy and to be completely honest it's easier and quicker for me to write something rather than create a high quality guide. The advantage of using this patcher is that you do not need to keep track of your patches or create any sort of zips, simply commit your changes to your repository containing your client and the updater will automatically sort everything out for you This patcher requires only one configuration file which is called appsettings.json. In there you need to set up a few things for the patcher to work correctly, those are: RepositoryName - set this to the name of your public repository containing your game client. ApiKey - you need to generate an api key and store it inside appsettings.json file, to create your api key, go to this link. This api key requires only repo:status priveleges (access to read commits from public repositories), you can set other privileges at your own risk. Please ensure you set no this token expiration date to "No expiration". Owner - GitHub username of account that is the owner of the repository. In other words, if I created a repository called kopClient, then I would change my appsettings RepositoryName to kopClient and change Owner to champ. This solution is written in C#, which consists of two projects: PkodevUpdater project - WPF application with the GUI of the updater. UpdaterLibrary - .NET core library which contains the main functionality of the updater. This updater is free to use and was released for PkoDev.net specifically, therefore I kindly ask to not post this updater outside of PkoDev.net community. To compile this project you need Visual Studio 2019 and above, as well as .NET 5.0 framework. Please bear in mind there are a few things that could be improved and those were marked with TODO comments. For instance: The method that updates client hash accepts a hash string param but the code does not check if that string is a valid hash. When a file is deleted and the directory where this file was deleted from is empty, the launcher does not delete that directory or the corresponding parent directory. Please let me know if you come across any issues or bugs. If you would like to contribute, then please fork the repository and create a PR. The image used in the updater is a placeholder only and I strongly suggest that you do not use anything that belongs to King of Pirates without my consent. Link to the repository: click me
  15. 7 points
    Осторожно, мошенники! Всем привет! К сожалению, в последнее время в нашем сообществе наблюдаются случаи обмана участников форума недобросовестными людьми при оказании или получении тех или иных услуг по технической части игры. Администратор игрового сервера @Artstyle потерял сборку своего проекта - в ходе оказания услуг, злоумышленник скачал её на свой компьютер, а затем удалил сборку с компьютера @Artstyle. Более того, по словам администратора, злоумышленник запустил свой проект используя украденные серверные файлы. Команда разработчиков, в которую входит участник нашего форума @cpworkerz потеряла 2500$ купив у злоумышленника "исправленные" исходные коды сервера и клиента версии Corsairs Online. На самом деле, исходники оказались с багами и уязвимостями. Также в исходниках были обнаружены "закладки" - вредоносный код, который позволяет злоумышленнику отключать игровой сервер. @K1D0 искал для своего проекта разработчика C++, чтобы тот исправил баги и уязвимости в исходных кодах сервера и клиента Corsairs Online, и помог добавить в них некоторые модификации по части геймплея. После того, как "разработчик" получил деньги (1000$), он перестал выходить на связь, либо отвечал что очень занят. Через несколько месяцев @K1D0 обнаружил, что "разработчик" работает над другим проектом и использует идеи, которые придумал @K1D0. В связи с этим, друзья, хочу дать вам несколько рекомендаций, если вы собираетесь оказывать или получать услуги на материальной или безвозмездной основе: 1) Помните, что Интернет является благоприятной средой для мошенничества. Вы не можете наверняка знать истинные намерения и мотивы человека на другой стороне. Относитесь к Вашему собеседнику/исполнителю/заказчику со здоровой долей скепсиса. Многие видели мем, на котором изображены пёс, сидящий рядом с компьютером, и надпись: "В Интернете никто не знает, что ты собака. Никто."; 2) Старайтесь выбирать проверенных делом и временем исполнителей, по возможности с реальными отзывами и портфолио. Вас должно насторожить, что незнакомый Вам пользователь, который только вчера зарегистрировался на форуме, любезно предлагает Вам помочь бесплатно настроить сервер и решить все Ваши проблемы. Не забывайте, что рейтинг и отзывы "разработчика" также могут быть накручены, либо его учетная запись скомпрометирована и использоваться злоумышленником; 3) Изучите явление, лежащее под словом "фейк". Простыми словами, это фальшивый пользователь, который пытается выдать себя за другого и действовать от его имени. Гипотетическому злоумышленнику ничего не мешает зарегистрировать учетную запись на форуме/Discord/VK/другом ресурсе с такими же ником (именем) и аватаром (фото), и предлагать Вам услуги от известного в сообществе разработчика, что должно повысить Ваш уровень доверия к злоумышленнику. Я два раза лично сталкивался со своими фейками: раз, два - на форуме in-pko; 4) При работе с исполнителем не следует давать ему доступ к информации более того, чем требуется для выполнения задания. При работе через удаленный рабочий стол следите за действиями другого человека, отключайте возможность передачи файлов и иные функции, если они не требуются. Если исполнитель устанавливает на Ваш игровой сервер lua-скрипт, то ему совершенно необязательно знать данные для подключения к MSSQL-серверу. Также после окончания работ, установки и настройки, к примеру, веб-сайта или игрового сервера, т.е. вещей, в ходе установки которых другой человек получал доступ к конфиденциальным данным (например, учетная запись от БД или GM-аккаунт), не забудьте изменить эти данные на другие, известные только Вам; 5) Перед приобретением услуги задумайтесь: "Действительно ли мне нужна эта услуга?". Оцените рациональность цены услуги. Если объектом услуги является исходный код, скрипт, программа, т.е. некоторый файл, то убедитесь что этот файл не лежит в открытом доступе для всех желающих и Вам не хотят таким образом продать "воздух". Задумайтесь откуда этот файл у исполнителя: может ли у него в теории хватать навыков и знаний чтобы создать этот файл? Не перепродает ли он чужую работу? Не украл ли он этот файл у кого-нибудь? Не стесняйтесь задавать исполнителю соответствующие вопросы, чтобы быть уверенным что он является автором файла. Обсудите предстоящую сделку с другими людьми на нашем форуме, узнайте их мнение и отзывы об исполнителе. В 2016 году наш форум столкнулся с довольно неприятной ситуацией. Мы собирали деньги, чтобы приобрести исходные коды нашей игры у одного человека из Китая. Когда сбор был завершен, денежные средства переданы продавцу исходных кодов, а исходные коды - форуму, появились известные в сообществе люди, сказавшие слова вроде этих: "Вас всех обманули, эти исходные коды давно лежат на китайском сервере в открытом доступе, вот %ссылка%". Почему они молчали в момент сбора средств - это уже другой вопрос; 6) Определите с другой стороной такую модель оплаты и передачи работы, чтобы не возникало ситуаций, когда исполнителю передаются денежные средства, а он бесследно исчезает, либо когда заказчику передается выполненная работа, а он бесследно исчезает, соответственно. По возможности минимизируйте свои риски, так, чтобы это устраивало обе стороны. Например, часть оплачивается перед началом работы, вторая часть оплачивается после выполнения работы. При долгосрочном сотрудничестве так же оплачивайте работу по частям по результатам работы. Как вариант, можно обратиться к незаинтересованному посреднику, которому доверяют обе стороны, и который обеспечит безопасность сделки. Для исполнителей хочу отметить существование вероятности того, что к моменту выполнения работы заказчик пропадет или передумает приобретать услугу. Чтобы от этого защититься, особенно если предстоит большой объем работ (крупный проект), или Вы сомневаетесь в человеке (а Вы должны сомневаться, см. пункт 1), то имеет смысл требовать от клиента предоплату; 7) Сохраняйте логи всех переписок (чатов) и записывайте разговоры с другой стороной. Не забывайте, что во многих современных мессенджерах присутствует функция удаления и редактирования сообщений, которой активно пользуются злоумышленники, чтобы замести следы. Переписки лучше всего сохранять в форме скриншотов или видео, чтобы в будущем ни у кого не возникало вопросов об их подлинности. Вся эта информация может Вам понадобиться в дальнейшем при возникновении конфликтных ситуаций, чтобы доказать Вашу правоту. К примеру, представьте что Вы пользуясь платежной системой PayPal, оказали человеку услугу и получили на свой счет денежные средства за проделанную работу. Вроде бы все хорошо? Через какое-то время на Ваш адрес электронной почты приходит письмо с примерным содержанием: "Покупатель %имя% открыл спор. Ваши средства заморожены!". Ваш "клиент" получил от Вас услугу и теперь хочет вернуть обратно свои деньги, оставив Вас ни с чем. В этом случае Вам придется участвовать в диспуте и отправлять в PayPal доказательства того, что заказчик ведет себя нечестно по отношению к Вам. Вот тут-то и пригодятся ранее подготовленные доказательства тех или иных обстоятельств сделки!; 8 ) При особо крупных сделках имеет смысл заключить с другой стороной договор, по которому другую сторону можно будет привлечь к ответственности в случае возникновения конфликтной ситуации. Что можно сделать, если Вас обманули: 1) Вы потеряли деньги. Откройте спор на базе платежной системы, которой Вы воспользовались для передачи исполнителю денежных средств, если система поддерживает такой функционал, либо обратитесь в техподдержку. На основном языке площадки подробно опишите ситуацию (Что? Где? Когда?) и приложите соответствующие доказательства (скриншоты логов переписки, видеоматериалы). При работе через банк, попытайтесь обратиться в Ваш банк за консультацией; 2) Вы потеряли результаты труда в виде файлов. Вероятно, имеет смысл выложить эти файлы в открытый доступ, тем самым понизив их ценность для недобросовестного заказчика, который может извлечь из них дополнительную выгоду. Тем самым Вы также внесете вклад в развитие сообщества. Либо найдите другого, более честного покупателя; 3) Опишите Вашу ситуацию на форуме. В этом нет ничего постыдного. Ваш опыт покажет другим людям как не нужно делать, и, возможно, в будущем кто-то не попадется в такую же ловушку и избежит временных и материальных потерь, а это дорогого стоит. Кроме того, Вы поможете выявить недобросовестных участников сообщества; 4) Сделать соответствующие выводы и воспринимать ситуацию как ценный опыт. Отрицательный, но опыт, который поможет Вам при ведении дел в дальнейшем. Не зацикливайтесь на неудаче - продолжайте работу над своим игровым проектом или делом. Надеюсь, приведенная выше информация поможет вам избегать неприятных ситуаций в будущем. Благодарю за внимание!
  16. 7 points
    Несуществующий баг или уязвимость На Ваш сервер заходит "доброжелатель", который сообщает, что "нашел" на Вашем проекте критический баг или уязвимость. Этот баг может сломать сервер и вообще ставит его существование под большой вопрос. Но сегодня Вам очень повезло! Всего за небольшое материальное вознаграждение "доброжелатель" охотно готов подробно рассказать о баге и даже помочь с его исправлением... Вам, конечно, хочется проверить, говорит этот человек правду или врет. Соответственно, далее Вы запрашиваете у "доброжелателя" какие-либо пруфы (доказательства) относительно существования бага, на что получаете утвердительный ответ, в котором сообщается следующее: "доброжелатель" свои условия уже поставил и озвучил, изменять им не намерен, в общем, "админ", давай деньги вперед. Надеюсь, на данном этапе Вы сделали вывод, что сотрудничать с данной личностью не следует по причинам, перечисленным в шапке данного топика. Но "доброжелатель" очень сильно хочет Вам помочь! Он начинает в красках рассказывать какая у Вас забагованная "недосборка", да и Вы сам полный "кретин", и вообще, если не сегодня, то завтра, а может и через месяц, он обязательно положит Ваш сервер. Несколько советов по данной ситуации: 1) Как показывает практика, игроки замалчивают информацию о багах и продолжают их эксплуатировать; 2) "Доброжелатель" может предоставить фейковые (ненастоящие) доказательства существования бага. Например, ему ничего не мешает запустить сервер на своем компьютере, сделать несколько скриншотов или записать видео, и отправить их Вам, якобы все что на них показано, происходит на Вашем сервере; 3) Не ведитесь на манипуляции и шантаж. Делайте ежедневные резервные копии баз данных сервера.
  17. 7 points
    Greetings. I was a member with nickname Gamemaker, you may know me as developer of one of model viewers for pko/top resources. Time to time i receive questions about game resources, how to fix them or how to use them. I can't do many for you, but some hints. But even that may be helpful. Once person ask about making glow for custom weapon apparels, show what he had, and i found there are no any public converter for game files. You have php one, but it require webserver and it can't make glowable weapon. Well... I can't beleave you guys can't share so simple scripts... So i did it again. Here is small update for model viever, it allow to import obj files to static lgo with save submaterials correctly. Due obj file format limitation, you can't get 100% correctly weapons version, but somehow you managed with limited tools you had before and i really impressed with that. So i leave here binnaries and link to source code Lgo works fine Lab works fine Lmo works fine Export/Import are under view. For use export - first add item to export list from rightclick model on tree of objects. For use import - just select file and click import I not guarantee it should work as you want, but get a try! Also you always can to polish tool yourself, if you have enough skills. Link to binnaries: https://mega.nz/file/vNlkVTpa#Wd7C2-s-UpHshUF_pdBh5jumAVJFwCnE2zhj3hT8W5c Link to sources: https://github.com/WeaponOwl/PKO-file-viewer Be nice, respect people
  18. 7 points
  19. 6 points
    Привет всем, мы с @MrSharp Анонсируем запуск сервера с 3-я принципами - Сохранение оригинальности игры в том числе рейты х1 на все - Игра будет развиваться в 2х направлениях - новый контент на уровни выше, и фикс багов - Репозиторий с серверными файлами будет публичный, оттуда и будут запущены наши сервера в онлайн. Дорабатывать сможет каждый и запустить свою версию на них так же сможет каждый. Open source forever :3 Ожидается 2 сервера, один с пометкой *бета* с тестированием и без бекапа, где не гарантируется сохранения данных И второй *релиз*, где будет бекап каждые 3 часа в разные хранилища Общение - сервис Мыслей на сайте (в разработке) Сайт - http://piratia.udio.agency/ Бета сервер успешно запущен, планы и новости в нашем дискорде
  20. 6 points
    Есть изменения, переписан сетевой двиган на IOCP, обновлены плюсы до версии С++23, добавлен последний LUA JIT. Будет релиз в следующем месяце.
  21. 6 points
    [Mod] Displaying the level of items on their icons ("smart icons") Some information appears on the icons of specific items: 1) For items with inserted gems, the level of fusion is displayed; 2) For gems, their level is displayed; 3) For fairies, their level is displayed; 4) For apparels, the inscription "App" is displayed. Requirements Installed mod loading system for server and client (PKOdev.NET mod loader). Modification information Name: pkodev.mod.itemlv Version: 1.0; Author: V3ct0r; Type: for client (Game.exe); Supported executable .exe files: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4 and GAME_13X_5. Installation Place the mod DLL file "pkodev.mod.itemlv.client.13x_<ID>.dll" for your version of Game.exe into the "mods" folder of the game client. Download 1) Binary release (.dll); 2) The source code of the mod for Visual Studio 2019 Community (C++). If you encounter any problem, bug or have any questions, then feel free to write in this thread.
  22. 6 points
    [Мод] Отображение списка предметов, выпадающих с монстров (ресурсов) Мод добавляет в игру форму со списком предметов, которые с определенным шансом выпадают из выбранного монстра, (см. скриншот выше). Монстр выбирается следующим образом: Правая кнопка мыши по монстру -> пункт контекстного меню "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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  23. 6 points
    Но если честно, как-то уходить от названий классических (лорных) немного неправильно. Представьте название Москва в MMORPG World of Warcraft. Это ж дичь. Считаю нужно сохранять лор (которого и так нет). И развивать его дальше. К примеру название нового города - Мехград (город механиков и кузнецов), Нордень (северный город), Анбург (сокращенное от Underground Burg; burg - это немецкая крепость) и так далее. Фантазию можно подключать. Тот же лут "Кумыс". Да, может кому-то кажется прикольным, но никак не вписывается в игру про пиратов. Либо если вводить кумыс, то вводить красиво - типа в Великом Магическом Океане обитают разбойники, их излюбленным напитком является парное молоко лошадей. А когда это молоко бродит, то превращается в неменее полезный напиток "кумыс" и он очень ценится в Великих Степях Шайтана. В общем, посыл думаю поняли
  24. 6 points
    [Source Code Mod] Fade Logo with hint Hello ! I have done this mod since a few weeks ago, and I decided to share it because some of you might think it looks cool and nice. The code can definitely be improved. Download 1) Mod 2) Preview I will make this mod work with V3ct0r's mod loader aswell, I will post it soon.
  25. 6 points
    [Source Code Mod] Interface Restrict Hello ! I have done this mod because it is annoying(atleast for me) when an interface element sinks beyond the client window. As for now, the code is implemented to work only for the skills user interface, you would have to make it work by yourself for the rest of the elements, which is pretty easy to figure out by just looking at the code and a bit of experience with the source code. Download: 1) Mod 2) Preview If you're having any issue to implement it, be sure to leave a comment with your issue with no worries.
  26. 6 points
    Друзья вот дизайн инвентаря с временным мешком. Хочу вам сказать что данный дизайн хочу полностью внести в игру пиратия очень понравилось данное оформление. Хочу скачать
  27. 6 points
    [Mod] Social buttons (Discord, Youtube, Twitch and etc) The mod allows you to add social buttons to the game, by clicking on which the player will be redirected to the corresponding resource on the Internet using the URL specified in the mod settings, for example, to the Discord server, to the Youtube channel, to the Facebook group. Buttons are bound to the minimap form ("frmMinimap"). Requirements Installed mod loading system for server and client (PKOdev.NET mod loader). Modification information Name: pkodev.mod.social; Version: 1.0; Author: V3ct0r; Type: for client (Game.exe); Supported executable .exe files: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4, GAME_13X_5. Installation 1) In the "mods" directory of your client, create a "pkodev.mod.social" folder; 2) Place into it the mod DLL file "pkodev.mod.social.client.13x_<ID>.dll" for your version of Game.exe; 3) Place into it the mod settings file "pkodev.mod.social.cfg"; 4) In the GUI scripts of the game client, add the required social buttons to the minimap form (form "frmMinimap" from the file "minimap.clu"), for example: btnFacebook = UI_CreateCompent(frmMinimap, BUTTON_TYPE, "btnFacebook", 24, 24, 0, 180) UI_LoadButtonImage(btnFacebook, "texture/mods/pkodev.mod.social/social.png", 24, 24, 0, 0, FALSE ) btnDiscord = UI_CreateCompent(frmMinimap, BUTTON_TYPE, "btnDiscord", 24, 24, 28, 180) UI_LoadButtonImage(btnDiscord, "texture/mods/pkodev.mod.social/social.png", 24, 24, 24, 0, FALSE ) btnYoutube = UI_CreateCompent(frmMinimap, BUTTON_TYPE, "btnYoutube", 24, 24, 56, 180) UI_LoadButtonImage(btnYoutube, "texture/mods/pkodev.mod.social/social.png", 24, 24, 48, 0, FALSE ) btnTwitch = UI_CreateCompent(frmMinimap, BUTTON_TYPE, "btnTwitch", 24, 24, 84, 180) UI_LoadButtonImage(btnTwitch, "texture/mods/pkodev.mod.social/social.png", 24, 24, 72, 0, FALSE ) btnTwitter = UI_CreateCompent(frmMinimap, BUTTON_TYPE, "btnTwitter", 24, 24, 112, 180) UI_LoadButtonImage(btnTwitter, "texture/mods/pkodev.mod.social/social.png", 24, 24, 96, 0, FALSE ) 5) Add social buttons to the mod settings file "pkodev.mod.social.cfg" in the following format: <button_name> = <URL> For the buttons from the example above: btnFacebook = https://facebook.com/ btnDiscord = https://discord.com/ btnYoutube = https://www.youtube.com/ btnTwitch = https://www.twitch.tv/ btnTwitter = https://twitter.com/ Download 1) Binary release (.dll); 2) The source code of the mod for Visual Studio 2019 Community (C++). If you encounter any problem, bug or have any questions, then feel free to write in this thread.
  28. 6 points
    A couple of years ago I had the idea of using an object as an npc for daily quests, I paid for it and never used it but I share it in case someone is interested Add in characterinfo after line 5 on server and client (compile) 7 CHA7 CHA7 4 2 7 0 1 1 1 0 0 0 0 0 0 0 0 0 1 7 100 182 -1 -1 0 0 0 7,8,9,10 0.797 1.392 4.709 40 1,5 0 399 398 0 0 0 1 1 0 0 25,28,29,34,35,36,37 100 0 0 0 0 0 0 0 1 1 1000 0 0 1 0 1 40 0 18 0 4 5 0 3 2 1 1 0 1 1 1442 0 1500 480 0 5 5 5 5 5 5 20 0 0 0 0 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1,1,1 Add in characteraction.tx 7 1 0 99 before 10 in line 1944 (I think), do not alter the order of how the numbers are displayed or the client will mark an error. add in garnernpc from server XX Quest Board 1 7 15 223200,279300 223200,279300 180 Argent City 3 0 Script_Npc01 0 and place the files in their respective client folders, Inside the file are the instructions in case there is an error Download Here is useful for, or any other use
  29. 6 points
    Насколько я помню в редакторе проверки на выделенный объект делаются по названию ноды. В чтобы установить "кисть" для редактирования поверхности земли, нужно чтобы название выбранной ноды совпадало с названием указанным в StringSet. * Вырезка из собственных исходников, код может отличаться от публичного CTreeNode* parent = dynamic_cast<CTreeNode*>(select->GetParent()); if (!parent) return; item = dynamic_cast<CItem*>(parent->GetItem()); if (!item) return; if (std::strcmp(item->GetString(), CLanguageRecord::inst()->GetString(539)) == 0) // [539] "поверхность" { CGraph* p = dynamic_cast<CGraph*>(tree->GetSelect()->GetItem()); if (p) g_Editor.SetTerr(press, p->nTag); return; } if (std::strcmp(item->GetString(), CLanguageRecord::inst()->GetString(540)) == 0) // [540] "Строительство" { CGraph* p = dynamic_cast<CGraph*>(tree->GetSelect()->GetItem()); if (p) g_Editor.SetObj(press, p->nTag); } Судя по первому скриншоту название ноды установлено как "поверхность земли". Попробуй в StringSet изменить [539] "поверхность" на [540] "поверхность земли", должно помочь. Либо найти в scripts\lua\forms файл editor.clu там поищи там: поверхность земли \239\238\226\229\240\245\237\238\241\242\252 \231\229\236\235\232 замени на поверхность \239\238\226\229\240\245\237\238\241\242\252
  30. 6 points
    Инструмент для обрезания и склеивания карт Данный инструмент позволяет вырезать квадратные фрагменты из файлов карт клиента .map и .obj, а так же добавлять фрагменты уже к существующим картам, таким образом, объединять несколько карт в одну. С её помощью, например, можно вырезать отдельный остров или создать объединенную карту мира. В .map файлах содержится вся основная информация о картах игрового мира: 1) Области суши и воды; 2) ID текстур поверхности суши; 3) ID регионов из areaset.bin; 4) Рельеф местности, высоты; 5) Проходимые и непроходимые участки; 6) Боевые и безопасные зоны. В .obj файлах находится список всех неживых объектов, которые присутствуют на карте (здания, постройки, деревья, растения, камни и тому подобное). Сам по себе инструмент не является законченной программой – пользователь должен самостоятельно написать программу, которая создаст требуемую карту. В качестве языка программирования используется C++, а средой программирования выступает Visual Studio 2019 Community. Таким образом, для использования данного инструмента потребуются базовые знания языка C++. API Инструментарий представлен двумя классами, которые находятся в файле Map.h: 1) pkodev::MapFile – класс для работы с картами в формате .map; 2) pkodev::ObjFile – класс для работы с картами в формате .obj. Данные классы обладают одинаковым интерфейсом. Кроме того, в файле Map.h определена структура pkodev::point, которая описывает точку с координатами (x, y). Поскольку, в основном, требуется одновременное редактирование .map и .obj файлов, был определен класс pkodev::MapWrapper, который инкапсулирует внутри себя объекты pkodev::MapFile и pkodev::ObjFile, и обеспечивает их одновременное изменение. Обладает таким же интерфейсом, как и указанные классы. В процессе работы могут возникнуть ошибки. Для их обработки определены классы исключений pkodev::map_file_exception и pkodev::obj_file_exception, которые являются наследниками класса std::runtime_error. MapFile::MapFile(), ObjFile::ObjFile() Создать пустую карту с нулевым размером. MapFile(unsigned int width, unsigned int height), ObjFile:: ObjFile(unsigned int width, unsigned int height) Создать пустую карту с размерами width x height. void MapFile::load(const std::string& path), void ObjFile::load(const std::string& path) Загрузить карту из файла. Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно. void MapFile::save(const std::string& path), void ObjFile:: save (const std::string& path) Сохранить карту в файл. Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно. MapFile MapFile::cut(const point& start, const point& end), ObjFile ObjFile::cut(const point& start, const point& end) Вырезать квадратный фрагмент карты. start – начальные координаты (x0, y0), end – конечные (x1, y1). Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно. void MapFile::glue(const point& pos, MapFile& map), void ObjFile::glue(const point& pos, ObjFile& map) Добавить на карту квадратный фрагмент. pos – координаты, по которым разместить фрагмент, map – добавляемый фрагмент карты. Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно. void MapFile::del(const point& start, const point& end), void ObjFile::del(const point& start, const point& end) Удалить с карты квадратный фрагмент. start – начальные координаты (x0, y0), end – конечные (x1, y1). Фрагмент заменяется морем. Выбрасывают исключения pkodev::map_file_exception и pkodev::obj_file_exception соответственно. void MapFile::clear(), void ObjFile::clear() Удалить карту и освободить память. Класс pkodev::MapWrapper обладает аналогичным интерфейсом, но есть разница в методах load() и save(): путь до файла указывается без расширения. Примеры использования Вырезание фрагмента Напишем программу, которая вырежет "остров Удачи" из локации "Великий Синий океан". Соответственно, нам необходимо работать с файлами darkblue.map и darkblue.obj. Открываем Visual Studio 2019 Community, создаем консольное приложение C++ и подключаем файлы Map.h и Map.cpp, либо загружаем уже готовый проект из архива во вложении. Алгоритм программы будет следующий: 1) Открыть файлы darkblue.map и darkblue.obj; 2) Вырезать из них фрагмент с координатами x0 = 1430, y0 = 1675, x1 = 1780, y1 = 2025; 3) Сохранить фрагмент в файлы fortune.map и fortune.obj. Пишем код: #include <iostream> #include "Map.h" // Точка входа int main(int argc, char* argv[]) { try { // Создаем объект для одновременной работы с .map и .obj файлами pkodev::MapWrapper darkblue; // Загружаем карту из файла darkblue darkblue.load("C:\\pkodev\\Client\\map\\darkblue"); // Вырезаем остров удачи pkodev::MapWrapper fortune = darkblue.cut({ 1430, 1675 }, { 1780, 2025 }); // Сохраняем остров удачи fortune.save("C:\\pkodev\\Client\\map\\fortune"); } catch (const pkodev::map_file_exception& e) { std::cout << ".map file error: " << e.what() << std::endl; return 1; } catch (const pkodev::obj_file_exception& e) { std::cout << ".obj file error: " << e.what() << std::endl; return 2; } catch (...) { std::cout << "Unknown error!" << std::endl; return 3; } return 0 } В результате получим карту (скриншот из YAMMI): Склеивание карт Теперь попробуем склеить несколько карт в одну. Для примера создадим массив "островов Удачи", из острова, который мы получили в прошлом примере. Алгоритм программы будет следующий: 1) Создать пустую карту размером 1024 x 1024; 2) Загрузить "остров Удачи" из файлов fortune.map и fortune.obj; 3) Поместить "остров Удачи" по координатам (128, 32) на карту; 4) Поместить "остров Удачи" по координатам (512, 320) на карту; 5) Поместить "остров Удачи" по координатам (128, 576) на карту; 6) Сохранить карту в файл array.map и array.obj. Пишем код: #include <iostream> #include "Map.h" // Точка входа int main(int argc, char* argv[]) { try { // Создаем пустую карту 1024 x 1024 pkodev::MapWrapper map(1024, 1024); // Остров Удачи pkodev::MapWrapper fortune; // Загружаем остров Удачи из файла fortune.load("C:\\pkodev\\Client\\map\\fortune"); // Добавляем несколько островов Удачи на пустую карту map.glue({ 128, 32 }, fortune); map.glue({ 512, 320 }, fortune); map.glue({ 128, 576 }, fortune); // Сохраняем карту map.save("C:\\pkodev\\Client\\map\\array"); } catch (const pkodev::map_file_exception& e) { std::cout << ".map file error: " << e.what() << std::endl; return 1; } catch (const pkodev::obj_file_exception& e) { std::cout << ".obj file error: " << e.what() << std::endl; return 2; } catch (...) { std::cout << "Unknown error!" << std::endl; return 3; } return 0; } В результате получим карту (скриншот из YAMMI): Скачать инструмент (9 Кб)
  31. 6 points
    hello there! this small optimizing for _evtGameOptionFormMouseDown normal code will run every functions in the list even if its same previous value example: so what we do small optimize to call changed values in system options only " this helpful if you are using hide effects/apps etc" the modification: open UISystemForm.cpp and search for : void CSystemMgr::_evtGameOptionFormMouseDown(CCompent* pSender, int nMsgType, int x, int y, DWORD dwKey) for example we change it to now repeat same steps for the rest options pGroup = g_stUISystem.cbxHelpMode; if (pGroup) { bool bHelpMode = pGroup->GetActiveIndex() == 1 ? true : false; if (g_stUISystem.m_sysProp.m_gameOption.bHelpMode != bHelpMode) { g_stUISystem.m_sysProp.m_gameOption.bHelpMode = bHelpMode; if (!bHelpMode) g_stUIStart.ShowLevelUpHelpButton(bHelpMode); g_stUIStart.ShowInfoCenterButton(bHelpMode); ::WritePrivateProfileString("gameOption", "helpMode", bHelpMode ? "1" : "0", "./user/system.ini"); } }
  32. 6 points
    Introduction: I am a developer who have some knowledge in TOP/PKO Development and some understanding of the marketing aspects of it. I want to work with any server for a fraction of the total server's income. Requirements: - the server must be in operation (in other words, I will not work with admins who are in development phase and not yet open) - the server must already have a steady amount of players - the server must already have a decent income What I will bring to the table: - security - automation (build automation, version automation, infrastructure automation, backup automation) - mentoring (mentor other members, provide code feed back) - versioning of the source codes and builds - continuous logging to ensure players are micro-managed (hehe), and server is operational - feature development (C, C++, Lua) - quality assurance and testing What I wont do: - admin (logging into production server) - engage with players - log into the game - advertise your server - 3D-related (modeling, animations, upgrading game engine) - Web related (I do not touch deprecated PKOSITE written 50 years ago) Other: - The pay out should be bi-weekly - I have the rights to terminate myself at any given time - You have the rights to terminate me at any given time - Any codes that I contribute is YOURS and all ownership belongs to the server - Any miss payout is an automatic termination - I will work according to my own schedule but finish all task within a bi-weekly sprint - I am not selling you codes, I am not part of the team, I am aiding your journey to success
  33. 6 points
    Всем привет! В системе групп пользователей произошли изменения: 1) Возвращена группа "Модераторы". В данный момент на форуме идет набор модераторов; 2) Группа "Комьюнити" более не обладает модераторскими правами. Группы пользователей были обновлены: Модераторы Эти парни охраняют порядок на форуме: @Snowfall, @Dan, @patrick13. Администраторы сервера Они в данный момент держат игровые проекты и благодаря им наша игра живет: @Faller, @estrangulador, @Fisal Moha, @Phai, @Sultan, @Hard Wood, @xEvo7, @emofc, @Дракан, @Buccaneers Online, @V1k1NGO, @noanshadow, @luamaster, @Pirate X-Z, @NobleNutz, @[email protected], @Kraken Online, @Awatawa, @K1D0, @Chudik, @Kara Online, @HappinessMAPKO, @Tempest, @Vehd, @kiberhack, @Dimasik, @jordan. Комьюнити Внесли большой вклад в развитие форума и сообщества в целом: @Graf, @BETEP/macs509, @Fomin, @NMS3RR, @1g0rS1lv4, @small666, @yagura2k, @Snre3n, @wolfenx, @Duduf, @Angelix, @aleksandr, @mkhzaleh, @Lua, @patrick13, @Danny, @Eviles, @Greaux, @Engrain, @GustavoHMA, @cpworkerz, @xSeth, @e1mer, @Tera, @Kovu, @Spidpex, @Madwizard, @DangThao, @Ximboliex, @Jap, @Totoka, @Billy, @Foxseiz, @Rinor, @Vasil, @FapFap, @Shako, @blazi10, @Lucky, @Darling, @Home, @Nobre, @Jones, @Onioni, @OldHero, @Anthoni, @x3w0r, @flamyman1412, @BlackBarba, @J0k3r, @iZae, @RedMAN, @saa0d, @DevMorgan, @Knight, @XXD, @Xeon, @Wrexor, @deguix, @Blanquitoh, @mangojkee, @Gamez Pirates, @Masuka00, @Silfro, @MonkeyCode. Благодарю за внимание!
  34. 6 points
    At first the project revolved around trying to get some "better" lua code going, but ended up being at attempts at winging the 2.x C++ source code to work successfully, ofc with the great help from @Snre3nfrom the C++ side of things. The instructions on how to build and more info on it are in https://gitlab.com/deguix/top-recode. Sry for not making a thread earlier, I'm not really good at publishing stuff, and also a bit afraid of going all out on it too because of my limited time that I can dedicate to it. Also have a discord: https://discord.gg/uwcR74E. It's a bit of a mess, but I guess you can bug me there too if you like. Just don't bug me too much, as in, please have some previous experience in development. I definitely want to hear about the success of compiling it, because that's something most people struggle with with any C++ project on Windows. Anyways, most of the notifications I get are from people not being able to compile it. Just run build.bat as admin please and tell me the errors that pop up. Oh yes, this project built by default will only work on Windows 10 and above. You can install the Windows 7 SDK and retarget all projects to use that, not sure if errors will pop up though. I won't support it. I use currently MSQL 2017. Once MSQL 2019 gets released, use it, and you can have free UTF-8 support. On Windows 10, there's a feature to force all older apps to use UTF-8. Remember, it only works with MSQL 2019! Older MSQL won't run!
  35. 5 points
    Greetings everyone, I am posting all the features that I've purchased for free. Hope you enjoy them and have a great day! Client Src Contains the following : https://mega.nz/file/uDYV0aIb#aHu8p1Kg8Q4yhXyFC7-G5zpciRKW1wer-EgbmdsUm9g Mounts Devloped by Mothana Fixed 100% vs 2003 New resolutions Devloped by ShadowJr vs 2003 Drop Info Mob Info Devloped by Lonley vs 2003 Vip Nitro + Custom Kill Notice Devloped by Mothana vs 2003 New Loading with perfect timing Im not sure who devloped it but all i know that Zizo Scammed that feature from some one vs 2003 New Game Settings Hide Mounts / Glows / Top 2 Cam ete all fixed Devloped by Lonley vs 2003 f1 f2 banel Fixed 100% Devloped by ShadowJr vs 2003 Offline Mode Devloped by me vs 2003 60 FBS Devloped by Lonley vs 2003 there is more inside those srcs just search and pick what you like Game Client https://mega.nz/file/2G5H3Iob#7r-FB4c6fMEw0_deO0l3qLTctJIvJYjDafE9pRnEJOI Mount info.txt + Bin System + Loading words Website Files https://mega.nz/file/jbgVHBjb#jRPN9llqwME3QgDUwdDHTxQDZ3JvGKrCsOA9kwZrGaA Server Src Side https://mega.nz/file/qTgkjDrY#eNBU_0XPuQUExSpb02tRPqW9hmfU4EbAdm4Diz_ShrE
  36. 5 points
    Simple Admiral Cloak Script - [Video Tutorial] I have always looked for, and never found a Cloak script that is easy to install and configure, so after learning a little decide to create a tutorial with a script edited by me, I know the script is far from good or beautiful, but it's good for who is starting, and does not know where to start. Includes: Cloak Script Configuration files Glow Lines Color of icons changed (to give my touch xD) Video Tutorial Don't have Gems Video Tutorial Scans: VirusTotal Jotti Download: MEGA Credits: Some codes were made by other people. All credits to them.
  37. 5 points
    Problems with the forum 05/08/2023 - 11/11/2023 Hello friends! Unfortunately, the PKOdev.NET forum was unavailable for several months between August 05 and November 11, 2023. The cause for the forum's malfunction was a DDoS attack that began a few days before the forum failure. Perhaps someone remembers the errors 504 Gateway Timeout, 508 Resource Limit Is Reached and 500 Internal Server Error the day before. The attack affected server software, which took some time to recover. Protection against DDoS attacks was also installed. The forum is currently online and continues to operate as normal. On behalf of the forum team, I want to thank all the people who were interested in the fate of our forum and waited for its restoration. Thank you very much! We apologize for any inconvenience caused! We wish you a good day and pleasant work with the forum! P.S. Once again, I would like to especially thank our technical administrator @Panda, who was involved in solving this problem and successfully returned the forum to working state.
  38. 5 points
    [Mod] Medals (necklaces) with titles The modification allows you to create medals (necklaces) with different titles that appear in brackets before the name of the character (see screenshot). Also, these necklaces allow you to change the color of the names of the characters. The text, color of the title and color of the character's name are specified in the file ItemInfo.txt for items with type 25 (necklace). 1) The text of the title is specified in the description of the item The maximum title length is 15 symbols; 2) The color of the title is specified in the 5th field instead of model for Lance. Color has format FFRRGGBB; 3) The color of the name is specified in the 6th field instead of model for Carsise. Color has format FFRRGGBB; Some examples of medals with titles: 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 Example of medal with title and colored character name: 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 Requirements Installed mod loading system for server and client (PKOdev.NET mod loader). Modification information Name: pkodev.mod.title; Version: 1.0; Author: V3ct0r; Type: for client (Game.exe); Supported executable .exe files: GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4, GAME_13X_5. Installation 1) In the "mods" directory of your client, create a "pkodev.mod.title" folder; 2) Place into it the mod DLL file "pkodev.mod.title.client.13x_<ID>.dll" for your version of Game.exe; 3) Add new medals (necklaces) with titles to the file ItemInfo.txt of the server and client according to the example from the topic header. Compile ItemInfo.txt for the client. Download 1) Binary release (.dll); 2) The source code of the mod for Visual Studio 2019 Community (C++). If you encounter any problem, bug or have any questions, then feel free to write in this thread.
  39. 5 points
    [Release] Clean Tales of Pirates 1.36 Client and Patch Hey all. This is the official Tales of Pirates installer for a clean 1.36 client, as well as a clean 1.36 patch; note that the only client and patch currently available are mismatched. I have also added the archives of the installed files for each in case you don't want to run the installer. Installers Archives
  40. 5 points
    Тестирование клиента на MacOS Новости разработки и другие интересные фишки в нашем Телеграм канале
  41. 5 points
    (Portuguese) ola amantes de tales of pirates, estou trazendo atualizações para quem possa interessar, do jogo baseado em tales of pirates que estou desenvolvendo com UNITY 3D, pelo que ja vi pela internet e ate aqui no forum, existem outros que estão interessados e curiosos pra saber como isso seria, e eu fico feliz com isso pois eu tenho certeza que recriar o top pela unity trara infinitas possibilidades, mas sei em primeira mao o quão difícil é principalmente a estrutura da rede ja que Unity esta descontinuando Unet Unity Unet Link , e um novo sistema ainda nao esta disponivel por isso que eu fiz minha própria estrutura com tcpClient configurando meu próprio socket etc... Estou a mais de 1 ano quebrando a cabeça e alguns mouse kkk, mas agora neste ponto em que estou tenho certeza de que foi a melhor escolha, e sei que agora temos o codigo fonte do jogo o que possibilita muito mais do que antes, mas acreditem com unity teremos muito mais, a facilidade de incrementar monstros novas classe novas habilidades e tudo mais é ridícula de fácil, criar novos mapas novos recursos, pensa no teu sonho mais maluco de implementação, eu te garanto com unity é possível, a unity é apenas a uma engine entre muitas e eu a escolhi pela facilidade e uma comunidade gigante, mas qualquer engine serve, se alguem quiser tentar criar seu jogo com unity e quiserem criar topico no forum pra desenvolvimento dos seus próprios projetos eu posso ajudar e dar dicas, nao vou disponibilizar o meu (pelo menos por enquanto) ate porque nao documentei nada e outras pessoas ficariam mais perdidas, agora sempre que possível posso ajudar com dicas do que ja aprendi, nao sei tudo mas ja percorri um bom caminho e acho que criarmos projetos em unity e compartilharmos conhecimento teremos vários jogos baseados em Top modelado ao gosto dos criadores, mas nao só isso ter um mmorpg no seu portfólio ira abrir portas. vejam algumas fotos do progresso do jogo(lembrando que no momento nao estou criando muitas novidades e sim implementando oque o top ja tem). desenvolvido por min. criditos ao blackbarba pela ajuda com design; (english) Hello lovers of tales of pirates, I am bringing updates to anyone who may interest, the game based on tales of pirates that I am developing with UNITY 3D, from what I've seen on the internet and so far in the forum, there are others who are interested and curious to know how it would be, and I'm happy with that because I'm sure recreating the top by unity will bring endless possibilities, but I know firsthand how difficult the network structure is especially since Unity is discontinuing Unet Unity uNet link, and a new system is not yet available so i made my own structure with tcpClient setting up my own socket etc ... i'm over 1 year breaking my head and some mouse kkk but now at this point i'm sure it was the best choice, and I know now we have the source code of the game which makes it much more easy than before, but believe me with unity we will have much more, the ease of incrementing new monsters,new skills and everything else is ridiculous easy, create new maps new features, think of your wildest implementation dream, i assure you with unity is possible, unity is just one engine among many and i chose it for ease and a giant community, but any engine will do, if anyone wants to try to create their game with unity and want to create forum topics for the development of their own projects I can help and give tips, I will not make mine available (at least for now) because I have not documented anything and other people would be more lost, now whenever possible I can help with tips from what I have learned, I do not know everything but I have come a good way and I think that creating projects in unity and sharing knowledge will have several games based on Top modeled to you like, but not only, having a mmorpg in your portfolio will open doors. Check out some photos of the progress of the game (remembering that at the moment I'm not creating much news but implementing what the top already has). developed by min. credit to blackbarba for design help;
  42. 5 points
    У меня родилась дочка Скоро продолжу
  43. 5 points
    Всем привет Мы чутка освободились и наконец-то пришли с новостями. Предисловие: Вот уже 2 года и 10 месяцев как мы находимся в разработке нашего продукта. Смотря сейчас на пройденный нами путь, мы понимаем, что разработка собственной игры, а тем более кроссплатформенной это не самое быстрое занятие и легкое хобби. Из-за желания сделать продукт идеальный, мы совершали ошибки, за которые уже поплатились самым ценным ресурсом человечества - временем. Если бы можно было вернуться в начало нашего пути и дать пару советов, то мы бы сэкономили как минимум целый год. Но не всё так плохо, самое важное что мы получили - это опыт, опыт который считается бесценным для нас. Позвонить разработчику на мобильный номер и будить его, потому что он в процессе спринта проспал начало работы? - Да, это про нас. Уснуть на стуле или на столе в ночное время пока вы решаете, как в этом чертовом MindPower'e реализована система эффектов? - Да и это про нас. Сломать, построить, сломать и ещё раз построить чтобы потом опять сломать? - Да, увы и это про нас. Мы предусматриваем даже неразумные вещи, которые могут произойти с продуктом в процессе его эксплуатации. Больше 5 млн рублей в нашей excel таблице сейчас в расходах, больше чем десятки тысяч коммитов в репозиториях, мы разобрали эту чертову игру на кусочки и собрали её заново, мы даже знаем кому звонить когда ошибка в графическом движке при воспроизведении анимации (поищите в исходниках "crash!!!, call"), мы уже не просто команда, а уже большая семья. Всё это время мы искали ту самую, единственную, верную тропу по которой нам необходимо идти, и мы её нашли. Ну и к чему же мы наконец-то пришли? Клиент: На данный момент мы переписываем весь функционал клиента прописанный в C++ на скриптовой язык LUA. Для чего? Скриптовой язык LUA является простым на наш взгляд, как минимум проще чем C++, средняя стоимость оплаты труда на порядок меньше, разграничение скриптовой логики и логики движка предоставляет куча безопасности, избавляет раз и навсегда от утечек памяти, скорости работы и самое важное - ускоряет процесс разработки. Множество важных элементов игрового и графического движка мы переписали с 0, такие как рендер карты, игровые эффекты, рендер в принципе. Наш девиз - Кара должна запускаться даже на кофемолке © alex2772. Мы помешаны на оптимизации и не позволяем себе потратить лишние 10 миллисекунд в UI потоке, поэтому всё что можно мы стараемся вытащить в другие потоки без частого использования мьютексов. И конечно, мы понимаем, что какой-то наш забугорный клиент может иметь телефон на какой-то 4.x версии android’a с ограниченным количество CPU и предусматриваем это. Хочется отметить важный факт, что мы делаем клиент игры, который способен работать на 1.38 версии клиента, а с некоторыми доработками и на 2.0. И не исключаем возможность тестирования нашего клиента совместно с руководством и игроками существующих серверов по их желанию. CI/CD: Мы очень активно пользуемся технологией CI и CD. Каждый раз когда разработчик делает коммит в репозиторий, то клиент игры автоматически собирается под все платформы и обновляется на всех платформах. Чтобы залить обновление для клиента, нам достаточно 1 коммита. Сервер: GateServer, GroupServer и AccountServer переписали с нуля, GameServer пока фулл рефактор скриптов. Все сервера переписали под CMake и адаптировали под работу в Linux, затянули их под технологию Docker и сразу же под технологию Kubernetes. Lua игрового мира: Все вы знаете, как выглядит легаси код сервера, как в нем не понятно что к чему - все навалено в один файл и покрыто китайскими комментариями с битой кодировкой. А если копнуть дальше, то можно заметить в коде очень много проблем с глобальными переменными, а также все это сопровождается алгоритмическими ошибками. Когда к нам в команду пришел опытный луа-разработчик, он сказал: “это все говно нужно переписывать, как оно работало - я хз”. Теперь у нас ООП в Луа, мы переписываем легаси архитектуры, к примеру вот так сейчас выглядит обычный диалог с НПС. Теперь не нужно продумывать сложную логику из взаимосвязи страниц, даже разработчики с низким уровнем знания lua разбираются с этим быстрее, чем это было раньше. “У вас много магических чисел - магические числа — это плохо”, он не исправил это, но теперь весь код наполнен комментариями по всем магическим числам, по которым можно дать комментарии. Большинство функций, поведение которых не тривиально описаны и задокументированы. Пример: Вы знаете самые нагруженные функции в луа на вашем сервере? Вы знаете, как их найти? Вот и мы тоже не знали, а теперь в нашем арсенале 3 профилировщика, которые покажут нам, где мы просаживаемся по производительности при росте онлайна. А где же мы берем онлайн, у нас на сайте все время 4% нагруженности было… Наш луа код на сервере покрыт комментариями на 90%, а все что можно шаблонизировать - шаблонизировано или продолжает шаблонизироваться: Кстати, на скриншоте можно еще увидеть новое логирование, которое вываливает traceback и систему мультиязычности сервера. Вы знаете сколько игрок прошел заданий и сколько денег он потратил на лечение? Вот и мы тоже не знали, но добавили больше 100 различных метрик, которые можем анализировать и выводить в красивые и информативные графики. Перебалансированные квесты по наградам и уровням. Теперь мы можем решать чем заниматься игрокам на сервере: - прокачка через убийство мобов: повышаем рейты на убийство опыта, понижаем рейты на получение опыта с заданий, - прокачка через историческую цепочку: понижаем рейты за убийство мобов, понижаем опыт за обычные сайд задания, повышаем за историческую цепочку. При всех этих изменениях мы продолжаем поддерживать старую, добрую Пиратию и в любой момент все наши изменения баланса/экономики за 10 минут откатываются обратно, кроме квестов, наверное. Это все благодаря одному конфигурационному файлу, который отвечает за константные переменные, а также за активацию тех или иных систем. Каждой системе отдельный файл, каждой системе отдельный флаг отключения - мы разбили весь луа код из 10-15 файлов в 250+ и это позволяет лучше понимать работу систем, что снижает порог вхождения новых разработчиков. Наш репозиторий сервера насчитывает более 2500 коммитов, свою руку к коду приложило около 20 специалистов, различной направленности. А через наши файлы в целом прошло больше 60 человек: они рисовали иконки и картинки, писали новые задания, рефакторили старый код, писали новые системы, писали музыку и звуки, изменяли карты, страдали и наслаждались результатом. С каждым разом описывая наши достижения мы хотим поделиться всем, но пока мы писали данный пост мы понимаем что всё описать невозможно, по этому оставим тут самые интересные и важные на наш взгляд новости.
  44. 5 points
    [Мод] Система ежедневных наград за вход в игру Данный мод реализует систему ежедневных наград за вход в игру. Игрокам необходимо каждый день заходить в игру, чтобы получить очередную награду - с каждым новым днем награда становится ценнее. Если игрок пропускает день, то цепочка сбрасывается и начинается заново с первого дня. Каждую неделю цепочка так же сбрасывается. Цепочка наград настраивается администратором в специальной 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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  45. 5 points
  46. 5 points
    very informative answer, I think everybody is going to benefit from it, even I was inspired by it... If he had access to the client source "or" had the knowledge why would he bother asking to get such an answer? any ways cause you just inspired me, I'm posting this. Hey fella, open up "MouseDown.cpp" file and find the following functions CMouseDown::_AttackCha CMouseDown::_AttackArea add this on top of their body short nJob = pMain->getGameAttr()->get(ATTR_JOB); enum class rJob { Explorer = 4, Herbalist = 5, Cleric = 13, Sealmaster = 14, Voyager = 16, }; for _AttackCha replace the following: if(pSkill->IsAutoAttack() && g_pGameApp->IsShiftPress()) { if (_pAutoAttack->AttackStart(pMain, pSkill, pTarget)) return true; } with this: if( pSkill->IsAutoAttack() && g_pGameApp->IsShiftPress() ) { switch (nJob) { case rJob::Explorer: // if you're using modern c++, you can add [[fallthrough]] for the rest of the cases case rJob::Herbalist: case rJob::Cleric: case rJob::Sealmaster: case rJob::Voyager: g_pGameApp->SysInfo("Autoattack is disabled for magic classes!"); break; default: if (_pAutoAttack->AttackStart(pMain, pSkill, pTarget)) return true; } } for _AttackArea replace the following: if(pSkill->IsAutoAttack() && g_pGameApp->IsShiftPress()) { if(_pAutoAttack->AttackStart(pMain, pSkill, nScrX, nScrY)) return true; } if(pSkill->IsAutoAttack() && g_pGameApp->IsShiftPress()) { switch (nJob) { case rJob::Explorer: case rJob::Herbalist: case rJob::Cleric: case rJob::Sealmaster: case rJob::Voyager: g_pGameApp->SysInfo("Autoattack is disabled for magic classes!"); break; default: if(_pAutoAttack->AttackStart(pMain, pSkill, nScrX, nScrY)) return true; } }
  47. 5 points
    I HAVE GOOD HOST I WANT OPEN VANILLA SERVER OR MEDIUM RATE I HAVE INSTALLED ONE ALL NEED SCRIPTER. NPCS ETC I INSTALLED DATABASE, ALL NEEDED WORKING PROPERLY ALREADY
  48. 5 points
    Bug Title: when logging out of his character he disappears Bug Description: when logging out of his character he disappears How to replicate: when logging out of his character he disappears Status: CLOSED Author (whoever that fixes it): Eviles and GustavoHMA Reported Error location. opens the ItemContent.h file located at: Client\Common\common\include search for the function: short sNeedLv; and above it add this: bool bIsLock; getting like this: now search for this function: inline SItemGrid :: SItemGrid (short sId, short sINum) find: sNeedLv = 0; and above it add this: bIsLock = 0; getting like this:
  49. 5 points
    1. Updated client modification to automatically enter the game [+] Now launch parameters are specified in parameter:value format and their sequence does not matter. List of available parameters: ip - server address [Required] port - server port version - game version from GateServer.cfg login - login from player account [Required] password - password from player account [Required] character - character name Example: start system\Game.exe startgame ip:127.0.0.1 port:2015 login:V3ct0r password:123456 version:139 character:V3ct0r If the required ip, login and password parameters are not specified in the Game.exe startup parameters, the game will start in normal mode. If the port and version parameters are missing, the server port and game version values will be taken from Game.exe. [+] Now you can immediately enter the game as a character bypassing the character selection scene. To do this, specify the character name in the launch parameter character. If this parameter is not specified, it will automatically enter the character selection scene. 2. Table encryption (.bin files) This modification encrypts .bin files (ItemInfo.bin, CharacterInfo.bin, SkillInfo.bin and others) in the Client\scripts\table folder. Thus, it is now impossible to get the source .txt files from encrypted files using the decompiler, and they can not be used in other game clients. ItemInfo.bin file before encryption: After encryption: This mod will help against the theft of items, monsters and other game data from your server. 3. Highlighting viewed trade stalls with color Plates with the names of the stalls that the player has already viewed are highlighted. 4. Highlighting NPCs and their coordinates NPC names are highlighted in a different color, and their coordinates are displayed below the NPC characters. 5. Mana (SP) bar Under the bar of the health level of character a bar with a mana level appears. 6. Built-in game client registration of game accounts This modification allows players to create game accounts directly in the game client: for this, the “Registration” button is present on the game login form, by clicking on which the registration form is displayed. To prevent automated creation of accounts and spamming from bots, captcha is provided. After successful account creation, a player can immediately enter the game without entering a username and password.
  50. 5 points
    In this thread I will upload evrything I like e
  • Newsletter

    Want to keep up to date with all our latest news and information?
    Sign Up
×
×
  • Create New...