Десять уроков скриптинга (урок 11)

Materials, references, tutorials

Moderators: Murderator+, Murderator

Post Reply
Mihail
Expert!
Posts: 548
Joined: 2005-05-20 20:30:10
Contact:

Десять уроков скриптинга (урок 11)

Post by Mihail »

Работа с текстом в инжекте.
Заранее хочу извиниться перед читателями, за то, что не умею красиво оформлять код.

Итак, что же есть в инжекте для работы с текстом?

Команды
1. Len([text]) - длина строки
Пример использования:

Code: Select all

sub main()
var text='hello wolrd'
uo.print('length: ' + str( len(text) ) ) ; не забываем, что len возвращает число поэтому используем преобразовывание число-текст (str)
end sub

Скрипт выдаст нам фразу "length: 11"


2. LTrim([text]) - убрать пробелы слева
Пример использования:

Code: Select all

sub main()
var text='       hello wolrd'
uo.print(LTrim(text))
end sub

Скрипт выдаст нам фразу "hello world"

3. RTrim([text]) - убрать пробелы справа
Пример использования:

Code: Select all

sub main()
var text='hello wolrd     '
uo.print(LTrim(text))
end sub

Скрипт выдаст нам фразу "hello world"

4. Trim([text]) - убрать пробелы слева и справа.
Пример использования вы, я надеюсь, уже поняли, поэтому скажу лишь, что из фразы

Code: Select all

'  hello wold ' получим "hello world"


5. Left([text],numb) - ([строка], число символов), оставляет заданное количество символов от строки (с лева на право)
Пример использования:

Code: Select all

sub main()
var text='hello wolrd - i say!'
uo.print(Left(text,11))
end sub

Скрипт выдаст нам фразу "hello world"

6 Right([text],numb) - ([строка], число символов), оставляет заданное количество символов от строки (с права на лево)
Пример использования:

Code: Select all

sub main()
var text='i say: hello wolrd'
uo.print(Right(text,11))
end sub

Скрипт выдаст нам фразу "hello world"

7. Mid([text],numb,numb) - ([строка],позиция,число символов), оставляет заданное количество символов от строки (с лева на право - начиная с заданной позиции)
Пример использования:

Code: Select all

sub main()
var text='i say: hello wolrd - it sounds great'
uo.print(Mid(text,7,11))
end sub

Скрипт выдаст нам фразу "hello world"

Вобщем-то можно было бы обойтись и без Mid, но тогда пришлось бы делать очень длинные строчки с использованием Righ и Left - сами представьте, чтобы из фразы 'i say: hello wolrd - it sounds great' получить любимую фразу "hello world", нужно взять левые 11 сиволов от правых 29, иными словами это выглядело бы вот так:

Code: Select all

Left(Right(text,29),11)
так что настоятельно рекоммендую запомнить вам команду Mid (от англ. middle - середина), чтобы избежать лишней головной боли :)
Вот пожалуй и все, больше команд для работы с текстом в инжекте нет.. Конечно есть еще команды типа

Code: Select all

Str(numb) (число в текст), Val([text]) (текст (0-9) в число), IsString([text] / numb) - (текст ли перед нами?), IsNumber([text] / numb) - (число ли перед нами?)
но о них вы читале ранее.

Скрипты
Итак, со списком доступных команд мы ознакомились, примеры использования тоже поняли, остается извечный вопрос - зачем это надо? На этот вопрос каждый должен сам для себя ответить.. к примеру я использую это для удобной настройки скриптов (об этом далее), так же можно использовать это для выделения нужной информации из сроки и т.д.

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

Задача: определить сколько в руне зарядов и вывести полученную информацию на дисплей.
-
В подавляющем большинстве текстовых задач используется принципе перебора строки (с лева на право или с права на лево - это уж от поставленной задачи зависит) по 1 символу.. так поступим и здесь.
Решение:

Code: Select all

sub main()
uo.findtype('0x1F14',-1,2) ;type of rune
if uo.findcount() then
uo.click('finditem')
wait(100) ; тут лучше бы использовать checklag() (см. поиск)
uo.print('charges: ' + onlynumbers( uo.getname('finditem') ) ) ; будем надеиться что вы это проходили :)
end if
end sub


sub onlynumbers(string)
var i, j
var text=''
for i=0 to len(string) ; вот начинается этот самый перебор строки по 1 символу
for j=0 to 9 ; используется для "если символ (str) от 0 до 9, то.."
if mid(string,i,1)==str(j) then ; если текущий символ в строке равен (преобразованному в текст) числу от 0 до 9, то...
text = text + mid(string,i,1) ; ...то записываем его в переменную которая потом будет  передана в исходный скрипт
end if
next
next
return text
end sub

Может это был не самый примитивный пример, но если попытаться разобраться - ничего сложного.

А если у нас разные типы предметов (в данном случае рун) и нужно определять заряды только у определенного типа\цвета\названия? Чтобы не городить огромные скрипты проще сделать массив с заданными параметрами а уж скрипт сам будет воспроизводить с ним нужные вам действия..
Дабы не перегружать ваш и без того измученный нашими уроками моск :), пока ограничимся только типа и цветами.

Задача: Определить количество зарядов у рунразных типов но определенных цветов.
Решение:

Code: Select all

sub main()
var i
Dim a[3]

#a[0]='[тип] [цвет] [отображаемое название]'
a[0]='0x1F12 0x0002 руны типа1'
a[1]='0x1F13 0x0001 руны типа2'
a[2]='0x1F14 0x0000 руны типа3'

for i=0 to 2
uo.findtype( Left(a[i],6), Mid(a[i],7,6), 'backpack' ) ; ищем по типу и цвету из массива
if uo.findcount() then
uo.click('finditem')
wait(100)
uo.print(Trim ( Right(a[i], len(a[i])-13) )+' charges: ' + onlynumbers ( uo.getname('finditem') ) )
end if
next
end sub


sub onlynumbers(string) ; используем все ту же функцию из предыдущего скрипта
var i, j
var text=''
for i=0 to len(string)
for j=0 to 9
if mid(string,i,1)==str(j) then
text = text + mid(string,i,1)
end if
next
next
return text
end sub

Скрипт выдаст нам фразы типа: "руны типа1 charges: 99"

Может быть когда в массиве 3 предмета это не так существенно.. а когда 10...?

Вот вам самостоятельная работа - попробуйте написать к примеру лог выкопанной руды для мининга используя массив вида:

Code: Select all

#a[0]='[color] [name]'
a[0]='0x0000 Iron Ore'
a[1]='0x0010 Cooper Ore'
...


Не получается? Что ж - если не получается дам подсказку - в цвете у предмета всего 6 символов (+ 1 пробел перед началом названия руды - в данном примере) итого получаем что нам нужно:

Code: Select all

uo.findtype('тип руды',Left(a[i],6),'backack')
...
uo.print(Right(a[i], len(a[i])-7 )+': '+ uo.getquantity('finditem') ) ; название определяется так: берем все что справа за исключением длины [color] слева (6 символов + 1 символ в качестве пробела).

Скрипт выдаст: "Iron Ore: 1230"


-
Вот пожалуй основные приемы при работе с текстом в инжекте.. Урок наш подходит к концу и напоследок я хотел бы сказать еще пару полезных вещей:

1. строку можно читать и задом-наперед используя шаг -1
Пример:

Code: Select all

for i=Len(string) to 0 step -1


2. В инжекте нет функции "удалить все пробелы из строки" поэтому можете использовать эту:

Code: Select all

sub delsps(string)
#Mihail
var i, text=''
for i=0 to len(string)
if not mid(string,i,1)==' ' then
text=text+mid(string,i,1)
end if
next
return text
end sub

Пример использования писать не буду - теперь уже сами разберетесь :)
DerMeister =)
Expert!
Posts: 1032
Joined: 2006-02-25 21:48:38

Post by DerMeister =) »

Красота! Только ты забыл написать про то, что можно обращатся к строке как к массиву.

Хммм, да ты про это похоже не знаешь ;)

Code: Select all

sub delsps(string) 
#Mihail
var i, text=''
for i=0 to len(string)
if not mid(string,i,1)==' ' then
text=text+mid(string,i,1)
end if
next
return text
end sub

Можно так:

Code: Select all

sub delsps(string) 
#Mihail
var i, text=''
for i=0 to len(string)
if not string[i]==' ' then
text=text+string[i]
end if
next
return text
end sub
DerMeister сейчас на нейрале!
Scripts Writer
Posts: 2259
Joined: 2005-04-19 18:00:29
Location: Московская область
Contact:

Post by Scripts Writer »

Перенёс. Прилепил. На мой взгляд Зачёт.

Коротко и по делу.
I'm
Expert!
Posts: 1396
Joined: 2004-10-15 22:38:04
Location: Moscow City.
Contact:

Post by I'm »

Тема переименована в

Code: Select all

Десять уроков скриптинга (урок 11)
The End.
ADEPT_ABP
Posts: 223
Joined: 2006-05-12 08:03:45
Contact:

Post by ADEPT_ABP »

Как устроить проверку на "пробел"?
Суть:
905 silver ingot.
Надо только - silver(и можно ли сделать букву заглавной)?
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

Чем тебе пробел не символ?;)
откидывай известную часть (ingots, хотя надо посмотреть что там со множественыим числом)
А дальше ищешь пробел

Code: Select all

for var i = 0 to len(s)-1
if s[i] = " " then
...
endif
next


ПС У авторов выше проблемы с индексами в Mid, да и вообще%))
ADEPT_ABP
Posts: 223
Joined: 2006-05-12 08:03:45
Contact:

Post by ADEPT_ABP »

А я думал, -"Что за хрень? Выводит первый символ, на всю длинну имени(522 Shadow ingot -> 5555555555555555) :D
ADEPT_ABP
Posts: 223
Joined: 2006-05-12 08:03:45
Contact:

Post by ADEPT_ABP »

Парсит в строке 15.

Code: Select all

sub main()
var num, n, i, p
num = 0
uo.addobject('object')
while uo.targeting()
   wait(100)
wend
uo.resend()
wait(1000)
n = uo.getname('object')      ;Получить имя
uo.print(n)
n = Left(n,(len(n)-6))         ;Убрать из имени 6 символов справа(' ingot')
uo.print(n)
for i = 1 to len(n)         ;  line 15: parse error
if n[i] = " " then
 goto go
endif
uo.print(n)
num = num + 1
next
go:
n = Right(n,(len(n)-(num+1))) ;имя, минус символы до пробела, плюс сам пробел.
uo.print(n)
end sub

Где ошибка?
ADEPT_ABP
Posts: 223
Joined: 2006-05-12 08:03:45
Contact:

Post by ADEPT_ABP »

Кажись дошло.

Code: Select all

if n[i] = " " then

Надо сравнить, а не назначить. :D

Code: Select all

if n[i] == " " then

Пойду тестить. :wink:
ADEPT_ABP
Posts: 223
Joined: 2006-05-12 08:03:45
Contact:

Post by ADEPT_ABP »

Вот и всё. Только ,resend не всегда нормально работает.

Code: Select all

sub main()
var num, n, i, p
num = 0
uo.addobject('object')
while uo.targeting()
   wait(100)
wend
uo.resend()
wait(1000)
uo.resend()
n = uo.getname('object')      ;Получить имя
uo.print(n)
wait(200)
n = Left(n,(len(n)-6))         ;Убрать из имени 6 символов справа(' ingot')
uo.print(n)
wait(200)
for i = 1 to len(n)
if n[i] == " " then
n = Right(n,(len(n)-(num+2))) ;имя, минус символы до пробела, плюс сам пробел.
endif
uo.print(n)
wait(200)
num = num + 1
next
uo.print(n)
end sub
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Post by Grin »

Скрипт - "отвал башки" :wink:
ADEPT_ABP
Posts: 223
Joined: 2006-05-12 08:03:45
Contact:

Post by ADEPT_ABP »

Это ещё не всё. Как только добьюсь замены первого символа на заглавную букву. Будет нормальный скрипт на Blacksmithing(в соответствующей теме.). Он(скрипт) и сейчас там обитает, но недоделанный. :D
Играю на drw.ru
Использую инжект 505.18 VeNd0r
Начинающий скриптер.
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

А зачем столько ресендов?.. Я чтобы получить имя всегда делал клац и чеклаг - работало на ура...
YokoInjection CodeSweeper
Function not found?
Possession of mathematics at the level of art - a gift that is only available for election.
Sorry for my clumsy English.
Telegram: @tatikom
ADEPT_ABP
Posts: 223
Joined: 2006-05-12 08:03:45
Contact:

Post by ADEPT_ABP »

Я ж начинающий, тем более, пока делал скрипт, так замусорил голову, что перестал соображать(даже то, что было понятно, стало тайной за семью печатями :mrgreen: ). А сегодня, как проснулся, всё ясно и понятно. За, что вам, - Destruction и Grin, БАЛШОЕ СПАСИБА.
Собственно скрипт тут
Играю на drw.ru
Использую инжект 505.18 VeNd0r
Начинающий скриптер.
Post Reply