Новая лутилка. Проверяйте.

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Новая лутилка. Проверяйте.

Post by Savage »

Вроде написал полностью, но не проверил что будет если положить нпс, полутить его и потом положить жидкого элема и лутить его. Соответственно жертв среди игроков для тэста искать влом :)

Лутит так: если нет ласттрупа, то ищется хлам на земле. если есть то режется труп. Если тркп не порезался то лутаем из него если порезался то лутаем с земли.

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

Если добавить в объекты LootBag и фром таргет юзануть на мешок то лутает в этот мешок. Если нет то лутает в пак.

WaitTime - задержка на лут если конект плох то больше ставьте если UNSP не стоит то 0 :)

По умолчанию лутает ласткорпс, если еще раз там же запустить то выдает крест на новый труп. Следующий запуск лутает тот первый корпс :) А следующий - следующий труп. Такой изврат потому что указатель ласткорпс не доступен для записи.

Пробуйте :)

По настоянию эда, теперь в трупе копается тоже не 1 раз. :)

Code: Select all

#==============================================================
#  Loot() - looting corpse and from ground. Savage.
#--------------------------------------------------------------
sub Loot()
   VAR WaitTime=800
   VAR Exit=0, i, FromCorpse=0
   DIM Loot[40]
   

   Loot[0]=0x19B9 ; ore
   Loot[1]=0x0EED ; gp
   Loot[2]=0x0F7B ; BM
   Loot[3]=0x0F7A ; BP
   Loot[4]=0x0F84 ; GA
   Loot[5]=0x0F85 ; GI
   Loot[6]=0x0F86 ; MR
   Loot[7]=0x0F88 ; NS
   Loot[8]=0x0F8C ; SA
   Loot[9]=0x0F8D ; SS
   Loot[10]=0x0F90 ; Dead Woods
   Loot[11]=0x0F7E ; Sceleton Bones
   Loot[12]=0x0F87 ; Eyes of newt
   Loot[13]=0x0E76 ; Bag
   Loot[14]=0x09B0 ; Pounch
   Loot[15]=0x1BDD ; Logs
   Loot[16]=0x1078 ; Hides
   Loot[17]=0x1BFB ; Bolts
   Loot[18]=0x0E34 ; Blanc Scroll
   Loot[19]=0x0F25 ; Pieces of Amber
   Loot[20]=0x0F16 ; Ametist
   Loot[21]=0x0F20 ; Tourmaline
   Loot[22]=0x0F26 ; Diamond
   Loot[23]=0x0F30 ; Diamond
   Loot[24]=0x0F8E ; Serpent Scales
   Loot[25]=0x14EB ; Treassure Map
   Loot[26]=0x0F79 ; Blackmoor
   Loot[27]=0x0F3F ; Arrow
   Loot[28]=0x1BD1 ; Feathers
   Loot[29]=0x1F4C ; Scroll Recall
   Loot[30]=0x1F52 ; Scroll Paralyze
   Loot[31]=0x1F40 ; Scroll Poison
   Loot[32]=0x0F7D ; Vials of Blood
   Loot[33]=0x0F2F ; Emeralds
   Loot[34]=0x1F4C ; Scroll Recall
   Loot[35]=0x1F4C ; Scroll Recall
   Loot[36]=0x1F4C ; Scroll Recall
   

   UO.DeleteJournal()
   UO.UseObject('LootBag')
   wait(100)
   If UO.InJournal("You can") Then
      UO.WaitTargetObject('backpack')
      UO.AddObject('LootBag')
      UO.Print("+++ LootBag ne nayden - lutim v pack!")
   EndIf

   If UO.GetSerial('lastcorpse')<>'0x00000000' Then
      If UO.GetSerial('lastcorpse')==UO.GetSerial('Corpse') Then
         UO.Print("Pokaji trup!")
         UO.AddObject('Corpse')
         While UO.Targeting()==2
            wait(100)
         Wend
      Else
         UO.WaitTargetObject('lastcorpse')
         UO.AddObject('Corpse')
      EndIf

      UO.DeleteJournal()
      UO.UseObject('Corpse')
      wait(100)
      If UO.InJournal("You can") Then
         UO.Print("+++ Sorry ne mogu dostat!")
      Else
         UO.SetArm('temp')
         UO.WaitTargetObject('Corpse')
         UO.UseType('0x0F51') ;dagger
         wait(1000)
         UO.Arm('temp')
         wait(1000)
         If UO.GetQuantity('Corpse') Then
            FromCorpse=1
         Endif
      Endif
   Endif


   For i=0 to 31
      If FromCorpse Then
         Exit=0
         While Exit<>1
            UO.FindType(Loot[i],-1,'Corpse')
            If UO.FindCount() Then
               UO.MoveItem('finditem','0','LootBag')
               wait(WaitTime)
            Else
               Exit=1
            Endif
         Wend
      Endif
      Exit=0
      While Exit<>1
         UO.FindType(Loot[i],-1,'ground')
         If UO.FindCount() Then
            UO.MoveItem('finditem','0','LootBag')
            wait(WaitTime)
         Else
            Exit=1
         Endif
      Wend
   Next
   UO.Print("!!! Polutal!")
end sub
Last edited by Savage on 2005-04-07 18:25:46, edited 1 time in total.
I'm
Expert!
Posts: 1396
Joined: 2004-10-15 22:38:04
Location: Moscow City.
Contact:

Post by I'm »

Savage представил публике очередную новинку за что ему в очередной раз пасибо :D
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Честно говоря я в упор не понимаю, почему вы все в скриптах на лут повторяете по несколько раз одни и те же типы и используете комбинацию:

Code: Select all

UO.Findtype(...)
If UO.Findcount() <> 0 Then


А не

Code: Select all

repeat
UO.Findtype(...)
....
until UO.Findcount == 0


Вот напишу третий урок - сможете сравнить методики ;)
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

Не догнал о чем речь, перепеши это по своему, сравню :)
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

Или ты про извраты С++ и Perl? О да, красиво получается, токо потом через месяц на свой код смотришь и пытаешься час-два понять как оно работает, потом конечно доходит, но после следующего месяца....
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Savage wrote:Не догнал о чем речь, перепеши это по своему, сравню :)


Проще свой кинуть:

Code: Select all

#####################################################################
; Функция CorpseLoot. v.1.04b (c) Edred
;
; Лут указанного трупа
;
Sub CorpseLoot( Cont )
   ; лутим из Cont
   DIM Nado[40]
   ; реги
   Nado[0]  = '0x0F7A'   ; pearls, black pearls
   Nado[1]  = '0x0F7B'   ; bood moss
   Nado[2]  = '0x0F84'   ; garlic
   Nado[3]  = '0x0F85'   ; ginseng
   Nado[4]  = '0x0F86'   ; mandrake root
   Nado[5]  = '0x0F88'   ; night shade
   Nado[6]  = '0x0F8C'   ; sulphorous ash
   Nado[7]  = '0x0F8D'   ; spiders silk
   ; то что надо резать ножницами
   Nado[8] = '0x1078'   ; leather
   ; основной лут
   Nado[9]  = '0x0F78'   ; batwings   
   Nado[10] = '0x0F7E'   ; bones
   Nado[11] = '0x0F7D'   ; vials of blood
   Nado[12] = '0x0F80'   ; daemons bones
   Nado[13] = '0x0F81'   ; fertile dirt
   Nado[14] = '0x0F82'   ; dragons blood
   Nado[15] = '0x0F87'   ; eyes of newt
   Nado[16] = '0x0F8E'   ; serpents scales
   Nado[17] = '0x0F90'   ; dead woods
   Nado[18] = '0x0F91'   ; wyrms hearts
   Nado[19] = '0x0F8F'   ; volcanic ash
   Nado[20] = '0x0E34'   ; blank scrolls
   ; золото и руда
   Nado[21] = '0x0EED'   ; gold coin
   Nado[22] = '0x0F23'   ; cintrines
   Nado[23] = '0x19B7'   ; magic ore
   ; прочий лут
   Nado[24] = '0x0E24'   ; water bottles
   Nado[25] = '0x0F0E'   ; empty bottles
   Nado[26] = '0x0F0B'   ; total refresh
   Nado[27] = '0x0F09'   ; total mana refresh
   Nado[28] = '0x0F06'   ; shrink
   Nado[29] = '0x0F0C'   ; greater heal
   Nado[30] = '0x0F09'   ; invisibility
   Nado[31] = '0x0E21'   ; bandages
   Nado[32] = '0x0E20'   ; bloody bandages - бинты
   Nado[33] = '0x0F3F'   ; arrows
   Nado[34] = '0x1BD1'   ; feathers
   Nado[35] = '0x14ED'   ; a treasure map
   Nado[36] = '0x1078'   ; pile of hides
   Nado[37] = '0x0FAB'   ; duing tub
   Nado[38] = '0x1BFB'   ; bolts
   Nado[39] = '0x1089'   ; necklace

   VAR otherpack = '0x0E75'   ; backpack
   VAR i, typ, serpack
   VAR Scissor = '0x0F9E'   ; Ножницы
   VAR fastloot = 'FastLoot detected.'
   For i = 0 To 39
      UO.FindType( Nado[i], -1, Cont )
      While UO.FindCount() > 0
         DeleteJournal( fastloot )
         If i == 8 Then
            If UO.GetColor( 'finditem' ) == '0x0000' Then
               UO.WaitTargetObject( 'finditem' )
               UO.UseType( Scissor )
               GetPause(500)
               CheckLag()
            Else
               UO.MoveItem( 'finditem' )
               GetPause(500)
               CheckLag()
            Endif
         Else
            UO.MoveItem( 'finditem' )
            GetPause(500)
            CheckLag()
         Endif
         UO.FindType( Nado[i], -1, Cont )
      Wend
   Next
   UO.FindType( otherpack, -1, Cont )
   while UO.FindCount() > 0
      serpack = UO.GetSerial( 'finditem' )
      UO.Ignore( 'finditem' )
      UO.UseObject( serpack )
      wait(500)
      CheckLag()
      CorpseLoot( serpack )
      wait(500)
      UO.FindType( otherpack, -1, Cont )
   wend
   UO.Print( 'The loot was finished' )
endsub
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

Типа шутка такая? Ни однго репита, унтила у тебя не нашел... А вставлять стартовый, лишний вызов какой то команды я не люблю :)

Линейный алгоритм реализованный в коде намного наглядней и понятней для человека, который пытается разобраться в том как скрипт работает, но недостаточно образован для этого. :)
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Savage wrote:Типа шутка такая? Ни однго репита, унтила у тебя не нашел... А вставлять стартовый, лишний вызов какой то команды я не люблю :)

Линейный алгоритм реализованный в коде намного наглядней и понятней для человека, который пытается разобраться в том как скрипт работает, но недостаточно образован для этого. :)


репит и антил там отсутствуют, там вместо этого конструкция

UO.Findtype
while
....
uO.Findtype
wend

Просто твой линейный алгоритм имеет такой минус: ну повторил ты в массиве 4 раза реколл скроллы, а если в луте лежит 6 кучек этих скроллов? Две останутся? Разовый поиск чего-либо хорош только против монстров, да и то далеко не всегда. А для лута чара он вообще малопригоден. У меня, например, в паке реги на реколл лежат в двух местах, в мешках, есть еще и другие вещи которые дублируются.
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

Мой метод как раз для того и введен чтобы циклить расциклить код на лету :) На счет того что у чара в разных кучах лежит одно и тоже, это конечно изврат, но и это можно легко пофиксить :) У каждого свои привычки и методы программирования, я не понимаю, почему ты так убежденно отстаиваешь свой? И если ты знаком с асмом, то должен знать что операции сравнения выполняются быстрее циклов.
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

Edred wrote:Просто твой линейный алгоритм имеет такой минус: ну повторил ты в массиве 4 раза реколл скроллы, а если в луте лежит 6 кучек этих скроллов? Две останутся? Разовый поиск чего-либо хорош только против монстров, да и то далеко не всегда. А для лута чара он вообще малопригоден. У меня, например, в паке реги на реколл лежат в двух местах, в мешках, есть еще и другие вещи которые дублируются.

Ты даже код не стал смотреть :) Накидай на землю гп и запусти :)
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

А вот теперь смотри как легко и просто встраивается "мой" цикл в скрипт, было:

Code: Select all

   For i=0 to 31 
      If FromCorpse Then
         UO.FindType(Loot[i],-1,'Corpse')
         If UO.FindCount() Then
            UO.MoveItem('finditem','0','LootBag')
            wait(WaitTime)
         Endif
      Endif
      Exit=0
      While Exit<>1
         UO.FindType(Loot[i],-1,'ground')
         If UO.FindCount() Then
            UO.MoveItem('finditem','0','LootBag')
            wait(WaitTime)
         Else
            Exit=1
         Endif
      Wend
   Next


стало:

Code: Select all

   For i=0 to 31 
      If FromCorpse Then
         Exit=0
         While Exit<>1
            UO.FindType(Loot[i],-1,'Corpse')
            If UO.FindCount() Then
               UO.MoveItem('finditem','0','LootBag')
               wait(WaitTime)
      Else
               Exit=1
           Endif
         Wend
      Endif
      Exit=0
      While Exit<>1
         UO.FindType(Loot[i],-1,'ground')
         If UO.FindCount() Then
            UO.MoveItem('finditem','0','LootBag')
            wait(WaitTime)
         Else
            Exit=1
         Endif
      Wend
   Next


А если не надо то можно так же легко отключить:

Code: Select all

   For i=0 to 31 
      If FromCorpse Then
;         Exit=0
;         While Exit<>1
            UO.FindType(Loot[i],-1,'Corpse')
            If UO.FindCount() Then
               UO.MoveItem('finditem','0','LootBag')
               wait(WaitTime)
;      Else
;               Exit=1
           Endif
;         Wend
      Endif
      Exit=0
      While Exit<>1
         UO.FindType(Loot[i],-1,'ground')
         If UO.FindCount() Then
            UO.MoveItem('finditem','0','LootBag')
            wait(WaitTime)
         Else
            Exit=1
         Endif
      Wend
   Next
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Savage wrote:И если ты знаком с асмом, то должен знать что операции сравнения выполняются быстрее циклов.


Я знаком с асемблером, если ты его имеешь в виду, а не АГРСовский допмодуль ;)

Но самый прикол инжекта в том, что циклы и поиски в нем выполняются быстрее, причем визуально быстрее, нежели сравнения. Я в свое время пробовал сделать лутилку, которая брала по очереди все объекты в трупе (брала типы естественно) и сравнивала по массиву - если надо - лутила. Так эта лутилка работала медленнее гораздо...
Savage
Expert!
Posts: 1205
Joined: 2004-04-04 11:13:54
Location: Балаково, Саратовская обл.
Contact:

Post by Savage »

Циклы не могут быть быстрее сравенинй, сравнения транслируются в cmp, а циклы во что повезет :)
На счет скорости работы, если в скрипте есть массив - это скрипт тормоз. Инжект не умеет быстро работать с массивами, точнее создаются они долго. Ну а что делать? Приходится их юзать...
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Savage wrote:Циклы не могут быть быстрее сравенинй, сравнения транслируются в cmp, а циклы во что повезет :)
На счет скорости работы, если в скрипте есть массив - это скрипт тормоз. Инжект не умеет быстро работать с массивами, точнее создаются они долго. Ну а что делать? Приходится их юзать...


Я думаю проблема в том была (в моем старом скрипте), что было больше сравнений с элементами массива... И, кстати, счас можно уже избежать работы с массивами, как раз через АСМ, тот, второй, АГРС-вский ;)

Давно собираюсь попробовать написать лутилку через UO.asmTLObjectGetLogic()... Тем более что я АГРСовское дополнение к инжекту активно использую во многих своих скриптах...
Post Reply