Жуть какая то, с этими тайлами. Попытался передрать все, что хоть немного понял и окончательно повис в циклах. Помогите разобраться уже жижа закипает .
Code: Select all
Program Mining;
{$Include 'all.inc'}
var
X0,Y0,Z0,Tnum: Word;
Tile0: TStaticCell;
W0: Byte;
x,y, i,k : integer;
xf,yf, LayersCount : word;
i1,i2,nr : integer;
//MiningFlag : Boolean; // true - работаем, false - нет (разгрузка или смерть)
r_cave: array [1..16] of string;
j : integer;
Const
Bags = $0E75;
ShovelType =$0F39;
Mes1 = 'no metal';
Mes2 = 'far away';
Mes3 = 'too far away';
Ore5 = $3193;
Ore6 = $3192;
Ore7 = $3198;
Ore8 = $3197;
Ore9 = $3194;
Ore10 = $3195;
Ore1 = $19B7; // 1 Ore
Ore2 = $19BA; // 2 Ore
Ore3 = $19B8; // 3 Ore
Ore4 = $19B9; // 4 Ore
ingot = $1BF2;
ttools = $1EB8;
sunduk_With_Iron_and_Tools = $4013C4DD;
Mes4 = 'There is no ore here to mine';
runebook = $400F2A64;
runebook_cave = $4024A059; // Runebook
r_home = '7';
r_bank = '13';
procedure home;
begin
repeat
Cast('Sacred Journey');
waitfortarget(2000);
until targetpresent = true
targettoobject(runebook)
end;
//#########################################################
procedure Check_Iron;
begin
FindTypeEx(Ingot,$0000,Backpack,False);
if (FindCount=0) OR (GetQuantity(FindItem)<5) then
begin
AddToSystemJournal('Добираем инги.')
UseObject(Sunduk_With_Iron_and_Tools);
wait(1000);
FindTypeEx(Ingot,$0000,Sunduk_With_Iron_and_Tools,False);
if (FindCount>0) and (GetQuantity(FindItem)>100) then
begin
MoveItem(FindItem,100,Backpack,0,0,0);
wait(1000);
end
else
AddToSystemJournal('Ошибка во время добора Iron Ignots.');
exit;
end;
FindType(Ingot,Ground);
if FindCount>0 then
begin
MoveItem(ingot,$FFFF,Sunduk_With_Iron_and_Tools,0,0,0);
wait(500);
end
end;
//#########################################################
procedure recal_rb(rune : string);
var
mx, my, k, Res : Integer;
begin
repeat
Res := 0;
AddToSystemJournal('Пытаемся рекольнутся.');
//repeat
while GetGumpID(GetGumpsCount-1) <> $0059 do begin
//if (Weight > (MaxWeight-71)) or (CountEx(ShovelType, $FFFF, backpack) < 1) then
//begin
//if rune = r_home then
//begin
//addtosystemjournal('Используем рунбук в дом.');
//UseObject(runebook);
//wait(550)
///else
addtosystemjournal('Используем рунбук в шахту.');
UseObject(runebook_cave);
wait(2000);
//end
// until GetGumpID(GetGumpsCount-1) <> $0059
end;
mx := GetX(self);
my := GetY(self);
k := 0;
waitgump(rune);
wait(2000)
addtosystemjournal('Проверяем изменились ли координаты');
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 begin
Res := 1;
addtosystemjournal('Все хорошо координаты изменились');
end;
until Res = 1;
end;
//#########################################################
function CheckShovel : Boolean;
var
TimeStart : TDateTime;
begin
Result := true;
if (CountEx(ShovelType, $FFFF, backpack) < 1) then
begin
addtosystemjournal('Пора делать лопаты');
if (Getx(self) <> 1630) and (Gety(self) <> 1067) then
begin
home;
addtosystemjournal('Реколимся к дому');
end;
Check_Iron;
addtosystemjournal('Проверяем металл в паке');
timestart:=now;
k :=0
addtosystemjournal('Начинаем крафт лопат');
repeat
useobject(findtype(ttools,Backpack));
while GetGumpID(GetGumpsCount-1) <> $01CC do
wait(550);
WaitGump('9002');
while GetGumpID(GetGumpsCount-1) <> $01CC do
wait(550);
WaitGump('18');
wait(1000);
k:=k+1;
CheckSave;
until (injournalbetweentimes('You put|failed', TimeStart, Now)<>-1) or (k > 4)
wait(100);
end;
MoveItem(ingot,$FFFF,Sunduk_With_Iron_and_Tools,0,0,0);
wait(500);
result := true;
end;
//#########################################################
function DischargeSunduk : Boolean;
// 1 - Все ок.
// 0 - Лажа.
var tmpcnt : Integer;
tmpid : Cardinal;
tmpconnect : TDateTime;
begin
addtosystemjournal('Пришли на разгрузку');
Result := true;
waitconnection(3000);
tmpconnect := ConnectedTime;
//CheckDead;
if Dead then
begin
Result := false;
exit;
end;
addtosystemjournal('Открываем сундук с металлом');
UseObject(sunduk_With_Iron_and_Tools);
checksave;
// Переместим руду
tmpcnt := 0;
repeat
tmpid := FindTypeEx(Ore1,$FFFF,Backpack,False);
if tmpid = 0 then tmpid := FindTypeEx(Ore2,$FFFF,Backpack,False);
if tmpid = 0 then tmpid := FindTypeEx(Ore3,$FFFF,Backpack,False);
if tmpid = 0 then tmpid := FindTypeEx(Ore4,$FFFF,Backpack,False);
if tmpid = 0 then tmpid := FindTypeEx(Ore5,$FFFF,Backpack,False);
if tmpid = 0 then tmpid := FindTypeEx(Ore6,$FFFF,Backpack,False);
if tmpid = 0 then tmpid := FindTypeEx(Ore7,$FFFF,Backpack,False);
if tmpid = 0 then tmpid := FindTypeEx(Ore8,$FFFF,Backpack,False);
if tmpid = 0 then tmpid := FindTypeEx(Ore9,$FFFF,Backpack,False);
if tmpid = 0 then tmpid := FindTypeEx(Ore10,$FFFF,Backpack,False);
if tmpid = 0 then break;
tmpcnt := tmpcnt + 1;
if tmpcnt > 11 then
begin
addtosystemjournal('Ошибка не могу переместить руду!');
Result := false;
exit;
end;
{repeat
tmpstack := FindtypeEx(Ore1,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
if tmpstack = 0 then tmpstack := FindtypeEx(Ore2,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
if tmpstack = 0 then tmpstack := FindtypeEx(Ore3,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
if tmpstack = 0 then tmpstack := FindtypeEx(Ore4,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
if tmpstack = 0 then tmpstack := FindtypeEx(Ore5,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
if tmpstack = 0 then tmpstack := FindtypeEx(Ore6,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
if tmpstack = 0 then tmpstack := FindtypeEx(Ore7,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
if tmpstack = 0 then tmpstack := FindtypeEx(Ore8,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
if tmpstack = 0 then tmpstack := FindtypeEx(Ore9,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
if tmpstack = 0 then tmpstack := FindtypeEx(Ore10,GetColor(tmpid),sunduk_With_Iron_and_Tools,False);
if GetQuantity(tmpstack) >= 60000 then Ignore(tmpstack);
until (tmpstack = 0) OR (GetQuantity(tmpstack) < 60000);
// Если не найден в сундуке тогда просто контейнер.
if tmpstack = 0 then tmpstack := sunduk_With_Iron_and_Tools;}
waitconnection(3000);
MoveItem(tmpid,0,sunduk_With_Iron_and_Tools,0,0,0);
wait(1000);
CheckSave;
until tmpid = 0;
{//HowManyDischarge := HowManyDischarge + 1;
IgnoreReset;
with TStringList.Create do
try
Add('Разгрузка руды: ' + DateTimeToStr(Now));
SaveToFile('mining_' + GetName(self) + '.log');
finally
free;
end;}
addtosystemjournal('разгрузка окончена');
end;
//#########################################################
procedure Mine;
var
cTime : TDateTime;
begin
while j < 17 do
begin
AddToSystemJournal('установили cTime, начинаем цикл for');
for x:= -2 to 2 do
begin
AddToSystemJournal('переменная x с -2 до +2');
wait(100);
for y:= -2 to 2 do
begin
AddToSystemJournal('переменная y с -2 до +2');
repeat
waitconnection(5000);
AddToSystemJournal('повторный цикл, дождались связи');
{if not CheckShovel then
begin
AddToSystemJournal('нету лопат, ставим флаг и выходим из цикла');
MiningFlag:=False;
Exit;
end;}
if TargetPresent then CancelTarget;
AddToSystemJournal('приверили таргет');
if WarMode = true then SetWarMode(false);
AddToSystemJournal('проверили вармод');
if (weight>(MaxWeight-71)) then Begin home; {DischargeSunduk;} Exit; End;
cTime := Now;
AddToSystemJournal('cTime установили, проверили флаги');
wait(250);
X0:=GetX(Self);
Y0:=GetY(Self);
Z0:=GetZ(Self);
W0:=WorldNum;
AddToSystemJournal('установил значение переменный X0,Y0,Z0,W0');
Tile0:=ReadStaticsXY(X0+(x),Y0+(y),W0);
AddToSystemJournal('установил значение переменной Tile0');
Addtosystemjournal(
' | Tile = ' +IntToStr(Tile0.Statics[0].Tile)+
' | X = ' +IntToStr((Tile0.Statics[0].X)+x)+
' | Y = ' +IntToStr((Tile0.Statics[0].Y)+y)+
' | Z = ' +IntToStr(Tile0.Statics[0].Z));
Tnum := Tile0.Statics[0].Tile;
AddToSystemJournal('установил Tnum');
UseObject(FindType(ShovelType,backpack));
AddToSystemJournal('использую лопату и жду таргета');
WaitForTarget(2000);
if TargetPresent and (Tile0.StaticCount > 0)
and (Tnum > 1338)
and (Tnum < 1344) then
//and (MiningFlag = true)
Begin
AddToSystemJournal('если все условия выполненны то кидаем таргет на тайл');
TargetToTile(Tile0.Statics[0].Tile,(Getx(Self))+(x),(Gety(self))+(y),(Getz(self)));
End
Else
Begin
AddToSystemJournal('если нет то скидываем таргет');
CancelTarget;
Addtosystemjournal('указываем на плохой тайл: ');
Addtosystemjournal(
' | Tile = ' +IntToStr(Tile0.Statics[0].Tile)+
' | X = ' +IntToStr((Tile0.Statics[0].X)+x)+
' | Y = ' +IntToStr((Tile0.Statics[0].Y)+y)+
' | Z = ' +IntToStr(Tile0.Statics[0].Z));
exit; <<< Дальше этого екзита скрипт не заходит и поетому мы висим и ничего не делаем.
End;
i:=0;
AddToSystemJournal('обозначаем переменную i: ' +intTostr(i));
repeat
wait(200);
AddToSystemJournal('обрабатываем тайл');
UseObject(FindType(ShovelType,backpack));
WaitForTarget(2000);
If TargetPresent and (Tile0.StaticCount > 0) and (Tnum > 1338) and (Tnum < 1344) then
Begin
AddToSystemJournal('проверка на все возможные условия если да то кидаем таргет на тайл');
TargetToTile(Tile0.Statics[0].Tile,(Getx(Self))+x,(Gety(self))+y,(Getz(self)));
End
Else
Begin
CancelTarget;
Addtosystemjournal('в принципе не возможно но ещё один плохой тайл: ');
Addtosystemjournal(
' | Tile = ' +IntToStr(Tile0.Statics[0].Tile)+
' | X = ' +IntToStr((Tile0.Statics[0].X)+x)+
' | Y = ' +IntToStr((Tile0.Statics[0].Y)+y)+
' | Z = ' +IntToStr(Tile0.Statics[0].Z));
i := 10;
Break;
End;
checksave;
i := i+1;
until (InJournalBetweenTimes(Mes1, Ctime, Now) <> -1)
or (InJournalBetweenTimes(Mes2, Ctime, Now) <> -1)
or (InJournalBetweenTimes(Mes3, Ctime, Now) <> -1)
or (i>=10)
or Dead
or (weight>(MaxWeight-71))
or ((Tnum < 1339) and (Tnum > 1343))
// if Paralyzed OR Poisoned OR (Life < MaxLife) then Begin UOSay('guards'); fastrecall; sjob; Exit; End;
if (weight>(MaxWeight-71)) then Begin home; Exit; End;
wait(200);
until (InJournalBetweenTimes(Mes1, Ctime, Now) <> -1)
or (InJournalBetweenTimes(Mes2, Ctime, Now) <> -1)
or (InJournalBetweenTimes(Mes3, Ctime, Now) <> -1)
or Dead
or (weight>(MaxWeight-71))
or (i >= 10)
or ((Tnum < 1339) and (Tnum > 1343))
//or (LayersCount <1);
Addtosystemjournal('отработали тайл');
end;
Addtosystemjournal('отработали Y');
end;
Addtosystemjournal('отработали X');
j:=j+1;
Addtosystemjournal('Массив j+1');
recal_rb(r_cave[j]);
if (j >=17) then j:=1;
end;
j:=1;
Addtosystemjournal('Сбросили массив j в 0');
end;
//#########################################################
BEGIN
//MiningFlag := true;
j:=1;
r_cave[1] := '7';
r_cave[2] := '13';
r_cave[3] := '19';
r_cave[4] := '25';
r_cave[5] := '31';
r_cave[6] := '37';
r_cave[7] := '43';
r_cave[8] := '49';
r_cave[9] := '55';
r_cave[10] := '61';
r_cave[11] := '67';
r_cave[12] := '73';
r_cave[13] := '79';
r_cave[14] := '85';
r_cave[15] := '91';
r_cave[16] := '97';
repeat
//WaitTargetSelf;
//UseSkill('Detecting Hidden');
addtosystemjournal('Проверяем где мы находимся');
if (Getx(self) <> 1630) and (Gety(self) <> 1067) then
begin
home;
addtosystemjournal('Реколимся к дому');
end;
//recal_rb(r_home);
///end
//else
//MiningFlag :=true;
//if (MiningFlag = true) and (
if Weight < (MaxWeight-71) then
begin
addtosystemjournal('Проверяем лопаты');
checkshovel;
addtosystemjournal('Рекол в шахту');
recal_rb(r_cave[j]);
addtosystemjournal('Начинаем процедуру обкопки');
Mine;
end
else
addtosystemjournal('Идем на выгрузку');
DischargeSunduk;
//AddToSystemJournal('поминили');
//AddToSystemJournal('Вес: '+IntToStr(Weight) +' Количество Лопат: ' + IntToStr(Count(ShovelType)));
until (1<>1);
END.