Savage(from old forum):
"Значит скрипт на випуху, в большой шахте умещаются 4 копателя, каждый копает на 4 тайла от себя. Те кто в состоянии килять элемов в морфе, снаряжаются набором регов на мрф, хитером, горгетом, манкакми, инвизками и немного гх. Ну и кирку соответственно.
Надо включить опцию автостарт на вкладке майн, и назвать скрипт autoload.sc Прописать рег, если не ставили никогда изиуо
www.jetta.ru/easy.reg
Найти в скрипте блок инициализации параметров для чара, исправить в нем координаты точки копания, настроить переменные согласно действиям чара. Лишние блоки для других чаров удалить или добавить новые по аналогии.
Найти в скрипте unloadore координаты тайла перед сундуком для выгрузки, сериал сундука и исправить. Заменить если надо, команды похода к сундуку на команды похода к порталу.
Известные косяки: Если чар выкапывает два элема подряд и один из них сам не нападает, чар на него забивает. Редко, но случается.
Знаю что ходилка выглядит убого, но справляется со своими задачами пока успешно.
Из 3 челов кому посылал скрипт еще никто не запустил Хотя он проще и надежней предыдущего
А, кстати, если на одного чара настраивать, все упоминания про изю можно закоментировать. Она нужна только чтоб сообщить другим клиентам об опасности.
Запускать из консоли клиента: ,exec mine"
Code:
#==============================================================
# autostart() - Declaration global variables
#
#
# Journal has been deleted!!!
#--------------------------------------------------------------
sub autostart()
wait(3000)
UO.SetGlobal('Connected','Yes')
UO.SetEasyUO(99,'0')
UO.Click('self')
wait(3000)
UO.SetGlobal('CharName',UO.GetName())
UO.SetGlobal('BuyScript','Off')
UO.Exec('warmode 0')
end sub
###############################################################
###############################################################
;
; Shared Subs
;
###############################################################
###############################################################
#==============================================================
# tohide() - try hidding char. When char lose HP, drink inviz
# potion if it found in backpack
#
# Journal has been deleted!!!
#--------------------------------------------------------------
sub tohide()
while NOT UO.Hidden()
UO.DeleteJournal()
UO.FindType('0x0F0E','0x0631','my')
if UO.Life<UO.STR/2 AND UO.GetQuantity('finditem')>0 then
UO.UseType('0x0F0E','0x0631') ; inviz potion
UO.Exec('warmode 0')
wait(2000)
else
UO.Exec('warmode 0')
UO.UseSkill('Stealth')
repeat
wait(50)
until UO.InJournal('You have hidden') OR UO.InJournal('seem to hide') OR UO.InJournal('preoccupied')
endif
wend
end sub
#==============================================================
# CheckLag() - click on backpack and awaiting "backpack"
# message in journal.
#
# Journal has been deleted!!!
#--------------------------------------------------------------
sub CheckLag()
UO.DeleteJournal()
UO.Click('backpack')
repeat
wait(500)
until UO.InJournal('backpack')
end sub
#==============================================================
# Gong(counter) - playing wav-file 'counter'-times
#
http://www.jetta.ru/cow.wav
#--------------------------------------------------------------
sub Gong(times) ; play wav-file
VAR i
for i=1 to times
UO.Exec("playwav c:\game\uo\cow")
wait(1200) ; time to play sample at once
next
end sub
sub GoW()
VAR walkwait=300
VAR x,y,dir=6
VAR key=36 ; Home key
x=UO.GetX()
y=UO.GetY()
while UO.GetDir()<>dir
UO.Press(key)
wait(walkwait)
If UO.GetDir()<>dir Then
CheckLag()
Endif
wend
UO.Press(key)
wait(walkwait)
If x==UO.GetX() AND y==UO.GetY() Then
CheckLag()
Endif
If UO.GetX()+1==x Then
return -1
Else
return 1
Endif
end sub
sub GoN()
VAR walkwait=300
VAR x,y,dir=0
VAR key=33 ; PgUp
x=UO.GetX()
y=UO.GetY()
while UO.GetDir()<>dir
UO.Press(key)
wait(walkwait)
If UO.GetDir()<>dir Then
CheckLag()
Endif
wend
UO.Press(key)
wait(walkwait)
If x==UO.GetX() AND y==UO.GetY() Then
CheckLag()
Endif
If UO.GetY()+1==y Then
return -1
Else
return 1
Endif
end sub
sub GoE()
VAR walkwait=300
VAR x,y,dir=2
VAR key=34 ; PgDown
x=UO.GetX()
y=UO.GetY()
while UO.GetDir()<>dir
UO.Press(key)
wait(walkwait)
If UO.GetDir()<>dir Then
CheckLag()
Endif
wend
UO.Press(key)
wait(walkwait)
If x==UO.GetX() AND y==UO.GetY() Then
CheckLag()
Endif
If UO.GetX()-1==x Then
return -1
Else
return 1
Endif
end sub
sub GoS()
VAR walkwait=300
VAR x,y,dir=4
VAR key=35 ; End
x=UO.GetX()
y=UO.GetY()
while UO.GetDir()<>dir
UO.Press(key)
wait(walkwait)
If UO.GetDir()<>dir Then
CheckLag()
Endif
wend
UO.Press(key)
wait(walkwait)
If x==UO.GetX() AND y==UO.GetY() Then
CheckLag()
Endif
If UO.GetY()-1==y Then
return -1
Else
return 1
Endif
end sub
sub GoWN()
VAR walkwait=300
VAR x,y,dir=7
VAR key=38 ; UpArrow
x=UO.GetX()
y=UO.GetY()
If UO.GetDir()<>dir Then
UO.Press(key)
wait(walkwait)
If UO.GetDir()<>dir Then
CheckLag()
Endif
Endif
If UO.GetDir()==dir Then
UO.Press(key)
wait(walkwait)
If x==UO.GetX() AND y==UO.GetY() Then
CheckLag()
Endif
If UO.GetDir()==dir Then
return -1
Else
return UO.GetDir()
Endif
Else
return UO.GetDir()
Endif
end sub
sub GoNE()
VAR walkwait=300
VAR x,y,dir=1
VAR key=39 ; RightArrow
x=UO.GetX()
y=UO.GetY()
If UO.GetDir()<>dir Then
UO.Press(key)
wait(walkwait)
If UO.GetDir()<>dir Then
CheckLag()
Endif
Endif
If UO.GetDir()==dir Then
UO.Press(key)
wait(walkwait)
If x==UO.GetX() AND y==UO.GetY() Then
CheckLag()
Endif
If UO.GetDir()==dir Then
return -1
Else
return UO.GetDir()
Endif
Else
return UO.GetDir()
Endif
end sub
sub GoSE()
VAR walkwait=300
VAR x,y,dir=3
VAR key=40 ; DownArrow
x=UO.GetX()
y=UO.GetY()
If UO.GetDir()<>dir Then
UO.Press(key)
wait(walkwait)
If UO.GetDir()<>dir Then
CheckLag()
Endif
Endif
If UO.GetDir()==dir Then
UO.Press(key)
wait(walkwait)
If x==UO.GetX() AND y==UO.GetY() Then
CheckLag()
Endif
If UO.GetDir()==dir Then
return -1
Else
return UO.GetDir()
Endif
Else
return UO.GetDir()
Endif
end sub
sub GoSW()
VAR walkwait=300
VAR x,y,dir=5
VAR key=37 ; LeftArrow
x=UO.GetX()
y=UO.GetY()
If UO.GetDir()<>dir Then
UO.Press(key)
wait(walkwait)
If UO.GetDir()<>dir Then
CheckLag()
Endif
Endif
If UO.GetDir()==dir Then
UO.Press(key)
wait(walkwait)
If x==UO.GetX() AND y==UO.GetY() Then
CheckLag()
Endif
If UO.GetDir()==dir Then
return -1
Else
return UO.GetDir()
Endif
Else
return UO.GetDir()
Endif
end sub
#==============================================================
# WalkN(X,Y,Serial) - char is walking by dX and dY step
# sub using Home, End, PgUp, PgDown keys
# d'not rebind this key from default action!
#
# If Serial defined and not empty, char walked to mobile NPC
# x and y ignored and calculated every step
#--------------------------------------------------------------
sub WalkN(x,y,Target)
VAR i
VAR dx,dy,Exit=0
While Exit<>1
If Target<>"" Then
dx=UO.GetX(Target)-UO.GetX()
dy=UO.GetY(Target)-UO.GetY()
; UO.Print("Target locked!")
If UO.GetDistance(Target)<2 Then
Exit=1
Endif
Else
dx=x-UO.GetX()
dy=y-UO.GetY()
If dx+dy==0 Then
Exit=1
Endif
Endif
If dx<>0 AND dy<>0 Then
If dx>0 AND dy>0 Then
GoSE()
Endif
If dx>0 AND dy<0 Then
GoNE()
Endif
If dx<0 AND dy>0 Then
GoSW()
Endif
If dx<0 AND dy<0 Then
GoWN()
Endif
Endif
If dx<>0 AND dy==0 Then
If dx>0 Then
GoE()
Endif
If dx<0 Then
GoW()
Endif
Endif
If dx==0 AND dy<>0 Then
If dy>0 Then
GoS()
Endif
If dy<0 Then
GoN()
Endif
Endif
Wend
end sub
###############################################################
#===---====----===---===---= Mining =---=-=-=-=-=--=-=-=-=-=-=#
# Multi char mining for VIP Mine. DRW Shard
www.drw.ru #
# Scripted by Savage (c) 2004 ICQ:33336141 #
#"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""#
#"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""#
# To start script use ",exec mine" command from client window #
###############################################################
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
;==================== Main mining script ======================
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
sub mine()
VAR DigDistance, TileNum, KillElemental, KillOtherElem
VAR ElemSignal
VAR BaseX, BaseY, BaseZ
VAR MaxWeight
VAR i,j,TileY,TileX,DirX,DirY
VAR Delta,BeginX,EndX,BeginY,EndY
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; TileNum='Num' - Use ",infotile" command on the floor
; Номер тайла в котором можно копать ,потыкайте командой
; ",infotile" по разнвм тайлам и посмотрите не отличаются ли их
; номера.
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
TileNum='1339'
;-=-=-=-=-=-=-=-=-=--=-=-= Sand =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; Настройка скрипта на чара. Ну соответственно поменять имена
; на имена своих чаров.
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
If UO.GetGlobal('CharName')=='Sand' Then
UO.Print("Welcome again Sand!")
MaxWeight=800
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; DigDistance=4 - Distance from tile where pickaxe targeting
; Радиус круга по которому будет копать чар, то есть расстояние
; до клетки куда можно дотянуться киркой.
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
DigDistance=4
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; KillElemental='Yes'/'No' - Use 'Yes' if char skilled to morph
; in daemon and wrestling > 50
; Если чар достаточно прокачен чтоб бить элемов, ставьте 'Yes'
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
KillElemental='Yes'
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; KillOtherElemental='Yes'/'No' - Use 'Yes' if char skilled to morph
; in daemon and wrestling > 50
; Убивать элемов выкопанных другими чарами?
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
KillOtherElem='No'
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; ElemSignal='Off'/'On' - Play sound when elemental is digged
; Оповешать при появлении элема
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
ElemSignal='On'
BaseX=5521
BaseY=1421
BaseZ=0
Endif
;-=-=-=-=-=-=-=-=-=--=-=- Savagev -=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; Настройка скрипта на чара. Ну соответственно поменять имена
; на имена своих чаров.
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
If UO.GetGlobal('CharName')=='Savagev' Then
UO.Print("Welcome again Savagev!")
MaxWeight=700
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; DigDistance=4 - Distance from tile where pickaxe targeting
; Радиус круга по которому будет копать чар, то есть расстояние
; до клетки куда можно дотянуться киркой.
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
DigDistance=4
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; KillElemental='Yes'/'No' - Use 'Yes' if char skilled to morph
; in daemon and wrestling > 50
; Если чар достаточно прокачен чтоб бить элемов, ставьте 'Yes'
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
KillElemental='Yes'
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; KillOtherElemental='Yes'/'No' - Use 'Yes' if char skilled to morph
; in daemon and wrestling > 50
; Убивать элемов выкопанных другими чарами?
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
KillOtherElem='Yes'
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; ElemSignal='Off'/'On' - Play sound when elemental is digged
; Оповешать при появлении элема
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
ElemSignal='On'
BaseX=5532
BaseY=1421
BaseZ=0
Endif
;-=-=-=-=-=-=-=-=-=--=-=-= Liche =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-;
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; Настройка скрипта на чара. Ну соответственно поменять имена
; на имена своих чаров.
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
If UO.GetGlobal('CharName')=='Liche' Then
UO.Print("Good day Liche!")
MaxWeight=800
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; DigDistance=4 - Distance from tile where pickaxe targeting
; Радиус круга по которому будет копать чар, то есть расстояние
; до клетки куда можно дотянуться киркой.
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
DigDistance=4
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; KillElemental='Yes'/'No' - Use 'Yes' if char skilled to morph
; in daemon and wrestling > 50
; Если чар достаточно прокачен чтоб бить элемов, ставьте 'Yes'
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
KillElemental='No'
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; KillOtherElemental='Yes'/'No' - Use 'Yes' if char skilled to morph
; in daemon and wrestling > 50
; Убивать элемов выкопанных другими чарами?
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
KillOtherElem='No'
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; ElemSignal='Off'/'On' - Play sound when elemental is digged
; Оповешать при появлении элема
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
ElemSignal='On'
BaseX=5521
BaseY=1430
BaseZ=0
Endif
;-=-=-=-=-=-=-=-=-=--=-=-=- Zombie -=-=-=-=-=-=-=-=-=-=-=-=-=-;
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; Настройка скрипта на чара. Ну соответственно поменять имена
; на имена своих чаров.
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
If UO.GetGlobal('CharName')=='Zombie' Then
UO.Print("Good night Zombie!")
MaxWeight=800
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; DigDistance=4 - Distance from tile where pickaxe targeting
; Радиус круга по которому будет копать чар, то есть расстояние
; до клетки куда можно дотянуться киркой.
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
DigDistance=4
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; KillElemental='Yes'/'No' - Use 'Yes' if char skilled to morph
; in daemon and wrestling > 50
; Если чар достаточно прокачен чтоб бить элемов, ставьте 'Yes'
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
KillElemental='No'
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; KillOtherElemental='Yes'/'No' - Use 'Yes' if char skilled to morph
; in daemon and wrestling > 50
; Убивать элемов выкопанных другими чарами?
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
KillOtherElem='No'
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
; ElemSignal='Off'/'On' - Play sound when elemental is digged
; Оповешать при появлении элема
;""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
ElemSignal='On'
BaseX=5532
BaseY=1430
BaseZ=0
Endif
While NOT UO.Dead()
walkn(BaseX,BaseY,"")
digitstay(MaxWeight,DigDistance,KillElemental,ElemSignal,BaseX,BaseY,KillOtherElem)
wend
end sub
;-------------------- Try to mine under self ------------------
sub digitstay(MaxWeight,MaxDistance,KillElemental,ElemSignal,BaseX,BaseY,KillOtherElem)
VAR x,y,z='0',TileNum='1339'
VAR Last=0,LastTimer
For x=-MaxDistance to MaxDistance
For y=-MaxDistance to MaxDistance
Repeat
CheckLag() ; deleting journal
ToHide()
UO.WaitTargetTile(TileNum,STR(UO.GetX()+x),STR(UO.GetY()+Y),z)
UO.UseType('0x0E85')
LastTimer=UO.Timer()
repeat
wait(500)
until UO.InJournal("Try mining") OR UO.InJournal("You put") OR UO.InJournal("You loosen") OR UO.InJournal("There is no") OR UO.InJournal("That is too") OR UO.InJournal("OOPS") OR UO.InJournal("attacking you") OR LastTimer+150<UO.Timer()
if UO.InJournal('You loosen') then
repeat
wait(500)
until UO.InJournal("You put") OR LastTimer+105<UO.Timer()
endif
if UO.InJournal('something with ore') OR UO.InJournal("attacking you") then
If ElemSignal=='On' Then
Gong(2)
Endif
If KillElemental=='Yes' Then
KillElem()
walkn(BaseX,BaseY,"")
Else
; any user defined command when char digget elemental
UO.SetEasyUO(99,'1')
Endif
endif
if UO.InJournal("attacking you") then
gong(3)
endif
if KillOtherElem=='Yes' and UO.GetEasyUO(99)=="1" then
KillElem()
walkn(BaseX,BaseY,"")
endif
if UO.Weight>=MaxWeight then
unloadore()
endif
until UO.InJournal("There is no") OR UO.InJournal("That is too")
Next
Next
end sub
;------------------------- Unload ore -------------------------
sub unloadore()
VAR TempX,TempY,i,Exit
VAR UnloadX=5518, UnloadY=1434
VAR UnloadCont='0x400D1BFC'
DIM Ore[5]
TempX=UO.GetX()
TempY=UO.GetY()
While UO.GetEasyUO(99)=='1'
wait(3000)
Wend
walkn(UnloadX,UnloadY,"")
ToHide()
Ore[0]=0x19B9 ; 4 and more ore
Ore[1]=0x19B7 ; 1 ore
Ore[2]=0x19BA ; 2 ore
Ore[3]=0x19B8 ; 3 ore
UO.SetReceivingContainer(UnloadCont) ; storecontainer
wait(500)
For i=0 to 3
Exit=0
repeat
UO.FindType(Ore[i])
if UO.GetQuantity('finditem')>0 then
UO.Grab('0','finditem')
CheckLag()
wait(1500)
Else
Exit=1
endif
until Exit==1
Next
UO.UnSetReceivingContainer()
walkn(TempX,TempY,"")
ToHide()
end sub
;----------- Morf in Daemon, kill elem and loot him -----------
sub killelem()
VAR Count, LastTimer, Elem
UO.UseType('0x0F0E','0x0631') ; inviz potion
While UO.STR<201 ; U'r not morfed char max Strength + 1
If UO.Mana>=50 then
UO.WaitMenu('What','Daemon')
UO.Cast('Polymorph')
wait(8000)
else
UO.UseType('0x0F0E','0x09DF') ; total mana potion
wait(3000)
endif
Wend
LastTimer=UO.Timer()
repeat
UO.BandageSelf()
wait(4000)
until UO.Life==UO.STR OR LastTimer+300<UO.Timer()
UO.UseType(0x1B76) ; heater shield
UO.UseType(0x1413) ; platemail gorget
UO.DeleteJournal()
UO.Exec('warmode 1')
UO.FindType('0x0010',-1,'ground')
Elem=UO.GetSerial('finditem')
UO.Attack(Elem)
repeat
wait(1000)
If UO.Life<50 Then
UO.UseType('0x0F0E','0x09BB') ;GH
Endif
If UO.GetDistance(Elem)>1 Then
walkn(0,0,Elem)
Endif
until UO.IsNPC(Elem)==0
wait(3000)
UO.WaitTargetGround('0x19B9') ; 4 and more ore
wait(1500)
UO.Grab('all')
UO.WaitTargetGround('0x0EED') ; gold coins
wait(500)
UO.Grab('all')
UO.FindType('0x0010',-1,'ground')
If UO.GetQuantity('finditem')>0 Then
KillElem()
Endif
UO.Exec('warmode 0')
wait(1000)
UO.Print("Sdoh skotina!")
UO.SetEasyUO(99,'0')
LastTimer=UO.Timer()
if UO.Life<200 then ; U'r max HP
repeat
UO.BandageSelf()
wait(4000)
until UO.Life>200 OR LastTimer+300<UO.Timer()
endif
UO.DeleteJournal()
end sub