Скрипт для копки в обычной шахте
1-я рунка в рунбуке домой 9-я в шахту.
Удачной копки.
версия 1.1:
- внесены некоторые изменения введен добор скролов и реагентов при разгрузке.
версия 1.2:
- написана процедура убийства элементаля
- доработана проверка на кирку и при ее исчезновении рекол домой за ней
- испрвлены некоторые ошибки в коде
- теперь перед реколом при появлении ПК выпиваем бутылку с инвизкой
Code: Select all
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 = $0E85; // Типы кирок
Pickaxe2 = $0E86;
Ore1 = $19B7; // 1 Ore
Ore2 = $19BA; // 2 Ore
Ore3 = $19B8; // 3 Ore
Ore4 = $19B9; // 4 Ore
Sunduk_ore = $4010C799; // Sunduk of ore
runebook = $404B4021; // Runebook
r_cave = 1025; // Number of rune to cave 9 (no change)
r_home = 21; // Number of rune to home 1 (no change)
MyMaxWeight = 400; // Max Weight
CaveLimit = 1282; // Cave limit
RuneHome=$4001E531; // Rune to fast recall
Recall=$1F4C; // Type Recall scrolls
pk_time=120; // Seconds of wait to pk go
kill_elem=0; // Убивать элементаля (в паке должны быть инвизки, скролы вортекса, скролы масс диспела)
Itype=$0F09; // Тип инвизки
vxcol=$FFFF; // Цвет скрола вортекса
vacol=$FFFF; // Цвет скрола мас диспела
var
minret,StartFlag : Integer;
HowManyDischarge : Integer;
ScriptStartTime : TDateTime;
flag1 : Boolean;
procedure CheckDead;
Begin
if Dead then
begin
AddToSystemJournal('Персонаж мертв: '+TimeToStr(now));
FullDisconnect;
end
end;
procedure kill_elemental;
var
ctime : TDateTime;
castvx, castva : Boolean;
c, Eltype: Integer;
begin
Eltype:=$0010; // Тип элементаля
castvx:=false;
castva:=false;
// Search and use Invisible potion
FindType(Itype,backpack);
if FindCount>0 then
begin
UseType(Itype,$FFFF);
end;
// Search and use Vortex Scroll
repeat
FindTypeEx($0F0E,vxcol,Backpack,false);
if FindCount>0 then
begin
AddToSystemJournal('Кастую вортекса');
repeat
UseObject(FindItem);
ctime:=Now;
wait(5000);
FindTypeEx($0F0E,vxcol,backpack,false);
until (inJournalBetweenTimes('Vortex', ctime, Now)<>0) or (FindCount = 0);
if (inJournalBetweenTimes('Vortex', ctime, Now)<>0) then castvx:=true;
end;
// Search Elemental
if castvx = true then
begin
FindDistance:=17;
AddToSystemJournal('Жду пока умрет элементаль');
FindType(Eltype,ground)
c:=0;
repeat
c:=c+1;
wait(10000);
FindType(Eltype,ground)
until (FindCount = 0) OR (c = 20);
end;
until (c < 20) or (castvx = false);
// Search and use Vas An Ort Scroll
if castvx = true then
begin
FindTypeEx($0F0E,vacol,backpack,false);
if FindCount>0 then
begin
AddToSystemJournal('Кастую воз ан орт');
repeat
UseObject(FindItem);
ctime:=Now;
wait(6000);
FindTypeEx($0F0E,vacol,backpack,false);
until (inJournalBetweenTimes('fizzles', ctime, Now) = 0) or (FindCount = 0);
if (inJournalBetweenTimes('fizzles', ctime, Now) = 0) then castva:=true;
end;
if castva = true then
begin
AddToSystemJournal('Лутаю');
FindType($19B9,ground);
if FindCount > 0 then
begin
grab(FindItem,0);
wait(800)
end;
FindType($19B7,ground);
if FindCount > 0 then
begin
grab(FindItem,0);
wait(800)
end;
FindType($19BA,ground);
if FindCount > 0 then
begin
grab(FindItem,0);
wait(800)
end;
FindType($19B8,ground);
if FindCount > 0 then
begin
grab(FindItem,0);
wait(800)
end;
FindType($0EED,ground);
if FindCount > 0 then
begin
grab(FindItem,0);
wait(800)
end;
end;
end;
end;
procedure elemental;
var TimeInterno : TDateTime;
begin
if kill_elem = 1 then
begin
kill_elemental;
wait(1000);
exit;
end;
ClearJournal;
TimeInterno := Now;
Addtosystemjournal('В переще элементаль для продолжение напишите start');
repeat
UOSay('\w Galiano: Elemental!!!'); // Приватное сообщение помощнику (который прийдет и убьет эля)...
wait(3000);
until (inJournalBetweenTimes('start', TimeInterno, Now) >= 0);
end;
function pk_save : Boolean;
var mx, my, k, Res, scrol_r : Integer;
begin
Result := true;
addtosystemjournal('Найдены опасные персонажи реколимся домой по рунке');
repeat
Res := 0;
if not Hidden then
begin
// Search and use Invisible potion
FindType(Itype,backpack);
if FindCount>0 then
begin
UseType(Itype,$FFFF);
end;
end;
CheckDead;
AddToSystemJournal('Пробуем улететь');
if TargetPresent then CancelTarget;
FindType(Recall,backpack);
if (FindQuantity <> 0) then
begin
Addtosystemjournal('Используем свиток');
UseObject(finditem);
WaitForTarget(1500);
TargetToObject(RuneHome);
scrol_r := 1;
end;
if scrol_r < 1 then
begin
Addtosystemjournal('Реколимся при помощи магии');
cast('Recall')
WaitForTarget(1500);
TargetToObject(RuneHome);
end;
mx := GetX(self);
my := GetY(self);
k := 0;
repeat
wait(500)
k := k + 1;
until (mx<>GetX(self)) or (my<>GetY(self)) or Dead or (k = 10)
if (mx<>GetX(self)) or (my<>GetY(self)) then Res := 1;
until Res = 1;
wait(pk_time*1000);
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('Нету кирки :((');
exit;
end;
if not equip(RhandLayer,tmpser) then
begin
wait(1000);
if not equip(RhandLayer,tmpser) then
begin
Result := false;
addtosystemjournal('Нету кирки :((');
exit;
end;
end;
wait(500);
checksave;
end;
end;
procedure CheckHide;
begin
if Hidden then exit;
if WarMode = true then SetWarMode(false);
repeat
UseSkill('Hiding');
wait(4500);
checksave;
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;
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
repeat
Res := 0;
CheckDead;
AddToSystemJournal('Пытаемся рекольнуться');
tmpr := rune;
waitgump(IntToStr(tmpr));
wait(1000)
UseObject(runebook);
mx := GetX(self);
my := GetY(self);
k := 0;
repeat
wait(500)
k := k + 1;
until (mx<>GetX(self)) or (my<>GetY(self)) or Dead or (k = 20)
if (mx<>GetX(self)) or (my<>GetY(self)) then Res := 1;
until 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);
checksave;
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;
if minret = 5 then pk_save;
if minret = 6 then elemental;
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;
recal_rb(r_cave);
end;
CheckDead;
until false;
End.