Урок 1. Самая важная команда, синтаксис и "Hello, shard!"
Итак, вы стали счастливым обладателем инжекта, вам удалось его настроить (или для вас это сделал кто-то другой
А начнем мы с самой важной команды скриптов. Команды, без которой не обходится, фактически, ни один скрипт. Команды, которую вы можете использовать только в скриптах - большинство команд инжекта имеют как форму для скриптов, так и "консольную" форму, то есть вы их можете писать прямо в клиенте и запускать. Многие мелкие скрипты, кстати, именно так и устроены. При бинде их на клавишу просто перечисляются команды инжекта и вуаля - скрипт готов. Но я отвлекся. Так вот, эту команду в консоли вы написать не можете. Как некоторые из вас уже наверно догадались, это команда Wait() - пауза.
Wait() - ждать заданное количество миллисекунд.
Внутри скобок этой команды надо указать ей параметр - сколько миллисекунд ждать. 1 секунда - это 1000 миллисекунд. Поэтому Wait(1000) - это ждать 1 секунду. В конце этого урока я приведу пример как не надо писать скрипты. А именно - скрипт который совершенно надежно подвешивает компьютер, на котором он запущен. И ошибка того скрипта в том, что в нем нету команды wait в нужном месте. Причем с самым маленьким параметром времени. Хотя бы wait(50) - и скрипт уже не подвесит вашу систему.
Паузы очень важны в ваших скриптах. Во-первых, нужно дожидаться, пока игра совершит какое-либо действие. Во-вторых, надо дожидаться появления какого-либо сообщения. В-третьих, надо дожидаться появления какого-либо чара или животного - в основном все скрипты состоят из пауз. Причем в начале, пока вы неопытны, вы будете использовать в основном фиксированные паузы, типа wait(4000) - ждать 4 секунды (именно столько вам надо ждать на Цитадели, чтобы сработал скил Хайдинг), в дальнейшем вы быстрее всего перейдете на использование динамических пауз - то есть пауз, длина которых заранее не определена, это просто паузы пока не совершится какое-либо событие. Но в основе этих динамических пауз все равно вы найдете команду wait.
Вот теперь пора познакомиться с синтаксисом скриптов инжекта.
Для начала, несколько слов о терминологии. Скрипт - это программа. Написанная на специальном языке. Основой для этого языка стал язык программирования Basic, причем в самой простой своей форме. Еще вам будут постоянно встречаться такие понятия, как функции и процедуры. По определению, функция получает какие-то параметры, обрабатывает их и возвращает какое-то значение. Процедура от функции отличается тем, что ничего не возвращает. На самом деле, разницы между процедурами и функциями никакой нету. Это те же самые скрипты. Или программы, как хотите. Зачастую функция, которая, по идее, что-то возвращает, будет вами использоваться как процедура - ну не нужен нам этот результат. А из процедуры можно вернуть результат "непрямым" способом. Да и параметры не обязательны. Головной скрипт (главный) - это тоже, фактически, процедура. Поэтому, если путаетесь - плюньте. Даже опытные программисты постоянно в этих терминах путаются и называют одно другим. Неважно. Главное - знать что все это отдельные программы.
Любой скрипт (программа) на языке скриптов инжекта всегда начинается с команды sub и заканчивается командой endsub. Скрипты пишутся в текстовые файлы, в одном файле может быть очень много скриптов (я даже затрудняюсь сказать сколько, у меня есть скрипта на 3000 строк кода, там этих функций и процедур под сотню, и ничего, все нормально живет в одном файле). Итак, любой скрипт должен выглядеть так:
Code: Select all
sub MyScript()
……….
endsubПосле команды sub через пробел пишется имя этого скрипта. После имени указываются круглые скобки, в которые могут быть помещены 1 или несколько имен переменных для параметров скрипта. Если это функция или процедура.
Но к параметрам мы еще вернемся. А пока давайте напишем самый первый скрипт, используя те знания, что уже получили:
Code: Select all
sub MyWait()
wait(3000)
endsubUO.Print() – вывести информационное сообщение в игре
Внутри скобок этой команды надо указать сообщение в кавычках и вы получите в игре это сообщение. Его видите только вы и на сервер оно не направляется. Например UO.Print( 'Privet' ) – выведет сообщение 'Privet'. Кавычки вы можете использовать как одинарные (апостроф), так и двойные - главное чтобы они были одинаковые в начале и в конце выражения. Давайте вставим такую команду в наш скрипт.
Code: Select all
sub MyMessage()
UO.Print( "Hello, shard!" )
wait(3000)
endsubCode: Select all
sub MyMessage()
UO.Print( "Hello, shard!" )
wait(3000)
UO.Print( "I go!" )
endsubВсе было бы хорошо, но вот только ваше приветствие кроме вас никто и не увидит... Лучше бы было, если бы эти фразы произносил ваш чар, тогда все кто рядом будут их "слышать". Нет проблем:
UO.Say() - произнести фразу чаром в игре
Так что если мы заменим в нашей программе UO.Print на UO.Say - получится то, что надо.
Code: Select all
sub MyMessage()
UO.Say( "Hello, shard!" )
wait(3000)
UO.Say( "I go!" )
endsubПродолжим рассматривать синтаксис скриптов. Теперь поговорим о переменных. Переменная - это какое-то имя, заданное вами, которому в скрипте вы можете присваивать различные значения. Перед использованием переменную нужно создать. В более сложных языках программирования переменные обычно надо задавать указывая их тип: числовые, строковые и т. д. В инжекте вам это не требуется. Главное - ее создать. Создать ее можно перед самим использованием, но хорошей привычкой будет создавать все нужные вам переменные (пока не станете опытным скриптописателем) в начале скрипта. Для этого используется оператор VAR:
VAR myvar1, myvar2, myvar3 ...
Имена myvar1 и т.д. - это просто пример имен. Имя может быть любым, главное чтобы оно состояло из английских букв и цифр и не имело пробелов. Дефисы тоже допустимы. Цифру в начало имени не ставим.
Значение переменной присваивается знаком равно (=). Это можно сделать отдельной строкой, а можно сделать в операторе VAR:
VAR i = 1, mymessage1 = 'Hello, Shard!', mymessage2 = "I go!"
Вот тут переменная i числовая, мы ей присвоили единицу, остальные две переменные строковые - им мы присвоили свои сообщения. Естественно, в скрипте мы можем присвоить переменной новое значение в любой момент. Для этого ее создавать снова не надо, достаточно в отдельной строке скрипта написать:
i = 2
И все. Давайте перепишем наш скрипт на приветствие через переменные:
Code: Select all
sub MyMessage()
VAR mymessage1 = 'Hello, Shard!', mymessage2 = "I go!"
UO.Say( mymessage1 )
wait(3000)
UO.Say( mymessage2 )
endsubВот теперь стоит вернуться к функциям и процедурам. Давайте посмотрим как нам их писать (возращаемые значения пока рассматривать не будем, так что речь идет о процедурах).
Code: Select all
sub MyMessage()
VAR mymessage1 = 'Hello, Shard!', mymessage2 = "I go!"
MySay( mymessage1 )
MySay( mymessage2 )
endsub
sub MySay( myparam )
UO.Say( myparam )
wait(1000)
endsubКстати, созданные вами переменные действуют только в пределах того скрипта (функции, процедуры), в которой вы их создали. В другом скрипте вы можете снова использовать эти же имена - это все равно будут другие переменные.
Вот с этим (все что выше) вам надо очень внимательно разорбраться. В дальнейшем я подобные вещи подробно расписывать не буду. Так что если хоть что-то осталось непонятно - перечитайте еще раз, попробуйте сами.
Теперь несколько слов о тех переменных, которые уже существуют в инжекте. Вы не можете использовать их имена, но вы можете использовать значения этих переменных просто указав в скрипте их имя. Перечислю основные:
UO.Life - текущее здоровье вашего чара
UO.Mana - текущее количество маны вашего чара
UO.Stamina - текущее количество стамины вашего чара
UO.STR - уровень силы вашего чара
UO.INT - уровень интеллекта вашего чара
UO.DEX - уровень ловкости вашего чара
UO.Weight - вес вашего чара
UO.Armor - текущий армор-класс вашего чара
UO.Gold - суммарное количество денег (бэкпак и банк) вашего чара
UO.BM - количество рега bloodmoss в паке у вашего чара
UO.BP - количество рега black pearl в паке у вашего чара
UO.GA - количество рега garlic в паке у вашего чара
UO.GS - количество рега ginseng в паке у вашего чара
UO.MR - количество рега mandrake root в паке у вашего чара
UO.NS - количество рега nightshade в паке у вашего чара
UO.SA - количество рега sulfurous ash в паке у вашего чара
UO.SS - количество рега spider's silk в паке у вашего чара
UO.VA - количество паган рега volcanic ash в паке у вашего чара
UO.EN - количество паган рега eyes of newt в паке у вашего чара
UO.WH - - количество паган рега wyrm's heart в паке у вашего чара
UO.FD - количество паган рега blackmoor в паке у вашего чара
UO.BR - количество паган рега fertile dirt в паке у вашего чара
UO.H - количество поушенов heal в паке у вашего чара
UO.C - количество поушенов cure в паке у вашего чара
UO.M - количество поушенов mana в паке у вашего чара
UO.L - количество поушенов refresh в паке у вашего чара
UO.B - количество бинтов в паке у вашего чара
UO.AR - количество стрел в паке у вашего чара
UO.BT - количество болтов в паке у вашего чара
Вы не можете изменять эти переменные, они автоматически изменяются в игре, но вы можете использовать их в своих скриптах. Не буду приводить примера, тут и так все ясно. Позже в примерах мы будем эти переменные активно использовать.
Теперь посмотрим как устроен скрипт. В скрипте каждая команда должна идти на отдельной строке, объединять несколько команд в одну строку нельзя. Если вам нужно просто выполнить несколько команд по очереди - это самый простейший вид скриптов, то вы пишете каждую команду в отдельную строку (именно так мы и делали в скрипте на приветствие) и все. Но такое требуется редко. Обычно в скриптах нужно проверять выполнение каких-нибудь условий, в зависимости от этого выполнять разные действия, повторять какой-то набор действий либо фиксированное количество раз, либо пока не выполнится определенное условие. Для этого нам потребуются условные операторы и циклы.
Простейший условный оператор - If. Выглядит он так:
Code: Select all
If условие Then
.........
EndifCode: Select all
If условие Then
...........
Else
...........
EndifCode: Select all
sub MyMessage()
VAR i = 1
VAR mymessage1 = 'Hello, Shard!', mymessage2 = "I go!"
If i == 1 Then
UO.Say( mymessage1 )
Else
UO.Say( mymessage2 )
Endif
endsubСледующим оператором, важным для скриптинга в инжекте является while.
Code: Select all
While условие
...
WendCode: Select all
sub MyMessage()
VAR i = 1
VAR mymessage1 = 'Hello, Shard!', mymessage2 = "I go!"
While i < 3
If i == 1 Then
UO.Say( mymessage1 )
Else
UO.Say( mymessage2 )
Endif
i = i + 1
Wend
endsubРазбирайтесь с этим примером столько раз, сколько потребуется чтобы все понять. Очень мало будет вам встречаться скриптов в которых нету операторов if, while и оператора repeat - аналогичного оператору while с некоторыми изменениями.
Code: Select all
repeat
....................
until условиеCode: Select all
while i < 3
wait( 1000)
wendCode: Select all
repeat
wait(1000)
until i > 2Вот мы и подбираемся к концу первого урока. Это далеко не все операторы языка скриптов инжекта, но пока нам хватит и их. Другие операторы мы рассмотрим позже. А счас, как и обещал в начале, привожу пример (у вас достаточно знаний чтобы этот скрипт понять) скрипта, как не надо писать скрипты
Code: Select all
sub MyScript()
While UO.Life > 0
If UO.Life < 70 Then
UO.Bandageself()
wait(2000)
Endif
Wend
endsubCode: Select all
sub MyScript()
While UO.Life > 0
If UO.Life < 70 Then
UO.Bandageself()
wait(2000)
Else
wait(50)
Endif
Wend
endsubНу и напоследок. Обратите внимание на то, как я привожу скрипты. А именно на отступы. Старайтесь сразу приучить себя использовать подобный стиль написания. Это облегчит понимание скриптов и вам, и тем другим, кто их будет смотреть. А чем легче читается скрипт, тем проще найти в нем ошибки.