В данной статье, я приведу пример создания команды для ГМа.
Данный скрипт позволит ГМу создать контейнер с ловушкой в
котором через определенное будет появлятся лут.
ЗЫ Данный пример написан на скорую руку и предназначен больше
для обучения, поэтому в нем могут быть ляпы.
неоптимезированность и т.д., прошу отнестись к этому с
пониманием.
И так начнем. Первым, на первом, надо с делать... А, купить
пианину, хм, хотя стоп, зачем нам пианина? Первым наперво надо
сделать команду, которая будет создавать контейнер. Вобщем
пишем:
use uo;
use os;
Тут мы подключаем модули для использывания разного вида функций,
анпример use uo - позволит нам использывать возможности вывода
информации на экран, указание цели т.д.
include "include/client";
include "include/objtype";
тут мы подключаем модули написанные например конкретным
пользывателем, в данном случае это стандартные инклуды идущие с
поставко POL'а, найти их можно в ../scripts/include
Теперь самое главное мы написали, далее идет полет так сказать
мысли.
program spawnchest(who, text) - начало нашего кода, text - это
текст который будет введен после названия самой команды, в
данном случае он будет обозначать уровень сложности сундука и
номер ловушки.
var param := SplitWords(text) - назначаем парам сплющенные
данные которые мы ввели
var lvl := cint(param[1]); передаем первой число, причем cint
берет целое число.
var trap := cint(param[2]);
Уровень у нас будет от 1 до 10, а номер ловушки от 0 до 9,
поэтому сделаем проверку на правильность ввода, а также приведем
синтаксис написания
if((!lvl) or (lvl>10) or (lvl<1) and (!trap) or (trap>9))
SendSysMessage(who,"Usage is .spawnchest [1to10] [0to9]");
return;
endif
тоесть, если нет какого либо из числа мы прерываем выполнение.
Теперь чтоб ГМу было веселее, создадим мену в котоорм он сможет
выбрать тип контейнера.
var boxmenu := CreateMenu("Select a chest type:");
теперь наполним его:
AddMenuItem(boxmenu, 0xe40,"metallchest");
AddMenuItem(boxmenu, 0xe41,"metallchest2");
AddMenuItem(boxmenu, 0xe7c,"silverchest");
AddMenuItem(boxmenu, 0xe80,"brassbox");
AddMenuItem(boxmenu, 0xe42,"woodchest");
AddMenuItem(boxmenu, 0xe43,"woodchest2");
Ну тут вроде как все просто, взяли графику сундука, добавили ее
в наше мену и обозвали словом.
Теперь получим нужный нам выбранный сундук:
var selection := SelectMenuItem2(who, boxmenu)
if(!selection)
return;
endif
После того как выбрали сундук, попорсим указать место куда его
поставить, для этого выведим саобщение и воспользуемся
стандартной функцией для указания места:
SendSysMessage(who, "Select a place for chest creation");
var where := TargetCoordinates(who)
И опять проверка:
if(!where)
return;
endif
Теперь создадим выбранный нами сундук, на выбранном нами месте:
var chest := CreateItemAtLocation(where.x, where.y, where.z,
selection[2],1); - тут вроде все просто.
if(!chest)
SendSysMessage(who, "Nu ne SHmogla I, ne SHmogla");
return;
endif
Теперь сделаем чтобы наш сундучек не уперли игроки:
chest.movable := 0; 0 - хрен сопрешь/1 - каждый может уволочить.
Теперь поставим на него силу ловушки, уровень, номер ловушки,
время через которе в сундуке будет опять лут, для этого
воспользуемся SetObjProperty в которой просто укажем на какой
объект и какое свойство и его значение:
SetObjProperty(chest, "trap_str", cint((2*lvl)+9));
SetObjProperty(chest, "lvl", cint(lvl));
SetObjProperty(chest, "trap_type", cint(trap));
SetObjProperty(chest, "restock",
ReadGameClock()+(600+RandomInt(300))); - ресток каждые 15 минут.
Теперь на созданный нами сундук повесим упоравляющим им скрипт,
который мы создадим чуть позже:
chest.usescript := ":lootchest:lootchest"; - фаил будет лежать в
../pkg/lootchest/lootchest.elc
SendSysMessage("who, "The chest is set!");
endprogram
Все, пол дела сделано, откомпилируйте фаил и киньте его в
../scripts/textcmd/gm
Теперь приступим к созданию управляющего скрипта и назовем его
lootchest:
use uo;
use os;
use cfgfile;
include "include/startequip";
program lootchest(character, chest)
var restock := GetObjproperty(chest, "restock");
var lvl := GetObjproperty(chest, "lvl");
var lootgroup;
В зависимости от уровня сундука выберим номер лута, номер лута
передастся include/startequip, которая сформирует лут.
case cint(lvl)
1: lootgroup :=1;
2: lootgroup :=2;
тут я пропушу несколько строк. Номер лута определяет лут из
../config/loot.src (нужный вам номер сами подставите)
10: lootgroup :=16;
default: lootgroup :=1;
endcase
Смотрим, прошло ли воемя рестока, если да, то ставим ловушку на
контейнер и создаем лут.
if(restock< ReadGameClock())
trap_dm(character,chest); - эта функция активирует ловушку
Makeloot(chest, lootgroup); - функция которая вызывается из
include/startequipt
sleep(40); ждем 40 сорок секунд и перезапускаем скрипт.
chest.usescript := ":lootchest:lootchest";
else
SendSysMessage(character, "This box is enpty");
chest.userscript := это просьл покажет гамп открытого сундука.
sleep(40); ждем 40 сорок секунд и перезапускаем скрипт.
chest.usescript := ":lootchest:lootchest";
endif
function trap_dm(character, chest)
var trap := GetObjProperty(chest, "trap_type");
var trapstr := GetObjProperty(chest, "trap_str");
var lvl := GetObjProperty(chest, "lvl");
var skill := lvl+randomInt(40);
var thepoints ;= CInt(skill*2);
if(!CheckSkill(character, 24, skill, thepoints)) - если
мастерства по удалению ловушки не хватает для открытия сундука,
ловушка активируется. skill - сложность,thepoints -начисление
очков в случае удачи.
Далее мы посмотрим как можно отброжать различные эффекты:
case(trap)
"1":
PlaySoundEffect(character, SFX_225);
var dmg := randomInt(5* cint(trapstr));
SendSysMessage(character, "You set off a needle trap!");
ApplyDamage(character, dmg); - наносим повреждение чару
"2":
PlaySoundEffect(character, SFX_226);
PrintTextAbovePrivate(character, "You have been poisoned",
character); - можно выводить саобщения таким образом, она доже
лучьше чем седсисмессадж.
PlayObjectCenteredEffect(character, FX_CURSE_EFFECT, 10,10); тут
учавствуют сам эффект - для этого мы подрубили client.inc в нем
порписан нужный номер который мы заменили на слово, потом идет
скоросьт и поркрутка.
SetObjProperty(character,"ppoison_level", trapstr)); - травим
персонажа
start_script("spells/poisondamage", character) - запускаем
скрипт на отравление.
Я сново пропущу пару сторк
"4":
PlayMovingEffect(chest, character, FX_MAGIC_ARROW, 5, 1); эфект
будет от сундука до чара, далее сам эффект, потом скоросьт и
прокрутка.
PlaySoundEffect(character, SFX_SPELL_MAGIC_ARROW);
var dmg := randomInt(5* cint(trapstr));
ApplyDamage(character, dmg);
"5":
PlayLightingBoltEffect(character); - дфнный эффект только для
молнии.
и т.д.
default: SendSysMessage(character," YOu narrowly avoid the
trap!");
endcase
chest.usescript :="";
else
SendSysMessage(character," YOu remove trap!");
chest.usescript :="";
endif
endfunction
Ну вот и все, ведь правда не сложно?
Теперь дело за малым, создадим Pkg с именем lootchest
в нем создадим фаил pkg.cfg в котором укажем
version 1.0
Enable 1 - это самая важная строка ;)
Name lootchest - тоже важная
Maintainer Slayer
Email Slayer@dinfo.ru
; Все права принадлежат Middle-Earth
Также добавляем в этот пкдж наш фаил Lootchest и можно юзать.
Зы все работает ок, проверено на 094 и 095 версиях пола.