Прекрасно понимаю, что разбираться в этом врядли кому-то захочется, да и кое что тут реализовано через задний проход, но вот переделанный скрипт (оригинал был версия 3.7, реавтор ВЕТЕРАН, шард ДРВ) под абисс и личные предпочтения (работа с рунами из сундука, пополнение регов, реколл скроллов, работа с несколькими файлами, модернизированный уход от пк). На данный момент я взялся за то, чтобы реализовать похожий скрипт на изиуо (либо найти и изменить готовый), но может кому-то резко броситься в глаза что-то, что вызывает краши именно определенных функций. В моем случае крашит CheckingPlayers (проверка на игроков или НПЦ в виде людей) чаще всего. Также иногда (но гораздо реже) крашит и основа для ламбера.
Я постарался оставить как можно больше комментариев в скрипте, чтобы было попроще разобраться.Кое что тут совсем сырое, прошу не пинать, вот версия без записи координат деревьев в файлы (все личные ID заменены на 0х00000000) :
Code:
sub Main()
uo.exec('addobject Meshok 0x00000000') ## - Сундук с регами, в который складываем логи.
uo.setglobal('find','0') ## - глобальная переменная для поиска ПК. 0 - никого не нашли, 1 - нашли.
## - Добавляем в игнор всех чернорабочих, чтобы друг от друга не улетали:
uo.ignore('self', 'on')
uo.ignore('0x00000000', 'on') ## - чар1
uo.ignore('0x00000000', 'on') ## - чар2
uo.ignore('0x00000000', 'on') ## - чар3
uo.ignore('0x00000000', 'on') ## - чар4
; uo.exec('exec Reconnect') ## - Запускаем функцию реконнекта, пока закомментирована, чтобы не мешало.
uo.set('finddistance', '30') ## - Дистанция для поиска персонажей.
## Не знаю какое лучше число, но с 30 идеально определяет еще до того,
## как на экране появляется ник персонажа.
uo.exec('exec Lumberstart') ## - Запускаем первую, стартовую функцию для работы с ламбером.
end sub
## Подобные функции (типа Lumberstart) сделаны для того, чтобы их можно было запускать через uo.exec('exec SUB').
## Это позволяет отчетливо видеть в списке запущенных функций что и как работает,
## на какой конкретно мы локации, что происходит вообще.
## Всё так заморочено для того, чтобы в главные функции передавались нужные параметры и при этом все работало
## в независимом процессе.
## Lumberstart() - это функция для запуска особенной стартовой функции, которая перед вырубкой первого леса
## выполняет ряд действий, необходимых для успешного и благополучного старта.
sub Lumberstart()
LumberjackingStart(1)
end sub
## Lumber1(), Lumber2() и так далее - стартеры последующих функций для ламбера.
sub Lumber1()
Lumberjacking(1) ## - параметр это номер зоны, куда летим.
end sub
sub Lumber2()
Lumberjacking(2)
end sub
sub Lumber3()
Lumberjacking(3)
end sub
sub Lumber4()
Lumberjacking(4)
end sub
sub Lumber5()
Lumberjacking(5)
end sub
sub Lumber6()
Lumberjacking(6)
end sub
## ChangeFast1, ChangeFast2, .., - это стартеры функций смены локации, передающих параметр реколла со скролла.
sub ChangeFast1()
ChangeLocationFast(1)
end sub
sub ChangeFast2()
ChangeLocationFast(2)
end sub
sub ChangeFast3()
ChangeLocationFast(3)
end sub
sub ChangeFast4()
ChangeLocationFast(4)
end sub
sub ChangeFast5()
ChangeLocationFast(5)
end sub
sub ChangeFast6()
ChangeLocationFast(6)
end sub
## Change1, Change2, .., - это стартеры функций смены локации, передающих параметр реколла с буки.
sub Change1()
ChangeLocation(1)
end sub
sub Change2()
ChangeLocation(2)
end sub
sub Change3()
ChangeLocation(3)
end sub
sub Change4()
ChangeLocation(4)
end sub
sub Change5()
ChangeLocation(5)
end sub
sub Change6()
ChangeLocation(6)
end sub
## Стартовая функция ламбера.
## ZoneNum - это параметр, указывающий куда мы полетим. От 1 до 6.
sub LumberjackingStart(ZoneNum)
var i=0,j=0,k=0,r=0,q=0,ii,jj, LastLumberRune, NextLumberRune
var TopX=324,TopY=65
dim TreeX[500], TreeY[500],TreeT[500]
dim TreeTile[10]
var flag=0,TreeCount=0,clicks=0,flag2=0
var f=file("C:\lumber data\char1\Trees"+str(ZoneNum)+".dat") ## - Путь к файлу в котором будут хранится
# координаты Деревьев.
var Area=1 ## Размер обрабатываемой территории (Т.к. я изменил скрипт, то просто оставим 1)
var TryHiding=0 ## 1 - Перед тем как рубить дерево, будет пытаться уйти в хайд, 0 - не будет .
var TryRecall=1 ## 1 - После того как соберет LogsQty логов, будет пытаться реколиться домой,
# складывать логи в сундук и реколиться обратно, 0 - не будет.
var LogsQty=1500 ## Количество логов, добыв которое надо реколиться домой.
var GetFromFile=1 ## 1 - Координаты деревьев будут считыватся из файла. 0 - Запишем в файл.
# Запись в файл я пока удалил, чтобы не мешалось, поэтому оставим GetFromFile=1.
########################
### Графика деревьев ###
########################
TreeTile[0]=3283
TreeTile[1]=3277
TreeTile[2]=3293
TreeTile[3]=3296
TreeTile[4]=3302
TreeTile[5]=3299
TreeTile[6]=3290
TreeTile[7]=3288
TreeTile[8]=3286
TreeTile[9]=3280
uo.exec("filterspeech on")
uo.exec("filterspeech add 'Where do you want to use the pickaxe?'")
uo.print('Choose axe: ')
uo.exec('addobject axe')
while uo.targeting()
wait(100)
wend
if TryRecall==1 then
uo.setglobal('recal', '0') ## - Глобальная переменная, указывающая куда мы полетим.
# 0 - домой, 1 - 1ая руна, 2 - 2ая руна и т.д.
uo.print('Choose rune to Home (bank): ')
uo.exec('addobject HomeRune 0x00000000') ## Char1
uo.print('Choose rune to Lumber Zone 1 (chest): ')
uo.exec('addobject LumberRune1 0x00000000')
uo.print('Choose rune to Lumber Zone 2 (chest): ')
uo.exec('addobject LumberRune2 0x00000000')
uo.print('Choose rune to Lumber Zone 3 (chest): ')
uo.exec('addobject LumberRune3 0x00000000')
uo.print('Choose rune to Lumber Zone 4 (chest): ')
uo.exec('addobject LumberRune4 0x00000000')
uo.print('Choose rune to Lumber Zone 5 (chest): ')
uo.exec('addobject LumberRune5 0x00000000')
uo.print('Choose rune to Lumber Zone 6 (chest): ')
uo.exec('addobject LumberRune6 0x00000000')
end if
#####################################
### Загружаем координаты из файла ###
#####################################
if GetFromFile==1 then
uo.print('Loading coordinates from file...')
f.open()
TreeCount=safe call f.readNumber()
for i=1 to TreeCount
TreeT[i]=safe call f.ReadNumber()
TreeX[i]=safe call f.ReadNumber()
TreeY[i]=safe call f.ReadNumber()
next
f.close()
else
##Тут должна быть запись координат в файлы, но я этот блок удалил, дабы не отвлекал.##
end if
uo.print('Trees amount: '+str(TreeCount)) ## - Выводим количество деревьев, считанных из файла
GetReagents() ## - Вызываем функцию проверки и добора регов из сундука.
uo.setglobal('recal', ZoneNum) ## - Указываем куда летим в первый раз.
LastLumberRune = val(uo.getglobal('recal')) ## - Временная переменная. Может тут можно реализовать иначе,
uo.setglobal('LastZone', LastLumberRune) ## - но как есть.. главное, что работает.
MyRecall(0) ## - Вызов функции реколла, в параметре передается тип: 0 - с буки, 1 - со скролла.
wait(2000)
uo.exec('exec CheckingPlayers') ## - Запуск функции проверки на ПК.
######################################
### Ходим по собранным координатам ###
######################################
if TreeCount>0 then
for i=1 to TreeCount
if TryRecall==1 AND uo.Count('ZLK')>=LogsQty then
uo.setglobal('recal', ZoneNum) ## - сохраняем номер данной локации.
ToRecall(0) ## - Вызываем функцию "разгрузки".
end if
if val(uo.getglobal('find')) == 1 Then ## - эта переменная приходит с CheckingPlayers.
UO.Print("LumberStart Return 1") ## - если find=1, значит кого-то нашли,
return ## - значит выходим из функции lumberstart.
else ## - если никого не нашли, значит работаем:
uo.print('Moving to the Tree '+str(i)+': x='+str(Treex[i])+' y='+str(Treey[i]))
infologs()
if val(uo.getglobal('find')) == 1 Then ## еще одна проверка на ПК.
UO.Print("LumberStart Return 2")
return
endif
flag=gotoxy(Treex[i],Treey[i]) ## вызываем ходилку.
if flag==1 then
if TryHiding==1 then
ToHide()
end if
GetTree(str(TreeT[i]),str(TreeX[i]),str(TreeY[i]),str(uo.getz()))
end if
endif
next
end if
var ZoneNumNext
if ZoneNum == 6 Then ## - если локация 6 (последняя), значит переходим к 1ой.
ZoneNumNext = 1
else ## - иначе переходим к следующей.
ZoneNumNext = ZoneNum + 1
endif
uo.exec('exec Change'+str(ZoneNumNext)) ## запускаем стартер функции по смене локации.
return
end sub
## Функция для работы с последующими локациями. Тут все практически идентично с LumberjackingStart(ZoneNum).
sub Lumberjacking(ZoneNum)
var i=0,j=0,k=0,r=0,q=0,shit=0,ii,jj
var TopX=324,TopY=65
dim TreeX[500], TreeY[500],TreeT[500]
dim TreeTile[10]
var flag=0,TreeCount=0,clicks=0,flag2=0
var f=file("C:\lumber data\Char1\Trees"+str(ZoneNum)+".dat")
var Area=1
var TryHiding=0
var TryRecall=1
var LogsQty=1500
var GetFromFile=1
if GetFromFile==1 then
uo.print('Loading coordinates from file...')
f.open()
TreeCount=safe call f.readNumber()
for i=1 to TreeCount
TreeT[i]=safe call f.ReadNumber()
TreeX[i]=safe call f.ReadNumber()
TreeY[i]=safe call f.ReadNumber()
next
f.close()
endif
uo.print('Trees amount: '+str(TreeCount))
wait(2000)
######################################
### Ходим по собранным координатам ###
######################################
if TreeCount>0 then
for i=1 to TreeCount
if TryRecall==1 AND uo.Count('ZLK')>=LogsQty then
uo.setglobal('recal', ZoneNum)
ToRecall(0)
end if
if val(uo.getglobal('find')) == 1 Then
UO.Print("Lumber Return 1")
return
else
uo.print('Moving to the Tree '+str(i)+': x='+str(Treex[i])+' y='+str(Treey[i]))
infologs()
if val(uo.getglobal('find')) == 1 Then
UO.Print("Lumber Return 2")
return
endif
flag=gotoxy(Treex[i],Treey[i])
if flag==1 then
if TryHiding==1 then
ToHide()
end if
GetTree(str(TreeT[i]),str(TreeX[i]),str(TreeY[i]),str(uo.getz()))
end if
endif
next
end if
var ZoneNumNext
if ZoneNum == 6 Then
ZoneNumNext = 1
else
ZoneNumNext = ZoneNum + 1
endif
uo.exec('exec Change'+str(ZoneNumNext))
return
end sub
## Переходная функция для смены локации.
sub ChangeLocation(ZoneNum)
uo.setglobal('recal', ZoneNum)
ToRecall(0) ## разгружаемся.
if ZoneNum == 1 Then
uo.exec('exec Lumber1')
endif
if ZoneNum == 2 Then
uo.exec('exec Lumber2')
endif
if ZoneNum == 3 Then
uo.exec('exec Lumber3')
endif
if ZoneNum == 4 Then
uo.exec('exec Lumber4')
endif
if ZoneNum == 5 Then
uo.exec('exec Lumber5')
endif
if ZoneNum == 6 Then
uo.exec('exec Lumber6')
endif
end sub
## Переходная функция для смены локации с использованием реколл скроллов.
sub ChangeLocationFast(ZoneNum)
uo.setglobal('recal', ZoneNum)
ToRecall(1)
if ZoneNum == 1 Then
uo.exec('exec Lumber1')
endif
if ZoneNum == 2 Then
uo.exec('exec Lumber2')
endif
if ZoneNum == 3 Then
uo.exec('exec Lumber3')
endif
if ZoneNum == 4 Then
uo.exec('exec Lumber4')
endif
if ZoneNum == 5 Then
uo.exec('exec Lumber5')
endif
if ZoneNum == 6 Then
uo.exec('exec Lumber6')
endif
end sub
## Вырубка определенного дерева (не изменял, только добавил пару проверок с uo.getglobal('find') (поиск пк))
sub GetTree(type,x,y,z)
var i
uo.print('Starting lumberjacking...')
for i=0 to 15
if val(uo.getglobal('find')) == 1 Then
UO.Print("GetTree Return 1")
return
else
if uo.warmode()==1 then
return 0
end if
wait(200)
uo.deletejournal()
uo.waittargettile(type,x,y,z)
uo.useobject('axe')
if WaitForChange()==1 then
return 1
end if
endif
next
return 0
end sub
## - Функция разгрузки. RecallType: 0 - с рунбуки, 1 - с реколл скролла.
sub ToRecall(RecallType)
VAR Meshok='0x00000000' ## - ID сундука в который чар должен складывать логи
VAR LastLumberRune
LastLumberRune = val(uo.getglobal('recal'))
uo.setglobal('LastZone', LastLumberRune)
uo.setglobal('recal', '0') ## - Выбираем руну для телепорта домой
if RecallType == 0 Then ## - Если реколимся по буке, значит реколл спровоцирован не уходом от ПК.
uo.exec('terminate CheckingPlayers') ## - следовательно убиваем функцию проверки на ПК.
endif
MyRecall(RecallType) ## - Телепортимся домой (ведь глобальная функция recal = 0).
wait(500)
repeat
wait(500)
repeat
wait(500)
repeat
wait(600)
UO.SetReceivingContainer(Meshok) ## Тут все, что связано с разгрузкой.
uo.findtype('ZLK') ## Работает все идеально.
wait(500)
UO.Grab('all','finditem')
infologs()
wait(500)
until uo.GetQuantity('finditem')==0
UO.UnSetReceivingContainer()
UO.SetReceivingContainer(Meshok)
uo.findtype('ZLK')
wait(500)
UO.Grab('all','finditem')
infologs()
wait(500)
until uo.GetQuantity('finditem')==0
UO.UnSetReceivingContainer()
UO.SetReceivingContainer(Meshok)
uo.findtype('ZLK')
wait(500)
UO.Grab('all','finditem')
infologs()
wait(500)
until uo.GetQuantity('finditem')==0
UO.UnSetReceivingContainer()
GetReagents() ## - Пополняем ресурсы.
uo.setglobal('recal', LastLumberRune) ## - Выбираем руну для телепорта в лес.
MyRecall(0) ## Реколимся по рунбуке в лес.
wait(2000)
uo.exec('exec CheckingPlayers') ## Как прилетели - запускаем проверку на ПК.
end sub
## Функция пополнения регов и скроллов. Работает идеально.
sub GetReagents()
UO.UnSetReceivingContainer()
UO.UseObject('0x00000000') ## - Открывает сундук. Просто, чтобы увидеть сколько там логов и регов.
VAR ReagentDiff
## - Берем реги и реколл скроллы из сундука:
If UO.GetQuantity( '^0x1F4C' ) < 4 Then
ReagentDiff = 4 - UO.GetQuantity('^0x1F4C')
uo.moveitem('Meshok.0x1F4C', ReagentDiff)
endif
wait(500)
if UO.BM < 15 Then
ReagentDiff = 15 - UO.BM
uo.moveitem('Meshok.0x0F7B', ReagentDiff)
endif
wait(500)
if UO.BP < 15 Then
ReagentDiff = 15 - UO.BP
uo.moveitem('Meshok.0x0F7A', ReagentDiff)
endif
wait(500)
if UO.MR < 15 Then
ReagentDiff = 15 - UO.MR
uo.moveitem('Meshok.0x0F86', ReagentDiff)
endif
wait(500)
UO.UnSetReceivingContainer()
end sub
## Отвечает за хайд, работает идеально.
sub ToHide()
while not UO.Hidden()
uo.print('Trying to hide...')
uo.deletejournal()
UO.UseSkill("Hiding")
wait(4100)
wend
wait(100)
end sub
## Функция, отвечающая непосредственно за реколл по нужной руне. Работает на ура.
## RecallType: 0 - по рунбуке, 1 - по скроллу
sub MyRecall(RecallType)
VAR a, b, c
VAR d = uo.getx('self')
if RecallType == 0 Then
repeat
while uo.mana < 11
uo.warmode('0')
uo.useskill('Meditation')
wait(1000)
wend
a = 0
uo.deletejournal()
if val(uo.getglobal('recal')) == 0 then ## - летим домой.
uo.waittargetobject('HomeRune')
uo.cast('Recall')
else
wait(50)
endif
if val(uo.getglobal('recal')) == 1 then ## - летим в лес1.
uo.waittargetobject('LumberRune1')
uo.cast('Recall')
else
wait(50)
endif
if val(uo.getglobal('recal')) == 2 then ## - летим в лес2.
uo.waittargetobject('LumberRune2')
uo.cast('Recall')
else
wait(50)
endif
if val(uo.getglobal('recal')) == 3 then ## - летим в лес3.
uo.waittargetobject('LumberRune3')
uo.cast('Recall')
else
wait(50)
endif
if val(uo.getglobal('recal')) == 4 then ## - летим в лес4.
uo.waittargetobject('LumberRune4')
uo.cast('Recall')
else
wait(50)
endif
if val(uo.getglobal('recal')) == 5 then ## - летим в лес5.
uo.waittargetobject('LumberRune5')
uo.cast('Recall')
else
wait(50)
endif
if val(uo.getglobal('recal')) == 6 then ## - летим в лес6.
uo.waittargetobject('LumberRune6')
uo.cast('Recall')
else
wait(50)
endif
repeat
wait(100)
a = a + 1
until a > 35 or d <> uo.getx('self') or uo.injournal('The spell fizzles.')
wait(500)
until not uo.injournal('The spell fizzles.')
else
repeat
while uo.mana < 11
uo.warmode('0')
uo.useskill('Meditation')
wait(1000)
wend
a = 0
uo.deletejournal()
if val(uo.getglobal('recal')) == 0 then ## - летим по скроллу домой.
uo.waittargetobject('HomeRune')
uo.usetype('0x1F4C')
else
wait(50)
endif
if val(uo.getglobal('recal')) == 1 then ## - летим по скроллу в лес1.
uo.waittargetobject('LumberRune1')
uo.usetype('0x1F4C')
else
wait(50)
endif
if val(uo.getglobal('recal')) == 2 then ## - летим по скроллу в лес2.
uo.waittargetobject('LumberRune2')
uo.usetype('0x1F4C')
else
wait(50)
endif
if val(uo.getglobal('recal')) == 3 then ## - летим по скроллу в лес3.
uo.waittargetobject('LumberRune3')
uo.usetype('0x1F4C')
else
wait(50)
endif
if val(uo.getglobal('recal')) == 4 then ## - летим по скроллу в лес4.
uo.waittargetobject('LumberRune4')
uo.usetype('0x1F4C')
else
wait(50)
endif
if val(uo.getglobal('recal')) == 5 then ## - летим по скроллу в лес5.
uo.waittargetobject('LumberRune5')
uo.usetype('0x1F4C')
else
wait(50)
endif
if val(uo.getglobal('recal')) == 6 then ## - летим по скроллу в лес6.
uo.waittargetobject('LumberRune6')
uo.usetype('0x1F4C')
else
wait(50)
endif
repeat
wait(100)
a = a + 1
until a > 30 or d <> uo.getx('self') or uo.injournal('The spell fizzles.')
wait(500)
until not uo.injournal('The spell fizzles.')
endif
end sub
## Проверка для вырубки дерева. Подправил под aбиcc + добавил проверки на uo.getglobal('find') (для ухода от пк).
sub WaitForChange()
var Text1='You hack at the tree for a while, but fail to produce any useable wood.'
var Text2='There are no logs left here to chop.'
var Text3="You can't reach this."
var Text4="That's too far away to chop."
var mess
for var i=0 to 200
if val(uo.getglobal('find')) == 1 Then ## проверка на пк.
UO.Print("WaitForChange Return 1")
return
else
mess=uo.journal(0)
if uo.Journal(0)==Text2 OR uo.Journal(0)==Text3 OR uo.Journal(0)==Text4 then
return 1
end if
if uo.Journal(0)==Text1 then
return 0
end if
if mess[0]=='Y' AND mess[1]=='o' AND mess[2]=='u' AND mess[4]=='p' AND mess[5]=='u' AND mess[6]=='t' then
return 0
end if
wait(50)
endif
next
return 0
end sub
## - Ходилка. Работает вообще отлично, но пришлось добавить очень много проверок на ПК, чтобы
## - как можно быстрей завершилась работа всех функций и перешло к работе со следующей локацией.
sub gotoXY(x,y)
var myX,myY,lastX=0,lastY=0,i,halt=0,z,r=0
for i=1 to 60
if val(uo.getglobal('find')) == 1 Then
UO.Print("gotoXY Return 1")
return
else
MyX=uo.getX();
MyY=uo.getY();
if LastX==MyX AND LastY==MyY then
halt=halt+1
else
halt=0
end if
if halt>=10 then
if uo.GetDir()==1 then
for z=0 to 8
if val(uo.getglobal('find')) == 1 Then
UO.Print("gotoXY Return 2")
return
endif
uo.press(40)
next
end if
if uo.GetDir()==3 then
for z=0 to 8
if val(uo.getglobal('find')) == 1 Then
UO.Print("gotoXY Return 3")
return
endif
uo.press(37)
next
end if
if uo.GetDir()==5 then
for z=0 to 8
if val(uo.getglobal('find')) == 1 Then
UO.Print("gotoXY Return 4")
return
endif
uo.press( 38 )
next
end if
if uo.GetDir()==7 then
for z=0 to 8
if val(uo.getglobal('find')) == 1 Then
UO.Print("gotoXY Return 5")
return
endif
uo.press(39)
next
end if
halt=15
end if
if abs(x-myX)<=1 AND abs(y-myY)<=2 then
return 1
end if
if x<=MyX then
if y<=MyY then
for z=0 to 3
if val(uo.getglobal('find')) == 1 Then
UO.Print("gotoXY Return 6")
return
endif
uo.press( 38 )
next
else
for z=0 to 3
if val(uo.getglobal('find')) == 1 Then
UO.Print("gotoXY Return 7")
return
endif
uo.press(37)
next
end if
else
if y<=MyY then
for z=0 to 3
if val(uo.getglobal('find')) == 1 Then
UO.Print("gotoXY Return 8")
return
endif
uo.press(39)
next
else
for z=0 to 3
if val(uo.getglobal('find')) == 1 Then
UO.Print("gotoXY Return 9")
return
endif
uo.press(40)
next
end if
end if
lastX=myX
lastY=myY
wait(200)
endif
next
return 0
end sub
sub abs(num)
if num>=0 then
return num
else
return num*(-1)
end if
end sub
## Информация по количеству вырубленных деревьев.
sub infologs()
UO.Print('You have got '+Str(UO.Count('0x1BDD'))+' logs in your shitbag')
UO.Print('Also '+Str(UO.Count('0x1BDD','0x0000'))+' usual and ' +str(uo.count('0x1BDD')-uo.count('0x1BDD','0x0000'))+' colored')
end sub
## Функция реконнекта. Не используется на данный момент.
sub Reconnect()
var ReconnectTime,rFlag
ReconnectTime='0'
rFlag=1
repeat
while (uo.ObjAtLayer('Bpack')=='')
if rFlag then
ReconnectTime=MakeTime()
rFlag=0
end if
wait(20000)
uo.Say('')
wait(3000)
uo.Say('')
wait(3000)
uo.Say('')
wait(3000)
uo.LdblClick(357,164)
uo.Lclick(616,459)
wait(3000)
wend
wait(3000)
if (rFlag==0) and (ReconnectTime<>'0') then
uo.TextOpen()
uo.TextPrint('Disconnected & Reconnected @ '+ReconnectTime)
rFlag=1
ReconnectTime='0'
end if
until false
end sub
## Функция для работы Reconnect(). Не используется на данный момент.
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
end if
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
end if
next
ret=t+" @ "+d
return ret
end sub
## Функция для работы Reconnect(). Не используется на данный момент.
sub Time()
var hh,mm,ss,hms,t=str(uo.Time())
if len(t)<=2 then
hh="0"
mm="0"
ss=t
endif
if len(t)==3 then
hh="0"
mm=left(t,len(t)-2)
ss=right(t,len(t)-1)
endif
if len(t)==4 then
hh="0"
mm=left(t,len(t)-2)
ss=right(t,len(t)-2)
endif
if len(t)==5 then
hh=left(t,len(t)-4)
hms=left(t,len(t)-2)
mm=right(hms,len(hms)-1)
ss=right(t,len(t)-3)
endif
if len(t)==6 then
hh=left(t,len(t)-4)
hms=left(t,len(t)-2)
mm=right(hms,len(hms)-2)
ss=right(t,len(t)-4)
endif
return hh+":"+mm+":"+ss
end sub
## САМЫЙ ГЛАВНЫЙ ВИНОВНИК (как мне кажется) ВСЕХ КРАШЕЙ! Проверка на игроков (ПК).
sub CheckingPlayers()
VAR a, b
uo.setglobal('find','0') ## - Устанавливаем find на 0, чтобы работали все функции по вырубке.
DIM Chars[2]
Chars[0] = '0x0190' ## - Тип male.
Chars[1] = '0x0191' ## - Тип female.
while not uo.dead()
for a = 0 to 1 ## - Перебираем типы male/female.
uo.findtype(Chars[a], '-1', '1') ## - ищем вокруг себя на расстоянии finddistance.
if uo.findcount() > 0 then ## - если хоть кого-то нашли, значит пора валить.
uo.print('GTFO ASAP!!1')
uo.setglobal('find','1') ## устанавливаем find на 1.
## Теперь сработают все проверки на ПК в других функциях.
## Проверяем какая была последняя локация (С которой собираемся
## уходить) и запускаем стартер перехода на следующую.
if val(uo.getglobal('LastZone')) == 1 Then
uo.exec('exec ChangeFast2')
endif
if val(uo.getglobal('LastZone')) == 2 Then
uo.exec('exec ChangeFast3')
endif
if val(uo.getglobal('LastZone')) == 3 Then
uo.exec('exec ChangeFast4')
endif
if val(uo.getglobal('LastZone')) == 4 Then
uo.exec('exec ChangeFast5')
endif
if val(uo.getglobal('LastZone')) == 5 Then
uo.exec('exec ChangeFast6')
endif
if val(uo.getglobal('LastZone')) == 6 Then
uo.exec('exec ChangeFast1')
endif
return ## закрываем
else
wait(500)
endif
next
wend
end sub
Вот, пожалуй, и все. Надеюсь кто-нибудь сможет разобраться - я попытался объяснить все наиболее доходчиво.
Без координат на вырубку оно не заработает. Тестить такой скрипт думаю займет слишком много времени, поэтому просто вопрос в основном по CheckingPlayers(). Что в нем не так? Может кто-то видит, что тут может вызывать краш "Unhandled exception in parser"?
У меня было подозрение на слишком большой finddistance (30), но я поставил 15 и все осталось по прежнему. Менял галки в самом инжекте.
Оставлял только необходимое TUS bb-fix, No client hung message, Version 1.26.4, пробовал включать-выключать Track world items.
Также инжект работает через 1 ядро (а точней так настроены работать ylaunch и ilaunch). Пробовал включать/выключать anticrash.
Все равно падает.
Теперь есть подозрение на то, что слишком часто ведется поиск на игроков. И через время скрипт вываливается, хотя вчера он у меня проработал часа 3-4 без остановки, в итоге я не дождался краша и выключил его, пошел спать.
Еще хочу заметить, что краш происходит только в лесу. Ниразу не было краша в реколке. И из всех функций отключается только CheckingPlayers. После чего инжа не может нормально ничего делать и приходится перезапускать УО.