Page 1 of 1

Фишинг (настроено под шард Цитадель)

Posted: 2005-02-13 00:18:00
by Edred
Это не последняя версия, но та, которую я решил отдать народу. Идеальная для прокачки. Все следующие - для массовой добычи ресурсов.

Code: Select all

; Рыбачим с корабля. Выловленное перерабатываем и складываем в сундуки на 
; палубе. Если вокруг все выловлено - плывем вперед или назад (по кругу). 
; Считаем итемы (раздельные) в сундуках. Если их больше 250 - останавливаем 
; скрипт. В один из сундуков на палубе положить мед (если вы хотите 
; подкармливать чара по дороге). Для начала рыбалки сорентируйте корабль по
; оси Y в направлении увеличения (справа налево наискосок вниз).
; Встаньте на трап и большого улова!
;
; НЕ ЗАБУДЬТЕ ВКЛЮЧИТЬ 'Track world items'!!!
;
; History:
;
; 1.01 - считаем физлы ловли. Если 10 - переходим к след. тайлу
; 1.02 - попытка защититься от элемов. Пока - простейшая - если чар мертв 
;        ждем ресса и берем в руки оружие. 
; 1.03 - переработка рыбы, автоматическая подкормка раз в час.
; 1.04 - на фиг старую защиту, счас параллельный скрипт, который отрубает
;        фишинг если здоровье чара меньше силы.
; 1.05 - Разобрались с оружием в руках и паке
; 1.06 - пропуск пустых респов элемов, сообщение о прерывании скрипта
;        поверх всех окон в виндоус, мелкие правки.
; 1.07 - лечим изменения. Плюс прячем лишние процедуры :)
; 1.08 - из-за ловли с трапа изменил матрицу лова. Теперь нет точек
;        где не ловится (чар в них и не пытается)
; 1.09 - открываем ракушки
; 1.10 - Теперь удочку и оружие со щитом храним не в паке, а в мешке на палубе -
;        защита от лута ПК (если кто подплывет и кильнет, фиг слутит удочку)
; 1.11 - Зациклил скрипт. Теперь в случае элема - скрипт встает на паузу и ждет
;        пока здоровье не восстановится, а потом перезапускается. Лечения с бинтов
;        пока нету.
; 1.12 - Начинаем вводить ловлю по кругу. Для начала ловли корабль должен быть
;        ориентирован по оси Y как и раньше, бум так ловить 10 шагов, потом
;        разворачивать корабль и столько же шагов ловить обратно.
; 1.13 - мелкая правка, заодно мувим жемчуг в трюм.
; 1.14 - Соптимизировал ожидание во время килла элема, ввел лечение с бинтов после,
;        ввел лут элема. Пока просто в пак.
; 1.15 - правим бой и лут элема
; 1.16 - ввел новое условие для проверки кила элема - что где-то рядом с чаром
;        появился пак. Теперь работает как часы.
; 1.17 - ввел еще один мешок для лута с элема и карт. Чтобы не было переполнений.
;        Для нормальной кормежки чуть переделал структуру скрипта.
; v. 2.00b - полная переработка скрипта: восстановление четкой структуры,
;            изменение принципов реакции на элемов (их может быть больше
;            одного), подхиливание чара во время битвы, изменение принципов
;            плавания по кругу. Оружие должно быть в руках или паке.
;            Удочка должна быть в руках или паке. Кроме того, можно положить
;            еще удочек в сундук или пак.
; v. 2.01b - правим подхил с бинтов и атаку последнего элема в случае смерти.
; v. 2.02b - пропускаем паки элемов, которые не можем взять
; v. 2.03b - реагируем на морского монстра. Реакция простая - сразу прекращаем 
;            ловить и сидим в хайде пока монстр не уплывет! Гадость какая...
;            Для этого придется ввести еще один скрипт - FightMonster
; v. 2.04b - Поправляем мелкие глючки, изменяем названия функций на понятные
; v. 2.05b - добавлен сундук с разбитого корабля
; v. 2.06b - Некоторые правки в технологии подхилла в сражении.
;
;            Временно отключена процедура снятия курсы с чара.
;
; ver. 2.06b (c) Edred
;
VAR Trum = '0x401DE221'		; сундук для основного улова
VAR Trum2 = '0x4058CF23'	; сундук/мешок для лута элема
VAR Trum3 = '0x401DE1C6'	; сундук / ящик для паков элемов
VAR Pole = '0x0DBF'			; удочка
VAR Fork = '0x1404'			; оружие
# VAR Fork = '0x0F5C'		; mace - хочу качать мэйсу
VAR Shield = '0x1B76'		; щит
VAR Shag = 1				; первый шаг при ловле вперед. При ловле вперед 
							; прибавляем по 1, при ловле назад будем ставить 
							; отрицательные числа.
VAR Elem = '0x0010'			; Тип водного элементаля
VAR ElemPack = '0x0E75'		; Тип пака водного элементаля
VAR Monster = '0x005F'		; Тип морского монстра
VAR Bandag = '0x0E21'		; Тип бинтов
VAR BlBandag = '0x0E20'		; Тип кровавых бинтов
VAR ElemSer					; сериал элема
VAR MChest = '0x09AB'		; тип сундука с затонувшего корабля
; ================================================================
; FightMonster() - Сканируем вокруг в поисках морского монстра, прячемся
; 
Sub FightMonster()
		repeat
			wait(500)
			UO.FindType( Monster, -1, 1 )
		until UO.FindCount() > 0
		; Нашли!
		UO.Exec( 'terminate Fishing' )
		UO.Exec( 'terminate FightElem' )
		UO.SayU( 'stop' )
		UO.WarMode( 0 )
		Hide()
		repeat
			wait(1000)
			If UO.Dead() Then
				repeat
					wait(1000)
				until UO.Dead() == 0
			Endif
			UO.FindType( Monster, -1, 1 )
		until UO.FindCount() == 0
		; Ушел!
		UO.SayU( 'stop' )
		UO.Exec( 'exec FightElem' )
		UO.Exec( 'exec Fishing' )
endsub
; ================================================================
; FightElem() - Сканируем вокруг в поисках элемов, вооружаемся
; 
Sub FightElem()
	VAR Nom, PackSer, MultiElem
	While TRUE
		UO.Exec('set finddistance 10')
		UO.FindType( Elem, -1, 1 )
		While UO.FindCount() == 0
			wait(500)
			UO.FindType( Elem, -1, 1 )
		Wend
		; нашли элема недалеко от нас
		ElemSer = UO.GetSerial( 'finditem' )
		UO.Exec( 'terminate Fishing' )
		UO.Exec( 'terminate FightMonster' )
		UO.SayU( 'stop' )
		DropPole()
		wait(1000)
		GetWeapon()
		UO.WarMode( 1 )
		UO.FindType( Bandag, -1, Trum )
		If UO.FindCount() > 0 Then
			UO.MoveItem( 'finditem', '10' )
			wait(1000)
		Endif
		UO.Print( 'TEST. I fighting with elem' )
		UO.Attack( ElemSer )
		MultiElem = 0
		repeat
			wait(1000)
			If UO.Dead() Then
				CharDead()
			Endif
			; тут введем еще подхиливание чара
			UO.Print( 'Idem v podhil ' + str( UO.Life ) )
			If UO.Life < ( UO.Str - 30 ) Then
				UO.Print( 'TEST. Restore chars...' )
				RestoreChar( 0 )
				UO.Print( 'TEST. Get weapons back...' )
				GetWeapon()
			Endif
			If UO.Dead() Then
				CharDead()
			Endif			
			UO.FindType( Elem, -1, 1 )
		until UO.FindCount() == 0
		; Элем мертв и вокруг нет других
		UO.FindType( ElemPack, -1, 1 )
		While UO.FindCount() > 0
			PackSer = UO.GetSerial( 'finditem' )
			DeleteJournal( "You can't reach" )
			UO.MoveItem( PackSer )
			wait(2000)
			If UO.InJournal( "You can't reach" ) Then
				UO.Ignore( 'finditem' )
			Else
				UO.UseObject( PackSer )
				wait(2000)
				FishLoot( PackSer )
			Endif
			UO.FindType( ElemPack, -1, 1 )
		Wend
		UO.IgnoreReset()
		UO.Exec( 'exec Fishing' )
	Wend
endsub 

Sub CharDead()
	; нащи действия из-за смерти чара
	; для начала ждем-с...
	repeat
		wait(300)
	Until UO.Dead() == 0
	; чар ожил
	RestoreChar( 1 )
	UO.FindType( Bandag, -1, Trum )
	If UO.FindCount() > 0 Then
		UO.MoveItem( 'finditem', '10' )
		wait(1000)
	Endif
	GetWeapon()
	UO.WarMode( 1 )
	UO.Attack( 'lastattack' )
endsub

; ================================================================
; StartFishing() - Запуск фишинга. Сделано в виде отдельной процедуры,
;                  чтобы не переустанавливать лишний раз глобалку
sub StartFishing()
	   	UO.SetGlobal( 'TimeProcess', str( UO.Timer() ) )
		UO.Exec( 'exec FightElem' )
		UO.Exec( 'exec Fishing' )
endsub

; ================================================================
; Fishing() - Основная процедура фишинга
; 
Sub Fishing()
	DropWeapon()
	RestoreChar( 1 )
	UO.WarMode( 0 )
	wait(500)
	UO.Exec( 'exec FightMonster' )
	While TRUE
		FishForward()
		If UO.Dead() Then
			return
		Endif
		If CountTrum( Trum ) > 250 OR CountTrum( Trum2 ) > 250 Then
			return
		Endif
	Wend
endsub

; ================================================================
; FishForward() - Процедура ловли вокруг лодки и сдвига корабля
; 
Sub FishForward()
	VAR x, y
	repeat
		For y = -4 To 4 
			For x = -4 To -1
				FishTile( x, y )
				If UO.Dead() Then
					return
				Endif
   			Next 
		Next
		EatChar( Trum, 2, 1, 60 )
		If Shag > 10 Then
			; пока сделаем плыть назад
			UO.SayU( 'back' )
			wait(40000)
			UO.SayU( 'stop' )
			Shag = 0
		Endif
		Shag = Shag + 1
		UO.SayU( 'forward' )
		wait( 4000 )
		UO.SayU( 'stop' )
	until UO.Dead()
endsub

; ================================================================
; FishTile() - Процедура ловли в заданном тайле
; 
Sub FishTile( x, y )
	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 k, t, v
	VAR MaxTime = 300
	k = 0
	repeat
		If UO.Dead() Then
			return
		Endif
		DeleteJournal(ms0)
		DeleteJournal(ms1)
		DeleteJournal(ms2)
		DeleteJournal(ms3)
		DeleteJournal(ms4)
		DeleteJournal(ms5)
		t = UO.Timer()
		GetPole()
		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(300) 
		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 ((t + MaxTime) < UO.Timer())
		If UO.InJournal(ms0) OR UO.InJournal(ms1) OR UO.InJournal(ms2) Then
			wait(3000)
		Endif
		k = k + 1
		If UO.InJournal(ms5) Then
			k = 0
		Endif
		If UO.Dead() Then
			return
		Endif
		If UO.InJournal( ms5 ) Then
			GetResultFish()
			repeat
				v = Recycle()
			until v == 0
			If CountTrum( Trum ) > 250 OR CountTrum( Trum2 ) > 250 Then
				return
			Endif
		Endif
	until UO.InJournal(ms0) OR UO.InJournal(ms1) OR UO.InJournal(ms2) OR UO.InJournal(ms3) OR (k > 6)
endsub

; ================================================================
; GetResultFish() - Процедура подбора рузультатов лова
; 
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 i
	; Ищем что у нас валяется под ногами, если надо перерабатываем
	; и складируем в трюм. Потом введем всякие мешочки разные и ящички.
	For i=0 To Razmer
		UO.FindType( Fish[i], -1, 'ground' )
		If UO.FindCount() > 0 Then 
			UO.Grab( 0, 'finditem' ) 
			Wait( 2000 )
		Endif
	Next
	UO.FindType( MChest, -1, 'ground' )
	If UO.FindCount() > 0 Then 
		UO.Grab( 0, 'finditem' ) 
		Wait( 2000 )
	Endif	
endsub

; ================================================================
; Recycle() - Процедура переработки рузультатов лова
; 
Sub Recycle()
	; ------- улов -------
	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 Cleaver = '0x0EC2'	; кливер
	; ------- конечный продукт -------
	VAR Pearl = '0x0F7A'	; жемчуг
	VAR PearlColor = '0x05B2'	; цвет жемчуга
	VAR Steak = '0x097A'	; рыбное филе
	VAR i, Rakush, RetValue = 0

	For i=0 To Razmer
		UO.FindType( Fish[i] )
		If UO.FindCount() > 0 Then 
			RetValue = 1
			If i < 4 Then
				; сапоги и тапки
				; режем ножницами на бинты и скидываем бинты
				UO.WaitTargetObject( 'finditem' )
				UO.UseType( Scissor )
				Wait( 3000 )
				; Скинем бинты в трюм
				UO.FindType( Bandag )
				If UO.FindCount() > 0 Then
					UO.MoveItem( 'finditem', '0' , Trum )
					wait( 2000 )
				Endif
			Endif
			If i > 3 AND i < 8 Then
				; рыба
				; режем кливером в филе и сбрасываем филе
				; кливер берется в руки, поэтому потом
				; снова берем удочку
				UO.WaitTargetObject( 'finditem' )
				UO.UseType( Cleaver )
				Wait( 3000 )
				UO.FindType( Steak )
				If UO.FindCount() > 0 Then
					UO.MoveItem( 'finditem', '0' , Trum )
					wait( 2000 )
				Endif
				UO.UseType( Pole )			
			Endif
			If i > 7 AND i < 17 Then
				; ракушки
				; дабл клик на них, если появился жемчуг
				Rakush = UO.GetSerial( 'finditem' )
				UO.UseObject( Rakush )
				wait( 1000 )
				UO.FindType( Pearl, PearlColor )
				If UO.FindCount() > 0 Then
					UO.MoveItem( 'finditem', '0' , Trum )
					wait( 2000 )
				Endif
			Endif
			If i == 17 Then
				; карта
				UO.MoveItem( 'finditem', '0', Trum2 )
				wait( 2000 )
			Endif
		Endif
	Next
	return RetValue
endsub

; ================================================================
; Процедура подкормки чара. Параметры: сериал контейнера с медом, номер 
; сообщения до которого кормить, сколько съесть меда после сообщения,
; как часто кормить чара.
; Прохождение последнего периода контролируется через глобальную переменную 
; TimeProcess.
;
; ver. 1.03 (c) Edred
;
Sub EatChar( Sunduk, Nom, Add, TimeWait )
	; сообщения при кормежке
	UO.Print( 'TEST: eat ' + str( Nom ) + ' message ' + str( Add ) + ' add ' + 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
		; рано кормиться
		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

; ================================================================
; Функция FishLoot() - переложить из указанного пака все в трюм 2
;                      и переложить сам пак в трюм 3
Sub FishLoot( Cont )
	; лутим все подряд из Cont и скидываем в Trum
	; потом скидываем пустой Cont в TrumTrash
	UO.FindType( '-1', '-1', Cont )
	while UO.FindCount()
		UO.MoveItem( 'finditem', 0, Trum2 )
		wait(1000)
		UO.FindType( '-1', '-1', Cont )
	wend
	UO.MoveItem( Cont, 0, Trum3 )
	wait(500)
endsub

; ================================================================
; Функция CountTrum() - подсчитать кол-во итемов в указанном трюме
;
Sub CountTrum( cont )
	; Считаем кол-во любых итемов (или кучек) в cont
	; и возвращаем результат
	UO.FindType( -1, -1, cont )
	return UO.FindCount()
endsub

; ================================================================
; Функция GetWeapon() - взять в руки оружие и щит
;
Sub GetWeapon()
	; берем в руки оружие и щит. Динамические паузы и оптимитизация.
	If UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield Then
		If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
			; уже в руках все
			return
		Else
			; надо взять в руки только оружие, щит не надо
			UO.Equipt( 'Rhand', Fork )
			repeat
				wait(100)
			until UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork
		Endif
	Else
		If UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork Then
			; в руках только оружие, надо еще щит взять
			UO.Equipt( 'Lhand', Shield )
			repeat
				wait(100)
			until UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield
		Else
			; в руках нет ни оружия, ни щита
			UO.Equipt( 'Rhand', Fork )
			repeat
				wait(100)
			until UO.GetGraphic( UO.ObjAtLayer( 'Rhand' ) ) == Fork			
			UO.Equipt( 'Lhand', Shield )
			repeat
				wait(100)
			until UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Shield
		Endif
	Endif
endsub

; ================================================================
; Функция DropWeapon() - сбросить оружие и щит в пак
;
Sub DropWeapon()
	UO.UnEquip( 'Lhand' )
	wait(500)
	UO.UnEquip( 'Rhand' )
	wait(500)
endsub

; ================================================================
; Функция GetPole() - взять удочку из пака или сундука
;
Sub GetPole()
	If UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) <> Pole Then
		UO.FindType( Pole )
		If UO.FindCount() == 0 Then
			UO.FindType( Pole, -1, Trum )
			If UO.FindCount() == 0 Then
				UO.Print( 'Pole not found. Script terminated...' )
				UO.Exec( 'terminate FightElem' )
				UO.Exec( 'terminate Fishing' )
				return
			Endif
			UO.MoveItem( 'finditem' )
			repeat
				wait(100)
			until UO.Count( Pole ) > 0
		Endif
		UO.Equipt( 'Lhand', Pole )
		repeat
			wait(100)
		until UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Pole
	Endif
endsub

; ================================================================
; Функция DropPole() - сбросить удочку из рук в сундук
;
Sub DropPole()
	VAR i = UO.Count( Pole )
	VAR j
	If i == 0 Then
		return
	Endif
	While i > 1
		UO.FindType( Pole )
		UO.MoveItem( 'finditem', 0 , Trum )
		j = i - 1
		repeat
			wait(100)
		until j == UO.Count( Pole )
		i = i - 1
	Wend
	If UO.GetGraphic( UO.ObjAtLayer( 'Lhand' ) ) == Pole Then 
		DeleteJournal( 'You put the fishing pole' )
		UO.UnEquip( 'Lhand' )
		wait(500)
	Endif
;	UO.FindType( Pole )
;	UO.MoveItem( 'finditem', 0, Trum )
;	repeat
;		wait(100)
;	until UO.Count( Pole ) == 0
endsub

; ================================================================
; Функция CastSpell() - кастуем на себя заклинание
;
Sub CastSpell( nam )
	If nam == 'Bless' Then
		GetRegs( 'GL', 1 )
		GetRegs( 'MR', 1 )
		UO.WaitTargetSelf()
		UO.Cast( 'Bless' )
	Endif
	If nam == 'Dispel' Then
		GetRegs( 'GL', 1 )
		GetRegs( 'MR', 1 )
		GetRegs( 'SA', 1 )
		UO.WaitTargetSelf()
		UO.Cast( 'Bless' )
	Endif
	wait(4000)
endsub

; ================================================================
; Функция GetRegs() - взять нужный рег в нужном колве из сундука 2
;
Sub GetRegs( nam, kolvo )
	VAR BP = '0x0F7A'		; Black Pearl
	VAR BM = '0x0F7B'		; Bood Moss
	VAR GA = '0x0F84'		; garlic
	VAR GI = '0x0F85'		; Ginseng
	VAR MR = '0x0F86'		; Mandrake Root
	VAR NS = '0x0F88'		; Night Shade
	VAR SA = '0x0F8C'		; Sulphorous Ash
	VAR SS = '0x0F8D'		; Spiders Silk
	If nam == 'BP' Then
		UO.FindType( nam, '0x0000', Trum2 )
	Else
		UO.FindType( nam, -1, Trum2 )
	Endif
	If UO.FindCount() == 0 Then
		return
	Else
		UO.MoveItem( 'finditem', kolvo )
		repeat
			wait(100)
		until UO.Count( nam ) == kolvo
	Endif
endsub

; ================================================================
; Функция RemoveRegs() - сбросить все лишние реги в сундук 2
;
Sub RemoveRegs()
	DIM Regs[8]
	Regs[0] = '0x0F7A'		; Black Pearl
	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 i
	For i = 0 To 7
		UO.FindType( Regs[i] )
		While UO.FindCount() > 0
			UO.MoveItem( 'finditem', -1, Trum2 )
			wait(1000)
			UO.FindType( Regs[i] )
		Wend
	Next
endsub

; ================================================================
; Функция RestoreChar() - вылечить чара, снять курсу если надо
;                         (диспел, потом блесс)
Sub RestoreChar( flag )
	If flag == 0 Then
		If UO.Count( Bandag ) > 0 Then
			UO.Bandageself()
			wait( 300 )
		Endif
		return
	Endif
	If UO.Life == 150 Then
		return
	Endif
	; посмотрим, надо ли снимать курсу с чара
#	If UO.Str < 150 Then
#		; на нас курса, надо взять реги из трюма-2 и наложить
#		; на себя сначала диспел, потом блесс
#		CastSpell( 'Bless' )
#		CastSpell( 'Dispel' )
#		RemoveRegs()
#	Endif
	; теперь лечим чара до упора
	UO.FindType( Bandag, -1, Trum )
	If UO.FindCount() > 0 Then
		UO.MoveItem( 'finditem', '10' )
		wait(1000)
		repeat
			UO.Bandageself()
			wait(3000)
		until UO.Life == 150
		; скинем в трюм остаток бинтов и использованные бинты
		UO.FindType( Bandag )
		If UO.FindCount() > 0 Then
			UO.MoveItem( 'finditem', 0, Trum )
			wait(1000)
		Endif
		UO.FindType( BlBandag )
		If UO.FindCount() > 0 Then
			UO.MoveItem( 'finditem', 0, Trum )
			wait(1000)
		Endif
	Else
		repeat
			wait(500)
		until UO.Life == 150
	Endif
endsub

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

; ============= HIDE ===
; заходим в хайд или контролируем его.
;
sub Hide() 
	While UO.Dead()
		wait(100)
	Wend
	While not UO.Hidden() 
		UO.UseSkill('Hiding') 
		Wait(4000) 
	Wend
endsub

sub test1()
	If UO.Life < 150 Then
		UO.Print( 'TEST. Restore chars...' )
		RestoreChar( 0 )
		UO.Print( 'TEST. Get weapons back...' )
		GetWeapon()
	Endif
endsub

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

sub test2()
	UO.Print( str( UO.Str ) )
endsub