Jump to content

Recommended Posts

[Мод] Система контрактов

 

screenshot_01.png

 

 

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

 

Система состоит из двух частей: модификация 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.

 

 

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

  • Like 3
  • Thanks 1

Share this post


Link to post
Share on other sites
Спойлер

 


function Cr_talk02()
	Talk( 1,  "Tommy: Hi! I’m an assistant to Iris, although I’m small, but I know a lot about Сrystal!" )
	Text( 1,  "Monster Kill Order", JumpPage, 4 )
	Text( 1,  "Maze Schedule", JumpPage, 2 )
	Text( 1,  "About character leveling ", JumpPage, 10 )
	Text( 1,  "Сontact administrator ", JumpPage, 11 )
	Text( 1,  "Thx, i got it",  CloseTalk)

	Talk( 2,  "Tommy: to display information about the dungeons, press ALT + H" )
	Text( 2,  "Back", JumpPage, 1 )
	
	Talk( 4,  "Tommy: I can give you a contract. Your goal will be to kill monsters. Only 1 contract can be executed at a time. When you finish killing, then double-click on the order and get a reward!" )
	InitTrigger()
	TriggerCondition( 1, NoItem, 8361, 1 )
	TriggerCondition( 1, NoItem, 8362, 1 )
	TriggerCondition( 1, NoItem, 8363, 1 )
	TriggerCondition( 1, NoItem, 8364, 1 )
	TriggerCondition( 1, NoItem, 8365, 1 )
	TriggerCondition( 1, NoItem, 8366, 1 )
	TriggerCondition( 1, NoItem, 8367, 1 )
	TriggerCondition( 1, NoItem, 8368, 1 )
	TriggerCondition( 1, NoItem, 8369, 1 )
	TriggerCondition( 1, NoItem, 8370, 1 )
	TriggerCondition( 1, NoItem, 8371, 1 )
	TriggerCondition( 1, NoItem, 8372, 1 )
	TriggerCondition( 1, NoItem, 8373, 1 )
	TriggerCondition( 1, NoItem, 8374, 1 )
	TriggerCondition( 1, NoItem, 8375, 1 )
	TriggerCondition( 1, NoItem, 8376, 1 )

	TriggerCondition( 1, BankNoItem, 8361, 1 )
	TriggerCondition( 1, BankNoItem, 8362, 1 )
	TriggerCondition( 1, BankNoItem, 8363, 1 )
	TriggerCondition( 1, BankNoItem, 8364, 1 )
	TriggerCondition( 1, BankNoItem, 8365, 1 )
	TriggerCondition( 1, BankNoItem, 8366, 1 )
	TriggerCondition( 1, BankNoItem, 8367, 1 )
	TriggerCondition( 1, BankNoItem, 8368, 1 )
	TriggerCondition( 1, BankNoItem, 8369, 1 )
	TriggerCondition( 1, BankNoItem, 8370, 1 )
	TriggerCondition( 1, BankNoItem, 8371, 1 )
	TriggerCondition( 1, BankNoItem, 8372, 1 )
	TriggerCondition( 1, BankNoItem, 8373, 1 )
	TriggerCondition( 1, BankNoItem, 8374, 1 )
	TriggerCondition( 1, BankNoItem, 8375, 1 )
	TriggerCondition( 1, BankNoItem, 8376, 1 )
					
	TriggerCondition( 1, EquipNoItem, 8361, 1 )
	TriggerCondition( 1, EquipNoItem, 8362, 1 )
	TriggerCondition( 1, EquipNoItem, 8363, 1 )
	TriggerCondition( 1, EquipNoItem, 8364, 1 )
	TriggerCondition( 1, EquipNoItem, 8365, 1 )
	TriggerCondition( 1, EquipNoItem, 8366, 1 )
	TriggerCondition( 1, EquipNoItem, 8367, 1 )
	TriggerCondition( 1, EquipNoItem, 8368, 1 )
	TriggerCondition( 1, EquipNoItem, 8369, 1 )
	TriggerCondition( 1, EquipNoItem, 8370, 1 )
	TriggerCondition( 1, EquipNoItem, 8371, 1 )
	TriggerCondition( 1, EquipNoItem, 8372, 1 )
	TriggerCondition( 1, EquipNoItem, 8373, 1 )
	TriggerCondition( 1, EquipNoItem, 8374, 1 )
	TriggerCondition( 1, EquipNoItem, 8375, 1 )
	TriggerCondition( 1, EquipNoItem, 8376, 1 )
	TriggerCondition( 1, HasLeaveBagGrid, 1 )
	TriggerCondition( 1, KitbagLock, 0 )
	
	TriggerAction( 1, GiveItem, 8361, 1, 4 )
	TriggerFailure( 1, JumpPage, 5 )
	Text( 4, "Get a Easy contract!",MultiTrigger, GetMultiTrigger(), 1)
		InitTrigger()
	TriggerCondition( 1, NoItem, 8361, 1 )
	TriggerCondition( 1, NoItem, 8362, 1 )
	TriggerCondition( 1, NoItem, 8363, 1 )
	TriggerCondition( 1, NoItem, 8364, 1 )
	TriggerCondition( 1, NoItem, 8365, 1 )
	TriggerCondition( 1, NoItem, 8366, 1 )
	TriggerCondition( 1, NoItem, 8367, 1 )
	TriggerCondition( 1, NoItem, 8368, 1 )
	TriggerCondition( 1, NoItem, 8369, 1 )
	TriggerCondition( 1, NoItem, 8370, 1 )
	TriggerCondition( 1, NoItem, 8371, 1 )
	TriggerCondition( 1, NoItem, 8372, 1 )
	TriggerCondition( 1, NoItem, 8373, 1 )
	TriggerCondition( 1, NoItem, 8374, 1 )
	TriggerCondition( 1, NoItem, 8375, 1 )
	TriggerCondition( 1, NoItem, 8376, 1 )

	TriggerCondition( 1, BankNoItem, 8361, 1 )
	TriggerCondition( 1, BankNoItem, 8362, 1 )
	TriggerCondition( 1, BankNoItem, 8363, 1 )
	TriggerCondition( 1, BankNoItem, 8364, 1 )
	TriggerCondition( 1, BankNoItem, 8365, 1 )
	TriggerCondition( 1, BankNoItem, 8366, 1 )
	TriggerCondition( 1, BankNoItem, 8367, 1 )
	TriggerCondition( 1, BankNoItem, 8368, 1 )
	TriggerCondition( 1, BankNoItem, 8369, 1 )
	TriggerCondition( 1, BankNoItem, 8370, 1 )
	TriggerCondition( 1, BankNoItem, 8371, 1 )
	TriggerCondition( 1, BankNoItem, 8372, 1 )
	TriggerCondition( 1, BankNoItem, 8373, 1 )
	TriggerCondition( 1, BankNoItem, 8374, 1 )
	TriggerCondition( 1, BankNoItem, 8375, 1 )
	TriggerCondition( 1, BankNoItem, 8376, 1 )
					
	TriggerCondition( 1, EquipNoItem, 8361, 1 )
	TriggerCondition( 1, EquipNoItem, 8362, 1 )
	TriggerCondition( 1, EquipNoItem, 8363, 1 )
	TriggerCondition( 1, EquipNoItem, 8364, 1 )
	TriggerCondition( 1, EquipNoItem, 8365, 1 )
	TriggerCondition( 1, EquipNoItem, 8366, 1 )
	TriggerCondition( 1, EquipNoItem, 8367, 1 )
	TriggerCondition( 1, EquipNoItem, 8368, 1 )
	TriggerCondition( 1, EquipNoItem, 8369, 1 )
	TriggerCondition( 1, EquipNoItem, 8370, 1 )
	TriggerCondition( 1, EquipNoItem, 8371, 1 )
	TriggerCondition( 1, EquipNoItem, 8372, 1 )
	TriggerCondition( 1, EquipNoItem, 8373, 1 )
	TriggerCondition( 1, EquipNoItem, 8374, 1 )
	TriggerCondition( 1, EquipNoItem, 8375, 1 )
	TriggerCondition( 1, EquipNoItem, 8376, 1 )
	TriggerCondition( 1, HasLeaveBagGrid, 1 )
	TriggerCondition( 1, KitbagLock, 0 )
	TriggerCondition( 1, LvCheck, ">", 59 )
		
	TriggerAction( 1, GiveItem, 8362, 1, 4 )
	TriggerFailure( 1, JumpPage, 5 )
	Text( 4, "Get a Hard contract! (60 lvl+)",MultiTrigger, GetMultiTrigger(), 1)
	Text( 4,  "Back", JumpPage, 1 )
	
	Talk( 5,  "Tommy: You have run out of inventory. Or you already have a contract. Look maybe it’s in your bank!" )
	Text( 5,  "Exit",  CloseTalk)
	
	Talk( 10,  "Tommy: To gain experience, kill monsters in the vicinity of the city and on the islands (for beginners, penguins are specially brought in to us who will quickly help to pick up wholesale, look in the vicinity of the city) a passage to the mines was opened for pumping from LVL 30 (272,149), and for further pumping, I recommend visiting various islands near Portalist - Lilith (153,132)." )
	Text( 10,  "Lets change theme", JumpPage, 1 )
	Text( 10,  "Thx, i got it", CloseTalk)

	Talk( 11,  "Tommy: You can contact the administrator through our website" )
	Text( 11,  "Lets change theme", JumpPage, 1 )
	Text( 11,  "Thx, i got it", CloseTalk)
	AddNpcMission ( 110  )
end

8361	Easy contract	bookorc	10130023	0	0	0	0	0	0	31	0	0	0	0	0	0	0	0	1	1	0	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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderchest	0	0	0	0,0	0	0	Double-click to get a contract to kill monsters	0
8362	Hard contract	bookors	10130023	0	0	0	0	0	0	31	0	0	0	0	0	0	0	0	1	1	0	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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderchest2	0	0	0	0,0	0	0	Double-click to get a contract to kill monsters	0
8363	Order - Pirate (Overgrown island)	bookor	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8364	Order - Forest Spirit (Crystal)	bookor	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8365	Order - Pumpkin Knight (Mine)	bookor	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8366	Order - Ninja Mole (Mine)	bookor	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8367	Order - Treant (Far island)	bookor	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8368	Order - Mad Boar (Autumn)	bookor	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8369	Order - Grassland Wolf (Autumn)	bookor	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8370	Order - Warrior-werewolf (Zephyr)	bookord	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8371	Order - Granite Golem (Zephyr)	bookord	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8372	Order - Vampire bat (Forgotten)	bookord	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8373	Order - Little Ice Dragon (Forgotten)	bookord	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8374	Order - Pig (Forgotten)	bookord	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8375	Order - Golden Scorpion (Demon)	bookord	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8376	Order - Dawn Owl (Demon)	bookord	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8382	Zephyr contract	bookors2	10130023	0	0	0	0	0	0	31	0	0	0	0	0	0	0	0	1	1	0	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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderchest3	0	0	0	0,0	0	0	Double-click to get a contract to kill monsters	0
8383	Newbie contract	bookors3	10130023	0	0	0	0	0	0	31	0	0	0	0	0	0	0	0	1	1	0	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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderchest4	0	0	0	0,0	0	0	Double-click to get a contract to kill monsters	0
8384	Order - Zephyr mobs	bookord1	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0
8385	Order - Crystal mobs	bookord2	10130005	0	0	0	0	0	0	11	0	0	0	0	0	0	0	0	0	1	0	2000	-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	0,0	0,0	0	0	0	0	0	0	0	0	0	ItemUse_orderk	0	0	0	0,0	0	0	The contract for the murder of monsters. When fully filled, double-click to receive a reward.	0


function ItemUse_orderk ( role , Item )
	local Cha_Boat = GetCtrlBoat ( role )
	if Cha_Boat ~=  nil then
		SystemNotice(role ,"Cannot be used at sea!")
		UseItemFailed ( role )
		return
	end
	local Item_CanGet = GetChaFreeBagGridNum ( role )	
	 if Item_CanGet < 2 then
		SystemNotice(role ,"Not enough inventory space!")
		UseItemFailed ( role )
		return
	end
	
	local ItemID = GetItemID ( Item )	-- Получим ID предмета
	local ItemGet = GetChaItem2 ( role , 2 , ItemID )
	local Item_MAXURE = GetItemAttr ( ItemGet , ITEMATTR_MAXURE )
	local Item_URE = GetItemAttr ( ItemGet , ITEMATTR_URE )
	
	if Item_URE ~= Item_MAXURE then
		SystemNotice(role ,"You have not yet killed all the monsters for a reward.")
		UseItemFailed ( role )
		return
	end
	
	if ItemID == 8363 or ItemID == 8364 or ItemID == 8365 or ItemID == 8366 or ItemID == 8367 or ItemID == 8368 or ItemID == 8369 then -- Если ID предмета совпадает с используемым, то:
		local MON_X = 14000
		local MON_Y = Item_MAXURE / 50
		local MON_Z = MON_Y * MON_X
		AddMoney ( role , 0 , MON_Z )
	end
	
	if ItemID == 8370 or ItemID == 8371 or ItemID == 8372 or ItemID == 8373 or ItemID == 8374 or ItemID == 8375 or ItemID == 8376 then -- Если ID предмета совпадает с используемым, то:
		local MON_X = 20000
		local MON_Y = Item_MAXURE / 50
		local MON_Z = MON_Y * MON_X
		AddMoney ( role , 0 , MON_Z )
	end
	if ItemID == 8384 then -- Если ID предмета совпадает с используемым, то:
		local MON_X = 17000
		local MON_Y = Item_MAXURE / 50
		local MON_Z = MON_Y * MON_X
		AddMoney ( role , 0 , MON_Z )
	end
	if ItemID == 8385 then -- Если ID предмета совпадает с используемым, то:
		local MON_X = 9500
		local MON_Y = Item_MAXURE / 50
		local MON_Z = MON_Y * MON_X
		AddMoney ( role , 0 , MON_Z )
	end
	
end

function ItemUse_orderchest ( role , Item )
	local Cha_Boat = GetCtrlBoat ( role )
	if Cha_Boat ~=  nil then
		SystemNotice(role ,"Cannot be used at sea!")
		UseItemFailed ( role )
		return
	end
	local Item_CanGet = GetChaFreeBagGridNum ( role )	
	 if Item_CanGet < 2 then
		SystemNotice(role ,"Not enough inventory space!")
		UseItemFailed ( role )
		return
	end
	
	   	local r1 = 0
		local r2 = 0
		local MAX_URE_X = math.random ( 1, 25 )
		local MAX_URE_Y = MAX_URE_X * 100
		local MAX_URE_F = MAX_URE_Y + 2500
		
		local rad = math.random ( 1, 7 )
		if rad == 1 then
			r1, r2 = MakeItem ( role , 8363 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
		end		
		if rad == 2 then
			r1, r2 = MakeItem ( role , 8364 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
		end		
		if rad == 3 then
			r1, r2 = MakeItem ( role , 8365 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
		end				
		if rad == 4 then
			r1, r2 = MakeItem ( role , 8366 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
		end		
		if rad == 5 then
			r1, r2 = MakeItem ( role , 8367 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
		end		
		if rad == 6 then
			r1, r2 = MakeItem ( role , 8368 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
		end		
		if rad == 7 then
			r1, r2 = MakeItem ( role , 8369 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
		end		
end

function ItemUse_orderchest2 ( role , Item )
	local Cha_Boat = GetCtrlBoat ( role )
	if Cha_Boat ~=  nil then
		SystemNotice(role ,"Cannot be used at sea!")
		UseItemFailed ( role )
		return
	end
	local Item_CanGet = GetChaFreeBagGridNum ( role )	
	 if Item_CanGet < 2 then
		SystemNotice(role ,"Not enough inventory space!")
		UseItemFailed ( role )
		return
	end
		local r1 = 0
		local r2 = 0
		local MAX_URE_X = math.random ( 1, 25 )
		local MAX_URE_Y = MAX_URE_X * 100
		local MAX_URE_F = MAX_URE_Y + 2500
		
		local rad = math.random ( 1, 7 )
		if rad == 1 then
			r1, r2 = MakeItem ( role , 8370 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
		end		
		if rad == 2 then
			r1, r2 = MakeItem ( role , 8371 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
		end		
		if rad == 3 then
			r1, r2 = MakeItem ( role , 8372 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
		end				
		if rad == 4 then
			r1, r2 = MakeItem ( role , 8373 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
		end		
		if rad == 5 then
			r1, r2 = MakeItem ( role , 8374 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
		end		
		if rad == 6 then
			r1, r2 = MakeItem ( role , 8375 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
		end		
		if rad == 7 then
			r1, r2 = MakeItem ( role , 8376 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
		end		
end

function ItemUse_orderchest3 ( role , Item )
	local Cha_Boat = GetCtrlBoat ( role )
	if Cha_Boat ~=  nil then
		SystemNotice(role ,"Cannot be used at sea!")
		UseItemFailed ( role )
		return
	end
	local Item_CanGet = GetChaFreeBagGridNum ( role )	
	 if Item_CanGet < 2 then
		SystemNotice(role ,"Not enough inventory space!")
		UseItemFailed ( role )
		return
	end
		local r1 = 0
		local r2 = 0
		local MAX_URE_X = math.random ( 1, 25 )
		local MAX_URE_Y = MAX_URE_X * 100
		local MAX_URE_F = MAX_URE_Y + 2500
			r1, r2 = MakeItem ( role , 8384 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
end

function ItemUse_orderchest4 ( role , Item )
	local Cha_Boat = GetCtrlBoat ( role )
	if Cha_Boat ~=  nil then
		SystemNotice(role ,"Cannot be used at sea!")
		UseItemFailed ( role )
		return
	end
	local Item_CanGet = GetChaFreeBagGridNum ( role )	
	 if Item_CanGet < 2 then
		SystemNotice(role ,"Not enough inventory space!")
		UseItemFailed ( role )
		return
	end
		local r1 = 0
		local r2 = 0
		local MAX_URE_X = math.random ( 1, 25 )
		local MAX_URE_Y = MAX_URE_X * 100
		local MAX_URE_F = MAX_URE_Y + 2500
			r1, r2 = MakeItem ( role , 8385 , 1 , 4 )
			local Itemnew = GetChaItem ( role , 2 , r2 )
			SetItemAttr(Itemnew, ITEMATTR_URE, 0 )
			SetItemAttr(Itemnew, ITEMATTR_MAXURE, MAX_URE_F )
end

Вот похожая система была

 

 

Edited by BETEP/macs509
  • Thanks 1

Share this post


Link to post
Share on other sites

Привет, @BETEP/macs509!

 

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

 

Серверная часть в принципе может быть любой, достаточно записать в дескриптор предмета следующую информацию:

ITEMATTR_VAL_STR - ID монстра
ITEMATTR_VAL_AGI - Число монстров, которых нужно победить
ITEMATTR_VAL_DEX - Число побежденных монстров

 

  • Like 1

Share this post


Link to post
Share on other sites
20 minutes ago, Де-Компанье said:

Отличная работ @V3ct0r!

 

Чем-то напоминает: 

 

Благодарю за отличную идею! Выкладывай ещё - реализуем в лучшем виде 😘


Share this post


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

Привет, @BETEP/macs509!

 

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

 

Серверная часть в принципе может быть любой, достаточно записать в дескриптор предмета следующую информацию:


ITEMATTR_VAL_STR - ID монстра
ITEMATTR_VAL_AGI - Число монстров, которых нужно победить
ITEMATTR_VAL_DEX - Число побежденных монстров

 

Привет, да это понятно просто когда делал сервер задался вопросом какой тип предмета использовать для этих целей, а потом пришло вот такое решение

Share this post


Link to post
Share on other sites

Привет, @small666!

 

В принципе можно вместо ID монстра записывать в дескриптор предмета ID игрока и переписать соответствующий код. Проблема заключается в том, что нужно придумать способ вывода в описании предмета контракта имя игрока.


Share this post


Link to post
Share on other sites

Здравствуйте V3ct0r. Подскажите как мне сюда добавить систему рандом 

 

function TestContract(role)

    local ret, item, pos = contract.create(role, 101, 20)

    local ret, item, pos = contract.create(role, 102, 35)

    local ret, item, pos = contract.create(role, 103, 7)
        return ret

end

 

Ну и конечно же разным контрактам разный дроп

Share this post


Link to post
Share on other sites

Привет, @small666!

 

Quote

Ну и конечно же разным контрактам разный дроп

 

Для того, чтобы сделать разным контрактам разный дроп, нужно их как-то различать. Самое простое - по ID монстра и/или количеству монстров:

	-- User-defined function for reward
	reward_cb = function(role, item)
		
		-- ID цели
		local target_id  = GetItemAttr(item, contract.const['target_id'])
		
		-- Для числа целей:
		--local target_max = GetItemAttr(item, contract.const['target_max'])
		
		if (target_id == 103) then -- Цель: Лесной дух

			-- Выдать 1000 золотых
			AddMoney (role, 0, 1000)
		
		else if (target_id == 237) then -- Цель: Свинокрыл
			
			-- Выдать 5000 золотых
			AddMoney (role, 0, 5000)
			
		end
		
	end

 

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

 

Функция Creat_Item():

		-- Add new attributes to the item
		Add_Item_Attr(contract.const['target_id'],  0)
		Add_Item_Attr(contract.const['target_max'], 0)
		Add_Item_Attr(contract.const['target_cur'], 0)
		Add_Item_Attr(ITEMATTR_VAL_CON, 0) -- ДОБАВИТЬ

 

Заменить определение функции contract.create():

contract.create = function(role, target_id, number)

на:

contract.create = function(role, target_id, number, reward)

 

В той же функции ниже добавить:

	local a1 = SetItemAttr(item, contract.const['target_id'], target_id)
	local a2 = SetItemAttr(item, contract.const['target_max'], number)
	local a3 = SetItemAttr(item, contract.const['target_cur'], 0)
	SetItemAttr(item, ITEMATTR_VAL_CON, reward) -- ДОБАВИТЬ

 

Теперь в функции reward_cb() можно получить ID награды:

	-- User-defined function for reward
	reward_cb = function(role, item)
		
		-- ID награды
		local reward  = GetItemAttr(item, ITEMATTR_VAL_CON)
		
		if (reward == 1) then

			-- Награда 1
		
		else if (reward == 2) then
			
			-- Награда 2
			
		end
		
	end

 

Quote

Подскажите как мне сюда добавить систему рандом 

В каком смысле рандом?

  • Thanks 1

Share this post


Link to post
Share on other sites

V3ct0r извините если что, и если это лишне удалите.

Все таки мы русскоязычные и хотел бы добавить переведенный вариант 😋

spacer.png

 

как всегда мелочь но приятно...

 

pkodev.mod.contract.client.bin

 

А так же не забудьте выполнить перевод в файле script\calculate\mods\pkodev.contract.lua данный файл не выкладываю так как там перевод не составит труда ну и кому как нравится 😜

 

Edited by small666
  • Thanks 1

Share this post


Link to post
Share on other sites

@small666, добавил в шапку. Спасибо!

  • Like 1

Share this post


Link to post
Share on other sites

Всем привет!

 

@Angelix разработал свой вариант скрипта для системы контрактов, который более гибкий в настройке и использовании:

Рекомендую использовать его.


Share this post


Link to post
Share on other sites

Обновление от 23.02.2023

 

+ Провел рефакторинг исходного кода модификации;

+ Вынес настройки модификации в файл pkodev.mod.contract.json;

+ Вынес перевод строк в файл Клиент\scripts\table\StringSet.txt. @small666;

+ Обновил проект модификации до Visual Studio 2022 и стандарта языка C++20;

+ Привел в порядок репозиторий с исходным кодом модификации;

+ Добавил документацию на русском и английском языках;

+ Добавил скрипт для сборки проекта модификации из под Developer Command Prompt for VS 2022.

+ Версия модификации была увеличена до 1.1.

 

Инструкции по установке и настройке Системы контрактов в шапке темы были обновлены.

  • Thanks 1

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...