Veterinary (Ветеринария)

Anything and all.

Moderators: Murderator+, Murderator

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

Veterinary (Ветеринария)

Post by Edred »

Сразу оговорюсь, писалось под шард Цитадель. А так, все подробности в комментариях:

Code: Select all

#####################################################################
; Veterinary. v.1.08b (c) Edred
;
sub Veterinar()
; Ставим рядом двух чаров, у каждого по лошади. Рядом с чарами
; сундук. В сундук чистые бинты. Сериалы лошадей каждому в скрипт.
; Стравливаем лошадей (можно использовать скрипт provocat2.sc) и
; качаемся. Внимание! При низком скилле за работой скрипта надо
; следить (одним чаром, вытащив на экран статусы обоих лошадей) и
; периодически садиться на лошадь и отъезжать в сторону, слезать с нее
; и давать обоим чарам вылечить лошадей полностью. После 40-45 скилла
; нужда в этом отпадает (скилл растет быстро).
;
	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.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
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

ВЕТЕРИНАРИЯ 2

Когда вкачаете скилл до 55-60, имеет смысл перейти на прокачку в одного чара. Я, по крайней мере, перешел и для этого наваял вот такой скриптец:

ЗАМЕЧАНИЕ: В скрипте прописаны только два типа лошадей, так что откорректируйте под те, что вам нужны.

Code: Select all

#####################################################################
; 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 = '0x00E2'
	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', '2' )
	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)
			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)
			Endif
		Else
			wait(300)
		Endif
	Wend
endsub
Функции:

Code: Select all

#####################################################################
; ================================================================
; Процедура подкормки чара. Параметры: сериал контейнера с медом, номер 
; сообщения до которого кормить, сколько съесть меда после сообщения,
; как часто кормить чара.
; Прохождение последнего периода контролируется через глобальную переменную 
; 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

#####################################################################
; 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

Enjoy! :wink:
Last edited by Edred on 2005-01-30 01:22:34, edited 2 times in total.
Edred
Expert!
Posts: 2544
Joined: 2004-04-03 17:36:29
Location: Saint-Petersburg

Post by Edred »

Можете отправлять в раздел Scripts! - Ветеринарию на этих скриптах успешно вкачал до ГМа.
Post Reply