Yoko

All sides of Injection
It is currently 2024-10-05 20:00:02

All times are UTC+02:00




Post new topic  Reply to topic  [ 14 posts ] 
Author Message
PostPosted: 2006-12-22 22:16:15 
Offline
Expert!
User avatar

Joined: 2005-05-20 20:30:10
Posts: 548
Работа с текстом в инжекте.
Заранее хочу извиниться перед читателями, за то, что не умею красиво оформлять код.

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

Команды
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

Пример использования писать не буду - теперь уже сами разберетесь :)

_________________
"плагины" для инжекта


Top
   
 Post subject:
PostPosted: 2006-12-23 09:56:15 
Offline
Expert!
User avatar

Joined: 2006-02-25 21:48:38
Posts: 1032
Красота! Только ты забыл написать про то, что можно обращатся к строке как к массиву.

Хммм, да ты про это похоже не знаешь ;)
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

Можно так:
Code:
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 сейчас на нейрале!


Top
   
 Post subject:
PostPosted: 2006-12-23 12:31:44 
Offline

Joined: 2005-04-19 18:00:29
Posts: 2259
Location: Московская область
Перенёс. Прилепил. На мой взгляд Зачёт.

Коротко и по делу.


Top
   
 Post subject:
PostPosted: 2006-12-27 18:01:01 
Offline
Expert!
User avatar

Joined: 2004-10-15 22:38:04
Posts: 1396
Location: Moscow City.
Тема переименована в
Code:
Десять уроков скриптинга (урок 11)

_________________
The End.


Top
   
 Post subject:
PostPosted: 2007-07-21 20:15:18 
Offline
User avatar

Joined: 2006-05-12 08:03:45
Posts: 223
Как устроить проверку на "пробел"?
Суть:
905 silver ingot.
Надо только - silver(и можно ли сделать букву заглавной)?


Top
   
 Post subject:
PostPosted: 2007-07-21 21:25:39 
Offline
Expert!
User avatar

Joined: 2005-05-04 14:05:19
Posts: 2580
Location: Москва
Чем тебе пробел не символ?;)
откидывай известную часть (ingots, хотя надо посмотреть что там со множественыим числом)
А дальше ищешь пробел
Code:
for var i = 0 to len(s)-1
if s[i] = " " then
...
endif
next


ПС У авторов выше проблемы с индексами в Mid, да и вообще%))


Top
   
 Post subject:
PostPosted: 2007-07-22 07:24:27 
Offline
User avatar

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


Top
   
 Post subject:
PostPosted: 2007-07-22 07:57:04 
Offline
User avatar

Joined: 2006-05-12 08:03:45
Posts: 223
Парсит в строке 15.
Code:
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

Где ошибка?


Top
   
 Post subject:
PostPosted: 2007-07-22 08:19:26 
Offline
User avatar

Joined: 2006-05-12 08:03:45
Posts: 223
Кажись дошло.
Code:
if n[i] = " " then

Надо сравнить, а не назначить. :D
Code:
if n[i] == " " then

Пойду тестить. :wink:


Top
   
 Post subject:
PostPosted: 2007-07-22 08:42:15 
Offline
User avatar

Joined: 2006-05-12 08:03:45
Posts: 223
Вот и всё. Только ,resend не всегда нормально работает.
Code:
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


Top
   
 Post subject:
PostPosted: 2007-07-22 12:35:43 
Offline
Expert!
User avatar

Joined: 2005-05-04 14:05:19
Posts: 2580
Location: Москва
Скрипт - "отвал башки" :wink:


Top
   
 Post subject:
PostPosted: 2007-07-22 14:56:07 
Offline
User avatar

Joined: 2006-05-12 08:03:45
Posts: 223
Это ещё не всё. Как только добьюсь замены первого символа на заглавную букву. Будет нормальный скрипт на Blacksmithing(в соответствующей теме.). Он(скрипт) и сейчас там обитает, но недоделанный. :D

_________________
Играю на drw.ru
Использую инжект 505.18 VeNd0r
Начинающий скриптер.


Top
   
 Post subject:
PostPosted: 2007-07-23 00:54:17 
Offline
Junior Expert
User avatar

Joined: 2004-06-24 22:08:56
Posts: 3220
А зачем столько ресендов?.. Я чтобы получить имя всегда делал клац и чеклаг - работало на ура...

_________________
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.
Skype: d119060


Top
   
 Post subject:
PostPosted: 2007-07-23 16:32:30 
Offline
User avatar

Joined: 2006-05-12 08:03:45
Posts: 223
Я ж начинающий, тем более, пока делал скрипт, так замусорил голову, что перестал соображать(даже то, что было понятно, стало тайной за семью печатями :mrgreen: ). А сегодня, как проснулся, всё ясно и понятно. За, что вам, - Destruction и Grin, БАЛШОЕ СПАСИБА.
Собственно скрипт тут

_________________
Играю на drw.ru

Использую инжект 505.18 VeNd0r

Начинающий скриптер.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 14 posts ] 

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited