Page 1 of 1

Переделанный скрипт на ламбер.

Posted: 2011-01-31 12:10:25
by Weee
Прекрасно понимаю, что разбираться в этом врядли кому-то захочется, да и кое что тут реализовано через задний проход, но вот переделанный скрипт (оригинал был версия 3.7, реавтор ВЕТЕРАН, шард ДРВ) под абисс и личные предпочтения (работа с рунами из сундука, пополнение регов, реколл скроллов, работа с несколькими файлами, модернизированный уход от пк). На данный момент я взялся за то, чтобы реализовать похожий скрипт на изиуо (либо найти и изменить готовый), но может кому-то резко броситься в глаза что-то, что вызывает краши именно определенных функций. В моем случае крашит CheckingPlayers (проверка на игроков или НПЦ в виде людей) чаще всего. Также иногда (но гораздо реже) крашит и основа для ламбера.

Я постарался оставить как можно больше комментариев в скрипте, чтобы было попроще разобраться.

Кое что тут совсем сырое, прошу не пинать, вот версия без записи координат деревьев в файлы (все личные ID заменены на 0х00000000) :

Code: Select all

sub Main()
	uo.exec('addobject Meshok 0x00000000') ## - Сундук с регами, в который складываем логи.
	uo.setglobal('find','0') ## - глобальная переменная для поиска ПК. 0 - никого не нашли, 1 - нашли.
	## - Добавляем в игнор всех чернорабочих, чтобы друг от друга не улетали:
	uo.ignore('self', 'on')
	uo.ignore('0x00000000', 'on') ## - чар1
	uo.ignore('0x00000000', 'on') ## - чар2
	uo.ignore('0x00000000', 'on') ## - чар3
	uo.ignore('0x00000000', 'on') ## - чар4
;	uo.exec('exec Reconnect') ## - Запускаем функцию реконнекта, пока закомментирована, чтобы не мешало.

	uo.set('finddistance', '30') ## - Дистанция для поиска персонажей.
	## Не знаю какое лучше число, но с 30 идеально определяет еще до того, 
	## как на экране появляется ник персонажа.

	uo.exec('exec Lumberstart') ## - Запускаем первую, стартовую функцию для работы с ламбером.
end sub


## Подобные функции (типа Lumberstart) сделаны для того, чтобы их можно было запускать через uo.exec('exec SUB').
## Это позволяет отчетливо видеть в списке запущенных функций что и как работает,
## на какой конкретно мы локации, что происходит вообще.
## Всё так заморочено для того, чтобы в главные функции передавались нужные параметры и при этом все работало
## в независимом процессе.

## Lumberstart() - это функция для запуска особенной стартовой функции, которая перед вырубкой первого леса
## выполняет ряд действий, необходимых для успешного и благополучного старта.
sub Lumberstart()
	LumberjackingStart(1)
end sub

## Lumber1(), Lumber2() и так далее - стартеры последующих функций для ламбера.
sub Lumber1()
	Lumberjacking(1) ## - параметр это номер зоны, куда летим.
end sub

sub Lumber2()
	Lumberjacking(2)
end sub

sub Lumber3()
	Lumberjacking(3)
end sub

sub Lumber4()
	Lumberjacking(4)
end sub

sub Lumber5()
	Lumberjacking(5)
end sub

sub Lumber6()
	Lumberjacking(6)
end sub


## ChangeFast1, ChangeFast2, .., - это стартеры функций смены локации, передающих параметр реколла со скролла.
sub ChangeFast1()
	ChangeLocationFast(1)
end sub

sub ChangeFast2()
	ChangeLocationFast(2)
end sub

sub ChangeFast3()
	ChangeLocationFast(3)
end sub

sub ChangeFast4()
	ChangeLocationFast(4)
end sub

sub ChangeFast5()
	ChangeLocationFast(5)
end sub

sub ChangeFast6()
	ChangeLocationFast(6)
end sub


## Change1, Change2, .., - это стартеры функций смены локации, передающих параметр реколла с буки.
sub Change1()
	ChangeLocation(1)
end sub

sub Change2()
	ChangeLocation(2)
end sub

sub Change3()
	ChangeLocation(3)
end sub

sub Change4()
	ChangeLocation(4)
end sub

sub Change5()
	ChangeLocation(5)
end sub

sub Change6()
	ChangeLocation(6)
end sub


## Стартовая функция ламбера.
## ZoneNum - это параметр, указывающий куда мы полетим. От 1 до 6.
sub LumberjackingStart(ZoneNum)
	var i=0,j=0,k=0,r=0,q=0,ii,jj, LastLumberRune, NextLumberRune
	var TopX=324,TopY=65 
	dim TreeX[500], TreeY[500],TreeT[500] 
	dim TreeTile[10] 
	var flag=0,TreeCount=0,clicks=0,flag2=0 
	var f=file("C:\lumber data\char1\Trees"+str(ZoneNum)+".dat") ## - Путь к файлу в котором будут хранится
	# координаты Деревьев. 
	var Area=1 ## Размер обрабатываемой территории (Т.к. я изменил скрипт, то просто оставим 1)
	var TryHiding=0 ## 1 - Перед тем как рубить дерево, будет пытаться уйти в хайд, 0 - не будет . 
	var TryRecall=1 ## 1 - После того как соберет LogsQty логов, будет пытаться реколиться домой, 
	# складывать логи в сундук и реколиться обратно, 0 - не будет. 
	var LogsQty=1500 ## Количество логов, добыв которое надо реколиться домой. 
	var GetFromFile=1 ## 1 - Координаты деревьев будут считыватся из файла. 0 - Запишем в файл.
	# Запись в файл я пока удалил, чтобы не мешалось, поэтому оставим GetFromFile=1.

	######################## 
	### Графика деревьев ### 
	######################## 
	TreeTile[0]=3283 
	TreeTile[1]=3277 
	TreeTile[2]=3293 
	TreeTile[3]=3296 
	TreeTile[4]=3302 
	TreeTile[5]=3299 
	TreeTile[6]=3290 
	TreeTile[7]=3288 
	TreeTile[8]=3286 
	TreeTile[9]=3280 
	uo.exec("filterspeech on") 
	uo.exec("filterspeech add 'Where do you want to use the pickaxe?'") 
	uo.print('Choose axe: ') 
	uo.exec('addobject axe') 
	while uo.targeting() 
		wait(100) 
	wend 
	if TryRecall==1 then 
		uo.setglobal('recal', '0') ## - Глобальная переменная, указывающая куда мы полетим.
		# 0 - домой, 1 - 1ая руна, 2 - 2ая руна и т.д.
		uo.print('Choose rune to Home (bank): ') 
		uo.exec('addobject HomeRune 0x00000000') ## Char1
		uo.print('Choose rune to Lumber Zone 1 (chest): ') 
		uo.exec('addobject LumberRune1 0x00000000') 
		uo.print('Choose rune to Lumber Zone 2 (chest): ') 
		uo.exec('addobject LumberRune2 0x00000000') 
		uo.print('Choose rune to Lumber Zone 3 (chest): ') 
		uo.exec('addobject LumberRune3 0x00000000') 
		uo.print('Choose rune to Lumber Zone 4 (chest): ') 
		uo.exec('addobject LumberRune4 0x00000000') 
		uo.print('Choose rune to Lumber Zone 5 (chest): ') 
		uo.exec('addobject LumberRune5 0x00000000') 
		uo.print('Choose rune to Lumber Zone 6 (chest): ') 
		uo.exec('addobject LumberRune6 0x00000000') 
	end if 
	##################################### 
	### Загружаем координаты из файла ### 
	##################################### 
	if GetFromFile==1 then 
		uo.print('Loading coordinates from file...') 
		f.open() 
		TreeCount=safe call f.readNumber() 
		for i=1 to TreeCount 
			TreeT[i]=safe call f.ReadNumber() 
			TreeX[i]=safe call f.ReadNumber() 
			TreeY[i]=safe call f.ReadNumber() 
		next 
		f.close() 
	else
		##Тут должна быть запись координат в файлы, но я этот блок удалил, дабы не отвлекал.##
	end if 
	uo.print('Trees amount: '+str(TreeCount))  ## - Выводим количество деревьев, считанных из файла
	GetReagents() ## - Вызываем функцию проверки и добора регов из сундука.
	uo.setglobal('recal', ZoneNum) ## - Указываем куда летим в первый раз.
	LastLumberRune = val(uo.getglobal('recal')) ## - Временная переменная. Может тут можно реализовать иначе,
	uo.setglobal('LastZone', LastLumberRune) ## - но как есть.. главное, что работает.
	MyRecall(0) ## - Вызов функции реколла, в параметре передается тип: 0 - с буки, 1 - со скролла.
	wait(2000)
	uo.exec('exec CheckingPlayers') ## - Запуск функции проверки на ПК.
	###################################### 
	### Ходим по собранным координатам ### 
	###################################### 
		if TreeCount>0 then
			for i=1 to TreeCount 
				if TryRecall==1 AND uo.Count('ZLK')>=LogsQty then
					uo.setglobal('recal', ZoneNum) ## - сохраняем номер данной локации.
					ToRecall(0) ## - Вызываем функцию "разгрузки".
				end if 
				if val(uo.getglobal('find')) == 1 Then ## - эта переменная приходит с CheckingPlayers.
					UO.Print("LumberStart Return 1") ## - если find=1, значит кого-то нашли,
					return ## - значит выходим из функции lumberstart.
				else ## - если никого не нашли, значит работаем:
					uo.print('Moving to the Tree '+str(i)+': x='+str(Treex[i])+' y='+str(Treey[i])) 
					infologs() 
					if val(uo.getglobal('find')) == 1 Then ## еще одна проверка на ПК.
						UO.Print("LumberStart Return 2")
						return
					endif
					flag=gotoxy(Treex[i],Treey[i]) ## вызываем ходилку.
					if flag==1 then 
						if TryHiding==1 then 
							ToHide() 
						end if 
						GetTree(str(TreeT[i]),str(TreeX[i]),str(TreeY[i]),str(uo.getz())) 
					end if 
				endif
			next 
		end if 
		var ZoneNumNext 
		if ZoneNum == 6 Then ## - если локация 6 (последняя), значит переходим к 1ой.
			ZoneNumNext = 1
		else ## - иначе переходим к следующей.
			ZoneNumNext = ZoneNum + 1 
		endif
		uo.exec('exec Change'+str(ZoneNumNext)) ## запускаем стартер функции по смене локации.
		return
end sub 

## Функция для работы с последующими локациями. Тут все практически идентично с LumberjackingStart(ZoneNum).
sub Lumberjacking(ZoneNum)
	var i=0,j=0,k=0,r=0,q=0,shit=0,ii,jj 
	var TopX=324,TopY=65 
	dim TreeX[500], TreeY[500],TreeT[500] 
	dim TreeTile[10] 
	var flag=0,TreeCount=0,clicks=0,flag2=0 
	var f=file("C:\lumber data\Char1\Trees"+str(ZoneNum)+".dat")
	var Area=1
	var TryHiding=0
	var TryRecall=1
	var LogsQty=1500 
	var GetFromFile=1

	if GetFromFile==1 then 
		uo.print('Loading coordinates from file...') 
		f.open() 
		TreeCount=safe call f.readNumber() 
		for i=1 to TreeCount 
			TreeT[i]=safe call f.ReadNumber() 
			TreeX[i]=safe call f.ReadNumber() 
			TreeY[i]=safe call f.ReadNumber() 
		next 
		f.close()
	endif
	uo.print('Trees amount: '+str(TreeCount)) 
	wait(2000) 
	###################################### 
	### Ходим по собранным координатам ### 
	###################################### 
		if TreeCount>0 then 
			for i=1 to TreeCount 
				if TryRecall==1 AND uo.Count('ZLK')>=LogsQty then 
					uo.setglobal('recal', ZoneNum)
					ToRecall(0) 
				end if 
				if val(uo.getglobal('find')) == 1 Then
					UO.Print("Lumber Return 1")
					return
				else
					uo.print('Moving to the Tree '+str(i)+': x='+str(Treex[i])+' y='+str(Treey[i])) 
					infologs() 
					if val(uo.getglobal('find')) == 1 Then
						UO.Print("Lumber Return 2")
						return
					endif
					flag=gotoxy(Treex[i],Treey[i]) 
					if flag==1 then 
						if TryHiding==1 then 
							ToHide() 
						end if 
						GetTree(str(TreeT[i]),str(TreeX[i]),str(TreeY[i]),str(uo.getz())) 
					end if 
				endif
			next 
		end if 
		var ZoneNumNext
		if ZoneNum == 6 Then
			ZoneNumNext = 1
		else
			ZoneNumNext = ZoneNum + 1
		endif
		uo.exec('exec Change'+str(ZoneNumNext))
		return
end sub

## Переходная функция для смены локации.
sub ChangeLocation(ZoneNum)
	uo.setglobal('recal', ZoneNum)
	ToRecall(0) ## разгружаемся.
	if ZoneNum == 1 Then
		uo.exec('exec Lumber1')
	endif
	if ZoneNum == 2 Then
		uo.exec('exec Lumber2')
	endif
	if ZoneNum == 3 Then
		uo.exec('exec Lumber3')
	endif
	if ZoneNum == 4 Then
		uo.exec('exec Lumber4')
	endif
	if ZoneNum == 5 Then
		uo.exec('exec Lumber5')
	endif
	if ZoneNum == 6 Then
		uo.exec('exec Lumber6')
	endif
end sub

## Переходная функция для смены локации с использованием реколл скроллов.
sub ChangeLocationFast(ZoneNum)
	uo.setglobal('recal', ZoneNum)
	ToRecall(1)
	if ZoneNum == 1 Then
		uo.exec('exec Lumber1')
	endif
	if ZoneNum == 2 Then
		uo.exec('exec Lumber2')
	endif
	if ZoneNum == 3 Then
		uo.exec('exec Lumber3')
	endif
	if ZoneNum == 4 Then
		uo.exec('exec Lumber4')
	endif
	if ZoneNum == 5 Then
		uo.exec('exec Lumber5')
	endif
	if ZoneNum == 6 Then
		uo.exec('exec Lumber6')
	endif
end sub

## Вырубка определенного дерева (не изменял, только добавил пару проверок с uo.getglobal('find') (поиск пк))
sub GetTree(type,x,y,z) 
	var i 
	uo.print('Starting lumberjacking...') 
	for i=0 to 15 
		if val(uo.getglobal('find')) == 1 Then
			UO.Print("GetTree Return 1")
			return
		else
		if uo.warmode()==1 then 
			return 0 
		end if 
		wait(200) 
		uo.deletejournal() 
		uo.waittargettile(type,x,y,z) 
		uo.useobject('axe') 
		if WaitForChange()==1 then 
			return 1 
		end if 
		endif
	next 
	return 0 
end sub 

## - Функция разгрузки. RecallType: 0 - с рунбуки, 1 - с реколл скролла.
sub ToRecall(RecallType) 
	VAR Meshok='0x00000000' ## - ID сундука в который чар должен складывать логи 
	VAR LastLumberRune
	LastLumberRune = val(uo.getglobal('recal'))
	uo.setglobal('LastZone', LastLumberRune)
	uo.setglobal('recal', '0') ## - Выбираем руну для телепорта домой
	if RecallType == 0 Then ## - Если реколимся по буке, значит реколл спровоцирован не уходом от ПК.
		uo.exec('terminate CheckingPlayers') ## - следовательно убиваем функцию проверки на ПК.
	endif
	MyRecall(RecallType) ## - Телепортимся домой (ведь глобальная функция recal = 0).
	wait(500) 
	repeat 
		wait(500) 
		repeat 
			wait(500) 
			repeat 
				wait(600) 
				UO.SetReceivingContainer(Meshok) ## Тут все, что связано с разгрузкой.
				uo.findtype('ZLK') ## Работает все идеально.
				wait(500) 
				UO.Grab('all','finditem') 
				infologs() 
				wait(500) 
			until uo.GetQuantity('finditem')==0 
			UO.UnSetReceivingContainer() 
			UO.SetReceivingContainer(Meshok) 
			uo.findtype('ZLK') 
			wait(500) 
			UO.Grab('all','finditem') 
			infologs() 
			wait(500) 
		until uo.GetQuantity('finditem')==0 
		UO.UnSetReceivingContainer() 
		UO.SetReceivingContainer(Meshok) 
		uo.findtype('ZLK') 
		wait(500) 
		UO.Grab('all','finditem') 
		infologs() 
		wait(500) 
	until uo.GetQuantity('finditem')==0 
	UO.UnSetReceivingContainer() 
	GetReagents() ## - Пополняем ресурсы.
	uo.setglobal('recal', LastLumberRune) ## - Выбираем руну для телепорта в лес.
	MyRecall(0) ## Реколимся по рунбуке в лес.
	wait(2000)
	uo.exec('exec CheckingPlayers') ## Как прилетели - запускаем проверку на ПК.
end sub 

## Функция пополнения регов и скроллов. Работает идеально.
sub GetReagents()
	UO.UnSetReceivingContainer()  
	UO.UseObject('0x00000000') ## - Открывает сундук. Просто, чтобы увидеть сколько там логов и регов.
	VAR ReagentDiff
	## - Берем реги и реколл скроллы из сундука:
	If UO.GetQuantity( '^0x1F4C' ) < 4 Then
		ReagentDiff = 4 - UO.GetQuantity('^0x1F4C')
		uo.moveitem('Meshok.0x1F4C', ReagentDiff) 
	endif
	wait(500)
	if UO.BM < 15 Then
		ReagentDiff = 15 - UO.BM
		uo.moveitem('Meshok.0x0F7B', ReagentDiff) 
	endif
	wait(500)
	if UO.BP < 15 Then
		ReagentDiff = 15 - UO.BP
		uo.moveitem('Meshok.0x0F7A', ReagentDiff) 
	endif
	wait(500)
	if UO.MR < 15 Then
		ReagentDiff = 15 - UO.MR
		uo.moveitem('Meshok.0x0F86', ReagentDiff) 
	endif
	wait(500)
	UO.UnSetReceivingContainer() 
end sub

## Отвечает за хайд, работает идеально.
sub ToHide() 
	while not UO.Hidden() 
		uo.print('Trying to hide...') 
		uo.deletejournal() 
		UO.UseSkill("Hiding") 
		wait(4100) 
	wend 
	wait(100) 
end sub 

## Функция, отвечающая непосредственно за реколл по нужной руне. Работает на ура.
## RecallType: 0 - по рунбуке, 1 - по скроллу
sub MyRecall(RecallType)
	VAR a, b, c 
	VAR d = uo.getx('self')
	if RecallType == 0 Then 
		repeat
			while uo.mana < 11 
				uo.warmode('0') 
				uo.useskill('Meditation') 
				wait(1000) 
			wend
			a = 0
			uo.deletejournal()
			if val(uo.getglobal('recal')) == 0 then ## - летим домой.
				uo.waittargetobject('HomeRune') 
				uo.cast('Recall') 
			else 
				wait(50) 
			endif
			if val(uo.getglobal('recal')) == 1 then ## - летим в лес1.
				uo.waittargetobject('LumberRune1') 
				uo.cast('Recall') 
			else 
				wait(50) 
			endif
			if val(uo.getglobal('recal')) == 2 then ## - летим в лес2.
				uo.waittargetobject('LumberRune2') 
				uo.cast('Recall') 
			else 
				wait(50) 
			endif
			if val(uo.getglobal('recal')) == 3 then ## - летим в лес3.
				uo.waittargetobject('LumberRune3') 
				uo.cast('Recall') 
			else 
				wait(50) 
			endif
			if val(uo.getglobal('recal')) == 4 then ## - летим в лес4.
				uo.waittargetobject('LumberRune4') 
				uo.cast('Recall') 
			else 
				wait(50) 
			endif
			if val(uo.getglobal('recal')) == 5 then ## - летим в лес5.
				uo.waittargetobject('LumberRune5') 
				uo.cast('Recall') 
			else 
				wait(50) 
			endif
			if val(uo.getglobal('recal')) == 6 then ## - летим в лес6.
				uo.waittargetobject('LumberRune6') 
				uo.cast('Recall') 
			else 
				wait(50) 
			endif
			repeat 
				wait(100) 
				a = a + 1
			until a > 35 or d <> uo.getx('self') or uo.injournal('The spell fizzles.') 
			wait(500) 
		until not uo.injournal('The spell fizzles.')
	else
		repeat
			while uo.mana < 11 
				uo.warmode('0') 
				uo.useskill('Meditation') 
				wait(1000) 
			wend
			a = 0
			uo.deletejournal()
			if val(uo.getglobal('recal')) == 0 then ## - летим по скроллу домой.
				uo.waittargetobject('HomeRune') 
				uo.usetype('0x1F4C')
			else 
				wait(50) 
			endif
			if val(uo.getglobal('recal')) == 1 then ## - летим по скроллу в лес1.
				uo.waittargetobject('LumberRune1') 
				uo.usetype('0x1F4C')
			else 
				wait(50) 
			endif
			if val(uo.getglobal('recal')) == 2 then ## - летим по скроллу в лес2.
				uo.waittargetobject('LumberRune2') 
				uo.usetype('0x1F4C')
			else 
				wait(50) 
			endif
			if val(uo.getglobal('recal')) == 3 then ## - летим по скроллу в лес3.
				uo.waittargetobject('LumberRune3') 
				uo.usetype('0x1F4C')
			else 
				wait(50) 
			endif
			if val(uo.getglobal('recal')) == 4 then ## - летим по скроллу в лес4.
				uo.waittargetobject('LumberRune4') 
				uo.usetype('0x1F4C')
			else 
				wait(50) 
			endif
			if val(uo.getglobal('recal')) == 5 then ## - летим по скроллу в лес5.
				uo.waittargetobject('LumberRune5') 
				uo.usetype('0x1F4C')
			else 
				wait(50) 
			endif
			if val(uo.getglobal('recal')) == 6 then ## - летим по скроллу в лес6.
				uo.waittargetobject('LumberRune6') 
				uo.usetype('0x1F4C')
			else 
				wait(50) 
			endif
			repeat 
				wait(100) 
				a = a + 1
			until a > 30 or d <> uo.getx('self') or uo.injournal('The spell fizzles.') 
			wait(500) 
		until not uo.injournal('The spell fizzles.')
	endif
end sub

## Проверка для вырубки дерева. Подправил под aбиcc + добавил проверки на uo.getglobal('find') (для ухода от пк).
sub WaitForChange() 
	var Text1='You hack at the tree for a while, but fail to produce any useable wood.' 
	var Text2='There are no logs left here to chop.' 
	var Text3="You can't reach this." 
	var Text4="That's too far away to chop." 
	var mess 
	for var i=0 to 200 
		if val(uo.getglobal('find')) == 1 Then ## проверка на пк.
			UO.Print("WaitForChange Return 1")
			return
		else
		mess=uo.journal(0) 
		if uo.Journal(0)==Text2 OR uo.Journal(0)==Text3 OR uo.Journal(0)==Text4 then 
			return 1 
		end if 
		if uo.Journal(0)==Text1 then 
			return 0 
		end if 
		if mess[0]=='Y' AND mess[1]=='o' AND mess[2]=='u' AND mess[4]=='p' AND mess[5]=='u' AND mess[6]=='t' then 
			return 0 
		end if 
		wait(50) 
		endif
	next 
	return 0 
end sub 

## - Ходилка. Работает вообще отлично, но пришлось добавить очень много проверок на ПК, чтобы
## - как можно быстрей завершилась работа всех функций и перешло к работе со следующей локацией.
sub gotoXY(x,y) 
	var myX,myY,lastX=0,lastY=0,i,halt=0,z,r=0 
	for i=1 to 60 
		if val(uo.getglobal('find')) == 1 Then
			UO.Print("gotoXY Return 1")
			return
		else
		MyX=uo.getX(); 
		MyY=uo.getY(); 
		if LastX==MyX AND LastY==MyY then 
			halt=halt+1 
		else 
			halt=0 
		end if 
		if halt>=10 then 
			if uo.GetDir()==1 then 
				for z=0 to 8 
					if val(uo.getglobal('find')) == 1 Then
						UO.Print("gotoXY Return 2")
						return
					endif
					uo.press(40) 
				next 
			end if 
			if uo.GetDir()==3 then 
				for z=0 to 8 
					if val(uo.getglobal('find')) == 1 Then
						UO.Print("gotoXY Return 3")
						return
					endif
					uo.press(37) 
				next 
			end if 
			if uo.GetDir()==5 then 
				for z=0 to 8 
					if val(uo.getglobal('find')) == 1 Then
						UO.Print("gotoXY Return 4")
						return
					endif
					uo.press( 38 ) 
				next 
			end if 
			if uo.GetDir()==7 then 
				for z=0 to 8 
					if val(uo.getglobal('find')) == 1 Then
						UO.Print("gotoXY Return 5")
						return
					endif
					uo.press(39) 
				next 
			end if 
			halt=15 
		end if 
		if abs(x-myX)<=1 AND abs(y-myY)<=2 then 
			return 1 
		end if 
		if x<=MyX then 
			if y<=MyY then 
				for z=0 to 3 
					if val(uo.getglobal('find')) == 1 Then
						UO.Print("gotoXY Return 6")
						return
					endif
					uo.press( 38 ) 
				next 
			else 
				for z=0 to 3 
					if val(uo.getglobal('find')) == 1 Then
						UO.Print("gotoXY Return 7")
						return
					endif
					uo.press(37) 
				next 
			end if 
		else 
			if y<=MyY then 
				for z=0 to 3 
					if val(uo.getglobal('find')) == 1 Then
						UO.Print("gotoXY Return 8")
						return
					endif
					uo.press(39) 
				next 
			else 
				for z=0 to 3 
					if val(uo.getglobal('find')) == 1 Then
						UO.Print("gotoXY Return 9")
						return
					endif
					uo.press(40) 
				next 
			end if 
		end if 
		lastX=myX 
		lastY=myY 
		wait(200) 
		endif
	next 
	return 0 
end sub 

sub abs(num) 
	if num>=0 then 
		return num 
	else 
		return num*(-1) 
	end if 
end sub 

## Информация по количеству вырубленных деревьев.
sub infologs() 
	UO.Print('You have got '+Str(UO.Count('0x1BDD'))+' logs in your shitbag') 
	UO.Print('Also '+Str(UO.Count('0x1BDD','0x0000'))+' usual and ' +str(uo.count('0x1BDD')-uo.count('0x1BDD','0x0000'))+' colored') 
end sub 

## Функция реконнекта. Не используется на данный момент.
sub Reconnect() 
	var ReconnectTime,rFlag 
	ReconnectTime='0' 
	rFlag=1 
	repeat 
	while (uo.ObjAtLayer('Bpack')=='') 
		if rFlag then 
			ReconnectTime=MakeTime() 
			rFlag=0 
		end if 
		wait(20000) 
		uo.Say('') 
		wait(3000) 
		uo.Say('') 
		wait(3000) 
		uo.Say('') 
		wait(3000) 
		uo.LdblClick(357,164) 
		uo.Lclick(616,459) 
		wait(3000) 
	wend 
	wait(3000) 
	if (rFlag==0) and (ReconnectTime<>'0') then 
		uo.TextOpen() 
		uo.TextPrint('Disconnected & Reconnected @ '+ReconnectTime) 
		rFlag=1 
		ReconnectTime='0' 
	end if 
	until false 
end sub

## Функция для работы Reconnect(). Не используется на данный момент.
sub MakeTime() 
	var d,t,ret,i 
	ret=str(uo.Time()) 
	t="" 
	for i=0 to Len(ret) 
		t=ret[Len(ret)-i]+t 
		if (i==2) or (i==4) then 
			t=":"+t 
		end if 
	next 
	ret=str(uo.Date()) 
	d="" 
	for i=0 to Len(ret) 
		d=ret[Len(ret)-i] + d 
		if (i==2) or (i==4) then 
			d="."+d 
		end if 
	next 
	ret=t+" @ "+d 
	return ret 
end sub 

## Функция для работы Reconnect(). Не используется на данный момент.
sub Time() 
	var hh,mm,ss,hms,t=str(uo.Time()) 
	if len(t)<=2 then 
		hh="0" 
		mm="0" 
		ss=t 
	endif 
	if len(t)==3 then 
		hh="0" 
		mm=left(t,len(t)-2) 
		ss=right(t,len(t)-1) 
	endif 
	if len(t)==4 then 
		hh="0" 
		mm=left(t,len(t)-2) 
		ss=right(t,len(t)-2) 
	endif 
	if len(t)==5 then 
		hh=left(t,len(t)-4) 
		hms=left(t,len(t)-2) 
		mm=right(hms,len(hms)-1) 
		ss=right(t,len(t)-3) 
	endif 
	if len(t)==6 then 
		hh=left(t,len(t)-4) 
		hms=left(t,len(t)-2) 
		mm=right(hms,len(hms)-2) 
		ss=right(t,len(t)-4) 
	endif 
	return hh+":"+mm+":"+ss 
end sub


## САМЫЙ ГЛАВНЫЙ ВИНОВНИК (как мне кажется) ВСЕХ КРАШЕЙ! Проверка на игроков (ПК).
sub CheckingPlayers() 
		VAR a, b
		uo.setglobal('find','0') ## - Устанавливаем find на 0, чтобы работали все функции по вырубке.
		DIM Chars[2] 
		Chars[0] = '0x0190' ## - Тип male.
		Chars[1] = '0x0191' ## - Тип female.
		while not uo.dead() 
			for a = 0 to 1 ## - Перебираем типы male/female.
				uo.findtype(Chars[a], '-1', '1')  ## - ищем вокруг себя на расстоянии finddistance.
				if uo.findcount() > 0 then ## - если хоть кого-то нашли, значит пора валить.
					uo.print('GTFO ASAP!!1')

					uo.setglobal('find','1') ## устанавливаем find на 1.
					## Теперь сработают все проверки на ПК в других функциях.

					## Проверяем какая была последняя локация (С которой собираемся
					## уходить) и запускаем стартер перехода на следующую.
					if val(uo.getglobal('LastZone')) == 1 Then
						uo.exec('exec ChangeFast2')
					endif
					if val(uo.getglobal('LastZone')) == 2 Then
						uo.exec('exec ChangeFast3')
					endif
					if val(uo.getglobal('LastZone')) == 3 Then
						uo.exec('exec ChangeFast4')
					endif
					if val(uo.getglobal('LastZone')) == 4 Then
						uo.exec('exec ChangeFast5')
					endif
					if val(uo.getglobal('LastZone')) == 5 Then
						uo.exec('exec ChangeFast6')
					endif
					if val(uo.getglobal('LastZone')) == 6 Then
						uo.exec('exec ChangeFast1')
					endif
					return ## закрываем
				else 
					wait(500) 
				endif 
			next 
		wend 
end sub

Вот, пожалуй, и все. Надеюсь кто-нибудь сможет разобраться - я попытался объяснить все наиболее доходчиво.

Без координат на вырубку оно не заработает. Тестить такой скрипт думаю займет слишком много времени, поэтому просто вопрос в основном по CheckingPlayers(). Что в нем не так? Может кто-то видит, что тут может вызывать краш "Unhandled exception in parser"?

У меня было подозрение на слишком большой finddistance (30), но я поставил 15 и все осталось по прежнему. Менял галки в самом инжекте.
Оставлял только необходимое TUS bb-fix, No client hung message, Version 1.26.4, пробовал включать-выключать Track world items.

Также инжект работает через 1 ядро (а точней так настроены работать ylaunch и ilaunch). Пробовал включать/выключать anticrash.

Все равно падает.

Теперь есть подозрение на то, что слишком часто ведется поиск на игроков. И через время скрипт вываливается, хотя вчера он у меня проработал часа 3-4 без остановки, в итоге я не дождался краша и выключил его, пошел спать.

Еще хочу заметить, что краш происходит только в лесу. Ниразу не было краша в реколке. И из всех функций отключается только CheckingPlayers. После чего инжа не может нормально ничего делать и приходится перезапускать УО.

Re: Переделанный скрипт на ламбер.

Posted: 2011-02-01 08:25:20
by Mirage
Данная ошибка часто возникает на >1 ядерных процессорах.
Вот здесь один из способов уменьшить вероятность ее словить
Нужно задать соответствие любому из ядер процессора клиенту игры.

Радиус максимально доступный игроку = 28 тайлов. Есть специально модифицированные клиенты (там пару строк поменять нужно) с расширенным углом обзора. Максимальная дистанция до статики и игроков = 28 тайлов.

Типов деревьев немного больше чем задействовано в скрипте. Хотя это может зависеть от шарда и вердаты. На нашем было 29 тайлов, у знакомых рубились 34 вида деревьев. Снять типы можно в программе InsideUO.

Так же можно попробовать уменьшить выпадение ошибки если сканер ПК не зацикливать в параллельно запущенной функции а запускать в ключевых местах как 1 разовую проверку.

Хотел спросить зачем такая сложная система разгрузки? 3 раза в цикле запускать одну и ту же функцию? Достаточно найти тип логов в паке и перемещать их пока тип есть в паке - 1 цикл.

Re: Переделанный скрипт на ламбер.

Posted: 2011-02-01 10:53:40
by Weee
Mirage wrote:Данная ошибка часто возникает на >1 ядерных процессорах.
Вот здесь один из способов уменьшить вероятность ее словить
Нужно задать соответствие любому из ядер процессора клиенту игры.

Радиус максимально доступный игроку = 28 тайлов. Есть специально модифицированные клиенты (там пару строк поменять нужно) с расширенным углом обзора. Максимальная дистанция до статики и игроков = 28 тайлов.

Типов деревьев немного больше чем задействовано в скрипте. Хотя это может зависеть от шарда и вердаты. На нашем было 29 тайлов, у знакомых рубились 34 вида деревьев. Снять типы можно в программе InsideUO.

Так же можно попробовать уменьшить выпадение ошибки если сканер ПК не зацикливать в параллельно запущенной функции а запускать в ключевых местах как 1 разовую проверку.

Хотел спросить зачем такая сложная система разгрузки? 3 раза в цикле запускать одну и ту же функцию? Достаточно найти тип логов в паке и перемещать их пока тип есть в паке - 1 цикл.
Отлично! Спасибо за советы, попробую.

Я думал надо задавать соответствие инжектолаунчеру. Обязательно попробую с клииентом.

По поводу угла обзора - это про разрешение? Оно увеличено, но я знаю, что эти 28 тайлов зависят от сервера. Спасибо за точную цифру, буду знать.

По поводу типов деревьев тоже посмотрю, но врядли это вызывает краш, скорее наоборот. Вердата у меня стоит где все деревья = пеньки. Не знаю влияет ли это на инжект.

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

Честно говоря это мой первый блин, который вышел комом. Система разгрузки, вроде бы, была такая в оригинальном скрипте - я её не изменял. Проверил, работает, оставил как есть. Из-за неё ниразу не крашило. Сегодня ночь провел за вспоминанием LUA (еще со времен ворлд оф варкрафта) и мучаньем различными командами OpenEUO. Заодно потихоньку сел переписывать одну за другой функции, все по порядку... Переделал схему, по которой все зациклено, додумал многое другое, да и вообще поаккуратней сделал :) Более универсально. Пока только ходилку сделал с жалкими попытками обойти препятствия (которые, кстати, проходятся на ура, но, к примеру, из дома выйти не может. Тем не менее UO.Move(x,y,погрешность,таймаут) в Изи очень здорово. Думаю вот сделать проверку если не может с мувом - чтоб юзал pathfinding.).

Так что вот так. Попробую еще помучать этот скрипт на инже, может заодно почищу его. Начну, пожалуй, с соответствия.

Re: Переделанный скрипт на ламбер.

Posted: 2011-02-01 11:51:07
by Mirage
Комом это когда не работает. А так - просто оптимизация кода ;)
У меня выгрузка сделана следующим образом:

Code: Select all

;put(log,logcont) ; скинуть тип логов в сундук

Sub PUT(item, cont) ; (type, ID)
	while UO.Count( item ) > 0
		UO.FindType( item, -1, -1 )
                itemM=UO.GetSerial('finditem')
                timemove=UO.Timer()
				UO.MoveItem( 'finditem', 0, cont )
                while UO.ContainerOf(itemM)=='my' && timemove+20>UO.Timer()
                    wait(300)
                wend
	wend
end sub
А насчет типов деревьев - если будут учтены все типы то рубить больше деревьев будет.

Re: Переделанный скрипт на ламбер.

Posted: 2011-02-01 13:33:05
by Weee
Mirage wrote:Комом это когда не работает. А так - просто оптимизация кода ;)
У меня выгрузка сделана следующим образом:

Code: Select all

;put(log,logcont) ; скинуть тип логов в сундук

Sub PUT(item, cont) ; (type, ID)
	while UO.Count( item ) > 0
		UO.FindType( item, -1, -1 )
                itemM=UO.GetSerial('finditem')
                timemove=UO.Timer()
				UO.MoveItem( 'finditem', 0, cont )
                while UO.ContainerOf(itemM)=='my' && timemove+20>UO.Timer()
                    wait(300)
                wend
	wend
end sub
А насчет типов деревьев - если будут учтены все типы то рубить больше деревьев будет.
Да, я уловил суть еще в том посте - так, конечно же, логичней. Сейчас пока вроде не крашит, пробую старый скрипт.

Но т.к. потратил прилично времени на изю - очень хочется заставить её работать. Я обращаюсь командами через клиент (UO.Msg в изи) к инжекту, чтобы выполнять различные действия, записывать объекты, реколиться по руне в банке, рубить деревья. Но очень сильно мешает антифлуд, встроенный в клиент. Не знаешь, может можно как-то выключить его?

Или может есть способ использовать команды инжекта из изи по другому?
На данный момент у меня это выглядит так:

UO.Msg(",addobject HomeRune"..HomeRuneID.."; addobject axe"..string.char(13))
while UO.TargCurs == true do
wait(100)
end

Одной строчкой добавляет объект с айди домашней руны и добавляет топор, потом ждет, пока игрок не выберет его.

Я бы сделал все мне необходимое через ";", но в ультиме ограничение на количество символов, в одной строчке :(

А задержки делать по 2 сек тоже как-то некошерно.

Еще раз извиняюсь, что совсем с другим вопросом.

З.Ы. - пока еще не крашнуло.

Re: Переделанный скрипт на ламбер.

Posted: 2011-02-01 19:17:48
by Mirage
Вот тут тема GMX. Он там придумал нормальное обхождения антимаксроса на Абиссе. Я к сожалению такими вопросами не занимался ибо не играл на таких шардах и лень было просто так заморачиваться :roll:

Антифлуд обойти никак не получится если сфера либо 56b, либо на <56b прописаны нормальные скрипты со стороны сервера.

Топор прописывается по универсальному типу - у него может быть всего 2 типа.

Code: Select all

;********************************
var axe1='0x0F43', axe2='0x0F44'
  ; Auto Tools
    if UO.Count(axe1) || UO.Count(axe2) then
     if UO.Count(axe1) then
      UO.UseType(axe1)
     else
      UO.UseType(axe2)
    endif
    else
 UO.Set('quiet','0')
    UO.Print('А топора то нет!')
     return
    endif
;********************************

В изе можно запускать максрос с нажатия кнопки (топорный метод но в принципе...)

Code: Select all

 Initevents

start:
Move 5958 1432 0 10s
 gosub F
Move 5958 1433 0 10s
 gosub F
Move 5957 1433 0 10s
 gosub F
goto start:

sub F
deletejournal
{
key F11
wait 1S
{
repeat
wait 1S
scanjournal 1
until END in #journal
}
}
return
На F - хоткей exec lumber например, в конце рубки чар пишет в uo.print('END'). Принт журналом отлавливается и цикл в изе перещелкивается. Хотя в изе сам ламбер пишется вроде даже лучше чем на инжекте (с ее встроенной pathfind 5958 1432 ).

А еще если делать в инжекте то мне всегда больше нравилось не тыкать в каждое дерево а искать их через uo.privategettile. Вот примерно такая функция вырубит все окружающие деревья до которых дотянется чар. И надо пометить только координаты где будет стоять чар (сокращения раз в 7 количества точек)

Code: Select all


var allmsg='0xA20D|0xA2DE|0xA2E7|0xA308|0xA309|0xA30D|0xA311|0xA312|ы положили|nothing|ou put|ы ударили по дереву|ou hack at the tree|ут нечего рубить|no logs|ы не можете до этого достать|ou can|reach this|ерево слишком далеко|hat is too far away|do much|то кажется свободным для вашего удара|t appears immune to your blow|атакует'
var endmsg='0xA20D|0xA2DE|0xA2E7|0xA308|0xA309|0xA30D|ут нечего рубить|nothing|no logs|ou can|ы не можете до этого достать|ерево слишком далеко|too far away|свободным для вашего удара'
var axe1='0x0F43', axe2='0x0F44'
sub Lumder()
	var X, Y, MaxRange = 3, MaxVes = 620, k = 0
	for Y = -MaxRange to MaxRange
		for X = -MaxRange to MaxRange
			if Tree(UO.GetX()+X, UO.GetY()+Y) then
				repeat
					UO.DeleteJournal()
					wait(100)
					UO.WaitTargetTile(Tree(UO.GetX()+X, UO.GetY()+Y), UO.GetX()+X, UO.GetY()+Y, UO.GetZ())
					;ToHide()
					;********************************
					; Auto Tools
					if UO.Count(axe1) || UO.Count(axe2) then
						if UO.Count(axe1) then
							UO.UseType(axe1)
						else
							UO.UseType(axe2)
						endif
					else
						UO.Print('А топора то нет!')
						return
					endif
					;********************************
					repeat
						wait(100)
					until UO.InJournal(allmsg)
					If UO.Weight > MaxVes Then
						UO.Print('Перегруз!')
						return 0
					endif
				until UO.InJournal(endmsg)
			endif
		next
	next
	return 0
end sub
Sub Tree(X,Y)
	var i
	DIM  R[34]
	R[1] = 3274;
	R[2] = 3275;
	R[3] = 3276;
	R[4] = 3277;
	R[5] = 3280;
	R[6] = 3283;
	R[7] = 3286;
	R[8] = 3288;
	R[9] = 3290;
	R[10] = 3293;
	R[11] = 3296;
	R[12] = 3299;
	R[13] = 3302;
	R[14] = 3320;
	R[15] = 3323;
	R[16] = 3326;
	R[17] = 3329;
	R[18] = 3393;
	R[19] = 3394;
	R[20] = 3395;
	R[21] = 3396;
	R[22] = 3415;
	R[23] = 3416;
	R[24] = 3417;
	R[25] = 3418;
	R[26] = 3419;
	R[27] = 3438;
	R[28] = 3439;
	R[29] = 3440;
	R[30] = 3441;
	R[31] = 3442;
	R[32] = 3460;
	R[33] = 3461;
	R[34] = 3462;
	for i = 1 to 34
		if uo.privategettile( x, y, -1, R[i], R[i]) then
			return R[i]
		endif
	next
	return false
end sub
Но это мое ИМХО.

Re: Переделанный скрипт на ламбер.

Posted: 2011-02-03 11:23:20
by Weee
Да, один из чаров уже взял 90+ ламбера, буду на нем сегодня тестить антимакро от GMX :) Спасибо.

С антифлудом уже понял. Плюнул на изиуо, понял, что инжа больше не крашит (какое офигенное чувство), и решил за вечер переписать скрипт по аналогии с предыдущими с нуля. Теперь вроде ничего лишнего, прикрутил твою разгрузку, организовал работу всего двух потоков:
Main, Checkingplayers. В мейн вызываются все основные функции, инициализация, старт, потом основной луп со сменой локаций. И там банально проверки на глобальный флаг (как ты и говорил), который изменяется в checkingplayers при нахождении пк. пока этот флаг = 1 (т.е. пк нашелся) в чекинг плеерс идет бесконечный луп, с вейтом. Потом в итоге основная часть скрипта возвращает значение в 0 и можно продолжать рубить-копать и дальше искать пк :)

Попробую прикрутить антимакрос и интегрировать реконнектер получше, чтобы скрипт останавливался на том же месте.

Еще хочу создать какой-то файл типа "для памяти" (реестр засорять не хочу) - чтоб скрипт запоминал где он последний раз рубил и его можно было безболезненно перезапустить :)

Топор я специально использую не по типу на случай, если буду рубить плюсовыми топориками. И это в каком-то роде небольшая пауза перед тем, чтобы скрипт самовольно никуда не улетел. Конечно, топорик можно оставлять всего 1 в паке и тогда оно будет его и использовать, но я не знаю ломаются ли тут некоторые топоры. Если так, то таргет все равно нужен будет, чтобы брать тип и цвет топора, а потом делать автодобор.

Про макрос с кнопки не понял, запутался :( Я писал на openeuo, там LUA, а не старый язык изи. Но это уже неважно. Спасибо в любом случае :) Move в изиуо и правда крутой.

А вот по поводу uo.privategettile - чистейшей воды вин! Хочу попробовать. Только сразу придумалось, чтобы чар как-то сканировал не только ограниченный круг вокруг себя, а весь экран и как-то сортировал координаты тайлов-деревьев и потом бежал уже по ним, чтобы вырубать. Вот бы продумать как такое сделать, чтобы чар как-то нормально по очереди вырубал то, что видит на экране, потом переходил на следующий, еще дальше и так вырубал по несколько квадратов (1 квадрат = 4 экрана). В итоге достаточно было бы просто замарчить несколько рун в глуши.

Re: Переделанный скрипт на ламбер.

Posted: 2011-02-03 11:50:05
by Mirage
MaxRange = 3 - радиус поиска.
Чуть изменить вышеприведенный скрипт он сперва сканил теже 28 тайлов, если тайл совпадает с заданным и расстояние больше 1 тайла то чар перемещается к объекту. Если чар за отрезок времени не может подойти к объекту переходит к следующему.
Можно попробовать.

PS гдето на форуме был пример помечалки деревьев таким принципом, чар бегал по большому квадрату в несколько экранов и собирал все тайлы стволов, Потом уже по координатам ходил и рубил. Точно такая тема была на форуме стелс-клиента.

PS если с паскалем "на ты" то самые лучшие добывающие скирпты все таки на стелсе делаются - минимум нагрузки, одновременный запуск неограниченного количества клиентов, при должной праработке скрипта можно голосом полностью контролировать стелсбота из клиента игры.

Re: Переделанный скрипт на ламбер.

Posted: 2011-02-03 12:03:27
by Weee
Попробую разобраться. Если что, то и правда запишу просто координаты куда бегать. Не подскажешь кстати, чем удобней записывать именно координаты? просто по вызову функции записывать настоящие координаты чара или таргетом кликать каким-то?

По координатам чара как-то надежней выглядит. наверное так и попробую.

Да паскаль и в школе и в универе был, разобраться не составило бы труда, но стелс клиент не работает на абиcce. у меня инжект вроде переделанный, который от Грина. там прикручена crypt.dll. только так получается законнектится. а стелс клиент не работает. я написал там на форуме, чтоб помогли разобраться, отозвался один из девелоперов, сказал, что через месяц приедет - тогда если будет время посмотрит.

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

Re: Переделанный скрипт на ламбер.

Posted: 2011-02-18 00:37:45
by Weee
Мираж, не подскажешь в чем тут может быть проблема?

Code: Select all

sub CheckingPlayers() # Проверка на игроков (ПК).
		VAR a, b, c
		uo.exec('set finddistance 30')
		uo.setglobal('find',0) ## - Устанавливаем find на 0, чтобы работали все функции по вырубке.
		uo.setglobal('PKCheck',0)
		DIM Chars[2] 
		Chars[0] = '0x0190' ## - Тип male.
		Chars[1] = '0x0191' ## - Тип female.
		while not uo.dead() 
;			while val(uo.getglobal('PKCheck')) == 1
			  if uo.injournal(gtfomsg) then
				uo.print("Found GTFOMSG.")
				uo.setglobal('find','1') ## устанавливаем find на 1.
				## Теперь сработают все проверки на ПК в других функциях.
				while val(uo.getglobal('find')) == 1
					wait(500)
				wend
			  endif
			  if uo.GetHP('self') < uo.GetMaxHP('self') then
				uo.print("Found low HP oO")
				uo.setglobal('find','1') ## устанавливаем find на 1.
				## Теперь сработают все проверки на ПК в других функциях.
				while val(uo.getglobal('find')) == 1
					wait(500)
				wend
			  endif
				for a = 0 to 1 ## - Перебираем типы male/female.
					uo.findtype(Chars[a], '-1', '1')  ## - ищем вокруг себя на расстоянии finddistance.
					if uo.findcount() > 0 then ## - если хоть кого-то нашли, значит пора валить.
						UO.Click('finditem')
						CheckLag()
						if uo.injournal("You see|GM") or uo.injournal('You see|Admin') or uo.injournal('You see|Seer') or uo.injournal('You see|Counselor') or uo.injournal('You see|Developer') then 
							uo.deletejournal()
							uo.print("FFFFUUUUU GM!!!1")
							uo.playwav(FilePath+"ringout")
							wait(1500)
							UO.Click('finditem')
							uo.playwav(FilePath+"ringout")
							wait(1500)
						else
							if UO.GetNotoriety('finditem') > 3 then
								uo.print("GTFO ASAP!!1")
								uo.setglobal('find','1') ## устанавливаем find на 1.
								## Теперь сработают все проверки на ПК в других функциях.
								while val(uo.getglobal('find')) == 1
									wait(500)
								wend
							endif
						endif
					else
						wait(200)
					endif
				next
;			wend
			wait(500)
		wend 
end sub
Оно отвечает за детект ПК, гмов, уменьшения хп или сообщения об атаке:

Code: Select all

var gtfomsg="attacking you*|blade spirit|energy vortex|elemental|Kal Vas|Vas Corp|In Vas Por|Flam Kal|Ort Sanct|In Sanct Grav|Vas Ort Grav|Wis Quas|In Ex Grav|Vas Ort Flam|Corp Por|Kal Xen|An Ex Por|Por Corp Wis|Kal In Ex|In Jux Hur|Ort Rel|Por Ort Grav|An Mani|In Flam Grav|In Sanct Ylem|In Nox|Vas Flam|In Por Ylem|[criminal]"
TWI включен. Все работает, но иногда почему-то не уходит от красных игроков, хотя стоит проверка на notoriety > 3. Иногда уходит, иногда нет.

По уменьшению хп уходит всегда. На гмов пищит всегда (хотя иногда пищит совсем не в тему, когда кто-то, например, качает алхимию неподалеку или еще что-то). Думаю пищалка на гмов глючит из-за uo.injournal("You see|GM"), всмысле из-за част с You see, но почему-то просто на GM, Seer и т.д. срабатывало криво, а сейчас лучше гораздо. Притом когда просто кто-то появляется - оно не срабатывает. А вот если кто-то спамит скиллы - срабатывает.

А вот по поводу ухода от красных игроков - не пойму что не так. Видел другие детектилки пк - там ноториети определялся как-то из журнала, но тут хотелось бы, чтоб журнал лишний раз не чистился.

Re: Переделанный скрипт на ламбер.

Posted: 2011-02-18 10:15:54
by Mirage
Заметил интересную штуку про которую видимо знает очень мало народу.

Code: Select all

sub test1()
    var msg='rock|You see|Admin'
    uo.deletejournal()
    repeat
        if uo.injournal( msg ) then
            return
        endif
        wait(1000)
    until uo.dead()
end sub
Запускаем этот скрипт. Кликаем в 4 предмета:
1) стул (You see: стул)
2) НПС Вася (You see: Вася)
3) тайл с камнем (You see: rock)
4) НПС Admin (You see: Admin)

Скрипт останавливается только в последнем случае. Вывод лога журнала подтвердил подозрения:
1) надпись You see не логируется журналом и не распознается
2) тайлы статики расставленные не админами так же не распознаются через журнал (хотя в нем присутствуют)
Соответственно проверку нужно делать только на ники либо на названия вещей установленных игроками либо админами.

Следующий момент

Code: Select all

sub test2()
    var msg='GM|Admin|Seer|Counselor|Developer'
    var ID = '0x00CA24F4' ; ID чара по имени Admin
    uo.deletejournal()
    repeat
        if uo.injournal( msg ) and uo.JournalSerial(msg) == ID then
            return
        endif
        wait(1000)
    until uo.dead()
end sub
Проверка сработает только на чара с ником Admin с соответствующим ID. Что приводит к следующим выводам:
1) плохо то что когда ты видишь кого то в журнале и тебе пишут "You see: Admin" серийник этого сообщения не равен системным сообщениям. Он равен ID чара чей ник высвечивается.
2) нужно отловить ID стафа и переписать их в проверку чтобы тот же Вася бегая вокруг чара на скрипте не сбивал его крича "GM Admin Seer СДОХНИ СЦУКО!!!"
3) можно сделать проверку на uo.getnotoriety через uo.JournalSerial

PS я как то ваял от нечего делать вот такую штуку, может пригодится

Code: Select all

sub main1()
var i, player
  uo.Ignore('self')
DIM people[2]
 people[1]='0x0190'
 people[2]='0x0191'
UO.set('finddistance','24')
for i=1 to 2 
  UO.FindType(people[i],-1,'ground')
  while UO.FindCount() > 0 
    player = uo.GetSerial('finditem') 
		if uo.getnotoriety(player) <> 6 then
		uo.hide(player)
		uo.ignore(player)
 		Wait( 300 )
 		Endif
	uo.click(player)
	uo.ignore(player)
UO.FindType(people[i],-1,'ground')
wend
next
uo.ignorereset()
uo.resend()
end sub


sub main2()
var i, player
uo.Ignore('self')
DIM people[2]
 people[1]='0x0190'
 people[2]='0x0191'
UO.set('finddistance','24')
for i=1 to 2
  UO.FindType(people[i],-1,'ground')
  while UO.FindCount() > 0 
    player = uo.GetSerial('finditem') 
		if uo.getnotoriety(player) == 6 then
		uo.click(player)
 		else
 		Wait( 300 )
 		Endif
	uo.ignore(player)
  UO.FindType(people[i],-1,'ground')
  wend
next
uo.ignorereset()
uo.resend()
end sub
Попробуй это на рынке запустить где присутствуют чары всех направлений.

Re: Переделанный скрипт на ламбер.

Posted: 2011-02-19 20:14:46
by Weee
Вот оно как. Появилось несколько соображений на этот счет. Может лучше будет теперь определять.

Недавно прилетел гм на проверку, благо я заметил, но почему-то проверка моя с You see|GM не сработала. Хотя до этого работала. Попробую убрать You see.

По поводу пк анти-скриптеров, которые орут все подряд, чтобы скрипт зафакапить - против них можно продумать примерно то, что я написал в скрипте повыше.

Проверка на касты, на attacking you и на уменьшение хп. Если они кастуют что-то плохое - чар улетает. Если хп уменьшается - чар улетает. В первом случае пк офигевают, когда скрипт улетает при виде por ort grav. Вылазят из стелса с кастом и скрипт тут же улетучивается. Во втором случае пк офигевают, когда всаживают на -80 из стелса, а чар на скрипте реколится до того, как они успевают прожать лайт или что-нибудь еще. Если к этому делу добавить инвизки, то вообще может быть шикарно.

У меня проверка специально на красных. Обычно если бежит серый крим или красный пк, то они точно будут убивать. Поэтому чар сваливает не раздумывая. Если в итоге кто-то подберется близко, спамя GM или что-то еще, то чар все равно улетит, т.к. скрипт не сбивается, а продолжает поиск пк. Улетит по хп или по касту.

Одна проблема - getnotoriety у меня глючит. Поэтому и спросил делать ли через журнал. В твоем последнем примере используется getserial('finditem'), и уже от этого значения getnotoriety. Так лучше? Надо попробовать. У меня все-таки напрямую. Тоже срабатывает, но иногда почему-то не хочет.

Re: Переделанный скрипт на ламбер.

Posted: 2011-02-19 22:51:46
by Mirage
uo.JournalSerial(msg) = ID чара или вещи с именем из журнала.
Получил ID - можно использовать if uo.getnotoriety(ID) == 6 then