Частный случай БС для DRW: делаем фуллы

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
Bambr
Posts: 38
Joined: 2004-06-28 16:28:29
Contact:

Частный случай БС для DRW: делаем фуллы

Post by Bambr »

Code: Select all

sub MakeFull() 
	VAR CCurIng='0x0000', TCurIng=0
	VAR jser, WCurIng=0, Kolvo = 200		; На фулл с запасом
	VAR Sunduk = '0x4024386F'				; Cундук с инготами
	VAR Meshok = '0x0E76'					; Тип мешка для фулов
	VAR CIngots = '0x0000'					; Цвет инготов
	VAR CurMesh, BagForFull='0x4014B1CF'	; Сериал мешка и сумки для них
	
	UO.Print("Script started")
	DIM TIngots[4], Part[7], CIng[14], WIng[14]
	
	TIngots[0]='0x1BEF'				; Типы инготов
	TIngots[1]='0x1BE3'
	TIngots[2]='0x1BF5'
	TIngots[3]='0x1BE9'
	
	Part[0]='Platemail (25'			; Названия частей фулла
	Part[1]='Platemail Legs'
	Part[2]='Heater Shield'
	Part[3]='Platemail Arms'
	Part[4]='Plate Helm'
	Part[5]='Platemail Gauntlets'
	Part[6]='Platemail Gorget'
	
	CIng[0]='0x0750'				; Цвета инготов
	CIng[1]='0x0590'
	CIng[2]='0x060A'
	CIng[3]='0x0488'
	CIng[4]='0x096B'
	CIng[5]='0x0014'
	CIng[6]='0x0193'
	CIng[7]='0x04C2'
	CIng[8]='0x07D5'
	CIng[9]='0x00CE'
	CIng[10]='0x052D'
	CIng[11]='0x0455'
	CIng[12]='0x0028'
	CIng[13]='0x08AF'
	
	WIng[0]='Rusty'					; Названия инготов
	WIng[1]='Old Copper'
	WIng[2]='Dull Copper'
	WIng[3]='Bronze'
	WIng[4]='Shadow'
	WIng[5]='Rose'
	WIng[6]='Agapite'
	WIng[7]='Blood Rock'
	WIng[8]='Verite'
	WIng[9]='Valorite'
	WIng[10]='Mytheril'
	WIng[11]='Black Rock'
	WIng[12]='Obsidian'
	WIng[13]='Plutonium'
	
	UO.IgnoreReset()
	UO.DeleteJournal()
	UO.UseObject(Sunduk)
	For Var k=0 to 3						; Узнаем тип
		UO.FindType(TIngots[k],-1,Sunduk)	; Ищем любые инготы в сундуке
		If UO.FindCount() > 0 Then
			If UO.GetColor('finditem') == '0x0000' AND k == 0 Then
				UO.MSG("I make a iron full!")
				MakeIron(TIngots[k],'0x0000',Kolvo,Sunduk,Meshok,BagForFull)
				Return
			Else
				If UO.GetQuantity('finditem') < Kolvo Then	; Для фула мало инготов
					UO.MSG("I need "+STR(Kolvo)+" or more ingots")
					UO.MoveItem('finditem','0',BagForFull)
					Wait(500)
					Return
				Else
					If TCurIng == 0 Then
						TCurIng=TIngots[k]
					EndIf
					If UO.GetColor('finditem') == CIng[2] Then
						UO.MSG("Dull Copper? I not make this full.")
						UO.MoveItem('finditem',-1,BagForFull)
						Wait(500)
						Return
					EndIf
					If UO.GetColor('finditem') == CIng[3] Then
						UO.MSG("Bronze? I not make this full.")
						UO.MoveItem('finditem',-1,BagForFull)
						Wait(500)
						Return
					EndIf
					UO.Print("Avaible is "+STR(UO.GetQuantity('finditem'))+" ingots.")
					UO.Print("Ingots type is "+TIngots[k])
				EndIf
			EndIf
		Else
			If k == 3 AND TCurIng == 0 Then
				UO.Print("No avaible ingots. Script terminated.")
				Return
			EndIf
		EndIf
		Wait(1000)
	Next
	UO.FindType(TCurIng,-1,Sunduk)
	For Var n=0 to 13						; Узнаем цвет
		If CIng[n] == UO.GetColor('finditem') Then
			WCurIng = WIng[n]
			CCurIng = CIng[n]
		EndIf
	Next
	If CCurIng == '0x0000' Then
		If TCurIng == TIngots[1] Then
			WCurIng = 'Copper'
		Else
			If TCurIng == TIngots[2] Then
				WCurIng = 'Silver'
			Else
				If TCurIng == TIngots[3] Then
					WCurIng = 'Golden'
				EndIf
			EndIf
		EndIf
	EndIf
	UO.MSG("Found "+(WCurIng)+" ingots.")
	UO.FindType(Meshok,-1,Sunduk)		; Ищем мешки для фуллов
	If UO.FindCount() == 0 Then
		UO.MSG("No bag - NO FULL !!!")
		Return
	Else
		CurMesh=UO.GetSerial('finditem')
	EndIf
	UO.FindType(TCurIng,CCurIng,Sunduk)
	UO.MoveItem('finditem',STR(Kolvo),'backpack ')	; Забираем скока поднимем
	Wait(500)
	UO.Grab('1',CurMesh)				; Берем мешок в пэк
	Wait(500)
	CheckLag()
	UO.SetCatchBag(CurMesh)			; Всё что сделаем в мешок
	Var i=0
	Repeat
		UO.MSG("Try make the "+WCurIng+" "+Part[i])
		UO.AutoMenu('Blacksmithing','Colored')
		UO.AutoMenu('Colored',WCurIng+' Armor')
		UO.AutoMenu(WCurIng+' Armor',WCurIng+' Plate Armor')
		UO.AutoMenu(WCurIng+' Plate Armor',Part[i])
		Repeat
			jser=0
			UO.FindType(TCurIng,CCurIng,-1)
			IF UO.FindCount() > 0 Then
				UO.DeleteJournal()
				UO.UseObject('finditem')
			Else
				UO.Print("Ingots not found")
				UO.UnSetCatchBag()
				Repeat
					UO.FindType(TCurIng,CCurIng,-1)
					If UO.FindCount() > 0 Then
						UO.MoveItem('finditem','-1',BagForFull)	; Обратно в сундук
						Wait(500)
					EndIf
				Until UO.Count(TCurIng,CCurIng) == 0 		; Все инготы в пэке
				UO.DropHere(CurMesh)
				Wait(500)
				Return
			EndIf
			While NOT UO.InJournal("put") AND NOT UO.InJournal("failed")
				Wait(100)
			WEnd
			If UO.InJournal("put") Then
				jser=1
			EndIf
		Until jser == 1
		i=i+1
		UO.CancelMenu()
	Until i > 6
	UO.UnSetCatchBag()
	Repeat
		UO.FindType(TCurIng,CCurIng,-1)
		If UO.FindCount() > 0 Then
			UO.MoveItem('finditem','-1',BagForFull)	; Обратно в сундук
			Wait(500)
		EndIf
	Until UO.Count(TCurIng,CCurIng) == 0 		; Все инготы в пэке
	UO.MSG("FULL")
	UO.MoveItem(CurMesh,'-1',BagForFull)
	Wait(500)
end sub

sub MakeIron(TCurIng,CCurIng,Kolvo,Sunduk,Meshok,BagForFull)
	Var jser, CurMesh = 0
	
	DIM Part[6]
	
	Part[0]='platemail (25'			; Названия частей фулла
	Part[1]='platemail legs'
	Part[2]='platemail arms'
	Part[3]='plate helm'
	Part[4]='platemail gloves'
	Part[5]='platemail gorget'
	
	UO.FindType(Meshok,-1,Sunduk)
	If UO.FindCount() == 0 Then
		UO.MSG("No bag - NO FULL !!!")
		Return
	Else
		CurMesh=UO.GetSerial('finditem')
	EndIf
	
	UO.FindType(TCurIng,CCurIng,Sunduk)
	If UO.GetQuantity('finditem') < Kolvo Then
		UO.MSG("I need "+STR(Kolvo)+" or more ingots")
		UO.MoveItem('finditem','-1',BagForFull)	; Обратно в сундук
		Wait(500)
		Return
	Else
		UO.MoveItem('finditem',STR(Kolvo),'backpack ')	; Забираем скока поднимем
		Wait(500)
		UO.Grab('1',CurMesh)				; Берем мешок в пэк
		Wait(500)
	EndIf
	CheckLag()
	UO.SetCatchBag(CurMesh)			; Всё что сделаем в мешок
	Var i=0
	Repeat
		UO.MSG("Try make the Iron "+Part[i])
		UO.AutoMenu('Blacksmithing','Armor')
		UO.AutoMenu('Armor','Plate Mail')
		UO.AutoMenu('Plate Mail',Part[i])
		Repeat
			jser=0
			UO.FindType(TCurIng,CCurIng,-1)
			If UO.FindCount() > 0 Then
				UO.DeleteJournal()
				UO.UseObject('finditem')
			Else
				UO.Print("Ingots not found")
				UO.UnSetCatchBag()
				Repeat
					UO.FindType(TCurIng,CCurIng,-1)
					If UO.FindCount() > 0 Then
						UO.MoveItem('finditem','-1',BagForFull)	; Обратно в сундук
						Wait(500)
					EndIf
				Until UO.Count(TCurIng,CCurIng) == 0 		; Все инготы в пэке
				UO.DropHere(CurMesh)
				Wait(500)
				Return
			EndIf
			While NOT UO.InJournal("put") AND NOT UO.InJournal("failed")
				Wait(100)
			WEnd
			If UO.InJournal("put") Then
				jser=1
			EndIf
		Until jser == 1
		i=i+1
		UO.CancelMenu()
	Until i > 5
	UO.MSG("Try make the Iron heater shield")
	UO.AutoMenu('Blacksmithing','Shields')
	UO.AutoMenu('Shields','heater shield')
	UO.DeleteJournal()
	Repeat
		jser=0
		UO.FindType(TCurIng,CCurIng,-1)
		IF UO.FindCount() > 0 Then
			UO.UseObject('finditem')
		Else
			UO.Print("Ingots not found")
			UO.UnSetCatchBag()
			Repeat
				UO.FindType(TCurIng,CCurIng,-1)
				If UO.FindCount() > 0 Then
					UO.MoveItem('finditem','-1',BagForFull)	; Обратно в сундук
					Wait(500)
				EndIf
			Until UO.Count(TCurIng,CCurIng) == 0 		; Все инготы в пэке
			UO.DropHere(CurMesh)
			Wait(500)
			Return
		EndIf
		While NOT UO.InJournal("put") AND NOT UO.InJournal("failed")
			Wait(100)
		WEnd
		If UO.InJournal("put") Then
			jser=1
		EndIf
	Until jser == 1
	UO.CancelMenu()
	UO.UnSetCatchBag()
	Repeat
		UO.FindType(TCurIng,CCurIng,-1)
		If UO.FindCount() > 0 Then
			UO.MoveItem('finditem','-1',BagForFull)	; Обратно в сундук
			Wait(500)
		EndIf
	Until UO.Count(TCurIng,CCurIng) == 0 		; Все инготы в пэке
	UO.MSG("FULL")
	UO.MoveItem(CurMesh,'-1',BagForFull)
	Wait(500)
end sub
Не делает Bronze и Dull Copper потому, что кривые менюшки. Т.е.
1) Blacksmithing -> Colored Armor & Weapons
2) Colored Armor & Weapons -> Bronze Plate Armor
3) Bronze Armor & Weapons -> Bronze Armor & Weapons
4) Bronze Armor & Weapons -> Bronze Plate Helm (для примера)
и как обойти п.п. 3 и 4 не представляю

PS: исправлены мелкие ошибки
Last edited by Bambr on 2004-09-24 17:14:48, edited 2 times in total.
принцип ясен?
Sfagnum
Expert!
Posts: 1284
Joined: 2004-07-04 00:14:58
Contact:

Post by Sfagnum »

Круто... не пробывал, но впечатляет...
есть одно преложение...
дело в том что бывает толпа физлов подряд на одном айтоме, надо сменить айтем и вероятность успеха заметно увеличивается...
у тебя пытается делать айтем до посинения... может имеет после физла переходить к следующему айтему?
в моём представлении надо будет добавить доп массив с изначальным значением 0 (к примеру) и при успешной ковке записывать туда 1 и зациклить выполнение цикла ковки фула, до тех пор пока все значения в доп массиве не будут равны 1.
Bambr
Posts: 38
Joined: 2004-06-28 16:28:29
Contact:

Post by Bambr »

Sfagnum wrote:Круто... не пробывал, но впечатляет...
есть одно преложение...
дело в том что бывает толпа физлов подряд на одном айтоме, надо сменить айтем и вероятность успеха заметно увеличивается...
у тебя пытается делать айтем до посинения... может имеет после физла переходить к следующему айтему?
в моём представлении надо будет добавить доп массив с изначальным значением 0 (к примеру) и при успешной ковке записывать туда 1 и зациклить выполнение цикла ковки фула, до тех пор пока все значения в доп массиве не будут равны 1.
Мысля интересная.
Но здесь вылетает вопрос рандома на шарде: что будет, если рандом сбрасывается при смене действия перса?
Дай формулу рандома и я с радостью изменю значение Kolvo на идеальное. :D
принцип ясен?
Sfagnum
Expert!
Posts: 1284
Joined: 2004-07-04 00:14:58
Contact:

Post by Sfagnum »

Bambr wrote:Мысля интересная.
Но здесь вылетает вопрос рандома на шарде: что будет, если рандом сбрасывается при смене действия перса?
- на это ответить ничего не скажу, просто сделал вывод из практики, а может оно и к лучшему если сбрасывает рандом?
Bambr wrote:Дай формулу рандома и я с радостью изменю значение Kolvo на идеальное. :D
знал бы прикуп жил бы в Сочи(с) :)
Bambr
Posts: 38
Joined: 2004-06-28 16:28:29
Contact:

Post by Bambr »

Исправлен баг с журналом.

заменено

Code: Select all

Repeat
.....
	jser=UO.JournalSerial(UO.InJournal("put"))
Until NOT UO.Journal(ser)=="put"
на

Code: Select all

Repeat
	jser=0
.....
	If UO.InJournal("put") Then
		jser=1
	EndIf
Until jser == 1
Видел у кого-то подобную обработку, но воспроизвести не смог :cry:
принцип ясен?
Sfagnum
Expert!
Posts: 1284
Joined: 2004-07-04 00:14:58
Contact:

Post by Sfagnum »

Bambr wrote:

Code: Select all

Repeat
	jser=0
.....
	If UO.InJournal("put") Then
		jser=1
	EndIf
Until jser == 1
Видел у кого-то подобную обработку, но воспроизвести не смог :cry:
а что не так:

Code: Select all

Repeat
.....
Until UO.InJournal("put")
Bambr
Posts: 38
Joined: 2004-06-28 16:28:29
Contact:

Post by Bambr »

Sfagnum wrote:
Bambr wrote:

Code: Select all

Repeat
	jser=0
.....
	If UO.InJournal("put") Then
		jser=1
	EndIf
Until jser == 1
Видел у кого-то подобную обработку, но воспроизвести не смог :cry:
а что не так:

Code: Select all

Repeat
.....
Until UO.InJournal("put")
проблема в другом: перед Until есть ещё проверка журнала

Code: Select all

While NOT UO.InJournal("put") AND NOT UO.InJournal("failed") 
Wait(100)
WEnd
а т.к. UO.InJournal() работает с последней строкой, и в теле цикла могут быть ещё строки. мне надо, работать не с последней строкой, а с фиксированной, даже если она сдвинулась... бывают варианты, когда между while и until в журнал пишутся ещё строки и скрипт сбивается. так вот у кого-то была проверка с запоминанием номера строки журнала в переменную jser и дальнейшая обработка этой строки .... эээх ... реснуть бы тот кусочек :roll:
принцип ясен?
Sfagnum
Expert!
Posts: 1284
Joined: 2004-07-04 00:14:58
Contact:

Post by Sfagnum »

по поводу проблемы с менюшкой на бронзу и дулл купер...
можно сделать следущим образом:

Code: Select all

UO.MSG("Try make the "+WCurIng+" "+Part[i]) 
UO.AutoMenu('Blacksmithing','Colored') 
if CCurIng = CIng[2] or CCurIng = CIng[3] then		
	UO.AutoMenu('Colored',WCurIng+' Plate Armor') 
	UO.AutoMenu(WCurIng+' Armor & Weapons',WCurIng+' Armor & Weapons') 
	UO.AutoMenu(WCurIng+' Armor & Weapons',Part[i]) 
else
	UO.AutoMenu('Colored',WCurIng+' Armor') 
	UO.AutoMenu(WCurIng+' Armor',WCurIng+' Plate Armor') 
	UO.AutoMenu(WCurIng+' Plate Armor',Part[i]) 
end if
минимум доп кода... а охватывается всё...
ЗЫ менюшку не тестил - проверь...
Sfagnum
Expert!
Posts: 1284
Joined: 2004-07-04 00:14:58
Contact:

Post by Sfagnum »

Bambr wrote:проблема в другом: перед Until есть ещё проверка журнала

Code: Select all

While NOT UO.InJournal("put") AND NOT UO.InJournal("failed") 
Wait(100)
WEnd
а т.к. UO.InJournal() работает с последней строкой,
здесь ты заблуждаешься... с последней строкой работает UO.Journal(0), а UO.InJournal() проверяет наличие слова/выражения во всех актуальных строках журнала...[/quote]
Bambr
Posts: 38
Joined: 2004-06-28 16:28:29
Contact:

Post by Bambr »

Sfagnum wrote:по поводу проблемы с менюшкой на бронзу и дулл купер...
можно сделать следущим образом:

Code: Select all

UO.MSG("Try make the "+WCurIng+" "+Part[i]) 
UO.AutoMenu('Blacksmithing','Colored') 
if CCurIng = CIng[2] or CCurIng = CIng[3] then		
	UO.AutoMenu('Colored',WCurIng+' Plate Armor') 
	UO.AutoMenu(WCurIng+' Armor & Weapons',WCurIng+' Armor & Weapons') 
	UO.AutoMenu(WCurIng+' Armor & Weapons',Part[i]) 
else
	UO.AutoMenu('Colored',WCurIng+' Armor') 
	UO.AutoMenu(WCurIng+' Armor',WCurIng+' Plate Armor') 
	UO.AutoMenu(WCurIng+' Plate Armor',Part[i]) 
end if
минимум доп кода... а охватывается всё...
ЗЫ менюшку не тестил - проверь...
Пробовал. Не работает. Пытался даже пошагово. Но скрипт циклит, т.к. названия у предпоследнего и последнего меню идентичны.
принцип ясен?
Sfagnum
Expert!
Posts: 1284
Joined: 2004-07-04 00:14:58
Contact:

Post by Sfagnum »

Bambr wrote:Пробовал. Не работает. Пытался даже пошагово. Но скрипт циклит, т.к. названия у предпоследнего и последнего меню идентичны.
хреново...
Post Reply