Jump to content
Sign in to follow this  
V3ct0r

Система ежедневных наград за вход в игру

Recommended Posts

[Мод] Система ежедневных наград за вход в игру

 

screenshot_1.png

 

Данный мод реализует систему ежедневных наград за вход в игру. Игрокам необходимо каждый день заходить в игру, чтобы получить очередную награду - с каждым новым днем награда становится ценнее. Если игрок пропускает день, то цепочка сбрасывается и начинается заново с первого дня. Каждую неделю цепочка так же сбрасывается.

 

Цепочка наград настраивается администратором в специальной lua функции и рассчитывается на неделю вперед, после чего сохраняется в базе данных сервера.

 

screenshot_2.gif

 

 

 

Требования

 

Установленный Загрузчик модов для сервера и клиента (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!)

masuka_style_gif.gif

 

Скачать текстуру

 

В 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++).

 

Если Вы столкнулись с какой-либо проблемой, багом или у Вас возникли вопросы, то пишите в данной теме.

  • Like 2
  • Thanks 3

Share this post


Link to post
Share on other sites

Спасибо @V3ct0r давно хотел такой мод.

Не могли бы вы поделить таким же кодом для шифрования таблиц ?

 

2. Шифрование таблиц (файлы .bin)

 

Эта модификация шифрует .bin-файлы (ItemInfo.bin, CharacterInfo.bin, SkillInfo.bin и остальные) в папке Клиент\scripts\table. Таким образом, из зашифрованных файлов теперь нельзя получить исходные .txt-файлы с помощью декомпилятора, а также их нельзя использовать в других клиентах игры.

 

Файл ItemInfo.bin до шифрования:

 

https://i2.piccy.info/i9/9b38e06a95a1d9612ad10214e6c11413/1639402141/77344/1451639/AfterEnc_png_0241372edffcf8797d46e66961756cf7.png

 

После шифрования:

 

https://i2.piccy.info/i9/b4c3291032f94575297fd739dba8ba4d/1639402161/49846/1451639/34665BeforeEnc_png_771988ec4027dddb3d109f15536bae76.png

 

Данный мод поможет от кражи предметов, монстров  и других игровых данных с Вашего сервера.

Share this post


Link to post
Share on other sites
1 час назад, Tales of Ocean сказал:

Спасибо @V3ct0r давно хотел такой мод.

Не могли бы вы поделить таким же кодом для шифрования таблиц ?

 

2. Шифрование таблиц (файлы .bin)

 

Эта модификация шифрует .bin-файлы (ItemInfo.bin, CharacterInfo.bin, SkillInfo.bin и остальные) в папке Клиент\scripts\table. Таким образом, из зашифрованных файлов теперь нельзя получить исходные .txt-файлы с помощью декомпилятора, а также их нельзя использовать в других клиентах игры.

 

Файл ItemInfo.bin до шифрования:

 

https://i2.piccy.info/i9/9b38e06a95a1d9612ad10214e6c11413/1639402141/77344/1451639/AfterEnc_png_0241372edffcf8797d46e66961756cf7.png

 

После шифрования:

 

https://i2.piccy.info/i9/b4c3291032f94575297fd739dba8ba4d/1639402161/49846/1451639/34665BeforeEnc_png_771988ec4027dddb3d109f15536bae76.png

 

Данный мод поможет от кражи предметов, монстров  и других игровых данных с Вашего сервера.

Не поможет он от кражи и т.д, просто на пару минут замедлит

Share this post


Link to post
Share on other sites
1 hour ago, Tales of Ocean said:

Спасибо @V3ct0r давно хотел такой мод.

Не могли бы вы поделить таким же кодом для шифрования таблиц ?

Привет, @Tales of Ocean, и добро пожаловать на PKOdev.NET!

 

Я считаю что выкладывать этот мод - плохая идея: если его выкладывать, то придется объяснять как он работает, чтобы люди смогли им воспользоваться, а это лишит смысла мод как защиту .bin-файлов.

 

11 minutes ago, BETEP/macs509 said:

Не поможет он от кражи и т.д, просто на пару минут замедлит

Привет! Можешь рассказать подробнее как его обойти?

 


Share this post


Link to post
Share on other sites
17 минут назад, V3ct0r сказал:

Привет, @Tales of Ocean, и добро пожаловать на PKOdev.NET!

 

Я считаю что выкладывать этот мод - плохая идея: если его выкладывать, то придется объяснять как он работает, чтобы люди смогли им воспользоваться, а это лишит смысла мод как защиту .bin-файлов.

 

Привет! Можешь рассказать подробнее как его обойти?

 

Привет, знаешь почему Джо неуловимый?) Я к тому что всю нужную информацию человек заберет на сайте с бд либо сам воспроизведет

  • Thanks 1

Share this post


Link to post
Share on other sites
18 hours ago, BETEP/macs509 said:

Привет, знаешь почему Джо неуловимый?) Я к тому что всю нужную информацию человек заберет на сайте с бд либо сам воспроизведет

Согласен, от такого шифрование .bin файлов, конечно, не поможет, но все-таки значительно затруднит процесс.


Share this post


Link to post
Share on other sites

Всем привет!

 

@Masuka00 в англоязычной версии данной темы выложил текстуры для "старого" GUI клиента:

masuka_style_gif.gif

 

Скачать текстуру

 

В 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 )

 

  • Like 1

Share this post


Link to post
Share on other sites

Всем привет. подскажите не пойму что не так все залил в базе запись есть но в игре не чего нет

gs 

[pkodev.mod.loader] -----------------------------------------------
[pkodev.mod.loader]    PKOdev.NET mod loader ver. 1.0 by V3ct0r
[pkodev.mod.loader] -----------------------------------------------
[pkodev.mod.loader] Detected .exe file: 'GameServer 1.38'.
[pkodev.mod.loader] Searching mods in 'mods' directory . . .
[pkodev.mod.loader] Done! (2) mods found out:
+----+--------------------------------+----------+----------------+
|  # |                            Mod |  Version |         Author |
+----+--------------------------------+----------+----------------+
|  1.|              pkodev.mod.reward |      1.0 |         V3ct0r |
|  2.|          pkodev.mod.tablelimit |      1.0 |         V3ct0r |
+----+--------------------------------+----------+----------------+
[pkodev.mod.loader] Launching mods . . .
[pkodev.mod.reward] Daily reward system ver. 1.0 by V3ct0r
[pkodev.mod.tablelimit] Table limit ver. 1.0 by V3ct0r
[pkodev.mod.loader] All mods launched!

 

BD

dbo.character таблица reward значение 1;1644850077;1,1;1849,99;855,50;189,1;931,1;227,10;885,1

 

но в клиенте не чего нет 

Share this post


Link to post
Share on other sites

Привет, @small666!

 

13 hours ago, small666 said:

Всем привет. подскажите не пойму что не так все залил в базе запись есть но в игре не чего нет

gs 

[pkodev.mod.loader] -----------------------------------------------
[pkodev.mod.loader]    PKOdev.NET mod loader ver. 1.0 by V3ct0r
[pkodev.mod.loader] -----------------------------------------------
[pkodev.mod.loader] Detected .exe file: 'GameServer 1.38'.
[pkodev.mod.loader] Searching mods in 'mods' directory . . .
[pkodev.mod.loader] Done! (2) mods found out:
+----+--------------------------------+----------+----------------+
|  # |                            Mod |  Version |         Author |
+----+--------------------------------+----------+----------------+
|  1.|              pkodev.mod.reward |      1.0 |         V3ct0r |
|  2.|          pkodev.mod.tablelimit |      1.0 |         V3ct0r |
+----+--------------------------------+----------+----------------+
[pkodev.mod.loader] Launching mods . . .
[pkodev.mod.reward] Daily reward system ver. 1.0 by V3ct0r
[pkodev.mod.tablelimit] Table limit ver. 1.0 by V3ct0r
[pkodev.mod.loader] All mods launched!

 

BD

dbo.character таблица reward значение 1;1644850077;1,1;1849,99;855,50;189,1;931,1;227,10;885,1

 

но в клиенте не чего нет 

Для получения награды должно пройти 24 часа (по умолчанию) с момента первого входа в игру. Чтобы изменить это время, можно отредактировать следующую переменную в файле structure.h из серверной части мода и пересобрать проект:

// Reward interval in seconds
static const unsigned int interval{ 24 * 60 * 60 }; // 24 hours

 

12 hours ago, small666 said:

Вызвал окно с помощью ключа

UI_FormSetHotKey( frmReward, ALT_KEY, HOTKEY_X )

spacer.png

 

вообщем пусто.........

Эта форма появляется и отображает список предметов только при получении пакета с наградой от сервера.


Share this post


Link to post
Share on other sites
3 часа назад, V3ct0r сказал:

Для получения награды должно пройти 24 часа (по умолчанию) с момента первого входа в игру.

То есть просто обмануть сервер тупо изменив время на пк для проверки мода не выйдет я правильно вас понял?

Должен и сам сервер отработать с этим модам 24 часа?

Share this post


Link to post
Share on other sites
20 hours ago, small666 said:

То есть просто обмануть сервер тупо изменив время на пк для проверки мода не выйдет я правильно вас понял?

Конечно не выйдет. Вся логика должна осуществляться на стороне сервера, иначе игроки смогли бы бесконечно выдавать себе ежедневные награды, что не имеет смысла для экономики сервера.

 

Quote

Должен и сам сервер отработать с этим модам 24 часа?

Да.


Share this post


Link to post
Share on other sites

я думал что игрок зашел и получил сразу награду из ячейки 1 день а после 24ч 2день еще 24ч 3день и т.д т.п

 

Share this post


Link to post
Share on other sites

BD

dbo.character таблица reward значение 1;1644850077;1,1;1849,99;855,50;189,1;931,1;227,10;885,1

а за что это отвечает ? я так понемаю это отсчет времяни? 

 

Share this post


Link to post
Share on other sites
On 2/17/2022 at 2:24 PM, small666 said:

я думал что игрок зашел и получил сразу награду из ячейки 1 день а после 24ч 2день еще 24ч 3день и т.д т.п

 

Тогда можно все время создавать персонажей и бесконечно получать награду за первый день. 

 

On 2/17/2022 at 2:27 PM, small666 said:

BD

dbo.character таблица reward значение 1;1644850077;1,1;1849,99;855,50;189,1;931,1;227,10;885,1

а за что это отвечает ? я так понемаю это отсчет времяни? 

 

Да, это метка времени, которая отвечает за время, через которое можно получить следующую награду. 

<Время до следующей награды, с> = <Текущая метка времени, с> - <Метка времени, с>

Далее эта дельта проверяется примерно следующим образом:

если <время до следующей награды, с> >= <интервал, с> то
  отправить пакет с наградой клиенту
конец

 

  • Like 1

Share this post


Link to post
Share on other sites

спасибо за ответ вообщем с этим модом что то не так у меня вот что в таблице сейчас 1;0;1,1;1849,99;855,50;189,1;931,1;227,10;885,1

награда так и не получена как я могу принудить систему к выдачи через базу или еще как то для проверки мода что бы не выжидать 24

Share this post


Link to post
Share on other sites
12 minutes ago, small666 said:

спасибо за ответ вообщем с этим модом что то не так у меня вот что в таблице сейчас 1;0;1,1;1849,99;855,50;189,1;931,1;227,10;885,1

награда так и не получена как я могу принудить систему к выдачи через базу или еще как то для проверки мода что бы не выжидать 24

Выше я писал, что нужно изменить значение константы interval в файле structure.h серверной стороны мода, пересобрать мод, обновить его на сервере и перезапустить GameServer.exe:

// Reward interval in seconds
static const unsigned int interval{ 24 * 60 * 60 }; // 24 hours

 

Например, интервал 5 минут:

// Reward interval in seconds
static const unsigned int interval{ 5 * 60 }; // 300 секунд или 5 минут

 


Share this post


Link to post
Share on other sites

19.04.2022

 

+ Исправил адреса для GAME_13X_1 (спасибо @small666 за обнаруженный баг)

  • Thanks 2

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...