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