Во первых, не рекоммендую использовать закладки обьектов и типов в инжекте. Лучше все нужные типы прописывать сразу в скрипт. Так будет меньше проблем при передаче сложного скрипта кому-то другому или на другую инжу.
В общем лучше делать так (это не рабочий скрипт, а просто пример чтобы понять идею):
Code:
var fs_scroll_type = "0x1234"
var human_type = "0x4321"
sub kill_human()
UO.FindType(human_type,-1,'ground')
UO.WaitTargetObject('finditem')
UO.UseType(fs_scroll_type)
endsub
Короче как можно меньше использовать AddObject и AddType.
Если-же цель нужно взять с таргета, то это лучше всего делать так (базовыми средствами инжекта):
Code:
sub test()
UO.AddObject('tempObject') #Добавляем таргет в временную инжектовую переменную 'tempObject'
while (not UO.Targeting()) #Ждём появления прицела
wait(50)
wend
while (UO.Targeting()) #Ждём исчезновения прицела (цель выбрана)
wait(50)
wend
var enemy = UO.GetSerial('tempObject') #Записываем наш предмет в нормальную переменную а не в инжектовую кавычковую переменную
UO.Attack(enemy) # Нормально используем её как обычную переменную и забываем о нашем temp Object
endsub
Тот-же код с помощью моей addObjectWait:
Code:
sub test()
var enemy = addObjectWait('tempObject',0)
UO.Attack(enemy)
endsub
Кстати да, вот тебе еще в помощь полезная функция
addTypeWait. Работает так-же как и addObjectWait но добавляет не обьект а тип:
Code:
Sub addTypeWait(name,timeout)
var object = addObjectWait('sys_typeobj',timeout)
var objtype = UO.GetGraphics(object)
UO.AddType(name,objtype)
return objtype
endsub
Но не смотря на мой совет не использовать UO.AddObject, бывают случаи когда лучше всё-же его использовать. Использовать нужно тогда - когда тебе переменную нужно передать между несколькими отдельными скриптами. В твоём случае есть несколько скриптов - на бросание разных заклинаний, аттак и т.д. Так вот для врага лучше задействовать переменную инжекта:
Code:
sub selectEnemy()
UO.Print('Select enemy')
addObjectWait('Enemy',0)
UO.Attack('Enemy')
endsub
sub castFS()
UO.Cast('Flamestrike','Enemy')
endsub
Quote:
ну тут моно добавить наверно проверку по объекту, то есть если он уже определен тогда сразу кидать Magic Arrow вощем сам наверное разберусь
Легко сделать к примеру так:
Code:
sub addOrGetObject(name,distance,timeout)
var oldObject = UO.GetSerial(name) ;Вытягиваем обьект из памяти инжи по его имени
if (oldObject > 0) AND ((UO.GetDistance(oldObject) <= distance) OR (distance == -1)) then ;Если такой обьект есть и расстояние до него меньше указанного
return oldObject ;то его и возвращаем
else
return addObjectWait(name,timeout) ;Иначе добавляем новый обьект (появляется таргет) в указанное имя
endif
endsub
Тогда везде где нужно можно использовать его примерно так:
Code:
sub selectEnemy()
addOrGetObject('Enemy',8,-1) ;Если враг уже есть, и находится на расстоянии 8 клеток - то просто его и используем, иначе - добавляем новый обьект. При этом последний параметр указывает что прицел будет висеть бесконечно
endsub
sub cast_fs()
var enemy = addOrGetObject('Enemy',8,-1)
UO.Cast('FlameStrike',enemy)
endsub
Далее:
Quote:
...
if uo.count(fscroll)<>0 then
castScroll('fscroll',20,Enemy)
uo.print('fscroll: '+STR(UO.Count('fscroll')))
else
UO.Print("NO SCROLLS!")
end if
Endsub
##############
sub castScroll(scrolID,ManaNeed,Target) #отдельныи скрипт на каст со скролов
UO.FindType(scrolID,-1,'my')#######!!!!! Тут не доработка лучше наверное по типу будет или где?
...
Опять-же всплыла проблема с тем что ты используешь для хранения свитков - инжектовую переменную. Лучше сделать примерно так:
Code:
sub FSS()
If UO.Mana<ManaNeed then
UO.Print("NO MANA!")
endif
var Enemy = addOrGetObject('Enemy',8,-1) ;Вытягиваем нашего врага или добавляем нового если старый убежал или умер
if uo.count(fscroll)<>0 then
castScroll(fscroll,20,Enemy) ;Передаём просто тип свитка и нашего найденного врага
uo.print('fscroll: '+STR(UO.Count(fscroll)))
else
UO.Print("NO SCROLLS!")
end if
Endsub
sub castScroll(scrolType,ManaNeed,Target) #здесь к нам прийдёт уже не ИД а тип свитка
UO.FindType(scrolType,-1,'my')
if UO.GetQuantity('finditem') then
if UO.Mana<ManaNeed then
manadrink()
endif
if UO.Mana>=ManaNeed then
UO.WaitTargetObject(Target) ;Ничего не надо менять, враг то у нас один, зачем нам его тип?
UO.UseObject('finditem')
endif
endif
endsub
Думаю так проблема решится. Теперь запустив exec FSS получится такой ход проверок:
1) Если враг уже был кем-то выбран - будем использовать его.
2) Если враг не был выбран или убежал очень далеко (8 тайлов в скрипте выше) - покажем прицел, и игрок выберет нового врага.
3) В этой точке враг у нас уже точно есть (после первых двух пунктов) в переменной. Так что делаем с ним что хотим.
Quote:
Вопрос все ли правильно в стуктуре и будет ли работать связка макросов sub Fss()>>sub castScroll()>>sub manadrink()
Не вижу почему она не должна работать

Quote:
И как сделать чтоб проверка и каст был по типу скрола.
Так-же как и везде:
Code:
UO.FindType(scrollType,scrollColor,container)
if (UO.FindCount()) then
UO.WaitTarget....
UO.UseObject('finditem') ;В файндайтеме у нас сидит последний найденный айтем
endif
Вроде всё ответил. Если что пропустил - спрашивай. Люблю помогать тем кто хочет сам что-то понять, а то развелось тут всяких "помогите доработать мининг"...