Yoko

All sides of Injection
It is currently 2026-01-18 16:10:37

All times are UTC+02:00




Post new topic  Reply to topic  [ 14 posts ] 
Author Message
PostPosted: 2005-04-06 19:01:39 
Offline
Expert!
User avatar

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

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

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

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

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

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

Пробуйте :)

По настоянию эда, теперь в трупе копается тоже не 1 раз. :)
Code:
#==============================================================
#  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.

Top
   
 Post subject:
PostPosted: 2005-04-06 20:53:12 
Offline
Expert!
User avatar

Joined: 2004-10-15 22:38:04
Posts: 1396
Location: Moscow City.
Savage представил публике очередную новинку за что ему в очередной раз пасибо :D


Top
   
 Post subject:
PostPosted: 2005-04-06 22:49:46 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
Честно говоря я в упор не понимаю, почему вы все в скриптах на лут повторяете по несколько раз одни и те же типы и используете комбинацию:

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


А не

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


Вот напишу третий урок - сможете сравнить методики ;)


Top
   
 Post subject:
PostPosted: 2005-04-06 23:46:23 
Offline
Expert!
User avatar

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


Top
   
 Post subject:
PostPosted: 2005-04-06 23:48:16 
Offline
Expert!
User avatar

Joined: 2004-04-04 11:13:54
Posts: 1205
Location: Балаково, Саратовская обл.
Или ты про извраты С++ и Perl? О да, красиво получается, токо потом через месяц на свой код смотришь и пытаешься час-два понять как оно работает, потом конечно доходит, но после следующего месяца....


Top
   
 Post subject:
PostPosted: 2005-04-07 07:47:43 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
Savage wrote:
Не догнал о чем речь, перепеши это по своему, сравню :)


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

Code:
#####################################################################
; Функция 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


Top
   
 Post subject:
PostPosted: 2005-04-07 08:59:51 
Offline
Expert!
User avatar

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

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


Top
   
 Post subject:
PostPosted: 2005-04-07 15:03:38 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
Savage wrote:
Типа шутка такая? Ни однго репита, унтила у тебя не нашел... А вставлять стартовый, лишний вызов какой то команды я не люблю :)

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


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

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

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


Top
   
 Post subject:
PostPosted: 2005-04-07 18:11:43 
Offline
Expert!
User avatar

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


Top
   
 Post subject:
PostPosted: 2005-04-07 18:13:30 
Offline
Expert!
User avatar

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

Ты даже код не стал смотреть :) Накидай на землю гп и запусти :)


Top
   
 Post subject:
PostPosted: 2005-04-07 18:20:52 
Offline
Expert!
User avatar

Joined: 2004-04-04 11:13:54
Posts: 1205
Location: Балаково, Саратовская обл.
А вот теперь смотри как легко и просто встраивается "мой" цикл в скрипт, было:
Code:
   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:
   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:
   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


Top
   
 Post subject:
PostPosted: 2005-04-07 22:29:35 
Offline
Expert!

Joined: 2004-04-03 17:36:29
Posts: 2544
Location: Saint-Petersburg
Savage wrote:
И если ты знаком с асмом, то должен знать что операции сравнения выполняются быстрее циклов.


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

Но самый прикол инжекта в том, что циклы и поиски в нем выполняются быстрее, причем визуально быстрее, нежели сравнения. Я в свое время пробовал сделать лутилку, которая брала по очереди все объекты в трупе (брала типы естественно) и сравнивала по массиву - если надо - лутила. Так эта лутилка работала медленнее гораздо...


Top
   
 Post subject:
PostPosted: 2005-04-07 23:17:20 
Offline
Expert!
User avatar

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


Top
   
 Post subject:
PostPosted: 2005-04-08 17:42:30 
Offline
Expert!

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


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

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


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

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 3 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