Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7
Если бежать надо далеко Move
Если бежать надо далеко Move
NewMoveXY Как сделать что бы на каждой клетке или через несколько он проверял на наличие персонажей бегая от одной точки к другой вобще реально ли это ?
в твоем вопросе уже ответ.
распиши подряд действия нужные - вот тебе и блоксхема твоего скрипта.
и это, NewMoveXY не умеет делать ничего сверх бега из точки A в точку B
распиши подряд действия нужные - вот тебе и блоксхема твоего скрипта.
и это, NewMoveXY не умеет делать ничего сверх бега из точки A в точку B
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
зачем?
GetPathArray.
потом идешь по точкам из полученного массива, и каждые пару точек делаешь что надо.
при большом желании можно еще и в цикле это сделать.
GetPathArray.
потом идешь по точкам из полученного массива, и каждые пару точек делаешь что надо.
при большом желании можно еще и в цикле это сделать.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Code: Select all
// Функция easyMoveXY(X,Y,Accuracy : integer; Running : boolean): Boolean;
// Возвращает true если чар достиг цели. Если же не удалось найти пути- вернёт false.
// X,Y - пункт назначения.
// Accuracy - точность подхода.
// Running - если true, чар бегает. Если false - ходит пешком.
// Этот файл называете easyMoveXY.sc и кладёте в папку Include.
// Для использования в скрипте не забывайте его подключать!
// Собственно смысл функции: При старте запускается функция GetPathArray.
// Чар бежит, используя созданный маршрут. При столкновении с препятствием,
// маршрут пересчитывается снова.
// example / пример
// easyMoveXY(1279,540,1,true);
// function easyMoveXY(X,Y,Accuracy : integer; Running : boolean): Boolean;
// Return true if your character reached the destination, else - return false.
// X,Y - destination.
// Running: if true then char is running, else - walking.
// Rename this file to easyMoveXY.sc and put it in Include directory.
// Don't forget include that file in your scripts!
// example : easyMoveXY(1279,540,1,true);
var
mPathArr : TPathArray;
procedure LocalWaitConnection(WaitTime : Integer);
begin
if Connected then Exit;
while not Connected do Wait(1000);
{WaitTime - Waiting After Connected}
wait(WaitTime);
end;
function FindMin(x,y: Integer): integer;
Begin
if x>y then Result:=y else Result:=x;
End;
function sign(x : Integer) : Integer;
Begin
If x<0 then result:=-1;
If x=0 then result:=0;
If x>0 then result:=1;
End;
function Dist(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:= FindMin(dx,dy)+Ddx;
End;
function MoveToPoint(X,Y: Integer; Running: Boolean) : boolean;
var
remap : array [0..8] of byte;
dx,dy,dir,StepResult : Integer;
Begin
remap[0] := 7;
remap[1] := 6;
remap[2] := 5;
remap[3] := 0 ;
remap[4] := -1;
remap[5] := 4;
remap[6] := 1;
remap[7] := 2;
remap[8] := 3;
Result:=false;
While true do
begin
dx:=X-getX(self); dy:=Y-getY(self);
If (dx=0) AND (dy=0) then
begin
Result:=true;
Exit;
end;
dx:=sign(dx);
dy:=sign(dy);
dir := remap[(dx + 1)*3 + dy + 1];
LocalWaitConnection(1000);
While (Not Dead) AND (Stam<=0) do Wait(1000);
If GetDirection(self) <> dir then StepQ(dir, Running);
StepResult:=StepQ(dir,Running);
//If (StepResult=1) OR (StepResult=5) then Wait(5000);
If StepResult<7 then
begin
result:=false;
Exit;
end;
end;
End;
function easyMoveXY(X,Y: integer; Optimized: boolean; Accuracy : Integer; Running: boolean): boolean;
var
StepCnt,i : Integer;
Begin
Result:=false;
While true do
begin
//AddToSystemJournal('pathfinding...')
StepCnt:=GetPathArray(X,Y,Optimized,Accuracy,mPathArr);
If StepCnt<0 then Exit;
If StepCnt=0 then
begin
Result:= true;
Exit;
end;
For i:=0 to StepCnt do
begin
If Not IsWorldCellPassable(getX(self),getY(self),mPathArr[i].X,mPathArr[i].Y,WorldNum,getZ(self)) then Break;
If Not MoveToPoint(mPathArr[i].X,mPathArr[i].Y,Running) then Break;
If Dist(X,Y)<=Accuracy then
begin
AddToSystemJournal('Location reached!');
Result:=true;
Exit;
end;
end;
end;
End;