ОСТОРОЖНО, В СЛЕДУЮЩИХ СКРИПТАХ ИСПОЛЬЗУЕТСЯ ONGUMP, У НЕКОТОРЫХ ЭТО ПРИВОДИТ К КРАШУ.
1.
РЕКОЛ ПО РУНБУКЕ. Скрипт не мой, взял у кого-то на
форуме, извиняюсь за отсутвие копирайта, впадлу искать...
ИСПОЛЬЗОВАНИЕ: Recall( ID_РУНБУКИ, НОМЕР_РУНЫ)
Code:
sub Recall(idrb,nrune)
Dim gumpreturn[10]
gumpreturn[1]="0x0015"
gumpreturn[2]="0x0021"
gumpreturn[3]="0x002E"
gumpreturn[4]="0x003A"
gumpreturn[5]="0x0040"
gumpreturn[6]="0x0049"
gumpreturn[7]="0x0058"
gumpreturn[8]="0x005E"
gumpreturn[9]="0x0401"
UO.exec('resend')
UO.UseObject('backpack')
uo.useobject(idrb)
uo.exec("ongump anygump "+gumpreturn[nrune])
endsub
2.
ГЕЙТ ПО РУНБУКЕ Игнорит все руны в бекпаке чтоб руну выбрать правильно, достает руну с указанным номером из рунбуки, кастует на неё гейт(кастует до тех пор пока всё таки гейт не откроется) и засовывает руну обратно:
ВНИМАНИЕ: В скрипте используются дополнительные функции
DynWait и
CastSpell, которые будут изложены далее
ИСПОЛЬЗОВАНИЕ: BookGate( ID_РУНБУКИ, НОМЕР_РУНЫ)Code:
#RUNEBOOK GATE. © pro aka to4a.
sub BookGate(idbook,n)
if UO.Targeting() then
UO.CancelTarget()
endif
var cast='no'
var rune='0x1F14' #Rune Type
DIM RUNEN[10]
runen[1]='0x000C'
runen[2]='0x000D'
runen[3]='0x000E'
runen[4]='0x000F'
runen[5]='0x0010'
runen[6]='0x0011'
runen[7]='0x0012'
runen[8]='0x0013'
runen[9]='0x0014'
UO.FindType(rune)
for var i=0 to UO.FindCount()
UO.FindType(rune)
UO.Ignore('finditem')
next
UO.Print('All Runes in backpack added to ignore list...')
UO.Set('quiet','1')
UO.OnGump('anygump',runen[n])
UO.UseObject(idbook)
UO.Set('quiet','0')
DynWait('You put','This is a free','@','@','@')
if UO.InJournal('This is a free') then
UO.Print('В этом слоте нет руны!')
goto end
endif
UO.Print('Rune number '+str(n)+' removed...')
UO.FindType(rune)
var BookRune=UO.GetSerial('finditem')
UO.Print('Removed rune ID: '+BookRune)
UO.WaitTargetObject(BookRune)
UO.Print('Casting Gate Travel')
repeat
cast=CastSpell('Gate Travel',0)
wait(50)
until cast=='success'
UO.WaitTargetObject(BookRune)
UO.Set('quiet','1')
UO.OnGump('anygump','0x000B')
UO.UseObject(idbook)
UO.Set('quiet','0')
UO.Print('Gate Travel Casted successfully, rune added back to runebook')
end:
endsub
3.
USER INTERFACE ДЛЯ ЭТИХ ФУНКЦИЙ Так как эти функции требуют ввода агрументов, а инжект к сожалению не умеет получать аргументы из консольного вида, то для этих двух функций я написал UI, который
использует ASM.Который, в свою очередь, можно взять тут. Правда этот UI тоже использует 1 аргумент, но 2 ф-ции для запуска UI с аргументом сделать не проблема.
ВНИМАНИЕ: В скрипте используются дополнительные функции
DynWait,
CastSpell,
Normalise,
Print, которые будут изложены далее
ИСПОЛЬЗОВАНИЕ: UI( GATE_SWITCH ). Аргумент должен быть 1 для того чтобы открыть гейт. 0 - для того чтобы реколится.Code:
#User Interface для гейта\рекола. © pro aka to4a.
Sub UI(gate)
UO.Set('injectecho','1')
if gate<>1 and gate<>0 then
UO.Print('Ошибка! Агрумент gate должен быть либо 1, либо 0')
UO.Print(' 1. - для того чтобы открыть гейт')
UO.Print(' 0. - для того чтобы реколится')
goto end
endif
UO.Set('quiet','1')
DIM buks[10],B[10],R[10]
var i,j=0,choise="nothing",runebook
booksel:
for i=0 to 10
buks[i]=0x00000000
next
UO.IgnoreReset()
UO.FindType('0x0EFA','0x0510','backpack')
for i=1 to uo.findcount()+1
UO.FindType('0x0EFA','0x0510','backpack')
buks[i]=UO.GetSerial('finditem')
UO.Click('finditem')
UO.Ignore('finditem')
j=i
next
if j==0 then
Print('РУНБУКИ НЕ НАЙДЕНЫ')
goto end
endif
Print('Выберите рубуку и нажмите [ENTER] или [ESC] для отмены:')
for i=1 to 10
B[i]=normalise(UO.GetName(buks[i]))
next
choise=UO.asmInputList("'Выберите буку:'"," "+B[1]+";"+B[2]+" "+B[3]+";"+B[4]+" "+B[5]+";"+B[6]+" "+B[7]+";"+B[8]+" "+B[9]+";"+B[10]+" ")
while choise=="nothing"
wait(50)
wend
if choise==0 then
Print('======Gate Travel\Recall Canceled======')
goto end
endif
runebook=buks[choise]
UO.OnGump('anygump','(0')
UO.UseObject(runebook)
choise='nothing'
DynWait('Gump Replied','@@@','@@@','@@@','@@@')
for i=1 to 9
R[i]=normalise(UO.LastGump('text',i))
next
Print('Выберите руну и нажмите [ENTER]')
choise=UO.asmInputList("'Выберите руну:'"," "+R[1]+";"+R[2]+" "+R[3]+";"+R[4]+" "+R[5]+";"+R[6]+" "+R[7]+";"+R[8]+" "+R[9]+";'Назад'")
while choise=="nothing"
wait(50)
wend
if choise==10 then
choise="nothing"
goto booksel
endif
if choise==0 then
UO.Print('Gate Travel Canceled')
goto end
endif
if gate==1 then
BookGate(runebook,choise)
endif
if gate==0 then
Recall(runebook,choise)
endif
end:
UO.IgnoreReset()
UO.Set('quiet','0')
endsub
4.
ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ. Которые используются в вышеизложенных скриптах.
CASTSPELL функция кастования, если нехватает маны пьет манку, после каста возвращает статус(fizzle\success\noregs\notarg) что делает её удобной в использовании в других скриптах, возможностью включения\выключения маскировки каста(отправка 3 пустых строки сразу за кастом)
ВНИМАНИЕ: требуется дополнительная функция
WaitManaChangeИСПОЛЬЗОВАНИЕ: CastSpell( ИМЯ_СПЕЛЛА, MASK_SWITCH), с именем спелла - все понятно, второй аргумент: 1 - для того чтобы маскировать каст. 0 - не маскировать.
НЕ ЗЛОУПОТРЕБЛЯТЬ МАСКИРОВКОЙ, КАРАЕТСЯ ЗАКОНОМ ПО СТАТЬЕ "ФЛУД"Code:
Sub CastSpell(spell,mask)
cast:
UO.DeleteJournal()
UO.Cast(spell)
repeat
wait(10)
until UO.InJournal('An') or UO.InJournal('Ex') or UO.InJournal('Por') or UO.InJournal('Lor') or UO.InJournal('Des') or UO.InJournal('Rel') or UO.InJournal('You lack')
if mask==1 then
uo.fontcolor('0x0000')
uo.msg(" ")
uo.fontcolor('0x0000')
uo.msg(" ")
uo.fontcolor('0x0000')
uo.msg(" ")
endif
if UO.InJournal('You lack') then
if UO.InJournal('sufficient mana') then
Mana()
goto cast
else
UO.Print('КАСТ НЕВОЗМОЖЕН - НЕТУ РЕГОВ')
return 'noregs'
goto end
endif
endif
if UO.InJournal('line') or UO.InJournal('see the target') then
UO.Print('ЦЕЛЬ НЕ ВИДАТЬ')
return 'notarg'
goto end
endif
WaitManaChange(UO.Mana)
UO.Print('КАСТ ОКОНЧЕН')
if UO.InJournal('fizzle') then
goto cast
endif
return 'success'
end:
endsub
УДАЛЕНИЕ СТРОКИ Удаляет все строки журнала, равные string1(аргумент). © Edred (по крайней мере из его топика скопировано)
Code:
Sub DeleteJournal( string1 )
VAR nom = UO.InJournal( string1 )
If nom > 0 Then
UO.SetJournalLine( Nom - 1, 'string replaced' )
DeleteJournal( string1 )
Endif
endsub
PRINT Небольшая функция, которая прежде чем напечатать выключает режим "молчания" инжекта(set quiet), печатает, и снова включает.
Code:
sub Print(text)
UO.Set('quiet',0)
UO.Print(text)
UO.Set('quiet',1)
endsub
НОРМАЛИЗАЦИЯ ТЕКСТА Получает строку, все пробелы в ней заменяет "_" и возвращает...
Code:
Sub normalise(string)
DIM Chars[64]
var NewString=''
for var nChars=0 to LEN(string)
if Left(string,1)<>' ' then
NewString=NewString+Left(string,1)
else
NewString=NewString+'_'
endif
string=Right(string,LEN(string)-1)
next
return NewString
endsub
ДИНАМИЧЕСКАЯ ПАУЗА Стандартная динамическая пауза, выходом из цикла через 6 секунд и учётом сейва.
Входных аргументов - 5, если надо проверять меньше строк остальные аргументы вбейте какиенибуть строки, которые не встречаются, например DynWait("You fail","@@@","@@@","@@@","@@@")
Code:
sub DynWait(event1,event2,event3,event4,event5)
var Time=0;
DeleteJournal(event1)
DeleteJournal(event2)
DeleteJournal(event3)
DeleteJournal(event4)
DeleteJournal(event5)
repeat
wait(100)
Time=Time+1
if UO.InJournal('World is saving') then
repeat
wait(500)
until UO.InJournal('World data saved in')
endif
until UO.InJournal(event1) or UO.InJournal(event2) or UO.InJournal(event3) or UO.InJournal(event4) or UO.InJournal(event5) or Time==60
endsub
ДОЖДАТСЯ ПАДЕНИЯ МАНЫ Ждет пока мана не упадет, т.е. пока спелл не кастанется.
Code:
Sub WaitManaChange(now)
while UO.Mana>=now
wait(50)
wend
endsub
ПРОВЕРКА НА ЛАГ Немного измененная стандартная проверка на лаг. Изменения заключается в том что убрана отмена прицеливания, которая здесь ни к чему(по крайней мере мне это часто мешало), и очищается не весь журнал а только удаляется строка "backpack" опять таки потому что чеклаг ф-ция которая используется из других функций, которым очистка журнала может помешать.
Code:
Sub CheckLag()
DeleteJournal('backpack')
UO.Click('backpack')
REPEAT
WAIT(50)
UNTIL UO.InJournal('backpack')
end sub
Ну и напоследок, хоть это и не имеет отношения к вышеизложенному, немного измененный стандартный
РЕКОННЕКТОР, в основе всё тот же реконектор, который давно лежит на форуме, только определение подлючения происходит теперь через isOnline(), что гозадо эффективнее, время дисконекта и время реконекта записывается отдельно...
Code:
sub NewRecon()
while true
while UO.IsOnline()
wait(100)
wend
UO.TextOpen()
UO.TextPrint('Disconnected at '+MakeTime())
UO.Exec('terminate all')
connect:
UO.Say(' ')
wait(3000)
UO.LDblClick(616,455)
wait(3000)
UO.LDblClick(616,455)
wait(3000)
UO.LDblClick(616,455)
wait(3000)
UO.LDblClick(357,164)
if UO.IsOnline() then
UO.Exec('exec main')
UO.TextOpen()
UO.TextPrint('Reconnected at '+MakeTime())
else
goto connect
endif
wend
endsub
Sub MakeTime()
VAR D, T, Ret, i
Ret = STR(UO.Time())
T = ""
For i = 0 To Len(Ret)
T = Ret[Len(Ret)-i] + T
If (I == 2) OR (I == 4) Then
T = ":" + T
EndIf
Next
Ret = STR(UO.Date())
D = ""
For i = 0 To Len(Ret)
D = Ret[Len(Ret)-i] + D
If (I == 2) OR (I == 4) Then
D = "." + D
EndIf
Next
Ret = T + " @ " + D
RETURN Ret
end sub
Функции малотестированы и могут быть глюки. Я играю на ДрВ и писал их под него, как они поведут себя на других шардах - хз.