L2-Community.com - Bce o Lineage II  
Главная Регистрация Справка Пользователи Поиск Сообщения за день Все разделы прочитаны
 
 

Вернуться   L2-Community.com - Bce o Lineage II > Форум Lineage II > Боты и эмуляторы > Статьи и Мануалы

Ответ
 
Опции темы Опции просмотра
Старый 23.06.2009, 19:05   #1
Idas
No Active
 
Регистрация: 23.06.2009
Сообщений: 7
Вы сказали Спасибо: 0
Поблагодарили: 21 раз(а) в 3 сообщениях
По умолчанию Скрипты для l2walker - это просто!


Автор мануала - Lanara.
Скопировано и собрано в кучу "как есть".


А если кто из модераторов сделает каждый урок новым сообщением, и ссылки из оглавления на нужные сообщения, то будет самое оно
--------------------------------------------------------------------------------------------------------------------------


добрый день , уважаемые ботоводы и ботоводки ))))

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

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

=========

поскольку у меня постов-уроков планируется много , то я в этом самом первом посту буду писать содержание топика .

урок 1 - введение . основные сведения про скрипты для валкера/ингейма . команды скриптов .

урок 2 - пишем ваш первый скрипт с командой say

урок 3 - пишем скрипты на перемещение с командой moveto

урок 4 - диалоги в скриптах на примере скриптов на перемещение через гк

урок 5 - продолжаем изучать диалоги и пишем простенький скрипт на квест

урок 6 - команды проверки условий

урок 7 - предметы

урок 8 - предметы. продажа, покупка ,банк.

урок 9 - определение местонахождения чара . скрипт на делевел

урок 10 - команды боя


( продолжение следует )


------------------------------------------------------------------------------------------------------------
урок 1

введение . основные сведения про скрипты для валкера/ингейма . команды скриптов .

скрипты для валкера/ингейма - это текстовые файлы с расширением .sec их можно открывать блокнотом и их читать . в блокноте их можно и создавать , но есть один очень важный момент ! после того как вы создали файл в блокноте то чтобы сохранить его надо нажать "сохранить как..." а затем кодировку выбрать юникод !!! это очень важно , запомните это .

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

Код:
How to make a script: 
1. You will need L2Walker 
2. You will need notepad and the file extension must be .sec (ie: script.sec) 
3. The File must be saved as: unicode (File|Save As| Encoding: Unicode) 
4. Read this msg to learn about commands. 

Scripting Rules/Guidelines: 
- A script instruction must occupy a line. 
- () front is the instructionname(no spaces) between commands and parenthesis. IE: MOVETO(x,y,z) 
- () The center is the instruction parameter 
- Must save file in Unicode format! 
- IDs to obtain Item IDs, just get the item in your inventory 
then put it in the buy or sell (in vending options) save it.. open your .INI file and look for it. 
so far this has been the fastest way i have gotten item IDs. 
- Condition judgment instruction,If judges correct executes the next instruction or under with {}the center instruction, 
- Otherwise can jump over to the next instruction under or jumps over continuing on with the script. 


Example: 

Code: 

ITEMCOUNT(Healing Potion,>,1) 
{ 
RETURN 
} 
MSG(You do not have any potions!) 
JMP(Buy Potion) 
USEITEM(Scroll of Escape) 
DELAY(5000) 



If I had 2 potions on me, it will skip the part between { }. This is a simple little script not usuable, but 
should show you the "Condition" script. 

COMMANDS: 

Code: 
MOVETO(x,Y,Z) 

Explained:Moves to x,Y,Z. You can check your posistion by clicking: 
SETUP | OPTION - Pathing | .Cur 


Code: 
NPCSEL(name[ID=x]) 

Explained:Chooses NPC. Can select an NPC within the field of range. 
Noticed that you can select them even if you don't use ID. 
IE: NPCSEL(Sovin) 


Code: 
NPCDLG(name[ID=x]) 

Explained:With NPC dialogue. Opens up the dialog the NPC has. 


Code: 
DLGSEL(name) 

Explained:Dialogue choice. Look for certain words in dialog and select. 


Code: 
GOHOME() 

Explained:Return to nearest town on death. 


Code: 
SAY(writing) 

Explained:Speaks generally. Anyone in game can view. 


Code: 
MSG(writing) 

Explained:Outside hangs the prompt, Only you can see. 


Code: 
UseItem(name[ID=x]) 

Explained:Uses the stage prop. ID is not required. 


Code: 
BuyItem(name [ ID=x ],Quantity) 

Explained:Purchase goods. ID is required. 
Example 1:BuyItem (returns to the reel [ ID=736 ],2) 
Example 2:BuyItem (returns to the reel [ ID=736 ],2;Reactivating reel [ ID=737 ],3) 


Code: 
SellItem(name [ ID=x ],Quantity) 

Explained:Sell goods. ID is required. 
Example 1:SellItem (returns to the reel [ ID=736 ],2) 
Example 2:SellItem (returns to the reel [ ID=736 ],2;Reactivating reel [ ID=737 ],3) 
Example 3:SellItem (*) sells in the stage prop hypothesis to suppose is "sells"the complete goods 


Code: 
SaveItem(name [ ID=x ],Quantity) 

Explained:No Clue what this is used for. 
Example 1:SaveItem (returns to the reel [ ID=736 ],2) 
Example 2:SaveItem (returns to the reel [ ID=736 ],2;Reactivating reel [ ID=737 ],3) 
Example 3:SavelItem (*) preserves in the stage prop hypothesis to suppose is"saves" the complete goods 


Code: 
LoadItem(name [ ID=x ],Quantity) 

Explained:No Clue what this is used for. 
Example 1:LoadItem (returns to the reel [ ID=736 ],2) 
Example 2:LoadItem (returns to the reel [ ID=736 ],2;Reactivating reel [ ID=737 ],3) 


Code: 
ChangeWaitType(x) 

Explained:The character stands or sits down 
Example 1:ChangeWaitType(0) // SIT I Think. 
Example 2:ChangeWaitType(1) // STAND I Think. 

Conditional order: 

Code: 
StrInDlg(dialogue writing) 

Explained:Judges in the NPC dialogue dialog box whether has the writing which assigns 
Example: 

Code: 

NPCSEL(John Doe[ID=1007534]) 
NPCDLG(John Doe[ID=1007534]) 
DLGSEL(duty) 
STRINDLG(complies to entrust) 
{ 
DLGSEL(complies to entrust) 
JMP(duty meets) 
} 
JMP(duty already received) 



Code: 
StrNotInDlg (dialogue writing) 

Explained:Judges in the NPC dialogue dialog box whether it doesn't have assigned writing 
Example: 
NPCSEL(John Doe[ID=1007534]) 
NPCDLG(John Doe[ID=1007534]) 
DLGSEL(duty) 
STRNOTINDLG(complies to entrust) 
{ 
MSG(already received duty) 
JMP(has met duty) 
} 
DLGSEL(complies to entrust) 

=============================================== 
CharStatus([ CHP|CMP|HP|MP|WEIGHT|LV|SP|RACE|STAND ],[ >=|>|==|!=|<|<=],Num) 
Explained:Character condition judgment. 
HP,MP,WEIGHT: is a percentage 
CHP,CMP: Health current actual value 
WEIGHT: is carries a heavy load the percentage 
LV: Your Level 
RACE: manner race (human=0, Demon=1,Dark Elf=2, Elf=3, Dwarf=4) 
STAND:STAND==1 is standing and STAND==0 is sitting 
============================================== 
PosInRange(x,Y,Z,Range) 
Explained:Examines the character current coordinates whether by x,Y,Z is central 
point range is in the radius center of a circle 

PosOutRange(x,Y,Z,Range) 
Explained:Examines the character current coordinates whether by x,Y,Z is central 
point range is outside the radius center of a circle 

Example: Say you are outside of the set radius 

PosOutRange(100,100,100,500) 
{ 
MSG(please stand in the battle area) 
EXIT() 
} 


ItemCount(name[ID=x],* ,Count) 
* 
>= Greater than or equal to 
> Greater than 
== Equal to 
!= Does not equal 
< Less than nor equal to 
<= Less than 
Explained: 
Assigns the name or the ID stage prop quantity compared with thecharacter body on whether does satisfy the condition 


Flow control instruction: 
CALL(LABEL name) 
Explained:Transfers the LABEL marking the label address execution,Carries out returns, 
Must have to have the RETURN instruction 
Example: 
CALL(next step) 
The transfer completes can continue the execution next step 
... 
EXIT() 
LABEL(next step) 
... 
RETURN 

useskill (name[ID=x])

Code: 
JMP(LABEL name) 

Explained:Jumps changes to the LABEL marking the label address execution 


Code: 
RETURN() 

Explained:When CALL transfer must use this to return 


Code: 
EXIT() 

Explained:Conclusion script movement 


Code: 
DELAY(x) 

Explained:Retards x millisecond 


Code: 
PAUSE() 

Explained:Pause the Script 


Code: 
LABEL(Zone) 

Explained:Definition Zone,Uses for JMP or CALL 

Establishment instruction: 

Code: 
SET([ FIGHTSTART|FIGHTSTOP ]) 

Explained:The establishment commencing of action or stops fighting 
Example: 
SET(FIGHTSTART) //Starts to fight 
SET(FIGHTSTOP) //Stops fighting 


EXAMPLES: 

Code: 

LABEL(checkposistion) 
ITEMCOUNT(Scroll of Escape: Castle[ID=1830],>=,Cool 
{ 
CALL(test) 
} 
ITEMCOUNT(Scroll of Escape: Castle[ID=1830],<,7) 
{ 
CALL(test2) 
} 
DELAY(2000) 
JMP(checkposistion) 

LABEL(test) 
MSG(work) 
RETURN 

LABEL(test2) 
MSG(working?) 
RETURN
Вот мои обьяснения этих команд:


GOHOME()
Команда возврата в город после сметри

SAY(текст)
Писать что-либо в окне чата.

JMP(название)
Переход к метке LABEL(название) где текст в кавычках такой же

CALL(название)
Вызов подпрограммы. Переход к LABEL(название) где текст в кавычках такой же

LABEL(название)
Обозначает метку для перехода по CALL(название) или JMP(название)

DELAY(x)
Задерка , где x в милисекундах , т.е 1 сек это 1000

PAUSE()
Пауза . Скрипт станет на паузу и запустится вновь после того как вы нажмете кнопку Pause

RETURN()
Возврат из подпрограммы.

EXIT()
Конец скрипта. После этой команды выполнение скрипта прекратится

MOVETO(x,y,z)
Перемещение в точку с координатами x,y,z

ITEMCOUNT(Название предмета[ID=#],<,1)
{
...
}

Подсчитывает количество указанных предметов с условиями <, >, = и если условие верно товыполняет скрипт в фигурных скобках

USEITEM(Название предмета[ID=#])
Использует предмет.

BuyItem(Название предмета[ID=#],#)
Покупает предмет

BuyItem(Название предмета[ID=#],#;Название предмета[ID=#],#)
Покупает за раз более одного предмета (можно указать много предметов через точку с запятой).

SavelItem(Название предмета[ID=#],#)
Помещает предмет в хранилище (Warehouse)

SavelItem(Название предмета[ID=#],#;Название предмета[ID=#],#)
Помещает несколько предметов в хранилище (Warehouse).

LoadItem(Название предмета[ID=#],#)
Забрать предмет из хранилища

LoadItem(Название предмета[ID=#],#;Название предмета[ID=#],#)
Забрать несколько предметов из хранилища , # - количество

NPCSEL(Имя NPC[ID=#])
Выбрать NPC

NPCDLG(Имя NPC[ID=#])
Начать диалог с NPC

DLGSEL(Диалог)
Выбрать пункт диалога , например: DLGSEL(Buy)

StrInDlg(Диалог)
{
...
}

Проверяет присутствует ли фраза в диалоге ,если да, то исполняетса кусок скрипта в фигурных скобках

ChangeWaitType(x)
Сменить состояние с "сидеть" на "стоять" и наоборот
x = 0 Сесть
x = 1 Встать.

CharStatus([CHP|CMP|HP|MP|WEIGHT|LV|SP|RACE|STAND]
,[>=|>|==|!=|<|<=],число)
{
...
}


где
CHP - здоровье персонажа в числовом выражении
CMP - Мана персонажа в числовом выражении
HP - здоровье в %тах
MP - мана в %тах
WEIGHT - загрузка в%тах
LV - левел
SP - СП
RACE - раса
STAND - Проверка сидишь или стоишь , 0 - сидишь , 1 - стоишь

PosInRange(x,y,z,дистанция)
{
...
}

проверка находится ли заданная точка в пределах досягаемости (дистанция). Если да, то выполняется кусок скрипта в фигурных скобках

PosOutRange(x,y,z,дистанция)
{
...
}

то же самое, но условие верно, если точка все досягаемости

SET(FIGHTSTART)
Начинает бой

SET(FIGHTSTOP)
Останавливает бой

-------------------------------------------------------------------------------------------------------------------------------


Урок 2

Пишем ваш первый скрипт с командой SAY


Вот те кто никогда скрипты не писал так давайте напишем ваш первый скрипт .

Открывайте блокнот и начинаем писать скрипт .

Здесь дам вам один важный совет . Рекомендую начинать скрипт с "шапки" . Шапка - это информация про скрипт . Если в тектсте скрипта есть двойные косые линии // , то это - комментарии , все что написано после косых линий скриптом не читается и можно этим пользоваться чтобы оставлять коментарии в тексте скритпа и делать "шапки" то же )) В "шапке" пишем краткие сведения про скрипт , желателно там добавить когда он написан , на каких версиях валкера/ингейма проверялся и прочее .

Вот давайте создадим такую "шапку"

//---------------------------------------
//
// Мой первый скрипт
//
// написан 19.05.2008
//
//---------------------------------------

вот теперь давайте протестируем команду SAY и дальше пишем команду

SAY(hi all)

выполняя эту команду скрипт скажет в общий чат hi all

чтобы проверить работает ли у вас эта команда если текст на русском то потом пишем потом такую команду

SAY(привет всем)

а потом пишем еще одну команду MSG -

MSG(test end)

отличие этой команды от команды SAY в том что это команда выдает сообщение не в общий чат , а только сообщение для вас в окне валкера/ингейма

теперь такое очень важное замечание . Все исполняемые команды , в т.ч. SAY и MSG валкером/ингеймом могут выполниться не сразу , могут выполниться не сразу , а скрипт не ожидая окончание выполнения предыдущей команды прейдет к следующей команде и чтото будет пропущено и как результат произойдет сбой или неправильная скрипта . Поэтому приучите себя после всех исполняемых команд ставить задержку хотя бы 0.5сек . Единственное исключение , команда MOVETO , после нее нет необходимости ставить задержку . Поэтому после всех наших команд ставим DELAY(500)

Заканчиваем скрипт командой EXIT() . Ну в данном скрипте в ней нет особой необходимости , когда выполнятся все команды скрипта а скрипт не зациклен то скрипт и так остановится . Но изучим и эту команду

Вот в результате ваш первый скрипт получился такой-

Код:
//---------------------------------------
//
// Мой первый скрипт
//
// написан 19.05.2008 
// 
//---------------------------------------

SAY(hi all)
DELAY(500)

SAY(привет всем)
DELAY(500)

MSG(test end)
DELAY(500)

EXIT()
Теперь сохраняем скрипт , обязательно через "Сохранить как ..." и кодировкой выбираем юникод !!! Затем меняем расширение скрипта .txt на .SEC

Помещаем скрипт в папку SCRIPT валкера/ингейма и радуемся вашему первому скрипту ))))
А мне не забывайте говорить СПАСИБО :-)

Ну и в тему скриптов с командой SAY скрипт для спамеров рекламы

Код:
//-------------------------------------------------
//
// скрипт для спама рекламы в общий чат
//
//--------------------------------------------------

LABEL(metka005)

SAY(Продам по 3000a билетики для фишермена , за которые вы можете увеличить банк , инвентарь и другое . Цены умеренные . )
DELAY(60000)

JMP(metka005)
это скрипт уже в отличие от предыдущего так зацикленный . После того как скрипт проспамит рекламу то будет задержка в 1 минуту ( 60сек) , а потом скрипт по команде JMP перейдет к метке в начале скрипта и все опять повторится )))

--------------------------------------------------------------------------------------------


Урок 3

Пишем скрипты на перемещение с командой MOVETO

Команда MOVETO(x,y,z) - это перемещение в точку с координатами x,y,z , Это часто испольщзуемая команда в составах скриптов .

Расказываю как определять эти х,у,z . Это можно делать разными способами . Если вы в клиенте в окне чата введете команду /loc то вы получите координаты той точки где стоите . Можно командой /loc определять координаты и в окне чата валкера , кстати эта команда там уже есть !

Но проще всего MOVETO писать с помощью ингейма . Открываем меню Script Make и если нажать кнопку REC то ваш маршрут будет записан уже готовыми командами ! Только перемещаться надо аккуратно , не делая ненужных кликов ))))

Кстати , скрипты с командами MOVETO я почти каждый день использую , когда играю на клиненте с ингеймом . Дело в том что в городах есть маршруты , по которым вы пробегаете много много раз за все время игры . Это маршруты от/к ГК , банка , магазинов и подобные . Очень удобно написать для некоторых городов готовые подборки скриптов перемещения по таким маршрутам .

Вот например мой скрипт на перемещение в Гиране от ГК в люксор

Код:
// Giran от ГК в люксор

MOVETO(83391,147956,-3431)
MOVETO(82988,148009,-3495)
MOVETO(81545,147524,-3490)
MOVETO(81543,147214,-3559)
MOVETO(81319,145537,-3559)
MOVETO(81124,145540,-3559)
MOVETO(80249,145837,-3559)
MOVETO(80076,145830,-3522)
MOVETO(79727,145456,-3520)
если написать команды в обратном порядке то получится скрипт на перемещение с люксора к ГК ;-)

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


Ну и вот что еще по поводу команды MOVETO необходимо знать . Дело в том что когда эта команда выполняется то координата z - игнорируется !!! Поэтому скрипт на спуск под воду перед катакомбами надо писать спуск змейкой или по спирали , иначе скрипт посчитает что команда выполнена если совпадут только две первые координаты .

На мостах без перил перемещение надо тщательно посрединке и мелкими шажками писать иначе чар может спрыгнуть с моста )))

------------------------------------------------------------------------------------------------------

Урок 4

Диалоги в скриптах на примере скриптов на перемещение через ГК

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

Чтобы писать команды диалогов ингейм просто необходим ! Надо открыть меню Script Make и нажать кнопочку REC тогда диалог с НПС запишется .

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

Ну что ж подходим к ГК и начинаем ингеймом записывать диалог .

Вот что получается при телепорте с Глудина в Глудио

NPCSEL(Richlin[ID=7320])
NPCDLG(Richlin[ID=7320])
DLGSEL( Teleport )
DLGSEL(The Town of Gludio - 2900 Gold coin )


прямо так полученную запись в скрипте использовать неполучится . Сразу удаляем строчку NPCSEL - она лишняя и ненужная , диалоги будут в скриптах работать если они начинаются с команды NPCDLG .

Теперь вспоминаем что я уже говорила про задержку . Если После команд диалога не писать задержки то диалоги будут постоянно сбиваться !!! Поэтому после них пишем задержку хотя бы 0.5сек , а для гарантии я лично в своих скриптах пишу 2сек .

Теперь есть еще два момента в скриптах , когда задержку надо увеличивать . Во первых, это когда выпадают квестовые вещи после диалогов , они выпадают с задержкой до 3-4 секунд , поэтому в диалогах после таких команд рекомендую ставить задержку 5-6 секунд . И вот при телепортах надо задержку увеличивать . На валкере хотя бы до 10сек , а на ингейме надо ставить задержку как минимум в 20 сек . Поскольку я одни и те же скрипты использую и для валкера и для ингейма , то я всегда в таких случаях ставлю задержку 20сек .

Вот теперь готовые команды на перемещение с Глудина в Глудио выглядят так -

NPCDLG(Richlin[ID=7320])
DELAY(2000)
DLGSEL( Teleport )
DELAY(2000)
DLGSEL(The Town of Gludio - 2900 Gold coin )
DELAY(20000)


а вот один из моих таких скриптиков , это скрипт на телепорт с Глудина к Saints Necropolis

Код:
// телепорт с Глудина к Saints Necropolis 

NPCDLG(Richlin[ID=7320])
DELAY(2000)
DLGSEL( Teleport )
DELAY(2000)
DLGSEL(The Town of Gludio - 2900 Gold coin )
DELAY(20000)


NPCDLG(Bella[ID=7256])
DELAY(2000)
DLGSEL(Teleport)
DELAY(2000)
DLGSEL(The Town of Dion - 4100 Gold coin )
DELAY(20000)


NPCDLG(Trisha[ID=7059])
DELAY(2000)
DLGSEL(Teleport )
DELAY(2000)
DLGSEL(The Town of Giran - 8100 Gold coin )
DELAY(20000)


NPCDLG(Clarissa[ID=7080])
DELAY(2000)
DLGSEL( Teleport)
DELAY(2000)
DLGSEL(Saints Necropolis - 9800 Gold coin )
DELAY(20000)
----------------------------------------------------------------------------------------------

Урок 5

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


Продолжаю предыдущую лекцию с командами диалогов . Вот что вам необходимо знать . Если вы хотите пользоваться скриптами , то вы должны уметь эти команды снимать ингеймом . Чужие скрипты у вас скорее всего не заработают ! Даже на том же офе содержимое диалогов с НПС - менялось с хроники на хронику . А уже про то что на всех фри серверах эти диалоги разные тут и говорить не надо )))))

Еще один важный момент . Большинство фри серверов - это переделанные офф серверы с диалогами на корейском языке . На многих серверах эти диалоги заменили на английские , на некоторых даже русифицировали . Но если вам в диалогах попались кусочки фраз с иероглифами то для отображения этих фраз в командах скриптов и соответственно для правильной их работы в панели управления виндовз в языковых настройках надо включить поддержку языков с иероглифами !!! Это - очень важно , обязательно это сделайте :-)


Ну вот чтобы закрепить навык снятия иалогов ингеймом напишем скрипт на простенький квест Letters of Love

Это одноразовый квест для любых левелов и рас . Начинается он у Дарина , стоящего в центре хуманской деревни на Талкинг Исланд . Вот описание этого квеста-

1. Поговорите в центре деревни с Darin он даст вам Darin's Letter.
2. Отнесите его к Gatekeeper Roxxy.
3. Вернитесь к Darin он даст вам Darin's Receipt.
4. Поговорите с Magister Baulro он даст вам Baulro Potion.
5. Вернитесь к Darin получите Necklace of Knowledg.


Ну начинаем писать скрипт квест . Поскольку квест начинается у Дарина , то скрипт начинаем с таких команд -

PosOutRange(-84463,242754,-3755,200)
{
MSG(квест должен начинаться в центре деревни рядом с Дарином!)
DELAY(500)
EXIT()
}


это - проверка где находится ваш чар . Если он находится ВНЕ зоны с кооординатами центра -84463,242754,-3755 и радиусом зоны 200 то будут выполняться команды те что находятся между фигурными скобками {} Будет сообщение что чар не на месте и скрипт выключится .

Как я уже расказывала диалог с Дарином записываем ингеймом . Получится такое -

NPCSEL(Darin[ID=7048])
NPCDLG(Darin[ID=7048])
DLGSEL(Quest)
DLGSEL(Ask who Darin's love is)
DLGSEL(Say that you know Roxxy)
DLGSEL(Say you will do the favor)


Самую первую команду выкидываем как абсолютно ненужную а после остальных команд диалога добавляем задержку в 2 сек . Поскольку после последней команды происходит получение квестового предмета то после нее пишем задержку в 4 сек .

Потом тем же ингеймом снимаем перемещение от Дарина к Рокси и так далее . В результате получается такой скрипт

Код:
//------------------------------------------------------------------------------
//
// Название квеста: Letters of Love
// Тип: одноразовый 
// Расы: Все
// Требуемый левел: 1
// Где брать квест: Talking Island Village (Darin)
// Награда: Necklace of Knowledg
// 
// Дарин с Говорящего Острова сильно влюблен в Хранителя Врат Рокси, 
// но он очень стеснителен, чтобы рассказать ей о своих чувствах. 
// Вы просто обязаны ему помочь!
//
// 1. Поговорите в центре деревни с Darin, 
// он даст вам письмо для свой возлюбленной - Darin’s Letter.
// 
// 2. Отнесите его к Gatekeeper Roxxy. Оказывается, она тоже симпатизирует Дарину 
// и передает ему свой платок Roxxy's Kerchief.
// 
// 3. Вернитесь к Darin. Он счастлив услышать от вас хорошие вести, 
// но не уверен в своих силах и просит помочь ему раздобыть любовное зелье.
// Возьмите у него Darin’s Receipt. 
//
// 4. Найдите в церкви Magister Baulro,
// который может изготовить это зелье - Baulro Potion.
//
// 5. Вернитесь к Darin, отдайте бутылку и получите награду.
//
//------------------------------------------------------------------------------


// проверяем начальную точку

PosOutRange(-84463,242754,-3755,200)
{
MSG(квест должен начинаться в центре деревни рядом с Дарином!)
DELAY(500)
EXIT()
}

// разговариваем с Дарином и получаем Darin's Letter

NPCDLG(Darin[ID=7048])
DELAY(2000)
DLGSEL(Quest)
DELAY(2000)
DLGSEL(Ask who Darin's love is)
DELAY(2000)
DLGSEL(Say that you know Roxxy)
DELAY(2000)
DLGSEL(Say you will do the favor)
DELAY(4000)

// бежим к ГК

MOVETO(-84469,242768,-3755)
MOVETO(-84898,243473,-3755)
MOVETO(-85129,243932,-3755)
MOVETO(-84809,244215,-3755)
MOVETO(-84158,244580,-3755)

// разовариваем с Рокси и получаем Roxxy's Kerchief

NPCDLG(Roxxy[ID=7006])
DELAY(2000)
DLGSEL(Quest )
DELAY(2000)
DLGSEL([Letters of Love])
DELAY(4000)

// возвращаемся к Дарину 

MOVETO(-84158,244580,-3755)
MOVETO(-84809,244215,-3755)
MOVETO(-85129,243932,-3755)
MOVETO(-84898,243473,-3755)
MOVETO(-84469,242768,-3755)

// получаем Darin’s Receipt

NPCDLG(Darin[ID=7048])
DELAY(2000)
DLGSEL(Quest)
DELAY(4000)

// бежим в церковь к Баулро

MOVETO(-84447,242753,-3755)
MOVETO(-84866,243297,-3755)
MOVETO(-85537,244340,-3755)
MOVETO(-85479,244456,-3755)
MOVETO(-85349,244606,-3753)
MOVETO(-85226,244743,-3753)
MOVETO(-85149,244800,-3753)
MOVETO(-84754,245008,-3753)

// получаем у Баулро Baulro Potion

NPCDLG(Baulro[ID=7033])
DELAY(2000)
DLGSEL(Quest)
DELAY(4000)

// возвращаемся к Дарину

MOVETO(-84754,245008,-3753)
MOVETO(-85149,244800,-3753)
MOVETO(-85226,244743,-3753)
MOVETO(-85349,244606,-3753)
MOVETO(-85479,244456,-3755)
MOVETO(-85537,244340,-3755)
MOVETO(-84866,243297,-3755)
MOVETO(-84447,242753,-3755)

// получаем награду 

NPCDLG(Darin[ID=7048])
DELAY(2000)
DLGSEL(Quest)
DELAY(4000)

MSG(квест окончен , награда получена )
DELAY(500)
EXIT()
Это готовый 100%но работающий скрипт на квест . Вот изучите его . Есть еще куча других подобных квестиков в начальных деревнях , где не нужно бить мобов а надо только бегать и говорить . Так задание тем кто учится писать скриптики - попробуйте сами написать подобный квест . Если будут вопросы , проблемы - обращайтесь , постараюсь помочь :-)

------------------------------------------------------------------------------------------------------

Урок 6

Команды , проверки условий

В предыдущем уроке был скрипт на простенький квест . Это 100%но работающий квест . Но так можно писать только самы простые квесты . Дело в том что многие скрипты на те же квесты работают часами и в процессе могут произойти разный форсмажор - чар изза какойнить ошибки с игры вылетит , комп даст сбой , оборвется инет , сервер ляжет и прочее . Как заставить правильно работать подобный скрипт на квест когда вы снова запустите игру ?

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

Код:
// Проверки на случай если квест прервался

ITEMCOUNT(Ring of Raven[ID=1642],>,0)
{
JMP(metka010)
}

ITEMCOUNT(Succubus Undies[ID=1645],>,0)
{
JMP(metka010)
}

ITEMCOUNT(Raut's Teleport Scroll[ID=1644],>,0)
{
JMP(metka009)
}

ITEMCOUNT(Bead Parcel[ID=1657],>,0)
{
JMP(metka008)
}

ITEMCOUNT(Bead[ID=1656],>,19)
{
JMP(metka007)
}

ITEMCOUNT(Bead[ID=1656],>,0)
{
JMP(metka006)
}
ITEMCOUNT(Tarantula Picture[ID=1654],>,0)
{
JMP(metka006)
}

ITEMCOUNT(Honey Jar[ID=1655],>,4)
{
JMP(metka005)
}

ITEMCOUNT(Honey Jar[ID=1655],>,0)
{
JMP(metka004)
}
ITEMCOUNT(Bear Picture[ID=1653],>,0)
{
JMP(metka004)
}

ITEMCOUNT(Mion's Letter[ID=1646],>,0)
{
JMP(metka003)
}

ITEMCOUNT(Pippi's Letter of Recommendation[ID=1643],>,0)
{
JMP(metka002)
}
ITEMCOUNT(Bronk's Ingot[ID=1647],>,0)
{
JMP(metka002)
}
ITEMCOUNT(Bronk's Pay[ID=1650],>,0)
{
JMP(metka002)
}
ITEMCOUNT(Shari's Axe[ID=1648],>,0)
{
JMP(metka002)
}
ITEMCOUNT(Shari's Pay[ID=1651],>,0)
{
JMP(metka002)
}
ITEMCOUNT(Zimenf's Potion[ID=1649],>,0)
{
JMP(metka002)
}
ITEMCOUNT(Zimenf's Pay[ID=1652],>,0)
{
JMP(metka002)
}
попозже я этот скрипт полностью тут выложу , просто вначале еще есть что расказать чтобы скрипт могли понять начинающие скриптописатели .

Сами команды проверки вы посмотрите в первом уроке в ФАКе . Они разные - на местоположение , на наличие предметов , на проверку разных характеристик чара типа здоровье и так далее . В ФАКе показано как правильно эти команды писать . Но есть один момент , которого нету в ФАКе .

Очень часто бывает необходимость выполнить проверку в проверке , ну тоесть такое -

ПРОВЕРКА1(...)
{
...
ПРОВЕРКА2(...)
{
...
}
...
}


Так вот запомните - ТАК СКРИПТЫ ПИСАТЬ НЕЛЬЗЯ ! Произойдет сбой и втрая проверка не будет работать . Ну это такая особенность языка скриптов для валкера/ингейма .

Есть два варианта как можно это ограничение обойти можно перед втопрой проверкой поставть команду JMP(...) и выйти из фигурных скобок первой проверки , а затем вернуться назад той же командой JMP . Ну например так

ПРОВЕРКА1(...)
{
...
JMP(metka1)
LABEL(metka2)
...
}



LABEL(metka1)
ПРОВЕРКА2(...)
{
...
}
JMP(metka2)



А можно вторую проверку оформить как подпрограмму и тогда это будет выглядеть так -


ПРОВЕРКА1(...)
{
...
CALL(check)
...
}


LABEL(check)
ПРОВЕРКА2(...)
{
...
}
RETURN()



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

Код:
//-------------------------------------------
//
// сдача продукции манора
//
//-------------------------------------------

LABEL(metka001)

ITEMCOUNT(Desert Codran[ID=5090],<,1)
{
MSG(vse)
EXIT()
}

NPCDLG(Manor Manager[ID=7996])
DELAY(350)
DLGSEL(Tally up indigenous product.)
DELAY(350)
SELLCROP(Desert Codran[ID=5090],250;)
DELAY(350)
JMP(metka001)

//-------------------------

Chilly Coda[ID=5065]
Blue Coda[ID=5067]
Desert Codran[ID=5090]
Twin Codran[ID=5092]
Great Codran[ID=5094]
Blue Coba[ID=6541]
Расказываю как пользоваться этим скриптом . Ну ник манор-менеджера и может быть и диалоги поправьте сами под себя с помощью ингейма . В двух местах скрипта надо написать название предмеда и его АйДи , это то же снимается при помощи ингейма .

После старта олимпиады обновляется прием манора но в течение нескольких минут приема еще нету . В этот момент обязательно посмотрите на цены на принимаемую продукцию . Дело в том что есть два вида наград за манор и там разные по ценности для вас награды могут быть . Так дело в том что скрипт будет сам сдавать продукцию в тот город где ему за сдачу предложат самую высокую цену ! И если вам нужна награда 2 а продукцию на награду 1 дороже принимают - то не запускайте скрипт . Но вообще такое очень редко бывает но я сочла нужным вас предупредить :-)

----------------------------------------------------------------------------------------

Урок 7

Предметы


Предметы и команды с предметами широко используется в скриптах . Команда использовать предмет - это USEITEM , вот как она пишется

UseItem(name[ID=x])

вот примеры применения такой команды -

USEITEM(Haste Potion[ID=734])
DELAY(500)


или вот -

USEITEM(Scroll of Escape[ID=736])
DELAY(32000)


Обратите внимание что после использования СоЕ надо задержку больше 30ти сек ставить ! Иначе ваш скрипт собьется когда после использования СоЕ вы не поставите задержку или задержка будет маленькая .

В качестве примеров использования команды USEITEM я вам покажу 2а своих скриптика .

Вот скрипт на разделку рыбы после рыбалки . Постарайтесь прочитать и понять скрипт .

Код:
//-----------------------------------------------------------
//
// разделка рыбы
//
//-----------------------------------------------------------

LABEL(metka005)

CHARSTATUS(WEIGHT,>=,98)
{
MSG(ves98)
DELAY(500)
EXIT()
}

ITEMCOUNT(Small green nimble fish[ID=6411],>,0)
{
USEITEM(Small green nimble fish[ID=6411])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small green ugly fish[ID=6412],>,0)
{
USEITEM(Small green ugly fish[ID=6412])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small green fat fish[ID=6413],>,0)
{
USEITEM(Small green fat fish[ID=6413])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Green nimble fish[ID=6414],>,0)
{
USEITEM(Green nimble fish[ID=6414])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Green ugly fish[ID=6415],>,0)
{
USEITEM(Green ugly fish[ID=6415])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Green fat fish[ID=6416],>,0)
{
USEITEM(Green fat fish[ID=6416])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big nimble green fish[ID=6417],>,0)
{
USEITEM(Big nimble green fish[ID=6417])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big green ugly fish[ID=6418],>,0)
{
USEITEM(Big green ugly fish[ID=6418])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big green fat fish[ID=6419],>,0)
{
USEITEM(Big green fat fish[ID=6419])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small jade nimble fish[ID=6420],>,0)
{
USEITEM(Small jade nimble fish[ID=6420])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small jade ugly fish[ID=6421],>,0)
{
USEITEM(Small jade ugly fish[ID=6421])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small jade fat fish[ID=6422],>,0)
{
USEITEM(Small jade fat fish[ID=6422])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Jade nimble fish[ID=6423],>,0)
{
USEITEM(Jade nimble fish[ID=6423])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Jade ugly fish[ID=6424],>,0)
{
USEITEM(Jade ugly fish[ID=6424])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Jade fat fish[ID=6425],>,0)
{
USEITEM(Jade fat fish[ID=6425])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big jade nimble fish[ID=6426],>,0)
{
USEITEM(Big jade nimble fish[ID=6426])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big jade ugly fish[ID=6427],>,0)
{
USEITEM(Big jade ugly fish[ID=6427])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big jade fat fish[ID=6428],>,0)
{
USEITEM(Big jade fat fish[ID=6428])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small blue nimble fish[ID=6429],>,0)
{
USEITEM(Small blue nimble fish[ID=6429])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small blue ugly fish[ID=6430],>,0)
{
USEITEM(Small blue ugly fish[ID=6430])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small blue fat fish[ID=6431],>,0)
{
USEITEM(Small blue fat fish[ID=6431])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Blue nimble fish[ID=6432],>,0)
{
USEITEM(Blue nimble fish[ID=6432])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Blue ugly fish[ID=6433],>,0)
{
USEITEM(Blue ugly fish[ID=6433])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Blue fat fish[ID=6434],>,0)
{
USEITEM(Blue fat fish[ID=6434])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big blue nimble fish[ID=6435],>,0)
{
USEITEM(Big blue nimble fish[ID=6435])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big blue ugly fish[ID=6436],>,0)
{
USEITEM(Big blue ugly fish[ID=6436])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big blue fat fish[ID=6437],>,0)
{
USEITEM(Big blue fat fish[ID=6437])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small yellow nimble fish[ID=6438],>,0)
{
USEITEM(Small yellow nimble fish[ID=6438])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small yellow ugly fish[ID=6439],>,0)
{
USEITEM(Small yellow ugly fish[ID=6439])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small yellow fat fish[ID=6440],>,0)
{
USEITEM(Small yellow fat fish[ID=6440])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Yellow nimble fish[ID=6441],>,0)
{
USEITEM(Yellow nimble fish[ID=6441])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Yellow ugly fish[ID=6442],>,0)
{
USEITEM(Yellow ugly fish[ID=6442])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Yellow fat fish[ID=6443],>,0)
{
USEITEM(Yellow fat fish[ID=6443])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big yellow nimble fish[ID=6444],>,0)
{
USEITEM(Big yellow nimble fish[ID=6444])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big yellow ugly fish[ID=6445],>,0)
{
USEITEM(Big yellow ugly fish[ID=6445])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big yellow fat fish[ID=6446],>,0)
{
USEITEM(Big yellow fat fish[ID=6446])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small orange nimble fish[ID=6447],>,0)
{
USEITEM(Small orange nimble fish[ID=6447])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small orange ugly fish[ID=6448],>,0)
{
USEITEM(Small orange ugly fish[ID=6448])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small orange fat fish[ID=6449],>,0)
{
USEITEM(Small orange fat fish[ID=6449])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Orange nimble fish[ID=6450],>,0)
{
USEITEM(Orange nimble fish[ID=6450])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Orange ugly fish[ID=6451],>,0)
{
USEITEM(Orange ugly fish[ID=6451])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Orange fat fish[ID=6452],>,0)
{
USEITEM(Orange fat fish[ID=6452])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big orange nimble fish[ID=6453],>,0)
{
USEITEM(Big orange nimble fish[ID=6453])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big orange ugly fish[ID=6454],>,0)
{
USEITEM(Big orange ugly fish[ID=6454])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big orange fat fish[ID=6455],>,0)
{
USEITEM(Big orange fat fish[ID=6455])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small Purple nimble fish[ID=6456],>,0)
{
USEITEM(Small Purple nimble fish[ID=6456])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small Purple ugly fish[ID=6457],>,0)
{
USEITEM(Small Purple ugly fish[ID=6457])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small Purple fat fish[ID=6458],>,0)
{
USEITEM(Small Purple fat fish[ID=6458])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Purple nimble fish[ID=6459],>,0)
{
USEITEM(Purple nimble fish[ID=6459])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Purple ugly fish[ID=6460],>,0)
{
USEITEM(Purple ugly fish[ID=6460])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Purple fat fish[ID=6461],>,0)
{
USEITEM(Purple fat fish[ID=6461])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big purple nimble fish[ID=6462],>,0)
{
USEITEM(Big purple nimble fish[ID=6462])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big purple ugly fish[ID=6463],>,0)
{
USEITEM(Big purple ugly fish[ID=6463])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big purple fat fish[ID=6464],>,0)
{
USEITEM(Big purple fat fish[ID=6464])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small red nimble fish[ID=6465],>,0)
{
USEITEM(Small red nimble fish[ID=6465])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small red ugly fish[ID=6466],>,0)
{
USEITEM(Small red ugly fish[ID=6466])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small red fat fish[ID=6467],>,0)
{
USEITEM(Small red fat fish[ID=6467])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Red nimble fish[ID=6468],>,0)
{
USEITEM(Red nimble fish[ID=6468])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Red ugly fish[ID=6469],>,0)
{
USEITEM(Red ugly fish[ID=6469])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Red fat fish[ID=6470],>,0)
{
USEITEM(Red fat fish[ID=6470])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big red nimble fish[ID=6471],>,0)
{
USEITEM(Big red nimble fish[ID=6471])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big red ugly fish[ID=6472],>,0)
{
USEITEM(Big red ugly fish[ID=6472])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big red fat fish[ID=6473],>,0)
{
USEITEM(Big red fat fish[ID=6473])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small white nimble fish[ID=6474],>,0)
{
USEITEM(Small white nimble fish[ID=6474])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small white ugly fish[ID=6475],>,0)
{
USEITEM(Small white ugly fish[ID=6475])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small white fat fish[ID=6476],>,0)
{
USEITEM(Small white fat fish[ID=6476])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(White nimble fish[ID=6477],>,0)
{
USEITEM(White nimble fish[ID=6477])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(White ugly fish[ID=6478],>,0)
{
USEITEM(White ugly fish[ID=6478])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(White fat fish[ID=6479],>,0)
{
USEITEM(White fat fish[ID=6479])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small green treasure chest[ID=6492],>,0)
{
USEITEM(Small green treasure chest[ID=6492])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(green treasure chest[ID=6493],>,0)
{
USEITEM(green treasure chest[ID=6493])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big green treasure chest[ID=6494],>,0)
{
USEITEM(Big green treasure chest[ID=6494])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small jade treasure chest[ID=6495],>,0)
{
USEITEM(Small jade treasure chest[ID=6495])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(jade treasure chest[ID=6496],>,0)
{
USEITEM(jade treasure chest[ID=6496])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big jade treasure chest[ID=6497],>,0)
{
USEITEM(Big jade treasure chest[ID=6497])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small blue treasure chest[ID=6498],>,0)
{
USEITEM(Small blue treasure chest[ID=6498])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(blue treasure chest[ID=6499],>,0)
{
USEITEM(blue treasure chest[ID=6499])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big blue treasure chest[ID=6500],>,0)
{
USEITEM(Big blue treasure chest[ID=6500])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small yellow treasure chest[ID=6501],>,0)
{
USEITEM(Small yellow treasure chest[ID=6501])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(yellow treasure chest[ID=6502],>,0)
{
USEITEM(yellow treasure chest[ID=6502])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big yellow treasure chest[ID=6503],>,0)
{
USEITEM(Big yellow treasure chest[ID=6503])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small orange treasure chest[ID=6504],>,0)
{
USEITEM(Small orange treasure chest[ID=6504])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(orange treasure chest[ID=6505],>,0)
{
USEITEM(orange treasure chest[ID=6505])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big orange treasure chest[ID=6506],>,0)
{
USEITEM(Big orange treasure chest[ID=6506])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small Purple treasure chest[ID=6507],>,0)
{
USEITEM(Small Purple treasure chest[ID=6507])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Purple treasure chest[ID=6508],>,0)
{
USEITEM(Purple treasure chest[ID=6508])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big Purple treasure chest[ID=6509],>,0)
{
USEITEM(Big Purple treasure chest[ID=6509])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small red treasure chest[ID=6510],>,0)
{
USEITEM(Small red treasure chest[ID=6510])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(red treasure chest[ID=6511],>,0)
{
USEITEM(red treasure chest[ID=6511])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Big red treasure chest[ID=6512],>,0)
{
USEITEM(Big red treasure chest[ID=6512])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small white treasure chest[ID=6513],>,0)
{
USEITEM(Small white treasure chest[ID=6513])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(white treasure chest[ID=6514],>,0)
{
USEITEM(white treasure chest[ID=6514])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small green nimble fish - For Beginners[ID=7726],>,0)
{
USEITEM(Small green nimble fish - For Beginners[ID=7726])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small green ugly fish - For Beginners[ID=7727],>,0)
{
USEITEM(Small green ugly fish - For Beginners[ID=7727])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small green fat fish - For Beginners[ID=7728],>,0)
{
USEITEM(Small green fat fish - For Beginners[ID=7728])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Green nimble fish - For Beginners[ID=7729],>,0)
{
USEITEM(Green nimble fish - For Beginners[ID=7729])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Green ugly fish - For Beginners[ID=7730],>,0)
{
USEITEM(Green ugly fish - For Beginners[ID=7730])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Green fat fish - For Beginners[ID=7731],>,0)
{
USEITEM(Green fat fish - For Beginners[ID=7731])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large green nimble fish - For Beginners[ID=7732],>,0)
{
USEITEM(Large green nimble fish - For Beginners[ID=7732])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large green ugly fish - For Beginners[ID=7733],>,0)
{
USEITEM(Large green ugly fish - For Beginners[ID=7733])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large green fat fish - For Beginners[ID=7734],>,0)
{
USEITEM(Large green fat fish - For Beginners[ID=7734])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small jade nimble fish - For Beginners[ID=7735],>,0)
{
USEITEM(Small jade nimble fish - For Beginners[ID=7735])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small jade ugly fish - For Beginners[ID=7736],>,0)
{
USEITEM(Small jade ugly fish - For Beginners[ID=7736])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small jade fat fish - For Beginners[ID=7737],>,0)
{
USEITEM(Small jade fat fish - For Beginners[ID=7737])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large jade nimble fish - For Beginners[ID=7741],>,0)
{
USEITEM(Large jade nimble fish - For Beginners[ID=7741])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large jade fat fish - For Beginners[ID=7743],>,0)
{
USEITEM(Large jade fat fish - For Beginners[ID=7743])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large jade ugly fish - For Beginners[ID=7742],>,0)
{
USEITEM(Large jade ugly fish - For Beginners[ID=7742])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small blue nimble fish - For Beginners[ID=7744],>,0)
{
USEITEM(Small blue nimble fish - For Beginners[ID=7744])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small blue ugly fish - For Beginners[ID=7745],>,0)
{
USEITEM(Small blue ugly fish - For Beginners[ID=7745])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small blue fat fish - For Beginners[ID=7746],>,0)
{
USEITEM(Small blue fat fish - For Beginners[ID=7746])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Blue nimble fish - For Beginners[ID=7747],>,0)
{
USEITEM(Blue nimble fish - For Beginners[ID=7747])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Blue ugly fish - For Beginners[ID=7748],>,0)
{
USEITEM(Blue ugly fish - For Beginners[ID=7748])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Blue fat fish - For Beginners[ID=7749],>,0)
{
USEITEM(Blue fat fish - For Beginners[ID=7749])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large blue nimble fish - For Beginners[ID=7750],>,0)
{
USEITEM(Large blue nimble fish - For Beginners[ID=7750])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large blue ugly fish - For Beginners[ID=7751],>,0)
{
USEITEM(Large blue ugly fish - For Beginners[ID=7751])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large blue fat fish - For Beginners[ID=7752],>,0)
{
USEITEM(Large blue fat fish - For Beginners[ID=7752])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small yellow nimble fish - For Beginners[ID=7753],>,0)
{
USEITEM(Small yellow nimble fish - For Beginners[ID=7753])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small yellow ugly fish - For Beginners[ID=7754],>,0)
{
USEITEM(Small yellow ugly fish - For Beginners[ID=7754])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small yellow fat fish - For Beginners[ID=7755],>,0)
{
USEITEM(Small yellow fat fish - For Beginners[ID=7755])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Yellow nimble fish - For Beginners[ID=7756],>,0)
{
USEITEM(Yellow nimble fish - For Beginners[ID=7756])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Yellow ugly fish - For Beginners[ID=7757],>,0)
{
USEITEM(Yellow ugly fish - For Beginners[ID=7757])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Yellow fat fish - For Beginners[ID=7758],>,0)
{
USEITEM(Yellow fat fish - For Beginners[ID=7758])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large yellow nimble fish - For Beginners[ID=7759],>,0)
{
USEITEM(Large yellow nimble fish - For Beginners[ID=7759])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large yellow ugly fish - For Beginners[ID=7760],>,0)
{
USEITEM(Large yellow ugly fish - For Beginners[ID=7760])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large yellow fat fish - For Beginners[ID=7761],>,0)
{
USEITEM(Large yellow fat fish - For Beginners[ID=7761])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small orange nimble fish - For Beginners[ID=7762],>,0)
{
USEITEM(Small orange nimble fish - For Beginners[ID=7762])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small orange ugly fish - For Beginners[ID=7763],>,0)
{
USEITEM(Small orange ugly fish - For Beginners[ID=7763])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small orange fat fish - For Beginners[ID=7764],>,0)
{
USEITEM(Small orange fat fish - For Beginners[ID=7764])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Orange nimble fish - For Beginners[ID=7765],>,0)
{
USEITEM(Orange nimble fish - For Beginners[ID=7765])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Orange ugly fish - For Beginners[ID=7766],>,0)
{
USEITEM(Orange ugly fish - For Beginners[ID=7766])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Orange fat fish - For Beginners[ID=7767],>,0)
{
USEITEM(Orange fat fish - For Beginners[ID=7767])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large orange nimble fish - For Beginners[ID=7768],>,0)
{
USEITEM(Large orange nimble fish - For Beginners[ID=7768])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large orange ugly fish - For Beginners[ID=7769],>,0)
{
USEITEM(Large orange ugly fish - For Beginners[ID=7769])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large orange fat fish - For Beginners[ID=7770],>,0)
{
USEITEM(Large orange fat fish - For Beginners[ID=7770])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small purple nimble fish - For Beginners[ID=7771],>,0)
{
USEITEM(Small purple nimble fish - For Beginners[ID=7771])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small purple ugly fish - For Beginners[ID=7772],>,0)
{
USEITEM(Small purple ugly fish - For Beginners[ID=7772])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small purple fat fish - For Beginners[ID=7773],>,0)
{
USEITEM(Small purple fat fish - For Beginners[ID=7773])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Purple nimble fish - For Beginners[ID=7774],>,0)
{
USEITEM(Purple nimble fish - For Beginners[ID=7774])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Purple ugly fish - For Beginners[ID=7775],>,0)
{
USEITEM(Purple ugly fish - For Beginners[ID=7775])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Purple fat fish - For Beginners[ID=7776],>,0)
{
USEITEM(Purple fat fish - For Beginners[ID=7776])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large purple nimble fish - For Beginners[ID=7777],>,0)
{
USEITEM(Large purple nimble fish - For Beginners[ID=7777])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large purple ugly fish - For Beginners[ID=7778],>,0)
{
USEITEM(Large purple ugly fish - For Beginners[ID=7778])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large purple fat fish - For Beginners[ID=7779],>,0)
{
USEITEM(Large purple fat fish - For Beginners[ID=7779])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small red nimble fish - For Beginners[ID=7780],>,0)
{
USEITEM(Small red nimble fish - For Beginners[ID=7780])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small red ugly fish - For Beginners[ID=7781],>,0)
{
USEITEM(Small red ugly fish - For Beginners[ID=7781])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small red fat fish - For Beginners[ID=7782],>,0)
{
USEITEM(Small red fat fish - For Beginners[ID=7782])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Red nimble fish - For Beginners[ID=7783],>,0)
{
USEITEM(Red nimble fish - For Beginners[ID=7783])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Red ugly fish - For Beginners[ID=7784],>,0)
{
USEITEM(Red ugly fish - For Beginners[ID=7784])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Red fat fish - For Beginners[ID=7785],>,0)
{
USEITEM(Red fat fish - For Beginners[ID=7785])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large red nimble fish - For Beginners[ID=7786],>,0)
{
USEITEM(Large red nimble fish - For Beginners[ID=7786])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large red ugly fish - For Beginners[ID=7787],>,0)
{
USEITEM(Large red ugly fish - For Beginners[ID=7787])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Large red fat fish - For Beginners[ID=7788],>,0)
{
USEITEM(Large red fat fish - For Beginners[ID=7788])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small white nimble fish - For Beginners[ID=7789],>,0)
{
USEITEM(Small white nimble fish - For Beginners[ID=7789])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small white ugly fish - For Beginners[ID=7790],>,0)
{
USEITEM(Small white ugly fish - For Beginners[ID=7790])
DELAY(300)
JMP(metka005)
}

ITEMCOUNT(Small white fat fish - For Beginners[ID=7791],>,0)
{
USEITEM(Small white fat fish - For Beginners[ID=7791])
DELAY(300)
JMP(metka005)
}

MSG(vse)
DELAY(500)

EXIT()
Расказываю как работает этот скрипт . В самом начале скрипта стоит проверка на вес . Дело в том что при разделке рыбы вес увеличивается и иногда может быть такой случай что наступает перегруз , так тогда скрипт выдаст сообщение ves98 и остановится .

Потом идут команды ITEMCOUNT которые проверяют инвентарь на наличие разных видов рыб и сундуков . Если определенный сорт рыбы/сундука есть , то мы разделываем его с помощью команды USEITEM а затем скрипт по команде JMP возвращается в самое начало на метку metka005

После того как все проверки пройду и следовательно вся рыба будет разделана идет сообщение vse и скрипт останавливается .


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

Это скрипт на пролучение кристалов у НПС в магической гильдии . Стоят два чара с настоенным взаимным автотрейдом . У первого чара выставлено условие что когда в инвентаре предмета Emergency Dressing меньше чем один ( т.е нету этого предмета) так он кидает автотрейд второму чару . Заодно выставлено что он передает Green Soul Crystal этому второму чару . У второго чара автотейда на первого и выставлено что он передает первому чару 1ну штуку Emergency Dressing .

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

Код:
 //-----------------------------------------------------
//
// скрипт на получение кри для СА в маг гильдии
//
//-----------------------------------------------------


LABEL(metka010)

ITEMCOUNT(Green Soul Crystal[ID=4640],>,0)
{
USEITEM(Emergency Dressing[ID=1834])
DELAY(10000)
JMP(metka010)
}

NPCDLG(Winonin[ID=7856])
DELAY(2000)
DLGSEL(Quest)
DELAY(2000)
DLGSEL("Yes, \nplease, may I have another?")
DELAY(2000)
DLGSEL(Green Soul Crystal)
DELAY(4000)

JMP(metka010)
Разберитесь как работает скрипт . Вначале идет проверка на наличие кристала в инвентаре и если кристал есть то используется бинтик и идет задержка на время пока произойдет автотрейд ! Правда ж хитро придумано ? )))

Ну а затем в скрипте идет диалог с НПС на получение кристала и возврат в самое начало скрипта .

Для работы с предметами есть еще команды купить, продать , положить/взять предмет с банка . Там есть некоторые особенности и тонкости о которых я раскажу вам в следующем уроке :-)

----------------------------------------------------------------------------------------------------

Урок 8

Предметы. Продажа, покупка ,банк.

Продолжаю рассказывать про предметы и команды работы с предметами. Во всех более менее приличных скриптиках на кач или квестики есть отдельные кусочки скрипта или подпрограмки для работы с магазинами и банками . Дело в том что при выполнении квестов происходит переполнение инвентаря а на каче будет перегруз если вовремя не не продавать ненужное в магазин а нужное не сбрасывать в банк . Да и припасы типа СоЕ, банок можно покупать скриптиком , а не вручную.

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

Поэтому если вы напишите команду на покунку демонфангов так -

BUYITEM(Demon Fangs[ID=321],10)

то будет сбой ! Правильно для предметов что не складываются в стопку писать эти предметы в команде неколько раз , например так -

BUYITEM(Demon Fangs[ID=321],1;Demon Fangs[ID=321],1)

А вот для предметов что складываются в стопку пишем уже количество , например -

BUYITEM(Soul Ore[ID=1785],33000

Количество предметов в команде ОБЯЗАТЕЛьНО надо писать (за редкими исключениями) когда вы покупаете или берете предмет из банка ! А вот когда продаем или ложим в банк предметы то лично я вместо количества пишу * в командах или вообще не пишу количество , можно так делать. . В этом случае предмет не складываемый в стопку продастся/положится в банк в количестве 1 штуки , а складываемые в стопку предметы продадутся/положатся все что есть в инвентаре .

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

Скрипт продать предметы -

Код:
LABEL(metka101)

NPCDLG(Mion[ID=7519])  
DELAY(2000)
DLGSEL(Sell)
DELAY(2000)

ITEMCOUNT(Leather Shoes[ID=37],>,0)
{
SELLITEM(Leather Shoes[ID=37];)
DELAY(500)
JMP(metka101)
}

ITEMCOUNT(Recipe: Forest Bow[ID=1794],>,0)
{
SELLITEM(Recipe: Forest Bow[ID=1794];)
DELAY(500)
JMP(metka101)
}

ITEMCOUNT(Recipe: Leather Helmet[ID=1798],>,0)
{
SELLITEM(Recipe: Leather Helmet[ID=1798];)
DELAY(500)
JMP(metka101)
}

ITEMCOUNT(Recipe: Piece Bone Breastplate[ID=1800],>,0)
{
SELLITEM(Recipe: Piece Bone Breastplate[ID=1800];)
DELAY(500)
JMP(metka101)
}

ITEMCOUNT(Necklace of Anguish Chain[ID=1896],>,0)
{
SELLITEM(Necklace of Anguish Chain[ID=1896];)
DELAY(500)
JMP(metka101)
}

ITEMCOUNT(Leather Shoes Texture[ID=1921],>,0)
{
SELLITEM(Leather Shoes Texture[ID=1921];)
DELAY(500)
JMP(metka101)
}

ITEMCOUNT(Leather Stocking Pattern[ID=1923],>,0)
{
SELLITEM(Leather Stocking Pattern[ID=1923];)
DELAY(500)
JMP(metka101)
}

ITEMCOUNT(Leather Gloves Lining[ID=1925],>,0)
{
SELLITEM(Leather Gloves Lining[ID=1925];)
DELAY(500)
JMP(metka101)
}

ITEMCOUNT(Dirk Blade[ID=2009],>,0)
{
SELLITEM(Dirk Blade[ID=2009];)
DELAY(500)
JMP(metka101)
}

// Recipe: Greater Soulshot (D) Compressed Package (100%)[ID=5268]
ITEMCOUNT([ID=5268],>,0)
{
SELLITEM([ID=5268];)
DELAY(500)
JMP(metka101)
}

MSG(vse)
DELAY(500)
EXIT()
Обратили внимание как записана команда на рецепт сосок ?

Дело в том что если в названии предмета есть скобки , например (100%) то такое название в команде писать нельзя - произойдет сбой . Вполне можно написать только один ИД премета и все ;-)

Вот скрипт положить предметы в банк

Код:
LABEL(metka201)

NPCDLG(Airy[ID=7522]) 
DELAY(2000)
DLGSEL(Deposit Item (Private Warehouse))
DELAY(2000)

ITEMCOUNT(Stem[ID=1864],>,0)
{
SAVEITEM(Stem[ID=1864],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Varnish[ID=1865],>,0)
{
SAVEITEM(Varnish[ID=1865],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Suede[ID=1866],>,0)
{
SAVEITEM(Suede[ID=1866],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Animal Skin[ID=1867],>,0)
{
SAVEITEM(Animal Skin[ID=1867],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Thread[ID=1868],>,0)
{
SAVEITEM(Thread[ID=1868],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Iron Ore[ID=1869],>,0)
{
SAVEITEM(Iron Ore[ID=1869],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Coal[ID=1870],>,0)
{
SAVEITEM(Coal[ID=1870],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Charcoal[ID=1871],>,0)
{
SAVEITEM(Charcoal[ID=1871],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Animal Bone[ID=1872],>,0)
{
SAVEITEM(Animal Bone[ID=1872],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Silver Nugget[ID=1873],>,0)
{
SAVEITEM(Silver Nugget[ID=1873],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Oriharukon Ore[ID=1874],>,0)
{
SAVEITEM(Oriharukon Ore[ID=1874],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Stone of Purity[ID=1875],>,0)
{
SAVEITEM(Stone of Purity[ID=1875],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Mithril Ore[ID=1876],>,0)
{
SAVEITEM(Mithril Ore[ID=1876],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Adamantite Nugget[ID=1877],>,0)
{
SAVEITEM(Adamantite Nugget[ID=1877],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Braided Hemp[ID=1878],>,0)
{
SAVEITEM(Braided Hemp[ID=1878],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Cokes[ID=1879],>,0)
{
SAVEITEM(Cokes[ID=1879],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Steel[ID=1880],>,0)
{
SAVEITEM(Steel[ID=1880],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Coarse Bone Powder[ID=1881],>,0)
{
SAVEITEM(Coarse Bone Powder[ID=1881],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Leather[ID=1882],>,0)
{
SAVEITEM(Leather[ID=1882],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Cord[ID=1884],>,0)
{
SAVEITEM(Cord[ID=1884],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(High Grade Suede[ID=1885],>,0)
{
SAVEITEM(High Grade Suede[ID=1885],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Compound Braid[ID=1889],>,0)
{
SAVEITEM(Compound Braid[ID=1889],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Recipe: Steel[ID=2137],>,0)
{
SAVEITEM(Recipe: Steel[ID=2137],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Recipe: Coarse Bone Powder[ID=2138],>,0)
{
SAVEITEM(Recipe: Coarse Bone Powder[ID=2138],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Recipe: Varnish of Purity[ID=2142],>,0)
{
SAVEITEM(Recipe: Varnish of Purity[ID=2142],*;)
DELAY(2000)
JMP(metka201)
}

ITEMCOUNT(Recipe: Synthetic Cokes[ID=2143],>,0)
{
SAVEITEM(Recipe: Synthetic Cokes[ID=2143],*;)
DELAY(2000)
JMP(metka201)
}


MSG(vse)
DELAY(500)
EXIT()
А вот скрипт на покупку 10ти штук демонфангов , кто играет за дврфов так знает зачем они покупаются в больших количествах ))))

Код:
NPCDLG(Stanford[ID=7085])
DELAY(2000)
DLGSEL(Buy Mystics Equipment )
DELAY(2000)
BUYITEM(Demon Fangs[ID=321],1;Demon Fangs[ID=321],1;Demon Fangs[ID=321],1;Demon Fangs[ID=321],1;Demon Fangs[ID=321],1;Demon Fangs[ID=321],1;Demon Fangs[ID=321],1;Demon Fangs[ID=321],1;Demon Fangs[ID=321],1;Demon Fangs[ID=321],1;)
------------------------------------------------------------------

Последний раз редактировалось Idas; 24.06.2009 в 05:14..
Idas вне форума   Ответить с цитированием
10 пользователя(ей) сказали cпасибо:
Клерик (24.06.2009), alexggx (07.03.2011), AlterRoss (09.03.2011), berserk (24.06.2009), EparoH (17.12.2009), GudVin92 (01.03.2010), midav (16.11.2011), PaulGreatest (13.10.2010), sloug (13.07.2009)
Sponsored Links
Старый 23.06.2009, 20:40   #2
Idas
No Active
 
Регистрация: 23.06.2009
Сообщений: 7
Вы сказали Спасибо: 0
Поблагодарили: 21 раз(а) в 3 сообщениях
По умолчанию

Урок 9

Определение местонахождения чара . Скрипт на делевел

При написании больших скриптов возникает проблема как определить где чар находится . Дело в том что когда например вы используете СоЕ или ваш чар умирает и резается в городе то есть в каждом городе полтора-два десятка точек , где появляется ваш чар . Очень затруднительно а то и невозможно написать общую для всех этих точек команду MOVETO чтобы чар после возврата в город шел к гейткиперу или еще куда . Например в Адене несколько подобных точек находится на площади , а все остальные раскиданы по периметру города .

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

Вот в качестве примера мой скрипт для рифтов . В рифте есть прямоугольная зона отдыха куда возвращаютя чары после прохождения рита или после смерти в рифте . Смысл моего скрипта - постоянно проверяется чар в зоне отдыха или нет . Если чар ( пати лидер вместе с пати ) попал в зону отдыха то он там отдыхает какоето время , востанавливает ману , а потом снова отправляется в рифт .

вот скрипт

Код:
//-------------------------
//
// кач в рифте
//
//-------------------------

SET(FIGHTSTOP)
SET(DefPath,Clear)

LABEL(metka010)

MOVETO(-115180,-180095,-6781)
MOVETO(-115322,-181519,-6781)

NPCDLG(Rift Post Commander[ID=8492])
DELAY(2000)
DLGSEL("I want to go to the inner space of the rift.")
DELAY(2000)

SET(RANGETYPE,DEFPOS,-114800,-179950,-6770,50000)
SET(FIGHTSTART)

LABEL(metka020)

DELAY(2000)

PosInRange(-114800,-178700,-6770,600)
{
JMP(metka030)
}

PosInRange(-114800,-179600,-6770,600)
{
JMP(metka030)
}

PosInRange(-114800,-180500,-6770,600)
{
JMP(metka030)
}

PosInRange(-114800,-181400,-6770,600)
{
JMP(metka030)
}

JMP(metka020)

LABEL(metka030)

SET(FIGHTSTOP)

CharStatus(STAND,==,1)
{
ChangeWaitType(0)
DELAY(2000)     
}

DELAY(300000)

CharStatus(STAND,==,0)
{
ChangeWaitType(1)
DELAY(2000)     
}

DELAY(60000)

JMP(metka010)

//-----------------
Второй и наверное главный метод - это в нужном городе( зоне) определяем все точки в которых чар появляется после использования СоЕ или после возвращения изза смерти . Таких точек в каждом городе где-то десяток-полтора десятка . Лично я их определяю когда с помощью скрипта на делевел делевелю чаров .

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

Вначале пишем тек сказать основную часть скрипта

Код:
//---------------------------------------
//
// делевел в Гиране
//
//  последняя правка 17.03.2008
//
//----------------------------------------

CHARSTATUS(CHP,<=,0)
{
GOHOME()
DELAY(10000)
}

LABEL(delevel_metka005)

CHARSTATUS(LV,<=,40)
{
SAY(Delevel END Stopsript)
DELAY(1000)
EXIT()
}

CALL(mesto_giran)

CALL(ataka_nps_giran)

JMP(delevel_metka005)
Небольшие обьяснения как это все работает .

Вначале скрипта стоит проверка жив ли чар . Если он мертвый то происходит возврат в город с помощью команды GOHOME() .

Затем идет проверка уровня чара . Если уровень 40 или меньше , то скрипт прекращает работу . Если же уровень больше 40 то вначале выполняется подпрограмма определения места и переход на начальную точку - CALL(mesto_giran) , затем выполняется подпрограмма CALL(ataka_nps_giran) в которой чар бежит к гварду , бьет его и естественно умирает , теряя немного экспы при этом .

Вот подпрограмка атаки гварда

Код:
//-----------------------------------------
//
// подпрограмка атаки НПС
// бежим к воротам и бьем гварда
//
//----------------------------------------

LABEL(ataka_nps_giran)

MOVETO(83556,147893,-3431)
MOVETO(83907,147319,-3431)
MOVETO(83901,146891,-3431)
MOVETO(83909,141340,-3563)


LABEL(ataka_nps_giran_metka005)

NPCSEL(Belton[ID=7125])
FORCEATTACK(Belton)
DELAY(3000)

CHARSTATUS(CHP,<=,0)
{
GOHOME()
DELAY(10000)
RETURN()
}

JMP(ataka_nps_giran_metka005)

/-----------------------------------------
Ну здесь мне кажется все понятно , обьяснять нечего .

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

Вначале она очень короткая

Код:
//  и переход на начальную точку 
//  (83378,147999,-3400)
//
//-------------------------------------

LABEL(mesto_giran)

CHARSTATUS(CHP,<=,0)
{
SET(FIGHTSTOP)
GOHOME()
DELAY(10000)
}

LABEL(mesto_giran_metka010)

CharStatus(STAND,==,0)
{
ChangeWaitType(1)
DELAY(3000)
JMP(mesto_giran_metka010)     
}

PosInRange(83378,147999,-3400,200)
{
JMP(mesto_giran_metka005)
}


SAY( nova to4ka !!! )
DELAY(1000)
EXIT()

LABEL(mesto_giran_metka005)

RETURN()
Собираю основную часть вместе с подпрограмками в один скрипт и запускаю . После смерти на гварде чар возвращается в город командой GOHOME() . Если точки на которую чар вернулся после смерти нету в скрипте то будет сообщение nova to4ka !!! и скрипт выключится . Добавляю эту точку в скрипт и запускаю скрипт снова . И потом опять все повторяется . Обычно чтобы определить так точки уходит гдето полчаса час .

Вот скрипт на делевел в Гиране где определены уже все точки возврата .

Код:
//--------------------------
//
// делевел в Гиране
//
//--------------------------


CHARSTATUS(CHP,<=,0)
{
GOHOME()
DELAY(10000)
}

LABEL(delevel_metka005)

CHARSTATUS(LV,<=,4)
{
SAY(Delevel END Stopsript)
DELAY(1000)
EXIT()
}

CALL(mesto_giran)

CALL(ataka_nps_giran)

JMP(delevel_metka005)


//--------------------------------------
//
//  подпрограмка определения места чара
//  и переход на начальную точку 
//  (83378,147999,-3400)
//
//  последняя правка 17.03.2008
//
//-------------------------------------

LABEL(mesto_giran)

CHARSTATUS(CHP,<=,0)
{
SET(FIGHTSTOP)
GOHOME()
DELAY(10000)
}

LABEL(mesto_giran_metka010)

CharStatus(STAND,==,0)
{
ChangeWaitType(1)
DELAY(3000)
JMP(mesto_giran_metka010)     
}

PosInRange(83378,147999,-3400,200)
{
JMP(mesto_giran_metka005)
}

PosInRange(82480,149087,-3464,200)
{
MOVETO(83274,148613,-3431)
MOVETO(83378,147999,-3400)
JMP(mesto_giran_metka005)
}

PosInRange(82272,147801,-3464,200)
{
MOVETO(83020,148018,-3495)
MOVETO(83378,147999,-3400)
JMP(mesto_giran_metka005)
}

PosInRange(83426,148835,-3400,200)
{
MOVETO(83378,147999,-3400)
JMP(mesto_giran_metka005)
}

PosInRange(81440,149119,-3464,200)
{
MOVETO(83274,148613,-3431)
MOVETO(83378,147999,-3400)
JMP(mesto_giran_metka005)
}

PosInRange(82496,148095,-3464,200)
{
MOVETO(83020,148018,-3495)
MOVETO(83378,147999,-3400)
JMP(mesto_giran_metka005)
}

PosInRange(83473,149223,-3400,200)
{
MOVETO(83378,147999,-3400)
JMP(mesto_giran_metka005)
}

PosInRange(81562,147782,-3464,200)
{
MOVETO(83020,148018,-3495)
MOVETO(83378,147999,-3400)
JMP(mesto_giran_metka005)
}

PosInRange(83415,148235,-3400,200)
{
MOVETO(83378,147999,-3400)
JMP(mesto_giran_metka005)
}

PosInRange(82292,149450,-3464,200)
{
MOVETO(83274,148613,-3431)
MOVETO(83378,147999,-3400)
JMP(mesto_giran_metka005)
}

PosInRange(81062,148144,-3464,200)
{
MOVETO(83020,148018,-3495)
MOVETO(83378,147999,-3400)
JMP(mesto_giran_metka005)
}

PosInRange(81376,148095,-3464,200)
{
MOVETO(83020,148018,-3495)
MOVETO(83378,147999,-3400)
JMP(mesto_giran_metka005)
}

PosInRange(83409,148578,-3400,200)
{
MOVETO(83378,147999,-3400)
JMP(mesto_giran_metka005)
}

PosInRange(81033,148883,-3464,200)
{
MOVETO(82051,149045,-3493)
MOVETO(83274,148613,-3431)
MOVETO(83378,147999,-3400)
JMP(mesto_giran_metka005)
}

PosInRange(81637,149427,-3464,200)
{
MOVETO(83274,148613,-3431)
MOVETO(83378,147999,-3400)
JMP(mesto_giran_metka005)
}

SAY( nova to4ka !!! )
DELAY(1000)
EXIT()

LABEL(mesto_giran_metka005)

RETURN()

//-----------------------------------------
//
// подпрограмка атаки НПС
// бежим к воротам и бьем гварда
//
//----------------------------------------

LABEL(ataka_nps_giran)

MOVETO(83556,147893,-3431)
MOVETO(83907,147319,-3431)
MOVETO(83901,146891,-3431)
MOVETO(83909,141340,-3563)


LABEL(ataka_nps_giran_metka005)

NPCSEL(Belton[ID=7125])
FORCEATTACK(Belton)
DELAY(3000)

CHARSTATUS(CHP,<=,0)
{
GOHOME()
DELAY(10000)
RETURN()
}

JMP(ataka_nps_giran_metka005)

/-----------------------------------------
Полученную подпрограмку CALL(mesto_giran) я уже использукю в других скриптах , где мне надо определять координаты чара после его возврата в город Гиран.

-----------------------------------------------------------------------------------------------------

Урок 10

Команды боя

Самыми основными командами тут есть команды SET(FIGHTSTART) - эта команда начинает бой и SET(FIGHTSTOP) - эта команда остатнавливает бой .

Большинство тех кто начинал писать себе скрипты так начинали с простейших скриптов на кач типа такого

Код:
//-----------------------------------
//
// пример скрипта на кач 
//
//------------------------------------

MOVETO(-82515,244817,-3752)
MOVETO(-82043,247735,-3684)
MOVETO(-82719,249870,-3691)
MOVETO(-83551,252110,-3719)

SET(FIGHTSTART)
тут чар с начальной точки перемещается в зону кача а затем включается бой командой SET(FIGHTSTART) . В опциях валкера/ингейма уже выставлены параметры поля боя и прочего , смысл скрипта - добежать до места кача и включить бой .

Я сама давно когда-то себе такие скриптики писала ))))

Вот давайте этот скрипт попробуем как-то улучшить .

Тот скрипт что вверху расчитан на то , что у вас уже сохранены опции с настройками в т.ч. и бой настроен . Можно и так делать , а можно опции хотя бы поля боя из скрипта задавать . Для этого есть много разных команд . Лично я рекомендую в первую очередь пользоваться такой на мой взгляд самой удобной командой - SET(RANGETYPE,DEFPOS,x,y,z,r) . Эта команда задает поле боя с центром в точке x,y,z и радиусом поля боя r .

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

Так для примера я добавлю все это в скрипт . Вот проверка жив ли чар или умер .

CHARSTATUS(CHP,<=,0)
{
SET(FIGHTSTOP)
GOHOME()
DELAY(10000)
EXIT()
}


если чар мертвый , то тогда идет выполнения команд что в фигурных скобках - чар вернется в деревню командой на возрождение GOHOME() а затем скрипт выключится

А проверка на наличие сосок будет такая

ITEMCOUNT(Soulshot: No Grade[ID=1835],<,14)
{
SET(FIGHTSTOP)
USEITEM(Scroll of Escape[ID=736])
DELAY(32000)
EXIT()
}


Если сосок мало , то бой останавливается а чар использует СоЕ и скрипт выключается

Вот уже что получилось

Код:
//-----------------------------------
//
// пример скрипта на кач 
//
//------------------------------------

MOVETO(-82515,244817,-3752)
MOVETO(-82043,247735,-3684)
MOVETO(-82719,249870,-3691)
MOVETO(-83551,252110,-3719)

SET(RANGETYPE,DEFPOS,-83551,252110,-3719,2500)

SET(FIGHTSTART)

LABEL(kombat)

CHARSTATUS(CHP,<=,0)
{
SET(FIGHTSTOP)
GOHOME()
DELAY(10000)
EXIT()
}

ITEMCOUNT(Soulshot: No Grade[ID=1835],<,14)
{
SET(FIGHTSTOP)
USEITEM(Scroll of Escape[ID=736])
DELAY(32000)
EXIT()
}

DELAY(3000)
JMP(kombat)
Этот скрипт работает как предыдущий , но уже есть отличия . Вначале чар перемещается на место кача и включается бой а вот затем скрипт зацикливается - идет раз в 3и секунды проверка жив ли чар и есть ли соски и если проверки срабатываюбт то чар возвращается с места кача в деревню .

Конечно этот скрипт на кач - не идеал , но вот с таких скриптов почти все начинают . Да , тут много чего нет что можно делать скриптиками . Можно сделать скриптом покупку припасов перед качем , разгрузку дропа после возвращения и еще много чего . В следующем уроке я выложу такой скрипт , но вот пока рекомендую потренироваться на таких простеньких скриптах на кач :-)


----------------------------------------------------------------------------------------------------------

Последний раз редактировалось Idas; 24.06.2009 в 05:22.. Причина: Добавлено сообщение
Idas вне форума   Ответить с цитированием
10 пользователя(ей) сказали cпасибо:
Клерик (24.06.2009), AlterRoss (09.03.2011), EparoH (17.12.2009), GudVin92 (01.03.2010), kaimir (16.12.2009), Kashim (27.12.2010), m1nus (01.07.2009), midav (16.11.2011), vs23 (27.02.2010), ZorDen (21.01.2010)
Старый 26.06.2009, 15:44   #3
Makc23
Member of L2 Community
 
Аватар для Makc23
 
Регистрация: 19.02.2009
Сообщений: 126
Вы сказали Спасибо: 2
Поблагодарили: 45 раз(а) в 32 сообщениях
По умолчанию

во общем баян
все тоже самое что и тут, даже автор тот же
так что, КЛЕРИК, спс говорить и ставить (Idas) незачто
Makc23 вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Клерик (26.06.2009)
Старый 26.06.2009, 18:54   #4
Клерик
 
Аватар для Клерик
 
Регистрация: 10.04.2008
Сообщений: 665
Вы сказали Спасибо: 262
Поблагодарили: 209 раз(а) в 107 сообщениях
По умолчанию

другая тема удалена, большее читабельно именно тут, так что спасибо я не зря поставил
__________________
:
Не спрашивайте,работает или нет - ПРОВЕРЯЙТЕ !
Не спрашивайте,спалят или нет - ДУМАЙТЕ !
Не пишите "спасибо" - ТЫКАЙТЕ или НИЧЕГО НЕ ПИШИТЕ !
За сообщения типа "asddfdfdfdf" - сразу ПЕРМАНЕНТ !
Клерик вне форума   Ответить с цитированием
Старый 01.07.2009, 21:17   #5
GoodW1n
No Active
 
Регистрация: 05.05.2009
Сообщений: 16
Вы сказали Спасибо: 0
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию

спс всё доступно обьяснено
GoodW1n вне форума   Ответить с цитированием
Старый 03.07.2009, 04:45   #6
Sequtan
No Active
 
Регистрация: 03.07.2009
Сообщений: 2
Вы сказали Спасибо: 0
Поблагодарили: 1 раз в 1 сообщении
По умолчанию

Никак не пойму почему разработчики не постараются реализовать ПРОВЕРКУ в ПРОВЕРКЕ, приходится изворачиватся чтобы это реализовать, из-за чего скрипт становится менее читабельным. Сколько лет уже развивается L2Wlaker, а скриптовой движок никаких серьезных изменений не претерпивает, хотя на мой взгляд его развитие очень даже нужно. Хотя бы ф-цию rand() ввели бы, чтобы я мог сделать скрипт, который не только по одним и тем же точкам бегает а со смещением +/- от указанной координаты.
Sequtan вне форума   Ответить с цитированием
Старый 03.07.2009, 13:01   #7
GoodW1n
No Active
 
Регистрация: 05.05.2009
Сообщений: 16
Вы сказали Спасибо: 0
Поблагодарили: 2 раз(а) в 2 сообщениях
По умолчанию

Да и в принципе можно было бы в принципе упростить процесс скриптования
GoodW1n вне форума   Ответить с цитированием
Старый 07.07.2009, 09:43   #8
Cptn
No Active
 
Регистрация: 07.07.2009
Сообщений: 11
Вы сказали Спасибо: 1
Поблагодарили: 1 раз в 1 сообщении
По умолчанию

Цитата:
Сообщение от GoodW1n Посмотреть сообщение
Да и в принципе можно было бы в принципе упростить процесс скриптования
упростить это как? зашить в walker готовые подпрограммы, сделать интерфейс с выставлением галочек и путем выставления галочек подбирать последовательность подпрограмм? мечты... мечты
Cptn вне форума   Ответить с цитированием
Старый 07.07.2009, 17:37   #9
arman86
No Active
 
Регистрация: 07.07.2009
Сообщений: 7
Вы сказали Спасибо: 1
Поблагодарили: 1 раз в 1 сообщении
По умолчанию

Вот у меня только вопрос возникает. Когда мы обращаемся к предметам, объектам, а их названия на кирилице. Первый вопрос: понимает ли Walker все эти названия на русском? Второй вопрос: существует ли, допустим, на том же руоффе альтернативные латинские названия? Всё таки порой пишешь скрипты по привычке на латинице.
arman86 вне форума   Ответить с цитированием
Старый 13.07.2009, 09:10   #10
sloug
No Active
 
Регистрация: 13.07.2009
Сообщений: 5
Вы сказали Спасибо: 1
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию

Отличнейший мануал. Огромное спасибо.
Написал скрипт на рыбалку, а он не выполняется и просто мне в приват весь его пишет. В Чем может быть проблема ?
tooltip: no ins
sloug вне форума   Ответить с цитированием
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход




Powered by vBulletin® Version 3.7.5
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot
Advertisement System V2.5 By   Branden
L2-Community ©2008-2015


Еще можно прочесть: