Page 1 of 2

FindItem() - даёшь функцию!

Posted: 2006-04-15 22:48:21
by Destruction
Появилась хорошая идея - сделай функцию FindItem(), мы её вызываем, а она возвращает поочерёдно все найденные предметы последним FindType().

Зачем? А чтобы не игнорить - в скриптах на варку, просто незаменимая вещь!

Это лёгкий вариант, грамотный вариант - сделать, чтобы FindType() возвращал идентификатор поиска, который задавать функции FindItem(), чтобы та брала результаты нужного поиска.

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

PS: Впринципе, можно продолжать извращаться - но мне надоело, хотя я с ультимой и завязал.

Posted: 2006-04-15 22:50:32
by DerMeister =)
Кул... :)
8) 8) 8)
Меня услышали :)

Posted: 2006-04-15 22:52:14
by Destruction
Der wrote:Кул... :)
8) 8) 8)
Меня услышали :)

Хз, твоего топика в этом разделе не видел и тем более предложений, как решить данную проблему.

PS: Я недавно постил несколько функций для создания псевдо-массивов. Я думаю те функции + глобальные переменные = скриптовое решение проблемы. Ща попробую.

Posted: 2006-04-15 22:55:11
by DerMeister =)
Destruction wrote:Хз, твоего топика в этом разделе не видел и тем более предложений, как решить данную проблему.


Ну да, сорри, не на этом форуме постил :oops: :oops: :oops:

ВОт она: http://pinject.darkuo.ru/forum/viewtopic.php?t=9

Posted: 2006-04-15 23:02:07
by DerMeister =)
Destruction wrote:PS: Я недавно постил несколько функций для создания псевдо-массивов. Я думаю те функции + глобальные переменные = скриптовое решение проблемы. Ща попробую.


Это ты про тему "глобальных" массивов?

Пока что возникла только одна мысль: а что если одновременно будут запущены 2 скрипта... не получится ли так, что они будут конфликтовать и пытатся писать в одиндаковые глоб. переменные?

Posted: 2006-04-15 23:23:54
by Edred
Der wrote:а что если одновременно будут запущены 2 скрипта... не получится ли так, что они будут конфликтовать и пытатся писать в одиндаковые глоб. переменные?


Дык голова скриптописателю нужна не только чтобы в нее есть.

Posted: 2006-04-15 23:36:49
by Destruction
Edred wrote:
Der wrote:а что если одновременно будут запущены 2 скрипта... не получится ли так, что они будут конфликтовать и пытатся писать в одиндаковые глоб. переменные?


Дык голова скриптописателю нужна не только чтобы в нее есть.

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

Posted: 2006-04-15 23:37:36
by DerMeister =)
Edred wrote:
Der wrote:а что если одновременно будут запущены 2 скрипта... не получится ли так, что они будут конфликтовать и пытатся писать в одиндаковые глоб. переменные?


Дык голова скриптописателю нужна не только чтобы в нее есть.


Во, точняк... :) ...а я только про шапку думал :) тогда да, всё будит окк...
Кстати, вопрос у меня есть: а почему бы не сделать так чтобы массивы можно было до сабов определять а то неудобно как-то...

Posted: 2006-04-15 23:39:58
by Grin
Ну так делайте кто мешает?;)

Posted: 2006-04-15 23:42:54
by Destruction
Grin wrote:Ну так делайте кто мешает?;)

Так понимаешь - игнорить всё равно придёться.

Надо кое, что проверить.

Проверил. Игнорить придёться, и если вдруг в одно время будет вызвано сразу два поиска - то выдет дребедень. Шанс низкий - но есть.

Posted: 2006-04-15 23:50:00
by Grin
и дураку ясно что нужно игнорить;)
функция поиска останавлимвается на первом совпадении а анадо что бы было продолжение ;)
выход: калечить инжект;)

Posted: 2006-04-16 00:01:12
by DerMeister =)
Destruction wrote:Проверил. Игнорить придёться, и если вдруг в одно время будет вызвано сразу два поиска - то выдет дребедень. Шанс низкий - но есть.


Лучшеб шанс был нулевой, т.к. геммор связанный с использованием промежуточных перменных несравним с тем геммором который будет есль случится дребедень :(

Posted: 2006-04-16 00:03:23
by Destruction
Der wrote:
Destruction wrote:Проверил. Игнорить придёться, и если вдруг в одно время будет вызвано сразу два поиска - то выдет дребедень. Шанс низкий - но есть.


Лучшеб шанс был нулевой, т.к. геммор связанный с использованием промежуточных перменных несравним с тем геммором который будет есль случится дребедень :(

Поверь, шана достаточно мал, что я врубил хоумсфер и отлаживаю скрипт. 8)

Posted: 2006-04-16 00:06:00
by Grin
шанс мал?;)) Да стой скоростью с которой файндтайп обрабатывает всего 50 элементов%)
Шанс пересечься 0 если функция вызывается в одном потоке или хотябы последовательно... сделать синхронизацию как нех делать%)

Posted: 2006-04-16 00:10:22
by Destruction
Grin wrote:шанс мал?;)) Да стой скоростью с которой файндтайп обрабатывает всего 50 элементов%)
Шанс пересечься 0 если функция вызывается в одном потоке или хотябы последовательно... сделать синхронизацию как нех делать%)

Да мы и так синхронизируем -)

я уже FindType() написал, остались мелочи :-)

Posted: 2006-04-16 00:46:45
by Destruction
Собственно то, что получилось:

Описание:
number FindType(string)
Передаётся один параметр - в нём всё указываем, кроме findtype (как при обычном uo.exec('findtype')).
Возвращает идентификатор произведённого поиска.

number FindCount(number)
Передаём один параметр - идентификатор нужного поиска.
Получаем количество найденных элементов.

string FindItem(number,number)
Передаём два параметра: 1 - номер найденного предмета, 2 - идентификатор поиска.
Получаем ID найденного предмета.

1. В начало скрипта пишем такое:

Code: Select all

var first_mem = 100000 ; стартовое число, для хранения результатов поиска.


2. Выполняем такой скрипт:

Code: Select all

Sub main()
uo.setEasyUO(first_mem,"0")
endsub

Если во время выполнения скрипта Injection сообщил об отсутствии директории EasyUO в реестре - создайте директорию и выполните скрипт еще раз.

3. Если Вы хотите, чтобы результаты поисков были доступны в дальнейшем - пропустите этот пункт.
Переименуйте функцию из п.2 в "autostart" и включите галочку "Autostart" в закладке Injection Main, в таком случае информация о поиске после перезапуска Injection будет перезаписываться.

Больше для использования скриптов ничего не надо, сами скрипты:

Code: Select all

Sub FindCount(tar)
return strlen(uo.getEasyUO(tar))/10
endsub

Sub FindItem(num,tar)
return MID(uo.getEasyUO(tar),num*10,10)
endsub

Sub FindType(find)
while uo.getEasyUO(first_mem-1) == "1"
wait(10)
wend
uo.setEasyUO(first_mem-1,"1")
var i, tmp=""
uo.exec("findtype "+find)
if uo.findcount() then
repeat
tmp = tmp + uo.getSerial("finditem")
uo.ignore("finditem")
uo.exec("findtype "+find)
until not uo.findcount()
for i=0 to strlen(tmp)/10-1
uo.ignore(MID(tmp,i*10,10),"off")
next
i = val(uo.getEasyUO(first_mem))+first_mem+1
uo.setEasyUO(i,tmp)
uo.setEasyUO(first_mem,str(val(uo.getEasyUO(first_mem))+1))
return i
else
return false
endif
uo.setEasyUO(first_mem-1,"0")
endsub


Пример, с использованием этих скриптов:

Code: Select all

sub main()
var i
var s = FindType("'-1' '-1' 'backpack'")
if FindCount(s) then
for i=0 to FindCount(s)-1
uo.textprint(FindItem(i,s))
next
endif
endsub

Скрипт найдёт все вещи в бекпеке и запишет информацию в текстовое окно.

PS: Для тех, кто любит чистить реестр, путь в реестре: HKEY_CURRENT_USER\Software\EasyUO

Posted: 2006-04-16 00:52:24
by Grin
"Убей свой реестр" :twisted:

Posted: 2006-04-16 00:58:03
by Destruction
Grin wrote:"Убей свой реестр" :twisted:

Гыгы, шустро ты успел.

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

Posted: 2006-04-16 00:58:23
by Edred
Der wrote:Кстати, вопрос у меня есть: а почему бы не сделать так чтобы массивы можно было до сабов определять а то неудобно как-то...


Я думаю, тебе может помочь вот такая "фича" (кстати, я в своих скриптах это использую активно):

DIM массив[размер], массив[размер]...

- задание массива. Обращение к элементам: имя_массива[номер_элемента]. Нельзя писать имя_массива1 = имя_массива2 для присвоения содержимого одного массива другому.
Обращение к отдельным буквам в строке - так же, как к эл-там массива:
переменная[номер_буквы]. Номер - от 0, в случае выхода за конец строки - ошибка.

Замечания по поводу массивов
Массивы можно передавать в качестве параметров функциям. При этом передается САМ массив, а не его копия!!! Т.е. все действия внутри функции над элементами массива будут производиться над первоначальным массивом. Возвращать массивы из функций НЕЛЬЗЯ!!!

Posted: 2006-04-16 01:02:27
by Edred
Destruction wrote:а реестр - очень важно, хранение результатов пока силой не убьют. Это будет многим полезно.


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