Page 1 of 1

Скрипт на собирание дерьма в конюшне. Кому надо? :)

Posted: 2005-02-07 18:56:25
by Edred
Вот, попросили меня тут наваять такой скриптец. Наваял. Заодно сюда кидаю, может еще кому пригодится... ;)

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

Posted: 2005-02-08 02:43:11
by autopilot
Ну вот теперь все дерьмо будут собирать ходя по одному маршруту )

Posted: 2005-02-08 15:25:03
by Edred
В скрипте маршрут прописан для примера на части конюшни. Вписать нужный маршрут - не требует какого-либо знания скриптов. Там же все тривиально.

Posted: 2005-02-15 14:11:53
by $oK0JI
А для рубки на каторге и относа в столб можеш написать плиз?

Posted: 2005-02-15 22:17:28
by Goggy
$oK0JI wrote:А для рубки на каторге и относа в столб можеш написать плиз?
он уже есть тока мозгами надо те хоть попытаться пошевелить и он будет и у тя тоже :mrgreen: