Page 2 of 3

Re: Как перезаписать последний труп ?

Posted: 2014-03-15 07:00:05
by Mirage
у всех трупов тип один "0x2006" - он в скрипте присутствует. Другое дело в скрипте Incorrect User нет некоторых условий которые превратят его частнослучный скрипт в универсальный.
1) не учитываются кости людей, это пофигу - не режте просто. Но для ПВП все таки не очень хорошо.
2) пауза после открытия трупа - минимум 300 а лучше 500.
3)

Code: Select all

 uo.moveitem("finditem", 0, "backpack")
               wait(100)

так можно делать только на 55 и раньше сфере. В новой 56 и рануо вшита пауза минимальная 300 секунд. Соответственно минимум 300 а лучше 500. А еще лучше проверку на перемещение предмета, но это много строк.
4) uo.print("Закончил!") лучше заменить на uo.charprint('self', '1069', 'Закончил!') красивее, виднее и менее падуче.

Получится правда слегка громоздко зато универсально.

Re: Как перезаписать последний труп ?

Posted: 2014-03-15 10:48:11
by Incorrect User
Mirage wrote:1) не учитываются кости людей, это пофигу - не режте просто.

У меня с резкой всё ок.

Re: Как перезаписать последний труп ?

Posted: 2014-03-15 11:48:47
by some
видео в лс отправил

Re: Как перезаписать последний труп ?

Posted: 2014-03-15 23:10:57
by Incorrect User
Mirage wrote:2) пауза после открытия трупа - минимум 300 а лучше 500.
3)

Code: Select all

 uo.moveitem("finditem", 0, "backpack")
               wait(100)

так можно делать только на 55 и раньше сфере.

1 - 200 хватает
2 - с задержкой 100 лутает без всяких крашей, сам удивился когда тестил подбирая задержку, походу в новых версиях инжи что-то с мувитем намутили, но что не падает - факт. Скрипт проверен, все в нем рабочее, и собственно у автора проблемы были не из за моего скрипта, а из за своих косяков с чем уже разобрались.

Re: Как перезаписать последний труп ?

Posted: 2014-03-29 17:01:48
by kobol

Code: Select all

uo.findtype(-1, -1, box)
            if uo.findcount() and not Instring(uo.getgraphic("finditem"), notake) then
               uo.moveitem("finditem", 0, "backpack")
               wait(100)
            else
               if uo.findcount() then
                  uo.ignore("finditem")
               end if
               if not uo.findcount() then
                  find = 0
               end if
               wait(100)
            end if
         until find == 0



А почему будет быстрее по сравнению с поиском по конкретному типу?
Если мы задаем uo.findtype(-1, -1, box), то это значит, что будут искаться вообще все вещи. И если вещей 50, то и крутится цикл будет 50 раз, потому что все равно находит по одной вещи.
А если нам нужна вещь MyType и мы зададим uo.findtype(MyType, -1, box) и таких вещей всего 10 из 50, то цикл будет крутиться только 10 раз. И без поиска подстроки Instring(uo.getgraphic("finditem"), notake).

Re: Как перезаписать последний труп ?

Posted: 2014-03-29 17:25:08
by kobol
Что-то уже глаз замылился, не вижу ошибки.
Скрипт отрабатывает 1 раз нормально, из списка запущенных функций исчезает.
Но если после этого вручную потаскать вещи обратно на труп - вылетает неисправимая ошибка (или как там) и предлагает закрыть UO.
Вплоть до ошибки в какой-то dll. Такое впечатление, что в памяти что-то остается и продолжает крутить.

Code: Select all

####
# based on "Loot script"  by Incorrect User, 2014, http://forum.yoko.com.ua/viewtopic.php?f=17&t=17411&hilit=0x2006#p96654
# modified by Kobol, March2014
var clr=38, clo=43, cly=53, clg=63, clb=3, cla=89, clda=83, clp=120 , clgr=1088, clw=1156, cldg=1162
# красный   - "38" или "0x0026"  # темно-бирюзовый - "83" или "0x0053"
# оранжевый - "43" или "0x002B"  # голубой    - "89"  или "0x0059"
# желтый    - "53" или "0x0035"  # синий      - "3"   или "0x0003"
# зеленый   - "63" или "0x003F"  # фиолетовый - "120" или "0x0078"
# "1088" - по умолчанию
# 1152 - бирюзовый 1151 - черный 1155 - фиолетовый 1156 - белый  1158 - кр 1161 - синий 1162 - темно зел 1166 ткр 1169 сз
# 2500 2524 - оранж  2517 кр 2567 малин 2566=0x0A06 белый
#  2998 - белый 3008 3221 3600 и выше - контур
###########################################
sub LootMinoc()
   var box, i, itemT, dist  ;, find = 1
   dim Nado[10]
   Nado[0] = "0x0F91"   ; wyrms hearts
   Nado[1] = "0x0F78"   ; batwings   
   Nado[2] = "0x0F87"   ; eyes of newt
   Nado[3] = "0x0F0E"   #bottle
   Nado[4] = "0x0df2"   #wand
   Nado[5] = "0x0df3"   #wand
   Nado[6] = "0x0df4"   #wand
   Nado[7] = "0x0df5"   #wand
   Nado[8] = "0x0EED"  #gold
   Nado[9] = "0x09F1"   # test meat
   
   uo.ignorereset()
   
   
   
   repeat  ; запускаем цикл поиска трупов <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      uo.findtype("0x2006", -1, "ground", 4) ;0x2006 ищем трупы по округе
      uo.charprint("0x09DC","Corpse num="+str(uo.findcount())) ; количество найденых
      
      If UO.FindCount() > 0 Then ; если нашли, то
         box = uo.getserial("finditem"); берем его сериал
         uo.charprint("0x09DC","Corpse ser="+box)
         wait (10)
         
         dist=UO.GetDistance("finditem") ; определям дистанцию до трупа
         uo.charprint("0x09DC","distance="+str(dist))
         wait (10)
         
         if dist <3 then ;" если до трупа дотянуться
            
            uo.useobject(box) ; открываем труп
            wait(300)
            
            repeat ; запускаем цикл поиска вещей на трупе ==------------------------------------==
               
               uo.findtype(-1, -1, box) ; ищем на трупе все подряд
               
               if uo.findcount()  then  ; "если труп не пустой
                  itemT=uo.getgraphic("finditem") ; берем тип того, что нашли
                  for i=0 to 9 ; сравниваем с нужными нам типами
                     ;uo.charprint("0x09D2","2. Nado T="+(Nado[i]))
                     ;uo.charprint("0x09D3","2. It T="+itemT)
                     ;wait(50)
                     if itemT==Nado[i] then ; если совпадает, то забираем себе
                        uo.moveitem("finditem", "-1", "backpack")
                        wait(600)
                     else
                        uo.ignore("finditem") ; если вещь не нужна - в игнор
                     end if
                     wait(5)
                  next
                  
                  wait(50)
               else ;" если в трупе пусто
               end if
            until not uo.findcount() ; ==------------------------------------==
         end if
         uo.ignore(box) ; закончили с трупом - в игнор его
      else
         box = 0
      end if
      wait (50)
   until box == 0 ; трупов больше нет  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   uo.ignorereset()
   wait (150)
   uo.charprint("0x09D4","Finished!")
end sub



Re: Как перезаписать последний труп ?

Posted: 2014-03-29 17:37:35
by kobol
Вот по обычной схеме, вроде не крашит. (YokoInjection 702.11 PaWn)
На задержку после uo.moveitem 500 - ругается, не 600 - уже нет ;) (DRW)

Code: Select all

####
# based on "Loot script"  by Incorrect User, 2014, http://forum.yoko.com.ua/viewtopic.php?f=17&t=17411&hilit=0x2006#p96654
# modified by Kobol, March2014
var clr=38, clo=43, cly=53, clg=63, clb=3, cla=89, clda=83, clp=120 , clgr=1088, clw=1156, cldg=1162
# красный   - "38" или "0x0026"  # темно-бирюзовый - "83" или "0x0053"
# оранжевый - "43" или "0x002B"  # голубой    - "89"  или "0x0059"
# желтый    - "53" или "0x0035"  # синий      - "3"   или "0x0003"
# зеленый   - "63" или "0x003F"  # фиолетовый - "120" или "0x0078"
# "1088" - по умолчанию
# 1152 - бирюзовый 1151 - черный 1155 - фиолетовый 1156 - белый  1158 - кр 1161 - синий 1162 - темно зел 1166 ткр 1169 сз
# 2500 2524 - оранж  2517 кр 2567 малин 2566=0x0A06 белый
#  2998 - белый 3008 3221 3600 и выше - контур
###########################################
sub LootMinoc()
   var box, i, itemT, dist  ;, find = 1
   dim Nado[10]
   Nado[0] = "0x0F91"   ; wyrms hearts
   Nado[1] = "0x0F78"   ; batwings   
   Nado[2] = "0x0F87"   ; eyes of newt
   Nado[3] = "0x0F0E"   #bottle
   Nado[4] = "0x0df2"   #wand
   Nado[5] = "0x0df3"   #wand
   Nado[6] = "0x0df4"   #wand
   Nado[7] = "0x0df5"   #wand
   Nado[8] = "0x0EED"  #gold
   Nado[9] = "0x09F1"   # test meat
   uo.ignorereset()
   repeat  ; запускаем цикл поиска трупов <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      uo.findtype("0x2006", -1, "ground", 4) ;0x2006 ищем трупы по округе
      uo.charprint("0x09DC","Corpse num="+str(uo.findcount())) ; количество найденых
      If UO.FindCount() > 0 Then ; если нашли, то
         box = uo.getserial("finditem"); берем его сериал
         uo.charprint("0x09DC","Corpse ser="+box)
         wait (10)
         dist=UO.GetDistance("finditem") ; определям дистанцию до трупа
         uo.charprint("0x09DC","distance="+str(dist))
         wait (10)
         if dist <3 then ;" если до трупа дотянуться
            uo.useobject(box) ; открываем труп
            wait(300)
            for i=0 to 9 ; сравниваем с нужными нам типами
               
               repeat ; запускаем цикл поиска вещей на трупе ==------------------------------------==
                  
                  uo.findtype(Nado[i], -1, box) ; ищем на трупе нужную вещь
                  
                  if uo.findcount()  then  ; "если труп не пустой
                     uo.moveitem("finditem", "-1", "backpack")
                     wait(600)
                     
                  else ;" если в трупе пусто
                  end if
               until not uo.findcount() ; ==------------------------------------==
            next
         end if
         uo.ignore(box) ; закончили с трупом - в игнор его
      else
         box = 0
      end if
      wait (50)
   until box == 0 ; трупов больше нет  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   uo.ignorereset()
   wait (150)
   uo.charprint("0x09D4","Finished!")
end sub


Re: Как перезаписать последний труп ?

Posted: 2014-03-29 18:28:51
by Incorrect User
kobol wrote:А почему будет быстрее по сравнению с поиском по конкретному типу?
Если мы задаем uo.findtype(-1, -1, box), то это значит, что будут искаться вообще все вещи. И если вещей 50, то и крутится цикл будет 50 раз, потому что все равно находит по одной вещи.


Правильно, 50 раз в любом случае, и нашел или не нашел вешь а проверять будет, например в трупе 5 итемов, а findtype будет включаться 50 раз хотя нужно всего 5. А так ищем все подряд, что нашли то забрали, сколько итемов в контейнере есть столько раз будет файндтайп использоваться + 1 последний раз когда ничего не найдет и скрипт офнется.

Re: Как перезаписать последний труп ?

Posted: 2014-03-29 18:34:45
by Incorrect User
Вообще сейчас скрипт на лут выглядит так

Code: Select all

sub Loot()
   var box
   uo.selectignorelist("NoTake")
      uo.findtype("0x2006", -1, "ground", 2)
      if uo.findcount() then
         box = uo.getserial("finditem")
         uo.useobject(box)
         wait(200)
         repeat
            uo.findtype(-1, -1, box)
            if uo.findcount() then
               uo.moveitem("finditem", 0, "backpack")
               wait(1600)
            end if
         until not uo.findcount()
         uo.ignore(box)
      end if
   uo.playwav("Alarm")
   uo.print("Закончил!")
end sub

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

Re: Как перезаписать последний труп ?

Posted: 2014-03-29 20:48:55
by kobol
Incorrect User wrote:
kobol wrote:А почему будет быстрее по сравнению с поиском по конкретному типу?
Если мы задаем uo.findtype(-1, -1, box), то это значит, что будут искаться вообще все вещи. И если вещей 50, то и крутится цикл будет 50 раз, потому что все равно находит по одной вещи.


Правильно, 50 раз в любом случае, и нашел или не нашел вешь а проверять будет, например в трупе 5 итемов, а findtype будет включаться 50 раз хотя нужно всего 5. А так ищем все подряд, что нашли то забрали, сколько итемов в контейнере есть столько раз будет файндтайп использоваться + 1 последний раз когда ничего не найдет и скрипт офнется.


А, у в смысле, когда в трупе мало типов вещей, а проверять надо много типов. Тогда да )
А когда наоборот, тогда выгоднее искать заданные типы.
Ну можно делать проверку
uo.findtype(-1, -1, box)
if uo.count()< числа лутаемых типов, тогда брать все, а если нет, тогда искать по типам.

Re: Как перезаписать последний труп ?

Posted: 2014-03-29 20:51:43
by kobol
Incorrect User wrote:Вообще сейчас скрипт на лут выглядит так

Code: Select all

..............

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


Эх, это в новой инже. Не по теме конечно, а как лучше на нее перейти? У меня мультиклиент и ylaunch. Настройки надо руками перебивать или новый лончер втянет настройки? И как откатиться если что?

Re: Как перезаписать последний труп ?

Posted: 2014-03-29 21:21:50
by Incorrect User
В новом инжекте настройки хранятся в другом файле, по него просто новую папку сделай и туда его пихай.

Re: Как перезаписать последний труп ?

Posted: 2014-03-29 21:24:52
by Incorrect User
kobol wrote:А когда наоборот, тогда выгоднее искать заданные типы.

Чем выгоднее, если тебе нужно брать все подряд итемы кроме тех что в игноре?) Если у него пол пака шлака то твой скрипт и будет крутить весь цикл на 50 раз и пока будешь искать кто-то другой полутает всё до тебя)

Re: Как перезаписать последний труп ?

Posted: 2014-03-29 21:44:59
by kobol
Incorrect User wrote:
kobol wrote:А когда наоборот, тогда выгоднее искать заданные типы.

Чем выгоднее, если тебе нужно брать все подряд итемы кроме тех что в игноре?) Если у него пол пака шлака то твой скрипт и будет крутить весь цикл на 50 раз и пока будешь искать кто-то другой полутает всё до тебя)


Нет. Если у него 45 шлака + 5 нужных, то искать по типу будет только 5 раз.
Если у него 50 шлака а тебе нужен 1 тип, то он будет искать 1 тип 1 раз и потом выйдет из цикла.
А если задать -1 в типе, то он будет искать все 50 раз и проверять их на соответствие нужному тебе типу.

Re: Как перезаписать последний труп ?

Posted: 2014-03-29 23:00:34
by Incorrect User
kobol wrote:Нет. Если у него 45 шлака + 5 нужных, то искать по типу будет только 5 раз.

Ты внимателнее читай, у тебя массив на 50 нужных тебе предметов, в трупе из этих 50 будет всего 5 но искать тебе нужно всё те же 50. Если массив на 5 то и искать будет 5 это понятно но говорили мы не об этом если что :wink: а о том почему плохо использовать поиск по массиву.

Обьясню подробнее, если предметов великое множество, типы от оружия до ресурсов то представь какой массив на всё это нужно расписать и как долго он все это будет искать. В новом инжекте есть такая функция FindList, создаешь список типов которые нужно искать и он ищет все одновременно за один раз а не по очереди как массив, но и тут для большого количества расписывать каждый тип слишком напряжно, проще заигнорить то что не нужно брать и смело лутать все остальное. FindList удобно использовать когда тебе нужно найти исключительно определенные итемы и их не особо много, за одну проверку ты ищешь все типы сразу. В общем для лута массив в любом случае не актуален.

Re: Как перезаписать последний труп ?

Posted: 2014-03-30 12:37:50
by CxC
Incorrect User wrote:Обьясню подробнее, если предметов великое множество, типы от оружия до ресурсов то представь какой массив на всё это нужно расписать и как долго он все это будет искать. В новом инжекте есть такая функция FindList, создаешь список типов которые нужно искать и он ищет все одновременно за один раз а не по очереди как массив, но и тут для большого количества расписывать каждый тип слишком напряжно, проще заигнорить то что не нужно брать и смело лутать все остальное. FindList удобно использовать когда тебе нужно найти исключительно определенные итемы и их не особо много, за одну проверку ты ищешь все типы сразу. В общем для лута массив в любом случае не актуален.

а вот тут давай поподробнее ) в скриптах на лут использую связку

Code: Select all

      PUTLootPvM('0x1869', -1, corpse) # энч
      PUTLootPvM('0x1BFB', -1, corpse) # болты
      PUTLootPvM('0x0EED', -1, corpse) # золото

Sub PUTLootPvM(Type, Color, Otkuda)
   UO.FindType(Type, Color, Otkuda)
   while UO.FindCount('finditem') > 0
      if Uo.GetDistance(Otkuda)<=2 then
         UO.Grab("0","finditem") 
         wait(300)
         UO.FindType(Type, Color, Otkuda)
      else
         waitfowcorpsedistance(Otkuda)
      end if
   wend
end sub

Быстрее ли будет лутать через финдлист, если мне нужно лутать именно по порядку нужные мне итемы?

Re: Как перезаписать последний труп ?

Posted: 2014-03-30 12:52:05
by Juicy Fruit
Ага, в последней версии список упорядочен и обрабатывается быстрее, чем скриптом (там разница в мс, но всеже :D)

Code: Select all

UO.FindCount('finditem')
Шо за Ад?) У нее нет параметров)
И uo.FindType()/uo.FindList() теперь возвращают серийник, можешь сделать while uo.FindType(...)

Re: Как перезаписать последний труп ?

Posted: 2014-03-30 13:04:49
by Incorrect User
Да, и лутать будет в том порядке в котором ты добавляешь их в лист. Он ищет сразу весь список, из того что находит выберет первым то что есть из списка в той очередности в которой ты добавлял. Если ничего нету он сразу же прекратит работу так как ищет всё сразу, а не будет гонять циклы на каждый тип по очереди.

Re: Как перезаписать последний труп ?

Posted: 2014-03-30 13:35:52
by CxC
Juicy Fruit wrote:Шо за Ад?)

это не ад, это кривописание :))))
насколько велика разница и есть ли смысл переписывать, вот что интересно :) если там разница в 30 мс на весь скрипт, то и смысла не вижу. На лут 50+- итемов

Re: Как перезаписать последний труп ?

Posted: 2014-03-30 13:47:46
by Incorrect User
Ну смотри, 50 итемов нужно найти, в случае неудачи задержку на файндтайп ставим 100, просто задержка в пустом цикле. 100х50 = 5сек крутится твой скрипт даже если инчего в трупе нет. Если же использовать FindList например в том же пустом контейнере то результат ты получишь сразу а не через 5 сек. А так же например в списке есть итем например он десятый, то скрипт сразу же на него среагирует а не будет крутить 9 проверок типов которые идут до него. В этом же и суть лута, полутать все максимально быстро пока не полутали до тебя)