1. Введение
Скрипт - это текстовый файл, содержащий в себе информацию, которую обрабатывает сервер.
Для подключения скрипта к серверу необходимо в конфигурационный файл map_athena.conf добавить строку следующего вида:
npc: myscript.txt
где myscript.txt - название вашего скрипта.
npc: myscript.txt
где myscript.txt - название вашего скрипта.
2. Создание скриптов
Рассмотрим подробно небольшой скрипт, который создает NPC.
new_1-1.gat,66,114,4|TAB|script|TAB|NPCName|TAB|85,{ //создаем NPC на карте new_1-1.gat. 66,114 - координаты местонахождения NPC (x,y) (узнать название карты и координаты местонахождения вашего персонажа можно с помощью команды /where). 4 - ID стороны, в которую будет смотреть NPC (1, 2, 3, 4, 5, 6, 7, 8). NPCName - имя NPC. 85 - ID спрайта. Также можно задать дополнительные опции, например new_1-1.gat,66,114,4 script NPCName 85,0,5,{ (85 - ID спрайта, 0 - NPC невидимый, 5 - скрипт будет срабатывать, если персонаж будет находиться в радиусе 5 клеток от NPC).
|TAB|if (Class == 0) goto gonovice; //логическая конструкция (происходит проверка профессии персонажа (0 - ID профессии)). Также существует возможность проверить уровень профессии (if (JobLevel == 10)), очки скиллов (if (skillpoint == 5)), базовый уровень (if (basejob == Job_Swordman)), количество зени (if (Zeny == 1500)).
|TAB|mes "Добрый день!"; //сообщение, которое скажет NPC.
|TAB|next; //продолжение диалога (кнопка next).
|TAB|menu "Привет!",gohello,"До свидания",goquit; //вывод меню с вариантами ответа (например в случае выбора ответа 'Привет!' срабатывает метка gohello.
gohello: //метка
|TAB|waitingroom "[Не беспокоить!]",0; //NPC создает 'комнату ожидания' - своеобразный чат.
|TAB|set number,rand(9); //присваивание переменной number случайного значения от 1 до 9.
mes "^0000FF10Здравствуйте!^000000 Сегодня я видел "+number+" путешественников!"; //^0000FF10Здравствуйте!^000000 - задать цвет текста (0000FF10 - ID цвета в шестнадцатиричном формате, ^000000 - окончание выделения).
|TAB|next;
|TAB|mes "Вы слышали свежие новости "+strcharinfo(0)+"?"; //strcharinfo(0) - данная функция возвращает имя персонажа.
|TAB|next;
|TAB|mes "В окрестностях города появились опасные монстры!";
|TAB|if(countitem(909)<5) goto gerror; //логическая конструкция (если у персонажа в инвентаре предметов с ID 909 (Jellopy) меньше 5 штук, то срабатывает метка gerror. Если предметов с ID 909 пять или более, тогда продолжают выполняться следующие команды.
|TAB|delitem 909,5; //удаление из инвентаря персонажа 5 предметов с ID 909.
|TAB|getitem 1101,1; //дать персонажу 1 предмет с ID 1101.
|TAB|jobchange 1; //изменить профессию персонажа (1 - ID профессии).
|TAB|mes "Возьмите этот замечательный меч! С помощью его силы вы сможете защититься от монстров!";
|TAB|next;
|TAB|mes "Еще я дам вам денег. Сколько вы хотите получить зени?";
|TAB|next;
|TAB|input $dolg; //окно для ввода данных игроком. Значение, которое введет игрок, будет присвоено переменной $dolg.
|TAB|set Zeny,Zeny+$dolg; //добавить персонажу зени [значение $dolg] (соответственно set Zeny,Zeny-$dolg; - забрать у персонажа зени [значение $dolg]).
monster "new_1-1.gat",100,100,"Ужасный монстр",1272,1; //создание монстра на карте new_1-1.gat (координаты 100,100).'Ужасный монстр' - имя монстра. 1272 - ID монстра. 1 - количество.
mes "Удачи!";
close;
gonovice:
set novice,1; //присваивание переменной novice значения 1 (данный прием можно использовать для проверки выполнения заданий и т.п.).
mes "Приветствую! Новичок! Будь осторожен!";
savepoint "prontera.gat",116,72; //точка сохранения персонажа (на карте prontera.gat, координаты 116,72.
resetstatus; //сброс всех параметров персонажа.
resetskill; //сброс всех скиллов персонажа.
skill 142,1,0; //добавить персонажу скилл (142 - ID скилла [ID скиллов можно посмотреть в файле db/skill_db.txt]).
heal 1000,0; //восстановить персонажу 1000 HP.
emotion 29; //эмоции NPC (29 - ID эмоции).
next;
warp "payon.gat",90,30; //телепортация персонажа на карту payon.gat в место с координатами 90,30.
end; //завершение всех операций.
gerror:
cutin "prt_soldier",2; //показать в левом углу изображение солдата г.Prontera.
mes "До встречи!";
close;
cutin "prt_soldier",255; //убрать изображение солдата г.Prontera.
goquit:
mapannounce "new_1-1.gat","Счастливого пути "+strcharinfo(0)+"!",0; //объявление на всю карту new_1-1.gat.
mes ":)";
close;
}
prontera.gat,157,187,4 duplicate(NPCName) NewNPC 92 //создать копию NPC на карте prontera.gat (координаты 157,187, 4- ID стороны, NewNPC - имя NPC, 92 - ID спрайта.
//ID профессий:
Айдишники думаю не нужно перечислять...
3. Использование функций
Очень удобно использовать в скриптах функции, если одинаковые действия выполняют различные NPC.
Описание функции:
function script kfuncz {
mes "Сейчас у вас появится "+getarg(0)+" предмет с ID "+getarg(1)+"!";
next;
getitem getarg(1),getarg(0);
close;
end;
return; //возвращение значений переменных.
}
Вызов функции:
new_1-1.gat,66,114,4 script NPCName 85,{
callfunc "kfuncz",1,1716; //вызов функции (передача значений: 1 - getarg(0), 1716 - getarg(1)).
}
Везде не стал писать что нужно ставить |TAB|
Начнем разжовывать это простой скрипт.
prontera.gat,152,183,5 - Название локации(2 следующих числа это координаты Нпц, а 3 число это куда будет смотреть нпц)
далее ставиться TAB(тобиш Табуляция)scrip(это пишеться всегда)TABназвание скриптаTABномерНпц(тоесть каки вид он у вас будет имеють,для этого юзайте item_list)
mes - команда с помошью которого Нпц разговаривает с персонажем
if (Zeny<20000) goto m_noz; Нпц перекинет вас к определенному меню если у вас мало денег в данном случае наше меню называеться m_noz (незабывайте после каждой команды ставить ";")также эту команду можно применить не только к зеням но и клюбой вещи - напрмиер if(countitem(999)<40 это определенная вешь если их менее 40 то опятьже идете к определенному меню.
set Zeny,zeny-20000-это снятие с персонажа 20000к(можно поставить больше.
percentheal 100,100 - это значит что ващ хилер будет востонавливать Хп и Сп полностью.
sc_start sc_blessing,420000,10; - это команда на опкастовку.тут указываеться лв скила и всяка белебирда.
emotion 30,0 - думаю всем понятно? ну если нет, то пишу, это Нпц будет юзать эту эмоцию в определенном меню.. в данном случае при касте.
skilleffect 29,0; - эффект скила тоесть ставиться номер скила а там все уже взаимосвязано...(номера эффектов лежат в папке doc) .
close; закрытие данного меню:)
end; конец скрипта ( также не забываем ставить { и так } Это значит начало скрипта и конеч скрипта.