Code: Select all
program MineBotRohan;
// v.2.01b (c) Edred
//
// 2.01 - ввел дополнительно в ходилку проверку коннекта. Теперь при реконнекте
// чар не сбивается с маршрута. Ввел дополнительные циклы проверок
// успешности разгрузки в банк и реса, если реконнект - процедуры
// будут повторены с новым открыванием банка. Ввел раздельные для
// каждого чара лимиты пещеры (крайние точки, дальше которых копка
// не продолжается).
{$Include 'all.inc'}
const
r1 = 4; r2 = 6; r3 = 14; r4 = 4; r5 = 4; r6 = 4; r7 = 10; r8 = 8;
rmax = 14; // максимальный
M_nothing1 = 'There is nothing here';
M_nothing2 = 'That is too far';
M_nothing3 = 'Try mining elsewhere.';
M_nothing4 = 'You cannot mine so close';
M_nothing5 = 'You have no line';
M_nothing6 = 'there is no more ore here to mine';
M_fizzles1 = 'You loosen some rocks';
M_fizzles2 = 'не смогли выкопать ничего';
M_needwait = 'You decide not to mine';
M_success = 'in your pack.';
MaxLimit = 10; // максимальное кол-во физлов одной точки
Pickaxe1 = $0E85; // Типы кирок
Pickaxe2 = $0E86;
JevelType = $0F29; // тип Jewel of Spirits
Ore1 = $19B7; // 1 Ore
Ore2 = $19BA; // 2 Ore
Ore3 = $19B8; // 3 Ore
Ore4 = $19B9; // 4 Ore
DeedType = $14EF; // Тип дида
Vikktoria = $00013D85;
DeadLife = 10; // Временно - если меньше здоровья - мы мертвы
// Точнее, проверить через реконнект.
type Rail = array[1..rmax] of Integer;
var
Rail_1, Rail_2, Rail_3, Rail_5, Rail_6, StartMinPoint : Rail;
minret, MyMaxWeight, StartFlag, CaveLimit : integer;
BankBoxID,BagInBank1,BagInBank2,BagInBank3,BagInBank4,BagInBank5,BagInBank6 : Cardinal;
flag1,DisGlobalFlag : Boolean;
function InitConfig : Boolean;
// Настройка переменных под конкретного чара
begin
Result := true;
// Rail_1 - Внутри шахты
Rail_1[1] := 1163;Rail_1[2] := 288;
Rail_1[3] := 1159;Rail_1[4] := 298;
Rail_1[5] := 1155;Rail_1[6] := 298;
// Rail_2 - От шахты до банка
Rail_2[1] := 1100;Rail_2[2] := 232;
Rail_2[3] := 1100;Rail_2[4] := 282;
Rail_2[5] := 1189;Rail_2[6] := 293;
Rail_2[7] := 1189;Rail_2[8] := 239;
Rail_2[9] := 1109;Rail_2[10] := 242;
// Rail_3 - Подход к банку
Rail_3[1] := 1510;Rail_3[2] := 240;
Rail_3[3] := 1509;Rail_3[4] := 242;
// Rail_5 - От банка к шахте
Rail_5[1] := 1516;Rail_5[2] := 142;
Rail_5[3] := 1517;Rail_5[4] := 152;
Rail_5[5] := 1521;Rail_5[6] := 153;
Rail_5[7] := 1566;Rail_5[8] := 185;
// Rail_6 - маршрут подхода к респу кирок
Rail_6[1] := 1308;Rail_6[2] := 2848;
Rail_6[3] := 1302;Rail_6[4] := 2849;
if GetName(self) = 'ThatMyName' then
begin
BankBoxID := $571C9FC1;
BagInBank1 := $57266B21;
BagInBank2 := $57266B22;
BagInBank3 := $57266B23;
BagInBank4 := $54E68583;
BagInBank5 := $57266B20;
BagInBank6 := $57266B27;
MyMaxWeight := 50;
StartMinPoint[1] := 2561;
StartMinPoint[2] := 493;
StartMinPoint[3] := 2564;
StartMinPoint[4] := 488;
StartMinPoint[5] := 2566;
StartMinPoint[6] := 485;
CaveLimit := 2568;
exit;
end;
// Если дошли до сюда - это плохо!
Result := false;
addtosystemjournal('Error: Не могу настроиться под чара!');
exit;
end;
function CheckPickaxe : Boolean;
// Проверяем есть ли кирка и одеваем ее (если необходимо) в правую руку
// возвращаем true - если все ок, false - если нет кирки
// Проверка на то, что в руке у чара не кирка не производится!
var tmpser : Cardinal;
begin
Result := true;
if (ObjAtLayer(RhandLayer) = 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;
end;
function MiningAround : Integer ;
// копаем вокруг чара
// параметр - максимальный вес.
// возвращаем:
// 1 - вокруг чара все вскопано успешно
// 2 - превышен максимальный вес
// 3 - чар под атакой
// 4 - нет кирки
var k, r, x, y : Integer;
var mn1, mn2, mn3, mn4, mn5, mn6, mf1, mf2, mw1, ms1 : Integer;
var ctime : TDateTime;
begin
Result := 1;
if (HP < MaxHP) or Dead then
begin
Result := 3;
exit;
end;
addtosystemjournal(inttostr(GetX(self)) + ' ' + inttostr(GetY(self)) + ': Начинаем обкопку. Вес чара: ' + inttostr(Weight));
for x := -2 to 2 do
begin
for y := -2 to 2 do
begin
r := 0;
repeat
waitconnection(5000);
if (HP < MaxHP) or Dead then
begin
Result := 3;
exit;
end;
if not CheckPickaxe then
begin
Result := 4;
exit;
end;
if TargetPresent then CancelTarget;
if WarMode = true then SetWarMode(false);
ctime := Now;
UseObject(ObjAtLayer(RHandLayer));
WaitForTarget(5000);
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);
mf2 := InJournalBetweenTimes(M_fizzles2, 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 (mf2<>-1) or (ms1<>-1) or (HP < MaxHP) or Dead or (k > 300);
if (HP < MaxHP) or Dead then
begin
Result := 3;
exit;
end;
if Weight > MyMaxWeight then
begin
Result := 2;
exit;
end;
if (mf1<>-1) or (mf2<>-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;
procedure GotoXY(x,y,prec : integer; runflag : boolean);
// x,y - координаты, в которые идем
// prec - точность подхода
// runflag - бежать или идти
// v. 1.04 (с) Edred, скрипт портирован с инжекта
// оригинальная версия Yoko с доработкой AGRS и Edred.
var ld, ldc, dx, dy, mx, my : Integer;
begin
ld := 0; ldc := 0;
while true do
begin
// addtosystemjournal('Идем в: ' + inttostr(x) + ', ' + inttostr(y));
// addtosystemjournal('Счас в: ' + inttostr(GetX(self)) + ', ' + inttostr(GetY(self)));
dx := GetX(self) - x; if dx < 0 then dx := 0 - dx;
dy := GetY(self) - y; if dy < 0 then dy := 0 - dy;
if dy > dx then dx := dy;
if dx <= prec then exit;
mx := GetX(self); my := GetY(self);
dx := mx - x; if dx < 0 then dx := 0 - dx;
dy := my - y; if dy < 0 then dy := 0 - dy;
if dy > dx then dx := dy;
if dx <= prec then exit;
if ld = dx then begin
ldc := ldc + 1;
if ldc > 100 then begin addtosystemjournal( 'GotoXY: Cannot reach location!' ); exit; end;
end
else ld := dx;
waitconnection(5000);
// addtosystemjournal('Отладка: перед шагом: myx, myy = ' + inttostr(mx) + ', ' + inttostr(my) + ' [GotoXY]');
if mx = x then begin
if my = y then exit;
// North
if my > y then begin Raw_Move(0,runflag); continue; end;
// South
Raw_Move(4,runflag); continue;
end;
if mx < x then begin
// Northeast
if my > y then begin Raw_Move(1,runflag); continue; end;
// East
if my = y then begin Raw_Move(2,runflag); continue; end;
// Southeast
Raw_Move(3,runflag); continue;
end;
// Southwest
if my < y then begin Raw_Move(5,runflag); continue; end;
// West
if my = y then begin Raw_Move(6,runflag); continue; end;
// Nortwest
Raw_Move(7,runflag); continue;
end;
end;
procedure GotoRail(TmpR : Rail; TmpRD : Integer; dir, guard : Boolean);
// TmpR - маршрут, по которому двигаться
// TmpRD - размер этого массива
// dir - направление перемещения по маршруту (true - прямое, false - обратное)
// guard - звать гвардов если бьют по дороге или нет (true - звать, false - нет)
// v.1.21 (c) Edred, основана на моих аналогичных функциях для Инжекта и Изи.
var i,k,x,y : Integer;
begin
// число элементов в массиве четное. Каждые два - это координаты.
// 1 : 1,2 2 : 3,4 3 : 5,6 n : n*2-1,n*2
// обратное направление:
// 1 : max-1,max 2 : max-3,max-2 n : max-n*2+1,max-n*2+2
k := TmpRD/2;
for i := 1 to k do
begin
if dir then
begin x := TmpR[i*2 - 1]; y := TmpR[i*2]; end
else
begin x := TmpR[TmpRD - i*2 + 1]; y := TmpR[TmpRD - i*2 + 2]; end;
if guard AND (HP < MaxHP) then
begin UOSay( 'GUARDS' ); wait(100); end;
repeat
wait(1000);
addtosystemjournal('Отладка: идем в ' + inttostr(x) + ', ' + inttostr(y) + ' [GotoRail]');
GotoXY(x,y,0,true);
addtosystemjournal('Отладка: пришли в ' + inttostr(x) + ', ' + inttostr(y) + ' [GotoRail]');
until (GetX(self)=x) and (GetY(self)=y);
end;
end;
function DischargeBank : Boolean;
// Разгружаем пак чара в банк. Возвращаем:
// 1 - все ок, пак разгружен.
// 0 - не получилось.
var
tmpcnt : Integer;
tmpid, tmpstack : Cardinal;
tmpconnect : TDateTime;
begin
Result := true;
if WarMode = true then SetWarMode(false);
tmpconnect := ConnectedTime;
UOSay('bank');
wait(1000)
checksave;
// Переместим в банк SA
tmpcnt := 0;
repeat
tmpid := Findtype(SA,backpack);
if tmpid = 0 then break;
addtosystemjournal( 'Отладка: найдено ' + inttostr(GetQuantity(tmpid)) + ' SA');
tmpcnt := tmpcnt + 1;
if tmpcnt > 10 then
begin
addtosystemjournal('Ошибка: не могу переместить SA в банк!');
Result := false;
exit;
end;
tmpstack := Findtype(SA,BankBoxID);
// Если не найден в банке - тогда просто в контейнер
if tmpstack = 0 then tmpstack := BankBoxID;
MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
MoveItem(tmpid,GetQuantity(tmpid),BankBoxID,0,0,0);
wait(1000);
CheckSave;
until tmpid = 0;
// Переместим в банк джевелы
tmpcnt := 0;
repeat
tmpid := Findtype(JevelType,backpack);
if tmpid = 0 then break;
addtosystemjournal( 'Отладка: найдено ' + inttostr(GetQuantity(tmpid)) + ' Jewels of Spirit');
tmpcnt := tmpcnt + 1;
if tmpcnt > 10 then
begin
addtosystemjournal('Ошибка: не могу переместить Jewels of Spirit в банк!');
Result := false;
exit;
end;
tmpstack := Findtype(JevelType,BankBoxID);
// Если не найден в банке - тогда просто в контейнер
if tmpstack = 0 then tmpstack := BankBoxID;
MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
MoveItem(tmpid,GetQuantity(tmpid),BankBoxID,0,0,0);
wait(1000);
CheckSave;
until tmpid = 0;
// Переместим в банк руду
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;
addtosystemjournal( 'Отладка: нашли Ore в количестве ' + inttostr(GetQuantity(tmpid)));
tmpcnt := tmpcnt + 1;
if tmpcnt > 10 then
begin
addtosystemjournal('Ошибка: не могу переместить Ore в банк!');
Result := false;
exit;
end;
tmpstack := Findtype(JevelType,BankBoxID);
// Если не найден в банке - тогда просто в контейнер
if tmpstack = 0 then tmpstack := BankBoxID;
MoveItem(tmpid,GetQuantity(tmpid),tmpstack,0,0,0);
MoveItem(tmpid,GetQuantity(tmpid),BankBoxID,0,0,0);
wait(1000);
CheckSave;
until tmpid = 0;
end;
procedure RestoreStamina;
// если стамины мало, восстанавливаем ее чару до полной
begin
if Stam < 20 then
begin
repeat
waitconnection(3000);
wait(1000);
until Stam = MaxStam;
end;
end;
Begin
if not InitConfig then exit;
StartFlag := 1;
// if (GetX(self) = 2509) and (GetY(self) = 542) then
if (GetX(self) = 2516) and (GetY(self) = 555) then
begin
// стартуем от банка
addtosystemjournal('Скрипт начинает работу от банка, идем в шахту');
begin
RestoreStamina;
end;
GotoRail(Rail_5,r8,true,false);
end;
repeat
addtosystemjournal('Я в шахте. Начнем с точки ' + inttostr(StartFlag));
Case StartFlag of
1 : begin
GotoXY( StartMinPoint[1],StartMinPoint[2],0,true);
StartFlag := 2;
end;
2 : begin
GotoXY( StartMinPoint[3],StartMinPoint[4],0,true);
StartFlag := 3;
end;
3 : begin
GotoXY( StartMinPoint[5],StartMinPoint[6],0,true);
StartFlag := 1;
end;
end;
repeat
minret := MiningAround;
if minret = 1 then GotoXY(GetX(self)-3,GetY(self),0,false);
if GetX(self) < (CaveLimit + 3) then break;
until minret <> 1;
addtosystemjournal('Идем в город');
GotoRail(Rail_1,r2,true,false);
GotoRail(Rail_2,r7,true,false);
RestoreStamina;
begin
// Проверим, если чар мертв - пора ресаться
// Чар не мертв, идем на разгрузку
RestoreStamina;
// Около банка, будем разгружаться
DisGlobalFlag := true;
repeat
WaitConnection(5000);
flag1 := DischargeBank;
wait(100);
if not DisGlobalFlag then exit;
until flag1 = true;
RestoreStamina;
addtosystemjournal('Идем в шахту');
GotoRail(Rail_5,r8,true,false);
end;
// Идем обратно
GotoRail(Rail_3,r3,false,true);
GotoRail(Rail_2,r2,false,false);
GotoRail(Rail_1,r1,false,false);
until false;
End.