Yoko

All sides of Injection
It is currently 2024-04-23 15:52:04

All times are UTC+02:00




Post new topic  Reply to topic  [ 13 posts ] 
Author Message
PostPosted: 2011-01-31 12:10:25 
Offline

Joined: 2011-01-19 01:07:15
Posts: 90
Прекрасно понимаю, что разбираться в этом врядли кому-то захочется, да и кое что тут реализовано через задний проход, но вот переделанный скрипт (оригинал был версия 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. После чего инжа не может нормально ничего делать и приходится перезапускать УО.


Top
   
PostPosted: 2011-02-01 08:25:20 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
Данная ошибка часто возникает на >1 ядерных процессорах.
Вот здесь один из способов уменьшить вероятность ее словить
Нужно задать соответствие любому из ядер процессора клиенту игры.

Радиус максимально доступный игроку = 28 тайлов. Есть специально модифицированные клиенты (там пару строк поменять нужно) с расширенным углом обзора. Максимальная дистанция до статики и игроков = 28 тайлов.

Типов деревьев немного больше чем задействовано в скрипте. Хотя это может зависеть от шарда и вердаты. На нашем было 29 тайлов, у знакомых рубились 34 вида деревьев. Снять типы можно в программе InsideUO.

Так же можно попробовать уменьшить выпадение ошибки если сканер ПК не зацикливать в параллельно запущенной функции а запускать в ключевых местах как 1 разовую проверку.

Хотел спросить зачем такая сложная система разгрузки? 3 раза в цикле запускать одну и ту же функцию? Достаточно найти тип логов в паке и перемещать их пока тип есть в паке - 1 цикл.

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
PostPosted: 2011-02-01 10:53:40 
Offline

Joined: 2011-01-19 01:07:15
Posts: 90
Mirage wrote:
Данная ошибка часто возникает на >1 ядерных процессорах.
Вот здесь один из способов уменьшить вероятность ее словить
Нужно задать соответствие любому из ядер процессора клиенту игры.

Радиус максимально доступный игроку = 28 тайлов. Есть специально модифицированные клиенты (там пару строк поменять нужно) с расширенным углом обзора. Максимальная дистанция до статики и игроков = 28 тайлов.

Типов деревьев немного больше чем задействовано в скрипте. Хотя это может зависеть от шарда и вердаты. На нашем было 29 тайлов, у знакомых рубились 34 вида деревьев. Снять типы можно в программе InsideUO.

Так же можно попробовать уменьшить выпадение ошибки если сканер ПК не зацикливать в параллельно запущенной функции а запускать в ключевых местах как 1 разовую проверку.

Хотел спросить зачем такая сложная система разгрузки? 3 раза в цикле запускать одну и ту же функцию? Достаточно найти тип логов в паке и перемещать их пока тип есть в паке - 1 цикл.


Отлично! Спасибо за советы, попробую.

Я думал надо задавать соответствие инжектолаунчеру. Обязательно попробую с клииентом.

По поводу угла обзора - это про разрешение? Оно увеличено, но я знаю, что эти 28 тайлов зависят от сервера. Спасибо за точную цифру, буду знать.

По поводу типов деревьев тоже посмотрю, но врядли это вызывает краш, скорее наоборот. Вердата у меня стоит где все деревья = пеньки. Не знаю влияет ли это на инжект.

Вот по поводу проверки на ПК - тоже об этом думал. Наверное крашей станет в разы меньше, т.к. будет, соответственно, меньше проверок и запросов на findtype. Но бывает приятно, когда чар бежит от дерева к дереву, и на ходу реколится от ПК, если вдруг кто-то выскакивает :) Так бы он дожидался следующего шага. Как вариант тоже попробую, если не поможет соответствие с ядрами на клиенте.

Честно говоря это мой первый блин, который вышел комом. Система разгрузки, вроде бы, была такая в оригинальном скрипте - я её не изменял. Проверил, работает, оставил как есть. Из-за неё ниразу не крашило. Сегодня ночь провел за вспоминанием LUA (еще со времен ворлд оф варкрафта) и мучаньем различными командами OpenEUO. Заодно потихоньку сел переписывать одну за другой функции, все по порядку... Переделал схему, по которой все зациклено, додумал многое другое, да и вообще поаккуратней сделал :) Более универсально. Пока только ходилку сделал с жалкими попытками обойти препятствия (которые, кстати, проходятся на ура, но, к примеру, из дома выйти не может. Тем не менее UO.Move(x,y,погрешность,таймаут) в Изи очень здорово. Думаю вот сделать проверку если не может с мувом - чтоб юзал pathfinding.).

Так что вот так. Попробую еще помучать этот скрипт на инже, может заодно почищу его. Начну, пожалуй, с соответствия.


Top
   
PostPosted: 2011-02-01 11:51:07 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
Комом это когда не работает. А так - просто оптимизация кода ;)
У меня выгрузка сделана следующим образом:
Code:
;put(log,logcont) ; скинуть тип логов в сундук

Sub PUT(item, cont) ; (type, ID)
   while UO.Count( item ) > 0
      UO.FindType( item, -1, -1 )
                itemM=UO.GetSerial('finditem')
                timemove=UO.Timer()
            UO.MoveItem( 'finditem', 0, cont )
                while UO.ContainerOf(itemM)=='my' && timemove+20>UO.Timer()
                    wait(300)
                wend
   wend
end sub

А насчет типов деревьев - если будут учтены все типы то рубить больше деревьев будет.

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
PostPosted: 2011-02-01 13:33:05 
Offline

Joined: 2011-01-19 01:07:15
Posts: 90
Mirage wrote:
Комом это когда не работает. А так - просто оптимизация кода ;)
У меня выгрузка сделана следующим образом:
Code:
;put(log,logcont) ; скинуть тип логов в сундук

Sub PUT(item, cont) ; (type, ID)
   while UO.Count( item ) > 0
      UO.FindType( item, -1, -1 )
                itemM=UO.GetSerial('finditem')
                timemove=UO.Timer()
            UO.MoveItem( 'finditem', 0, cont )
                while UO.ContainerOf(itemM)=='my' && timemove+20>UO.Timer()
                    wait(300)
                wend
   wend
end sub

А насчет типов деревьев - если будут учтены все типы то рубить больше деревьев будет.


Да, я уловил суть еще в том посте - так, конечно же, логичней. Сейчас пока вроде не крашит, пробую старый скрипт.

Но т.к. потратил прилично времени на изю - очень хочется заставить её работать. Я обращаюсь командами через клиент (UO.Msg в изи) к инжекту, чтобы выполнять различные действия, записывать объекты, реколиться по руне в банке, рубить деревья. Но очень сильно мешает антифлуд, встроенный в клиент. Не знаешь, может можно как-то выключить его?

Или может есть способ использовать команды инжекта из изи по другому?
На данный момент у меня это выглядит так:

UO.Msg(",addobject HomeRune"..HomeRuneID.."; addobject axe"..string.char(13))
while UO.TargCurs == true do
wait(100)
end

Одной строчкой добавляет объект с айди домашней руны и добавляет топор, потом ждет, пока игрок не выберет его.

Я бы сделал все мне необходимое через ";", но в ультиме ограничение на количество символов, в одной строчке :(

А задержки делать по 2 сек тоже как-то некошерно.

Еще раз извиняюсь, что совсем с другим вопросом.

З.Ы. - пока еще не крашнуло.


Top
   
PostPosted: 2011-02-01 19:17:48 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
Вот тут тема GMX. Он там придумал нормальное обхождения антимаксроса на Абиссе. Я к сожалению такими вопросами не занимался ибо не играл на таких шардах и лень было просто так заморачиваться :roll:

Антифлуд обойти никак не получится если сфера либо 56b, либо на <56b прописаны нормальные скрипты со стороны сервера.

Топор прописывается по универсальному типу - у него может быть всего 2 типа.
Code:
;********************************
var axe1='0x0F43', axe2='0x0F44'
  ; Auto Tools
    if UO.Count(axe1) || UO.Count(axe2) then
     if UO.Count(axe1) then
      UO.UseType(axe1)
     else
      UO.UseType(axe2)
    endif
    else
 UO.Set('quiet','0')
    UO.Print('А топора то нет!')
     return
    endif
;********************************



В изе можно запускать максрос с нажатия кнопки (топорный метод но в принципе...)

Code:
 Initevents

start:
Move 5958 1432 0 10s
 gosub F
Move 5958 1433 0 10s
 gosub F
Move 5957 1433 0 10s
 gosub F
goto start:

sub F
deletejournal
{
key F11
wait 1S
{
repeat
wait 1S
scanjournal 1
until END in #journal
}
}
return

На F - хоткей exec lumber например, в конце рубки чар пишет в uo.print('END'). Принт журналом отлавливается и цикл в изе перещелкивается. Хотя в изе сам ламбер пишется вроде даже лучше чем на инжекте (с ее встроенной pathfind 5958 1432 ).

А еще если делать в инжекте то мне всегда больше нравилось не тыкать в каждое дерево а искать их через uo.privategettile. Вот примерно такая функция вырубит все окружающие деревья до которых дотянется чар. И надо пометить только координаты где будет стоять чар (сокращения раз в 7 количества точек)

Code:

var allmsg='0xA20D|0xA2DE|0xA2E7|0xA308|0xA309|0xA30D|0xA311|0xA312|ы положили|nothing|ou put|ы ударили по дереву|ou hack at the tree|ут нечего рубить|no logs|ы не можете до этого достать|ou can|reach this|ерево слишком далеко|hat is too far away|do much|то кажется свободным для вашего удара|t appears immune to your blow|атакует'
var endmsg='0xA20D|0xA2DE|0xA2E7|0xA308|0xA309|0xA30D|ут нечего рубить|nothing|no logs|ou can|ы не можете до этого достать|ерево слишком далеко|too far away|свободным для вашего удара'
var axe1='0x0F43', axe2='0x0F44'
sub Lumder()
   var X, Y, MaxRange = 3, MaxVes = 620, k = 0
   for Y = -MaxRange to MaxRange
      for X = -MaxRange to MaxRange
         if Tree(UO.GetX()+X, UO.GetY()+Y) then
            repeat
               UO.DeleteJournal()
               wait(100)
               UO.WaitTargetTile(Tree(UO.GetX()+X, UO.GetY()+Y), UO.GetX()+X, UO.GetY()+Y, UO.GetZ())
               ;ToHide()
               ;********************************
               ; Auto Tools
               if UO.Count(axe1) || UO.Count(axe2) then
                  if UO.Count(axe1) then
                     UO.UseType(axe1)
                  else
                     UO.UseType(axe2)
                  endif
               else
                  UO.Print('А топора то нет!')
                  return
               endif
               ;********************************
               repeat
                  wait(100)
               until UO.InJournal(allmsg)
               If UO.Weight > MaxVes Then
                  UO.Print('Перегруз!')
                  return 0
               endif
            until UO.InJournal(endmsg)
         endif
      next
   next
   return 0
end sub
Sub Tree(X,Y)
   var i
   DIM  R[34]
   R[1] = 3274;
   R[2] = 3275;
   R[3] = 3276;
   R[4] = 3277;
   R[5] = 3280;
   R[6] = 3283;
   R[7] = 3286;
   R[8] = 3288;
   R[9] = 3290;
   R[10] = 3293;
   R[11] = 3296;
   R[12] = 3299;
   R[13] = 3302;
   R[14] = 3320;
   R[15] = 3323;
   R[16] = 3326;
   R[17] = 3329;
   R[18] = 3393;
   R[19] = 3394;
   R[20] = 3395;
   R[21] = 3396;
   R[22] = 3415;
   R[23] = 3416;
   R[24] = 3417;
   R[25] = 3418;
   R[26] = 3419;
   R[27] = 3438;
   R[28] = 3439;
   R[29] = 3440;
   R[30] = 3441;
   R[31] = 3442;
   R[32] = 3460;
   R[33] = 3461;
   R[34] = 3462;
   for i = 1 to 34
      if uo.privategettile( x, y, -1, R[i], R[i]) then
         return R[i]
      endif
   next
   return false
end sub

Но это мое ИМХО.

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
PostPosted: 2011-02-03 11:23:20 
Offline

Joined: 2011-01-19 01:07:15
Posts: 90
Да, один из чаров уже взял 90+ ламбера, буду на нем сегодня тестить антимакро от GMX :) Спасибо.

С антифлудом уже понял. Плюнул на изиуо, понял, что инжа больше не крашит (какое офигенное чувство), и решил за вечер переписать скрипт по аналогии с предыдущими с нуля. Теперь вроде ничего лишнего, прикрутил твою разгрузку, организовал работу всего двух потоков:
Main, Checkingplayers. В мейн вызываются все основные функции, инициализация, старт, потом основной луп со сменой локаций. И там банально проверки на глобальный флаг (как ты и говорил), который изменяется в checkingplayers при нахождении пк. пока этот флаг = 1 (т.е. пк нашелся) в чекинг плеерс идет бесконечный луп, с вейтом. Потом в итоге основная часть скрипта возвращает значение в 0 и можно продолжать рубить-копать и дальше искать пк :)

Попробую прикрутить антимакрос и интегрировать реконнектер получше, чтобы скрипт останавливался на том же месте.

Еще хочу создать какой-то файл типа "для памяти" (реестр засорять не хочу) - чтоб скрипт запоминал где он последний раз рубил и его можно было безболезненно перезапустить :)

Топор я специально использую не по типу на случай, если буду рубить плюсовыми топориками. И это в каком-то роде небольшая пауза перед тем, чтобы скрипт самовольно никуда не улетел. Конечно, топорик можно оставлять всего 1 в паке и тогда оно будет его и использовать, но я не знаю ломаются ли тут некоторые топоры. Если так, то таргет все равно нужен будет, чтобы брать тип и цвет топора, а потом делать автодобор.

Про макрос с кнопки не понял, запутался :( Я писал на openeuo, там LUA, а не старый язык изи. Но это уже неважно. Спасибо в любом случае :) Move в изиуо и правда крутой.

А вот по поводу uo.privategettile - чистейшей воды вин! Хочу попробовать. Только сразу придумалось, чтобы чар как-то сканировал не только ограниченный круг вокруг себя, а весь экран и как-то сортировал координаты тайлов-деревьев и потом бежал уже по ним, чтобы вырубать. Вот бы продумать как такое сделать, чтобы чар как-то нормально по очереди вырубал то, что видит на экране, потом переходил на следующий, еще дальше и так вырубал по несколько квадратов (1 квадрат = 4 экрана). В итоге достаточно было бы просто замарчить несколько рун в глуши.


Top
   
PostPosted: 2011-02-03 11:50:05 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
MaxRange = 3 - радиус поиска.
Чуть изменить вышеприведенный скрипт он сперва сканил теже 28 тайлов, если тайл совпадает с заданным и расстояние больше 1 тайла то чар перемещается к объекту. Если чар за отрезок времени не может подойти к объекту переходит к следующему.
Можно попробовать.

PS гдето на форуме был пример помечалки деревьев таким принципом, чар бегал по большому квадрату в несколько экранов и собирал все тайлы стволов, Потом уже по координатам ходил и рубил. Точно такая тема была на форуме стелс-клиента.

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

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
PostPosted: 2011-02-03 12:03:27 
Offline

Joined: 2011-01-19 01:07:15
Posts: 90
Попробую разобраться. Если что, то и правда запишу просто координаты куда бегать. Не подскажешь кстати, чем удобней записывать именно координаты? просто по вызову функции записывать настоящие координаты чара или таргетом кликать каким-то?

По координатам чара как-то надежней выглядит. наверное так и попробую.

Да паскаль и в школе и в универе был, разобраться не составило бы труда, но стелс клиент не работает на абиcce. у меня инжект вроде переделанный, который от Грина. там прикручена crypt.dll. только так получается законнектится. а стелс клиент не работает. я написал там на форуме, чтоб помогли разобраться, отозвался один из девелоперов, сказал, что через месяц приедет - тогда если будет время посмотрит.

Правда еще минус у стелса - гмы. На абиcce летают гмы и проверяют на ненаблюдаемых макросеров. Приходится следить и отвечать в случае чего. Потому что мейнам за это сроки дают.


Top
   
PostPosted: 2011-02-18 00:37:45 
Offline

Joined: 2011-01-19 01:07:15
Posts: 90
Мираж, не подскажешь в чем тут может быть проблема?

Code:
sub CheckingPlayers() # Проверка на игроков (ПК).
      VAR a, b, c
      uo.exec('set finddistance 30')
      uo.setglobal('find',0) ## - Устанавливаем find на 0, чтобы работали все функции по вырубке.
      uo.setglobal('PKCheck',0)
      DIM Chars[2]
      Chars[0] = '0x0190' ## - Тип male.
      Chars[1] = '0x0191' ## - Тип female.
      while not uo.dead()
;         while val(uo.getglobal('PKCheck')) == 1
           if uo.injournal(gtfomsg) then
            uo.print("Found GTFOMSG.")
            uo.setglobal('find','1') ## устанавливаем find на 1.
            ## Теперь сработают все проверки на ПК в других функциях.
            while val(uo.getglobal('find')) == 1
               wait(500)
            wend
           endif
           if uo.GetHP('self') < uo.GetMaxHP('self') then
            uo.print("Found low HP oO")
            uo.setglobal('find','1') ## устанавливаем find на 1.
            ## Теперь сработают все проверки на ПК в других функциях.
            while val(uo.getglobal('find')) == 1
               wait(500)
            wend
           endif
            for a = 0 to 1 ## - Перебираем типы male/female.
               uo.findtype(Chars[a], '-1', '1')  ## - ищем вокруг себя на расстоянии finddistance.
               if uo.findcount() > 0 then ## - если хоть кого-то нашли, значит пора валить.
                  UO.Click('finditem')
                  CheckLag()
                  if uo.injournal("You see|GM") or uo.injournal('You see|Admin') or uo.injournal('You see|Seer') or uo.injournal('You see|Counselor') or uo.injournal('You see|Developer') then
                     uo.deletejournal()
                     uo.print("FFFFUUUUU GM!!!1")
                     uo.playwav(FilePath+"ringout")
                     wait(1500)
                     UO.Click('finditem')
                     uo.playwav(FilePath+"ringout")
                     wait(1500)
                  else
                     if UO.GetNotoriety('finditem') > 3 then
                        uo.print("GTFO ASAP!!1")
                        uo.setglobal('find','1') ## устанавливаем find на 1.
                        ## Теперь сработают все проверки на ПК в других функциях.
                        while val(uo.getglobal('find')) == 1
                           wait(500)
                        wend
                     endif
                  endif
               else
                  wait(200)
               endif
            next
;         wend
         wait(500)
      wend
end sub


Оно отвечает за детект ПК, гмов, уменьшения хп или сообщения об атаке:

Code:
var gtfomsg="attacking you*|blade spirit|energy vortex|elemental|Kal Vas|Vas Corp|In Vas Por|Flam Kal|Ort Sanct|In Sanct Grav|Vas Ort Grav|Wis Quas|In Ex Grav|Vas Ort Flam|Corp Por|Kal Xen|An Ex Por|Por Corp Wis|Kal In Ex|In Jux Hur|Ort Rel|Por Ort Grav|An Mani|In Flam Grav|In Sanct Ylem|In Nox|Vas Flam|In Por Ylem|[criminal]"


TWI включен. Все работает, но иногда почему-то не уходит от красных игроков, хотя стоит проверка на notoriety > 3. Иногда уходит, иногда нет.

По уменьшению хп уходит всегда. На гмов пищит всегда (хотя иногда пищит совсем не в тему, когда кто-то, например, качает алхимию неподалеку или еще что-то). Думаю пищалка на гмов глючит из-за uo.injournal("You see|GM"), всмысле из-за част с You see, но почему-то просто на GM, Seer и т.д. срабатывало криво, а сейчас лучше гораздо. Притом когда просто кто-то появляется - оно не срабатывает. А вот если кто-то спамит скиллы - срабатывает.

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


Top
   
PostPosted: 2011-02-18 10:15:54 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
Заметил интересную штуку про которую видимо знает очень мало народу.
Code:
sub test1()
    var msg='rock|You see|Admin'
    uo.deletejournal()
    repeat
        if uo.injournal( msg ) then
            return
        endif
        wait(1000)
    until uo.dead()
end sub

Запускаем этот скрипт. Кликаем в 4 предмета:
1) стул (You see: стул)
2) НПС Вася (You see: Вася)
3) тайл с камнем (You see: rock)
4) НПС Admin (You see: Admin)

Скрипт останавливается только в последнем случае. Вывод лога журнала подтвердил подозрения:
1) надпись You see не логируется журналом и не распознается
2) тайлы статики расставленные не админами так же не распознаются через журнал (хотя в нем присутствуют)
Соответственно проверку нужно делать только на ники либо на названия вещей установленных игроками либо админами.

Следующий момент

Code:
sub test2()
    var msg='GM|Admin|Seer|Counselor|Developer'
    var ID = '0x00CA24F4' ; ID чара по имени Admin
    uo.deletejournal()
    repeat
        if uo.injournal( msg ) and uo.JournalSerial(msg) == ID then
            return
        endif
        wait(1000)
    until uo.dead()
end sub

Проверка сработает только на чара с ником Admin с соответствующим ID. Что приводит к следующим выводам:
1) плохо то что когда ты видишь кого то в журнале и тебе пишут "You see: Admin" серийник этого сообщения не равен системным сообщениям. Он равен ID чара чей ник высвечивается.
2) нужно отловить ID стафа и переписать их в проверку чтобы тот же Вася бегая вокруг чара на скрипте не сбивал его крича "GM Admin Seer СДОХНИ СЦУКО!!!"
3) можно сделать проверку на uo.getnotoriety через uo.JournalSerial

PS я как то ваял от нечего делать вот такую штуку, может пригодится
Code:
sub main1()
var i, player
  uo.Ignore('self')
DIM people[2]
 people[1]='0x0190'
 people[2]='0x0191'
UO.set('finddistance','24')
for i=1 to 2
  UO.FindType(people[i],-1,'ground')
  while UO.FindCount() > 0
    player = uo.GetSerial('finditem')
      if uo.getnotoriety(player) <> 6 then
      uo.hide(player)
      uo.ignore(player)
       Wait( 300 )
       Endif
   uo.click(player)
   uo.ignore(player)
UO.FindType(people[i],-1,'ground')
wend
next
uo.ignorereset()
uo.resend()
end sub


sub main2()
var i, player
uo.Ignore('self')
DIM people[2]
 people[1]='0x0190'
 people[2]='0x0191'
UO.set('finddistance','24')
for i=1 to 2
  UO.FindType(people[i],-1,'ground')
  while UO.FindCount() > 0
    player = uo.GetSerial('finditem')
      if uo.getnotoriety(player) == 6 then
      uo.click(player)
       else
       Wait( 300 )
       Endif
   uo.ignore(player)
  UO.FindType(people[i],-1,'ground')
  wend
next
uo.ignorereset()
uo.resend()
end sub

Попробуй это на рынке запустить где присутствуют чары всех направлений.

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
PostPosted: 2011-02-19 20:14:46 
Offline

Joined: 2011-01-19 01:07:15
Posts: 90
Вот оно как. Появилось несколько соображений на этот счет. Может лучше будет теперь определять.

Недавно прилетел гм на проверку, благо я заметил, но почему-то проверка моя с You see|GM не сработала. Хотя до этого работала. Попробую убрать You see.

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

Проверка на касты, на attacking you и на уменьшение хп. Если они кастуют что-то плохое - чар улетает. Если хп уменьшается - чар улетает. В первом случае пк офигевают, когда скрипт улетает при виде por ort grav. Вылазят из стелса с кастом и скрипт тут же улетучивается. Во втором случае пк офигевают, когда всаживают на -80 из стелса, а чар на скрипте реколится до того, как они успевают прожать лайт или что-нибудь еще. Если к этому делу добавить инвизки, то вообще может быть шикарно.

У меня проверка специально на красных. Обычно если бежит серый крим или красный пк, то они точно будут убивать. Поэтому чар сваливает не раздумывая. Если в итоге кто-то подберется близко, спамя GM или что-то еще, то чар все равно улетит, т.к. скрипт не сбивается, а продолжает поиск пк. Улетит по хп или по касту.

Одна проблема - getnotoriety у меня глючит. Поэтому и спросил делать ли через журнал. В твоем последнем примере используется getserial('finditem'), и уже от этого значения getnotoriety. Так лучше? Надо попробовать. У меня все-таки напрямую. Тоже срабатывает, но иногда почему-то не хочет.


Top
   
PostPosted: 2011-02-19 22:51:46 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
uo.JournalSerial(msg) = ID чара или вещи с именем из журнала.
Получил ID - можно использовать if uo.getnotoriety(ID) == 6 then

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


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

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 6 guests


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