Работа с текстом в инжекте.
Заранее хочу извиниться перед читателями, за то, что не умею красиво оформлять код.
Итак, что же есть в инжекте для работы с текстом?
Команды
1.
Len([text]) - длина строки
Пример использования:
Code:
sub main()
var text='hello wolrd'
uo.print('length: ' + str( len(text) ) ) ; не забываем, что len возвращает число поэтому используем преобразовывание число-текст (str)
end sub
Скрипт выдаст нам фразу "length: 11"
2.
LTrim([text]) - убрать пробелы слева
Пример использования:
Code:
sub main()
var text=' hello wolrd'
uo.print(LTrim(text))
end sub
Скрипт выдаст нам фразу "hello world"
3.
RTrim([text]) - убрать пробелы справа
Пример использования:
Code:
sub main()
var text='hello wolrd '
uo.print(LTrim(text))
end sub
Скрипт выдаст нам фразу "hello world"
4.
Trim([text]) - убрать пробелы слева и справа.
Пример использования вы, я надеюсь, уже поняли, поэтому скажу лишь, что из фразы
Code:
' hello wold ' получим "hello world"
5.
Left([text],numb) - ([строка], число символов), оставляет заданное количество символов от строки (с лева на право)
Пример использования:
Code:
sub main()
var text='hello wolrd - i say!'
uo.print(Left(text,11))
end sub
Скрипт выдаст нам фразу "hello world"
6
Right([text],numb) - ([строка], число символов), оставляет заданное количество символов от строки (с права на лево)
Пример использования:
Code:
sub main()
var text='i say: hello wolrd'
uo.print(Right(text,11))
end sub
Скрипт выдаст нам фразу "hello world"
7.
Mid([text],numb,numb) - ([строка],позиция,число символов), оставляет заданное количество символов от строки (с лева на право - начиная с заданной позиции)
Пример использования:
Code:
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:
Left(Right(text,29),11)
так что настоятельно рекоммендую запомнить вам команду Mid (от англ. middle - середина), чтобы избежать лишней головной боли
Вот пожалуй и все, больше команд для работы с текстом в инжекте нет.. Конечно есть еще команды типа
Code:
Str(numb) (число в текст), Val([text]) (текст (0-9) в число), IsString([text] / numb) - (текст ли перед нами?), IsNumber([text] / numb) - (число ли перед нами?)
но о них вы читале ранее.
СкриптыИтак, со списком доступных команд мы ознакомились, примеры использования тоже поняли, остается извечный вопрос - зачем это надо? На этот вопрос каждый должен сам для себя ответить.. к примеру я использую это для удобной настройки скриптов (об этом далее), так же можно использовать это для выделения нужной информации из сроки и т.д.
Сейчас мы рассмотрим простейшие примеры использования работы с текстом из журнала.
Задача: определить сколько в руне зарядов и вывести полученную информацию на дисплей.
-
В подавляющем большинстве текстовых задач используется принципе перебора строки (с лева на право или с права на лево - это уж от поставленной задачи зависит) по 1 символу.. так поступим и здесь.
Решение:Code:
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:
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:
#a[0]='[color] [name]'
a[0]='0x0000 Iron Ore'
a[1]='0x0010 Cooper Ore'
...
Не получается? Что ж - если не получается дам подсказку - в цвете у предмета всего 6 символов (+ 1 пробел перед началом названия руды - в данном примере) итого получаем что нам нужно:
Code:
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:
for i=Len(string) to 0 step -1
2. В инжекте нет функции "удалить все пробелы из строки" поэтому можете использовать эту:
Code:
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
Пример использования писать не буду - теперь уже сами разберетесь