Page 1 of 1

Скрипт на ламбер. Под АоС (RunUO)

Posted: 2004-06-26 15:39:00
by ruff
вот скриптец, работает с Yoko Inj. под AoS и клиент 4.0.0с

Code: Select all

############################################################### 
### Скрипт на ламбер ### 
############################################################### 
### (c) Elthar aka Duo. Adopted by ruff
### Требуется YokoInjection со скрипт парсером версии 0.3 
### http://yoko.netroof.net 
############################################################### 
### Инструкции по применению ### 
############################################################### 
### Во время работы скрипта (анализ територии) рекомендуется не говорить, 
### это будет тормозить его выполнение, хотя и не смертельно. 
### Вердату желательно иметь нормальную, не с пеньками вместо 
### деревьев. 
### 
### 1. До запуска скрипта необходимо прописать типы объектов
### axe - собсно топор, pila - карпентер тул (пила, рубанок,етц)
### brevna - тип логов, doski - тип досок (добавить на вкладке
### Object Types)
### Скрипт расчитан на то, что есть дом, в доме есть два ящика
### в один (woodbox) складываем доски, со второго (invbox) берем
### инструменты (топор и пилу) (добавить на вкладке Objects)
### Можно накидать топоров и пил в бакпак, тогда он не будет
### ходить за инструментами домой.
### Предполагается три координаты, Home - тайл перед входом в дом
### wbox - координаты ящика с досками, и ibox - координаты ящика
### с инструментами. Эти координаты необходимо тоже прописать перед 
### запуском.
### 4. Если переменная GetFromFile=1, то скрипт считает из файла 
### координаты деревьев и сразу побежит к первому дереву. Если 
### GetFromFile=0, то начнется анализ территории. ВО ВРЕМЯ АНАЛИЗА 
### ОКНО КЛИЕНТА ДОЛЖНО БЫТЬ АКТИВНО, И КУРСОР ДОЛЖЕН НАХОДИТЬСЯ 
### НА ИГРОВОМ ПОЛЕ!!! Можно менять переменную Area от 1 до 4, 
### чтобы увеличивать/уменьшать размер территории для анализа. 
### Сколько выбирать, зависит от густоты леса и скилла Ламбера, 
### пробуй сам. 
### 5. Когда база загрузится, появится соответствующая мессага, 
### и начнется бесконечный цикл на обход деревьев. Он происходит 
### так: идем к дереву; если переменная TryHiding=1 то пытаемся 
### уйти в хайд; начинаем рубить логи, пока все не вырубим, или 
### пока не кончится таймер (30 ударов); если переменные HomeX и 
### HomeY = 0, то уходим в хайд и закрываем клиент когда 
### вес досок достиг грузоподьемности. Иначе идем домой согласно
### сценария.
### 
### Вот собственно и все! Enjoy it! 
############################################################### 

sub main() 
dim Home[2],wbox[2],ibox[2]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
var Area=4 ## Размер обрабатываемой территории, можно менять от 1 до 4. 
var TryHiding=1 ## 1 - перед тем как рубить дерево, будет пытаться уйти в хайд, 0 - не будет 
				## после рубки будет пытатся застелиться
var ChkStealthStep=18 ## сколько шагов ходим в стелсе, если больше - стелсимся опять. 0 - не проверяем
var GetFromFile=1 ## 1 - координаты деревьев будут считыватся из файла, 0 - собиратся из клиента 
Home[0]=3024
Home[1]=553
wbox[0]=3025
wbox[1]=549
ibox[0]=3026
ibox[1]=549
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 

Lumber(Area,TryHiding,ChkStealthStep,GetFromFile,Home,wbox,ibox);
end sub 

sub HomeWork(ibox)
	uo.print("Delaem uroki");
	uo.print("Doski nafik");
	uo.findtype('doski');
	uo.moveitem('finditem',0,'woodbox');
	wait(200)
	uo.print("Sho tam u nas");
	if CheckInventory() == 0 then
		uo.print("Cheta nehvatat");
		gotoxy(ibox[0],ibox[1],0);
		wait(900)
		if HaveItem('pila') == 0 then
			uo.findtype('pila',-1,'invbox');
			uo.grab(1,'finditem');
			wait(500);
		else
			uo.ignore('finditem');
		end if
		wait(3000);
		if HaveAxe() == 0 then
			uo.findtype('axe',-1,'invbox');
			uo.grab(1,'finditem');
			wait(900)
		end if
		uo.ignorereset();
		uo.equipt('Lhand','axe');
	end if
	uo.print("Vse v norme, gulyaem dalshe");
end sub

sub CheckInventory()
	var oh
	if  HaveItem('pila')==1 and HaveAxe()==1 then
		return 1
	end if
	return 0
end sub
sub HaveItem(iname)
	uo.print("Ishem "+iname);
	uo.findtype(iname,-1,"backpack");
	if uo.FindCount() > 0 then
		return 1
	end if
	return 0
end sub
sub HaveAxe()
	uo.findtype('axe',-1,"my");
	if uo.FindCount() > 0 then
		wait(500);
		return 1
	end if
	return 0
end sub

sub Lumber(Area,TryHiding,ChkStealtStep,GetFromFile,home,wbox,ibox)
var i=0,j=0,k=0,r=0,q=0,ii,jj 
var TopX=324,TopY=65 
dim TreeX[100], TreeY[100],TreeT[100] 
dim TreeTile[100] 
var flag=0,treeCount=0,clicks=0,flag2=0 
var f=file("C:\trees.dat") 
var instealth=0,ws

#Графика деревьев 
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 

#Загружаем координаты из файла 
if GetFromFile==1 then 
	uo.print('Loading trees data...') 
	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 
	#Собираем координаты из клиента 
	uo.print('Seeking trees out there nah...') 
	for q=1 to Area 
		if q==2 then 
			gotoxy(uo.getx()+20,uo.gety()-10,0)
		end if 
		if q==3 then 
			gotoxy(uo.getx(),uo.gety()+20,0)
		end if 
		if q==4 then 
			gotoxy(uo.getx()-20,uo.gety(),0)
		end if 
		for r=0 to 3 
			if r==1 then 
				gotoxy(uo.getx()+10,uo.gety(),0)
			end if 
			if r==2 then 
				gotoxy(uo.getx(),uo.gety()+10,0)
			end if 
			if r==3 then 
				gotoxy(uo.getx()-10,uo.gety(),0)
			end if 
			for j=0 to 8 
				for i=0 to 8 
					clicks=0 
					flag=0 
					uo.DeleteJournal() 
					#Кликаем на тайл 
					uo.usetype('axe') 
					if uo.Journal(0) == 'cliloc# 0xA307' then
						uo.exec('equipt Lhand axe');
						wait(900);
						uo.usetype('axe') 
					end if
					if uo.Journal(0) == 'cliloc# 0xA197' then
						wait(500)
						uo.usetype('axe') 
					end if
					waitForTarget()
					uo.DeleteJournal()
					uo.LClick(TopX+i*21-j*21,TopY+i*21+j*21)
					if WaitForTryTree()==1 then
						flag=0
						#Проверяем что это 
						for k=0 to 9 
							if uo.LastTile(0)==TreeTile[k]+1 then 
								flag=2 
							end if 
						next 
						if flag==0 then 
							for k=0 to 9 
								if uo.LastTile(0)==TreeTile[k] then 
									flag=1 
								end if 
							next 
						end if 
						#Кликнули на ствол 
						if flag==1 then 
							flag2=0 
							if treeCount>0 then 
								for ii=1 to treeCount 
									if treeX[ii]==uo.lastTile(1) AND treeY[ii]==uo.lastTile(2) then 
										flag2=1 
									end if 
								next 
							end if 
							if flag2==0 then 
								treeCount=treeCount+1 
								TreeX[treeCount]=uo.LastTile(1) 
								treeY[treeCount]=uo.lastTile(2) 
								TreeT[treeCount]=uo.LastTile(0) 
								uo.print('Found tree nah: x='+str(uo.lasttile(1))+' y='+str(uo.lastTile(2))) 
							end if 
						end if 
						#Кликнули по листве 
						if flag==2 then 
							flag2=0 
							if treeCount>0 then 
								for ii=1 to treeCount 
									if treeX[ii]==uo.lastTile(1) AND treeY[ii]==uo.lastTile(2) then 
										flag2=1 
									end if 
								next 
							end if 
							if flag2==0 then 
								treeCount=treeCount+1 
								TreeX[treeCount]=uo.LastTile(1) 
								treeY[treeCount]=uo.LastTile(2) 
								TreeT[treeCount]=uo.LastTile(0)-1 
								uo.print('Found tree poh: x='+str(uo.lasttile(1))+' y='+str(uo.lastTile(2)))
							end if
						end if
					end if
				next
			next
		next
	next
	uo.exec("filterspeech off");
	uo.print('Analiz finished, trees saved to C:\trees.dat');
	SaveToFile(treeCount,TreeX,TreeY,TreeT);
	GetFromFile=1;
end if 
uo.print('Trees found number: '+str(treeCount)) 
wait(200) 
#Ходим по собранным координатам 
while 1==1 
	if treeCount>0 then 
		for i=1 to treeCount 
			uo.print('Go to tree nah '+str(i)+': x='+str(treex[i])+' y='+str(treey[i])) 
			if CheckInventory() == 0 then
				GoHome(home,wbox);
				HomeWork(ibox);
			end if
			if CheckWeight() == 0 then
				GoHome(home,wbox);
				HomeWork(ibox);
			end if
			flag=gotoxy(treex[i],treey[i],instealth)
			if flag==1 then 
				if TryHiding==1 then 
					ToHide() 
				end if 
				GetTree(str(treeT[i]),str(treeX[i]),str(TreeY[i]),str(uo.getz())) 
				if TryHiding==1 then 
					if ToStealth() == 1 then
						instealth=ChkStealtStep;
					else
						instealth=0;
					end if
				end if 
				CheckWeight()
			end if 
		next 
	end if 
wend 
end sub 
sub CheckWeight()
	var mywcap=(((uo.STR*7)/2)+39),i;
	if uo.weight >= mywcap then
		uo.print("Pilim drova");
		MakeLastEx();
		wait(3000);
		for i = 0 to 20
			uo.findtype('brevna');
			if uo.FindCount() == 0 then
				if uo.weight >= mywcap then
					return 0;
				else
					return 1;
				end if
			end if
			wait(300)
		next
	else
		return 1;
	end if
	return 0
end sub
sub SaveToFile(treeCount,TreeX,TreeY,TreeT)
	var f=file("C:\trees.dat");
	var i;
	f.Create();
	f.WriteLn(treeCount);
	for i=1 to treeCount
		f.Write(str(treeT[i])+" ");
		f.Write(str(treeX[i])+" ");
		f.WriteLn(str(treeY[i]));
	next
	f.Close();
end sub

sub GetTree(type,x,y,z) 
	var i 
	uo.print('Chop and hack nah...') 
	for i=0 to 15 
		if uo.warmode()==1 then 
			return 0 
		end if 
		wait(200) 
		uo.deletejournal() 
		uo.waittargettile(type,x,y,z) 
		uo.usetype('axe') 
		if WaitForChange()==1 then 
			return 1 
		end if 
	next 
	return 0 
end sub 

sub GoHome(home,wbox)
	var i;
	ToHide();
	if home[0] == 0 then
		uo.closeuo();
	end if
	wait(10000);
	ToStealth();
	gotoxy(home[0],home[1],25);
	gotoxy(wbox[0],wbox[1],0);
end sub

sub ToHide() 
	var i 
	uo.print('Hiding myself nah...')
	if uo.Hidden() == 1 then
		return 1
	end if
	for i=1 to 20 
		uo.deletejournal() 
		uo.useskill('Hiding') 
		if WaitForHide()==1 then 
			return 1 
		end if 
	next 
	return 0 
end sub 
sub ToStealth() 
	var i,rwh,hs=uo.Hidden()
	uo.print('Stealthing myself nah...')
	if hs == 0 then
		uo.print("HS: "+str(hs));
		ToHide();
		wait(8000);
	end if
	for i=1 to 20 
		uo.deletejournal() 
		uo.useskill('Stealth')
		rwh=WaitForHide();
		if rwh==1 then 
			return 1 
		end if 
		if rwh==2 then
			return 0
		end if 
	next 
	return 0 
end sub 
sub YouSee()
	var TextYouSee='cliloc# 0x05BD'
	if uo.Journal(0)==TextYouSee then 
		uo.deletejournal();
		return 1
	end if
	return 0
end sub

sub WaitForHide()
	var Text1='cliloc# 0xA5F8'
	var Text2='cliloc# 0xA5F9'
	var Text3='cliloc# 0xA196'
	var Text4='cliloc# 0xABCB'
	var Text5='cliloc# 0xABCA'
	var Text6='cliloc# 0xABC5'
	for var i=0 to 200
		if YouSee() == 1 then
			return 0
		end if
		if uo.Journal(0)==Text1 then 
			return 1 
		end if 
		if uo.Journal(0)==Text2 then 
			wait(5000)
			return 0 
		end if 
		if uo.Journal(0)==Text3 then 
			wait(1000)
			return 0 
		end if 
		if uo.Journal(0)==Text4 then
			return 2
		end if
		if uo.Journal(0)==Text6 then
			ToHide();
			return 0;
		end if
		if uo.Journal(0)==Text5 then
			return 1
		end if
		wait(500)
	next 
	return 0 
end sub 

sub WaitForChange() 
	var Text1='cliloc# 0xA30F' 
	var Text2='cliloc# 0xA30D'
	var Text3='cliloc# 0xA2DE'
	var Text4='cliloc# 0xA312'
	var Text5='cliloc# 0xA313'
	var Text6='cliloc# 0xA307'
	var Text7='cliloc# 0xA197'
	for var i=0 to 200 
		if YouSee() == 1 then
			return 0
		end if
		if uo.Journal(0) == Text5 or uo.Journal(0) == Text6 then
			wait(500);
			uo.equipt('Lhand','axe');
			return 0
		end if
		if uo.Journal(0)==Text2 OR uo.Journal(0)==Text3 then 
			return 1 
		end if 
		if uo.Journal(0)==Text1 OR uo.Journal(0)==Text4 OR uo.Journal(0)==Text7 then 
			return 0 
		end if 
		wait(50) 
	next 
	return 0 
end sub 

sub WaitForTryTree() 
	var Text1="cliloc# 0xA2DE" ## faruway
	var Text2="cliloc# 0xA30D" ## not enaf
	var Text3="cliloc# 0xA309" ## cant use
	var Text4="cliloc# 0xA197" ## must wait
	var Text5="You can't see the target" 
	for var i=0 to 50 
		if uo.Journal(0)==Text1 OR uo.Journal(0)==Text2 then 
			return 1 
		end if 
		# OR uo.Journal(0)==Text5
		if uo.Journal(0)==Text3 then
			return 0
		end if
		if uo.Journal(0)==Text4 then
			return 2
		end if
		wait(200)
	next 
	return 0 
end sub 
sub WaitForTarget() 
	for var i=0 to 50 
		if uo.Targeting()==1 then 
			return 1 
		end if 
		wait(200) 
	next 
	return 0 
end sub 

sub WaitForChangeXY(myX,myY,lastX,lastY) 
	for var i=1 to 50 
		if lastX<>myX OR lastY<>myY then 
			return 1 
		end if 
		wait(200) 
	next 
	return 0 
end sub 

sub abs(x)
	if x>0 then
		return x
	else
		return -x
	end if
end sub

sub gotoXY(x,y,instealth)
	var myX,myY,lastX=0,lastY=0,i,halt=0,z,r=0,steps=0
	for i=1 to 60 
		MyX=uo.getX(); 
		MyY=uo.getY();
		if instealth > 0 and steps > instealth then
			ToStealth();
			steps=0;
		end if
		if LastX==MyX AND LastY==MyY then 
			halt=halt+1 
		else 
			halt=0 
		end if 
		if halt>=10 then 
			if uo.GetDir()==1 then 
				uo.press(40,5)
				steps=steps+5
			end if 
			if uo.GetDir()==3 then 
				uo.press(37,5)
				steps=steps+5
			end if 
			if uo.GetDir()==5 then 
				uo.press(38,5)
				steps=steps+5
			end if 
			if uo.GetDir()==7 then 
				uo.press(39,5)
				steps=steps+5
			end if
			halt=15
		end if
		if abs(x-myX)<=1 AND abs(y-myY)<=1 then
			return 1
		end if
		if x<=MyX then
			if y<=MyY then
				uo.press(38,3)
				steps=steps+3
			else
				uo.press(37,3)
				steps=steps+3
			end if
		else
			if y<=MyY then
				uo.press(39,3)
				steps=steps+3
			else
				uo.press(40,3)
				steps=steps+3
			end if
		end if
		lastX=myX
		lastY=myY
		wait(200)
	next
	return 0
end sub

sub MakeLastEx()
	var i
	uo.deletejournal()
	uo.usetype('pila')           
    wait(500)
    WaitMenuEx("special",7)
    wait(500)
    while not uo.injournal("of type 0xC79351A0 choiced") and not uo.injournal("you have worn out")
      wait(100)
    wend
	uo.deletejournal()
    for i=0 to 50
    	if uo.injournal("of type 0xC79351A0") then
    		wait(100);
    		uo.rclick(47,46);
    		return
    	end if
    	wait(200);
    next
end sub 
sub WaitMenuEx(category,number)
  while not uo.injournal("of type 0xC79351A0")
    wait(100)
  wend
  if category == "categories" and number > -1 and number < 11 then
    uo.lclick(70,110+18*number)
  endif
  if category == "selections" and number > -1 then
    while number > 9
      number = number - 9
      uo.lclick(423,311)
      wait(300)
    wend
    uo.lclick(275,110 + 18*number)
  endif
  if category == "special" and number < 8 and number > -1 then
    if IsOdd(number) then
      uo.lclick(70,395+18*number/2)
    else
      uo.lclick(325,395+18*(number-1)/2)
    endif
  endif
end sub

sub IsOdd(num)
  var i = num
  i = int(i/2)
  i = i*2
  if i == num then
    return 1
  endif
  return 0
end sub 


Posted: 2004-07-02 18:31:23
by ruff
а, и еще, предполагается что дом WorkShop (двухетажный) чтоб не мучатся с опендорами и попаданиями в оные

Posted: 2004-08-18 23:17:26
by Xran
ruff wrote:а, и еще, предполагается что дом WorkShop (двухетажный) чтоб не мучатся с опендорами и попаданиями в оные
а как в этом скрипте исправить чтобы он меньше у дерево стоял или чтобы делал 6 попыток ударов топором и дальше переходил7??

Posted: 2004-11-19 22:22:56
by FederaL
Мона этот скрипт переделать по простую рубку деревьев, без всего остального тока рубка и зациклить так его.

Posted: 2004-11-23 16:12:43
by Shaud
Народ расскажите мне что такое
of type 0xC79351A0
которое в
sub WaitMenuEx(category,number)
while not uo.injournal("of type 0xC79351A0")
...

Я думал думал так и не понял.
(В моем скрипт на ламберджекинг под RunUO я тоже использовал эту процедуру.)
Я эту проверку выбросил. а то с ней у меня не работает. почему то не появляется в журнале of type 0xC79351A0 гг