Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7

хелп проблема со скриптом на писок/глина

тут можно задать вопрос по скриптингу
Post Reply
proff-2010
Posts: 7
Joined: 10.01.2014 22:15

хелп проблема со скриптом на писок/глина

Post by proff-2010 »

надо помощь в переделке на новую ходилку ибо все оно глючит сбивается и работает нестабильно,максимум шоу меня получилось это изменить изготовление кирок и добавил подбор купера также трабл в стаке итема

Code: Select all

12:58:21:309] System: Could not add item to stack.
[12:58:21:310] System: Some inspecific error when moving item!
мининг песок/глина

Code: Select all

program MiningClay;
var
STATE, mpx, mpy, lowX, lowY, highX, highY: integer;
hynger_timer: TDateTime;
const
on_boatX = 1591;
on_boatY = 3534;
near_boatX = 1594;
near_boatY = 3534;
mine_pointX = 1598;
mine_pointY = 3533;
trap = $623F250C;
critical_weight = 100;
radius = 3;
glina_type = $0EED;
//glinj_type = $19B8;
PickType = $0E85;
PickGump = '3717';
Tinktype = $1EB9;
CopperType = $1BF2;
// STATE SCRIPT
STATE_MINING = 100;
STATE_GO_ON_BOAT = 101;
STATE_ON_BOAT = 102;
STATE_NEAR_BOAT = 103;
//
{$Include 'all.inc'}

function CheckEquipt(equip_type:word; equip_layer:byte): boolean;
begin
if not Connected then 
WaitConnection(3000);
result:= Equipt(equip_layer, equip_type);
wait(500);
end;

// написал Somebody. ICQ: 475728522 e-mail: [email protected]

// Реализация алгоритма "надёжной трассировки"
// http://pmg.org.ru/ai/stout.htm#robust_trace

const
FMoveArrMax = 300; // ставь здесь больше, если твой чар ходит на дистанции больше 13 тайлов или вокруг чара очень много препятствий. Если препятствий на пути мало, то можно оставить как есть.
var
PrognosisX, PrognosisY, FMoveArrCount : integer;
FMoveArr : array [1..FMoveArrMax] of array [1..2] of smallint;


Function Abs(A: integer): integer;
Begin
If A>=0 then result:=A
Else result:=0-A;
End;

function SetDirection(x, y : integer) : integer;
var
   MyX,MyY,DiffX,DiffY,GoDir: integer;
Begin
MyX:=GetX(self);
MyY:=GetY(self);
DiffX:=Abs(MyX-x);
DiffY:=Abs(MyY-y);

if (DiffX/(DiffY+0.1))>=2 then
   begin
   if (MyX>X) then
      GoDir:=6
   else
      GoDir:=2;
   end 
else
   
   if (DiffY/(DiffX+0.1))>=2 then
      begin
      if (MyY>Y) then
         GoDir:=0
      else
         GoDir:=4;
      end 
   else
       
      if (MyX>X) and (MyY>Y) then  GoDir:=7
      else

        if (MyX>X) and (MyY<Y) then  GoDir:=5
        else

           if (MyX<X) and (MyY>Y) then  GoDir:=1
           else

             if (MyX<X) and (MyY<Y) then  GoDir:=3;
             
result:=GoDir;
end;


procedure CalcPrognosis(Dir : integer);
begin
   if (Dir = 1) or (Dir = 2) or (Dir = 3) then PrognosisX := GetX(self) + 1;
   if (Dir = 5) or (Dir = 6) or (Dir = 7) then PrognosisX := GetX(self) - 1;
   if (Dir = 0) or (Dir = 4) then PrognosisX := GetX(self);

   if (Dir = 3) or (Dir = 4) or (Dir = 5) then PrognosisY := GetY(self) + 1;
   if (Dir = 7) or (Dir = 0) or (Dir = 1) then PrognosisY := GetY(self) - 1;
   if (Dir = 2) or (Dir = 6) then PrognosisY := GetY(self);
end;

function TryToMove(Direction : integer; RunFlag : boolean) : boolean;
begin
   if GetDirection(self) <> Direction then Raw_Move(Direction, RunFlag);
   result := Raw_Move(Direction, RunFlag);
end;

function WrongMove(x, y : integer) : boolean;
var
i : integer;
begin
   result := false;
   if FMoveArrCount = 0 then exit;
   for i := 1 to FMoveArrCount do
      begin
      if (x = FMoveArr[i][1]) and (y = FMoveArr[i][2]) then
         begin
         result := true;
         exit;
         end;
      end;
end;


function Min(x,y: integer): integer;
begin
 if x>y then Result:=y else Result:=x;
end;

function HEst(x,y: integer): integer;
var dx,dy,Ddx : integer;
begin
  dx:= GetX(self)-x;
  dy:= GetY(self)-y;
  Ddx:= dx-dy;
  If dx<0 then dx:=0-dx;
  If dy<0 then dy:=0-dy;
  If Ddx<0 then Ddx:=0-Ddx;
  Result:= min(dx,dy)+Ddx;
end;

procedure SetWrongMove(x, y : integer);
begin
   FMoveArrCount := FMoveArrCount + 1;
   FMoveArr[FMoveArrCount][1] := x;
   FMoveArr[FMoveArrCount][2] := y;
end;

function RewindDir(Dir, c : integer) : integer;
begin
   result := Dir + c;
   if result < 0 then result := result + 8;
   if result > 7 then result := result - 8;
end;

function Move(x, y, tolerance : integer) : boolean;
var
Dir, Dist, lastX, lastY, t, i, timeout : integer;
begin
   FMoveArrCount := 0;
   Dist := HEst(x, y);
   timeout := Dist * 13000; // 13 секунд времени на шаг
   t := timer;
   while true do
      begin
      Dist := HEst(x, y);
      if Dist <= tolerance then // пришёл
         begin
         result := true;
         exit;
      end;
      if timer - t > timeout then // провал по таймауту
      begin
         AddToSystemJournal('Move: Time moved out!');
         result := false;
         exit;
      end;
      Dir := SetDirection(x, y);
      CalcPrognosis(Dir);
      if WrongMove(PrognosisX, PrognosisY) then
         begin
         for i := 1 to 7 do
            begin
            Dir := RewindDir(Dir, 1);
            CalcPrognosis(Dir);
            if not WrongMove(PrognosisX, PrognosisY) then break;
            end;
      if i = 8 then
         begin
         AddToSystemJournal('Move: Cannot move');
         result := false;
         exit;
         end;
      end;
      timeout := timeout + 2
      lastX := GetX(self); lastY := GetY(self);
      if TryToMove(Dir, false) then SetWrongMove(lastX, lastY) // отсюда чар пришёл
      else SetWrongMove(PrognosisX, PrognosisY);
      end;
end;

procedure _move(x, y, tolerance : integer);
begin
while not Move(x, y, tolerance) do wait(100);
end;

function GotoOnBoat(locX,locY: integer):integer;
begin
if not Connected then WaitConnection(3000);
while true do begin
 CheckStability;
 checkdead;
 if Move(near_boatX, near_boatY, 0) then begin
  repeat
   UseObject(Trap);
   wait(800);
  until (GetX(self) = locX) and (GetY(self) = locY);
  result:= STATE_ON_BOAT;
  exit;
 end;
end;
end;

function GotoNearBoat(locX,locY: integer):integer;
begin
if not Connected then WaitConnection(3000);
wait(1500);
while true do begin
 CheckStability;
 checkdead;
 UseObject(trap);
 wait(800);
 if Move(near_boatX, near_boatY, 0) then begin
  result:= STATE_NEAR_BOAT;
  exit;
 end;
end;
end;

procedure CheckCooper;
begin
FindType(CopperType, Backpack);
if (FindFullQuantity < 20) then
   begin
   FindTypeEx(CopperType,$0000,Ground,true);
   MoveItem(finditem, 50, Backpack, 0,0,0);
   wait(1000);
   end;
end;

procedure CheckPick;
begin
CheckSave;
checkdead;
CheckCooper;
if (Count(PickType) < 2) then
   begin
   repeat
   CheckCooper;
   //ClearJournal;
   WaitGump(PickGump);
   WaitTargetobject(findtype(CopperType, Backpack));
   UseObject(FindType(TinkType, Ground));
   WaitJournalLine(Now, 'You create|destroy|You put', 30000);
   wait(1000);
   until (Count(PickType) >= 2);
   end;
end;

function GotoMiningPoint(mineX, mineY:integer):integer;
begin
if Move(mineX, mineY, 0) then result:= STATE_MINING;
end;

procedure Mining(px,py: integer);
var
pickaxe_id: cardinal;
begin
if not Connected then WaitConnection(3000);
if TargetPresent then CancelTarget;
pickaxe_id:= ObjAtLayer(RHandLayer);
if pickaxe_id <> 0 then begin
UseObject(pickaxe_id);
WaitTargetXYZ(px,py,GetZ(self));
  WaitJournalLine(now, 'You must|you fail to find any sand|cannot|no sand here |stop|away|broke', 45000);
begin
if TargetPresent then CancelTarget;
end;
end;
end;


begin
if not Connected then WaitConnection(3000);
hynger_timer:= 0;
addToSystemJournal('Script [ Mining Clay ] by Magros');
setARStatus(true);
checkdead;
// mining location setting
lowX:= (mine_pointX - radius);
lowY:= (mine_pointY - radius);
highX:= (mine_pointX + radius);
highY:= (mine_pointY + radius);
while true do begin
 for mpx:= lowX to highX do begin
 for mpy:= lowY to highY do begin
  // проверка на кирку
  CheckStability;
  checkdead;
  if (GetType(ObjAtLayer(RHandLayer)) = 0) then begin
   if not CheckEquipt(PickType, RHandLayer) then STATE:= STATE_GO_ON_BOAT;
   // идем на лодку
   if STATE = STATE_GO_ON_BOAT then STATE:= GotoOnBoat(on_boatX, on_boatY);
   // делаем кирки
   if STATE = STATE_ON_BOAT then CheckPick;
  end;
  // проверка на расположение чара
  if (GetX(self) = on_boatX) and (GetY(self) = on_boatY) then begin STATE:= GotoNearBoat(near_boatX, near_boatY);
  end else begin
   STATE:= STATE_NEAR_BOAT;
  end;
  // идем на место копки
  if STATE = STATE_NEAR_BOAT then begin
   STATE:= GotoMiningPoint(mpx,mpy);
   // копаем
   if STATE = STATE_MINING then Mining(mpx,mpy);
  end;
  // проверка на вес
  if Weight > critical_weight then begin
   STATE:= GotoOnBoat(on_boatX, on_boatY);
   if STATE = STATE_ON_BOAT then begin
    // дропаем глину
    Stack(glina_type, $ffff);
    wait(2000);
    //Stack(glinj_type, $ffff);
    if (now > (hynger_timer + (1.0 / 1440 * 10))) then begin
    Hungry(1,-1);
    hynger_timer:= now;
    end;
  end;
  end;
end;
end;
end;
end.
drabadan
Expert
Expert
Posts: 730
Joined: 13.12.2012 17:35
Contact:

Re: хелп проблема со скриптом на писок/глина

Post by drabadan »

script

Code: Select all

program MiningClay;
var
STATE, mpx, mpy, lowX, lowY, highX, highY: integer;
hynger_timer: TDateTime;
const
on_boatX = 1591;
on_boatY = 3534;
near_boatX = 1594;
near_boatY = 3534;
mine_pointX = 1598;
mine_pointY = 3533;
trap = $623F250C;
critical_weight = 100;
radius = 3;
glina_type = $0EED;
//glinj_type = $19B8;
PickType = $0E85;
PickGump = '3717';
Tinktype = $1EB9;
CopperType = $1BF2;
// STATE SCRIPT
STATE_MINING = 100;
STATE_GO_ON_BOAT = 101;
STATE_ON_BOAT = 102;
STATE_NEAR_BOAT = 103;
//
{$Include 'all.inc'}

function CheckEquipt(equip_type:word; equip_layer:byte): boolean;
begin
if not Connected then 
WaitConnection(3000);
result:= Equipt(equip_layer, equip_type);
wait(500);
end;

// написал Somebody. ICQ: 475728522 e-mail: [email protected]

// Реализация алгоритма "надёжной трассировки"
// http://pmg.org.ru/ai/stout.htm#robust_trace

function GotoOnBoat(locX,locY: integer):integer;
begin
if not Connected then WaitConnection(3000);
while true do begin
 //CheckStability;
 //checkdead;
 if NewMoveXY(near_boatX, near_boatY, true, 0, true) then begin
  repeat
   UseObject(Trap);
   wait(800);
  until (GetX(self) = locX) and (GetY(self) = locY);
  result:= STATE_ON_BOAT;
  exit;
 end;
end;
end;

function GotoNearBoat(locX,locY: integer):integer;
begin
if not Connected then WaitConnection(3000);
wait(1500);
while true do begin
 CheckStability;
 checkdead;
 UseObject(trap);
 wait(800);
 if NewMoveXY(near_boatX, near_boatY, true, 0, true) then begin
  result:= STATE_NEAR_BOAT;
  exit;
 end;
end;
end;

procedure CheckCooper;
begin
FindType(CopperType, Backpack);
if (FindFullQuantity < 20) then
   begin
   FindTypeEx(CopperType,$0000,Ground,true);
   MoveItem(finditem, 50, Backpack, 0,0,0);
   wait(1000);
   end;
end;

procedure CheckPick;
begin
CheckSave;
checkdead;
CheckCooper;
if (Count(PickType) < 2) then
   begin
   repeat
   CheckCooper;
   //ClearJournal;
   WaitGump(PickGump);
   WaitTargetobject(findtype(CopperType, Backpack));
   UseObject(FindType(TinkType, Ground));
   WaitJournalLine(Now, 'You create|destroy|You put', 30000);
   wait(1000);
   until (Count(PickType) >= 2);
   end;
end;

function GotoMiningPoint(mineX, mineY:integer):integer;
begin
if NewMoveXY(mineX, mineY, true, 0, true) then result:= STATE_MINING;
end;

procedure Mining(px,py: integer);
var
pickaxe_id: cardinal;
begin
if not Connected then WaitConnection(3000);
if TargetPresent then CancelTarget;
pickaxe_id:= ObjAtLayer(RHandLayer);
if pickaxe_id <> 0 then begin
UseObject(pickaxe_id);
WaitTargetXYZ(px,py,GetZ(self));
  WaitJournalLine(now, 'You must|you fail to find any sand|cannot|no sand here |stop|away|broke', 45000);
Wait(1000);
begin
if TargetPresent then CancelTarget;
end;
end;
end;


begin
if not Connected then WaitConnection(3000);
hynger_timer:= 0;
addToSystemJournal('Script [ Mining Clay ] by Magros');
setARStatus(true);
checkdead;
// mining location setting
lowX:= (mine_pointX - radius);
lowY:= (mine_pointY - radius);
highX:= (mine_pointX + radius);
highY:= (mine_pointY + radius);
while true do begin
 for mpx:= lowX to highX do begin
 for mpy:= lowY to highY do begin
  // проверка на кирку
  CheckStability;
  checkdead;
  if (GetType(ObjAtLayer(RHandLayer)) = 0) then begin
   if not CheckEquipt(PickType, RHandLayer) then STATE:= STATE_GO_ON_BOAT;
   // идем на лодку
   if STATE = STATE_GO_ON_BOAT then STATE:= GotoOnBoat(on_boatX, on_boatY);
   // делаем кирки
   if STATE = STATE_ON_BOAT then CheckPick;
  end;
  // проверка на расположение чара
  if (GetX(self) = on_boatX) and (GetY(self) = on_boatY) then begin STATE:= GotoNearBoat(near_boatX, near_boatY);
  end else begin
   STATE:= STATE_NEAR_BOAT;
  end;
  // идем на место копки
  if STATE = STATE_NEAR_BOAT then begin
   STATE:= GotoMiningPoint(mpx,mpy);
   // копаем
   if STATE = STATE_MINING then Mining(mpx,mpy);
   Wait(1000);
   //CheckLag(30000);
  end;
  // проверка на вес
  if Weight > critical_weight then begin
   STATE:= GotoOnBoat(on_boatX, on_boatY);
   if STATE = STATE_ON_BOAT then begin
    // дропаем глину
    Stack(glina_type, $ffff);
    wait(2000);
    //Stack(glinj_type, $ffff);
    if (now > (hynger_timer + (1.0 / 1440 * 10))) then begin
    Hungry(1,-1);
    hynger_timer:= now;
    end;
  end;
  end;
end;
end;
end;
end.
попробуй...
Post Reply