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

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