Наследство от Edred-а

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Наследство от Edred-а

Post by Edred »

Хм, начну скидывать ВСЕ свои скрипты :shock:

autoload.sc (чуть-чуть покоцал, выкинул мелочевку)

Code: Select all

#                                                                   #
#   AutoLoad.sc, ver 507.050 (c) Edred                              #
#                                                                   #
#####################################################################

#####################################################################
; ScrollSort v.1.00 (c) Edred
;
; Запоминает все спеллбуки в первом контейнере и потом по очереди драгает
; все скроллы, которые находит в этом же контейнере на все спеллбуки. Если
; спелл не подгружается в спеллбуку - пробует подгрузить в следующую
; спеллбуку и т.д. Если спелл есть уже во всех спеллбуках - скидывает его
; во второй контейнер.
:
sub ScrollSort()
	VAR Spellbk = '0x0EFA', i, j, temptyp, tempob, tempnam
;	DIM Scrolls[64]
;		Scrolls[0]  = ''		; 1: Clumsy
;		Scrolls[1]  = ''		; 1: Create Food
;		Scrolls[2]  = ''		; 1: Feeblemind
;		Scrolls[3]  = '0x1F31'		; 1: Heal
;		Scrolls[4]  = '0x1F32'		; 1: Magic Arrow
;		Scrolls[5]  = '0x1F33'		; 1: Night Sight
;		Scrolls[6]  = ''		; 1: Reactive Armor
;		Scrolls[7]  = '0x1F34'		; 1: Weaken
;		Scrolls[8]  = ''		; 2: Agility
;		Scrolls[9]  = ''		; 2: Cunning
;		Scrolls[10] = '0x1F37'		; 2: Cure
;		Scrolls[11] = '0x1F38'		; 2: Harm
;		Scrolls[12] = '0x1F39'		; 2: Magic Trap
;		Scrolls[13] = '0x1F3A'		; 2: Magic Untrap
;		Scrolls[14] = ''		; 2: Protection
;		Scrolls[15] = ''		; 2: Strength
;		Scrolls[16] = '0x1F3D'		; 3: Bless
;		Scrolls[17] = '0x1F3E'		; 3: Fireball
;		Scrolls[18] = '0x1F3F'		; 3: Magic Lock
;		Scrolls[19] = '0x1F40'		; 3: Poison
;		Scrolls[20] = '0x1F41'		; 3: Telekinesis
;		Scrolls[21] = ''		; 3: Teleport
;		Scrolls[22] = ''		; 3: Unlock
;		Scrolls[23] = '0x1F44'		; 3: Wall of Stone
;		Scrolls[24] = ''		; 4: Arch Cure
;		Scrolls[25] = ''		; 4: Arch Protection
;		Scrolls[26] = ''		; 4: Curse
;		Scrolls[27] = '0x1F48'		; 4: Fire Field
;		Scrolls[28] = ''		; 4: Greater Heal
;		Scrolls[29] = ''		; 4: Lightning
;		Scrolls[30] = ''		; 4: Mana Drain
;		Scrolls[31] = '0x1F4B'		; 4: Recall
;		Scrolls[32] = ''		; 5: Blade Spirit
;		Scrolls[33] = ''		; 5: Dispel Field
;		Scrolls[34] = '0x1F4F'		; 5: Incognito
;		Scrolls[35] = ''		; 5: Magic Reflection
;		Scrolls[36] = ''		; 5: Mind Blast
;		Scrolls[37] = '0x1F52'		; 5: Paralyze
;		Scrolls[38] = ''		; 5: Poison Field
;		Scrolls[39] = '0x1F54'		; 5: Summon Creature
;		Scrolls[40] = '0x1F55'		; 6: Dispel
;		Scrolls[41] = ''		; 6: Energy Bolt
;		Scrolls[42] = '0x1F57'		; 6: Explosion
;		Scrolls[43] = '0x1F58'		; 6: Invisibility
;		Scrolls[44] = '0x1F59'		; 6: Mark
;		Scrolls[45] = '0x1F5A'		; 6: Mass Curse
;		Scrolls[46] = ''		; 6: Paralyze Field
;		Scrolls[47] = '0x1F5C'		; 6: Reveal
;		Scrolls[48] = ''		; 7: Chain Lightning
;		Scrolls[49] = ''		; 7: Energy Field
;		Scrolls[50] = '0x1F5F'		; 7: Flame Strike
;		Scrolls[51] = '0x1F60'		; 7: Gate Travel
;		Scrolls[52] = '0x1F61'		; 7: Mana Vampire
;		Scrolls[53] = ''		; 7: Mass Dispel
;		Scrolls[54] = ''		; 7: Meteor Swarm
;		Scrolls[55] = ''		; 7: Polymorph
;		Scrolls[56] = '0x1F65'		; 8: Earthquake
;		Scrolls[57] = ''		; 8: Energy Vortex
;		Scrolls[58] = ''		; 8: Resurrection
;		Scrolls[59] = ''		; 8: Air Elemental
;		Scrolls[60] = ''		; 8: Summon Daemon
;		Scrolls[61] = ''		; 8: Earth Elemental
;		Scrolls[62] = '0x1F6B'		; 8: Fire Elemental
;		Scrolls[63] = '0x1F6C'		; 8: Water Elemental
	VAR msg1 = "Can't add this to the spellbook", flag
	DIM Spells[10]
	For i = 0 To 9
		Spells[i] = ''
	Next
	VAR TmpTyp
	UO.Print( 'Select container with scroll for sort' )
	UO.Exec('addobject TmpObj1')
	While UO.Targeting()
		Wait(100)
	Wend
	UO.Print( 'Select container for trash scrolls' )
	UO.Exec('addobject TmpObj2')
	While UO.Targeting()
		Wait(100)
	Wend
	UO.IgnoreReset()
	UO.TextOpen()
	UO.TextClear()
	j = 0
	repeat
		UO.FindType( Spellbk, '-1', 'TmpObj1' )
		If UO.FindCount() Then
			Spells[j] = UO.GetSerial( 'finditem' )
			UO.TextPrint( 'Slot number ' + str(j) + ' = ' + Spells[j] )
			UO.Ignore( 'finditem' )
			j = j + 1
		Endif
	until UO.FindCount() == 0 OR j > 9
	j = j - 1
	repeat
		UO.FindType( '-1', '-1', 'TmpObj1' )
		If UO.FindCount() > 0 Then
			If UO.GetGraphic( 'finditem' ) == Spellbk Then
				UO.Ignore( 'finditem' )
			Else
				temptyp = UO.GetGraphic( 'finditem' )
				UO.MoveItem( 'finditem', '1' )
				wait(1000)
				CheckLag()
				UO.FindType( temptyp )
				If UO.FindCount() == 0 Then
					UO.Print( 'Gluki glukami pogonayayut!' )
				Endif
				tempob = UO.GetSerial( 'finditem' )
				UO.Click( 'finditem' )
				wait(500)
				CheckLag()
				tempnam = UO.GetName( 'finditem' )
				flag = 0
				For i = 0 To j
					DeleteJournal( msg1 )
					UO.MoveItem( tempob, '0', Spells[i] )
					wait(2000)
					CheckLag()
					If UO.InJournal( msg1 ) == 0 Then
						flag = 1
						UO.TextPrint( tempnam + ' (' + temptyp + ') moved to slot number ' + str(i) )
						i = j
					Endif
				Next
				If flag == 0 Then
					UO.MoveItem( tempob, '0', 'TmpObj2' )
					UO.TextPrint( tempnam + ' (' + temptyp + ') moved to container 2' )
				Endif
			Endif
		Else
			return
		Endif
	until UO.FindCount() == 0
endsub

#####################################################################
; NeedGo v.1.02 (c) Edred
;
; Запрашивает координаты и отправляет по ним чара (пешком)
;
sub NeedGo()
	VAR s, x, y
	s = UO.asmInputString("Введите через пробел координаты:","")
	If s == '' Then
		UO.Print( 'Invalid coordinates!' )
		return
	Endif
	s = s + ' end '
	x = GetWord( s, 1 )
	y = GetWord( s, 2 )
	GoToTile( val(x), val(y), 1, False )
endsub

#####################################################################
; BegMoney v.1.00 (c) Edred
;
; Скрипт на выпрашивание денег. Слазит с лошади, просит денег у 
; ближайшего вендора, садится обратно на лошадь. В случае если
; деньги в паке превысили 699 гп - сообщает, что пора их выгрузить
; в банк. При поиске вендора проверяется глобальная переменная
; LastVendor - если серийник такой же - ищется другой вендор.
;
sub BegMoney()
	VAR VendTyp1 = '0x0191'
	VAR VendTyp2 = '0x0190'
	VAR HorSer = '0x00257883'
	VAR VendSer, k, HSer, flag
	VAR Dengi = '0x0EED'
	VAR dal = 'Here, you can have this'
	VAR poslal = "I'm sorry,"
	VAR daleko = 'is too far away!'
	VAR chasto = 'You must wait to use that skill again.'
	UO.Set( 'finddistance', '5' )
	#### Блок нахождения 1 или 2 вендоров
	UO.Ignore( 'self' )
	UO.FindType( VendTyp1, '-1', '1' )
	If UO.FindCount() == 0 Then
		UO.FindType( VendTyp2, '-1', '1' )
		If UO.FindCount() == 0 Then
			UO.Print( 'Vendor not found!' )
			UO.IgnoreReset()
			return
		Endif
	Endif
	VendSer = UO.GetSerial( 'finditem' )
	If UO.GetGlobal( 'LastVendor' ) == VendSer Then
		UO.Ignore( 'finditem' )
		UO.FindType( VendTyp1, '-1', '1' )
		If UO.FindCount() == 0 Then
			UO.FindType( VendTyp2, '-1', '1' )
			If UO.FindCount() == 0 Then
				UO.Print( 'Vendor not found!' )
				UO.IgnoreReset()
				return
			Endif
		Endif
		VendSer = UO.GetSerial( 'finditem' )
	Endif
	UO.SetGlobal( 'LastVendor', VendSer )
	# Найден
	HSer = UO.ObjAtLayer( 'Horse' )
	If  HSer <> '' Then
		UO.UseObject( 'self' )
	Endif
	flag = 0
	If UO.Count( Dengi ) > 699 Then
		UO.Findtype( Dengi )
		If UO.FindCount() > 0 Then
			UO.Drophere( 'finditem' )
;			wait(500)
			CheckLag()
			flag = 1
		Endif
	Endif
	repeat
		DeleteJournal( dal )
		DeleteJournal( poslal )
		DeleteJournal( daleko )
		DeleteJournal( chasto )
		UO.WaitTargetObject( VendSer )
		UO.UseSkill( 'Begging' )
		k = 0
		repeat
			wait(100)
			k = k + 1
		until UO.InJournal( dal ) OR UO.InJournal( poslal ) OR UO.InJournal( daleko ) OR UO.InJournal( chasto ) OR k > 50
		If UO.InJournal( chasto ) Then
			wait(2000)
		Endif
	until UO.InJournal( dal ) OR UO.InJournal( poslal ) OR UO.InJournal( daleko ) OR k > 50
	If flag == 1 Then
		UO.Findtype( Dengi, '-1', '1' )
		while UO.FindCount() > 0
			UO.Grab( '0', 'finditem' )
			wait(00)
			CheckLag()
			UO.Findtype( Dengi, '-1', '1' )
		Wend
	Endif
	If  HSer <> '' Then
		UO.UseObject( HorSer )
	Endif	
	UO.Print( 'My gold is ' + str( UO.Count( Dengi ) ) )
	UO.IgnoreReset()
endsub

#####################################################################
sub AutoMove()
; Автоматическое перекладывание предметов одного типа и цвета из одного
; контейнера в другой. Поддержка двух режимов - драга на стопку и драга
; на контейнер. 
; v.1.04b (c) Edred
	VAR MyPause = 600
	VAR Type1, Color1, s, n, SerStopka, SumCol = 0
	UO.Print( 'Select sending container' )
	UO.Exec('addobject TmpCont1')
	While UO.Targeting()
		Wait(100)
	Wend
	UO.Print( 'Select targeting container' )
	UO.Exec('addobject TmpCont2')
	While UO.Targeting()
		Wait(100)
	Wend
	UO.Print( 'Select type for move' )
	UO.Exec('addobject TmpObj1')
	While UO.Targeting()
		Wait(100)
	Wend
	Type1 = UO.GetGraphic( 'TmpObj1' )
	Color1 = UO.GetColor( 'TmpObj1' )
	While UO.Targeting()
		Wait(100)
	Wend
	s = ''
	s = UO.asmInputString("Задайте размер порции:","500")
	If s == '' Then
		UO.Print( 'Invalid count of objects!' )
		return
	Endif
	VAR ToDo = UO.asmInputList("Выберите способ:","'Драг в стопку';'Драг на контейнер'")
	SerStopka = UO.GetSerial( 'TmpCont2' )
	n = val( s )
	If n < 0 OR n > 20000 Then
		UO.Print( 'Invalid count of objects!' )
		return
	Endif
	repeat
		If ToDo == 1 Then
			UO.FindType( Type1, Color1, 'TmpCont2' )
			If UO.FindCount() > 0 Then
				SerStopka = UO.GetSerial( 'finditem' )
			Else
				SerStopka = UO.GetSerial( 'TmpCont2' )
			Endif
		Endif
		UO.FindType( Type1, Color1, 'TmpCont1' )
		If UO.FindCount() > 0 Then
			If UO.GetQuantity( 'finditem' ) < n Then
				SumCol = SumCol + UO.GetQuantity( 'finditem' )
			Else
				SumCol = SumCol + n
			Endif
			UO.MoveItem( 'finditem', str(n), SerStopka )
			Wait( MyPause )
			CheckLag()
			UO.Print( 'I moved ' + str(SumCol) + ' items' )
		Else
			UO.Print( 'Automove finished' )
			Return
		Endif
	until False
endsub

#####################################################################
sub AutoMove2()
; Автоматическое перекладывание некучкующихся предметов одного типа и цвета 
; из одного контейнера в другой. Осуществляется драг на контейнер.
; v.1.05b (c) Edred
;
	VAR MyPause = 600
	VAR Type1, Color1, s, n, SerStopka, SumCol = 0, Howmany='200'
	UO.Print( 'Select sending container' )
	UO.Exec('addobject TmpCont1')
	While UO.Targeting()
		Wait(100)
	Wend
	UO.Print( 'Select targeting container' )
	UO.Exec('addobject TmpCont2')
	While UO.Targeting()
		Wait(100)
	Wend
	UO.Print( 'Select type for move' )
	UO.Exec('addobject TmpObj1')
	While UO.Targeting()
		Wait(100)
	Wend
	Type1 = UO.GetGraphic( 'TmpObj1' )
	Color1 = UO.GetColor( 'TmpObj1' )
	While UO.Targeting()
		Wait(100)
	Wend
	Howmany = UO.asmInputString("Сколько всего переложить?",Howmany)
	If Howmany == '' Then
		UO.Print( 'Invalid count of objects!' )
		return
	Endif
	repeat
		UO.FindType( Type1, Color1, 'TmpCont1' )
		If UO.FindCount() > 0 Then
			UO.MoveItem( 'finditem', '0', 'TmpCont2' )
			Wait( MyPause )
			CheckLag()
			SumCol = SumCol + 1
			If SumCol == val(Howmany) Then
				UO.Print( 'Script finished' )
				return
			Endif
		Else
			UO.Print( 'Script finished' )
			return
		Endif
	until False
endsub

#####################################################################
; Флипанье сандстоуновых стен. Автоматический анлок и лок в конце.
; Три варианта задания типа: через переменную, запрос на этот тип и 
: прицел на образец (оставлен этот, остальные закомментарены).
; v.1.03b (c) Edred
sub FlipWall()
	DIM typwalls[66]
	typwalls[1] = '0x0158'
	typwalls[2] = '0x0159'
	typwalls[3] = '0x015A'
	typwalls[4] = '0x015B'
	typwalls[5] = '0x015C'
	typwalls[6] = '0x015D'
	typwalls[7] = '0x015E'
	typwalls[8] = '0x015F'
	typwalls[9] = '0x0160'
	typwalls[10] = '0x0161'
	typwalls[11] = '0x0162'
	typwalls[12] = '0x0163'
	typwalls[13] = '0x0164'
	typwalls[14] = '0x0165'
	typwalls[15] = '0x0166'
	typwalls[16] = '0x0167'
	typwalls[17] = '0x0168'
	typwalls[18] = '0x0169'
	typwalls[19] = '0x0160'
	typwalls[20] = '0x016A'
	typwalls[21] = '0x016B'
	typwalls[22] = '0x016C'
	typwalls[23] = '0x016D'
	typwalls[24] = '0x016E'
	typwalls[25] = '0x016F'
	typwalls[26] = '0x0170'
	typwalls[27] = '0x0171'
	typwalls[28] = '0x0172'
	typwalls[29] = '0x0173'
	typwalls[30] = '0x0174'
	typwalls[31] = '0x0175'
	typwalls[32] = '0x0176'
	typwalls[33] = '0x0177'
	typwalls[34] = '0x0178'
	typwalls[35] = '0x0179'
	typwalls[36] = '0x017A'
	typwalls[37] = '0x017B'
	typwalls[38] = '0x017C'
	typwalls[39] = '0x017D'
	typwalls[40] = '0x017E'
	typwalls[41] = '0x017F'
	typwalls[42] = '0x0180'
	typwalls[43] = '0x0181'
	typwalls[44] = '0x0182'
	typwalls[45] = '0x0183'
	typwalls[46] = '0x0184'
	typwalls[47] = '0x0185'
	typwalls[48] = '0x0186'
	typwalls[49] = '0x0187'
	typwalls[50] = '0x0188'
	typwalls[51] = '0x0189'
	typwalls[52] = '0x018A'
	typwalls[53] = '0x018B'
	typwalls[54] = '0x018C'
	typwalls[55] = '0x018D'
	typwalls[56] = '0x018E'
	typwalls[57] = '0x018F'
	typwalls[58] = '0x0190'
	typwalls[59] = '0x0191'
	typwalls[60] = '0x0192'
	typwalls[61] = '0x0193'
	typwalls[62] = '0x0194'
	typwalls[63] = '0x0195'
	typwalls[64] = '0x0196'
	typwalls[65] = '0x01CA'
	VAR i, k, s, j, n
	##############################################################
	; Три варианта указания типа стены для верчения (переменная n)
	; Уберите комментарий с нужной
	##############################################################
	# I вариант. Явное указание:
;	n = 3
	##############################################################
	# II вариант. Запрос на ввод номера нужного типа:
;	s = UO.asmInputString("Задайте номер нужного типа:","1")
;	If s == '' Then
;		UO.Print( 'Invalid number of type wall!' )
;		return
;	Endif
;	n = val( s )
;	If n < 1 OR n > 65 Then
;		UO.Print( 'Invalid number of type wall!' )
;		return
;	Endif
	##############################################################
	# III вариант. Прицел для выбора образца:
	UO.Print( 'Please, click to type of wall' )
	UO.Exec('addobject WTypFlip')
	While UO.Targeting()
		Wait(100)
	Wend
	j = UO.GetGraphic( 'WTypFlip' )
	For k = 1 To 65
		If j == typwalls[k] Then
			n = k
		Endif
	Next
	##############################################################
	UO.Print( 'Please, click to walls for flip' )
	UO.Exec('addobject WFlip')
	While UO.Targeting()
		Wait(100)
	Wend
	If UO.GetGraphic( 'WFlip' ) <> typwalls[n] Then
		UO.WaitTargetObject( 'WFlip' )
		UO.Msg( 'i wish to unlock this' )
		wait(1000)
		repeat
			UO.WaitTargetObject( 'WFlip' )
			UO.Msg( 'i wish to flip this' )
			wait(1000)
		until UO.GetGraphic( 'WFlip' ) == typwalls[n]
		UO.WaitTargetObject( 'WFlip' )
		UO.Msg( 'i wish to lock this down' )
		wait(1000)
	Endif
endsub

#####################################################################
; Скрипт для подсчета всех объектов в любом
; контейнере. Запращивает прицел на
; контейнер. Потом считает объекты в контейнере и выдает на
; экран результат.
; v.1.00b (c) Edred, based on unknown script
sub CountResource()
	VAR ContSer, last 
	UO.Print( "Click target to container" )
	UO.Info( "self" ) 
	last = UO.GetSerial( "lasttarget" )
	UO.CancelTarget() 
	UO.Info() 
	while last == UO.GetSerial( "lasttarget" ) AND UO.Targeting() 
		wait(100) 
	wend
	ContSer = UO.GetSerial( "lasttarget" )
	UO.FindType( -1, -1, ContSer )
	UO.Print( 'I find ' + str( UO.FindCount() ) + ' items' )
endsub

#####################################################################
; FishingAround. v.2.07b (c) Edred
;
; Рыбачим вокруг чара
;
sub FishingAround()
	VAR Ms0 = "You can't see"			; не можем ловит здесь
	VAR Ms1 = "You can't fish under the ship"	; не можем ловить здесь
	VAR Ms2 = "You are too far away"		; далеко
	VAR Ms3 = "There are no fish here"		; кончилось тут
	VAR Ms4 = "You fish a while, but fail to catch anything"	; физл
	VAR Ms5 = "You pull out"			; поймал что-то
	VAR Ms6 = "Try fishing in water."		; не можем ловить здесь
	VAR k, t, v, x, y
	VAR MaxTime = 800
	For y = -4 To 4 
		For x = -4 To 4
			k = 0
			repeat
				If UO.Dead() Then
					return
				Endif
				DeleteJournal(ms0)
				DeleteJournal(ms1)
				DeleteJournal(ms2)
				DeleteJournal(ms3)
				DeleteJournal(ms4)
				DeleteJournal(ms5)
				DeleteJournal(ms6)
				t = UO.Timer()
				If UO.Waiting() Then
					UO.CancelTarget()
				Endif
				UO.WaitTargetTile( '0', STR( UO.GetX() + x ), STR( UO.GetY() + y ), '251')
				UO.UseObject( UO.GetSerial( UO.ObjAtLayer( 'Lhand' ) ) )
				repeat 
					wait(100)
				until UO.InJournal(ms0) OR UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR UO.InJournal(ms4) OR UO.InJournal(ms5) OR UO.InJournal(ms6) OR ((t + MaxTime) < UO.Timer())
				k = k + 1
				If UO.InJournal(ms5) Then
					k = 0
				Endif
				If UO.Dead() Then
					return
				Endif
				If UO.InJournal( ms5 ) Then
					GetResultFish()
				Endif
			until UO.InJournal(ms0) OR UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR (k > 6)
			If UO.Dead() Then
				return
			Endif
		Next 
	Next
endsub

Sub GetResultFish()
	; ------- улов -------
	DIM Fish[18]
	Fish[0]  = '0x170B'	; сапоги 
	Fish[1]  = '0x170F'	; тапки
	Fish[2]  = '0x170D'	; сандалии 
	Fish[3]  = '0x1711'	; сапоги
	Fish[4]  = '0x09CC'	; тип рыбы 1
	Fish[5]  = '0x09CD'	; тип рыбы 2
	Fish[6]  = '0x09CE'	; тип рыбы 3
	Fish[7]  = '0x09CF'	; тип рыбы 4
	Fish[8]  = '0x0FC4'	; ракушка, тип 1
	Fish[9]  = '0x0FC5'	; ракушка, тип 2
	Fish[10] = '0x0FC6'	; ракушка, тип 3
	Fish[11] = '0x0FC7'	; ракушка, тип 4
	Fish[12] = '0x0FC8'	; ракушка, тип 5
	Fish[13] = '0x0FC9'	; ракушка, тип 6
	Fish[14] = '0x0FCA'	; ракушка, тип 7
	Fish[15] = '0x0FCB'	; ракушка, тип 8
	Fish[16] = '0x0FCC'	; ракушка, тип 9
	Fish[17] = '0x14ED'	; карта
	VAR Razmer = 17		; размер массива - 1
	VAR Scissor = '0x0F9E'	; тип ножниц
	VAR Bandag = '0x0E21'		; Тип бинтов
	VAR i
	; Ищем что у нас валяется под ногами, если надо перерабатываем
	; и складируем в трюм. Потом введем всякие мешочки разные и ящички.
	For i = 0 To Razmer
		UO.FindType( Fish[i], '-1', 'ground' )
		If UO.FindCount() > 0 Then
			If i < 4 Then
				; обувь
				UO.WaitTargetObject( 'finditem' )
				UO.UseType( Scissor )
				Wait( 3000 )
				UO.FindType( Bandag )
			Endif
			UO.Grab( '0', 'finditem' ) 
			Wait( 2000 )
			If i > 7 AND i < 17 Then
				; ракушка
				UO.UseObject( 'finditem' )
				wait(1000)
			Endif
		Endif
	Next
endsub

#####################################################################
; Remember armor & weapon, disarm, healing from bandages, arm
sub Bandag() 
	UO.SetArm('CWeapon') 
	UO.Exec('bandageself') 
	wait(300) 
	UO.Arm('CWeapon') 
endsub 

#####################################################################
;  Arrow() - cast magic arrow on laststatus
sub Arrow()
	VAR ManaNeed=4
	UO.Set('lasttarget','laststatus')
	if UO.Mana>=ManaNeed then
		UO.Cast('Magic Arrow','laststatus')
	else
		UO.Print("Low mana!!!")
	endif
end sub

#####################################################################
; Poison() - cast poison on laststatus if target-char not
;            poisoned and your char have enought mana
sub Poison()
	VAR ManaNeed=9
	VAR ScrollManaNeed=4
	UO.Set('lasttarget','laststatus')
	If NOT UO.Poisoned('lasttarget') Then
		UO.FindType('0x1F40',-1,'my')
		If UO.GetQuantity('finditem')>0 Then
			If UO.Mana>=ScrollManaNeed Then
				UO.WaitTargetObject('lasttarget')
				UO.UseObject('finditem')
				UO.Print("Scroll")
			Else
				UO.Print("Low mana!!! Scroll!")
			Endif
		Else
			If UO.Mana>=ManaNeed Then
				UO.Cast('Poison','laststatus')
			Else
				UO.Print("Low mana!!!")
			Endif
		Endif
	Else
		UO.Print("Character already poisoned!")
	Endif
end sub

#####################################################################
;  Flame() - cast Flame Strike to last status from scroll, 
;            if she found or from spellbook
sub Flame()
	UO.Set('lasttarget','laststatus')
	UO.FindType('0x1F5F',-1,'my')
	If UO.GetQuantity('finditem')>0 then
		if UO.Mana>=22 then
			UO.WaitTargetObject('lasttarget')
			UO.UseObject('finditem')
			UO.Print("Scroll")
		else
			UO.Print("Low mana!!! Scroll!")
		endif
	else
		if UO.Mana>=45 then
			UO.Cast('Flame Strike','laststatus')
			UO.Print("Spell")
		else
			UO.Print("Low mana!!! Spell!")
		endif
	endif
end sub

#####################################################################
;  Light() - cast Lighting to last status from scroll, 
;            if she found or from spellbook
sub Light()
	UO.Set('lasttarget','laststatus')
	UO.FindType('0x1F4A',-1,'my')
	If UO.GetQuantity('finditem')>0 then
		if UO.Mana>=10 then
			UO.WaitTargetObject('lasttarget')
			UO.UseObject('finditem')
			UO.Print("Scroll")
		else
			UO.Print("Low mana!!! Scroll!")
		endif
	else
		if UO.Mana>=20 then
			UO.Cast('Lightning','laststatus')
			UO.Print("Spell")
		else
			UO.Print("Low mana!!! Spell!")
		endif
	endif
end sub

#####################################################################
sub NechegoDelat()
	SpSpeak()
	VAR SpiritTime = UO.Timer()
	repeat
		If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
			; Прошло 5 минут с момента последней прокачки Spirit Speak
			SpSpeak()
			SpiritTime = UO.Timer()
		Else
			wait(500)
		Endif
	until UO.Dead()
endsub

; Spirit Speak v.1.00b (c) Edred
;
; Разовая прокачка спирит спика. Предназначена для вызова из других скриптов.
;
Sub SpSpeak()
	VAR mod = UO.WarMode(), num1
	VAR fizzle = 'You fail your attempt'
	VAR success = 'You establish a connection'
	UO.WarMode( 0 )
	DeleteJournal( success )
	repeat
		DeleteJournal( fizzle )
		UO.UseSkill( 'Spirit Speak' )
		num1 = 1
		repeat
			wait(100)
			num1 = num1 + 1
		until UO.InJournal( fizzle ) OR UO.InJournal( success ) OR num1 > 600
	until UO.InJournal( success )
	UO.WarMode( mod )
endsub

#####################################################################
; BUYREGS
; Скупка регов по байлисту
; v.1.01b (с) Edred
sub buyregs()
	VAR i
	DIM vendors[29]
	vendors[0] = 'Kaspar'
	vendors[1] = 'Austin'
	vendors[2] = 'Reese'
	vendors[3] = 'Alessa'
	vendors[4] = 'Akina'
	vendors[5] = 'Aileen'
	vendors[6] = 'Alula'
	vendors[7] = 'Kevin'
	vendors[8] = 'Ainhoa'
	vendors[9] = 'Aderes'
	vendors[10] = 'Cassidy'
	vendors[11] = 'Gideon'
	vendors[12] = 'Canton'
	vendors[13] = 'Alaqua'
	vendors[14] = 'Doyle'
	vendors[15] = 'Ali'
	vendors[16] = 'Alake'
	vendors[17] = 'Jabir'
	vendors[18] = 'Beau'
	vendors[19] = 'Morris'
	vendors[20] = 'Aleka'
	vendors[21] = 'Akili'
	vendors[22] = 'Tremain'
	vendors[23] = 'Terence'
	vendors[24] = 'Brock'
	vendors[25] = 'Alumit'
	vendors[26] = 'Redmond'
	vendors[27] = 'Adoncia'
	vendors[28] = 'Rudyard'
	;
	UO.UseSkill( 'Meditation' )
	wait(100)
	UO.DeleteJournal()
	For i = 0 To 28
		UO.Buy( 'magic', vendors[i] )
		wait(1000)
		If UO.InJournal( 'I thank thee for thy' ) Then
			UO.SayU( 'bye' )
			return
		Endif
	Next
endsub

#####################################################################
; TestArmor. v.1.06b (c) Edred
;
; Выводит в текстовое окно информацию о армореклассе и износе всего,
; что надето на чара и взято им в руки
;
sub TestArmor()
	DIM Lay[8]
	Lay[0] = 'Lhand'
	Lay[1] = 'Rhand'
	Lay[2] = 'Arms'
	Lay[3] = 'Legs'
	Lay[4] = 'Gloves'
	Lay[5] = 'Hat'
	Lay[6] = 'Torso'
	Lay[7] = 'Neck'
	VAR i, ob, nam, l, k
	UO.TextOpen()
	UO.TextClear()
	for i = 0 to 7
		DeleteJournal( 'Quality' )
		ob = UO.ObjAtLayer( Lay[i] )
		If ob <> '' Then
			UO.Click( ob )
			wait(1000)
			nam = UO.GetName( ob )
			UO.TextPrint( nam )
			UO.WaitTargetObject( ob )
			UO.UseSkill( 'Arms Lore' )
			k = 0
			repeat
				wait(300)
				k = k + 1
			until UO.InJournal( 'Quality' ) OR k > 30
			l = UO.InJournal( 'Quality' )
			nam = UO.Journal( l - 1 )
			UO.TextPrint( nam )
		Endif
	next
endsub

#####################################################################
; AutoHeal. v.1.10b (c) Edred
;
; Автоматический подхил чара (здоровье минус 30). Автоматическое питие 
; греатхил поушена при здоровье меньше 60. Автоматическое запоминание
; оружия и щита при запуске и взятие их в руки после подхилла.
;
sub AutoHeal()
	VAR GreatHeal = '0x0F0C'
	VAR MyFork = UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) )
	VAR MyShield = UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) )
	If MyFork == '0x0000' Then
		MyFork = ''
	Endif
	If MyShield == '0x0000' Then
		MyShield = ''
	Endif
	repeat
		If UO.Life < (UO.Str - 30) Then
			RestoreChar( 0 )
			GetWeapon( MyFork, MyShield )
		Endif
		If UO.Life < 60 Then
			UO.UseType( GreatHeal )
		Endif
		wait(2000)
	until UO.Dead()
endsub

; Процедура взятия в руки указанного оружия и щита. Если чар не может
; взять в руки оружие - автоматический диспел на себя.
;
Sub GetWeapon( Fork, Shield )
	VAR msg1 = 'Not strong enough to equip'
	DeleteJournal( msg1 )
	; берем в руки оружие и щит. Динамические паузы и оптимитизация.
	If Fork == '' AND Shield == '' Then
		return
	Endif
	If Fork == '' Then
		; только щит
		If UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield Then
			; все есть
			return
		Else
			GetOneWeaponOnly( 'Lhand', Shield )
			return
		Endif
	Endif
	If Shield == '' Then
		; только оружие
		If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
			; все есть
			return
		Else
			GetOneWeaponOnly( 'Rhand', Fork )
			return
		Endif
	Endif
	If UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield Then
		If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
			; уже в руках все
			return
		Else
			; надо взять в руки только оружие, щит не надо
			GetOneWeaponOnly( 'Rhand', Fork )
		Endif
	Else
		If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
			; в руках только оружие, надо еще щит взять
			GetOneWeaponOnly( 'Lhand', Shield )
		Else
			; в руках нет ни оружия, ни щита
			GetOneWeaponOnly( 'Rhand', Fork )
			GetOneWeaponOnly( 'Lhand', Shield )
		Endif
	Endif
endsub

Sub GetOneWeaponOnly( lay, typ )
	VAR msg1 = 'Not strong enough to equip'
	UO.Equipt( lay, typ )
	repeat
		wait(50)
	until UO.GetGraphic( UO.ObjAtLayer( lay ) ) == typ OR UO.InJournal( msg1 )
	If UO.InJournal( msg1 ) Then
		UO.WaitTargetSelf()
		UO.Cast( 'Dispel' )
		wait(4000)
		GetOneWeaponOnly( lay, typ )
		CheckLag()
	Endif
endsub

; Процедура лечения чара с бинтов. Два варианта - разовый подхил или подхил
; до полного восстановления здоровья.
;
Sub RestoreChar( a )
	VAR bandag = '0x0E21'
	If a == 0 Then
		If UO.Count( Bandag ) > 0 Then
			UO.Bandageself()
			wait( 300 )
		Endif
		return
	Endif
	If a == 1 Then
		If UO.Count( Bandag ) > 0 Then
			While UO.Life < 150
				UO.Bandageself()
				wait( 2000 )
			Wend
		Endif
		return
	Endif
endsub

#####################################################################
; AutoLoot. v.1.11b (c) Edred
;
; Автоматический лут трупа. Три варианта скрипта - первый на последний
; труп, второй вызывает прицел для указания трупа. Лутится только то,
; что указано в массиве. Третий вариант - лутим с земли около чара.
;
sub AutoLoot()
	VAR Cleaver = '0x0EC2'	; кливер (тип)
	; Считываем оружие и щит из рук
	VAR MyFork = UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) )
	VAR MyShield = UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) )
	If MyFork == '0x0000' Then
		MyFork = ''
	Endif
	If MyShield == '0x0000' Then
		MyShield = ''
	Endif
	;
	VAR CorpseSer = UO.GetSerial( 'lastcorpse' )
	CheckLag()
	UO.WaitTargetObject( CorpseSer )
	UO.UseType( Cleaver )
	wait(1000)
	CheckLag()
	GetWeapon( MyFork, MyShield )
	UO.UseObject( CorpseSer )
	wait(500)
	CheckLag()
	CorpseLoot( CorpseSer )
endsub 
;
sub AutoLoot2()
	VAR Cleaver = '0x0EC2'	; кливер (тип)
	; Считываем оружие и щит из рук
	VAR MyFork = UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) )
	VAR MyShield = UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) )
	If MyFork == '0x0000' Then
		MyFork = ''
	Endif
	If MyShield == '0x0000' Then
		MyShield = ''
	Endif
	;
	If UO.Targeting() Then
		UO.CancelTarget()
	Endif
	UO.Print( 'Please, choice of corpse:' )
	UO.AddObject( 'CorpseForLoot' )
	While UO.Targeting()
		wait(100)
	Wend
	VAR CorpseSer = UO.GetSerial( 'CorpseForLoot' )
	CheckLag()
	UO.WaitTargetObject( CorpseSer )
	UO.UseType( Cleaver )
	wait(1000)
	CheckLag()
	GetWeapon( MyFork, MyShield )
	UO.UseObject( CorpseSer )
	wait(500)
	CheckLag()
	CorpseLoot( CorpseSer )
endsub 
;
; Автоматически лутим с земли около чара. Одежду сразу режем на бинты.
;
sub AutoLootGround()
	VAR Cleaver = '0x0EC2'	; кливер (тип)
	VAR Scissor = '0x0F9E'	; Ножницы
	VAR fastloot = 'FastLoot detected.'
	DIM Nado[27]
	Nado[0]  = '0x170B'	; boots
	Nado[1]  = '0x1718'	; 
	Nado[2]  = '0x1516'	; a skirt
	Nado[3]  = '0x1F03'	; a robe
	Nado[4]  = '0x1F01'	; a plain dress
	Nado[5]  = '0x1EFD'	; a fancy shirt
	Nado[6]  = '0x1541'	; a body sash
	Nado[7]  = '0x170B'	; boots
	Nado[8]  = '0x170D'	; sandals
	Nado[9]  = '0x1717'	; a straw hat
	Nado[10] = '0x1539'	; long pants	
	Nado[11] = '0x152E'	; short pants
	Nado[12] = '0x1515'	; a cloak
	Nado[13] = '0x1FA1'	; tunic
	Nado[14] = '0x0EED'	; gold coin
	Nado[15] = '0x0F3F'	; arrows
	Nado[16] = '0x0F7A'	; pearls, black pearls
	Nado[17] = '0x0F7B'	; bood moss
	Nado[18] = '0x0F7D'	; vials of blood
	Nado[19] = '0x0F84'	; garlic
	Nado[20] = '0x0F85'	; ginseng
	Nado[21] = '0x0F86'	; mandrake root
	Nado[22] = '0x0F88'	; night shade
	Nado[23] = '0x0F8C'	; sulphorous ash
	Nado[24] = '0x0F8D'	; spiders silk
	Nado[25] = '0x14ED'	; a treasure map
	Nado[26] = '0x0E75'	; backpack
	VAR i
	UO.Exec( 'set finddistance 3' )
	For i = 0 To 25
		UO.FindType( Nado[i], '-1', '1' )
		While UO.FindCount() > 0
			DeleteJournal( fastloot )
			If i < 14 Then
				UO.WaitTargetObject( 'finditem' )
				UO.UseType( Scissor )
				GetPause(500)
				CheckLag()
			Else
				If i == 23 Then
					If UO.GetQuantity( 'finditem' ) == 1 Then
						UO.Ignore( 'finditem' )
					Else
						UO.MoveItem( 'finditem' )
						GetPause(350)
						CheckLag()
					Endif
				Else
					UO.MoveItem( 'finditem' )
					GetPause(350)
					CheckLag()
				Endif
			Endif
			UO.FindType( Nado[i], '-1', '1' )
		Wend
	Next
	UO.Print( 'The loot was finished' )
endsub
;
; Лут указанного трупа
;
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
;
; Пауза в переданных миллисекундах, с проверкой на сообщение о
; детекте фастлута. Не забудьте удалить эту фразу из журнала перед
; тем действием, после которого стоит эта пауза!
Sub GetPause( ms )
	VAR t = 0
	VAR msg = 'FastLoot detected.'
	repeat
		wait(50)
		t = t + 50
	until t >= ms OR UO.InJournal( msg )
	If UO.InJournal( msg ) Then
		wait(200)
	Endif
endsub

#####################################################################
;
; EmptyPack. Разгрузка пака от результатов зоннерства.
;
; v. 1.12b (c) Edred
;
sub EmptyPack()
;	VAR Sunduk = '0x40361048'				; сундук с барахлом
	VAR Cont = '0x4043310C'					; куда сгружать все
	VAR Regbag = '0x405F74B3'				; мешок для регов и поушенов
	VAR Box1 = UO.GetGlobal( 'BoxRegs' )	; regs
	VAR Box2 = UO.GetGlobal( 'BoxBand' )	; bandages, blood bandages, bottles
	VAR Box3 = UO.GetGlobal( 'BoxPick' )	; pickaxes, hatchets, cleavers, scissors
	VAR Box4 = UO.GetGlobal( 'BoxArms' )	; weapons, armors, robes
	VAR i, mx = 23
	VAR pak = '0x0E75', pakser
	DIM DropType[24], DropColor[24]
	; serpents scales
	DropType[0]   = '0x0F8E'
	DropColor[0]  = '0x0000'
	; volcanic ash
	DropType[1]   = '0x0F8F'
	DropColor[1]  = '0x0000'
	; bones
	DropType[2]   = '0x0F7E'
	DropColor[2]  = '0x0000'
	; eyes of newt
	DropType[3]   = '0x0F87'
	DropColor[3]  = '0x0000'
	; cintrines
	DropType[4]   = '0x0F23'
	DropColor[4]  = '0x0427'
	; batwings
	DropType[5]   = '0x0F78'
	DropColor[5]  = '0x0000'
	; vials of blood
	DropType[6]   = '0x0F7D'
	DropColor[6]  = '0x0000'
	; feathers
	DropType[7]   = '0x1BD1'
	DropColor[7]  = '0x0000'
	; dragons blood
	DropType[8]   = '0x0F82'
	DropColor[8]  = '0x0000'
	; water bottles
	DropType[9]   = '0x0E24'
	DropColor[9]  = '0x0482'
	; fertile dirt
	DropType[10]  = '0x0F81'
	DropColor[10] = '0x0000'
	; pearls
	DropType[11]  = '0x0F7A'
	DropColor[11] = '0x05B2'
	; dead woods
	DropType[12]  = '0x0F90'
	DropColor[12] = '0x06FB'
	; cut up leather
	DropType[13]  = '0x1067'
	DropColor[13] = '0x0000'
	; daemons bones
	DropType[14]  = '0x0F80'
	DropColor[14] = '0x0000'
	; wyrms hearts
	DropType[15]  = '0x0F91'
	DropColor[15] = '0x0000'
	; gold coin
	DropType[16]  = '0x0EED'
	DropColor[16] = '0x0000'
	; bloody bandages
	DropType[17]  = '0x0E20'
	DropColor[17] = '0x0000'
	; a Treasure Map
	DropType[18]  = '0x14ED'
	DropColor[18] = '0x0000'
	; empty bottles
	DropType[19]  = '0x0F0E'
	DropColor[19] = '0x0000'
	; pile of white hides
	DropType[20]  = '0x1078'
	DropColor[20] = '0x0481'
	; pile of black hides
	DropType[21]  = '0x1078'
	DropColor[21] = '0x083A'
	; pile of red hides
	DropType[22]  = '0x1078'
	DropColor[22] = '0x0424'
	; pile of green hides
	DropType[23]  = '0x1078'
	DropColor[23] = '0x0426'
	;
	DIM Regs[8]
	Regs[0] = '0x0F7A'	; black pearls
	Regs[1] = '0x0F7B'	; bood moss
	Regs[2] = '0x0F84'	; garlic
	Regs[3] = '0x0F85'	; ginseng
	Regs[4] = '0x0F86'	; mandrake root
	Regs[5] = '0x0F88'	; night shade
	Regs[6] = '0x0F8C'	; sulphorous ash
	Regs[7] = '0x0F8D'	; spiders silk
	VAR bandag = '0x0E21'					; бинты
	UO.Exec( 'terminate AutoZonner' )
	wait(500)
	UO.Exec( 'terminate AutoHeal' )
	wait(500)
	If UO.Targeting() Then
		UO.CancelTarget()
	Endif
;	UO.UseObject( Sunduk )
;	wait(500)
;	CheckLag()
	UO.UseObject( Cont )
	wait(500)
	CheckLag()
; ------- вставляем предварительную очистку всех паков в бэкпаке	
; v.1.10
	UO.FindType( pak )
	While UO.FindCount() > 0
		pakser = UO.GetSerial( 'finditem' )
		UO.UseObject( pakser )
		wait(1000)
		CheckLag()
		UO.FindType( -1, -1, pakser )
		While UO.FindCount() > 0
			UO.MoveItem( 'finditem' )
			wait(500)
			CheckLag()
			UO.FindType( -1, -1, pakser )
		Wend
		UO.Ignore( pakser )
		UO.FindType( pak )
	Wend
; ------- конец вставки очистки паков
	for	i = 0 to mx
;		UO.Print( 'TEST. i = ' + str(i) )
		UO.FindType( DropType[i], DropColor[i] )
		While UO.FindCount() > 0
			UO.MoveItem( 'finditem' , 0, Cont )
			wait(500)
			CheckLag()
			UO.FindType( DropType[i], DropColor[i] )
		Wend
	next
	; проверим бинты
	UO.FindType( bandag )
	While UO.FindCount() > 0
		If UO.GetColor( 'finditem' ) <> '0x0000' Then
			UO.MoveItem( 'finditem' , 0, Cont )
			wait(500)
			CheckLag()
		Else
			UO.Ignore( 'finditem' )
		Endif
		UO.FindType( bandag )
	Wend
	UO.IgnoreReset()
	; переложим реги в спецмешок
	for	i = 0 to 7
		UO.FindType( Regs[i] )
		While UO.FindCount() > 0
			UO.MoveItem( 'finditem' , 0, Regbag )
			wait(500)
			CheckLag()
			UO.FindType( Regs[i] )
		Wend
	next
	; тест оружия
	TestArmor()
endsub

#####################################################################
##########################               ############################
##########################   ПРОЦЕДУРЫ   ############################

#####################################################################
Sub GoHide()
	While not UO.Hidden() 
		UO.UseSkill('Hiding') 
		Wait(4000) 
	Wend
endsub

#####################################################################
Sub GetDagger( Dagger )
	If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) <> Dagger Then
		UO.FindType( Dagger )
		If UO.FindCount() == 0 Then
			return 0
		Endif
		UO.Equipt( 'Rhand', Dagger )
		wait(1000)
	Endif
	return 1
endsub

#####################################################################
; ================================================================
; Процедура подкормки чара. Параметры: сериал контейнера с медом, номер 
; сообщения до которого кормить, сколько съесть меда после сообщения,
; как часто кормить чара.
; Прохождение последнего периода контролируется через глобальную переменную 
; TimeProcess.
;
; ver. 1.05 (c) Edred
;
Sub EatChar( Sunduk, Nom, Add, TimeWait )
	; сообщения при кормежке
	UO.Print( 'TEST: eat to ' + str( Nom ) + ' message and ' + str( Add ) + ' more each ' + str( TimeWait ) + ' minutes' )
	VAR Eat1 = 'You eat the food, but are still extremely hungry'
	VAR Eat2 = 'After eating the food, you fell much less hungry'
	VAR Eat3 = 'You eat the food, and begin to feel more satiated'
	VAR Eat4 = 'You are nearly stuffed, but manage to eat the food'
	VAR Eat5 = 'You fell quite full after consuming the food'
	VAR Eat6 = 'You are stuffed!'
	VAR Eat7 = 'You are simply too full to eat any more!'
	VAR Med = '0x09EC'			; тип меда для подкормки
	VAR i, Eat, j
	; проверим, пора ли кормиться
	i = Val( UO.GetGlobal( 'TimeProcess' ) )
	i = ( UO.Timer() - i ) / 600 
	If i < TimeWait Then
		; рано кормиться
		UO.Print( 'Eat early! ' + str( i ) + ' from ' + str( TimeWait ) )
		return
	Endif
	; пора кормиться
	If Nom == 1 Then
		Eat = Eat1
	Endif
	If Nom == 2 Then
		Eat = Eat2
	Endif
	If Nom == 3 Then
		Eat = Eat3
	Endif
	If Nom == 4 Then
		Eat = Eat4
	Endif
	If Nom == 5 Then
		Eat = Eat5
	Endif
	If Nom == 6 Then
		Eat = Eat6
	Endif
	If Nom == 7 Then
		Eat = Eat7
	Endif
	UO.FindType( Med, '-1', Sunduk )
	If UO.FindCount() == 0 Then
		; мед кончился
		UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
		return
	Endif
	UO.Grab( '60', 'finditem' )
	Wait( 1000 )
	repeat
		DeleteJournal( Eat )
		UO.UseType( Med )
		Wait( 1000 )
	until NOT UO.InJournal( Eat )
	If Add > 0 Then
		For j = 1 To Add
			UO.UseType( Med )
			Wait( 1000 )
		Next
	Endif
	; хватит кормиться
	; выгрузим остатки меда обратно
	UO.Findtype( Med, '-1', 'backpack' )
	UO.MoveItem( 'finditem', 0, Sunduk )
	Wait( 1000 )
	; Сбросим счетчик
	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
endsub

#####################################################################
Sub CheckLag()
	DeleteJournal( 'backpack' )
	UO.Click( 'backpack' )
	repeat
		wait(100)
	until UO.InJournal( 'backpack' )
	return
end sub

#####################################################################
Sub DeleteJournal( string1 )
	VAR nom = UO.InJournal( string1 )
	If nom > 0 Then
		UO.SetJournalLine( Nom - 1, 'string replaced' )
		DeleteJournal( string1 )
	Endif
endsub

#####################################################################
Sub Recalling( Runbk, NRune ) 
	; Runbk - сериал или ссылка на объект рунбуки 
	; NRune - десятичный номер (текстом) руны для реколла 
	VAR myx = UO.GetX()
	VAR myy = UO.GetY()
	VAR OldMana = UO.Mana
	VAR i = 0
	DeleteJournal( 'fizzles' )
	UO.Exec("recall " + Runbk + " " + NRune) 
	repeat
		CheckLag()
		wait(1000)
		i = i + 1
	until ( i > 6 ) OR ( UO.Mana < OldMana - 8 ) OR UO.InJournal( 'fizzles' )
	wait(500)
	If myx == UO.GetX() AND myy == UO.GetY() Then
		UO.WarMode( 'flip' ) 
		wait(100) 
		UO.WarMode( 'flip' )
		Recalling( Runbk, NRune ) 
	Endif
endsub 

Sub GetWord( st, nom )
; (c) Edred
; Возвращает слово из строки str за номером num
; если такого слова нет - возвращаем ''
;
; Разделителем слов считаем пробел. Несколько пробелов подряд считаются за один.
; Функция сделана без рекурсии специально для считывания слов из сверхдлинных строк!
;
	VAR tmpst, i, dlin, kol = 0, start = 0
	dlin = len( st )
	For i=0 To dlin - 1
		If mid( st, i, 1 ) == ' ' OR i == dlin - 1 Then
			kol = kol + 1
			If kol == nom Then
				; это первый пробел после нужного нам слова
				tmpst = mid( st, start, i - start )
				return tmpst
			Else
				While mid( st, i, 1 ) == ' '
					i = i + 1
				Wend
				If kol == nom - 1 Then
					start = i
				Endif
			Endif
		Endif
	Next
	tmpst = ''
	return tmpst
endsub 

#================================================#
#  ПРОЦЕДУРЫ ХОЖДЕНИЯ                            #
#================================================#
; Autor - Sergious, Edited - Edred.
;
; Процедура GoToTile( X, Y, D, T ) 
; X,Y: координаты точки назначения 
; D: точность подхода (необходимое расстояние) 
; T: строгость подхода (точно ли должно быть то расстояние... True/False) 
; 
; Установите в своем скрипте следующие глобальные переменные:
; -----------------------------------------------------------
; MovDelay  - Пауза между шагами. Обычное значение - '1000'
; MovNumber - Количество шагов при смене дислокации 
; KoefEp    - Значение ширины угла хождения при определении направления. 
;             Если на пути встречаются сложные и широкие препятствия - 
;             увеличить. '0.172' - сбалансированный. 
#===================================================================#
; ============== GOTOTILE ===
;
Sub GoToTile( OX, OY, N, S ) 
	VAR myx, myy, MD, J 
	VAR Lx1, Ly1 
	VAR Lx2, Ly2 
	VAR Sx, Sy 
	VAR T 
	VAR Des = N 
	VAR MoveDelay = 100
	J = 1 
	MD = MoveDelay * 1.5 
	myx = uo.getx() 
	myy = uo.gety() 
	MoveOnce( GetDir( uo.getx(), uo.gety(), ox, oy), MD, False)
	Sx = 0 
	Sy = 0 
	Lx1 = uo.getx() / 2 
	Ly1 = uo.gety() / 2 
	Lx2 = Lx1 / 2 
	Ly2 = Ly1 / 2 
	T = UO.Timer() 
	If (GetDistance(ox, oy) <> N) OR ( (NOT S) AND GetDistance(ox, oy) > N ) Then 
		UO.Exec('exec PermResend') 
	EndIf 
	While ( (GetDistance(ox, oy) <> N) OR ((NOT S) and GetDistance(ox, oy) > N) ) and ( OX >= 0 ) and ( OY >= 0 ) 
		If ( (UO.Timer() - T) * 15 > MoveDelay ) Then 
			T = UO.Timer() 
			Lx2 = Lx1 
			Ly2 = Ly1 
			Lx1 = myx 
			Ly1 = myy 
			myx = uo.getx() 
			myy = uo.gety() 
		endIf 
		MD=MoveDelay 
		If ((OX-uo.getx())*(OX-uo.getx())+(OY-uo.gety())*(OY-uo.gety())>0) Then 
			MD = MD * 3 / GetDistance( ox, oy ) 
		EndIf 
		wait(MD) 
		If GetDistance( OX, OY ) > Des Then 
			MoveOnce(GetDir(uo.GetX(),uo.GetY(),ox,oy),MD,False)
		Else 
			If S Then 
				If GetDistance(OX,OY)<Des Then 
					If GetDistance(OX,OY)<>0 Then 
						MoveOnce(GetDir(ox,oy,uo.GetX(),uo.GetY()),MD,False)
					Else 
						MoveOnce(GetDir(uo.GetX(),uo.GetY(),Lx2,Ly2),MD,False) 
					EndIf 
				EndIf 
			EndIf 
		EndIf 
		If GetDistance(OX,OY)<>Des Then 
			If (Lx2==uo.getx()) and (Ly2==uo.gety()) Then 
				If (Sx<>uo.getx()) or (Sy<>uo.gety()) Then 
					J=1 
				EndIf 
				J=J+1 
				UO.Resend() 
				Sx = uo.getx() 
				Sy = uo.gety() 
				Stun(ox,oy,J) 
			EndIf 
		EndIf 
	Wend 
	UO.Exec( 'terminate PermResend' ) 
endsub 
;
; ============ MOVEONCE ===
; Процедура MoveOnce - хождение в определённую сторону 
; Направления:
; Система направлений по клавишам Нумпада 
; 8 = 1 | 2 = -1 
; 9 = 2 | 1 = -2 
; 6 = 3 | 4 = -3 
; 3 = 4 | 7 = -4 
;
; Такая система позволяет с лёгкостью получать направление, обратное 
; данному... 
;
Sub MoveOnce( Dir, Del, Rev ) 
	VAR Num 
	Var MoveNumber = 1
	If Rev Then 
		Num = MoveNumber + 1 
	Else 
		Num = MoveNumber 
	EndIf 
	If ( Num > 0 ) and ( Dir <> 0 ) Then 
		If Dir == 1 Then 
			UO.Press( 38, Num, Del ) 
		EndIf 
		If Dir == 2 Then 
			UO.Press( 33, Num, Del ) 
		EndIf 
		If Dir == 3 Then 
			UO.Press( 39, Num, Del ) 
		EndIf 
		If Dir == 4 Then 
			UO.Press( 34, Num, Del ) 
		EndIf 
		If Dir == -1 Then 
			UO.Press( 40, Num-1, Del ) 
		EndIf 
		If Dir == -2 Then 
			UO.Press( 35, Num, Del ) 
		EndIf 
		If Dir == -3 Then 
			UO.Press( 37, Num, Del ) 
		EndIf 
		If Dir == -4 Then 
			UO.Press( 36, Num, Del ) 
		EndIf 
		If Rev Then 
			If Dir <> -1 Then 
				UO.Press( 40, 1, Del ) 
			EndIf 
		EndIf 
	EndIf 
endsub 
;
; ============== GETDIR ===
; Функция GetDir возвращает направление, по которому надо идти 
; к координате 
;
Sub GetDir( myx, myy, ox, oy ) 
	VAR I, J 
	J = 0 
	VAR X = ox - myx 
	VAR Y = oy - myy 
	I = GetQDir( Abs(X), Abs(Y) ) 
	If X >= 0 Then 
		If Y >= 0 Then 
			If I == 1 Then 
				J = -2 
			Else 
				If I == 2 Then 
					J = -1 
				Else 
					If I == 3 Then 
						J = 4 
					EndIf 
				EndIf 
			EndIf 
		Else 
			If I == 1 Then 
				J = 2 
			Else 
				If I == 2 Then 
					J = 3 
				Else 
					If I == 3 Then 
						J = 4 
					EndIf 
				EndIf 
			EndIf 
		EndIf 
	Else 
		If Y >= 0 Then 
			If I == 1 Then 
				J = -2 
			Else 
				If I == 2 Then 
					J = -3 
				Else 
					If I == 3 Then 
						J = -4 
					EndIf 
				EndIf 
			EndIf 
		Else 
			If I == 1 Then 
				J = 2 
			Else 
				If I == 2 Then 
					J = 1 
				Else 
					If I == 3 Then 
						J = -4 
					EndIf 
				EndIf 
			EndIf 
		EndIf 
	EndIf 
	RETURN J 
endsub 
;
; =============== GETQDIR ===
;
;
Sub GetQDir( x, y ) 
	VAR Ep = 0.172
	VAR J = 0 
	If X == 0 Then 
		J = 1 
	Else 
		If ( Y / X ) < Ep Then 
			J = 3 
		Else 
			If ( X / Y ) < Ep Then 
				J = 1 
			Else 
				J = 2 
			EndIf 
		EndIf 
	EndIf 
	RETURN J 
endsub 
;
; ============== GETDISTANCE ===
; Функция GetDistance возвращает расстояние до координат 
; (как UO.GetDistance - до объекта) 
;
; Почему так - потому что учим математику :)
;
Sub GetDistance( X, Y ) 
	VAR A, B, C
	A = abs( X - UO.GetX() )
	B = abs( Y - UO.GetY() )
	If A > B Then 
		C = A 
	Else 
		C = B 
	EndIf 
	Return C 
endsub 
;
; ============= PERP ===
; Функция Perp возвращает направление, перпендикулярное введённому 
;
Sub Perp( Dir ) 
	VAR D = Dir 
	If Dir == 1 Then 
		D = 3 
	EndIf 
	If Dir == 2 Then 
		D = 4 
	EndIf 
	If Dir == 3 Then 
		D = -1 
	EndIf 
	If Dir == 4 Then 
		D = -2 
	EndIf 
	If Dir == -1 Then 
		D = -3 
	EndIf 
	If Dir == -2 Then 
		D = -4 
	EndIf 
	If Dir == -3 Then 
		D = 1 
	EndIf 
	If Dir == -4 Then 
		D = 2 
	EndIf 
	RETURN D 
endsub 
;
; =============== STUN ===
; Обход препятствий
;
Sub Stun( X, Y, N ) 
	VAR I 
	VAR myx 
	VAR myy 
	VAR MoveDelay = 100
	myx = uo.getx() 
	myy = uo.gety() 
	For I=1 to N 
		MoveOnce(perp(GetDir(myx,myy,x,y)),MoveDelay,False)
	Next 
	Wait(MoveDelay) 
	UO.Resend() 
	If (myx==uo.getx()) and (myy==uo.gety()) Then 
		For I=1 to N 
			MoveOnce(-perp(GetDir(myx,myy,x,y)),MoveDelay,False)
		Next 
		Wait(MoveDelay) 
		UO.Resend() 
	EndIf 
	If (myx==uo.getx()) and (myy==uo.gety()) Then 
		For I=1 to N 
			MoveOnce(-GetDir(myx,myy,x,y),MoveDelay,False)
		Next 
		Wait(MoveDelay) 
		Stun(x,y,N) 
	EndIf    
endsub 
;
; ============= ABS ===
; Убирает знак минуса в отрицательных числах
;
Sub abs( a ) 
	VAR b 
	If a < 0 Then 
		b = -a 
	Else 
		b = a 
	endif 
	return b 
endsub 
;
; ============== PERMRESEND ===
;
Sub PermResend() 
	Var Mn = 9 
	VAR MoveDelay = 100
	Repeat 
		UO.Resend() 
		Wait( MoveDelay * Mn ) 
	Until ( 1 > 2 ) 
endsub
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

SkillUp.sc

Code: Select all

#===================================================================#
# SkillUp, v.502.23                                                 #
# Скрипты для прокачки скиллов                                      #
#===================================================================#
#                                                                   #
# 1. Прокачка крафтов                                               #
# -------------------                                               #
#  1. Bowcraft. Крафтим шафты                                       #
#  2. Bowcraft. Крафтим стрелы                                      #
#  3. Poison                                                        #
#  4. Mining. Плавим руду                                           #
#  5. Tailoring                                                     #
#  6. Tailoring2                                                    #
#  7. Tinker                                                        #
#  8. TinkerWood                                                    #
#  9. Carpentry                                                     #
# 10. CarpentryD                                                    #
# 11. Cartograph                                                    #
# 12. Inscript. Крафтим скроллы стрелок                             #
# 13. Inscript. Крафтим скроллы реколлов                            #
# 14. Veterinary (для двух чаров)                                   #
# 15. Veterinary (для одного чара)                                  #
#                                                                   #
# 2. Прокачка других скиллов                                        #
# --------------------------                                        #
#  1. Magery                                                        #
#  2. Music                                                         #
#  3. Provocation                                                   #
#  4. Enticment                                                     #
#  5. Forensic                                                      #
#  6. Hiding                                                        #
#  7. Hiding & Stealth                                              #
#  8. MaceFighting (на кукле)                                       #
#  9. Fencing (на кукле)                                            #
# 10. Swordsmanship (на кукле)                                      #
# 11. Anatomy, Animal lore, Evalution Int                           #
# 12. Camping                                                       #
# 13. Cooking                                                       #
# 14. Spirit Speak                                                  #
# 15. Herding                                                       #
# 16. Lockpicking                                                   #
# 17. Begging                                                       #
# 18. Snooping                                                      #
# 19. Stealing                                                      #
#                                                                   #
# 3. Процедуры                                                      #
# ------------                                                      #
#                                                                   #
#===================================================================#

#===================================================================#
#
# I. Прокачка Крафтов
#
#####################################################################
; Bowcraft. v.1.03b (c) Edred
;
; Чар берет из сундука логи, крафтит из них шафты
; и складывает эти шафты в этот же сундук.
; Если логи закончились - выход.
; Если даггер (или что вы там используете) сломался - 
; скрипт найдет аналогичный по типу в бэкпаке и возьмет
; в руки.
;
; 1.03b: Проверка, если Kolvo = 1, то берем три и кладем обратно два
;        лога.
; 
sub bowcraft() 
	VAR Sunduk = '0x405210C8' 		; Сериал сундука
	VAR Logi = '0x1BDD' 			; Тип логов
	VAR Shafts = '0x1BD4' 			; Тип шафтов
	VAR Kolvo = 10					; Брать логов для одного крафта
	VAR k = 0, j, dagger
	dagger = UO.ObjAtLayer( 'Rhand' )
	UO.SetGlobal( 'instrtype', UO.GetGraphic( dagger ) )
	While TRUE
		UO.FindType( Logi, -1, Sunduk )	; Ищем логи в сундуке
		If UO.FindCount() == 0 Then
			UO.Print("Logs not found, script terminated")
			return
		else
			j = UO.GetQuantity( 'finditem' )
			If j > Kolvo Then
				UO.Print( 'I can use ' + str( j ) + ' logs' )
			else
				UO.Print( "I can't use " + str( j ) + " logs" )
				return
			Endif
		Endif
		If Kolvo == 1 Then
			; v. 1.03
			UO.Grab( '3', 'finditem' )
			wait(500)
			UO.FindType( Logi )
			UO.MoveItem( 'finditem', '2', Sunduk )
			wait(500)
		Else
			UO.Grab( Str( Kolvo ), 'finditem' )
			wait(500)
		Endif
		; А это - динамическая пауза на мув
		while UO.Count( Logi ) < Kolvo
			wait(100)
		wend
		; проверка на то, что в руках по-прежнему даггер
		If CheckInstr() == 0 Then
			UO.Print("You don't have daggers!" )
			return
		Endif
		UO.DeleteJournal()
		UO.CancelMenu()
		UO.WaitMenu ('What do you want to carve', 'shaft' )
		UO.WaitTargetType( Logi )
		UO.UseObject( dagger ) 
		k = 0
		while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 50 )
			k = k + 1
			wait(300)
		wend
		If UO.Count( Shafts ) > 0 then
			UO.FindType( Shafts, -1, -1 )
			UO.MoveItem( 'finditem', 0, Sunduk )
			wait(500)
			while UO.Count( Shafts ) > 0
				wait(100)
			wend
			UO.Print( 'Shafts moved' )
		Endif
	Wend
end sub

#####################################################################
; Bowcraft2. v.1.04b (c) Edred
;
; Чар берет из сундука шафты и перья, крафтит из них стрелы и
; складывает эти стрелы в этот же сундук.
; Если шафты или перья закончились - выход.
;
sub bowcraft2() 
	VAR Sunduk = '0x405210C8' 		; Сериал сундука
	VAR Shafts = '0x1BD4' 			; Тип шафтов
	VAR Feather = '0x1BD1'			; Тип перьев
	VAR Arrows = '0x0F3F'			; Тип стрел
	VAR Kolvo = 1					; Брать шафтов для одного крафта
	VAR k = 0, j
   	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
	UO.CancelMenu()
	UO.AutoMenu ('Select arrow type', 'arrow' )
	While TRUE
		EatChar( Sunduk, 2, 1, 120 )
		If UO.Count( Shafts ) == 0 Then
			UO.FindType( Shafts, -1, Sunduk )
			If UO.FindCount() == 0 Then
				UO.Print("Shafts not found, script terminated")
				return
			Endif
			UO.Grab( Str( Kolvo ), 'finditem' )
			wait(500)
			while UO.Count( Shafts ) < Kolvo
				wait(100)
			wend
			CheckLag()
		Endif
		If UO.Count( Feather ) == 0 Then		
			UO.FindType( Feather, -1, Sunduk )
			If UO.FindCount() == 0 Then
				UO.Print("Feather not found, script terminated")
				return
			Endif
			UO.Grab( Str( Kolvo ), 'finditem' )
			wait(500)
			while UO.Count( Feather ) < Kolvo
				wait(100)
			wend
			CheckLag()
		Endif
		UO.DeleteJournal()
		UO.UseType( Shafts ) 
		k = 0
		while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 50 )
			k = k + 1
			wait(300)
		wend
		If UO.Count( Arrows ) > 0 then
			UO.FindType( Arrows, -1, -1 )
			UO.MoveItem( 'finditem', 0, Sunduk )
			wait(500)
			while UO.Count( Arrows ) > 0
				wait(100)
			wend
			UO.Print( 'Arrows moved' )
		Endif
	Wend
end sub

#####################################################################
sub poison()
; v. 1.02 (c) Edred
; Положите рядом с чаром на пол побольше меду и lesser poison,
; поставьте рядом сундук, занесите его сериал в переменную
; Sunduk (туда будут сбрасываться пустые бутылки и отравленный мед)
; Если что-то не берет - значит положили далеко от чара,
; поправьте цифру в команде set finddistance
;
	VAR Sunduk = '0x404331B7'
	VAR Med = '0x09EC'
	VAR LesPois = '0x0F0A'
	VAR EmpBot = '0x0F0E'
	VAR MedSer, k
	UO.Exec('set finddistance 2') 
	While TRUE
		UO.FindType( Med, -1, 1 )
		If UO.FindCount() == 0 Then
			UO.Print("Jars not found, script terminated")
			return
		Endif
		UO.Grab( '1', 'finditem' )
		wait( 2000 )
		UO.FindType( LesPois, -1, 1 )
		If UO.FindCount() == 0 Then
			UO.Print("Bottle of Poison not found, script terminated")
			return
		Endif
		UO.Grab( '1', 'finditem' )
		wait( 2000 )
		UO.DeleteJournal()
		UO.WaitTargetType( Med )
		UO.UseObject( 'finditem' )
		k = 0
		while NOT UO.InJournal('You apply lesser poison') AND NOT UO.InJournal('You fail to apply lesser poison') AND ( k < 30 )
			k = k + 1
			wait(500) 
		wend
		UO.Print( 'meda v pake ' + str( UO.Count( Med ) ) )
		if UO.Count( Med ) > 0 then
			UO.FindType( Med, -1, 'backpack' )
			UO.MoveItem( 'finditem', 0, Sunduk )
			wait( 2000 )
			UO.Print( 'Jar dropped' )
		end if
		if UO.Count( EmpBot ) > 0 then
			UO.FindType( EmpBot, -1, 'backpack' )
			UO.MoveItem( 'finditem', 0, Sunduk )
			wait( 2000 )
			UO.Print( 'Empty bottle dropped' )
		end if
	Wend
end sub

#####################################################################
; Training of Mining, ver 2.00b, (c) Edred
; 2.00b - добавляем сундук, откуда берется руда по 100 шт. и кидается
;         под ногм. Дальше как было. Заодно все правлю и переписываю
;         более правильно :)
sub Smelt()
	VAR Sunduk = '0x40437910'			; Сериал сундука с рудой
	VAR Ruda1 = '0x19B9'				; Тип руды
	VAR Ruda2 = '0x19B8'				; Тип руды - 3 шт.
	VAR Ruda3 = '0x19BA'				; Тип руды - 2 шт.
	VAR Ruda4 = '0x19B7'				; Тип руды - 1 шт.
	VAR Ing1 = '0x1BEF'					; Тип ингов металлов
	VAR Ing2 = '0x1BF2'					; Тип ингов строймата
	VAR MaxVes = 200					; Максимальный вес пака
	While UO.SkillVal( 'Mining' ) < 1000
		repeat	
			UO.Findtype( Ruda1, '-1', '1' )		; Ищем руду на земле
			If UO.Findcount() == 0 Then
				UO.Findtype( Ruda2, '-1', '1' )
				If UO.Findcount() == 0 Then
					UO.Findtype( Ruda3, '-1', '1' )
					If UO.Findcount() == 0 Then
						UO.Findtype( Ruda4, '-1', '1' )
						If UO.Findcount() == 0 Then
							If GetOre( Sunduk, Ruda1 ) == 0 Then
								UO.Print( "No more ore for smelt..." )
								Return
							Endif
						Endif
					Endif
				Endif
			Endif
		until UO.FindCount() > 0
		UO.Grab( '1', 'finditem' )
		Wait(500)
		CheckLag()
		UO.UseType( Ruda4 )				; переплавляем
		Wait(500)
		CheckLag()
		If UO.Weight > MaxVes Then
			; Максимальный вес пака превышен - разгружаемся
			UO.Findtype( Ing1 )
			If UO.Findcount() > 0 Then
				UO.MoveItem( 'finditem', '0', Sunduk )
				Wait(500)
				CheckLag()
			Endif
			UO.Findtype( Ing2 )
			If UO.Findcount() > 0 Then
				UO.MoveItem( 'finditem', '0', Sunduk )
				Wait(500)
				CheckLag()
			Endif
		Endif
	Wend
endsub

Sub GetOre( cont, typ )
	; Взять из сундука 100 руды и бросить под ноги.
	; Если руды нет - возвращаем 0, если есть 1
	UO.FindType( typ, '-1', cont )
	If UO.FindCount() == 0 Then
		return 0
	Else
		UO.Grab( '100', 'finditem' )
		wait(500)
		CheckLag()
		UO.FindType( typ )
		If UO.FindCount() == 0 Then
			UO.Print( 'Idiot! Your script is fuck!' )
		Else
			UO.Drophere( 'finditem' )
			wait(500)
			CheckLag()
		Endif
	Endif
	return 1
endsub

#####################################################################
; Tailoring. v.1.04b (c) Edred
;
; Два сундука: в одном много кожи и воска, а также лежит много пустых мешков.
; В другой чар будет класть мешки и наполнять их картами (по 200 штук в
; каждый).
;
; (1.04b) - переделываю. Все берется из одного сундука, и мат, и мешки.
; Переходим заодно на AutoMenu, вводим чеклаг и всякие доп проверки.
;
sub tailoring() 
	VAR Sunduk1 = '0x4043310C' 		; Сериал сундука с пустыми мешками
	VAR Sunduk2 = '0x40403350' 		; Сериал пустого сундука
	VAR Meshok = '0x0E76' 			; Тип мешка
	VAR Shkur = '0x1067' 			; Тип шкур
	VAR Vosk = '0x1423' 			; Тип воска
	VAR Kit = '0x0F9D' 			; Тип инструмента тейлора
	VAR Map = '0x14EB' 			; Тип карты
	VAR Kolvo = 200 			; Брать шкур и воска
	VAR MeshSer, j, ShkurSer, k, i
	VAR Med = '0x09EC'			; Тип меда
	VAR success = 'You put' 
	VAR fizzle = 'fail'
	UO.CancelMenu()
	UO.AutoMenu( "Leather", "Blank's" )
	UO.AutoMenu("Blank's", "blank map" )
	While TRUE
		# Перекладываем один мешок в сундук 2
		UO.FindType( Meshok, '-1', Sunduk1 ) 	; Ищем мешок в сундуке 1
		MeshSer = UO.GetSerial( 'finditem' )
		UO.MoveItem( MeshSer, '0', Sunduk2 )
		wait(500)
		CheckLag()
		i = 0
		repeat
			If UO.Count( Shkur ) < 10 Then
				If GetResource( Shkur, 200 - UO.Count( Shkur ), Sunduk1 ) == 0 Then
					return
				Endif
			Endif
			If UO.Count( Vosk ) < 10 Then
				If GetResource( Vosk, 200 - UO.Count( Vosk ), Sunduk1 ) == 0 Then
					return
				Endif
			Endif
			UO.Print('Ostalos ' + Str( UO.Count( Shkur ) ) + ' shkur' )
			DeleteJournal( success )
			DeleteJournal( fizzle )
			UO.FindType( Shkur )
			UO.WaitTargetObject( 'finditem' )
			UO.UseType( Kit )
			k = 0
			repeat
				k = k + 1
				wait(500)
			until UO.InJournal( success ) OR UO.InJournal( fizzle ) OR ( k > 30 )
			If UO.Count( Map ) > 0 Then
				i = i + 1
				UO.FindType( Map )
				UO.MoveItem( 'finditem', '0', MeshSer )
				wait(500)
				CheckLag()
				UO.Print( str(i) + ' maps moved' )
			Endif
		Until i > 199
	Wend
endsub

#####################################################################
; Tailor2. v.1.05b (c) Edred
;
sub tailoring2()
	VAR Sunduk = "0x4043310C"
	VAR Kozha = "0x1067"
	VAR Vosk = "0x1423"
	VAR Kit = "0x0F9D"
	VAR Scrol = "0x0E34"
	VAR k
	UO.CancelMenu()
	wait(500)
	UO.AutoMenu( "Leather", "Blank's" )
	UO.AutoMenu( "Blank's", "blank scroll" )
	While TRUE
		If UO.Count( Kozha ) == 0 Then
			UO.FindType( Kozha, '-1', Sunduk )
			If UO.FindCount() == 0 Then
				UO.Print("Leathers not found, script terminated")
				return
			Endif
			UO.Grab( '1', 'finditem' )
			wait(500)
			while UO.Count( Kozha ) == 0
				wait(100)
			wend
		Endif
		If UO.Count( Vosk ) == 0 Then
			UO.FindType( Vosk, '-1', Sunduk )
			If UO.FindCount() == 0 Then
				UO.Print("Beeswaxs not found, script terminated")
				return
			Endif
			UO.Grab( '1', 'finditem' )
			wait(500)
			while UO.Count( Vosk ) == 0
				wait(100)
			wend
		Endif
		UO.DeleteJournal()
		UO.WaitTargetType( Kozha )
		UO.UseType( Kit )
		k = 0
		while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 50 )
			k = k + 1
			wait(300) 
		wend
		if UO.Count( Scrol ) > 0 then
			UO.FindType( Scrol )
			UO.MoveItem( 'finditem', '0', Sunduk )
			wait( 500 )
			while UO.Count( Scrol ) > 0
				wait(100)
			wend
		endif
	Wend
	UO.CancelMenu()
end sub

#####################################################################
; Tinker. v.1.03b (c) Edred
;
; Чар берет из сундука инготы, крафтит из них бутылки
; и складывает эти бутылки в этот же сундук.
; Если инги закончились - выход.
;
sub tinker() 
	VAR Sunduk = '0x4052561D' 		; Сериал сундука
	VAR Ingi = '0x1BEF' 			; Тип ингов
	VAR Instrum = '0x1EBC' 			; Тип инструмента тинкера
	VAR Bottle = '0x0F0E' 			; Тип бутылки
	VAR Kolvo = 200 				; Брать ингов
	VAR k = 0
	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
								; Начало отсчета скрипта
	While TRUE
		EatChar( Sunduk, 2, 2, 60 )
		UO.FindType( Ingi, -1, Sunduk )	; Ищем инги в сундуке
		If UO.FindCount() == 0 Then
			UO.Print("Iron Ingots not found, script terminated")
			return
		Endif
		UO.Grab( Str( Kolvo ), 'finditem' )
		wait( 2000 )
		While UO.Count( Ingi ) > 0
			; Пока в паке есть инги
;			UO.CancelMenu()
			UO.Print('Ostalos ' + Str( UO.Count( Ingi ) ) + ' ingots' )
			UO.DeleteJournal()
			UO.WaitMenu ('Tinkering', 'Tools', 'Tools', 'empty bottle' )
			UO.UseType( Instrum )
			k = 0
			while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 30 )
				k = k + 1
				wait(500) 
			wend
			if UO.Count( Bottle ) > 0 then
				UO.FindType( Bottle, -1, -1 )
				UO.MoveItem( 'finditem', 0, Sunduk )
				wait( 1000 )
				UO.Print( 'Bottle moved' )
			end if
		Wend 
	Wend
end sub

#####################################################################
; TinkerWood. v.1.02b (c) Edred
;
; Чар берет с пола логи, крафтит из них игровые доски
; и скидывает их в трэш.
; Если логи на полу закончились - выход.
;
sub tinkerwood() 
	VAR MyTrash = '0x4042F38E' 		; Сериал мусорки
	VAR Logi = '0x1BDD' 			; Тип логов (logs type)
	VAR Instrum = '0x1EBC' 			; Тип инструмента тинкера
	VAR Chess = '0x0E1C' 			; Тип игровой доски
	VAR Kolvo = 300 				; Брать логов (Count of logs for a one grab)
	VAR j, k
	While TRUE
		UO.FindType( Logi, -1, 1 ) 		; Ищем логи на полу
		UO.Grab( Str( Kolvo ), 'finditem' ) 	; Кладем логи в пак
		wait( 1000 )
		If UO.FindCount() == 0 Then
			UO.Print("Logs not found, script terminated")
			return
		Endif
		While UO.Count( Logi ) > 4
			; Пока в паке есть логи
			UO.Print('Ostalos ' + Str( UO.Count( Logi ) ) + ' logov' )
			UO.DeleteJournal()
			UO.CancelMenu()
			UO.WaitMenu ('Tinkering', 'Tavern Types', 'Tavern Types', 'backgammon board' )
			UO.UseType( Instrum )
			k = 0
			while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 30 )
				k = k + 1
				wait(500) 
			wend
			; Wait( 14000 )
			; Скрафтили доску
			; Сразу переложим ее в трэш
			while UO.Count( Chess ) > 0
				UO.FindType( Chess )
				UO.MoveItem( 'finditem', 0, MyTrash )
				wait( 1000 )
				UO.Print( 'Backgammon board trashed' )
			wend
		Wend 
	Wend
end sub

#####################################################################
; TinkerLockPick. v.1.00b (c) Edred
;
; Чар берет из сундука инготы, крафтит из них отмычки
; и складывает эти отмычки в этот же сундук.
; Если инги закончились - выход.
;
sub tinker() 
	VAR Sunduk = '0x4052561D' 		; Сериал сундука
	VAR Ingi = '0x1BEF' 			; Тип ингов
	VAR Instrum = '0x1EBC' 			; Тип инструмента тинкера
	VAR LPick = '0x14FB' 			; Тип отмычки
	VAR Kolvo = 200 				; Брать ингов
	VAR k = 0
	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
								; Начало отсчета скрипта
	While TRUE
		EatChar( Sunduk, 2, 2, 60 )
		UO.FindType( Ingi, -1, Sunduk )	; Ищем инги в сундуке
		If UO.FindCount() == 0 Then
			UO.Print("Iron Ingots not found, script terminated")
			return
		Endif
		UO.Grab( Str( Kolvo ), 'finditem' )
		wait( 2000 )
		While UO.Count( Ingi ) > 0
			; Пока в паке есть инги
;			UO.CancelMenu()
			UO.Print('Ostalos ' + Str( UO.Count( Ingi ) ) + ' ingots' )
			UO.DeleteJournal()
			UO.WaitMenu ('Tinkering', 'Keys', 'Keys and Lockpicks', 'Iron lockpick' )
			UO.UseType( Instrum )
			k = 0
			while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 30 )
				k = k + 1
				wait(500) 
			wend
			if UO.Count( LPick ) > 0 then
				UO.FindType( LPick, -1, -1 )
				UO.MoveItem( 'finditem', 0, Sunduk )
				wait( 1000 )
				UO.Print( 'Lockpicks moved' )
			end if
		Wend 
	Wend
end sub

#####################################################################
; Carpentry. v.1.13b (c) Edred
;
; Чар берет из сундука 1 пустой мешок, кладет этот мешок в сундук 2,
; берет с пола логи, крафтит из них удочки и складывает эти удочки
; в этот мешок в сундуке 2. Если логи на полу или пустые мешки 
; кончились - выход
;
sub carpentry() 
	VAR Sunduk1 = '0x4017439B' 		; Сериал сундука с пустыми мешками
	VAR Sunduk2 = '0x4000F46C' 		; Сериал пустого сундука
	VAR Meshok = '0x0E76' 			; Тип мешка
	VAR Logi = '0x1BDD' 			; Тип логов
	VAR Rubanok = '0x1031' 			; Тип инструмента карпентера
	VAR Udochka = '0xDBF' 			; Тип удочки
	VAR Kolvo = 460 			; Брать логов (2 лога = 1 удочка)
	VAR MeshSer, j, k
	While TRUE
		UO.FindType( Logi, -1, 1 ) 		; Ищем логи на полу
		UO.Grab( Str( Kolvo ), 'finditem' ) 	; Кладем логи в пак
		wait( 2000 )
		If UO.FindCount() == 0 Then
			UO.Print("Logs not found, script terminated")
			return
		Endif
		UO.FindType( Meshok, -1, Sunduk1 ) 		; Ищем мешок в сундуке 1
		MeshSer = UO.GetSerial( 'finditem' )
		UO.Grab( '1', 'finditem' ) 			; Кладем его в бэкпак
		wait( 2000 )
		UO.MoveItem( MeshSer, 0, Sunduk2 )
		wait( 2000 )
		While UO.Count( Logi ) > 0
			; Пока в паке есть логи
			UO.Print('Ostalos ' + Str( UO.Count( Logi ) ) + ' logov' )
			UO.DeleteJournal()
			UO.CancelMenu()
			UO.WaitMenu ('Carpentry', 'Fishing Poles', 'Fishing Poles', 'fishing pole' )
			UO.UseType( Rubanok )
			k = 0
			while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 30 )
				k = k + 1
				wait(500) 
			wend
			; Wait( 14000 )
			; Скрафтили удочку
			; Сразу переложим ее в мешок
			if UO.Count( Udochka ) > 0 then
				UO.FindType( Udochka, -1, 'backpack' )
				UO.MoveItem( 'finditem', 0, MeshSer )
				wait( 2000 )
				UO.Print( 'Udochka perelozhena' )
			end if
		Wend 
	Wend
end sub

#####################################################################
; Carpentry. v.1.14D (c) Edred
;
; Чар берет берет с пола логи, крафтит из них удочки и скидывает удочки
; в трэш. Если логи на полу кончились - выход.
; (Get logs from ground and craft fishing pole. Move fishing pole trash)
;
; v. 1.13D Special Edition (for Democratic)
; v. 1.14D Special Edition (for Chyzzzz): берем логи из сундука. Заодно
;          немного причесываю скрипт и переходим на Automenu.
;
sub carpentryD() 
	VAR MyTrash = '0x4017439B' 		; Сериал мусорки (ID of trash)
	VAR Sunduk = '0x4017439B'		; Сериал сундука с логами
	VAR Logi = '0x1BDD' 			; Тип логов (logs type)
	VAR Rubanok = '0x1031' 			; Тип инструмента (carpentry tools type)
	VAR Udochka = '0xDBF' 			; Тип удочки (fishing pole type)
	VAR Kolvo = 200 			; Брать логов (Count of logs for a one grab)
	VAR j, k, sum = 0
	UO.CancelMenu()
	UO.AutoMenu ('Carpentry', 'Fishing Poles' )
	UO.AutoMenu ('Fishing Poles', 'fishing pole' )
	UO.UseObject( Sunduk )
	wait(1000)
	CheckLag()
	While UO.SkillVal( 'Carpentry' ) < 1000
		UO.FindType( Logi, '-1', Sunduk )	; Ищем логи в сундуке
		UO.Grab( Str( Kolvo ), 'finditem' ) 	; Кладем логи в пак
		wait( 1000 )
		If UO.FindCount() == 0 Then
			UO.Print("Logs not found, script terminated")
			return
		Endif
		While UO.Count( Logi ) > 0
			; Пока в паке есть логи
			UO.Print('Ostalos ' + Str( UO.Count( Logi ) ) + ' logov' )
			UO.DeleteJournal()
			UO.UseType( Rubanok )
			k = 0
			repeat
				k = k + 1
				wait(500) 
			until UO.InJournal('You put') OR UO.InJournal('fail') OR ( k > 30 )
			If UO.InJournal('You put') Then
				sum = sum + 1
				UO.Print( 'Crafted ' + str(sum) + ' fishing poles' )
			Endif
			while UO.Count( Udochka ) > 0
				UO.FindType( Udochka )
				UO.MoveItem( 'finditem', '0', MyTrash )
				wait( 500 )
				CheckLag()
			Wend
		Wend 
	Wend
endsub

#####################################################################
; Cartography. v.1.02b (c) Edred
;
; Ищем в сундуке 1 мешок с картами, берем по очереди из него карты,
; качаем на них картографию (с повторами в случае физлов), потом скидываем
; карты в трэш. Если мешки кончились - выход.
;
; 1.02 - добавил кормежку и прокачку спирит спика. Убрал заодно "ересь".
;        По-хорошему, скрипт надо переписать, структура рыхлая, но лень
;
sub cartograph() 
	VAR Sunduk1 = '0x40403350' 		; Сериал сундука с мешками с картами
	VAR Trash = '0x403D6BCA'		; Сериал мусорного ведра
	VAR Meshok = '0x0E76' 			; Тип мешка
	VAR Map = '0x14EB' 				; Тип карты
	VAR Fizzle = 'Thy trembling hand results'
	VAR Success = 'You put the map in your pack'
	VAR MeshSer, j, k, MapSer, flag
   	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
	VAR SpiritTime = UO.Timer()
	UO.CancelMenu()
	UO.IgnoreReset()
	UO.AutoMenu( 'What sort of map', 'Sea Chart' )
	UO.FindType( Meshok, '-1', Sunduk1 )
	While UO.FindCount() > 0
		EatChar( Sunduk1, 2, 1, 120 )
		MeshSer = UO.GetSerial( 'finditem' )
		UO.UseObject( MeshSer )
		wait(500)
		CheckLag()
		UO.FindType( Map, '-1', MeshSer )
		While UO.FindCount() > 0
			MapSer = UO.GetSerial( 'finditem' )
			UO.Grab( '1', 'finditem' )
			repeat
				wait(100)
			until UO.Count( Map ) == 1
			flag = 0
			While flag == 0
				DeleteJournal( Fizzle )
				DeleteJournal( Success )
				UO.UseObject( MapSer )
				k = 0
				repeat
					k = k + 1
					wait(100)
				until UO.InJournal( Fizzle ) OR UO.InJournal( Success ) OR k > 1200
				If UO.InJournal( Success ) OR k > 1200 Then
					flag = 1
				Endif
			Wend
			UO.FindType( Map )
			While UO.FindCount() > 0				
				UO.MoveItem( 'finditem', '0', Trash )
				wait(1000)
				CheckLag()
				UO.FindType( Map )
			Wend
			If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
				; Прошло 5 минут с момента последней прокачки Spirit Speak
				SpSpeak()
				SpiritTime = UO.Timer()
			Endif
			UO.FindType( Map, '-1', MeshSer )
		Wend
		UO.Ignore( MeshSer )
		UO.FindType( Meshok, '-1', Sunduk1 )
	Wend
	UO.IgnoreReset()
	UO.CancelMenu()
endsub

#####################################################################
; Inscription. v.1.04b (c) Edred
;
; Берем из сундука blank scroll, nightshade, black pearl,
; крафтим из них скролл Magic Arrow (с повторами в случае физлов), 
; потом скидываем готовый скролл в тот же сундук.
; Если что-либо кончилось - выход.

sub inscript1() 
	VAR Sunduk = '0x404CFAA3' 		; Сериал сундука с бланкскроллами и регами
	VAR Blank = '0x0E34' 			; Тип бланк скролла
	VAR Arrow = '0x1F5F'			; Тип скроллов Flame Strike
	VAR Reg1 = '0x0F8C'				; SA
	VAR Reg2 = '0x0F8D'				; SS
	VAR Fizzle = 'You fail to inscribe the scroll'
	VAR Success = 'You put the'
	VAR k
   	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
	VAR SpiritTime = UO.Timer()
	UO.CancelMenu()
	UO.AutoMenu( 'Spell Circles', 'Seventh Circle' )
	UO.AutoMenu( 'Spell Circle 7', 'Flamestrike' )
	UO.UseObject( Sunduk )
	wait(1000)
	While UO.SkillVal( 'Inscription' ) < 1000
		; берем бланк скроллы
		EatChar( Sunduk, 2, 1, 120 )
		If UO.Count( Blank ) == 0 Then
			UO.FindType( Blank, -1, Sunduk )
			If UO.FindCount() == 0 Then
				UO.Print( 'Blank Scroll not found. Script terminated' )
				return
			Endif
			If UO.GetQuantity( 'finditem' ) < 100 Then
				UO.Grab( '0', 'finditem' )
				repeat
					wait(100)
				until UO.Count( Blank ) > 0
				CheckLag()
			Else
				UO.Grab( '100', 'finditem' )
				repeat
					wait(100)
				until UO.Count( Blank ) == 100
				CheckLag()
			Endif
		Endif
		; берем найтшэд
		If UO.Count( Reg1 ) == 0 Then
			UO.FindType( Reg1, -1, Sunduk )
			If UO.FindCount() == 0 Then
				UO.Print( 'Nightshade not found. Script terminated' )
				return
			Endif
			If UO.GetQuantity( 'finditem' ) < 100 Then
				UO.Grab( '0', 'finditem' )
				repeat
					wait(100)
				until UO.Count( Reg1 ) > 0
				CheckLag()
			Else
				UO.Grab( '100', 'finditem' )
				repeat
					wait(100)
				until UO.Count( Reg1 ) == 100
				CheckLag()
			Endif
		Endif
		; берем блэкперл
		If UO.Count( Reg2 ) == 0 Then
			UO.FindType( Reg2, -1, Sunduk )
			If UO.FindCount() == 0 Then
				UO.Print( 'Black Pearls not found. Script terminated' )
				return
			Endif
			If UO.GetQuantity( 'finditem' ) < 100 Then
				UO.Grab( '0', 'finditem' )
				repeat
					wait(100)
				until UO.Count( Reg2 ) > 0
				CheckLag()
			Else
				UO.Grab( '100', 'finditem' )
				repeat
					wait(100)
				until UO.Count( Reg2 ) == 100
				CheckLag()
			Endif
		Endif
		repeat
			DeleteJournal( Fizzle )
			DeleteJournal( Success )
			UO.UseType( Blank )
			k = 0
			repeat
				k = k + 1
				wait(100)
			until UO.InJournal( Fizzle ) OR UO.InJournal( Success ) OR UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0 OR k > 600
			If UO.Mana < 50 Then
				repeat
					UO.UseSkill( 'Meditation' )
					wait(2000)
				until UO.Mana == UO.Int
			Endif
			If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
				; Прошло 5 минут с момента последней прокачки Spirit Speak
				SpSpeak()
				SpiritTime = UO.Timer()
			Endif
		Until UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0
		While UO.Count( Arrow ) > 0
			UO.FindType( Arrow )
			If UO.FindCount() > 0 Then
				UO.MoveItem( 'finditem', 0, Sunduk )
				wait(1000)
				CheckLag()
			Endif
		Wend
	Wend
	UO.CancelMenu()
endsub

#####################################################################
; Inscription2. v.1.05b (c) Edred
;
; Берем из сундука blank scroll, blood pearl, black moss, mandrake root
; крафтим из них скролл Recall (с повторами в случае физлов), 
; потом скидываем готовый скролл в тот же сундук.
; Если что-либо кончилось - выход.

sub inscript2() 
	VAR Sunduk = '0x40140DD1' 		; Сериал сундука с бланкскроллами и регами
	VAR Blank = '0x0E34' 			; Тип бланк скролла
	VAR Arrow = '0x1F4C'			; Тип скроллов Recall
	VAR Reg1 = '0x0F86'				; mandrake root
	VAR Reg2 = '0x0F7A'				; black pearl
	VAR Reg3 = '0x0F7B'				; blood moss
	VAR Fizzle = 'You fail to inscribe the scroll'
	VAR Success = 'You put the'
	VAR k
   	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
	VAR SpiritTime = UO.Timer()
	UO.CancelMenu()
	UO.AutoMenu( 'Spell Circles', 'Fourth Circle' )
	UO.AutoMenu( 'Spell Circle 4', 'Recall' )
	UO.UseObject( Sunduk )
	wait(1000)
	While UO.SkillVal( 'Inscription' ) < 1000
		; берем бланк скроллы
		EatChar( Sunduk, 2, 1, 120 )
UO.Print( 'test2' )
		If UO.Count( Blank ) == 0 Then
			UO.FindType( Blank, -1, Sunduk )
			If UO.FindCount() == 0 Then
				UO.Print( 'Blank Scroll not found. Script terminated' )
				return
			Endif
			If UO.GetQuantity( 'finditem' ) < 100 Then
				UO.Grab( '0', 'finditem' )
				repeat
					wait(100)
				until UO.Count( Blank ) > 0
				wait(100)
				CheckLag()
			Else
				UO.Grab( '100', 'finditem' )
				repeat
					wait(100)
				until UO.Count( Blank ) == 100
				wait(100)
				CheckLag()
			Endif
		Endif
		; берем mandrake root
		If UO.Count( Reg1 ) == 0 Then
			UO.FindType( Reg1, -1, Sunduk )
			If UO.FindCount() == 0 Then
				UO.Print( 'Mandrake Root not found. Script terminated' )
				return
			Endif
			If UO.GetQuantity( 'finditem' ) < 100 Then
				UO.Grab( '0', 'finditem' )
				repeat
					wait(100)
				until UO.Count( Reg1 ) > 0
				wait(100)
				CheckLag()
			Else
				UO.Grab( '100', 'finditem' )
				repeat
					wait(100)
				until UO.Count( Reg1 ) == 100
				wait(100)
				CheckLag()
			Endif
		Endif
		; берем black pearl
		If UO.Count( Reg2 ) == 0 Then
			UO.FindType( Reg2, -1, Sunduk )
			If UO.FindCount() == 0 Then
				UO.Print( 'Black Pearls not found. Script terminated' )
				return
			Endif
			If UO.GetQuantity( 'finditem' ) < 100 Then
				UO.Grab( '0', 'finditem' )
				repeat
					wait(100)
				until UO.Count( Reg2 ) > 0
				wait(100)
				CheckLag()
			Else
				UO.Grab( '100', 'finditem' )
				repeat
					wait(100)
				until UO.Count( Reg2 ) == 100
				wait(100)
				CheckLag()
			Endif
		Endif
		; берем blood moss
		If UO.Count( Reg3 ) == 0 Then
			UO.FindType( Reg3, -1, Sunduk )
			If UO.FindCount() == 0 Then
				UO.Print( 'Blood Moss not found. Script terminated' )
				return
			Endif
			If UO.GetQuantity( 'finditem' ) < 100 Then
				UO.Grab( '0', 'finditem' )
				repeat
					wait(100)
				until UO.Count( Reg3 ) > 0
				CheckLag()
			Else
				UO.Grab( '100', 'finditem' )
				repeat
					wait(100)
				until UO.Count( Reg3 ) == 100
				CheckLag()
			Endif
		Endif
		repeat
;			If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
;				; Прошло 5 минут с момента последней прокачки Spirit Speak
;				SpSpeak()
;				SpiritTime = UO.Timer()
;			Endif
			DeleteJournal( Fizzle )
			DeleteJournal( Success )
			UO.UseType( Blank )
			k = 0
			repeat
				k = k + 1
				wait(100)
			until UO.InJournal(Fizzle) OR UO.InJournal(Success) OR UO.Count(Blank)==0 OR UO.Count(Reg1)==0 OR UO.Count(Reg2)==0 OR UO.Count(Reg3)==0 OR k > 600
			If UO.Mana < 10 Then
				repeat
					UO.UseSkill( 'Meditation' )
					wait(2000)
				until UO.Mana == UO.Int
			Endif
		Until UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0 OR UO.Count( Reg3 ) == 0
UO.Print( 'test1' )
		While UO.Count( Arrow ) > 0
			UO.FindType( Arrow )
			If UO.FindCount() > 0 Then
				UO.MoveItem( 'finditem', 0, Sunduk )
				wait(1000)
				CheckLag()
			Endif
		Wend
	Wend
	UO.CancelMenu()
endsub

#####################################################################
; Veterinar. v.1.08 (c) Edred
;
; Ставим рядом двух чаров, у каждого по лошади. Рядом с чарами
; сундук. В сундук чистые бинты. Сериалы лошадей каждому в скрипт.
; Стравливаем лошадей (можно использовать скрипт provocat2.sc) и
; качаемся. Внимание! При низком скилле за работой скрипта надо
; следить (одним чаром, вытащив на экран статусы обоих лошадей) и
; периодически садиться на лошадь и отъезжать в сторону, слезать с нее
; и давать обоим чарам вылечить лошадей полностью. После 40-45 скилла
; нужда в этом отпадает (скилл растет быстро).
;
sub Veterinar()
	VAR Sunduk = '0x4048E250' 		; Сериал сундука с бинтами и медом
	VAR Bandag = '0x0E21' 			; Тип бинтов
	VAR BlBandag = '0x0E20'			; Тип грязных бинтов
	VAR Horse1 = '0x0040F759'		; Сериал лошади ЭТОГО чара
	VAR fizzle = 'You apply bandages to a horse but fail'
	VAR Success = 'You apply the bandages to a horse'
	VAR mustwait = 'You must wait to use bandages again'
	VAR k
	UO.UseObject( Sunduk )
	wait(1000)
	While UO.SkillVal( 'Veterinary' ) < 1000
		If UO.Count( Bandag ) < 10 Then
			UO.FindType( Bandag, '-1', Sunduk )
			If UO.FindCount() > 0 Then
				UO.MoveItem( 'finditem', '200' )
				wait(500)
				CheckLag()
			Else
				UO.Print( 'Bandage not found! Script terminated!' )
				return
			Endif
			UO.FindType( BlBandag )
			If UO.FindCount() > 0 Then
				UO.MoveItem( 'finditem', '0', sunduk )
				wait(500)
				CheckLag()
			Endif
		Endif
		If UO.GetHP( Horse1 ) < UO.GetMaxHP( Horse1 ) Then
				DeleteJournal( fizzle )
				DeleteJournal( success )
				DeleteJournal( mustwait )
				UO.Print( 'Veterinary!' )
				UO.WaitTargetObject( Horse1 )
				UO.UseType( Bandag )
				k = 0
				repeat
					wait(100)
					k = k + 1
				until UO.InJournal( fizzle ) OR UO.InJournal( success ) OR UO.InJournal( mustwait ) OR k > 30
				If UO.InJournal( success ) Then
					wait(2500)
				Endif
				If UO.InJournal( mustwait ) Then
					wait(500)
				Endif
				wait(1500)
		Else
			wait(500)
		Endif
	Wend
endsub
;
Sub Provocat2()
; Для провокации вам в паке необходим муз.инструмент!
;
	VAR ser1, ser2
	VAR Horse1 = '0x00C8', Horse2 = '0x00E2'
	UO.Set( 'finddistance', '2' )
	UO.FindType( Horse1, '-1', '1' )
	If UO.FindCount() == 0 Then
		UO.FindType( Horse2, '-1', '1' )
		If UO.FindCount() == 0 Then
			UO.Print( 'Horse 1 not found!' )
			return
		Endif
	Endif
	ser1 = UO.GetSerial( 'finditem' )
	UO.Print( ser1 )
	UO.Ignore( 'finditem' )
	UO.FindType( Horse1, '-1', '1' )
	If UO.FindCount() == 0 Then
		UO.FindType( Horse2, '-1', '1' )
		If UO.FindCount() == 0 Then
			UO.Print( 'Horse 2 not found!' )
			UO.IgnoreReset()
			return
		Endif
	Endif
	ser2 = UO.GetSerial( 'finditem' )
	UO.Print( ser2 )
	UO.IgnoreReset()
	UO.WaitTargetObject( ser1, ser2 )
	UO.UseSkill( 'Provocation' )
endsub

#####################################################################
; Veterinar2. v.1.03 (c) Edred
;
; Ставим две лошади напротив друг друга, кладем в сундук рядом с чаром
; чистые бинты, мед. Натравливаем при помощи провокации одну лошадь на
; другую и запускаем скрипт. Скрипт контролирует здоровье обеих лошадей
; и, если необходимо, подлечивает их с бинтов. Бинты он берет из сундука
; и туда же скидывает грязные. Скрипт с подкормкой чара и прокачкой
; спирит спик. Скрипт сам определяет сериалы лошадей и сам их провоцирует
; на атаку (если у вас не прокачан скилл Провокация, отключите этот блок - 
; он отмечен в коде). Для провоцирования вы должны иметь муз. инструмент
; в паке.
;
sub veterinar2()
	VAR Sunduk = '0x4048E250' 		; Сериал сундука с бинтами и медом
	VAR Bandag = '0x0E21' 			; Тип бинтов
	VAR BlBandag = '0x0E20'			; Тип грязных бинтов
	VAR Horse1, Horse2, k
	VAR HorTyp1 = '0x00C8', HorTyp2 = '0x00E4'
	VAR fizzle = 'You apply bandages to a horse but fail'
	VAR Success = 'You apply the bandages to a horse'
	VAR mustwait = 'You must wait to use bandages again'
   	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
	VAR SpiritTime = UO.Timer()
	UO.UseObject( Sunduk )
	wait(1000)
	### Блок определения сериалов лошадей
	UO.Set( 'finddistance', '3' )
	UO.FindType( HorTyp1, '-1', '1' )
	If UO.FindCount() == 0 Then
		UO.FindType( HorTyp2, '-1', '1' )
		If UO.FindCount() == 0 Then
			UO.Print( 'Horse 1 not found!' )
			return
		Endif
	Endif
	Horse1 = UO.GetSerial( 'finditem' )
	UO.Print( Horse1 )
	UO.Ignore( 'finditem' )
	UO.FindType( HorTyp1, '-1', '1' )
	If UO.FindCount() == 0 Then
		UO.FindType( HorTyp2, '-1', '1' )
		If UO.FindCount() == 0 Then
			UO.Print( 'Horse 2 not found!' )
			UO.IgnoreReset()
			return
		Endif
	Endif
	Horse2 = UO.GetSerial( 'finditem' )
	UO.Print( Horse2 )
	UO.IgnoreReset()
	### Блок провоцирования одной лошади на другую. Без ретрейнов - у меня ГМ.
	UO.WaitTargetObject( Horse1, Horse2 )
	UO.UseSkill( 'Provocation' )
	wait(1000)
	### Блок прокачки
	While UO.SkillVal( 'Veterinary' ) < 1000
		If UO.Count( Bandag ) < 10 Then
			UO.FindType( Bandag, '-1', Sunduk )
			If UO.FindCount() > 0 Then
				UO.MoveItem( 'finditem', '200' )
				wait(500)
				CheckLag()
			Else
				UO.Print( 'Bandage not found! Script terminated!' )
				return
			Endif
			UO.FindType( BlBandag )
			If UO.FindCount() > 0 Then
				UO.MoveItem( 'finditem', '0', sunduk )
				wait(500)
				CheckLag()
			Endif
		Endif
		EatChar( Sunduk, 2, 1, 60 )
		If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
			; Прошло 5 минут с момента последней прокачки Spirit Speak
			SpSpeak()
			SpiritTime = UO.Timer()
		Endif
		If ( UO.GetHP( Horse1 ) < UO.GetMaxHP( Horse1 ) ) OR ( UO.GetHP( Horse2 ) < UO.GetMaxHP( Horse2 ) ) Then
			# Здесь я решил организовать так: чар лечит сначала ту лошадь, здоровья у которой меньше. Естественно,
			# если одна из лошадей здорова - то у второй меньше здоровья, иначе бы мы в If не вошли.
			If UO.GetHP( Horse1 ) < UO.GetHP( Horse2 ) Then
				; лечим первую лошадь
				DeleteJournal( fizzle )
				DeleteJournal( success )
				DeleteJournal( mustwait )
				UO.Print( 'Veterinary!' )
				UO.WaitTargetObject( Horse1 )
				UO.UseType( Bandag )
				k = 0
				repeat
					wait(100)
					k = k + 1
				until UO.InJournal( fizzle ) OR UO.InJournal( success ) OR UO.InJournal( mustwait ) OR k > 30
				If UO.InJournal( success ) Then
					wait(2500)
				Endif
				If UO.InJournal( mustwait ) Then
					wait(500)
				Endif
				wait(1500)
			Else
				wait(500)
			Endif
			If UO.GetHP( Horse1 ) > = UO.GetHP( Horse2 ) Then
				; лечим вторую лошадь
				DeleteJournal( fizzle )
				DeleteJournal( success )
				DeleteJournal( mustwait )
				UO.Print( 'Veterinary!' )
				UO.WaitTargetObject( Horse2 )
				UO.UseType( Bandag )
				k = 0
				repeat
					wait(100)
					k = k + 1
				until UO.InJournal( fizzle ) OR UO.InJournal( success ) OR UO.InJournal( mustwait ) OR k > 30
				If UO.InJournal( success ) Then
					wait(2500)
				Endif
				If UO.InJournal( mustwait ) Then
					wait(500)
				Endif
				wait(1500)
			Else
				wait(500)
			Endif
		Else
			wait(300)
		Endif
	Wend
endsub
	
#===================================================================#
#
# I. Прокачка других скиллов
#
#####################################################################
sub Magery() 
	; ver. 2.01 (c) Edred
	;
	; Вводим сундук (пак) с найтшэдом, вводим подкормку чара.
	;
	VAR sunduk = '0x40531245'
	VAR targ = '0x4041C420'
	VAR mir = 'You are at peace'
	VAR NS = '0x0F88'
   	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
	UO.UseObject( sunduk )
	wait(1000)
	CheckLag()
	While UO.SkillVal( 'Magery' ) < 1000
		If UO.Count( NS ) == 0 Then
			UO.Findtype( NS, '-1', sunduk )
			If UO.FindCount() == 0 Then
				UO.Print( 'NightShade not found, script terminated' )
				return
			Endif
			UO.MoveItem( 'finditem', '100' )
			wait(500)
			CheckLag()
		Endif
		If UO.Mana < 20 Then
			DeleteJournal( mir )
			repeat
				UO.UseSkill( 'Meditation' )
				wait(2000)
			until UO.InJournal( mir )
			EatChar( sunduk, 2, 1, 60 )
		Endif
		UO.WaitTargetObject( targ )
		UO.Cast( 'Poison' )
		wait(3000)
	Wend
endsub 

#####################################################################
sub music()
	VAR Gitara = '0x0EB4'	; тип балалайки
	repeat
		UO.UseType( Gitara )
		wait(2000)
	until UO.Dead()
endsub

#####################################################################
sub provocat()
; Provocation
	VAR Horse1 = '0x004033E5'	; лошадь 1
	VAR Horse2 = '0x0040349F'	; лошадь 2
	repeat
		UO.WaitTargetObject( Horse1, Horse2 )
		UO.UseSkill( 'Provocation' )
		wait(2000)
	until UO.Dead()
endsub

#####################################################################
sub entic()
; Enticement
	VAR Horse1 = '0x004033E5'	; лошадь 1
	repeat
		UO.WaitTargetObject( Horse1 )
		UO.UseSkill( 'Enticement' )
		wait(1000)
	until UO.Dead()
endsub

#####################################################################
; Forensic. v.1.00b (c) Edred
;
sub forensic()
	UO.WarMode( 0 )
	repeat
		UO.DeleteJournal()
		UO.WaitTargetObject( 'lastcorpse' )
		UO.UseSkill( 'Forensic' )
		repeat
			wait(100)
		until UO.InJournal( "This is the corpse" ) OR UO.InJournal( "This is Body" ) OR UO.InJournal( "You can tell nothing" ) OR UO.InJournal( "You can't see the target" )
	until UO.InJournal( "You can't see the target" )
	UO.WarMode( 1 )
endsub

#####################################################################
sub Hidonly()
	while UO.SkillVal( 'Hiding' ) < 1000
		UO.UseSkill('Hiding') 
		Wait(4000)
	wend
endsub

#####################################################################
sub HidStealth()
;	while UO.SkillVal( 'Hiding' ) < 1000 AND UO.SkillVal( 'Stealth' ) < 1000
	while UO.DEX < 100
		while (UO.GetX() <> 1852)
			GoHide()
			UO.Press( 36 )
			wait(1000)
		wend
		while (UO.GetX() <> 1864)
			GoHide()
			UO.Press( 34 )
			wait(1000)
		wend
	wend
endsub

#####################################################################
sub macef()
	VAR Kukla = '0x40429852', flag = 1
	VAR maul = '0x143A'
	while UO.SkillVal( 'Mace Fighting' ) < 600
		flag = GetDagger( maul )
		If flag == 0 Then
			UO.Print( 'Maul not found!' )
			return
		Endif
		UO.UseObject( Kukla )
		wait(4000)
		If UO.Life < 100 Then
			UO.SayU( 'Guards!' )
		Endif
	wend
endsub

#####################################################################
sub fencing()
	VAR Kukla = '0x40429852', flag = 1
	VAR Dagger = '0x0F51'
	while UO.SkillVal( 'Fencing' ) < 600
		flag = GetDagger( Dagger )
		If flag == 0 Then
			UO.Print( 'Dagger not found!' )
			return
		Endif
		UO.UseObject( Kukla )
		wait(4000)
		If UO.Life < 50 Then
			UO.SayU( 'Guards!' )
		Endif
	wend
endsub

#####################################################################
sub swordsman()
	VAR Kukla = '0x40429852', flag = 1
	VAR sword = '0x13FE'
	while UO.SkillVal( 'Swordsmanship' ) < 600 OR UO.Str < 150
		flag = GetDagger( sword )
		If flag == 0 Then
			UO.Print( 'Katana not found!' )
			return
		Endif
		UO.UseObject( Kukla )
		wait(4000)
		If UO.Life < 50 Then
			UO.SayU( 'Guards!' )
		Endif
	wend
endsub

#####################################################################
sub Intell()
	VAR Anima = '0x005F631D'
	VAR ms1 = "a horse looks superhumanly strong"
	VAR ms2 = "think of anything"
	VAR ms3 = "it is loyal"
	VAR ms4 = "a horse looks dumb as a rock"
	VAR ms5 = "You cannot seem to judge"
	VAR k
	while UO.SkillVal( 'Evaluating Intelligence' ) < 1000
		DeleteJournal( ms1 )
		DeleteJournal( ms2 )
		UO.WaitTargetObject( Anima )
		UO.UseSkill( 'Anatomy' )
		CheckLag()
		k = 0
		repeat
			wait(100)
			k = k + 1
		until UO.InJournal( ms1 ) OR UO.InJournal( ms2 ) OR k > 30
		DeleteJournal( ms3 )
		DeleteJournal( ms2 )
		UO.WaitTargetObject( Anima )
		UO.UseSkill( 'Animal Lore' )
		CheckLag()		
		k = 0
		repeat
			wait(100)
			k = k + 1
		until UO.InJournal( ms3 ) OR UO.InJournal( ms2 ) OR k > 30
		DeleteJournal( ms4 )
		DeleteJournal( ms5 )
		DeleteJournal( ms2 )
		UO.WaitTargetObject( Anima )
		UO.UseSkill( 'Evaluating Intelligence' )
		CheckLag()
		k = 0
		repeat
			wait(100)
			k = k + 1
		until UO.InJournal( ms4 ) OR UO.InJournal( ms5 ) OR UO.InJournal( ms2 ) OR k > 30
	wend
endsub

#===================================================================#
# CAMPING                                                           #
#===================================================================#
#   v.1.04b (с) Edred                                               #
#===================================================================#
; Берем в пак 200 хвороста и реги, реколлимся по руне туда где можно 
; жечь костры, врубаем медитацию, отделяем по 1 шт. хвороста, кладем их 
; вокруг чара с трех сторон, дважды щелкаем по этим кучкам хвороста 
; для их разжигания (с повторами в случае физлов). Отходим назад 
; (направление на правый нижний угол - клавиша "3" на нумпаде). 
; Повторям последнюю операцию пока чар не придет в точку FinalX. 
; Реколлимся на базу, добираем из ящика хворост и реги. И по кругу.
;
; Разметьте руну где-нибудь в непосещаемом городе, прогуляйтесь шагов
; на 30-50 по диагонали по направлению цифры 3 на нумпаде, занесите
; координату X этой точки в FinalX (для надежности и защиты от лагов
; будет лучше если в этой точке чар упрется в стенку). На базе рядом
; с реколлкой поставьте сундук и в него положите много хвороста (можно
; одной "неподьъемной" кучкой и побольше регов для реколла.
; Занесите руну в этот город в ту же рунбуку, где и руна на базу.
;
sub camping()
	DIM Regs[3]
	Regs[0] = '0x0F7A'			; Black Pearl
	Regs[1] = '0x0F7B'			; Bood Moss
	Regs[2] = '0x0F86'			; Mandrake Root
	VAR Hvorost = '0x0DE1'
	VAR flag, myx, myy, myz, fin, i
	VAR FinalX = 1350
	VAR Sunduk = '0x40591B82'
	VAR RuneToBase = '20'
	VAR RuneToFire = '30'
	;
	; Стартуем стоя в начале пути.
   	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
	UO.Exec( 'set finddistance 3' )
	While UO.SkillVal( 'Camping' ) < 1000
		fin = 0
		UO.UseSkill( 'Meditation' )
		UO.FindType ( Hvorost )
		While ( UO.FindCount() > 0 ) AND ( fin == 0 )
			myx = UO.GetX()
			myy = UO.GetY()
			myz = UO.GetZ()
			UO.MoveItem('finditem', '1', 'ground', str(myx-1), str(myy), str(myz))
			wait(1000)
			CheckLag()
			UO.FindType ( Hvorost )
			UO.MoveItem('finditem', '1', 'ground', str(myx), str(myy+1), str(myz))
			wait(1000)
			CheckLag()
			UO.FindType ( Hvorost )
			UO.MoveItem('finditem', '1', 'ground', str(myx), str(myy-1), str(myz))
			wait(1000)
			CheckLag()
			UO.Findtype( Hvorost, -1, 1 )
			While UO.FindCount() > 0 AND NOT UO.InJournal( "You can't ignite several" )
				repeat
					flag = 1
					DeleteJournal( "You fail to ignite" )
					DeleteJournal( "You can't ignite several" )
					DeleteJournal( "You must wait" )
					UO.UseFromGround( Hvorost )
					wait(1000)
					CheckLag()
					If UO.InJournal( "You must wait" ) OR UO.InJournal( "You fail to ignite" ) Then
						flag = 0
						wait(1000)
					Endif
					If UO.InJournal( "You can't ignite several" ) Then
						UO.FindType( Hvorost, -1, 1 )
						While UO.FindCount() > 0
							If UO.GetQuantity( 'finditem' ) > 1 Then
								UO.Grab( str( UO.GetQuantity( 'finditem' ) - 1 ), 'finditem' )
								wait(1000)
								CheckLag()
							Endif
							UO.Ignore( 'finditem' )
							UO.FindType( Hvorost, -1, 1 )
						Wend
						UO.IgnoreReset()
					Endif
				until flag
				UO.Findtype( Hvorost, -1, 1 )
			Wend
			While ( UO.GetX() < myx + 1 ) AND ( fin == 0 )
				UO.Press( 34 )
				wait(300)
				CheckLag()
				If UO.GetX() == FinalX Then
					fin = 1
				Endif
			Wend
			UO.FindType ( Hvorost )
		Wend
		; достигли конца маршрута или кончился хворост
		Recalling( 'CommonRunbook', RuneToBase )
		UO.UseObject( Sunduk )
		wait(1000)
		CheckLag()
		for i = 0 To 2
			If UO.Count( Regs[i] ) < 6 Then
				; этого рега меньше 6
				UO.FindType( Regs[i], '-1', Sunduk )
				UO.Grab( str( 6 - UO.Count( Regs[i] ) ), 'finditem' )
				Wait( 1000 )
				CheckLag()
			Endif
		next
		If UO.Count( Hvorost ) < 200 Then
			; хвороста меньше 200
			UO.FindType( Hvorost, '-1', Sunduk )
			UO.Grab( str( 200 - UO.Count( Hvorost ) ), 'finditem' )
			Wait( 1000 )
			CheckLag()
		Endif
		EatChar( Sunduk, 2, 1, 60 )
		Recalling( 'CommonRunbook', RuneToFire )
	Wend
endsub

#===================================================================#
# COOKING                                                           #
#===================================================================#
#   v.1.05b (с) Edred                                               #
#===================================================================#
;
; Встаем рядом среколлкой на базе, рядом с чаром в АМЗ ставим сундук или
; ящик. В него раскладываем много кучек хвороста не больше чем по 500
; в кучке (иначе чар не сможет взять 1 шт.) и кладем несколько стопок стейков
; (можно по 10к в стопке). Можно туда же добавить меда - уберите комментарий
; с EatChar() и добавьте эту функцию.
; Берем из сундука 1 шт хвороста, кладем в координаты TX, TY и зажигаем ее.
; Потом берем 1 шт. стейков из этого же сундука и жарим
; на костре или углях. При этом перед жаркой проверяем, есть ли в
; вокруг чара огонь или угли. если есть жарим, иначе опять жгем костер.
; Готовый стейк скидывается в этот же сундук.
;
; Перед разжиганием костра проверяем, прошло ли 5 минут с момента последней
; попытки прокачать Spirit Speak, если прошло - качаем.
;
sub cooking()
	VAR Sunduk = '0x40591B82'
	VAR Hvorost = '0x0DE1'
	VAR Koster = '0x0DE3'
	VAR Ugli = '0x0DE9'
	VAR Fish = '0x097A'
	VAR FishGot = '0x097B'
	VAR TX = 1873
	VAR TY = 387
	VAR i, flag
	VAR SpiritTime = UO.Timer()
	UO.CancelTarget()
	UO.Exec( 'set finddistance 3' )
   	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
	UO.UseObject( Sunduk )
	While UO.SkillVal( 'Cooking' ) < 1000
;		EatChar( Sunduk, 2, 1, 120 )
# ----------------------------------
# блок запуска прокачки Spirit Speak
		If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
			; Прошло 5 минут с момента последней прокачки Spirit Speak
			SpSpeak()
			SpiritTime = UO.Timer()
		Endif
# ----------------------------------
		wait(1000)
		UO.FindType( Hvorost, -1, Sunduk )
		If UO.FindCount() == 0 Then
			UO.Print( 'No kindling found. Script terminated' )
			return
		Endif
		UO.MoveItem( 'finditem', '1', 'ground', str(TX), str(TY), str(UO.GetZ()) )
		wait(1000)
		CheckLag()
		UO.Findtype( Hvorost, -1, 1 )
;		wait(1000)
		If UO.FindCount() > 0 Then
			repeat
				UO.UseFromGround( Hvorost )
				wait(1000)
				UO.FindType( Koster, -1, 1 )
			until UO.FindCount() > 0
			; костер горит
			flag = 1
			repeat
				; взять из сундука 1 стейк
				If UO.Count( Fish ) == 0 Then
					UO.FindType( Fish, -1, Sunduk )
					If UO.FindCount() == 0 Then
						UO.Print( 'No fish steaks found. Script terminated' )
						return
					Endif
					UO.Grab( '1', 'finditem' )
;					repeat
;						wait(100)
;					until UO.Count( Fish ) > 0
					wait(1000)
					CheckLag()
				Endif
				; теперь проверим не погас ли костер, не исчезли ли угли
				UO.FindType( Koster, -1, 1 )
				If UO.FindCount() <> 0 Then
					; еще горит костер - жарим на нем стейк
					If UseSteake( Fish, UO.GetSerial('finditem') ) Then
						flag = 0
					Endif
					; стейк готов
				Else
					UO.FindType( Ugli, -1, 1 )
					If UO.FindCount() <> 0 Then
						; есть еще угли!
						if UseSteake( Fish, UO.GetSerial('finditem') ) then
							flag = 0
						endif
					Else
						flag = 0
					Endif
				Endif
				If UO.Count( FishGot ) > 0 Then
					UO.FindType( FishGot )
					UO.MoveItem( 'finditem', -1, Sunduk )
;					repeat
;						wait(100)
;					until UO.Count( FishGot ) == 0
					wait(1000)
					CheckLag()
				Endif
			until flag == 0
		Endif
	Wend
endsub

Sub UseSteake( fish, koster )
	VAR msg1 = 'You burn the food'				; физл
	VAR msg2 = 'You put the fish steak'			; успех
	VAR msg22 = 'You put the fish steaks'		; успех
	VAR msg3 = 'You must wait'					; ждать
	VAR msg4 = "You can't see the target"
	repeat
		DeleteJournal (msg1 )
		DeleteJournal (msg2 )
		DeleteJournal (msg22 )
		DeleteJournal (msg3 )
		DeleteJournal (msg4 )
		UO.WaitTargetObject( 'finditem' )
		UO.UseType( Fish )
		repeat
			wait(500)
		until UO.InJournal(msg1) OR UO.InJournal(msg2) OR UO.InJournal(msg22) OR UO.InJournal(msg3) OR UO.InJournal(msg4)
		if UO.InJournal(msg4) then
			return 1
		endif
		if UO.InJournal(msg3) then
			wait(500)
		endif
	until UO.InJournal(msg2) OR UO.InJournal(msg22)
	return 0
endsub

sub NechegoDelat()
	SpSpeak()
	VAR SpiritTime = UO.Timer()
	repeat
		If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
			; Прошло 5 минут с момента последней прокачки Spirit Speak
			SpSpeak()
			SpiritTime = UO.Timer()
		Else
			wait(500)
		Endif
	until UO.Dead()
endsub

#####################################################################
; Herding v.1.02b (c) Edred
;
; Для прокачки потребуются две лошади (ламы или другие животные)
; и два щита (или какие-то другие объекты). Кладем щиты на пол в доме
; в паре шагов от чара (не стопкой, в соседние тайлы) и ставим обеих 
; лошадей рядом с чаром. Чару в руку посох (одного посоха хватит на всю 
; прокачку). Вносим серийники лошадей и щитов в соответствующие переменные.
; Поехали. Блоки, отвечающие за подкормку чара и прокачку
; Spirit Speak закомментарены.
;
sub Herding()
	VAR Horse = '0x0040D2A1'
	VAR Horse2 = '0x005AF4B1'	
	VAR Targ = '0x404215E8'
	VAR Targ2 = '0x404214EF'
	VAR Sunduk = '0x404E5494'
   	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
	VAR success = "The animal goes where it is instructed"
	VAR fizzle = "You don't seem"
	VAR SpiritTime = UO.Timer()
	UO.UseObject( Sunduk )
	wait(1000)
	CheckLag()
	While UO.SkillVal( 'Herding' ) < 1000
		EatChar( Sunduk, 2, 1, 120 )
		If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
			; Прошло 5 минут с момента последней прокачки Spirit Speak
			SpSpeak()
			SpiritTime = UO.Timer()
		Endif
		DeleteJournal( success )
		DeleteJournal( fizzle )
		UO.WaitTargetObject( Horse, Targ )
		UO.UseObject( UO.ObjAtLayer( 'Lhand' ) )
		repeat
			wait(100)
		until UO.InJournal( fizzle ) OR UO.InJournal( success )
		If UO.InJournal( success ) Then
			; вторая животина
			DeleteJournal( success )
			UO.WaitTargetObject( Horse2, Targ2 )
			UO.UseObject( UO.ObjAtLayer( 'Lhand' ) )
			repeat
				wait(100)
			until UO.InJournal( fizzle ) OR UO.InJournal( success )
		Endif
	Wend
endsub
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

окончание файла SkillUp.sc (в один пост не влезло)

Code: Select all

#####################################################################
; Lockpicking v.1.01b (c) Edred
;
sub Lockpicking()
	VAR SundukFrom = '0x404CF9CF'
	VAR SundukTarg = '0x401EA0CA'
	VAR KeyTarg = '0x401EA0C9'
	VAR LockType = '0x14FB'
   	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
	DIM LockColor[3], SkUp[3]
	LockColor[0] = '0x0000'		; айрон
	LockColor[1] = '0x060A'		; дулл купер
	LockColor[2] = '0x0488'		; бронза
	LockColor[3] = '0x08A5'		; золото
	SkUp[0] = 299				; уровень скилла выше которого качать железными отмычками
	SkUp[1] = 499				; уровень скилла выше которого качать медными отмычками	
	SkUp[2] = 499				; уровень скилла выше которого качать бронзовыми отмычками
	SkUp[3] = 599				; уровень скилла выше которого качать золотыми отмычками	
	VAR fizzle = "You can't open this."
	VAR success = "You open this."
	VAR locked = "You close this chest."
	VAR TimeLimit = 3000
	VAR trycount = 0, succount = 0
	VAR i, j, needcolor, k, end
	VAR SpiritTime = UO.Timer()
	UO.UseObject( SundukFrom )
	wait(1000)
	CheckLag()
	while UO.SkillVal( 'Lockpicking' ) < 1000
		If UO.Count( LockType ) == 0 Then
			EatChar( SundukFrom, 6, 2, 120 )
			j = 0
			For i = 0 To 3
				If SkUp[i] < UO.SkillVal( 'Lockpicking' ) Then
					j = i
				Endif
			Next
			needcolor = LockColor[j]
			UO.FindType( LockType, needcolor, SundukFrom )
			If UO.FindCount() == 0 Then
				UO.Print( 'Lockpicks not found. Script terminated' )
				return
			Endif
			If UO.GetQuantity( 'finditem' ) > 100 Then
				UO.Grab( '100', 'finditem' )
			Else
				UO.Grab( 'finditem' )
			Endif
			wait(1000)
			CheckLag()
		Endif
		While UO.Count( LockType ) > 0
			If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
				; Прошло 5 минут с момента последней прокачки Spirit Speak
				SpSpeak()
				SpiritTime = UO.Timer()
			Endif
			trycount = trycount + 1
			UO.Print( 'You have ' + str( UO.Count( LockType ) ) + ' lockpicks.' )
			UO.Print( 'You have ' + str( succount ) + ' success attempt' )
			UO.Print( 'You get ' + str( trycount ) + ' attempt'  )
			DeleteJournal( fizzle )
			DeleteJournal( success )
			UO.WaitTargetObject( SundukTarg )
			UO.UseType( LockType )
			k = 0
			repeat
				wait(100)
				k = k + 1
			until UO.InJournal( fizzle ) OR UO.InJournal( success ) OR k > TimeLimit
			If UO.InJournal( success ) Then
				DeleteJournal( locked )
				succount = succount + 1
				UO.WaitTargetObject( SundukTarg )
				UO.UseObject( KeyTarg )
				repeat
					wait(100)
				until UO.InJournal( locked )
			Endif
		Wend
	Wend
endsub

#####################################################################
; Begging v.1.07 (c) Edred
;
; Встаем около какого-нибудь вендора (лучше двух) и запускаем скрипт. 
; Чар найдет вендора (или обоих), определит их сериалы, будет у них 
; попрошайничать (чередуя после успеха) и в случае успеха скидывать
; деньги обратно на вендора (на Цитадели попрошайничать надо голым 
; с пустым паком и банком). Заодно качается спиритспик.
;
sub Begging()
	VAR VendTyp1 = '0x0191'
	VAR VendTyp2 = '0x0190'
	VAR VendSer, VendSer1 = '', VendSer2 = '', k
	VAR Dengi = '0x0EED'
	VAR dal = 'Here, you can have this'
	VAR poslal = "I'm sorry,"
	VAR daleko = 'is too far away!'
	VAR chasto = 'You must wait to use that skill again.'
	VAR SpiritTime = UO.Timer()
	UO.Set( 'finddistance', '3' )
	#### Блок нахождения 1 или 2 вендоров
	UO.Ignore( 'self' )
	UO.FindType( VendTyp1, '-1', '1' )
	If UO.FindCount() == 0 Then
		UO.FindType( VendTyp2, '-1', '1' )
		If UO.FindCount() == 0 Then
			UO.Print( 'Vendor not found!' )
			return
		Endif
	Endif
	VendSer1 = UO.GetSerial( 'finditem' )
	UO.Print( 'Vendor1 = ' + VendSer1 )
	UO.Ignore( 'finditem' )
	UO.FindType( VendTyp1, '-1', '1' )
	If UO.FindCount() == 0 Then
		UO.FindType( VendTyp2, '-1', '1' )
		If UO.FindCount() <> 0 Then	
			VendSer2 = UO.GetSerial( 'finditem' )
			UO.Print( 'Vendor2 = ' + VendSer2 )
		Endif
	Else
		VendSer2 = UO.GetSerial( 'finditem' )
		UO.Print( 'Vendor2 = ' + VendSer2 )
	Endif
	### Все!
	UO.IgnoreReset()
	VendSer = VendSer1
	While UO.SkillVal( 'Begging' ) < 1100
		If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
			; Прошло 5 минут с момента последней прокачки Spirit Speak
			SpSpeak()
			SpiritTime = UO.Timer()
		Endif
		If UO.GetHP() < UO.GetMaxHP() Then
			UO.Msg( 'GUARDS' )
		Endif
		DeleteJournal( dal )
		DeleteJournal( poslal )
		DeleteJournal( daleko )
		DeleteJournal( chasto )
		UO.WaitTargetObject( VendSer )
		UO.UseSkill( 'Begging' )
		k = 0
		repeat
			wait(100)
			k = k + 1
		until UO.InJournal( dal ) OR UO.InJournal( poslal ) OR UO.InJournal( daleko ) OR UO.InJournal( chasto ) OR k > 50
		If UO.InJournal( chasto ) Then
			wait(1000)
		Else
			wait(2500)
		Endif
		If UO.Count( dengi ) > 0 Then
			UO.FindType( dengi )
			While UO.FindCount() > 0
				UO.MoveItem( 'finditem', '0', VendSer )
				wait(1000)
				CheckLag()
				UO.FindType( dengi )
			Wend
		Endif
		If UO.InJournal( dal ) Then
			# Блок смены вендора
			If VendSer2 <> '' Then
				If VendSer == VendSer1 Then
					VendSer = VendSer2
				Else
					VendSer = VendSer1
				Endif
			Endif
		Endif
		If UO.GetHP() < UO.GetMaxHP() Then
			UO.Msg( 'GUARDS' )
		Endif
	Wend
endsub

sub Snooping()
	; Прокачка снупинга.
	VAR bpack = '0x404CFB26'
	repeat
		UO.UseObject( bpack )
		wait(2500)
	until UO.SkillVal( 'Snooping' ) > 999
endsub

sub Stealing()
	; Прокачка стилинга. Временный тестовый скрипт.
	VAR bint = '0x0E21'
	VAR bpack = '0x404CFB26'
	repeat
		UO.FindType( bint, '-1', bpack )
		UO.UseSkill( 'Stealing', 'finditem' )
		wait(4000)
	until UO.Dead()
endsub

#####################################################################
##########################               ############################
##########################   ПРОЦЕДУРЫ   ############################

#####################################################################
Sub GoHide()
	While not UO.Hidden() 
		UO.UseSkill('Hiding') 
		Wait(4000) 
	Wend
endsub

#####################################################################
Sub GetDagger( Dagger )
	If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) <> Dagger Then
		UO.FindType( Dagger )
		If UO.FindCount() == 0 Then
			return 0
		Endif
		UO.Equipt( 'Rhand', Dagger )
		wait(1000)
	Endif
	return 1
endsub

#####################################################################
; ================================================================
; Процедура подкормки чара. Параметры: сериал контейнера с медом, номер 
; сообщения до которого кормить, сколько съесть меда после сообщения,
; как часто кормить чара.
; Прохождение последнего периода контролируется через глобальную переменную 
; TimeProcess.
;
; ver. 1.07 (c) Edred
;
Sub EatChar( Sunduk, Nom, Add, TimeWait )
	; сообщения при кормежке
	UO.Print( 'TEST: eat to ' + str( Nom ) + ' message and ' + str( Add ) + ' more each ' + str( TimeWait ) + ' minutes' )
	DIM Eat[8]
	Eat[0] = ''
	Eat[1] = 'You eat the food, but are still extremely hungry'
	Eat[2] = 'After eating the food, you fell much less hungry'
	Eat[3] = 'You eat the food, and begin to feel more satiated'
	Eat[4] = 'You are nearly stuffed, but manage to eat the food'
	Eat[5] = 'You fell quite full after consuming the food'
	Eat[6] = 'You are stuffed!'
	Eat[7] = 'You are simply too full to eat any more!'
	VAR Med = '0x09EC'			; тип меда для подкормки
	VAR i, EatC, j, k, flag
	; проверим, пора ли кормиться
	i = Val( UO.GetGlobal( 'TimeProcess' ) )
	i = ( UO.Timer() - i ) / 600 
	If i < TimeWait Then
		; рано кормиться
		UO.Print( 'Eat early! ' + str( i ) + ' from ' + str( TimeWait ) )
		return
	Endif
	If Nom > 0 AND Nom < 8 Then
		EatC = Eat[Nom]
	Else
		EatC = Eat[7]
	Endif
	UO.FindType( Med, '-1', Sunduk )
	If UO.FindCount() == 0 Then
		; мед кончился
		UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
		return
	Endif
	UO.Grab( '60', 'finditem' )
	Wait( 1000 )
	CheckLag()
	For k = 1 To 7
		DeleteJournal( Eat[k] )
	Next
	flag = 0
	If Nom < 7 Then
		UO.UseType( Med )
		Wait( 1000 )
		CheckLag()
		For k = Nom + 1 To 7
			If UO.InJournal( Eat[k] ) Then
				flag = 1
			Endif
		Next
	Endif
	If flag == 0 Then
		repeat
			DeleteJournal( EatC )
			UO.UseType( Med )
			Wait( 1000 )
			CheckLag()
		until NOT UO.InJournal( EatC )
		If Add > 0 Then
			For j = 1 To Add
				UO.UseType( Med )
				Wait( 1000 )
				CheckLag()
			Next
		Endif
	Endif
	; хватит кормиться
	; выгрузим остатки меда обратно
	UO.Findtype( Med, '-1', 'backpack' )
	UO.MoveItem( 'finditem', 0, Sunduk )
	Wait( 1000 )
	CheckLag()
	; Сбросим счетчик
	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
endsub

#####################################################################
Sub CheckLag()
	DeleteJournal( 'backpack' )
	UO.Click( 'backpack' )
	repeat
		wait(100)
	until UO.InJournal( 'backpack' )
	return
end sub

#####################################################################
Sub DeleteJournal( string1 )
	VAR nom = UO.InJournal( string1 )
	If nom > 0 Then
		UO.SetJournalLine( Nom - 1, 'string replaced' )
		DeleteJournal( string1 )
	Endif
endsub

#####################################################################
Sub Recalling( Runbk, NRune ) 
	; Runbk - сериал или ссылка на объект рунбуки 
	; NRune - десятичный номер (текстом) руны для реколла 
	VAR myx = UO.GetX()
	VAR myy = UO.GetY()
	VAR OldMana = UO.Mana
	VAR i = 0
	DeleteJournal( 'fizzles' )
	UO.Exec("recall " + Runbk + " " + NRune) 
	repeat
		CheckLag()
		wait(1000)
		i = i + 1
	until ( i > 6 ) OR ( UO.Mana < OldMana - 8 ) OR UO.InJournal( 'fizzles' )
	wait(500)
	If myx == UO.GetX() AND myy == UO.GetY() Then
		UO.WarMode( 'flip' ) 
		wait(100) 
		UO.WarMode( 'flip' )
		Recalling( Runbk, NRune ) 
	Endif
endsub 

#####################################################################
; Spirit Speak v.1.00b (c) Edred
;
; Разовая прокачка спирит спика. Предназначена для вызова из других скриптов.
;
sub SpSpeak()
	VAR mod = UO.WarMode(), num
	VAR fizzle = 'You fail your attempt'
	VAR success = 'You establish a connection'
	UO.WarMode( 0 )
	DeleteJournal( success )
	repeat
		DeleteJournal( fizzle )
		UO.UseSkill( 'Spirit Speak' )
		num = 1
		repeat
			wait(100)
			num = num + 1
		until UO.InJournal( fizzle ) OR UO.InJournal( success ) OR num > 600
	until UO.InJournal( success )
	UO.WarMode( mod )
endsub

#####################################################################
Sub GetResource( typ, kolvo, cont )
	; Берем из указанного контейнера указанное количество ресурса по типу
	; Возвращаем 0 если ресурс не найден и 1 если все ок.
	UO.FindType( typ, '-1', cont )		; Ищем ресурс в контейнере
	If UO.FindCount() == 0 Then
		UO.Print("Resource not found, script terminated")
		return 0
	Endif
	UO.Grab( Str( Kolvo ), 'finditem' ) ; Кладем ресурсы в пак
	Wait(500)
	CheckLag()
	return 1
endsub
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

SimpleCraft.sc

Code: Select all

#                                                                   #
#   SimpleCraft.sc, ver 505.110 (c) Edred                           #
#                                                                   #
#####################################################################
#  1. CraftLockPick                                                 #
#  2. MadeMarkScroll                                                #
#  3. MadeRecallScroll                                              #
#  4. MadeFSScroll                                                  #
#  5. AutoCraftPotion                                               #
#  6. CraftFishFat                                                  #
#  7. CraftRecallRune                                               #
#  8. Craft10Cleaver                                                #
#  9. CraftBlankDeed                                                #
# 10. CookFish                                                      #
# 11. TailorBlankScroll                                             #
#                                                                   #
#####################################################################
;
#####################################################################
; CraftLockpick. v.1.01b (c) Edred
;
sub CraftLockpick() 
	VAR Sunduk = '0x404CFAA3'
	VAR Ingi = '0x1BEF'
	VAR Instrum = '0x1EBC'
	VAR LPicks = '0x14FB'
	VAR Kolvo = 200, SumKolvo = 0, MoveKolvo = 0
	VAR k = 0
	UO.TextOpen()
	UO.TextClear()
	UO.CancelMenu()
	UO.FindType( Lpicks, '-1', Sunduk )
	If UO.FindCount() > 0 Then
		SumKolvo = UO.GetQuantity( 'finditem' )
		UO.TextPrint( 'I have ' + str(SumKolvo) + ' lockpicks' )
	Endif
	UO.AutoMenu('Keys and Lockpicks', 'Golden lockpick')
	While TRUE
		UO.FindType( Ingi, '-1', Sunduk )
		If UO.FindCount() == 0 Then
			UO.Print("Ingots not found, script terminated")
			UO.CancelMenu()
			return
		Endif
		UO.Grab( Str( Kolvo ), 'finditem' )
		wait( 1000 )
		CheckLag()
		While UO.Count( Ingi ) > 0
			UO.Print('Ostalos ' + Str( UO.Count( Ingi ) ) + ' ingots' )
			UO.DeleteJournal()
			UO.UseType( Instrum )
			k = 0
			while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 30 )
				k = k + 1
				wait(500) 
			wend
		Wend
		If UO.Count( LPicks ) > 0 then
			UO.FindType( LPicks, '-1', '-1' )
			MoveKolvo = UO.GetQuantity( 'finditem' )
			SumKolvo = SumKolvo + MoveKolvo
			UO.MoveItem( 'finditem', '0', Sunduk )
			wait( 1000 )
			CheckLag()
			UO.Print( 'Lockpicks dropped' )
			UO.TextPrint( 'Added ' + str(MoveKolvo) + ' lockpicks. Sum is ' + str(SumKolvo) )
		Endif
	Wend
end sub

#####################################################################
; MadeMarkScroll. v.1.00b (c) Edred
;
; Крафтим столько марк скроллов, сколько позволяют ингридиенты в паке.

sub MadeMarkScroll() 
	VAR Blank = '0x0E34' 			; Тип бланк скролла
	VAR Mark = '0x1F59'				; Тип скроллов Mark
	VAR Reg1 = '0x0F86'				; mandrake root
	VAR Reg2 = '0x0F7A'				; black pearl
	VAR Reg3 = '0x0F7B'				; blood moss
	VAR Fizzle = 'You fail to inscribe the scroll'
	VAR Success = 'You put the'
	VAR k
	UO.CancelMenu()
	UO.AutoMenu( 'Spell Circles', 'Sixth Circle' )
	UO.AutoMenu( 'Spell Circle 6', 'Mark' )
	While TRUE
		If UO.Count( Blank ) == 0 Then
			UO.Print( 'Blank Scroll not found. Script terminated' )
			return
		Endif
		If UO.Count( Reg1 ) == 0 Then
			UO.Print( 'Mandrake Root not found. Script terminated' )
			return
		Endif
		If UO.Count( Reg2 ) == 0 Then
			UO.Print( 'Black Pearls not found. Script terminated' )
			return
		Endif
		If UO.Count( Reg3 ) == 0 Then
			UO.Print( 'Blood Moss not found. Script terminated' )
			return
		Endif
		repeat
			DeleteJournal( Fizzle )
			DeleteJournal( Success )
			UO.UseType( Blank )
			k = 0
			repeat
				k = k + 1
				wait(100)
			until UO.InJournal( Fizzle ) OR UO.InJournal( Success ) OR UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0 OR k > 600
			If UO.Mana < 20 Then
				repeat
					UO.UseSkill( 'Meditation' )
					wait(2000)
				until UO.Mana == UO.Int
			Endif
		Until UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0
	Wend
	UO.CancelMenu()
endsub

#####################################################################
; MadeRecallScroll. v.1.00b (c) Edred
;
; Крафтим столько рекалл скроллов, сколько позволяют ингридиенты в паке.
sub MadeRecallScroll() 
	VAR Blank = '0x0E34' 			; Тип бланк скролла
	VAR Reg1 = '0x0F86'				; mandrake root
	VAR Reg2 = '0x0F7A'				; black pearl
	VAR Reg3 = '0x0F7B'				; blood moss
	VAR Fizzle = 'You fail to inscribe the scroll'
	VAR Success = 'You put the'
	VAR k
	UO.CancelMenu()
	UO.AutoMenu( 'Spell Circles', 'Fourth Circle' )
	UO.AutoMenu( 'Spell Circle 4', 'Recall' )
	While TRUE
		If UO.Count( Blank ) == 0 Then
			UO.Print( 'Blank Scroll not found. Script terminated' )
			return
		Endif
		If UO.Count( Reg1 ) == 0 Then
			UO.Print( 'Mandrake Root not found. Script terminated' )
			return
		Endif
		If UO.Count( Reg2 ) == 0 Then
			UO.Print( 'Black Pearls not found. Script terminated' )
			return
		Endif
		If UO.Count( Reg3 ) == 0 Then
			UO.Print( 'Blood Moss not found. Script terminated' )
			return
		Endif
		repeat
			DeleteJournal( Fizzle )
			DeleteJournal( Success )
			UO.UseType( Blank )
			k = 0
			repeat
				k = k + 1
				wait(100)
			until UO.InJournal( Fizzle ) OR UO.InJournal( Success ) OR UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0 OR k > 600
			If UO.Mana < 20 Then
				repeat
					UO.UseSkill( 'Meditation' )
					wait(2000)
				until UO.Mana == UO.Int
			Endif
		Until UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0
	Wend
	UO.CancelMenu()
endsub

#####################################################################
; MadeFSScroll. v.1.00b (c) Edred
;
; Крафтим столько flame strikes, сколько позволяют ингридиенты в паке.

sub MadeFSScroll() 
	VAR Blank = '0x0E34' 			; Тип бланк скролла
	VAR Mark = '0x1F5F'				; Тип скроллов FS
	VAR Reg1 = '0x0F8D'				; spider silk
	VAR Reg2 = '0x0F8C'				; sulphorous ash
	VAR Fizzle = 'You fail to inscribe the scroll'
	VAR Success = 'You put the'
	VAR k
	UO.CancelMenu()
	UO.AutoMenu( 'Spell Circles', 'Seventh Circle' )
	UO.AutoMenu( 'Spell Circle 7', 'Flamestrike' )
	While TRUE
		If UO.Count( Blank ) == 0 Then
			UO.Print( 'Blank Scroll not found. Script terminated' )
			return
		Endif
		If UO.Count( Reg1 ) == 0 Then
			UO.Print( 'Spider Silk not found. Script terminated' )
			return
		Endif
		If UO.Count( Reg2 ) == 0 Then
			UO.Print( 'Sulphorous Ash not found. Script terminated' )
			return
		Endif
		repeat
			DeleteJournal( Fizzle )
			DeleteJournal( Success )
			UO.UseType( Blank )
			k = 0
			repeat
				k = k + 1
				wait(100)
			until UO.InJournal( Fizzle ) OR UO.InJournal( Success ) OR UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0 OR k > 600
			If UO.Mana < 45 Then
				repeat
					UO.UseSkill( 'Meditation' )
					wait(2000)
				until UO.Mana == UO.Int
			Endif
		Until UO.Count( Blank ) == 0 OR UO.Count( Reg1 ) == 0 OR UO.Count( Reg2 ) == 0
	Wend
	UO.CancelMenu()
endsub

#####################################################################
; Крафтим разные поушены пока хватает ингридиентов или бутылок в паке.
; Выбор поушена осуществляется через меню.
; v.1.01b (c) Edred
sub AutoCraftPotion()
	DIM treagents[13], nampotion[13], nreagents[13], countregs[13]
	nampotion[1]  = 'greater agility'
	nreagents[1]  = 'blood moss'
	treagents[1]  = '0x0F7B'
	countregs[1]  = 3
	nampotion[2]  = 'greater cure'
	nreagents[2]  = 'garlic'
	treagents[2]  = '0x0F84'
	countregs[2]  = 6
	nampotion[3]  = 'greater explosion'
	nreagents[3]  = 'sulphorous ash'
	treagents[3]  = '0x0F8C'
	countregs[3]  = 10
	nampotion[4]  = 'greater heal'
	nreagents[4]  = 'ginseng'
	treagents[4]  = '0x0F85'
	countregs[4]  = 7
	nampotion[5]  = 'greater poison'
	nreagents[5]  = 'nightshade'
	treagents[5]  = '0x0F88'
	countregs[5]  = 8
	nampotion[6]  = 'greater strength'
	nreagents[6]  = 'mandrake root'
	treagents[6]  = '0x0F86'
	countregs[6]  = 5
	nampotion[7]  = 'total refresh'
	nreagents[7]  = 'black pearl'
	treagents[7]  = '0x0F7A'
	countregs[7]  = 5
	nampotion[8]  = 'shrink'
	nreagents[8]  = 'batwing'
	treagents[8]  = '0x0F78'
	countregs[8]  = 4
	nampotion[9]  = 'invisibility'
	nreagents[9]  = 'wyrm heart'
	treagents[9]  = '0x0F91'
	countregs[9]  = 18
	nampotion[10] = 'deadly poison'
	nreagents[10] = 'nightshade'
	treagents[10] = '0x0F88'
	countregs[10] = 16
	nampotion[11] = 'lava bomb'
	nreagents[11] = 'volcanic ash'
	treagents[11] = '0x0F8F'
	countregs[11] = 10
	nampotion[12] = 'total mana refresh'
	nreagents[12] = 'eye of newt'
	treagents[12] = '0x0F87'
	countregs[12] = 6
	VAR bottles = '0x0F0E'
	VAR i, menu1, j, SumPot = 0
	UO.CancelMenu()
	menu1 = ''
	For j = 1 To 11
		menu1 = menu1 + "'" + nampotion[j] + "'" + ";"
	Next
	menu1 = menu1 + "'" + nampotion[12] + "'"
	i = UO.asmInputCombo( "Выберите вид поушена:", menu1 )
	UO.Print( str(i) )
	If i == 0 Then
		UO.Print( 'Script terminated' )
		return
	Endif
	UO.Exec( "automenu 'What potion do you want' " + "'" + nampotion[i] +"'" )
	while UO.Count( bottles, '0x0000' ) > 0 AND UO.Count( treagents[i] ) >= countregs[i]
		UO.DeleteJournal()
		UO.UseType( treagents[i] )
		repeat
			wait(200)
		until UO.InJournal( "You put" ) OR UO.InJournal( "You toss the failed" )
		If UO.InJournal( "You put" ) Then
			SumPot = SumPot + 1
			UO.Print( 'I tossed ' + str( SumPot ) + ' potions' )
		Endif
	wend
	UO.Print( 'Script finished' )
	UO.CancelMenu()
endsub

#####################################################################
; CraftFishFat. Крафтим Fish Fat.
; v.1.00b (c) Edred
sub CraftFishFat()
	VAR Garlic = '0x0F84' 			; Тип гарлика
	VAR Steak = '0x097B'			; Тип жареных стейков
	VAR Bottle = '0x0F0E'			; Тип пустых бутылок
	VAR Fizzle = 'You toss the failed'
	VAR Success = 'You put'
	VAR k
	UO.CancelMenu()
	UO.AutoMenu( 'What potion do you want', 'The fish fat' )
	While TRUE
		If UO.Count( Garlic ) < 1 Then
			UO.Print( '1 Garlic not found. Script terminated' )
			return
		Endif
		If UO.Count( Steak ) < 100 Then
			UO.Print( '100 Steak not found. Script terminated' )
			return
		Endif
		If UO.Count( Bottle ) < 1 Then
			UO.Print( '1 Empty Bottle not found. Script terminated' )
			return
		Endif
		repeat
			DeleteJournal( Fizzle )
			DeleteJournal( Success )
			UO.UseType( Garlic )
			k = 0
			repeat
				k = k + 1
				wait(100)
			until UO.InJournal( Fizzle ) OR UO.InJournal( Success ) OR UO.Count( Garlic ) < 1 OR UO.Count( Steak ) < 100 OR UO.Count( Bottle ) < 1 OR k > 600
		Until UO.Count( Garlic ) < 1 OR UO.Count( Steak ) < 100 OR UO.Count( Bottle ) < 1
	Wend
	UO.CancelMenu()
endsub

#####################################################################
; CraftRecallRune. Крафтим Fish Fat.
; v.1.00b (c) Edred
sub CraftRecallRune()
	VAR BPearl = '0x0F7A' 			; Тип black pearl
	VAR FishFat = '0x182B'			; Тип жареных стейков
	VAR Bottle = '0x0F0E'			; Тип пустых бутылок
	VAR Stone = '0x1BF2'			; тип стоун бриков
	VAR Beeswax = '0x1423'			; тип воска
	VAR RecallScroll = '0x1F4C'		; тип рекалл скролла
	VAR MarkScroll = '0x1F59'		; тип марк скролла
	VAR Fizzle = 'You toss the failed'
	VAR Success = 'You put'
	VAR k
	UO.CancelMenu()
	UO.AutoMenu( 'What potion do you want', 'recall rune' )
	While UO.Count(BPearl)>0 AND UO.Count(FishFat)>0 AND UO.Count(Bottle)>0 AND UO.Count(Stone)>9 AND UO.Count(Beeswax)>9 AND UO.Count(RecallScroll)>0 AND UO.Count(MarkScroll)>0
		DeleteJournal( Fizzle )
		DeleteJournal( Success )
		UO.UseType( BPearl )
		k = 0
		repeat
			k = k + 1
			wait(100)
		until UO.InJournal(Fizzle) OR UO.InJournal(Success) OR k>600 OR UO.Count(BPearl)==0 OR UO.Count(FishFat)==0 OR UO.Count(Bottle)==0 OR UO.Count(Stone)<10 OR UO.Count(Beeswax)<10 OR UO.Count(RecallScroll)==0 OR UO.Count(MarkScroll)==0
	Wend
	UO.CancelMenu()
endsub

#####################################################################
; Craft10Cleaver. v.1.00b (c) Edred
;
; В руки молоток и 100 айрона в пак (или больше). Будут сделаны 10 кливеров.
;
sub Craft10Cleaver() 
	VAR Iron = '0x1BEF'
	UO.CancelMenu()
	UO.IgnoreReset()
	UO.AutoMenu( 'Blacksmithing', 'Iron Tools' )
	UO.AutoMenu( 'Other Iron Weapon', 'cleaver' )
	VAR k, i
	i = 0
	repeat
		UO.DeleteJournal()
		UO.UseType( Iron )
		k = 0
		while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 150 )
			k = k + 1
			wait(100) 
		wend
		If UO.InJournal('You put') Then
			i = i + 1
		Endif
	until i == 10
	UO.IgnoreReset()
	UO.CancelMenu()
endsub

#####################################################################
; CraftBlankDeed. v.1.00b (c) Edred
;
sub CraftBlankDeed() 
	VAR Shkur = '0x1067' 			; Тип шкур
	VAR Vosk = '0x1423' 			; Тип воска
	VAR Kit = '0x0F9D' 			; Тип инструмента тейлора
	VAR j, ShkurSer, k, i
	VAR success = 'You put' 
	VAR fizzle = 'fail'
	UO.CancelMenu()
	UO.AutoMenu( "Leather", "Blank's" )
	UO.AutoMenu("Blank's", "blank deed" )
	While UO.Count( Shkur ) > 9 AND UO.Count( Vosk ) > 9
		DeleteJournal( success )
		DeleteJournal( fizzle )
		UO.FindType( Shkur )
		UO.WaitTargetObject( 'finditem' )
		UO.UseType( Kit )
		k = 0
		repeat
			k = k + 1
			wait(500)
		until UO.InJournal( success ) OR UO.InJournal( fizzle ) OR ( k > 30 )
	Wend
endsub

#####################################################################
; CookFish. v.1.05b (c) Edred
;
; Скрипт для жарки рыбных стейков из пака. Хворост также лежит в паке. 
;
; Берем из пака 1 шт хвороста, кладем в координаты TX, TY и зажигаем ее.
; Потом берем 1 шт. сырых стейков из пака и жарим
; на костре или углях. При этом перед жаркой проверяем, есть ли в
; вокруг чара огонь или угли. если есть жарим, иначе опять жгем костер.
; Готовый стейк остается в паке.
;
sub CookFish()
	VAR Hvorost = '0x0DE1'
	VAR Koster = '0x0DE3'
	VAR Ugli = '0x0DE9'
	VAR Fish = '0x097A'
	VAR FishGot = '0x097B'
	VAR SpiritTime = UO.Timer()
	VAR TX = 2042
	VAR TY = 378
	VAR i, flag
	UO.CancelTarget()
	UO.Exec( 'set finddistance 3' )
   	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
	While UO.Count( Fish ) > 0
# ----------------------------------
# блок запуска прокачки Spirit Speak
		If ( UO.Timer() - SpiritTime ) / 600 > 5 Then
			; Прошло 5 минут с момента последней прокачки Spirit Speak
			SpSpeak()
			SpiritTime = UO.Timer()
		Endif
# ----------------------------------
		UO.FindType( Hvorost )
		If UO.FindCount() == 0 Then
			UO.Print( 'No kindling found. Script terminated' )
			return
		Endif
		UO.MoveItem( 'finditem', '1', 'ground', str(TX), str(TY), str(UO.GetZ()) )
		wait(1000)
		CheckLag()
		UO.Findtype( Hvorost, '-1', '1' )
		If UO.FindCount() > 0 Then
			repeat
				UO.UseFromGround( Hvorost )
				wait(1000)
				UO.FindType( Koster, '-1', '1' )
			until UO.FindCount() > 0
			; костер горит
			UO.UseSkill( 'Hiding' )
			wait(2000)
			flag = 1
			repeat
				; теперь проверим не погас ли костер, не исчезли ли угли
				UO.FindType( Koster, '-1', '1' )
				If UO.FindCount() <> 0 Then
					; еще горит костер - жарим на нем стейк
					If UseSteake( Fish, UO.GetSerial('finditem') ) Then
						flag = 0
					Endif
					; стейк готов
				Else
					UO.FindType( Ugli, '-1', '1' )
					If UO.FindCount() <> 0 Then
						; есть еще угли!
						if UseSteake( Fish, UO.GetSerial('finditem') ) then
							flag = 0
						endif
					Else
						flag = 0
					Endif
				Endif
			until flag == 0
		Endif
	Wend
endsub
;
Sub UseSteake( fish, koster )
	VAR msg1 = 'You burn the food'				; физл
	VAR msg2 = 'You put the fish steak'			; успех
	VAR msg22 = 'You put the fish steaks'		; успех
	VAR msg3 = 'You must wait'					; ждать
	VAR msg4 = "You can't see the target"
	repeat
		DeleteJournal (msg1 )
		DeleteJournal (msg2 )
		DeleteJournal (msg22 )
		DeleteJournal (msg3 )
		DeleteJournal (msg4 )
		UO.WaitTargetObject( 'finditem' )
		UO.UseType( Fish )
		repeat
			wait(500)
		until UO.InJournal(msg1) OR UO.InJournal(msg2) OR UO.InJournal(msg22) OR UO.InJournal(msg3) OR UO.InJournal(msg4)
		if UO.InJournal(msg4) then
			return 1
		endif
		if UO.InJournal(msg3) then
			wait(500)
		endif
	until UO.InJournal(msg2) OR UO.InJournal(msg22)
	return 0
endsub

#####################################################################
; TailorBlankScroll. v.1.00b (c) Edred
;
sub TailorBlankScroll()
	VAR Kozha = "0x1067"
	VAR Vosk = "0x1423"
	VAR Kit = "0x0F9D"
	VAR Scrol = "0x0E34"
	VAR k
	UO.CancelMenu()
	wait(500)
	UO.AutoMenu( "Leather", "Blank's" )
	UO.AutoMenu( "Blank's", "blank scroll" )
	While TRUE
		If UO.Count( Kozha ) == 0 Then
			UO.Print("Leathers not found, script terminated")
			return
		Endif
		If UO.Count( Vosk ) == 0 Then
			UO.Print("Beeswaxs not found, script terminated")
			return
		Endif
		UO.DeleteJournal()
		UO.WaitTargetType( Kozha )
		UO.UseType( Kit )
		k = 0
		while NOT UO.InJournal('You put') AND NOT UO.InJournal('fail') AND ( k < 50 )
			k = k + 1
			wait(300) 
		wend
	Wend
	UO.CancelMenu()
end sub

#####################################################################
##########################               ############################
##########################   ПРОЦЕДУРЫ   ############################

#####################################################################
Sub GoHide()
	While not UO.Hidden() 
		UO.UseSkill('Hiding') 
		Wait(4000) 
	Wend
endsub

#####################################################################
Sub CheckLag()
	DeleteJournal( 'backpack' )
	UO.Click( 'backpack' )
	repeat
		wait(100)
	until UO.InJournal( 'backpack' )
	return
end sub

#####################################################################
Sub DeleteJournal( string1 )
	VAR nom = UO.InJournal( string1 )
	If nom > 0 Then
		UO.SetJournalLine( Nom - 1, 'string replaced' )
		DeleteJournal( string1 )
	Endif
endsub

#####################################################################
; Spirit Speak v.1.00b (c) Edred
;
; Разовая прокачка спирит спика. Предназначена для вызова из других скриптов.
;
sub SpSpeak()
	VAR mod = UO.WarMode(), num
	VAR fizzle = 'You fail your attempt'
	VAR success = 'You establish a connection'
	UO.WarMode( 0 )
	DeleteJournal( success )
	repeat
		DeleteJournal( fizzle )
		UO.UseSkill( 'Spirit Speak' )
		num = 1
		repeat
			wait(100)
			num = num + 1
		until UO.InJournal( fizzle ) OR UO.InJournal( success ) OR num > 600
	until UO.InJournal( success )
	UO.WarMode( mod )
endsub
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Фигня какая-то под рукой оказалась...

Code: Select all

#===================================================================#
# SELLLOGS                                                          #
# Продажа логов вендорусту                                          #
#===================================================================#
#   v.1.02b (с) Edred                                               #
#===================================================================#
;
; Берем в пак 2000 логов и тут же, на базе, запускаем скрипт. Реги тоже
; на момент старта должны быть в паке. ГМ Медиты приветствуется :)
;
sub SellLogs()
	VAR vend = '0x00276549', vendname = 'Aiko', Logs = '0x1BDD'
	VAR Gold = '0x0EED', i, sunduk = '0x400FAF5F'
	DIM reg[2]
	reg[0] = '0x0F7B'					; blood moss
	reg[1] = '0x0F86'					; mandrake root
	reg[2] = '0x0F7A'					; black pearl
	UO.Set( 'maxsell', '999' )
	UO.Set( 'distance', '3' )
	repeat
		Recalling( 'MyRunbook', '48' )
		wait(1000)
;		UO.UseSkill( 'Meditation' )
		; проверка расстояния до вендора
		while UO.Count( Logs )
			repeat
				wait(300)
			until UO.GetDistance( vend ) < 2		
			UO.WaitTargetObject( vend )
			UO.Sell( 'logi', vendname )
			wait(1000)
			UO.SayU( '.sell' )
			wait(1000)
		wend
		Recalling( 'MyRunbook', '42' )
		wait(1000)
		UO.FindType( Gold )
		While UO.FindCount()
			UO.MoveItem( 'finditem', 0, sunduk )
			wait(1000)
			CheckLag()
			UO.FindType( Gold )
		Wend
		UO.FindType( Logs, '0x0000', sunduk )
		If UO.FindCount() Then
			UO.Grab( '2000', 'finditem' )
			wait(1000)
			CheckLag()
		Else
			return
		Endif
		If UO.Mana < 40 Then
			repeat
				UO.UseSkill( 'Meditation' )
				wait(2000)
			until UO.Mana > 90
		Endif
		for i = 0 to 2
			If UO.Count( reg[i] ) < 3 Then
				UO.FindType( reg[i], -1, sunduk )
				If UO.FindCount() == 0 Then
					return
				Endif
				If UO.GetQuantity( 'finditem' ) > 10 Then
					UO.Grab( '10', 'finditem' )
				Else
					UO.Grab( '0', 'finditem' )
				Endif
				wait(1000)
				CheckLag()
			Endif
		next
	until UO.Count(Logs) == 0 
endsub

#####################################################################
Sub CheckLag()
	DeleteJournal( 'backpack' )
	UO.Click( 'backpack' )
	repeat
		wait(100)
	until UO.InJournal( 'backpack' )
	return
end sub

#####################################################################
Sub DeleteJournal( string1 )
	VAR nom = UO.InJournal( string1 )
	If nom > 0 Then
		UO.SetJournalLine( Nom - 1, 'string replaced' )
		DeleteJournal( string1 )
	Endif
endsub

#####################################################################
Sub Recalling( Runbk, NRune ) 
	; Runbk - сериал или ссылка на объект рунбуки 
	; NRune - десятичный номер (текстом) руны для реколла 
	VAR myx = UO.GetX()
	VAR myy = UO.GetY()
	VAR OldMana = UO.Mana
	VAR i = 0
	DeleteJournal( 'fizzles' )
	UO.Exec("recall " + Runbk + " " + NRune) 
	repeat
		CheckLag()
		wait(1000)
		i = i + 1
	until ( i > 6 ) OR ( UO.Mana < OldMana - 8 ) OR UO.InJournal( 'fizzles' )
	wait(500)
	If myx == UO.GetX() AND myy == UO.GetY() Then
		UO.WarMode( 'flip' ) 
		wait(100) 
		UO.WarMode( 'flip' )
		Recalling( Runbk, NRune ) 
	Endif
endsub

Sub GetWord( st, nom )
; Возвращает слово из строки str за номером num
; если такого слова нет - возвращаем ''
;
; Разделителем слов считаем пробел. Несколько пробелов подряд считаются за один.
; Функция сделана без рекурсии специально для считывания слов из сверхдлинных строк!
;
	VAR tmpst
	VAR i, dlin, kol, start
	dlin = len( st )
	kol = 0
	start = 0
	For i=0 To dlin - 1
		If mid( st, i, 1 ) == ' ' OR i == dlin - 1 Then
			kol = kol + 1
			If kol == nom Then
				; это первый пробел после нужного нам слова
				tmpst = mid( st, start, i - start )
				return tmpst
			Else
				While mid( st, i, 1 ) == ' '
					i = i + 1
				Wend
				If kol == nom - 1 Then
					start = i
				Endif
			Endif
		Endif
	Next
	tmpst = ''
	return tmpst
endsub
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Вот тут уже кое-что интересное, правда, не доведенное до ума. Но работает...

readme.txt

Code: Select all

Скрипт crafters.sc

Скрипт работает по двум файлам - базы данных и командного.

база данных - crafters.db
командный - crafters.go

База данных содержит описание всевозможных крафтов, в том числе
сложных, описанных на встроенном в скрипт языке.

Командный файл содержит список того, что необходимо скрафтить
после запуска скрипта с указанием количеств.

Оба файла текстовые.

Командный файл представляет из себя список условных названий
крафтов с указанием количеств:
...
fulloldcopper 5
fullrose 3
fullsilver 6
cleaver 10
...
то есть - скрафтить 5 полных арморов из олд купера и сложить их 
в соответствующие мешки, 3 фулл армора из розы, 6 фулл арморов из силвера
и 10 кливеров.

Весь крафт будет сложен в спецконтейнер (сундук).

Скрипт сам возьмет необходимый инструмент и материалы из соотвествующих
контейнеров в сундуке с ресурсами и инструментами на базе. Сериалы 
контейнеров прописаны в массиве в скрипте (в дальнейшем будут сделаны
в виде текстового файла).

Поддерживаются следующие скиллы: tailor, blacksmithing, carpentry, alchemy, 
tinker.
crafters.go

Code: Select all

;  Командный файл для АвтоКрафтера. Уберите комментарий с того
;  предмета(ов) / набора(ов), которые вы хотите скрафтить и измените
;  количество с 1 на то, которое вам необходимо.
;
; Охвачены скиллы - бс, тейлор, тинкер
;
;============================ Наборы арморов с щитами (BS)
; fulloldcopper 1
; fulldullcopper
; fullcopperarmor
; fullbronzearmor
; fullrosearmor 5
; fullgoldenarmor
; fullsilverarmor
; fullagapitearmor 4
; fullbloodrockarmor
;============================ Наборы арморов без щитов (BS)
; fullveritearmor
;============================ Щиты (BS)
; silverkite 10
; veriteheater
; valoriteheater
;============================ Валоритовое оружие (BS)
; valoritedagger
; valoritekryss
; valoritewarfork
; valoritepitchfork
; valoritewarmace
; valoritewarhammer
; valoritevikingsword
; valoritehalberd
;============================ Инструменты (BS, tinker)
; irondagger 30
; smithhammer
; cleaver
; scissors
; sewingkit
; tinkertools
; pickaxe 10
; mortar
; jointingplane
;============================ Бланки (Tailor)
; blankscroll 
blankdeed 20
;============================ Отмычки (tinker)
; veriterlockpick
; valoritelockpick
;============================ Топоры (tinker)
; hatchet
; ancienthatchet
; sturdyhatchet
; steelhatchet
;============================ Сундуки с ключами (tinker)
; ironchest
; dullcopperchest
; bronzechest
; goldenchest
; agapitechest
; veritechest
; valoritechest
;============================ House Parts (карпентер)
; housepart 10
; woodenhousepart 10
; plasterhousepart 3
; sandstonehousepart 3
; stonehousepart 4
; marblehousepart 6
;============================ Houses (карпентер)
; smallstoneplasterhouse 3
; smallstonehouse 1
; smallbrickhouse 1
; smallwoodhouse
; smallwoodplasterhouse 3
; smallwoodroofhouse 1
;
;============================ Walls (карпентер)
; sandstonewall 50
;
Продолжение в след посте
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

продолжение скрипта Crafters...

crafters.db

Code: Select all

; крафтим pickaxe
@pickaxe
#SKILL tinker
RESOURCE 0x1BEF color 0x0000 count 4 container ingots FOCUS
RESOURCE 0x1BDD color 0x0000 count 1 container logs
MENU "Tinkering", "Tools"
MENU "Tools", "pickaxe"
RESULT 0x0E85 color 0x0000 count 1
; крафтим iron dagger
@irondagger
#SKILL bs
RESOURCE 0x1BEF color 0x0000 count 3 container ingots FOCUS
MENU "Iron Fencing Weapons", "Iron Dagger"
RESULT 0x0F51 color 0x0000 count 1
; крафтим silver kite
@silverkite
#SKILL bs
RESOURCE 0x1BF5 color 0x0000 count 16 container ingots FOCUS
MENU "Blacksmithing", "Colored Armor"
MENU "Silver Armor", "Silver Shields"
MENU "Silver Shields", "Silver Kite Shield"
RESULT 0x1B74 color 0x05B2 count 1
; ===================================================================
; =================================================== СТЕНЫ И КАЛИТКИ
;
; ------------------------ Stone wall
;
@stonewall
#SKILL carpent
RESOURCE 0x1BF2 color 0x08FD count 100 container bricks FOCUS
MENU
MENU
RESULT
;
; ------------------------ Dark stone wall
;
@darkstonewall
#SKILL carpent
RESOURCE 0x1BF2 color 0x08FD count 100 container bricks FOCUS
MENU
MENU
RESULT
;
; ------------------------ Sandstone wall
;
@sandstonewall
#SKILL carpent
RESOURCE 0x1BF2 color 0x0031 count 100 container bricks FOCUS
MENU
MENU
RESULT
;
; ------------------------ Plaster wall
;
@plasterwall
#SKILL carpent
RESOURCE 0x1BF2 color 0x0032 count 100 container bricks FOCUS
MENU
MENU
RESULT
;
; ------------------------ Stone Gates
;
@stonegates
#SKILL tinker
RESOURCE 0x1BF2 color 0x08FD count 700 container bricks FOCUS
RESOURCE 0x1BEF color 0x0000 count 700 container ingots
RESOURCE 0x14EF color 0x0000 count 1  container blankdeeds
MENU
MENU
RESULT
;
; ------------------------ Dark Stone Gates
;
@darkstonegates
#SKILL tinker
RESOURCE 0x1BF2 color 0x08FD count 700 container bricks FOCUS
RESOURCE 0x1BEF color 0x0000 count 700 container ingots
RESOURCE 0x14EF color 0x0000 count 1  container blankdeeds
MENU
MENU
RESULT
;
; ------------------------ Sandstone Gates
;
@sandstonegates
#SKILL tinker
RESOURCE 0x1BF2 color 0x0031 count 700 container bricks FOCUS
RESOURCE 0x1BEF color 0x0000 count 700 container ingots
RESOURCE 0x14EF color 0x0000 count 1  container blankdeeds
MENU
MENU
RESULT
;
; ===================================================================
; ============================================================ ТЕЙЛОР
;
; ------------------------ Blank Deed
;
@blankdeed
#SKILL tailor
RESOURCE 0x1067 color 0 count 10 container leather FOCUS
RESOURCE 0x1423 color 0 count 10 container leather
MENU "Leather", "Blank's"
MENU "Blank's", "blank deed"
RESULT 0x14EF color 0x0000 count 1 
;
; ===================================================================
; ============================================================== ДОМА
;
; ------------------------ House Part
;
@housepart
#SKILL carpent
RESOURCE 0x1BEF color 0x0000 count 1000 container ingots FOCUS
MENU "Parts", "(2)"
; "House Part (1000 t_ingots)"
RESULT 0x14EF color 0x08FD count 1 
;
; ------------------------ Wooden House Part
;
@woodenhousepart
#SKILL carpent
RESOURCE 0x1BDD color 0x0000 count 1000 container logs FOCUS
MENU "Carpentry", "Houses & Parts"
MENU "Parts", "Wooden House Part"
RESULT 0x14EF color 0x0091 count 1 
;
; ------------------------ Plaster House Part
;
@plasterhousepart
#SKILL carpent
RESOURCE 0x1BF2 color 0x0032 count 1000 container bricks FOCUS
MENU "Carpentry", "Houses & Parts"
MENU "Parts", "Plaster House Part"
RESULT 0x14EF color 0x0032 count 1 
;
; ------------------------ Sandstone House Part
;
@sandstonehousepart
#SKILL carpent
RESOURCE 0x1BF2 color 0x0031 count 1000 container bricks FOCUS
MENU "Carpentry", "Houses & Parts"
MENU "Parts", "Sandstone House Part"
RESULT 0x14EF color 0x0030 count 1 
;
; ------------------------ Stone House Part
;
@stonehousepart
#SKILL carpent
RESOURCE 0x1BF2 color 0x08FD count 1000 container bricks FOCUS
MENU "Carpentry", "Houses & Parts"
MENU "Parts", "Stone House Part"
RESULT 0x14EF color 0x08FD count 1 
;
; ------------------------ Deed to a small stone and plaster house
;
@smallstoneplasterhouse
#SKILL carpent
RESOURCE 0x14EF color 0x0000 count 1 container blankdeeds FOCUS
RESOURCE 0x14EF color 0x08FD count 3 container blankdeeds
RESOURCE 0x14EF color 0x0091 count 3 container blankdeeds
MENU "Carpentry", "Houses & Parts"
MENU "Houses", "Deed to a small stone and plaster"
RESULT 0x2830 color 0x0000 count 1 
;
; ------------------------ Deed to a small stone house
;
@smallstonehouse
#SKILL carpent
RESOURCE 0x14EF color 0x0000 count 1 container blankdeeds FOCUS
RESOURCE 0x14EF color 0x08FD count 3 container blankdeeds
RESOURCE 0x14EF color 0x0091 count 3 container blankdeeds
MENU "Carpentry", "Houses & Parts"
MENU "Houses", "Deed to a small stone house"
RESULT 0x2830 color 0x0000 count 1 
;
; ------------------------ Deed to a small brick house
;
@smallbrickhouse
#SKILL carpent
RESOURCE 0x14EF color 0x0000 count 1 container blankdeeds FOCUS
RESOURCE 0x14EF color 0x08FD count 3 container blankdeeds
RESOURCE 0x14EF color 0x0091 count 3 container blankdeeds
MENU "Carpentry", "Houses & Parts"
MENU "Houses", "Deed to a small brick house"
RESULT 0x2830 color 0x0000 count 1 
;
; ------------------------ Deed to a small wood house
;
@smallwoodhouse
#SKILL carpent
RESOURCE 0x14EF color 0x0000 count 1 container blankdeeds FOCUS
RESOURCE 0x14EF color 0x08FD count 3 container blankdeeds
RESOURCE 0x14EF color 0x0091 count 3 container blankdeeds
MENU "Carpentry", "Houses & Parts"
MENU "Houses", "Deed to a small wood house"
RESULT 0x2830 color 0x0000 count 1 
;
; ------------------------ Deed to a small wood and plaster house
;
@smallwoodplasterhouse
#SKILL carpent
RESOURCE 0x14EF color 0x0000 count 1 container blankdeeds FOCUS
RESOURCE 0x14EF color 0x08FD count 3 container blankdeeds
RESOURCE 0x14EF color 0x0091 count 3 container blankdeeds
MENU "Carpentry", "Houses & Parts"
MENU "Houses", "Deed to a small wood and plaster"
RESULT 0x2830 color 0x0000 count 1 
;
; ------------------------ Deed to a small wood thatched roof house
;
@smallwoodroofhouse
#SKILL carpent
RESOURCE 0x14EF color 0x0000 count 1 container blankdeeds FOCUS
RESOURCE 0x14EF color 0x08FD count 3 container blankdeeds
RESOURCE 0x14EF color 0x0091 count 3 container blankdeeds
MENU "Carpentry", "Houses & Parts"
MENU "Houses", "Deed to a small wood thatched"
RESULT 0x2830 color 0x0000 count 1 
;
; ===================================================================
; ============================================================ АРМОРЫ
;
; ------------------------ Full Old Copper Armor
;
@fulloldcopper
; сначала мешок
#SKILL tailor
RESOURCE 0x1067 color 0 count 2 container leather FOCUS
MENU "Leather", "Bags for Armors"
MENU "Bags for Armors", "Full set of Old Copper armor"
RESULT 0x0E76 color 0x0590 count 1 
; эта команда показывает, что все следующее кладется в мешок выше
NEXTINBEGIN
; крафтим platemail (25 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0590 count 25 container ingots FOCUS
MENU "Old Copper Armor", "Old Copper Plate Mail"
MENU "Old Copper Plate Mail", "(1)"
RESULT 0x1415 color 0x0590 count 1
; крафтим gorget (10 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0590 count 10 container ingots FOCUS
MENU "Old Copper Armor", "Old Copper Plate Mail"
MENU "Old Copper Plate Mail", "(1)"
RESULT 0x1413 color 0x0590 count 1
; крафтим gauntlets (12 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0590 count 12 container ingots FOCUS
MENU "Old Copper Armor", "Old Copper Plate Mail"
MENU "Old Copper Plate Mail", "(2)"
RESULT 0x1414 color 0x0590 count 1
; крафтим helm (15 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0590 count 15 container ingots FOCUS
MENU "Old Copper Armor", "Old Copper Plate Mail"
MENU "Old Copper Plate Mail", "(3)"
RESULT 0x1412 color 0x0590 count 1
; крафтим legs (20 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0590 count 20 container ingots FOCUS
MENU "Old Copper Armor", "Old Copper Plate Mail"
MENU "Old Copper Plate Mail", "(4)"
RESULT 0x1411 color 0x0590 count 1
; крафтим arms (18 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0590 count 18 container ingots FOCUS
MENU "Old Copper Armor", "Old Copper Plate Mail"
MENU "Old Copper Plate Mail", "(4)"
RESULT 0x1410 color 0x0590 count 1
; крафтим heater (18 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0590 count 18 container ingots FOCUS
MENU "Old Copper Armor", "Old Copper Shields"
MENU "Old Copper Shields", "(5)"
RESULT 0x1B76 color 0x0590 count 1
NEXTINSTOP
;
; ------------------------ Full Agapite Armor
;
@fullagapitearmor
; сначала мешок
#SKILL tailor
RESOURCE 0x1067 color 0 count 2 container leather FOCUS
MENU "Leather", "Bags for Armors"
MENU "Bags for Armors", "Full set of Agapite armor"
RESULT 0x0E76 color 0x0682 count 1 
; эта команда показывает, что все следующее кладется в мешок выше
NEXTINBEGIN
; крафтим platemail (25 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0682 count 25 container ingots FOCUS
MENU "Agapite Armor", "Agapite Plate Mail"
MENU "Agapite Plate Mail", "(1)"
RESULT 0x1415 color 0x0682 count 1
; крафтим gorget (10 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0682 count 10 container ingots FOCUS
MENU "Agapite Armor", "Agapite Plate Mail"
MENU "Agapite Plate Mail", "(1)"
RESULT 0x1413 color 0x0682 count 1
; крафтим gauntlets (12 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0682 count 12 container ingots FOCUS
MENU "Agapite Armor", "Agapite Plate Mail"
MENU "Agapite Plate Mail", "(2)"
RESULT 0x1414 color 0x0682 count 1
; крафтим helm (15 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0682 count 15 container ingots FOCUS
MENU "Agapite Armor", "Agapite Plate Mail"
MENU "Agapite Plate Mail", "(3)"
RESULT 0x1412 color 0x0682 count 1
; крафтим legs (20 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0682 count 20 container ingots FOCUS
MENU "Agapite Armor", "Agapite Plate Mail"
MENU "Agapite Plate Mail", "(4)"
RESULT 0x1411 color 0x0682 count 1
; крафтим arms (18 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0682 count 18 container ingots FOCUS
MENU "Agapite Armor", "Agapite Plate Mail"
MENU "Agapite Plate Mail", "(4)"
RESULT 0x1410 color 0x0682 count 1
; крафтим heater (18 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x0682 count 18 container ingots FOCUS
MENU "Agapite Armor", "Agapite Shields"
MENU "Agapite Shields", "(5)"
RESULT 0x1B76 color 0x0682 count 1
NEXTINSTOP
;
;
; ------------------------ Full Verite Armor without Shield
;
@fullveritearmor
; сначала мешок
#SKILL tailor
RESOURCE 0x1067 color 0 count 2 container leather FOCUS
MENU "Leather", "Bags for Armors"
MENU "Bags for Armors", "Full set of Verite armor"
RESULT 0x0E76 color 0x07D1 count 1 
; эта команда показывает, что все следующее кладется в мешок выше
NEXTINBEGIN
; крафтим platemail (25 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x07D1 count 25 container ingots FOCUS
MENU "Verite Armor", "Verite Plate Mail"
MENU "Verite Plate Mail", "(1)"
RESULT 0x1415 color 0x07D1 count 1
; крафтим gorget (10 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x07D1 count 10 container ingots FOCUS
MENU "Verite Armor", "Verite Plate Mail"
MENU "Verite Plate Mail", "(1)"
RESULT 0x1413 color 0x07D1 count 1
; крафтим gauntlets (12 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x07D1 count 12 container ingots FOCUS
MENU "Verite Armor", "Verite Plate Mail"
MENU "Verite Plate Mail", "(2)"
RESULT 0x1414 color 0x07D1 count 1
; крафтим helm (15 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x07D1 count 15 container ingots FOCUS
MENU "Verite Armor", "Verite Plate Mail"
MENU "Verite Plate Mail", "(3)"
RESULT 0x1412 color 0x07D1 count 1
; крафтим legs (20 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x07D1 count 20 container ingots FOCUS
MENU "Verite Armor", "Verite Plate Mail"
MENU "Verite Plate Mail", "(4)"
RESULT 0x1411 color 0x07D1 count 1
; крафтим arms (18 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x07D1 count 18 container ingots FOCUS
MENU "Verite Armor", "Verite Plate Mail"
MENU "Verite Plate Mail", "(4)"
RESULT 0x1410 color 0x07D1 count 1
;
; ------------------------ Full Rose Armor
;
@fullrosearmor
; сначала мешок
#SKILL tailor
RESOURCE 0x1067 color 0 count 2 container leather FOCUS
MENU "Leather", "Bags for Armors"
MENU "Bags for Armors", "Full set of Rose armor"
RESULT 0x0E76 color 0x048C count 1 
; эта команда показывает, что все следующее кладется в мешок выше
NEXTINBEGIN
; крафтим platemail (25 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x048C count 25 container ingots FOCUS
MENU "Rose Armor", "Rose Plate Mail"
MENU "Rose Plate Mail", "(1)"
RESULT 0x1415 color 0x048C count 1
; крафтим gorget (10 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x048C count 10 container ingots FOCUS
MENU "Rose Armor", "Rose Plate Mail"
MENU "Rose Plate Mail", "(1)"
RESULT 0x1413 color 0x048C count 1
; крафтим gauntlets (12 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x048C count 12 container ingots FOCUS
MENU "Rose Armor", "Rose Plate Mail"
MENU "Rose Plate Mail", "(2)"
RESULT 0x1414 color 0x048C count 1
; крафтим helm (15 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x048C count 15 container ingots FOCUS
MENU "Rose Armor", "Rose Plate Mail"
MENU "Rose Plate Mail", "(3)"
RESULT 0x1412 color 0x048C count 1
; крафтим legs (20 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x048C count 20 container ingots FOCUS
MENU "Rose Armor", "Rose Plate Mail"
MENU "Rose Plate Mail", "(4)"
RESULT 0x1411 color 0x048C count 1
; крафтим arms (18 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x048C count 18 container ingots FOCUS
MENU "Rose Armor", "Rose Plate Mail"
MENU "Rose Plate Mail", "(4)"
RESULT 0x1410 color 0x048C count 1
; крафтим heater (18 ingots)
#SKILL bs
RESOURCE 0x1BEF color 0x048C count 18 container ingots FOCUS
MENU "Rose Armor", "Rose Shields"
MENU "Rose Shields", "(5)"
RESULT 0x1B76 color 0x048C count 1
NEXTINSTOP
;
@endoffile
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

продолжение скрипта Crafters...

structure_db.txt

Code: Select all

; Строка, начинающаяся с точки с запятой явлеется комментарием и при анализе
; файла игнорируется.
;
; ВНИМАНИЕ! Регистр ключевых слов важен! Соблюдайте его по описанию!
;
@fulldullcopper
; условное имя крафта. Строка должна начинаться с @ и не содержать более 
; одного слова. Это слово - условное название предмета крафта (или набора)
; Все строки после этой до следующей строки с @ или до конца файла считаются
; описанием последовательности крафта этого предмета.
#SKILL tailor
; условное название скилла, используемого при крафте. Возможные варианты:
; tailor, bs, carpent, alchemy, tinker
; возможность комбинировать скиллы для крафта предметов пока не предусмотрена
; (будет сделано в последующих версиях). Пока с команды #SKILL начинается
; блок крафта одного предмета. Если речь идет о крафте набора предметов - 
; команда #SKILL открывает блок крафта одного предмета из набора.
RESOURCE 0x1067 color 0 count 2 container leather
RESOURCE 0x1067 color 0 count 2 container leather FOCUS
; эта строка (или несколько таких строк должна идти непосредственно после
; строки с условным названием скилла. В каждой такой строке описан один
; вид ресурса, необходимого для крафта данного предмета. Структура этой
; строки жесткая: сначала идет ключевое слово RESOURCE, за ним через пробел
; type данного ресурса, потом через пробел ключевое слово color, через пробел
; параметр color (цвет) данного ресурса (если цвет не важен - 0), через
; пробел ключевое слово count, через пробел количество ресурса, необходимое
; для крафта одного экземпляра данного предмета, через пробел ключевое слово
; container, через пробел условное название контейнера, в котором содержится
; данный ресурс. Кроме того, в одной из строк с ресурсами должно быть в конце
; слово FOCUS. Это указание что прицел при крафте направляется на этот
; ресурс (или этот ресурс "используется" при крафте)
; Больше в данной строке никаких символов быть не должно.
; Возможные контейнеры: 'tools', 'colortools', 'blankdeeds', 'leather', 
; 'ingots', 'bricks', 'logs', 'elements', 'regs', 'bottles'
MENU "Leather", "Bags for Armors"
MENU "Bags for Armors", "Full set of Old Copper armor"
MENU "aaaaa", "bbbbbbb"
; Строки MENU (вторая и третья - если два или три уровня 
; меню крафта), указывают на выбор пунктов в меню крафта данного предмета. 
; Выбор пишется в двойных кавычках или просто цифрой без кавычек. 
; Сначала в строке идет название шапки меню, потом через запятую выбор 
; в данном меню. Если пункты выбора в меню имеют одинаковые названия - 
; пользуйтесь порядковыми номерами, записанными в скобках. ВНИМАНИЕ! При
; крафте предмета в пак берется только указанное выше количество ресурса,
; при переписывании пунктов меню делайте также, так как в зависимости от
; количества ресурсов в паке меню крафта видоизменяется.
; Эти строки (MENU) должны идти непосредственно (без учета 
; комментариев) после строк, начинающихся с ключевых слов RESOURCE.
RESULT 0x0E76 color 0x0590 count 1 
; Следующей строкой должна быть строка, начинающаяся с ключевого слова
; RESULT. Эта строка описывает результат крафта предмета (то есть сам 
; предмет). Структура строки жесткая, ключевые слова - по аналогии с 
; с строкой RESOURCE.
;
; При крафте наборов могут дополнительно использоваться две команды:
;
NEXTINBEGIN
; Следует непосредственно за строкой RESULT, в которой описан какой-либо
; контейнер (ящик, пак, мешок). Данная команда переназначает приемный
; контейнер для последующего крафта данного набора в этот контейнер.
; Если данной команды в базе данных нет - предмет сразу после крафта
; будет переложен в сундук для готовой продукции. Если данная команда
; встретилась - все предметы из данного набора, описания крафта которых
; следуют далее будут после крафта складываться в данный контейнер.
NEXTINSTOP
; Данная команда заканчивает действие предыдущей. Сразу после нее
; контейнер, в который складывался крафт, будет переложен в сундук
; для готовой продукции. Строка может идти только сразу после строки
; Result
;
; Пока больше возможных команд нет.
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

А вот и сам скрипт Crafters...

Crafters.sc

Code: Select all

#===================================================================#
# CRAFTERS. Craft from list.                                        #
#===================================================================#
#   v.1.04b (c) Edred                                               #
#===================================================================#
;
; Крафтим все что можно в заказанных количествах (включая наборы),
; складываем скрафченное в спецконтейнер. Список крафта содержится
; в файле crafters.go, база данных по крафту - в файле crafters.db.
; Чар на скрипте сам берет необходимые ресурсы и инструменты из
; сундуков и ящиков и мешков в этих сундуках. 
; Структура склада ресурсов и инструмента прописана через массив
; и в дальнейшем будет вынесена в файл.
; В структуре крафта предусмотрена возможность крафта контейнеров,
; в которые складываются остальные части крафта данного набора.
; База данных и список крафта - текстовые файлы. Список крафта
; представляет из себя перечень условных названий предметов (наборов)
; крафта и необходимых к крафту количеств:
; ...
; fulloldcopper 5
; fullrose 3
; fullsilver 6
; cleaver 10
; ...
; Файл базы данных представляет из себя описание крафта каждого
; возможного предмета или набора, структуированное по условным
; названиям крафтов. Описание крафта производится на специальном
; языке. Возможные команды этого языка (строки, начинающиеся
; с точки с запятой считаются комментариями и игнорируются) приведены
; в файле structure.db
;
; v.1.00b - пока без наборов. Простой крафт. Пишем и тестим.
;           пока только 1 скилл - бс.
;           Эта версия очень тупая - при физле сбрасывает меню и
;           снова его грузит - сделать в дальнейшем при физле только 
;           добор ресурсов если будет заметна потеря времени.
; v.1.01b - сделан сброс скрафченного в приемный контейнер. Пока только
;           в сундук, но сразу сделано через глобалку, чтобы легко
;           было переназначать.
; v.1.02b - делаем тейлор. Зодно делаем возможность брать 1 шт. ресурса из
;           неподъемной кучки.
; v.1.03b - добавляем наборы. То есть команды NEXTINBEGIN и NEXTINSTOP
; v.1.04b - добавляем скиллы tinker, carpentry, alchemy
;
; TO DO:    1. Морф перед крафтом, еда, подхилл чара (через команду в базе)
;           2. Отмена морфа (через команду в базе)
;           3. Возможность взять несколько некучкующихся штук ресурса
;           4. Контроль за кол-вом предметов в паке, возможность работы
;              с мешками с некучкующимися ресурсами (например сено)
;           5. Взятие из банка артефакта и использование его при крафте
;              в случае тейлора - надевание на себя)
;           6. Выкладывание инструментов обратно
;           7. Возможность крафта вне АМЗ (то есть процедурой добор регов,
;              реколл в реколл-зону, крафт и возврат обратно пешком
;              по узловым точкам. При этом крафтить сразу все необходимое
;              количество!
;           8. скиллы инскрипт, боукрафт
;           9. Перекладывание скрафченных предметов в контейнеры ресурсов
;              (сложный крафт)
;
sub Crafters()
	UO.SetGlobal( 'otladka', '0' )
	VAR mypath = "C:\Games\Injection\scripts\Crafters\"
	VAR DBFile = 'crafters.db'
	VAR GOFile = 'crafters.go'
	VAR Go1, What, HowMuch, HowInt, i, rez = 1
	; Читаем файл что надо крафтить
	DBFile = mypath + DBFile
	GOFile = mypath + GOFile
	VAR f = File( GOFile )
	UO.SetGlobal( 'ContForResult', '' )
	UO.SetGlobal( 'LastResult', '' )
	UO.TextOpen()
	UO.TextClear()
	If NOT F.Open() Then
		UO.Print( 'File carfters.go not found!' )
	Endif
	tm(1)
	Repeat 
		tm(2)
		Go1 = Safecall F.ReadLn()
		If F.Eof() OR fatal error Then
			F.Close()
			return
		Endif
		tm(3)
		While left( Go1, 1 ) == ';'
			; комментарий
			Go1 = Safecall F.ReadLn()
			If F.Eof() OR fatal error Then
				F.Close()
				return
			Endif
		Wend
		tm(4)
		What = GetWord( Go1, 1 )
		If What == '' Then
			F.Close()
			Return
		Endif
		HowMuch = GetWord( Go1, 2 )
		If HowMuch == '' Then
			HowInt = 1
		Else
			HowInt = val( HowMuch )
		Endif
		tm(5)
		For i = 1 To HowInt
			tm(6)
			rez = CraftItem( What, DBFile )
			tm(7)
			If rez == 0 Then
				F.Close()
				return
			Endif
		Next
		tm(8)
	until F.Eof() OR fatal error
	tm(9)
	F.Close()
	return
endsub
;
Sub GetWord( st, nom )
; Возвращает слово из строки str за номером num
; если такого слова нет - возвращаем ''
;
; Разделителем слов считаем пробел. Несколько пробелов подряд считаются за один.
; Функция сделана без рекурсии специально для считывания слов из сверхдлинных строк!
;
	VAR tmpst
	VAR i, dlin, kol, start
	dlin = len( st )
	kol = 0
	start = 0
	For i=0 To dlin - 1
		If mid( st, i, 1 ) == ' ' OR i == dlin - 1 Then
			kol = kol + 1
			If kol == nom Then
				; это первый пробел после нужного нам слова
				tmpst = mid( st, start, i - start )
				return tmpst
			Else
				While mid( st, i, 1 ) == ' '
					i = i + 1
				Wend
				If kol == nom - 1 Then
					start = i
				Endif
			Endif
		Endif
	Next
	tmpst = ''
	return tmpst
endsub 
;
Sub FindSymb( symb, st )  
; найти первое вхождение символа в строке. Не найдено - вернем 0
	VAR dlin = len( st ) - 1
	VAR i
	For i = 0 To dlin
		If st[i] == symb Then
			return i + 1
		endif
	Next
	i = 0
	return i
endsub
;
Sub GetQuote( st, num )
; Вырезает и возвращает num-подстроку строки st, ограниченную с обоих 
; сторон кавычками без самих кавычек. Возвращаем пустую строку если ошибка
	VAR s = 0, i = 0, rt = ''
	VAR quot = '"'
	s = FindSymb( quot, st )
	If s > 0 Then
		i = i + 1
		st = right( st, len(st) - s )
		s = FindSymb( quot, st )
		If s == 0 Then
			return ''
		Endif
		If i == num	Then
			; нашли начало нужной строки
			st = left( st, s - 1 )
			return st
		Else
			st = right( st, len(st) - s )
			rt = GetQuote( st, num - 1 )
			If rt == '' Then
				return ''
			Else
				return rt
			Endif
		Endif
	Endif
	return ''
endsub

Sub CraftItem( nam, DBFile )
; Скрафтить итем или набор, описанный в nam
; возвращаем 1 если успех, 0 - если кранты
;
; Ошибки: 001 - вместо строки SKILL идет конец файла
;         002 - отсутствие в нужном разделе базы данных строки SKILL
;         003 - вместо строки RESOURCE идет конец файла
;         004 - отсутствие в нужном разделе базы данных строки RESOURCE
;         005 - сразу после строки RESOURCE идет конец файла
;         006 - более 10 ресурсных строк
;         007 - отсутствие в нужном разделе базы данных строки MENU
;         008 - сразу после строки MENU идет конец файла
;         009 - более 3 строк меню
;         010 - отсутствие в нужном разделе базы данных строки RESULT
;     011-013 - ошибки распознавания строки ресурсов
;     014-017 - ошибки проверки параметров ресурсов
;     018-021 - ошибки взятия ресурсов
;         022 - неправильное название контейнера с ресурсом
;         023 - ошибка чтения названия скилла в массиве инструментов
;         024 - ошибка считывания фокуса
;         025 - отсутствие ресурса в паке при крафте (ошибка фокуса)
;         026 - ошибка чтения параметров меню из базы
;
 	VAR str1, str2, flag = 0, str5, tmpstr, tmpstr2, vendcont
	VAR skill, result, packbegin, packend, i, cyclflag
	VAR F2 = File( DBFile )
	DIM res[11]				; массив для записи ресурсных строк
	DIM menuhi[7]				; массив для уровней меню (3 уровня)
	If NOT F2.Open() Then
		UO.Print( 'File carfters.db not found!' )
	Endif
	; откроем на экране и назначим переменную для приемного контейнера
	; (по умолчанию - vendcont)
	vendcont = OpenContainer( 'vendor' )
	If vendcont == '0' Then
		UO.Print( 'Containers for result of crafts not found!' )
		return 0
	Endif
	tm(10)
	Repeat 
		str1 = Safecall F2.ReadLn()
		If left( str1, 1 ) == '@' Then
			str1 = right( str1, len( str1 ) - 1 )
			str1 = GetWord( str1, 1 )
			If str1 == nam Then
				tm(11)
				; Нашли нужную нам секцию
				flag = 1
				str1 = Safecall F2.ReadLn()
				repeat
					;
					; SKILL
					; --------------------------------------
					; строка записывается в переменную skill
					;
					If F2.Eof() OR fatal error Then
						UO.Print( 'Error of reading database. N 001' )
						F2.Close()
						return 0
					Endif
					# ----- Проверка на комментарий
					While left( str1, 1 ) == ';'
						; комментарий
						str1 = Safecall F2.ReadLn()
						If F2.Eof() OR fatal error Then
							UO.Print( 'Error of reading database. N 001' )
							F2.Close()
							return 0
						Endif
					Wend
					# -----
					str2 = GetWord( str1, 1 )
					If str2 <> '#SKILL' Then
						UO.Print( 'Error of reading database. N 002' )
						F2.Close()
						return 0
					Endif
					skill = GetWord( str1, 2 )
					tm(12)
					;
					; RESOURCE
					; --------------------------------------
					; строки записывается в массив res начиная с 1 до 10,
					; ненужные строки и нулевая - пустые.
					;
					cyclflag = 0
					ClearMassiv( res, 10 )			; очистим массив
					i = 1
					str1 = Safecall F2.ReadLn()
					If F2.Eof() OR fatal error Then
						UO.Print( 'Error of reading database. N 003' )
						F2.Close()
						return 0
					Endif
					# ----- Проверка на комментарий
					While left( str1, 1 ) == ';'
						; комментарий
						str1 = Safecall F2.ReadLn()
						If F2.Eof() OR fatal error Then
							UO.Print( 'Error of reading database. N 003' )
							F2.Close()
							return 0
						Endif
					Wend
					# -----
					str2 = GetWord( str1, 1 )
					If str2 <> 'RESOURCE' Then
						UO.Print( 'Error of reading database. N 004' )
						F2.Close()
						return 0
					Endif
					tm(13)
					repeat
						; цикл чтения ресурсов
						res[i] = str1
						i = i + 1
						str1 = Safecall F2.ReadLn()
						If F2.Eof() OR fatal error Then
							UO.Print( 'Error of reading database. N 005' )
							F2.Close()
							return 0
						Endif
						# ----- Проверка на комментарий
						While left( str1, 1 ) == ';'
							; комментарий
							str1 = Safecall F2.ReadLn()
							If F2.Eof() OR fatal error Then
								UO.Print( 'Error of reading database. N 005' )
								F2.Close()
								return 0
							Endif
						Wend
						# -----
						str2 = GetWord( str1, 1 )
						If str2 <> 'RESOURCE' Then
							; строки ресурсов кончились
							cyclflag = 1
						Else
							If i > 10 Then
								; ресурсных строк больше 10
								UO.Print( 'Error of reading database. N 006' )
								F2.Close()
								return 0
							Endif
						Endif
					until cyclflag
					tm(14)
					;
					; MENU
					; --------------------------------------
					; выбор записывается в массив menuhi
					;
					cyclflag = 0
					ClearMassiv( menuhi, 6 )			; очистим массив
					i = 1
					# ----- Проверка на комментарий
					While left( str1, 1 ) == ';'
						; комментарий
						str1 = Safecall F2.ReadLn()
						If F2.Eof() OR fatal error Then
							UO.Print( 'Error of reading database. N 005' )
							F2.Close()
							return 0
						Endif
					Wend
					# -----
					tm(15)
					str2 = GetWord( str1, 1 )
					If str2 <> 'MENU' Then
						UO.Print( 'Error of reading database. N 007' )
						F2.Close()
						return 0
					Endif
					repeat
						; цикл чтения меню
						tmpstr = right( str1, len(str1) - 5 )
						menuhi[i] = GetQuote( tmpstr, 1 )
						i = i + 1
						menuhi[i] = GetQuote( tmpstr, 2 )
						i = i + 1
						str1 = Safecall F2.ReadLn()
						If F2.Eof() OR fatal error Then
							UO.Print( 'Error of reading database. N 008' )
							F2.Close()
							return 0
						Endif
						# ----- Проверка на комментарий
						While left( str1, 1 ) == ';'
							; комментарий
							str1 = Safecall F2.ReadLn()
							If F2.Eof() OR fatal error Then
								UO.Print( 'Error of reading database. N 008' )
								F2.Close()
								return 0
							Endif
						Wend
						# -----
						str2 = GetWord( str1, 1 )
						If str2 <> 'MENU' Then
							; строки ресурсов кончились
							cyclflag = 1
						Else
							If i > 7 Then
								; строк меню больше 3
								UO.Print( 'Error of reading database. N 009' )
								F2.Close()
								return 0
							Endif
						Endif
					until cyclflag
					tm(16)
					;
					; RESULT
					; --------------------------------------
					; строка записывается в переменную result
					;
					# ----- Проверка на комментарий
					While left( str1, 1 ) == ';'
						; комментарий
						str1 = Safecall F2.ReadLn()
						If F2.Eof() OR fatal error Then
							UO.Print( 'Error of reading database. N 008' )
							F2.Close()
							return 0
						Endif
					Wend
					# -----
					str2 = GetWord( str1, 1 )
					If str2 <> 'RESULT' Then
						UO.Print( 'Error of reading database. N 010' )
						F2.Close()
						return 0
					Endif
					result = GetWord( str1, 2 ) + ' ' + GetWord( str1, 4 ) + ' ' + GetWord( str1, 6 ) + ' '
					tm(17)
					;
					;============================================
					; Крафтим конкретную описанную вещь
					;
					If NOT CraftOfIt( skill, result, res, menuhi ) Then
						tm(18)
						F2.Close()
						return 0
					Endif
					;
					;============================================
					;
					str1 = Safecall F2.ReadLn()
					# ----- Проверка на комментарий
					While left( str1, 1 ) == ';'
						; комментарий
						str1 = Safecall F2.ReadLn()
						If F2.Eof() OR fatal error Then
							F2.Close()
							return 999
						Endif
					Wend
					# -----
					str2 = GetWord( str1, 1 )
					If str2 == 'NEXTINBEGIN' OR str2 == 'NEXTINSTOP' Then
						tm(990)
						;
						; NEXTINBEGIN или NEXTINSTOP
						;
						If str2 == 'NEXTINBEGIN' Then
							tm(991)
							If UO.GetGlobal( 'LastResult' ) <> '' Then
								; если глобалка пустая - переназначать не на что
								UO.SetGlobal( 'ContForResult', UO.GetGlobal( 'LastResult' ) )
							Endif
						Else
							tm(992)
							vendcont = OpenContainer( 'vendor' )
						Endif
						;
						str1 = Safecall F2.ReadLn()
						# ----- Проверка на комментарий
						While left( str1, 1 ) == ';'
							; комментарий
							str1 = Safecall F2.ReadLn()
							If F2.Eof() OR fatal error Then
								F2.Close()
								return 999
							Endif
						Wend						
					Endif
					If left( str1, 1 ) == '@' Then
						flag = 0
					Endif
                until flag == 0
				F2.Close()
				return 1
			Endif
		Endif
	until F2.Eof() OR fatal error
	UO.Print( 'Your keyword not found in database!' )
	F2.Close()
	return 0
endsub
;
Sub ClearMassiv( res, mx )
	VAR i
	For i = 0 To mx
		res[i] = ''
	Next
endsub
;
Sub CraftOfIt( skill, result, res, menuhi )
; В этих двух переменных и 2 массивах все что нам нужно для крафта одной
; конкретной вещи. Это эта фунция и делает. С взятием ресурсов, инструментов
; и учетом физлов.
;
	VAR maxres = 10
	VAR maxmenuhi = 6
	VAR i, success, focus, j = 0, tmpres
	;
	tm(20)
	success = 0
	; проверим массив меню
	for i = 1 To maxmenuhi
		If menuhi[i] == '' Then
			tm(21)
			j = i
			i = maxmenuhi
		Endif
	Next
	tm(22)
	If j <> 0 Then
		If j == 5 Then
			; 2 уровня меню
			maxmenuhi = 4
			tm(23)
		Else
			If j == 3 Then
				; 1 уровень меню
				maxmenuhi = 2
				tm(24)
			Else
				UO.Print( 'Error of reading database. N 026' )
				tm(25)
				return 0
			Endif
		Endif
	Endif
	; здесь надо бы вставить проверочку переменной result, она должна
	; быть вида '0x1414 0x0590 1', где первое число - тип, второе - цвет,
	; третье - кол-во
	;
	; СДЕЛАТЬ В СЛЕД ВЕРСИИ!!!!!
	;
	tm(26)
	repeat
		For i = 1 To maxres
			tm(27)
			if res[i] <> '' then
				tm(28)
				tmpres = res[i]
				If NOT GetResource( tmpres ) Then		; взять в пак ресурс
					Return 0
				Endif
			Endif
		Next
		tm(29)
		If GetInstrument( skill ) == 0 Then
			return  0
		Endif
		tm(30)
		focus = ReadFocus( res, maxres )			; на что прицел
		tm(31)
	    If skill == 'tailor' Then
			success = MakeTailor( menuhi, maxmenuhi, focus, result )
			tm(32)
		Endif
		tm(33)
	    If skill == 'bs' Then
			success = MakeBS( menuhi, maxmenuhi, focus, result )
			tm(34)
		Endif
	    If skill == 'carpent' Then
			success = MakeCarpent( menuhi, maxmenuhi, focus, result )
		Endif
	    If skill == 'alchemy' Then
			success = MakeAlchemy( menuhi, maxmenuhi, focus, result )
		Endif
	    If skill == 'tinker' Then
			success = MakeTinker( menuhi, maxmenuhi, focus, result )
		Endif
		If Success == 999 Then
			return 0 
		Endif
	until success <> 0
	; Перекладываем эту вещь (result) из пака в приемный контейнер	
	;
	; ПОКА СЧИТАЕМ КОЛ-ВО КАК 1
	;
	UO.FindType( GetWord(result, 1), GetWord(result, 2) )
	If UO.FindCount() == 0 Then
		; эх, что-то не то в датском королевстве... Ведь успешно скрафтили, а вещи нету!
		UO.Print( 'Error of script! Unknown type of result!' )
		return 0
	Else
		; На всяк случай запомним серийник последнего скрафченного предмета...
		; запомним в глобальной переменной. Потому что вдруг он будет объявлен приемным
		; контейнером в дальнейшем...
		UO.SetGlobal( 'LastResult', UO.GetSerial( 'finditem' ) )
		UO.MoveItem( 'finditem', 0, UO.GetGlobal( 'ContForResult' ) )
		wait(1000)
		CheckLag()
	Endif
	return 1
endsub
;
Sub GetResource( str1 )
;
; Берем ресурсы по строке (точнее проверяем и добираем)
; Возвращаем 1, если взяли, 0, если ошибка
;
; RESOURCE 0x1067 color 0 count 2 container leather
; RESOURCE 0x1067 color 0 count 2 container leather FOCUS
	VAR typ, col, cnt, cont, tmp, tmplen, cntval, tmplen2
	typ = GetWord( str1, 2 )
	tmp = GetWord( str1, 3 )
	tm(100)
	If tmp <> 'color' Then
		UO.Print( 'Error of reading database. N 011' )
		return 0
	Endif
	col = GetWord( str1, 4 )
	tmp = GetWord( str1, 5 )
	tm(101)
	If tmp <> 'count' Then
		UO.Print( 'Error of reading database. N 012' )
		return 0
	Endif
	cnt = GetWord( str1, 6 )
	tmp = GetWord( str1, 7 )
	If tmp <> 'container' Then
		UO.Print( 'Error of reading database. N 013' )
		return 0
	Endif
	cont = GetWord( str1, 8 )
	tm(102)
	; проверим "правильность" переменных
	tmplen = len( typ )
	If tmplen < 6 OR tmplen > 6 Then
		UO.Print( 'Error of reading database. N 014' )
		return 0
	Endif
	tm(103)
	tmplen = len( cnt )
	If tmplen < 1 OR tmplen > 4 Then
		UO.Print( 'Error of reading database. N 015' )
		return 0
	Endif
	tm(104)
	tmplen = len( cont )
	If tmplen == 0 OR cont == 'FOCUS' Then
 		UO.Print( 'Error of reading database. N 016' )
		return 0
	Endif
	tm(105)
	cntval = val( cnt )
	If cntval == 0 Then
 		UO.Print( 'Error of reading database. N 017' )
		return 0
	Endif
	tm(106)
	; Работаем
	If col <> '0' Then
		tm(1071)
		tmplen2 = UO.Count( typ, col )
		If tmplen2 < cntval Then
			tm(1072)
			tmplen = cntval - tmplen2
			cont = OpenContainer( cont )
			If cont == '0' Then
				return 0
			Endif
			UO.FindType( typ, col, cont )
			If UO.FindCount() == 0 Then
 				UO.Print( 'Error of reading database. N 018' )
				return 0
			Else
				If UO.GetQuantity( 'finditem' ) < tmplen Then
 					UO.Print( 'Error of reading database. N 019' )
					return 0
				Endif
			Endif
			; ================================
			; Здесь надо вставить защиту от попыток перетащить 1 шт. из очень
			; тяжелой кучки!!!
			;
			If tmplen > 1 Then
				UO.Grab( str(tmplen), 'finditem' )
			Else
				UO.Grab( '3', 'finditem' )
				repeat
					wait(100)
				until UO.Count( typ, col ) == tmplen2 + 3
				CheckLag()
				UO.FindType( typ, col )
				UO.MoveItem( 'finditem', '2', cont )
				repeat
					wait(100)
				until UO.Count( typ, col ) == cntval
			Endif
		Endif
	Else
		tm(1072)
		tmplen2 = UO.Count( typ )
		If  tmplen2 < cntval Then
			tmplen = cntval - tmplen2
			cont = OpenContainer( cont )
			UO.FindType( typ, -1, cont )
			If UO.FindCount() == 0 Then
 				UO.Print( 'Error of reading database. N 020' )
				return 0
			Else
				If UO.GetQuantity( 'finditem' ) < tmplen Then
 					UO.Print( 'Error of reading database. N 021' )
					return 0
				Endif
			Endif
			; ================================
			; Здесь надо вставить защиту от попыток перетащить 1 шт. из очень
			; тяжелой кучки!!!
			;
			If tmplen > 1 Then
				UO.Grab( str(tmplen), 'finditem' )
			Else
				UO.Grab( '3', 'finditem' )
				repeat
					wait(100)
				until UO.Count( typ ) == tmplen2 + 3
				CheckLag()
				UO.FindType( typ )
				UO.MoveItem( 'finditem', '2', cont )
				repeat
					wait(100)
				until UO.Count( typ ) == cntval
			Endif
		Endif
	Endif
	return 1
endsub
;
Sub OpenContainer( cont )
;
; Получаем условное название контейнера, открываем его на экране,
; возвращаем его сериал
;
; Структура простая: есть сундук commonbox, в котором куча всяких
; ящичков, боксов, паков, мешков с ресурсами и один из них с инструментом
;
	VAR commonbox = '0x40069CB2'	; Сундук с ящиками и паками с ресурсами
	DIM boxes[11]
	boxes[0]  = 'tools 0x404300A0 '
	boxes[1]  = 'colortools 0x40246639 '
	boxes[2]  = 'blankdeeds 0x4042FB6D '
	boxes[3]  = 'leather 0x404325E6 '
	boxes[4]  = 'ingots 0x404327A2 '
	boxes[5]  = 'bricks 0x401A1AB7 '
	boxes[6]  = 'logs 0x402CE89F '
	boxes[7]  = 'elements 0x4042F09C '
	boxes[8]  = 'regs 0x40430813 '
	boxes[9]  = 'bottles 0x403C91EF '
	boxes[10] = 'vendor 0x4008EE64 '
	VAR box = '', i, tmp

	For i = 0 To 10
		tmp = GetWord( boxes[i], 1 )
		If tmp == cont Then
			box = GetWord( boxes[i], 2 )
		Endif
	Next
	If box == '' Then
		UO.Print( 'Error of reading database. N 022: ' + cont )
		return '0'
	Endif
	UO.UseObject( commonbox )
	wait(1000)
	CheckLag()
	UO.UseObject( box )
	wait(1000)
	CheckLag()
	If cont == 'vendor' Then
		UO.SetGlobal( 'ContForResult', box )
	Endif
	return box
endsub
;
Sub GetInstrument( skill )
;
; Берем нужный инструмент. Пока сделан только один вариант инструмента
; для каждого скилла. Также не сделан цветной инструмент
;
	DIM instr[5]
	instr[0] = 'tailor 0x0F9D '
	instr[1] = 'bs 0x13E3 '
	instr[2] = 'carpent 0x1030 '
	instr[3] = 'alchemy 0x0E9B '
	instr[4] = 'tinker 0x1EBC '
	VAR sunduk = OpenContainer( 'tools' )
	VAR i, typ = '', tmp

	For i = 0 To 4
		tmp = GetWord( instr[i], 1 )
		If tmp == skill Then
			typ = GetWord( instr[i], 2 )
		Endif
	Next
	If typ == '' Then
		UO.Print( 'Error of reading database. N 023: ' + skill )
		return 0
	Endif
	If UO.Count( typ ) > 0 Then
		; в паке или руках есть такой инструмент
		return 1
	Else
		UO.FindType( typ, -1, sunduk )
		If UO.FindCount() == 0 Then
			UO.Print( 'I cannot find the instrument... type = ' + typ )
			return 0
		Endif
		UO.Grab( '0', 'finditem' )
		wait(1000)
		CheckLag()
	Endif
	return 1
endsub
;
Sub ReadFocus( res, razmer )
;
; Считываем из массива ресурсов на каком типе ресурсов фокус
;
; RESOURCE 0x1067 color 0 count 2 container leather
; RESOURCE 0x1067 color 0 count 2 container leather FOCUS
	VAR i, tmpword = '', tmpfocus = ''

	For i = 1 To razmer
		If res[i] <> '' Then
			tmpword = GetWord( res[i], 9 )
			If tmpword == 'FOCUS' Then
				tmpfocus = GetWord( res[i], 2 ) + ' ' + GetWord( res[i], 4 ) + ' '
			Endif
		Endif
	Next
	If tmpfocus == '' Then
		UO.Print( 'Error of reading database. N 024' )
		return 0
	Endif
	;
	; Вернем ресурс на котором фокус. Это описание вида:
	; '0x1067 0x0000 ', где первое число - тип, второе - цвет
	;
	return tmpfocus
endsub
;
Sub CheckInstrum( lay, typ )
;
; Убедимся что на указанном слое есть такой тип, если нет - найдем в паке
; (точно есть) и возьмем на указанный слой
;
	If UO.GetGraphic( UO.ObjAtLayer( lay ) ) <> typ Then
		UO.UnEquip( lay )
		wait(1000)
		CheckLag()
		UO.Equipt( lay, typ )
		repeat
			wait(100)
		until UO.GetGraphic( UO.ObjAtLayer( lay ) ) == typ
	Endif
endsub
;
Sub MakeBS( menuhi, razmer, focus, result )
;
; Крафтим вещь указанным скиллом. Необходимые ресурсы в паке, инструмент 
; там же. Если успешно - возвращаем 1, если физл - 0
;
	VAR success = 'You put'
	VAR fizzle = 'You have failed'
	VAR instrum = '0x13E3'
	VAR i, k, tmpmenu
	; при БС берем в руки инструмент, потом дважды щелкаем (используем)
	; металл (фокус)
	CheckInstrum( 'Rhand', instrum )
	DeleteJournal( success )
	DeleteJournal( fizzle )
	UO.CancelMenu()
	If razmer == 2 Then
		UO.WaitMenu( menuhi[1], menuhi[2] )
	Else
		If razmer == 4 Then
			UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4] )
		Else
			UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4], menuhi[5], menuhi[6] )
		Endif
	Endif

	If GetWord( focus, 2 ) == '0' Then
		UO.FindType( GetWord( focus, 1 ) )
	Else
		UO.FindType( GetWord( focus, 1 ), GetWord( focus, 2 ) )
	Endif
	If UO.FindCount() == 0 Then
		UO.CancelMenu()
		UO.Print( 'Error of crafting. N 025' )
		return 999
	Endif
	UO.UseObject( 'finditem' )
	k = 1
	repeat
		wait(100)
		k = k + 1
	until UO.InJournal( success ) OR UO.InJournal( fizzle ) OR k > 600
;	UO.CancelMenu()
	If UO.InJournal( success ) Then
		return 1
	Endif
	return 0
endsub
;
Sub MakeTailor( menuhi, razmer, focus, result )
;
; Крафтим вещь указанным скиллом. Необходимые ресурсы в паке, инструмент 
; там же. Если успешно - возвращаем 1, если физл - 0
;
	VAR success = 'You put'
	VAR fizzle = 'fail'
	VAR instrum = '0x0F9D'
	VAR i, k, tmpmenu
	; при тейлоре дважды щелкаем (используем) инструмент в паке и 
	; на кожу (фокус)
	DeleteJournal( success )
	DeleteJournal( fizzle )
	UO.CancelMenu()
	If razmer == 2 Then
		UO.WaitMenu( menuhi[1], menuhi[2] )
	Else
		If razmer == 4 Then
			UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4] )
		Else
			UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4], menuhi[5], menuhi[6] )
		Endif
	Endif
	If GetWord( focus, 2 ) == '0' Then
		UO.FindType( GetWord( focus, 1 ) )
	Else
		UO.FindType( GetWord( focus, 1 ), GetWord( focus, 2 ) )
	Endif
	If UO.FindCount() == 0 Then
		UO.CancelMenu()
		UO.Print( 'Error of crafting. N 025' )
		return 999
	Endif
	UO.WaitTargetObject( 'finditem' )
	UO.UseType( instrum )
	k = 1
	repeat
		wait(100)
		k = k + 1
	until UO.InJournal( success ) OR UO.InJournal( fizzle ) OR k > 600
;	UO.CancelMenu()
	If UO.InJournal( success ) Then
		return 1
	Endif
	return 0
endsub
;
Sub MakeCarpent( menuhi, razmer, focus, result )
;
; Крафтим вещь указанным скиллом. Необходимые ресурсы в паке, инструмент 
; там же. Если успешно - возвращаем 1, если физл - 0
;
	VAR success = 'You put'
	VAR fizzle = 'fail'
	VAR instrum = '0x1030'
	VAR i, k, tmpmenu
	; при карпентри дважды щелкаем (используем) инструмент в паке 
	DeleteJournal( success )
	DeleteJournal( fizzle )
	UO.CancelMenu()
	If razmer == 2 Then
		UO.WaitMenu( menuhi[1], menuhi[2] )
	Else
		If razmer == 4 Then
			UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4] )
		Else
			UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4], menuhi[5], menuhi[6] )
		Endif
	Endif
	UO.UseType( instrum )
	k = 1
	repeat
		wait(100)
		k = k + 1
	until UO.InJournal( success ) OR UO.InJournal( fizzle ) OR k > 600
;	UO.CancelMenu()
	If UO.InJournal( success ) Then
		return 1
	Endif
	return 0
endsub
;
Sub MakeAlchemy( menuhi, razmer, focus, result )
;
; Крафтим вещь указанным скиллом. Необходимые ресурсы в паке, инструмент 
; там же. Если успешно - возвращаем 1, если физл - 0
;
	VAR success = 'You put'
	VAR fizzle = 'fail'
	VAR i, k, tmpmenu
	; при алхимии дважды щелкаем (используем) ресурс фокуса 
	DeleteJournal( success )
	DeleteJournal( fizzle )
	UO.CancelMenu()
	If razmer == 2 Then
		UO.WaitMenu( menuhi[1], menuhi[2] )
	Else
		If razmer == 4 Then
			UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4] )
		Else
			UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4], menuhi[5], menuhi[6] )
		Endif
	Endif
	If GetWord( focus, 2 ) == '0' Then
		UO.FindType( GetWord( focus, 1 ) )
	Else
		UO.FindType( GetWord( focus, 1 ), GetWord( focus, 2 ) )
	Endif
	If UO.FindCount() == 0 Then
		UO.CancelMenu()
		UO.Print( 'Error of crafting. N 025' )
		return 999
	Endif
	UO.UseObject( 'finditem' )
	k = 1
	repeat
		wait(100)
		k = k + 1
	until UO.InJournal( success ) OR UO.InJournal( fizzle ) OR k > 600
;	UO.CancelMenu()
	If UO.InJournal( success ) Then
		return 1
	Endif
	return 0
endsub
;
Sub MakeTinker( menuhi, razmer, focus, result )
;
; Крафтим вещь указанным скиллом. Необходимые ресурсы в паке, инструмент 
; там же. Если успешно - возвращаем 1, если физл - 0
;
	VAR success = 'You put'
	VAR fizzle = 'fail'
	VAR instrum = '0x1EBC'
	VAR i, k, tmpmenu
	; при тинкере дважды щелкаем (используем) инструмент в паке 
	DeleteJournal( success )
	DeleteJournal( fizzle )
	UO.CancelMenu()
	If razmer == 2 Then
		UO.WaitMenu( menuhi[1], menuhi[2] )
	Else
		If razmer == 4 Then
			UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4] )
		Else
			UO.WaitMenu( menuhi[1], menuhi[2], menuhi[3], menuhi[4], menuhi[5], menuhi[6] )
		Endif
	Endif
	UO.UseType( instrum )
	k = 1
	repeat
		wait(100)
		k = k + 1
	until UO.InJournal( success ) OR UO.InJournal( fizzle ) OR k > 600
;	UO.CancelMenu()
	If UO.InJournal( success ) Then
		return 1
	Endif
	return 0
endsub

#####################################################################
Sub CheckLag()
	DeleteJournal( 'backpack' )
	UO.Click( 'backpack' )
	repeat
		wait(100)
	until UO.InJournal( 'backpack' )
	return
end sub

#####################################################################
Sub DeleteJournal( string1 )
	VAR nom = UO.InJournal( string1 )
	If nom > 0 Then
		UO.SetJournalLine( Nom - 1, 'string replaced' )
		DeleteJournal( string1 )
	Endif
endsub

#####################################################################
Sub tm( nom1 )
	If UO.GetGlobal( 'otladka' ) == '1' Then
		UO.TextPrint( 'TEST. Step number ' + str( nom1 ) )
	Endif
endsub
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

ЗЫ: В последнем скрипте планировалось, как помнится, перевести список на менюшку в дельфи, саму менюшку сделал, но не подключил к скрипту...

Продолжение следует, еще много скриптов, но не счас, устал малость... :oops:
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

AutoJail.sc

Code: Select all

#####################################################################
; Скрипт на автособирание навоза на конюшне. Скрипт работает по маршруту,
; прописываемому в строковую переменную JailPatch.
; В этой строке перечисляются через пробел координаты точек, в которые
; чар должен приходить, а также ставятся команды OPEN, GET, END, WAIT.
; Команда OPEN открывает ближайшую к чару дверь, команда GET ищет в радиусе
; двух клеток от чара навоз и "берет" его. При этом проверяется, может
; ли чар взять его. Если нет - поиск повторяется. Если навоз отсутствует -
; чар ждет его появления. Команда END ставится в конце маршрута, это сигнал
; скрипту переходить к началу маршрута. Команда WAIT означает что надо подождать
; 60 сек. прежде чем продолжать (не заставляйте чара долго ждать респауна
; внутри отсека, если дверь закроется - чар не выйдет из отсека и скрипт
; собъется. Помните, это лишь самая первая и простая версия этого скрипта).
; Поэтому в конце маршрута перед командой END задайте несколькими командами
; WAIT приблизительную необходимую паузу на респаун навоза. Я не задаю точных
; величин, так как скрипт предусматривает ваш собственный маршрут, который
; необязательно должен включать в себя все отсеки (если вы в джайле не один,
; вы можете разделить ее между собой). Также рекомендую заносить в маршрут
; "узловые точки", например, точку выхода из крайних отсеков.
;
; Ходилка в скрипте используется простейшая, без обхода препятствий. Так что
; если чар упирается - добавляйте в маршрут промежуточную точку.
; На самом деле - скрипт простейший, собран из кирпичиков, все они
; есть на форуме. Не понимаю, чего народ парится...
;
; ВНИМАНИЕ! В скрипте нет проверок "на дурака" от неправильного написания
; маршрута. Все последствия - на вашей совести.
;
; В качестве примера в скрипте прописан маршрут по верхнему левому ряду конюшни.
;
; v.1.00b (c) Edred
;
sub AutoJail()
	VAR JailPatch = '1293 1767 OPEN 1291 1767 GET 1293 1770 OPEN 1291 1770 GET 1293 1773 OPEN 1291 1773 GET 1293 1776 OPEN 1291 1776 GET 1293 1779 OPEN 1291 1779 GET 1293 1782 OPEN 1291 1782 GET 1295 1782 WAIT WAIT END'
	VAR navoz = '0x0F3C'
	VAR woodgate = '0x0843'
	VAR str1, str2, i = 1, sum = 0
	VAR NeedGuano = 20000
	UO.Set( 'distance', '3' )
	UO.Set( 'finddistance', '3' )
	JailPatch = JailPatch + ' '
	repeat
		str1 = GetWord( JailPatch, i )
		If str1 <> '' Then
			If str1 == 'OPEN' Then
				; откроем ближайшую дверь
				OpenGate( woodgate )
			Else
				If str1 == 'GET' Then
					; берем навоз
					GetGuano( navoz )
					sum = sum + 1
					If sum > NeedGuano Then
						UO.Print( 'I made it!!! Congratulations!' )
						return
					Endif
				Else
					If str1 == 'END' Then
						i = 0
					Else
						If str1 == 'WAIT' Then
							wait(60000)
						Else
							; str1 - координата
							i = i + 1
							str2 = GetWord( JailPatch, i )
							GoToXY( val(str1), val(str2), 0 )
						Endif
					Endif
				Endif
			Endif
		Else
			i = 0
		Endif
		i = i + 1
	until sum > NeedGuano
endsub

Sub OpenGate( typ1 )
	VAR nemogu = "You can't reach that."
	repeat
		UO.Findtype( typ1, '-1', '1' )
		DeleteJournal( nemogu )
		UO.UseObject( 'finditem' )
		wait(500)
		CheckLag()
		If UO.InJournal( nemogu ) Then
			UO.Ignore( 'finditem' )
		Else
			return
		Endif
	until False
endsub

Sub GetGuano( typ1 )
	VAR nemogu = "You can't reach that."
	repeat
		UO.FindType( typ1, '-1', '1' )
		If UO.FindCount() > 0 Then
			DeleteJournal( nemogu )
			UO.UseObject( 'finditem' )
			wait(500)
			CheckLag()
			If UO.InJournal( nemogu ) Then
				UO.Ignore( 'finditem' )
			Else
				UO.IgnoreReset()
				return
			Endif
		Else
			wait( 1000 )
		Endif
	until False
endsub

Sub GetWord( st, nom )
; Возвращает слово из строки str за номером num
; если такого слова нет - возвращаем ''
;
; Разделителем слов считаем пробел. Несколько пробелов подряд считаются за один.
; Функция сделана без рекурсии специально для считывания слов из сверхдлинных строк!
;
	VAR tmpst
	VAR i, dlin, kol, start
	dlin = len( st )
	kol = 0
	start = 0
	For i=0 To dlin - 1
		If mid( st, i, 1 ) == ' ' OR i == dlin - 1 Then
			kol = kol + 1
			If kol == nom Then
				; это первый пробел после нужного нам слова
				tmpst = mid( st, start, i - start )
				return tmpst
			Else
				While mid( st, i, 1 ) == ' '
					i = i + 1
				Wend
				If kol == nom - 1 Then
					start = i
				Endif
			Endif
		Endif
	Next
	tmpst = ''
	return tmpst
endsub

; Удаляем указанную фразу из журнала
;
Sub DeleteJournal( string1 )
	VAR nom = UO.InJournal( string1 )
	If nom > 0 Then
		UO.SetJournalLine( Nom - 1, ' ' )
		DeleteJournal( string1 )
	Endif
endsub
;
; Проверка на лаги
; Идея - Savage
Sub CheckLag()
	DeleteJournal( 'backpack' )
	UO.Click( 'backpack' )
	repeat
		wait(100)
	until UO.InJournal( 'backpack' )
	return
end sub

SUB GoToXY(x,y,prec) 
; Хождение по мировым координатам с точностью prec и скоростью, зависящей от wt
; (c) Yoko, AGRS
  UO.TextPrint('GoToXY '+STR(x)+', '+STR(y))
	Var ld=0,ldc=0 
	Var dx,dy 
	Var mx,my 
	Var ox,oy,mk,k 
start: 
	mx=UO.GetX() 
	my=UO.GetY() 
	dx=mx-x 
	If dx<0 Then 
		dx=0-dx 
	EndIf 
	dy=my-y 
	If dy<0 Then 
		dy=0-dy 
	EndIf 
	If dy>dx Then 
		dx=dy 
	EndIf 
	If dx<=prec Then 
		Return 
	EndIf 
	If dx<3 Then 
		mk=70 
	Else 
		mk=15 
	EndIf 
	ox=mx 
	oy=my 
	For k=1 To mk 
		mx=UO.GetX() 
		my=UO.GetY() 
		If mx<>ox Or my<>oy Then 
			GoTo sdidapl 
		EndIf 
	Next 
sdidapl: 
	mx=UO.GetX() 
	my=UO.GetY() 
	dx=mx-x 
	If dx<0 Then 
		dx=0-dx 
	EndIf 
	dy=my-y 
	If dy<0 Then 
		dy=0-dy 
	EndIf 
	If dy>dx Then 
		dx=dy 
	EndIf 
	If dx<=prec Then 
		Return 
	EndIf 
	If ld==dx Then 
		ldc=ldc+1 
		If ldc>100 Then 
			UO.Print("Can not reach location!") 
			Return 
		EndIf 
	Else 
		ld=dx 
	EndIf 
	If mx==x Then 
		If my==y Then 
			Return 
		EndIf 
		If my>y Then 
			UO.Press(33) 
			GoTo start 
		EndIf 
		UO.Press(35) 
		GoTo start 
	EndIf 
	If mx<x Then 
		If my>y Then 
			UO.Press(39) 
			GoTo start 
		EndIf 
		If my==y Then 
			UO.Press(34) 
			GoTo start 
		EndIf 
		UO.Press(40) 
		GoTo start 
	EndIf 
	If my<y Then 
		UO.Press(37) 
		GoTo start 
	EndIf 
	If my==y Then 
		UO.Press(36) 
		GoTo start 
	EndIf 
	UO.Press(38) 
	GoTo start 
endsub
Scripts Writer
Posts: 2259
Joined: 2005-04-19 18:00:29
Location: Московская область
Contact:

Post by Scripts Writer »

своя рубашка конечно всегда ближе к телу,- но однако есть и интересные скрипты %)) ближе к пвп -)
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Простейшие добывающие:

Code: Select all

#####################################################################
; LumberAround. v.3.25b (c) Edred
;
; Рубим вокруг чара. Используется ASM-модуль для инжекта для поиска деревьев.
;
sub LamberAround()
	VAR t, k, CanMine, cx, cy, tmpx, tmpy, pointX, pointY
	VAR MaxTime = 600								; измеряется в 1/10 сек.
	VAR ms1 = "There are no logs here to chop"		; нет логов
	VAR ms2 = "You can't use"						; не можем
	VAR ms3 = "in your pack."						; вырубили логи
	VAR ms4 = "You fail to produce"					; физл
	VAR ms5 = "You are too far away"				; стоим далеко
	VAR ms6 = "It appears immune to your blow"		; не проходит удар
	VAR ms7 = "You can't see that"					; не можем увидеть
	VAR ms8 = "is destroyed*"						; топор развалился
	VAR ms9 = "Try to kill my spirit at first!"		; вырубили духа дерева
	UO.asmTLStaticOpen('Resource_Static.dat')	; Загрузим таблицу типов статики
	VAR i, strpoint
	VAR MaxVes = 580
	cx = UO.GetX()
	cy = UO.GetY()
	for tmpx = -3 to 3
		for tmpy = -3 to 3
			k = 0
			pointX = cx + tmpx
			pointY = cy + tmpy
			strpoint = str(pointX) + ' ' + str(pointY)
			repeat
				DeleteJournal( ms1 )
				DeleteJournal( ms2 )
				DeleteJournal( ms3 )
				DeleteJournal( ms4 )
				DeleteJournal( ms5 )
				DeleteJournal( ms6 )
				DeleteJournal( ms7 )
				DeleteJournal( ms8 )
				DeleteJournal( ms9 )
				t = UO.Timer() + MaxTime
				k = k + 1
				wait(300)
				CanMine = UO.asmWaitTargetStaticTile( 'tree', PointX, PointY, 0 )
				If CanMine Then
					UO.UseObject(UO.ObjAtLayer('Lhand'))
					repeat 
						wait(100) 
					until UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR UO.InJournal(ms4) OR UO.InJournal(ms5) OR UO.InJournal(ms6) OR UO.InJournal(ms7) OR UO.InJournal(ms8) OR UO.InJournal(ms9) OR (t < UO.Timer())
				Endif
				If UO.Weight > MaxVes Then
					; Вес превышен!
					return
				Endif
				If UO.InJournal( ms8 ) Then
					; топор накрылся!
					return
				Endif
				If UO.InJournal( ms9 ) Then
					; дух дерева!
					return
				Endif
			until NOT UO.InJournal(ms4) AND NOT UO.InJournal(ms3) OR (k > 10)
			Endif
		next
	next
endsub

#####################################################################
Sub DeleteJournal( string1 )
	VAR nom = UO.InJournal( string1 )
	If nom > 0 Then
		UO.SetJournalLine( Nom - 1, 'string replaced' )
		DeleteJournal( string1 )
	Endif
endsub

Code: Select all

#####################################################################
; MiningAround. v.2.01b (c) Edred
;
; Копаем вокруг чара. Используется ASM-модуль для инжекта для поиска 
; выкапыемых тайлов или краев скал.
;
; MiningAround2 - вскапываем вокруг чара без АСМа
;
;
sub MiningAround()
; MiningAround() - вскапываем вокруг чара
;
	VAR t, k, CanMine, cx, cy, tmpx, tmpy, pointX, pointY, flag
	VAR MaxTime = 600							; измеряется в 1/10 сек.
	VAR ms1 = "There is no ore here to mine"
	VAR ms2 = "Это не копается."
	VAR ms3 = "in your pack."
	VAR ms4 = "You fail to find any useable ore"
	VAR ms5 = "Далеко. Не дотянуться."
	VAR ms6 = "Try mining in rock"
;	VAR ms7 = "You can't see that"
	VAR ms7 = "Хм... Не вижу.. Где копать то?."
	VAR ms8 = "is destroyed*"					; кирка развалилась совсем
	VAR ms9 = "ore at your feet."				; предположительно - элементаль
	UO.asmTLMapOpen('Resource_Map.dat')			; Загрузим таблицу типов карты
	UO.asmTLStaticOpen('Resource_Static.dat')	; Загрузим таблицу типов статики
	VAR i, strpoint
	VAR MaxVes = 600
	cx = UO.GetX()
	cy = UO.GetY()
	for tmpx = -2 to 2
		for tmpy = -2 to 2
			k = 0
			pointX = cx + tmpx
			pointY = cy + tmpy
			repeat
				DeleteJournal( ms1 )
				DeleteJournal( ms2 )
				DeleteJournal( ms3 )
				DeleteJournal( ms4 )
				DeleteJournal( ms5 )
				DeleteJournal( ms6 )
				DeleteJournal( ms7 )
				DeleteJournal( ms8 )
				DeleteJournal( ms9 )
				t = UO.Timer() + MaxTime
				k = k + 1
				flag = 1
				wait(300)
				If UO.Waiting() Then
					UO.CancelTarget()
				Endif
				CanMine = UO.asmWaitTargetMapTile( 'rock', pointX, PointY, 0 )
				wait(50)
				If CanMine Then
					UO.UseObject(UO.ObjAtLayer('Lhand'))
				Else
					If UO.Waiting() Then
						UO.CancelTarget()
					Endif
					CanMine = UO.asmWaitTargetStaticTile( 'rock', PointX, PointY, 0 )
					wait(50)
					If CanMine Then
						UO.UseObject(UO.ObjAtLayer('Lhand'))
					Else
						flag = 0
					Endif
				EndIf
				If flag == 1 Then
					repeat 
						wait(100) 
					until UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR UO.InJournal(ms4) OR UO.InJournal(ms5) OR UO.InJournal(ms6) OR UO.InJournal(ms7) OR UO.InJournal(ms8) OR UO.InJournal(ms9) OR (t < UO.Timer())
				Endif
				If UO.InJournal( ms9 ) Then
					; вывалился элементаль...
					return
				Endif
				If UO.Weight > MaxVes Then
					; Вес превышен!
					return
				Endif
				If UO.InJournal( ms8 ) Then
					; кирка накрылась!
					return
				Endif
			until NOT UO.InJournal(ms4) AND NOT UO.InJournal(ms3) OR (k > 10)
		next
	next
	If UO.Waiting() Then
		UO.CancelTarget()
	Endif
endsub

sub MiningAround2()
; MiningAround2() - вскапываем вокруг чара без АСМа
;
	VAR t, k, CanMine, cx, cy, tmpx, tmpy, pointX, pointY, flag
	VAR MaxTime = 600							; измеряется в 1/10 сек.
	VAR ms1 = "There is no ore here to mine"
	VAR ms2 = "Это не копается."
	VAR ms3 = "in your pack."
	VAR ms4 = "You fail to find any useable ore"
	VAR ms5 = "Далеко. Не дотянуться."
	VAR ms6 = "Try mining in rock"
;	VAR ms7 = "You can't see that"
	VAR ms7 = "Хм... Не вижу.. Где копать то?."
	VAR ms8 = "is destroyed*"					; кирка развалилась совсем
	VAR ms9 = "ore at your feet."				; предположительно - элементаль
	VAR i, strpoint
	VAR MaxVes = 600
	cx = UO.GetX()
	cy = UO.GetY()
	for tmpx = -2 to 2
		for tmpy = -2 to 2
			k = 0
			pointX = cx + tmpx
			pointY = cy + tmpy
			repeat
				DeleteJournal( ms1 )
				DeleteJournal( ms2 )
				DeleteJournal( ms3 )
				DeleteJournal( ms4 )
				DeleteJournal( ms5 )
				DeleteJournal( ms6 )
				DeleteJournal( ms7 )
				DeleteJournal( ms8 )
				DeleteJournal( ms9 )
				t = UO.Timer() + MaxTime
				k = k + 1
				flag = 1
				wait(300)
				If UO.Waiting() Then
					UO.CancelTarget()
				Endif
				UO.WaitTargetTile( 'all', str(pointX), str(PointY), '0' )
				UO.UseObject(UO.ObjAtLayer('Lhand'))
				repeat 
					wait(100) 
				until UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR UO.InJournal(ms4) OR UO.InJournal(ms5) OR UO.InJournal(ms6) OR UO.InJournal(ms7) OR UO.InJournal(ms8) OR UO.InJournal(ms9) OR (t < UO.Timer())
				Endif
				If UO.InJournal( ms9 ) Then
					; вывалился элементаль...
					return
				Endif
				If UO.Weight > MaxVes Then
					; Вес превышен!
					return
				Endif
				If UO.InJournal( ms8 ) Then
					; кирка накрылась!
					return
				Endif
			until NOT UO.InJournal(ms4) AND NOT UO.InJournal(ms3) OR (k > 10)
		next
	next
endsub
;
Sub DeleteJournal( string1 )
	VAR nom = UO.InJournal( string1 )
	If nom > 0 Then
		UO.SetJournalLine( Nom - 1, ' ' )
		DeleteJournal( string1 )
	Endif
endsub
;
Sub CheckLag()
	DeleteJournal( 'backpack' )
	UO.Click( 'backpack' )
	repeat
		wait(50)
	until UO.InJournal( 'backpack' )
	return
endsub

Code: Select all

#####################################################################
; FishingAround. v.2.07b (c) Edred
;
; Рыбачим вокруг чара
;
sub FishingAround()
	VAR Ms0 = "You can't see"			; не можем ловит здесь
	VAR Ms1 = "You can't fish under the ship"	; не можем ловить здесь
	VAR Ms2 = "You are too far away"		; далеко
	VAR Ms3 = "There are no fish here"		; кончилось тут
	VAR Ms4 = "You fish a while, but fail to catch anything"	; физл
	VAR Ms5 = "You pull out"			; поймал что-то
	VAR Ms6 = "Try fishing in water."		; не можем ловить здесь
	VAR k, t, v, x, y
	VAR MaxTime = 800
	For y = -4 To 4 
		For x = -4 To 4
			k = 0
			repeat
				If UO.Dead() Then
					return
				Endif
				DeleteJournal(ms0)
				DeleteJournal(ms1)
				DeleteJournal(ms2)
				DeleteJournal(ms3)
				DeleteJournal(ms4)
				DeleteJournal(ms5)
				DeleteJournal(ms6)
				t = UO.Timer()
				If UO.Waiting() Then
					UO.CancelTarget()
				Endif
				UO.WaitTargetTile( '0', STR( UO.GetX() + x ), STR( UO.GetY() + y ), '251')
				UO.UseObject( UO.GetSerial( UO.ObjAtLayer( 'Lhand' ) ) )
				repeat 
					wait(100)
				until UO.InJournal(ms0) OR UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR UO.InJournal(ms4) OR UO.InJournal(ms5) OR UO.InJournal(ms6) OR ((t + MaxTime) < UO.Timer())
				k = k + 1
				If UO.InJournal(ms5) Then
					k = 0
				Endif
				If UO.Dead() Then
					return
				Endif
				If UO.InJournal( ms5 ) Then
					GetResultFish()
				Endif
			until UO.InJournal(ms0) OR UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR (k > 6)
			If UO.Dead() Then
				return
			Endif
		Next 
	Next
endsub

Sub GetResultFish()
	; ------- улов -------
	DIM Fish[18]
	Fish[0]  = '0x170B'	; сапоги 
	Fish[1]  = '0x170F'	; тапки
	Fish[2]  = '0x170D'	; сандалии 
	Fish[3]  = '0x1711'	; сапоги
	Fish[4]  = '0x09CC'	; тип рыбы 1
	Fish[5]  = '0x09CD'	; тип рыбы 2
	Fish[6]  = '0x09CE'	; тип рыбы 3
	Fish[7]  = '0x09CF'	; тип рыбы 4
	Fish[8]  = '0x0FC4'	; ракушка, тип 1
	Fish[9]  = '0x0FC5'	; ракушка, тип 2
	Fish[10] = '0x0FC6'	; ракушка, тип 3
	Fish[11] = '0x0FC7'	; ракушка, тип 4
	Fish[12] = '0x0FC8'	; ракушка, тип 5
	Fish[13] = '0x0FC9'	; ракушка, тип 6
	Fish[14] = '0x0FCA'	; ракушка, тип 7
	Fish[15] = '0x0FCB'	; ракушка, тип 8
	Fish[16] = '0x0FCC'	; ракушка, тип 9
	Fish[17] = '0x14ED'	; карта
	VAR Razmer = 17		; размер массива - 1
	VAR Scissor = '0x0F9E'	; тип ножниц
	VAR Bandag = '0x0E21'		; Тип бинтов
	VAR i
	; Ищем что у нас валяется под ногами, если надо перерабатываем
	; и складируем в трюм. Потом введем всякие мешочки разные и ящички.
	For i = 0 To Razmer
		UO.FindType( Fish[i], '-1', 'ground' )
		If UO.FindCount() > 0 Then
			If i < 4 Then
				; обувь
				UO.WaitTargetObject( 'finditem' )
				UO.UseType( Scissor )
				Wait( 3000 )
				UO.FindType( Bandag )
			Endif
			UO.Grab( '0', 'finditem' ) 
			Wait( 2000 )
			If i > 7 AND i < 17 Then
				; ракушка
				UO.UseObject( 'finditem' )
				wait(1000)
			Endif
		Endif
	Next
endsub

Sub DeleteJournal( string1 )
	VAR nom = UO.InJournal( string1 )
	If nom > 0 Then
		UO.SetJournalLine( Nom - 1, 'string replaced' )
		DeleteJournal( string1 )
	Endif
endsub
CFA
Posts: 64
Joined: 2006-02-03 06:53:36

Post by CFA »

спасибо, много интересных решений
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Post by Destruction »

Если бы ты писал не скрипты, а операционку, что-нибудь вроде вин3.1 написать мог бы -)
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Destruction wrote:Если бы ты писал не скрипты, а операционку, что-нибудь вроде вин3.1 написать мог бы -)
Погоди, ты еще главного моего творчества не видел... Мининг и ламбер в одном флаконе. Но увидишь. Счас хостинг найду куда архивы положить и кину сюда все (там меню на дельфи, надо куда-то екзешник положить).
Корней
Posts: 7
Joined: 2005-07-27 08:48:54
Location: Лучший вид на этот город - если сесть в бомбардировщик...

Post by Корней »

Вот это да! :shock: :)

Сорри - не удержался!
admir
Posts: 528
Joined: 2005-01-13 07:20:54

Post by admir »

ВНИМАНИЕ ССЫЛКИ НА ФАЙЛЫ ПО ЭТОМУ ТОПИКУ !

UPDATE 1.07.06
http://vlad.nagorniy.ru/files/

конкретно по минингу тут
http://vlad.nagorniy.ru/files/edred/Mine&Lumb/

9-745-475
Last edited by admir on 2006-07-01 05:52:31, edited 3 times in total.
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Благодаря Адмиру нужные файлики теперь лежат в оне, посему начну постить свой мининг и ламбер. Думаю, постов в десять помещусь :shock:

файл readme

Code: Select all

Как установить скрипт:

1. Установить инжект и настроить его (версия 312.19, выложена на сайте
Цитадели).

2. Установить ASM версии не ниже 503.01 (для этого необходимо переименовать
файл script.dll в папке инжекта на файл scriptengine.dll и после этого
скопировать все файлы из папки ASM в папку инжекта). Более подробная 
информация - на сайте АГРСа (автор ASM-модуля для инжекта).
http://agrs.info/asm

3. Скопировать в папку с инжектом файлы mine&lumb.ini, setup4ML.exe,
resource_map.dat, resource_static.dat

4. Скопировать в какую-нибудь подпапку или папку с инжектом скрипт
mine&lumb.sc (местонахождение скрипта непринципиально)

5. Запустить игру с инжектом, зайти на закладку script, загрузить файл
скрипта, запустить процедуру main.


ПЕРЕД ЗАПУСКОМ СКРИПТА НАСТОЯТЕЛЬНО РЕКОМЕНДУЮ ВНИМАТЕЛЬНО ИЗУЧИТЬ
ФАЙЛ mine&lumb.hst (ЭТО ТЕКСТОВЫЙ ФАЙЛ).
файл mine&lamb.hst

Code: Select all

#===================================================================#
# MINING & LUMBERJACKING.                                           #
#===================================================================#
#   v.1.00 - 3.30b (с) Edred, 2004-2005                             #
#===================================================================#

Многофункциональный скрипт на мининг и ламбер с возможностью выбирать
режим  работы через меню и заданием настроек в ини-файле (то есть нет
необходимости редактировать скрипт!)

Поддерживаются 6 режимов работы:

          1. Режим копки по краям скал
          2. Режим копки по полу шахт
          3. Режим рубки леса
          4. Режим разметки маршрутов
          5. ВИП-шахта
          6. ВИП-лес

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

В первых трех режимах скрипта задействованы по 8 маршрутов, в послед-
них  двух (ВИП)  -  по  2  маршрута.  После окончания последнего мар-
шрута чар автоматически перейдет на первый.  Стартовый номер маршрута
задается  из  стартового меню. В первых трех режимах работы чар между
маршрутами реколлится на базу для разгрузки (при этом сделана возмож-
ность  подходить  к  месту разгрузки на базе из реколлки),  в ВИП-ре- 
жимах  -  чар  без  реколлов  подходит к месту разгрузки (прилоченный 
сундук). В первых трех режимах начальные точки всех маршрутов необхо-
димо  отмарчить  рунами,  которые поместить в соответствующие рунбуки 
(см. mine&lumb.ini, комментарии).

В стартовом меню вы можете задать:

   1. Использовать ли во время добычи хайд.
   2. Пить ли инвизы при тревоге (тревога от ПК).
   3. Использовать процедуру хождения с обходом препятствий (в данной
      версии  скрипта  она  используется независимо от вашего выбора)
   4. Использовать  разгрузку  в  банк.  Логика этого режима (нового,
      введен с версии 3.30)  такова: если это обычная копка/рубка, то
      включение  этого флага означает, что чар по руне на базу рекол-
      лится  на самом деле к банку (или вывеске дома) и разгружается.
      Если это ВИП-режимы,  где реколлы не задействованы, то осущест-
      вляется подход к банку/вывеске.
   5. Вести  подробный  лог.  В  этом случае в файл лога сбрасываются 
      данные о каждом шаге чара,  о каждом ударе киркой и его резуль-
      тате.  Также  после  разрушения  инструмента в лог записывается 
      сводная таблица добытого с его помощью и счетчики обнуляются.

Нажатие  кнопки  Save  в стартовом меню приводит к продолжению работы 
скрипта, нажатие Cancel прерывает скрипт. При нажатии Save меню запи-
сывает  ваш  выбор  в соответствующие параметры файла mine&lumb.ini и
передает управление обратно скрипту (при запуске скрипта тот запуска-
ет меню и встает в ожидание вашего выбора).

Во время работы первых трех режимов скрипта осуществляется отслежива-
ние  появления других чаров, эти чары сортируются на ПК и АПК по цве-
ту, для каждого типа существуют обособленные параметры (см. ини-файл)
расстояний, на которые те могут приблизиться. Если другой чар прибли-
жается ближе указанного расстояния - ваш чар выпьет инвиз (если вклю-
чено)  и  среколлится на базу для разгрузки, после чего отправится на
следующий  маршрут.  Существует список исключений, то есть чаров, чье
появление скриптом будет игнорироваться (В данной  версии  исключения
указываются  в  теле  скрипта в функции ControlPK, в дальнейшем будут
вынесены в ини-файл).  Также в дальнейшем планируется добавить убега-
ние от ПК во время ожидания реколла (в случае отказа от инвизов).

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

При разгрузке на базе чар сбрасывает в указанные (файл mine&lumb.ini)
сундуки и контейнеры в них добытое, лишние реги (оставляет себе толь-
ко  по  6 шт.  регов  для реколлов), при необходимости добирает реги, 
аналогично  с  бинтами, кровавыми бинтами, поушенами, кливерами, нож-
ницами.  Также поверяется на целостность инструмент и при необходимо-
сти (разрушение) берется новый.

Во время работы по маршруту осуществляется контроль веса чара. В слу-
чае  перевеса  (макс. величина задается в файле mine&lumb.ini) добыча
прерывается и чар отправляется на разгрузку.

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

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

Также пока не подключено: авторес чара в случае смерти, реколлы через
заряды рунбуки (после автореса), реконнектор.

В подробный лог пишется: при запуске скрипта пишется записать в лог 3 
пустые строки, после этого пишется информация о старте скрипта ио со-
стоянии  инструмента.  Потом записывается номер маршрута и в процессе
работы по маршруту записываются  координаты куда идет чар, координаты
точек добычи, результат каждого удара. При вылезании елема или рипера 
скидываем информацию о нем. В процессе боя с  элемом/рипером/медведем 
скидываем  информацию  о  выпитых  греат хиллах. В случае килла элема 
скидываем информацию об этом, и о луте с этого элема/рипера. При убе-
гании от ПК или зверя скидываем информацию об этом а также сериал ча-
ра,  от  которого убегаем. А также о выпитых инвизах. В случае смерти 
чара скидываем информацию об этом и сериал объекта, который нас убил.
При  разгрузке  скидываем информацию обо всех разгруженных ресурсах с
количеством. Количество суммируем с ранее добытым. Суммарную информа-
цию  показываем  в логе в квадратных скобках и записываем в ини-файл.
Пишем обо всех добранных ресурсах. Пишем о состоянии инструмента. Пи-
шем номер следующего массива.

В случае разрушения инструмента информация об этом сбрасывается в лог
и  сбрасывается информация о количестве добытого с этим инструментом.

Во  время работы по маршруту все точки копки/рубки заносятся в массив
usep. Этот массив организован по типу стека и имеет длину в 1000 ком-
плектов  координат  (в дальнейшем уменьшить). При приближении к концу
массива (заполнение) вызывается спец функция,  сдвигающая массив вниз
на 100 ячеек.  Каждая  новая точка копки/рубки сначала проверяется по 
массиву, если есть - пропускается.  В конце маршрута или в случае его
прерывания массив usep очищается.



 History:

  v.1.00b - Делаем только копку по одному массиву
  v.1.01b - Добавил скрипт на разметку массива
  v.1.02b - Добавил альтернативную ходилку, потом поймем какая лучше
  v.1.03b - С копкой по массиву разобрались, вводим срочно контроль 
            элемов. Пока с остановом скрипта на копку.
  v.1.04b - C отслеживаниеи и лутом элемов похоже разобрались
  v.1.05b - Вводим 5 массивов копки, реколлы между ними и на базу, разгрузку
  v.1.06b - мелкие правки вар-режима, разгрузки, хайда.
  v.1.07b - еще куча мелких отладочных правок. Теперь все более-менее работает.
  v.1.08b - массивов уже 7. Боремся за респаун руды ;)
  v.1.09b - добавляем контроль за приходом ПК
  v.1.10b - что-то глючит у нас с хайдиванием, правим до упора
  v.1.11b - увеличиваем кол-во массивов до 10. Теперь должно хватить.
  v.1.12b - Переписан скрипт на разметку массива. Теперь он сам создает
            файл с массивом, траханье с логами игры исключено.
  v.2.00b - Пересобираем весь скрипт, вводим глобальные переменные контроля,
            причесываем всю структуру скрипта.
  v.2.01b - Ввел ведение лога (пока только начало скрипта, переход к массиву,
            к разгрузке, сколько какой руды выгружено). Лог ведется в файл.
  v.2.02b - временно лог ведется в текстовое окно. Ввел полное обновление
            регов и бинтов, чтобы не копилось регов лута с элемов, теперь 
            при доборе регов и прочего на экране открываются все необходимые
            контейнеры.
  v.2.03b - ввел питие инвизок (от ПК) и грит хилов (от кристалл элемов).
  v.2.04b - добор кирки и реакция на ее разрушение.
  v.2.05b - пробуем новую версию скрипта на реколл. Теперь проверка успешности
            идет через проверку звуков.
  v.2.06b - приводим в порядок даты и время в логе, определяем тип элема,
            вводим еще дополнительные сообщения.
  v.2.07b - реколл через проверку звука отключаем, переписываем реколл
            с учетом траты маны и смену координат
  v.2.08b - вводим систему проверок лагов при реколле и разгрузке.
  v.2.09b - вводим проверку глюка на считывание строки 'end of file' в
            массиве как строки координат.
  v.2.10b - Оптимизируем паузы, доп мессаги по телу скрипта.
  v.2.11b - вводим глобальные счетчики для подсчета суммы всех выкопанных
            и доставленных на базу руд. Итог по счетчикам помещаем в лог
            после разгрузки.
  v.2.12b - оказывается текстовое окно с логом имеет ограничение по размеру,
            правим вывод лога, заодно правим форматирование дат...
  v.2.13b - срочно добавляем проверку и добор на базе кливеров... блин, как
            жалко мне этого необлутенного кристалл-элема... 
  v.2.14b - разбираемся. Почему-то иногда чар не хочет вскрывать элема,
            выдает ругательство "You can't reach this"... Правим... Посмотрим,
            получилось ли... Сделал через подход к трупу ходилкой.
  v.2.15b - Получилось. Делаем это стандартным способом вскрытия элемов.
  v.2.16b - вновь пробуем сделать запись лога в файл.
  v.2.17b - Делаем два раздельных лога - один так и ведется в текстовом
            окне, это удобно для контроля чара во время работы скрипта, второй
            пишется в файл один раз за круг, подводя итоги копки, килла
            элемов и убегания от ПК за круг (10 массивов копки).
  v.2.18b - Пытаемся поправить подвисы (редкие) при подходе к элему,
            вводим возможность задать стартовый массив копки.
  v.2.19b - Правим глюки предыдущей правки. Не туда запрос на номер массива
            вставил. Заодно введу-ка проверку что номер массива в допустимых
            пределах, а то ведь найдутся любопытные, которые введут...
  v.2.20b - переписываем часть, отвечающую за лут элема, отменяем попытку
            подойти к элему (глюков много), контролируем - если элем не
            лутится - в лог скидывается вся инфа что возможно о чаре и
            трупе элема...
  v.2.21b - вводим усовершенствование системы контроля ПК - проверяем цвет
            найденного чара, если красный - драпаем сразу, если не красный,
            контролируем в цикле расстояние до него, если меньше минимального
            (задается переменной) - тоже драпаем.
  v.2.22b - Еще раз разбираемся с лутом элемов. Почему-то не лутит. Не лутит
            почти всегда. Выделяем вскрытие и лут элемов в отдельный модуль
            и бьемся над разгадкой... Похоже, ларчик просто открывался... 
            Тестим.
  v.2.23b - Наконец руки дошли сделать нормальное обновление регов при
            разгрузке. Заодно проверим смену кирок.
  v.2.24b - Вроде все работает стабильно, так что чистим структуру и
            готовимся в переходу на версию 3.00 (в скрипт будет интегрирован
            скрипт на ламберджекинг).
  v.2.25b - реагируем на сообщение в журнале 'bear is attacking you*'. 
            Берем в руки оружие и выходим из хайда. Затем ждем мессаги о 
            трупе и продолжаем копку.
  v.2.26b - и опять, в который раз, правим лут элемов... :)
  v.2.27b - Правка контроля дистанции до ПК. Правка именования элемов в
            выводе в лог.
  v.2.28b - Ввожу диалоги ASM. Ввожу изменение паузы при хотьбе в зависимости
            от места. Пока пауза до 300 уменьшается только на разгрузке.
  v.2.29b - Новая разметка массива. Почти полный автомат. Но это разметка
            массива для новой версии мининга, которую буду вводить в ближ
            время. При этом изменяется формат файла массивов и придется
            их перемарчивать.
  v.2.30b - Вводим начальные запросы на тип мининга. Пока доступен только 
            вариант мининга по краям скал и разметки массива.
  v.2.31b - вновь делаем 8 массивов. Еще 8 идут в данжи и пещеры. Итого
            полная рунбука.
  v.2.32b - Вводим список исключений чаров. Вводим флаг пить или не пить инвиз.
  v.2.33b - делаем новую процедуру копки с использованием ASM (новые массивы)
  v.2.34b - в разметке массивов вводим контроль уже занесенных тайлов
  v.2.35b - Мелкие улучшения процедуры разметки массивов, больше запросов,
            удобнее работать.
  v.3.00a - Сделан второй режим работы чара: копка в пещерах.
  v.3.00b - На фиг массивы, делаем маршруты движения. Теперь разметка
            превращается в автоматическое запоминание маршрута передвижения
            вдоль скалы или по лесу. Сам перебор тайлов осуществляется в самих
            процедурах копки/рубки. Маршруты хранятся одной строкой
            и пишутся в один файл, mining.ini. При этом можно сменить процедуру
            движения на более простую и быструю, потому что обход препятствий 
            не требуется. 
  v.3.00c - Перелопачиваем весь скрипт на предмет соответсвия названий процедур.
            Вводим ламбер. Отделяем хистори в отдельный файл. Перегруппировы-
            ваем функции и процедуры. Переименовываем часть из них.
            Переименовываем сам скрипт (старое название minewalls)
  v.3.00d - Присобачиваем ламбер. Переделываем разгрузку чтобы не брать лишнего
            при ламбере.
  v.3.01  - Первый релиз. Ловите момент!
  v.3.01b - 3.01e - куча мелкой правки и мелких усовершенствований.
  v.3.10b - Неосуществленная версия, наработки перешли в следующую:
            Все режимы работают. Но не работала проверка на то, что тайл уже
            копался/рубился. Поправил. Но поправлю еще - надо уменьшать массив
            и делать его наподобие стека, что чар всегда помнил последние 5-10
            шагов. Заодно избавляемся от "наследия" прошлого - теперь массивов
            копки всего 8, остальные 8 - ламбер. Соответственно сливаем в один
            режимы копки по скалам и по стенам данжей. Режим же контроля элемов
            при мининге включаем, ориентируясь на кирку. Если обычная - нет,
            если цветная - контролируем. Также контролируем выкопанную руду
            в процессе копки по мессаге. Если выкопана старшая руда (задается
            спецпеременной) - используем инвизы при удирании от ПК. Также
            инвизы используются если копаем старшей цветной киркой или в арме.
            Ламберджекинг аналогично. Перекомпоновываем разгрузку для поддержки
	    новых режимов. Проверка кирок и топоров включает их цветность. 
	    Искореняем режим копки по полу - это все равно будет реализовано 
	    отдельным скриптом с вариантом копки в ГЗ-пещере. Вводим проверку 
	    версии инжекта и хождение в зависимости от нее либо через нажатие 
	    клавиш, либо через Addstep/Adddir. 
  v.3.20b - Перерабатываем скрипт версии 3.01е с добавлением наработанного
            в версии 3.10b и с добавлением кучи нового. Теперь стандартным 
	    комплектом софта для скрипта является инжект версии 312.19 и ASM 
	    501.06. Далее будем придерживаться этой же линии - фиксированная 
	    версия инжекта и последняя версия АСМа. По крайней мере до тех пор 
	    пока Йоко не избавится от неустойчивости последних версий инжекта. 
	    Также добавляем сразу менюшку в дельфи, копку по полу, два тестовых 
	    режима, подробный лог, стелс-режим. Уточнение: требуется ASM не ниже 
	    503.01PE (корректная работа с ini-файлами).
  v.3.21b - Счетчики логов и руды вынесены в ини-файл, туда же они скидываются 
            при разгрузке. При запуске скрипта они оттуда считываются, в случае 
	    отсутствия принимаются за 0.
  v.3.22b - Выносим в ини-файл все остальные настройки. Оттуда они будут 
            считываться при старте скрипта, туда при необходимости будут 
	    сохраняться. Активно комментируем настройки в ини-файле.
  v.3.23b - Поправляю ситуацию с разрушением кирки в тестовом мининге. Если все 
            ок, аналогично пропишу и ламбер.
  v.3.23c - Мелкая поправка. При открытии контейнеров на разгрузке не стоял вызов 
            CheckLag(), в результате при лагах чар мог взять мешок разгрузки в пак 
	    и скрипт зацикливался. Заодно отключил открытие мешка при разгрузке 
	    в тестовых режимах, это просто лишнее.
  v.3.24a - Килл элемов в тестовом мининге. Пока только килл и сброс инфы в лог, 
            никакого лута и занесения в счетчики. Новый способ обнаружения выкопа 
	    элемов. Потом задействую в остальных режимах. Килл через плитку. 
	    Сериал плитки - пока процедуре.
  v.3.24b - Мелкие поправки действий по разрушению кирки в тестовом мининге:
            руда скидывалась в сундук, а не мешок; скрипт не останавливался. 
	    Хмм... Первую ошибку поправил, вторая не поддалась. Еще бум думать.
  v.3.25b - Прописываем все необходимые изменения в ламбере. Вносим цвета старших 
            логов, типы духов деревьев и прописываем защиту от них. Делаем (только 
	    в тестовом режиме) сброс (с занесением в счетчики) 500 обычных логов 
	    в случае перевеса (чтобы маршрут не прерывался раньше времени).
  v.3.25s - Спецверсия, где тестовые режимы переделаны на разгрузку в банк.
  v.3.30b - Изменения в меню: тестовые режимы переименовываются в ВИП-режимы. 
            "Использовать Addstep" (не использовалось) переименовано в 
	    "Разгружаться в банк". Этот флаг переключает процедуру разгрузки на 
	    разгрузку в банк. В случае ВИП-режимов реколлы не производятся, а 
	    осуществляется подход к банку или вывеске дома и разгрузка в банк. 
	    Разгрузка в банк: открывается пак по сериалу (инифайл), в нем 
	    находится кучка соответствующей руды или логов и разгрузка 
	    соответствующего мата производится в нее (чтобы не было проблем с
            перегрузом банка). В инифайл вводится флаг разгрузки в банк: либо 
	    здание, либо вывеска. В инифайл вводятся координаты точки куда 
	    подходить на разгрузку. Дополнительно вводятся маршруты подхода 
	    (раздельные для мининга и ламбера) и маршруты перемещения после 
	    разгрузки. ВНИМАНИЕ: в этой версии изменилась структура ини-файла! 
	    Либо используйте новый, либо внимательно проверьте старый!!!
	    Отключил структуру боксов в сундуке для добора.
	    Изменил названия руды и цвета на современные (послевайповые).
	    Вместо флага "Использовать обход препятствий" в меню введен флаг
	    "Контролировать сытость чара"



Идея на следующую версию: вводим дополнительный автоматический этап: первая копка/рубка после
разметки массива. Для этого в ини-файле заводим разделы для каждого маршрута. В начале этих разделов
помещаем флаг:
SetUpThisPatch=0
если 0 - массив размечен, копка не производилась. При разметке массива автоматически
устанавливаем этот флаг в 0 какое бы значение у него не было. При запуске копки/рубки проверяем этот
флаг для данного маршрута. Если флаг 0 - запускаем очистку этого раздела от всех строк по точкам
маршрута. Далее помещаем в раздел переменную количества точек копки:
RazmerThisPatch=0
Потом будут идти строки, каждая на одну точку копки:
PointPatch-001=1111 2222 3333 4444 5555 6666 7777 8888
Счетчик в переменной трехзначный. То есть маршрут ограничен 999 точками - вполне достаточно.
Первые два числа - координаты чара в этой точке маршрута. Последующие пары - точки в которых можно
что-то добыть.
После прохождения всего маршрута помещаем длину маршрута в RazmerThisPatch и ставим флаг
SetUpThisPatch в 1. Тогда при следующих прохождениях этого маршрута он не будет заново просчитываться.
Соответственно, при следующих запусках не будет необходимости в использовании массива точек копки/рубки, 
проверки лишних точек - сам процесс значительно ускорится.
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

файл mine&lumb.ini

Code: Select all

[Setup]
; Эти установки автоматически перезаписываются из главного меню
; при старте скрипта
UseExeInterface=1
ModeOfScript=4
NumberPatch=8
CheckHide=0
CheckInviz=0
CheckChatFood=0
CheckLog=0
CheckBankDis=0

[Patches]
; маршруты. Записываются функцией разметки маршрутов. Маршрут - 
; перечисление координат точек через пробел.
walls1=2273 406 2273 407 2273 408 2273 409 2273 410 2273 411 2273 412 2273 413 2273 414 2273 415 2273 416 2273 417 2273 418 2273 419 2273 420 2272 421 2272 422 2271 423 2271 424 2271 425 2271 426 2271 427 2271 428 2270 429 2269 430 2268 431 2267 432 2266 433 2265 434 2264 435 2264 436 2263 437 2262 438 2262 439 2261 440 2261 441 2261 442 2261 443 2261 444 2261 445 2261 446 2261 447 2261 448 2260 449 2259 450 2258 451 2257 452 2256 453
walls2=2072 370 2072 369 2073 368 2074 367 2075 366 2075 365 2076 364 2077 364 2077 363 2077 362 2078 361 2079 360 2079 359 2080 359 2081 359 2082 358 2083 357 2083 356 2083 355 2083 354 2084 353 2085 353 2086 353 2087 353 2088 352 2089 352 2089 351 2089 350 2090 349 2091 348 2091 347 2091 346 2092 346 2093 346 2094 346 2094 345 2094 344 2095 343 2096 343 2097 343 2098 342 2099 341 2100 341 2101 341 2102 340 2103 339 2103 338 2104 338 2105 338 2106 338 2107 338 2108 337 2109 337 2110 337 2111 336 2111 337 2112 337 2113 337 2114 336 2115 335 2116 334 2117 333 2118 333 2119 333 2119 332 2120 331 2121 331 2122 331 2122 330 2123 329 2124 328 2125 327
walls3=1794 771 1794 772 1794 773 1795 773 1795 774 1795 775 1796 775 1796 776 1796 777 1797 777 1797 778 1797 779 1797 780 1798 780 1798 781 1798 782 1798 783 1798 784 1798 785 1799 786 1800 787 1799 787 1799 788 1799 789 1800 790 1800 791 1799 792 1800 792 1801 793 1800 794 1801 794 1802 794 1802 795 1802 796 1803 796 1803 797 1803 798 1803 799 1803 800 1803 801 1803 802 1803 803 1803 804 1804 804 1804 805 1804 806 1805 807 1805 808 1806 809 1806 810 1807 811 1808 811 1809 811 1810 811 1811 810 1812 810 1813 810 1814 810 1814 809 1815 809 1816 809 1817 809 1818 809 1819 809 1820 809 1821 808 1822 808
walls4=2072 1222 2073 1222 2074 1222 2075 1222 2075 1223 2076 1223 2077 1223 2077 1224 2078 1225 2079 1225 2079 1226 2080 1226 2081 1226 2082 1226 2083 1226 2084 1226 2085 1226 2086 1226 2086 1225 2086 1224 2087 1224 2088 1224 2089 1224 2090 1224 2091 1224 2091 1225 2093 1226 2094 1226 2095 1226 2096 1226 2097 1226 2098 1226 2099 1226 2099 1227 2100 1227 2101 1227 2102 1227 2103 1227 2104 1227 2104 1228 2105 1228 2106 1228 2107 1228 2108 1228 2109 1228 2110 1228 2111 1228 2112 1229 2113 1229 2114 1230 2115 1231 2115 1232 2116 1233
walls5=2049 125 2051 125 2052 125 2053 126 2054 127 2055 127 2056 128 2057 128 2057 129 2057 130 2057 131 2057 132 2058 133 2059 134 2059 135 2059 136 2059 137 2059 138 2058 139 2058 140 2058 141 2058 142 2059 143 2060 144 2060 145 2059 146 2059 147 2059 148 2060 148 2061 149 2062 149 2063 150 2063 151 2064 151 2065 152 2065 153 2065 154 2065 155 2065 156 2065 157 2065 158 2065 159 2065 160 2065 161 2065 162 2065 163 2065 164 2064 165 2064 166 2064 167 2064 168 2063 169 2063 172 2063 173 2063 174 2063 175 2064 175 2065 176 2065 177 2065 178 2065 179 2065 180 2066 180 2066 181 2066 182 2067 182 2068 183 2068 184 2068 185 2069 185 2069 186 2070 187 2070 188 2070 189 2071 190 2071 191 2071 192
walls6=2255 414 2255 415 2255 416 2254 416 2254 417 2254 418 2254 419 2254 420 2254 421 2254 422 2254 423 2253 423 2253 424 2253 425 2252 425 2252 426 2252 427 2251 427 2251 428 2251 429 2251 430 2251 431 2251 432 2250 432 2250 433 2250 434 2250 435 2249 435 2249 436 2249 437 2249 438 2249 439 2248 439 2248 440 2247 440 2246 440 2246 441 2246 442 2246 443 2246 444 2246 445 2245 445 2244 445 2244 446 2244 447 2243 447 2243 448 2242 449 2241 450 2240 450 2240 451 2239 451 2239 452 2238 452 2237 453 2236 454 2235 455 2234 455 2233 455 2232 456 2231 456 2231 457 2231 458 2230 459 2229 459 2229 460 2228 461 2227 462 2226 462 2226 463 2226 464 2225 464 2225 465 2225 466 2224 466 2224 467 2224 468 2224 469 2224 470 2223 470 2223 471 2222 471 2222 472 2221 472 2221 473 2221 474 2220 474 2219 474 2219 475 2218 476 2217 476 2216 476 2216 477 2215 477 2215 478 2214 478 2214 479 
walls7=2116 269 2116 270 2116 271 2116 272 2117 272 2117 273 2117 274 2117 275 2118 276 2118 277 2118 278 2118 279 2118 280 2118 281 2118 282 2118 286 2118 287 2118 288 2118 289 2118 290 2118 291 2118 292 2117 293 2117 294 2116 295 2116 296 2117 296 2117 297 2118 298 2119 299 2119 300 2119 301 2119 302 2120 302 2121 302 2121 303 2121 304 2122 304 2123 305 2124 306 2125 307 2126 308 2126 309 2125 310 2124 311 2124 312 2124 313 2124 314 2125 314 2125 315 2125 316 2124 317 2125 318 2126 319 2126 320 2126 321 2126 322 2126 323 2126 324
walls8=1945 73 1946 74 1947 75 1947 76 1948 77 1949 78 1949 79 1949 80 1949 81 1949 82 1949 83 1949 84 1949 85 1950 86 1950 87 1951 88 1951 89 1951 90 1951 91 1951 92 1951 93 1951 94 1951 95 1951 96 1951 97 1952 98 1953 99 1954 100 1955 101 1955 102 1955 103 1956 103 1957 103 1958 104 1959 105 1959 106 1960 106 1961 106 1962 105 1963 105 1963 106 1964 106 1965 106 1966 106 1967 107 1968 107 1969 107 1970 108 1971 109 1972 110 1973 110 1974 110
floor1=
floor2=
floor3=
floor4=
floor5=
floor6=
floor7=
floor8=
trees1=
trees2=
trees3=
trees4=
trees5=
trees6=
trees7=
trees8=
vipmi1=2472 55 2471 56 2470 57 2469 58 2468 58 2467 58 2466 57 2465 56 2464 56 2463 56 2462 56 2461 57 2460 58 2459 59 2459 58 2459 57 2459 56 2459 55 2458 55 2457 55 2456 55 2455 55 2454 55 2453 55 2453 54 2453 53 2453 52 2454 51 2455 50 2455 49 2455 48 2456 48 2457 48 2458 48 2459 48 2460 48 2461 49 2462 50 2462 51 2462 52 2462 53 2463 53 2464 53 2465 53 2466 53 2467 54 2468 55 2469 55 2470 55 2471 55 2472 55
vipmi2=2472 55 2473 55 2474 55 2475 55 2476 55 2477 54 2478 53 2479 52 2480 51 2481 51 2482 51 2483 51 2484 51 2485 51 2486 50 2487 49 2487 48 2487 47 2486 46 2485 45 2484 45 2483 45 2482 45 2482 44 2482 43 2481 43 2480 43 2479 43 2479 45 2479 46 2479 47 2479 48 2478 49 2477 50 2476 51 2475 52 2474 53 2472 55
vipla1=2908 577 2909 576 2910 575 2911 574 2912 573 2911 572 2910 572 2909 571 2908 570 2907 570 2906 570 2905 570 2904 569 2903 568 2902 567 2901 566 2901 563 2901 562 2902 561 2903 560 2904 559 2905 558 2905 557 2905 556 2906 555 2906 554 2906 553 2906 552 2906 551 2906 550 2906 549 2906 548 2907 548 2907 547 2907 546 2908 545 2909 544 2909 543 2910 542 2909 541 2909 540 2908 539 2907 538 2906 537 2905 536 2904 535 2904 534 2904 533 2903 533 2903 532 2902 531 2901 530 2900 530 2899 530 2898 530 2897 530 2896 530 2895 530 2894 530 2893 530 2892 530 2891 530 2890 530 2889 531 2888 530 2887 529 2886 528 2885 527 2884 526 2883 525 2882 524 2881 523 2881 522 2881 521 2881 520 2880 520 2879 520 2878 520 2878 519 2878 518 2878 514 2878 513 2878 512 2877 512 2876 512 2875 512 2874 513 2873 514 2872 515 2871 516 2870 515 2869 514 2869 513 2869 512 2869 511 2869 510 2869 509 2869 508 2868 508 2867 508 2866 508 2866 509 2866 510 2865 511 2864 511 2863 511 2862 511 2862 512 2862 513 2862 514 2862 515 2862 516 2862 517 2862 518 2862 519 2862 520 2862 521 2862 522 2862 523 2863 523 2864 523 2865 523 2866 523 2866 524 2866 525 2866 526 2865 527 2864 528 2864 529 2864 530 2863 531 2862 532 2861 533 2860 534 2860 535 2860 536 2860 537 2860 538 2859 539 2858 540 2857 541 2856 542 2857 543 2858 544 2859 543 2860 543 2861 542 2862 541 2862 542 2862 543 2863 544 2864 545 2865 546 2865 547 2865 548 2865 549 2865 551 
; 2865 555 2865 556 2865 557 2865 558 2866 558 2867 558 2868 558 2869 558 2870 559 2871 560 2872 561 2873 562 2872 563 2872 564 2872 565 2872 566 2872 567 2872 568 2872 569 2872 570 2872 571 2872 572 2872 573 2872 574
vipla2=2916 593 2917 592 2918 591 2920 591 2920 590 2921 590 2922 590 2923 590 2924 589 2925 588 2925 587 2925 586 2925 585 2925 584 2926 583 2927 582 2928 581 2929 580 2930 580 2931 580 2932 580 2933 580 2934 581 2935 582 2936 583 2937 583 2938 583 2939 583 2940 584 2941 585 2942 586 2943 586 2944 586 2945 585 2945 584 2945 583 2945 582 2945 581 2944 580 2943 579 2942 578 2942 577 2942 576 2942 575 2941 574 2941 573 2941 572 2941 571 2941 570 2941 569 2941 568 2940 567 2939 566 2938 565 2938 564 2938 563 2938 562 2938 561 2938 560 2939 559 2940 558 2941 557 2941 556 2942 555 2943 554 2944 553 2945 552 2946 552 2947 552 2948 552 2949 552 2950 551 2951 550 2951 549 2950 548 2949 547 2949 546 2949 545 2948 544 2947 544 2947 543 2946 542 2945 541 2945 540 2945 539 2945 538 2945 537 2945 536 2945 535 2945 534 2946 533 2946 532 2947 531 2948 530 2951 530 2952 530 2952 529 2952 528 2952 527 2951 526 2950 525 2949 524 2949 523 2949 522 2949 521 2949 520 2948 519 2947 518 2946 519 2945 520 2944 520 2943 521 2942 522 2941 523 2940 524 2939 525 2938 526 2937 527 2936 528 2935 529 2935 530 2935 531 2935 532 2935 533 2935 534 2935 535 2935 536 2934 537 2933 538 2932 537 2931 536 2930 535 2929 534 2928 534 2927 534 2926 534 2925 533 2924 532 2923 533 2922 534 2921 534 2920 535 2920 536 2920 537 2920 538 2921 539 2922 540 2922 541 2923 541 2924 542 2923 543 2923 544 2922 545 2921 546 2920 547 2920 548 2920 549 2920 550 2919 551 2918 551 2917 552 2917 553 2917 554 2917 555 2917 556 2916 556 2915 556 2914 556 2913 556 2912 556 2911 556 2910 556 2910 557 2909 558 2908 558 2907 558 2906 559 2905 560 2906 561 2906 562 2908 563 2908 562 2909 562 2910 562 2911 563 2912 564 2912 565 2912 566 2912 567 2913 568 2914 569 2914 570 2914 571 
; 2913 572 2911 574 2910 575 2909 576 2908 577

[LogCount]
; Счетчики логов. Автоматически обнуляются при разрушении инструмента
; (итоговые значения попадают в лог).
TreeLogs=0
AncientLogs=0
SturdyLogs=0
SteelLogs=0
NeitralLogs=0
ChaosLogs=0
OrderLogs=0
TitanicLogs=0
ElvinLogs=0

[OreCount]
; Счетчики руды. Автоматически обнуляются при разрушении инструмента
; (итоговые значения попадают в лог).
Iron=0
Damned=0
Kreonit=0
Copper=0
Bronze=0
Walean=0
Golden=0
Silver=0
Oceanite=0
BloodRock=0
Sacred=0
Brilliant=0
Order=0
Chaos=0
Neutral=0
Stardust=0
Citadel=0
Plaster=0
Sandstone=0
Stone=0
Marble=0

[Runbooks]
; на закладке Objects необходимо создать объекты с такими именами
; одна рунбука - 8 рун для мининга по скалам + 8 рун для мининга по полу
; вторая рунбука - 8 рун для ламбера по лесу + 8 рун резерва (пока не задействованы)
;
; Имя рунбуки для реколла на базу
RunbookBase=CommonRunbook
; Имена рунбук для реколла на маршруты
RunbookTile=MineRunbook
RunbookTile2=LambRunbook
; Номер руны для реколла на базу через реги
BaseRune=20
; Номер руны для реколла на базу через заряд рунбуки
; ПОКА НЕ ИСПОЛЬЗУЕТСЯ!
BaseRuneScroll=19
; Номер кнопки пополнения зарядов рунбуки
; ПОКА НЕ ИСПОЛЬЗУЕТСЯ!
RechargeNumber=0

[MiningWalls]
; Номера рун в рунбуке для реколлов на маршруты
; копка по краям скал
Wall1Rune=36
Wall2Rune=38
Wall3Rune=40
Wall4Rune=42
Wall5Rune=44
Wall6Rune=46
Wall7Rune=48
Wall8Rune=50

[MiningFloor]
; Номера рун в рунбуке для реколлов на маршруты
; копка по полу пещеры
Wall1Rune=36
Wall2Rune=38
Wall3Rune=40
Wall4Rune=42
Wall5Rune=44
Wall6Rune=46
Wall7Rune=48
Wall8Rune=50

[LamberForest]
; Номера рун в рунбуке для реколлов на маршруты
; ламбер в лесу
Wall1Rune=20
Wall2Rune=22
Wall3Rune=24
Wall4Rune=26
Wall5Rune=28
Wall6Rune=30
Wall7Rune=32
Wall8Rune=34

[DischargeSer]
; Сериалы контейнеров для разгрузки и добора необходимого
; при первых трех режимах работы
;
; Координаты точки из которой будем разгружаться.
; Если включен режим разгрузки в банк - это координаты
; вывески дома
Sund_Tile_X=2472
Sund_Tile_Y=55
; Сериал сундука, куда складывать руду или логи
; если включен режим разгрузки в банк - это сериал банкбокса
Sund1_Ser=0x403CAA91
; Сериал сундука, откуда добирать реги и прочее
; если включен режим разгрузки в банк - игнорируется
Sund2_Ser=0x40361048
; ящики в этом сундуке:
; regs
BoxRegs=0x40520E8C
; bandages, blood bandages, bottles
BoxBand=0x40520ED6
; pickaxes, hatchets, cleavers, scissors
BoxPick=0x40520F33
; weapons, armors, robes
BoxArms=0x40520F7C

[DischargeVIP]
; Переменные этого раздела задействованы в случае
; ВИП-режимов
;
; Флаг куда разгружаться: 0 - банк по команде 'bank'
; 1 - банк с вывески дома
; Режимы работают только в случае включения соотв.
; флага в меню, иначе флаг игнорируется
PlaceOfBank=1
HomeTablSerial=0x4033E959
; Сериалы и координаты контейнеров для разгрузки и добора 
; необходимого при мининге. 
; Если PlaceOfBank == 0 - место вызова банка и сериал его, 
; 1 - место откуда кликаем по вывеске и сериал банка.
MinContSerial=0x4041B46B
MinContX=2472
MinContY=55
; Необходимость использования маршрута для подхода к сундуку/банку
MinNeedInPatch=0
; Путь подхода к банку в мининге
MinPatchToBank=
;
; Аналогично - для ламбера
;
LambContSerial=0x405B9440
LambContX=2895
LambContY=670
;
LambNeedInPatch=1
LambPatchToBank=2906 610 2906 659

[OtherConfig]
; уровень злобности для деления чаров на ПК и АПК
MinNotoriety=4
; минимальное расстояние, на которое позволяем приблизиться АПК
MinEnemyDist=5
; минимальное расстояние, на которое позволяем приблизиться ПК
MinEnemyDist2=7
; максимальное расстояние, на котором враг ищется
MaxEnemyDist=10
; максимальный поднимаемый чаром вес -50 стоунов
MaxWightOfChar=580
; тип элементаля руды
OreElemental=0x000E
; тип духа дерева
TreeSpirit=0x003A

;=================================================================
; НИЖЕ СЛЕДУЮТ РАЗДЕЛЫ  С АВТОМАТИЧЕСКИМ ЗАПОЛНЕНИЕМ И ИЗМЕНЕНИЕМ
; НЕ ИЗМЕНЯЙТЕ В НИХ НИЧЕГО! ЭТО МОЖЕТ ПРИВЕСТИ К НЕПРЕДСКАЗУЕМЫМ 
; ПОСЛЕДСТВИЯМ!!!                        [начиная с версии 3.40b]
;=================================================================
;
; Cтруктура следующих разделов: это вычисленные (на автомате)
; точки маршрутов.
; SetUpThisPatch - если 0 - маршрут еще не обсчитан
; RazmerThisPatch - количество точек копки в обсчитанном маршруте
; PointPatch-001 - таких строк будет ровно столько сколько в пре-
; дыдущем счетчике. Первая пара чисел - координаты чара, последующие -
; уникальные координаты копки/рубки, в которых можно производить добычу

[walls1]
SetUpThisPatch=0
RazmerThisPatch=0

[walls2]
SetUpThisPatch=0
RazmerThisPatch=0

[walls3]
SetUpThisPatch=0
RazmerThisPatch=0

[walls4]
SetUpThisPatch=0
RazmerThisPatch=0

[walls5]
SetUpThisPatch=0
RazmerThisPatch=0

[walls6]
SetUpThisPatch=0
RazmerThisPatch=0

[walls7]
SetUpThisPatch=0
RazmerThisPatch=0

[walls8]
SetUpThisPatch=0
RazmerThisPatch=0

[floor1]
SetUpThisPatch=0
RazmerThisPatch=0

[floor2]
SetUpThisPatch=0
RazmerThisPatch=0

[floor3]
SetUpThisPatch=0
RazmerThisPatch=0

[floor4]
SetUpThisPatch=0
RazmerThisPatch=0

[floor5]
SetUpThisPatch=0
RazmerThisPatch=0

[floor6]
SetUpThisPatch=0
RazmerThisPatch=0

[floor7]
SetUpThisPatch=0
RazmerThisPatch=0

[floor8]
SetUpThisPatch=0
RazmerThisPatch=0

[trees1]
SetUpThisPatch=0
RazmerThisPatch=0

[trees2]
SetUpThisPatch=0
RazmerThisPatch=0

[trees3]
SetUpThisPatch=0
RazmerThisPatch=0

[trees4]
SetUpThisPatch=0
RazmerThisPatch=0

[trees5]
SetUpThisPatch=0
RazmerThisPatch=0

[trees6]
SetUpThisPatch=0
RazmerThisPatch=0

[trees7]
SetUpThisPatch=0
RazmerThisPatch=0

[trees8]
SetUpThisPatch=0
RazmerThisPatch=0

[vipmi1]
SetUpThisPatch=0
RazmerThisPatch=0

[vipmi2]
SetUpThisPatch=0
RazmerThisPatch=0

[vipla1]
SetUpThisPatch=0
RazmerThisPatch=0

[vipla2]
SetUpThisPatch=0
RazmerThisPatch=0
Post Reply