Jump to content

Search the Community

Showing results for tags 'система'.



More search options

  • Search By Tags

    Type tags separated by commas.
  • Search By Author

Content Type


Forums

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

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Found 4 results

  1. [Мод] Система контрактов Данная система представляет собой квест типа: "Охота на монстров", целью которого является добыча персонажем игрока некоторого количества определенных монстров. Игроку выдается специальный предмет - "Контракт", в котором указано на какого монстра и в каком количестве игроку предстоит охотиться. По мере охоты, в контракте обновляется текущий прогресс игрока. После добычи необходимого числа монстров контракт считается выполненным, и игрок может получить награду, использовав предмет "Контракта". Система состоит из двух частей: модификация pkodev.mod.loader для игрового клиента (Game.exe) и Lua-скрипт для игрового сервера (GameServer.exe). Модификация клиента необходима для визуализации заданных характеристик предмета в поле-подсказке для предмета "Контракта" при наведении на него курсора мыши. ID монстра-цели, количество добытых монстров и количество монстров, необходимых для завершения "Контракта", записываются в следующие характеристики предмета: ITEMATTR_VAL_STR, ITEMATTR_VAL_DEX и ITEMATTR_VAL_AGI соответственно. Задачей мода является отображение этих характеристик в понятном для игрока виде. Например, если ITEMATTR_VAL_STR = 103, ITEMATTR_VAL_DEX = 5, а ITEMATTR_VAL_AGI = 10, то игрок при наведении мыши на "Контракт" увидит следующую информацию: Охота: 'Лесной дух' x 10 Добыто: 5 / 10 Lua-скрипт для игрового сервера является ядром Системы контрактов, в котором содержатся настройки системы и логика её работы. Например, при добыче очередного монстра, скрипт будет искать в инвентаре персонажа подходящий активный "Контракт", и если такой предмет будет найден, то Система обновит его состояние. Важной настройкой скрипта является функция, которая необходима для выдачи награды после успешного завершения "Контракта" игроком. Некоторые особенности системы: 1) "Контракт" можно подобрать, выбросить, передать другому игроку, положить в банк или продать; 2) Если у игрока в инвентаре несколько "Контрактов" на охоту на одного и того же монстра, то при добыче данного монстра "Контракт" выбирается случайным образом; 3) Для получения награды после завершения "Контракта", игрок должен использовать предмет "Контракта", например, с помощью двойного клика мыши по нему. Если "Контракт" еще не завершен, то игрок увидит соответствующее сообщение в систему; 4) Состав и количество награды определяются администратором в специальной функции скрипта системы; 5) ID и тип предмета для "Контракта" должны быть уникальными и задаются администратором в настройках Системы. Тип предмета по умолчанию равен 99, ID предмета по умолчанию не определен. Информация о модификации Название: pkodev.mod.contract; Версия: 1.1; Автор: V3ct0r; Тип: для игрового клиента (Game.exe); Поддерживаемые исполняемые файлы (.exe): GAME_13X_0, GAME_13X_1, GAME_13X_2, GAME_13X_3, GAME_13X_4 и GAME_13X_5. Установка Системы контрактов Игровой сервер 1. Добавьте в файл GameServer\resource\ItemInfo.txt предмет для "Контракта". Для этого выберите подходящий ID (XXXX) и тип предмета (по умолчанию 99): XXXX Контракт n0184 10130005 0 0 0 0 0 00 99 0 0 0 0 0 1 1 1 1 1 1 0 -1 0 -1 0 0 -1 -1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0,0 0 10,10 0,0 0 0 0 0 0 0 0 0 0 ItemUse_PKOdevContract 0 0 0 0 0 0 После завершения Вы получите награду! где XXXX - любой незанятый ID. 2. Поместите Lua-скрипт pkodev.contract.lua в директорию GameServer\resource\script\calculate\mods (при необходимости создайте каталог mods). Примечание: Скрипт pkodev.contract.lua отправляет игрокам различные сообщения на английском языке. Вероятно, Вам будет необходимо перевести эти сообщения на русский язык. 3. Откройте файл pkodev.contract.lua и настройте его следующим образом: 3.1 В переменную item_id запишите ID предмета из ItemInfo.txt (XXXX): item_id = XXXX, 3.2 В функции CompletionCallback() запишите код, который будет выдавать игроку награду после выполнения "Контракта". По умолчанию функция выдает игроку 1,000 золотых монет, случайный предмет (Очищающий самоцвет x 1, или Самоцвет ярости x 2, или Кекс x 60, или Фея удачи x 1) и запускает фейерверк: CompletionCallback = function(role, item) -- Выдать 1,000 золотых монет AddMoney (role, 0, 1000) -- Список предметов local arr = { {id = 885, count = 1 }, -- Очищающий самоцвет x 1 {id = 863, count = 2 }, -- Самоцвет ярости x 2 {id = 1849, count = 60}, -- Кекс x 60 {id = 231, count = 1 } -- Фея удачи x 1 } -- Выдать случайный предмет local idx = math.random(1, table.getn(arr)) GiveItem(role, 0, arr[idx].id , arr[idx].count, 4) -- Запустить фейерверк PlayEffect(role, 361) end 3.3 Откройте файл GameServer\resource\script\calculate\SkillEffect.lua и в самом начале запишите строку: dofile(GetResPath("script\\calculate\\mods\\pkodev.contract.lua")) 4. Система контрактов была успешно установлена на Ваш сервер. Поздравляю! Также обратите внимание на реализацию скрипта Системы контрактов от @Angelix. Она более гибкая и продвинутая по сравнению с той, что предлагается выше. Описание скрипта и инструкцию по установке можно найти в соответствующей теме: Игровой клиент 1. Добавьте в файл Клиент\scripts\table\ItemInfo.txt предмет для "Контракта" (см. выше "Установка Системы контрактов" > "Игровой сервер" > пункт 1. Скомпилируйте ItemInfo.txt. 2. Добавьте в файл Клиент\scripts\table\StringSet.txt следующие строки, которые увидит игрок при наведении курсора мыши на предмет "Контракта": [1000] "(Выполнен)" [1001] "(Выполняется)" [1002] "Охота: '{0}' x {1}" [1003] "Добыто: {0} / {1}" Примечание 1: Если ID строк 1000 - 1003 уже заняты, то вместо них запишите свободные ID. Примечание 2: После добавления данных строк в файл StringSet.txt, удалите файл StringSet.bin, если он существует, иначе изменения не применятся. Примечание 3: В строке 1002 маркер {0} обозначает название монстра, а {1} - количество монстров, которое необходимо добыть. В строке 1003 маркер {0} обозначает число уже добытых монстров, маркер {1} по значению аналогичен строке 1002. 3. Установите систему загрузки модов pkodev.mod.loader, если она не была установлена ранее. 4. Поместите файл DLL-библиотеки мода pkodev.mod.contract.client.13x_{ID}.dll для Вашей версии Game.exe и файл настроек мода pkodev.mod.contract.json в папку mods\pkodev.mod.contract игрового клиента. 5. Откройте файл настроек мода pkodev.mod.contract.json и запишите в него следующие параметры по Вашему усмотрению: 1. itemType - тип предмета "Контракта", указанный в ItemInfo.txt. По умолчанию 99. 2. colorCompleted - Цвет метки "(Выполнен)" во всплывающей подсказке предмета "Контракта" в формате 0xAARRGGBB. По умолчанию 0xFF00FF00 (Зеленый). 3. colorActive - Цвет метки "(Выполняется)" во всплывающей подсказке предмета "Контракта" в формате 0xAARRGGBB. По умолчанию 0xFFFFA500 (Оранжевый). 4. STRING_001 - ID строки для метки "(Выполнен)" из файла StringSet.txt. По умолчанию 1000. 5. STRING_002 - ID строки для метки "(Выполняется)" из файла StringSet.txt. По умолчанию 1001. 6. STRING_003 - ID строки для метки "Охота: '{0}' x {1}" из файла StringSet.txt. По умолчанию 1002. 7. STRING_004 - ID строки для метки "Добыто: {0} / {1}" из файла StringSet.txt. По умолчанию 1003. Примечание: Данный файл можно не редактировать, если Вы использовали значения по умолчанию в файлах ItemInfo.txt и StringSet.txt. 6. Настройка клиента завершена! Создание "Контрактов" и их выдача игрокам "Контракты" создаются с помощью функции contract.create(), которая в качестве своих аргументов принимает дескриптор персонажа, которому выдается контракт, ID монстра, на которого игроку предстоит охотиться, и количество монстров, которое игрок должен добыть. В результате функция возвращает кортеж из трех элементов: флаг успеха, дескриптор созданного предмета и номер ячейки в инвентаре персонажа. Синтаксис: local <Результат (LUA_TRUE или LUA_FALSE)>, <Дескриптор предмета>, <Ячейка в инвентаре> = contract.create(<Дескриптор персонажа>, <ID монстра>, <Число монстров>) Пример: local ret, item, pos = contract.create(role, 103, 7) Синтаксис: local <Результат LUA_TRUE|LUA_FALSE>, <Дескриптор предмета>, <Ячейка предмета> = contract.create(<Дескриптор персонажа>, <ID монстра>, <Число монстров>) В результате будет создан "Контракт" на охоту на семерых Лесных духов, который появится в инвентаре персонажа role. В случае ошибки функция вернет в переменную ret значение LUA_FALSE и запишет лог в файл pkodev.contract.txt. Примечание: Выдачу "Контрактов" можно организовать, например, через специального NPC или другой предмет. Полезные ссылки 1) Lua-скрипт системы для игрового сервера; 2) ItemInfo.txt с примером предмета "Контракта"; 3) Строки для файла StringSet.txt; 4) Бинарные файлы модификации для клиента (.dll); 5) Файл с настройками модификации для клиента; 6) Репозиторий на GitHub с исходным кодом модификации для Visual Studio 2022 Community на языке C++; 7) Система загрузки модов pkodev.mod.loader. Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  2. [Мод] Система ежедневных наград за вход в игру Данный мод реализует систему ежедневных наград за вход в игру. Игрокам необходимо каждый день заходить в игру, чтобы получить очередную награду - с каждым новым днем награда становится ценнее. Если игрок пропускает день, то цепочка сбрасывается и начинается заново с первого дня. Каждую неделю цепочка так же сбрасывается. Цепочка наград настраивается администратором в специальной 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++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  3. [Мод] Система рейтинга игроков Данный мод реализует систему рейтинга игроков, которая позволяет игрокам сравнивать своих персонажей по какому-либо критерию в зависимости от того, как администратор настроит систему. Например, можно определить рейтинг как сумму всех базовых характеристик персонажа (см. скриншот выше), тогда с помощью рейтинга можно понять насколько силен персонаж относительно другого. Либо можно выводить в рейтинге количество убитых игроков или монстров. Так же можно выводить количество золота, очков репутации и тому подобное. Система очень гибкая и зависит от фантазии администратора. Рейтинг отображается над именем персонажей и выделяется цветом. После выхода персонажа из игры, рейтинг сохранятся в базе данных, таким образом, можно выводить рейтинг игроков на Вашем сайте. Требования Установленный Загрузчик модов для сервера и клиента (PKOdev.NET mod loader). Информация о моде Название: pkodev.mod.power; Версия: 1.1; Автор: 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. Обновление мода от 17.01.2022 + Исправлен баг, когда при убийстве монстра у персонажа игрока не обновлялось количество опыта (спасибо @Rewind и @Tera за обнаружение бага); + Формат вывода количества очков рейтинга вынесен в файл настроек pkodev.mod.power.cfg на стороне клиента: - [{:power:}] - Установка Сервер: 1) В директории "GameServer\mods" Вашего сервера создайте папку "pkodev.mod.power"; 2) Поместите в неё файл DLL-библиотеки мода "pkodev.mod.power.server.13<x>.dll" для Вашей версии GameServer.exe; 3) В файл functions.lua ("GameServer\resource\script\calculate\") запишите следующий скрипт: -- Power system (pkodev.mod.power) -- Calculate player's character power amount function CalculatePower(role) -- Get some character attributes local str = GetChaAttr(role, ATTR_STR) local agi = GetChaAttr(role, ATTR_AGI) local con = GetChaAttr(role, ATTR_CON) local spr = GetChaAttr(role, ATTR_STA) local acc = GetChaAttr(role, ATTR_DEX) -- Power formula local formula = ( str + agi + con + spr + acc ) -- Return calculated power amount and color return formula, GetPowerColor(formula) end -- Power system (pkodev.mod.power) -- Get color of power value function GetPowerColor(power) -- Green color (0xFF00FF00) return 4278255360 end 4) В MSSQL Management Studio выполните SQL-запрос: USE GameDB ALTER TABLE character ADD power INT NOT NULL DEFAULT (0) Клиент: 1) В директории "mods" Вашего клиента создайте папку "pkodev.mod.power"; 2) Поместите в неё файл DLL-библиотеки мода "pkodev.mod.power.client.13x_<x>.dll" для Вашей версии Game.exe. 3) Поместите в неё файл настроек мода "pkodev.mod.power.cfg" и запишите в него желаемый формат вывода количества очков рейтинга персонажей (маркер {:power:}), например: - [{:power:}] - Настройка мода 1) В файле functions.lua, в функции CalculatePower(role) запишите код, который будет вычислять рейтинг персонажа игрока. На вход функции подается переменная role - дескриптор текущего персонажа. На выходе функция должна вернуть рейтинг в виде целого числа. В примере выше, скрипт вычисляет рейтинг как сумму базовых характеристик персонажа; 2) В файле functions.lua, в функции GetPowerColor(power), запишите код, который будет определять цвет рейтинга в зависимости от его числа - power. Например, можно сделать, чтобы рейтинг менее 50 выделялся желтым цветом, от 50 до 100 - зеленым, выше 100 - красным. Цвет необходимо записывать в формате 0xFFRRGGBB, в десятичной системе счисления. Пример: зеленый цвет = 0xFF00FF00, переводим в десятичную ССч и получим число 4278255360, его и нужно записать в скрипт; 3) Мод предусматривает сохранение рейтинга персонажа в базе данных после выхода из игры. Например, для вывода на сайте в различных ТОПах. Если Вам не нужна эта возможность, её можно отключить. Для этого пропустите пункт 4 раздела "Установка - Сервер" и закомментируйте следующие строки в исходном коде серверной части мода (проект pkodev.mod.power.server, файл dllmain.cpp, функции Start() и Stop()), после чего скомпилируйте проект: DetourAttach(&(PVOID&)pkodev::pointer::CTableCha__SaveAllData, pkodev::hook::CTableCha__SaveAllData); и DetourDetach(&(PVOID&)pkodev::pointer::CTableCha__SaveAllData, pkodev::hook::CTableCha__SaveAllData); 4) Чтобы получить рейтинг персонажа из базы данных, выполните SQL-запрос: SELECT power FROM GameDB.dbo.character WHERE cha_name = '<Имя персонажа>' 5) Настройка на стороне клиента не требуется. Скачать 1) Бинарные файлы мода (.dll); 2) Исходный код мода для Visual Studio 2019 Community (C++). Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.
  4. Система награды игроков по расписанию С помощью данной системы можно выдавать всем игрокам на сервере в определенное время награду, указанную в расписании: все игроки, которые в данное время будут онлайн, получат предмет. Как установить 1) Создайте файл с названием "pkodev.gift.lua" в директории "GameServer\resource\script\calculate\mods"; 2) Поместите в файл следующий код: -------------------------------------------------------------- -- Gift system script -- -- Author: V3ct0r from PKODev.NET -- Version: 1.0 (11/08/2021) -- -- How to install the system: -- 1) Put this file to '\GameServer\resource\script\calculate\mods' folder -- 2) Put the following line at the beginning of 'mlist.lua' file: -- dofile(GetResPath("script\\calculate\\mods\\pkodev.gift.lua")) -- 3) Done! -- -- Interface: -- 1) Add a gift to queue: -- local gift_id = giftmod:addGift(item_id, number, hour, minute, second, month, day, year) -- 2) Remove a gift from queue -- local success = giftmod:removeGift(gift_id) -- Where 'success' can be 'true' or 'false' -- 3) Get gift number in queue -- local number = giftmod:getGiftNumber() -- 4) Print a list of queued gifts in GameServer window: -- giftmod:printGifts() -- -- These commands also can be used with &lua_all GM-command, for example: -- &lua_all giftmod:addGift(item_id, number, hour, minute, second, month, day, year) -- Note: After GameServer.exe restart gifts. which were added using GM-command, will be removed -------------------------------------------------------------- -- Update guard if (PKODEV_GIFT_GUARD ~= nil) then -- Exit the script return end -- Define update guard PKODEV_GIFT_GUARD = true -- Print a log print("Loading pkodev.gift.lua") -- Class Gift Gift = {} -- Make a Gift function Gift:new(id, item_id, count, gift_time) -- Private fields local private = { id = id or -1, item_id = item_id or -1, count = count or 0, gift_time = gift_time or 0, is_given = false } -- Public fields local public = { } -- Get an gift ID function public:getId() return private.id end -- Get an item id function public:getItemId() return private.item_id end -- Get an item count function public:getItemCount() return private.count end -- Get a time at which to give the gift function public:getTime() return private.gift_time end setmetatable(public, self) self.__index = self; return public end -- Class GiftSystem GiftSystem = {} -- Make a Gift system function GiftSystem:new() -- Private fields local private = { -- List of gifts to give gifts = { }, -- List of active players players = { }, -- Timer function timer_func = nil, -- List of hooks hooks = { } } -- Public fields local public = { } -- Player entered a map event function private:on_player_entered_map(role, mapdesc, map) -- Check that map exists in the list if ( private.hooks[map] ~= nil ) then -- Check that enter function is hooked if ( private.hooks[map].enter ~= nil ) then -- Call original function private.hooks[map].enter(role, mapdesc) end end -- Add player to the list private.players[ GetRoleID(role) ] = role end -- Player leaved a map event function private:on_player_leaved_map(role, map) -- Check that map exists in the list if ( private.hooks[map] ~= nil ) then -- Check that leave function is hooked if ( private.hooks[map].leave ~= nil ) then -- Call original function private.hooks[map].leave(role) end end -- Remove player from the list private.players[ GetRoleID(role) ] = nil end -- Timer event function private:on_timer_event(map) -- Check that timer function is hooked if ( private.timer_func ~= nil ) then -- Call original function private.timer_func(map) end -- Get current system time local t = os.time() -- Update gifts for i = table.getn(private.gifts), 1, -1 do -- Get a gift local gift = private.gifts[i] -- Check that it's time to give out the gift if ( t >= gift:getTime() ) then -- Give the gift to players for cha_id, role in pairs(private.players) do GiveItem(role, 0, gift:getItemId(), gift:getItemCount(), 4) end -- Remove the gift from the list table.remove(private.gifts, i) end end end -- Set hooks function private:setHook() -- Search for 'after_enter_', 'before_leave_' and timer functions for key, value in pairs(_G) do -- Get a global item name in lower case local name = string.lower(key) -- Player entered a map if ( string.find(name, "after_enter_") == 1 ) then -- Get map name local map = string.sub(name, string.len("after_enter_") + 1) -- Add map to the list private.hooks[map] = private.hooks[map] or {} -- Associate original enter function address with map name private.hooks[map].enter = value -- Set the hook _G[key] = function(role, mapdesc) private:on_player_entered_map(role, mapdesc, map) end end -- Player leaved a map if ( string.find(name, "before_leave_") == 1 ) then -- Get map name local map = string.sub(name, string.len("before_leave_") + 1) -- Add map to the list private.hooks[map] = private.hooks[map] or {} -- Associate original leave function address with map name private.hooks[map].leave = value -- Set the hook _G[key] = function(role) private:on_player_leaved_map(role, map) end end -- Timer if ( private.timer_func == nil ) then -- Search for timer function if ( string.find(name, "map_copy_run_") == 1 ) then -- Number of underscore characters local n = 0 -- Count the number of underscore characters string.gsub(name, ".", function(c) if ( c == '_' ) then n = n + 1 end end) -- Number of underscore characters should be equal to 3 if (n == 3) then -- Set timer function private.timer_func = value -- Set the hook _G[key] = function(map) private:on_timer_event(map) end end end end end -- Check that timer hook is enabled if ( private.timer_func == nil ) then print("pkodev.gift: Warning, suitable timer function is not found!") end end -- Add a gift to the list function public:addGift(item_id, count, h, m, s, mon, day, year) -- Check item ID if ( string.lower(GetItemName(item_id)) == "unknown" ) then -- Do not add a gift return -1 end -- Check item count if (count <= 0) then -- Do not add a gift return -1 end -- Get item timestamp local gift_timestamp = os.time{ month = mon, day = day, year = year, hour = h, min = m, sec = s } -- Check that item time is not expired if ( gift_timestamp <= os.time() ) then -- Do not add a gift return -1 end -- Get an ID for new gift local gift_id = public:getGiftNumber() -- Create a gift local gift = Gift:new(gift_id, item_id, count, gift_timestamp) -- Add a gift to the list table.insert(private.gifts, gift) -- Return gift ID return gift_id end -- Remove a gift by ID function public:removeGift(gift_id) -- Find a gift in the list for index, gift in pairs(private.gifts) do -- Check gift ID if ( gift_id == gift:getId() ) then -- Remove the gift from the list table.remove(private.gifts, index) -- Gift removed return true end end -- Gift not found return false end -- Get gift number function public:getGiftNumber() return table.getn(private.gifts) end -- Print a list of gifts function public:printGifts() -- Get gift number local n = public:getGiftNumber() -- Check that there are gifts in the list if (n > 0) then -- Print all gifts for index, gift in pairs(private.gifts) do -- Get time data local temp = os.date("*t", gift:getTime()) -- Print a gift print( string.format( "pkodev.gift: %d) [Gift ID: %d] - %s x %d at %02d:%02d:%02d %02d/%02d/%02d", index, gift:getId(), GetItemName(gift:getItemId()), gift:getItemCount(), temp.hour, temp.min, temp.sec, temp.month, temp.day, temp.year ) ) end else -- No gifts print("There are no active gifts!") end end -- Enable the necessary hooks for the gift system to work private:setHook() setmetatable(public, self) self.__index = self; return public end -- Create an instance of the gift system giftmod = GiftSystem:new() -- Add gifts to the queue giftmod:addGift(863, 1, 16, 6, 30, 11, 9, 2022) -- 'Gem of Rage' x 1 at 16:06:30 11/09/2022 giftmod:addGift(684, 1, 16, 7, 25, 11, 15, 2022) -- 'New Sheepskin Scroll' x 1 at 16:07:25 15/09/2022 giftmod:addGift(1849, 99, 12, 7, 0, 11, 18, 2022) -- 'Cake' x 99 at 12:07:00 18/09/2022 -- Print queued gifts giftmod:printGifts() 3) Откройте файл "GameServer\resource\script\monster\mlist.lua" и в самом начале запишите строку: dofile(GetResPath("script\\calculate\\mods\\pkodev.gift.lua")) 4) Запустите GameServer.exe. В окне консоли Вы должны увидеть следующий вывод: pkodev.gift: 1) [Gift ID: 0] - Gem of Rage x 1 at 16:06:30 11/09/2022 pkodev.gift: 2) [Gift ID: 1] - New Sheepskin Scroll x 1 at 16:07:25 11/15/2022 pkodev.gift: 3) [Gift ID: 2] - Cake x 99 at 12:07:00 11/18/2022 5) Настройте систему по Вашему усмотрению (см. раздел "Как использовать" далее); 6) Процесс установки системы завершен. Как использовать 1) Вы можете определить расписание выдачи наград в конце файла "pkodev.gift.lua" используя команду giftmod:addGift(): local gift_id = giftmod:addGift(ID_предмета, количество, час, минута, секунда, месяц, день, год) Также Вы можете добавить награду в очередь используя GM-команду*: &lua_all giftmod:addGift(ID_предмета, количество, час, минута, секунда, месяц, день, год) *Примечание: После перезапуска GameServer.exe, все награды, которые были добавлены с помощью GM-команды, удалятся. 2) Вы можете удалить награду из расписания с помощью команды "giftmod:removeGift()": local success = giftmod:removeGift(gift_id) -- Где 'success' может быть 'true' или 'false' Где переменная gift_id - это ID награды, которая ранее была добавлена в очередь командой giftmod:addGift(). 3) Вы можете получить число наград в очереди с помощью команды giftmod:getGiftNumber(): local number = giftmod:getGiftNumber() 4) Наконец, Вы можете отобразить очередь наград в окне консоли GameServer.exe: giftmod:printGifts() Это все! Скачать скрипт системы (3 Кб)
×
×
  • Create New...