(на Стелс, который нужно доработать)
(На инже, как пример. В этом скрипте при выкапавания ненужной руды он сразу же капает в следующей координате, как мне и нужно)program Mining;
// (c) v26RuS (Galiano{ASTARTA} DRW) v1.2
{$Include 'all.inc'}
const
M_nothing1 = 'There is no ore here to mine';
M_nothing2 = 'That is too far';
M_nothing3 = 'Try mining in rock';
M_nothing4 = 'You cannot mine so close';
M_nothing5 = 'You have no line';
M_nothing6 = 'reach';
M_fizzles1 = 'You loosen some rocks';
M_needwait = 'You decide not to mine';
M_success = 'in your pack.';
MaxLimit = 15; // максимальное кол-во физлов одной точки
Pickaxe1 = $0E86; // Типы кирок
Pickaxe2 = $0E85;
Ore1 = $19B7; // 1 Ore
Ore2 = $19BA; // 2 Ore
Ore3 = $19B8; // 3 Ore
Ore4 = $19B9; // 4 Ore
Sunduk_ore = $4042EAAF; // Sunduk of ore
runebook = $404DC1BB; // Runebook
r_cave = 33; // Number of rune to cave 9 (no change)
r_home = 21; // Number of rune to home 1 (no change)
MyMaxWeight = 650; // Max Weight
CaveLimit = 4045; // Cave limit
RuneHome=$403DF39E; // Rune to fast recall
Recall=$1F4C; // Type Recall scrolls
pk_time=420; // Seconds of wait to pk go
kill_elem=0; // Убивать элементаля (в паке должны быть инвизки, скролы вортекса, скролы масс диспела)
Itype=$0F0E; // Тип инвизки
vxcol=$0000; // Цвет скрола вортекса
vacol=$0000; // Цвет скрола мас диспела
var
minret,StartFlag : Integer;
HowManyDischarge : Integer;
ScriptStartTime : TDateTime;
flag1 : Boolean;
procedure recal_rb2(rune : integer);
var tmpr : Integer;
mx, my, k, Res : Integer;
begin
Res := 0;
AddToSystemJournal('Пытаемся рекольнуться');
tmpr := rune;
waitgump(IntToStr(tmpr));
wait(1000)
UseObject(runebook);
wait(10000)
mx := GetX(self);
my := GetY(self);
k := 0;
wait(500)
k := k + 1;
if (mx<>GetX(self)) or (my<>GetY(self)) then Res := 1;
end;
Procedure Take;
begin
UseObject($400508C2); //ид суднука с кирками
wait(3000)
FindTypeEx($0E86,$FFFF,$400508C2,True); //ид суднука с кирками
wait(1000)
MoveItem(FindItem,1,Backpack,0,0,0);
wait(3000)
FindTypeEx($0E85,$FFFF,$400508C2,True); //ид суднука с кирками
wait(1000)
MoveItem(FindItem,1,Backpack,0,0,0);
wait(3000)
recal_rb2(r_cave)
end;
procedure Resurrector;
BEGIN
if dead then
begin
HelpRequest;//Нажать "Help"
wait(1000);
waitgump('3');//Нажать "Help i am stuck"
wait(1000);
waitgump(IntToStr(2));//Нажать на кнопку города
wait(3000)
FindDistance:=10;
moveXY(getX($4001BDF0),getY($4001BDF0),false,1,false);
wait(5000)
repeat
useObject($4001BDF0);
wait(8000);
until HP>0;
recal_rb2(r_home);
wait(pk_time*1000);
Take;
end
end;
procedure CheckDead;
Begin
if Dead then
begin
AddToSystemJournal('Персонаж мертв: '+TimeToStr(now));
Resurrector;
end
end;
function CheckPickaxe : Boolean;
// Проверяем есть ли кирка и одеваем ее (если необходимо) в правую руку
// возвращаем true - если все ок, false - если нет кирки
// Проверка на то, что в руке у чара не кирка не производится!
var tmpser : Cardinal;
begin
Result := true;
if (ObjAtLayerEx(RhandLayer,self) = 0) then
begin
// ничего в руках нету
tmpser := findtype(Pickaxe1,backpack);
if tmpser = 0 then tmpser := findtype(Pickaxe2,backpack);
if tmpser = 0 then
begin
Result := false;
addtosystemjournal('Нету кирки(');
recal_rb2(r_home);
Take;
exit;
end;
if not equip(RhandLayer,tmpser) then
begin
wait(1000);
if not equip(RhandLayer,tmpser) then
begin
Result := false;
addtosystemjournal('Нету кирки(');
recal_rb2(r_home);
Take;
exit;
end;
end;
wait(500);
checksave;
end;
end;
procedure CheckHide;
begin
SetWarMode(false);
checkdead;
if Hidden then exit;
if WarMode = true then SetWarMode(false);
repeat
SetWarMode(false);
UseSkill('Hiding');
wait(4500);
checksave;
checkdead;
until Hidden or (not Connected);
end;
function redcheck : Boolean;
// Ищет персонажей от серого к красному в радиусе 10-ти клеток. Возвращаем:
// True - найдетны такие персонажи.
// False - персонажей не найдено все спокойно.
var n : integer; l : TStringList;
begin
l := TStringList.Create();
Result := False;
FindType($190,ground);
GetFindedList(l);
if (l.count > 0) then
begin
for n:= 0 to (l.count-1) do
if (GetNotoriety(StrToInt('$'+l.strings[n]))>2) then Result := true;
end;
l.free;
l := TStringList.Create();
FindType($191,ground);
GetFindedList(l);
if (l.count > 0) then
begin
for n:= 0 to (l.count-1) do
if (GetNotoriety(StrToInt('$'+l.strings[n]))>2) then Result := true;
end;
l.free;
end;
function MiningAround : Integer ;
// копаем вокруг чара
// параметр - максимальный вес.
// возвращаем:
// 1 - вокруг чара все вскопано успешно
// 2 - превышен максимальный вес
// 3 - чар под атакой
// 4 - нет кирки
// 5 - PK
var k, r, x, y : Integer;
var mn1, mn2, mn3, mn4, mn5, mn6, mf1, mw1, ms1 : Integer;
var ctime : TDateTime;
begin
Result := 1;
addtosystemjournal(inttostr(GetX(self)) + ' ' + inttostr(GetY(self)) + ': Начинаем обкопку. Вес чара: ' + inttostr(Weight));
for x := -4 to 4 do
begin
for y := -4 to 4 do
begin
r := 0;
repeat
waitconnection(5000);
if not CheckPickaxe then
begin
Result := 4;
exit;
end;
Checkdead;
CheckHide;
if TargetPresent then CancelTarget;
if WarMode = true then SetWarMode(false);
ctime := Now;
UseObject(ObjAtLayerEx(RhandLayer,self));
WaitForTarget(1000);
If TargetPresent then TargetToTile(1342, GetX(self)+x, GetY(self)+y, GetZ(self));
k := 0;
repeat
wait(100);
k := k + 1;
checksave;
mn1 := InJournalBetweenTimes(M_nothing1, ctime, Now);
mn2 := InJournalBetweenTimes(M_nothing2, ctime, Now);
mn3 := InJournalBetweenTimes(M_nothing3, ctime, Now);
mn4 := InJournalBetweenTimes(M_nothing4, ctime, Now);
mn5 := InJournalBetweenTimes(M_nothing5, ctime, Now);
mn6 := InJournalBetweenTimes(M_nothing6, ctime, Now);
mf1 := InJournalBetweenTimes(M_fizzles1, ctime, Now);
ms1 := InJournalBetweenTimes(M_success, ctime, Now);
until (mn1<>-1) or (mn2<>-1) or (mn3<>-1) or (mn4<>-1) or (mn5<>-1) or (mn6<>-1) or (mf1<>-1) or (ms1<>-1) or Dead or (k > 300);
if InJournalBetweenTimes('heavy', ctime, Now) <> -1 then
begin
Result := 6
exit;
end;
if redcheck = true then
begin
Result := 5
exit;
end;
if Weight > MyMaxWeight then
begin
Result := 2;
exit;
end;
if (mf1<>-1) then
begin
r := r + 1;
if r >= 10 then break
else continue;
end;
if (mw1<>-1) then wait(3000);
until (mn1<>-1) or (mn2<>-1) or (mn3<>-1) or (mn4<>-1) or (mn5<>-1) or (mn6<>-1);
end;
end;
end;
function DischargeSunduk : Boolean;
// Разгружаем пак чара в сундук. Возвращаем:
// 1 - все ок, пак разгружен.
// 0 - не получилось.
var tmpcnt : Integer;
tmpid, tmpstack : Cardinal;
tmpconnect : TDateTime;
begin
addtosystemjournal('Пришли на разгрузку');
Result := true;
waitconnection(3000);
tmpconnect := ConnectedTime;
CheckDead;
if Dead then
begin
Result := false;
exit;
end;
UseObject(Sunduk_ore);
checksave;
// Переместим руду
tmpcnt := 0;
repeat
tmpid := Findtype(Ore1,backpack);
if tmpid = 0 then tmpid := Findtype(Ore2,backpack);
if tmpid = 0 then tmpid := Findtype(Ore3,backpack);
if tmpid = 0 then tmpid := Findtype(Ore4,backpack);
if tmpid = 0 then break;
tmpcnt := tmpcnt + 1;
if tmpcnt > 10 then
begin
addtosystemjournal('Ошибка: не могу переместить руду!');
Result := false;
exit;
end;
repeat
tmpstack := FindtypeEx(Ore1,GetColor(tmpid),Sunduk_ore,False);
if tmpstack = 0 then tmpstack := FindtypeEx(Ore2,GetColor(tmpid),Sunduk_ore,False);
if tmpstack = 0 then tmpstack := FindtypeEx(Ore3,GetColor(tmpid),Sunduk_ore,False);
if tmpstack = 0 then tmpstack := FindtypeEx(Ore4,GetColor(tmpid),Sunduk_ore,False);
if GetQuantity(tmpstack) >= 65000 then Ignore(tmpstack);
until (tmpstack = 0) OR (GetQuantity(tmpstack) < 65000);
// Если не найден в сундуке - тогда просто в контейнер
if tmpstack = 0 then tmpstack := Sunduk_ore;
waitconnection(3000);
MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
wait(1000);
CheckSave;
until tmpid = 0;
HowManyDischarge := HowManyDischarge + 1;
IgnoreReset;
FindType(Recall,Backpack);
if (FindCount = 0) or (Count(Recall) < 5) then
begin
AddToSystemJournal('Добираем скролы');
FindType(Recall,Sunduk_ore);
if FindCount > 0 then
begin
MoveItem(FindItem,10,Backpack,0,0,0);
end;
end;
AddToSystemJournal('Добираем реагенты');
FindType($0F86,Backpack);
if (FindCount = 0) or (Count($0F86) < 10) then
begin
FindType($0F86,Sunduk_ore);
if FindCount > 0 then
begin
MoveItem(FindItem,10,Backpack,0,0,0);
end;
end;
FindType($0F7A,Backpack);
if (FindCount = 0) or (Count($0F7A) < 10) then
begin
FindType($0F7A,Sunduk_ore);
if FindCount > 0 then
begin
MoveItem(FindItem,10,Backpack,0,0,0);
end;
end;
FindType($0F7B,Backpack);
if (FindCount = 0) or (Count($0F7B) < 10) then
begin
FindType($0F7B,Sunduk_ore);
if FindCount > 0 then
begin
MoveItem(FindItem,10,Backpack,0,0,0);
end;
end;
FindType($0F7B,Backpack);
if (FindCount = 0) or (Count($0F7B) < 10) then
begin
FindType($0F7B,Sunduk_ore);
if FindCount > 0 then
begin
MoveItem(FindItem,10,Backpack,0,0,0);
end;
end;
FindType(Itype,Backpack);
if (FindCount = 0) or (Count(Itype) <= 2) then
begin
AddToSystemJournal('Добираем инвизки');
FindType(Itype,Sunduk_ore);
if FindCount > 0 then
begin
MoveItem(FindItem,5,Backpack,0,0,0);
end;
end;
with TStringList.Create do
try
Add('Разгрузка руды: ' + DateTimeToStr(Now));
SaveToFile('mining_' + GetName(self) + '.log');
finally
free;
end;
addtosystemjournal('Разгрузка закончена');
end;
procedure recal_rb(rune : integer);
var tmpr : Integer;
mx, my, k, Res : Integer;
begin
Res := 0;
CheckDead;
AddToSystemJournal('Пытаемся рекольнуться');
tmpr := rune;
waitgump(IntToStr(tmpr));
wait(1000)
UseObject(runebook);
wait(10000)
mx := GetX(self);
my := GetY(self);
k := 0;
wait(500)
k := k + 1;
if (mx<>GetX(self)) or (my<>GetY(self)) then Res := 1;
end;
function GetPickaxe : Boolean;
// Проверяем есть ли кирка и одеваем ее (если необходимо) в правую руку
// возвращаем true - если все ок, false - если нет кирки
// Проверка на то, что в руке у чара не кирка не производится!
var tmpser : Cardinal;
begin
Result := true;
if (ObjAtLayerEx(RhandLayer,self) = 0) then
begin
// ничего в руках нету
tmpser := findtype(Pickaxe1,backpack);
if tmpser = 0 then tmpser := findtype(Pickaxe2,backpack);
if tmpser = 0 then
begin
Result := false;
exit;
end;
if not equip(RhandLayer,tmpser) then
begin
wait(1000);
if not equip(RhandLayer,tmpser) then
begin
Result := false;
exit;
end;
end;
wait(500);
checksave;
end;
if Result = false then
begin
recal_rb(r_home);
useobject(sunduk_ore);
tmpser := findtype(Pickaxe1,Sunduk_ore);
if tmpser = 0 then tmpser := findtype(Pickaxe2,Sunduk_ore);
if tmpser = 0 then
begin
Result := false;
addtosystemjournal('Нету кирки в сундуке:((');
end;
grab(Finditem,1);
if not equip(RhandLayer,tmpser) then
begin
wait(1000);
if not equip(RhandLayer,tmpser) then
begin
Result := false;
addtosystemjournal('Нету кирки в сундуке:((');
exit;
end;
end;
wait(500);
recal_rb(r_cave);
end;
end;
Begin
ScriptStartTime := Now;
HowManyDischarge := 0;
StartFlag := 1;
repeat
// стартуем от сундука
CheckDead;
addtosystemjournal('Вылетаю в шахту');
recal_rb(r_cave);
repeat
CheckDead;
if Dead then break;
GetPickaxe;
minret := MiningAround;
CheckDead;
if Dead then break;
if minret = 4 then GetPickaxe;
until minret = 2;
addtosystemjournal('Пора на разгрузку');
CheckDead;
recal_rb(r_home);
if not Dead then
begin
repeat
WaitConnection(5000);
CheckDead;
if Dead then break;
flag1 := DischargeSunduk;
wait(100);
until flag1 = true;
end;
CheckDead;
until false;
End.
(Зеленым выделена та строка, которая и выполняет нужную функцию на инже)
sub maning()
var mx, my, mz, i, j, jor, ser, noto
Uo.exec("set norbcheck 1");
uo.exec("set norbcalc 1");
uo.print('!!Выбери Лопату!! ')
uo.exec('addobject Shovel')
while uo.targeting()
wait(100)
wend
uo.print('!!Выбери Рунбук!! ')
uo.exec('addobject Runebook')
while uo.targeting()
wait(100)
wend
na4alo:
noto=0
mx = UO.GetX("self")
my = UO.GetY("self")
mz = UO.GetZ("self")
UO.DeleteJournal()
for i = mx-4 to mx+4
for j = my -4 to my+4
while not UO.Hidden()
UO.Warmode(0)
uo.print("Прячемся...")
UO.UseSkill("Hiding")
wait(2500)
wend
UO.Print("Копаем в координатх: "+str(mx-i)+" "+str(my-j))
while not UO.InJournal("no ore here|location|far away|in rock|Iron Ore|Copper|Rusty Ore")
UO.DeleteJournal()
if uo.waiting() then
uo.canceltarget()
endif
UO.Waittargettile("1341", str(i), str(j), str(mz))
uo.useobject('Shovel')
while not UO.InJournal("You put|heavy|location|no ore|but fail|far away|in rock")
wait (500)
if uo.injournal("heavy") or uo.dead() then
pwav() # Сообщение что появился елемент
endif
wend
if uo.weight > 400 then # Максимальный вес
goto end
endif
wend
UO.DeleteJournal()
next
next
goto na4alo
end:
if uo.waiting() then
uo.canceltarget()
endif
uo.exec("recall Runebook 21") # Летим домой
wait(10000)
while not UO.Hidden()
UO.Warmode(0)
uo.print("Прячемся...")
UO.UseSkill("Hiding")
wait(2500)
wend
loot()
wait(700)
reccal:
uo.deletejournal()
if uo.waiting() then
uo.canceltarget()
endif
uo.exec("recall Runebook 94") # Летим в шахту
mx = UO.GetX("self")
my = UO.GetY("self")
wait(10000)
if not UO.GetX("self") <> mx and not UO.GetY("self") <> my then
goto reccal
endif
goto na4alo
end sub
sub loot() ; перекладка руды в сундук
if uo.waiting() then
uo.canceltarget()
endif
VAR a,Exit
VAR UnloadCont='0x4042EAAF' ; АЙДИ сундука для руды
DIM Ore[5]
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)
wait(500)
For a=0 to 3
Exit=0
repeat
UO.FindType(Ore[a])
if UO.GetQuantity('finditem')>0 then
UO.Grab('0','finditem')
wait(1500)
Else
Exit=1
endif
until Exit==1
Next
UO.UnSetReceivingContainer()
end sub
sub pwav() ; звук при выкапывании ЭЛЕМЕНТАЛА
uo.playwav("E:\UO\inject\SOUND\chanting sound 01.wav")
endsub
sub pwavw(); звук при появлении ПК
uo.playwav("E:\UO\inject\SOUND\chanting sound 01.wav")
endsub
sub Pause() ; Пауза скрипта если выкопали Элема (продолжить сказав GO )
UO.DeleteJournal()
uo.exec('exec elem')
REPEAT
WAIT(3000)
UO.Print("!!!СКРИПТ НА ПАУЗЕ!!!!")
UNTIL UO.InJournal('GO')
UO.Print("!!!СКРИПТ ПРОДОЛЖЕН!!!!")
end sub
sub elem()
var monst='0x0010' #тип животного
uo.ignorereset()
UO.Set('finddistance','25')
UO.FindType(monst, '-1', 'ground')
while uo.findcount() > 0
if UO.FindCount() > 0 then
UO.DeleteJournal()
uo.print('Ждём пока исчезнет элем')
else
uo.print('GO')
wait(500)
end if
wend
end sub