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

Ходилка с функцией callback

тут можно задать вопрос по скриптингу
Post Reply
Niqauf
Posts: 6
Joined: 02.04.2015 14:02

Ходилка с функцией callback

Post by Niqauf »

Писал сообщение с поиском помощи, но в итоге пока оформлял, все само заработало. С учетом набранного большого сообщения, решил оставить, вдруг пригодится переделка http://stealth.od.ua/forum/viewtopic.php?p=13298#p13298 в рабочий инклуд тем, кто также либо все забыл про паскаль, либо просто не шарит )
mover.inc

Code: Select all

function _Step(dir: Byte; run: Boolean): Boolean;
var res: integer;
begin
  while true do begin
    res := StepQ(dir, run);
    result := res >= 0;
    if (res >= 0) or (res = -2) then break;
    wait(10);
  end;
end;

function Mover(x, y, z, acc, accz : Integer; run : Boolean; MoveCallback:function(x, y: integer): Boolean): Boolean;

var path : TPathArray;
    cnt, idx, i, cx, cy, cz, steps, dx, dy : Integer;
    destX, destY : Word;
    destZ : ShortInt;
    recompute : Boolean;
    dir : Byte;

begin
  result := False;
  recompute := True;

  while true do
  begin
    if recompute then begin
      recompute := False;
      cnt := GetPathArray3D(PredictedX, PredictedY, PredictedZ, x, y, z, WorldNum, acc, accz, run, path);
      if cnt <= 0 then exit;
      idx := 0;
    end;
   
    cx := PredictedX;
    cy := PredictedY;
    cz := PredictedZ;

    steps := idx + 4;
    if steps >= cnt then steps := cnt-1;
   
    for i := idx to steps do begin
      destX := path[i].X;
      destY := path[i].Y;
      if IsWorldCellPassable(cx, cy, cz, destX, destY, destZ, WorldNum) then begin
        cx := destX;
        cy := destY;
        cz := destZ;
      end else begin
        recompute := True;
        break;
      end;
    end;
   
    if recompute then continue;
   
    while (not Dead) and (Stam < moveCheckStamina) do Wait(100);
     
    dx := Integer(PredictedX) - Integer(path[idx].x);
    dy := Integer(PredictedY) - Integer(path[idx].y);

    if ((dx = 0) and (dy = 0)) or ((abs(dx) > 1) or (abs(dy) > 1)) then begin
      recompute := True;
      continue;
    end;
   
    dir := CalcDir(PredictedX, PredictedY, path[idx].x, path[idx].y);
   
    if dir = 100 then begin
      recompute := True;
      continue;
    end;
   
    if PredictedDirection <> dir then
      if not _Step(dir, run) then begin
        recompute := True;
        continue;
      end;
     
    if not _Step(dir, run) then begin
      recompute := True;
      continue;
    end;
                                                           
    if movecallback <> nil then
      if not movecallback(path[idx].x, path[idx].y) then exit;
   
    Inc(idx);
    if idx >= cnt then begin
      dx := Integer(PredictedX) - Integer(path[idx-1].x);
      dy := Integer(PredictedY) - Integer(path[idx-1].y);

      if (abs(dx) <= acc) and (abs(dy) <= acc) then begin
        result := True;
        break;
      end;
     
      recompute := True;
    end;
  end;
end;
И собственно простенька программка тест
test.pas

Code: Select all

program test;
{$Include '!mover.inc'}

function checkhide(x, y: Integer): Boolean;
begin
  if WarMode = true then SetWarMode(false);
  if not Hidden then useskill('Hiding');
  result := true;     
end;

begin
  mover(2536, 563, -30, 0, 2, false, @checkhide);
end.
У меня сначала была непонятная ошибка

Code: Select all

Compiler: [Error] (mover.inc at 1:1): Identifier expected
код вроде не правил, потом просто стала запускаться.

И ругалась на

Code: Select all

if assigned(movecallback) then
на type mismatch, заработало только с

Code: Select all

if movecallback <> nil then
CFA wrote:Из отличий - возможность вызова callback функции на каждый шаг, но это сейчас закомментировано, тк PascalScript не понимает nil в качестве указателя на функцию.
//if assigned(callback) and not callback(path[idx].x, path[idx].y) then exit;
вот это надо раскомментировать, чтобы callback заработал.
Сейчас уже понимает, строчка

Code: Select all

mover(2536, 563, -30, 0, 2, false, nil);
корректно работает
Niqauf
Posts: 6
Joined: 02.04.2015 14:02

Re: Ходилка с функцией callback

Post by Niqauf »

Позор, позор ) Почитал http://stealth.od.ua/forum/viewtopic.php?p=10414#p10414, мне теперь стыдно ) А я еще подумал, зачем так модуль полностью расписан, когда в инклудах все на функциях и процедурах только ) Удалить бы темку )
Post Reply