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

Если бежать надо далеко Move

тут можно задать вопрос по скриптингу
Post Reply
MeLFiS
Novice
Novice
Posts: 147
Joined: 02.02.2008 12:21

Если бежать надо далеко Move

Post by MeLFiS »

NewMoveXY Как сделать что бы на каждой клетке или через несколько он проверял на наличие персонажей бегая от одной точки к другой вобще реально ли это ?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

в твоем вопросе уже ответ.
распиши подряд действия нужные - вот тебе и блоксхема твоего скрипта.

и это, NewMoveXY не умеет делать ничего сверх бега из точки A в точку B
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
MeLFiS
Novice
Novice
Posts: 147
Joined: 02.02.2008 12:21

Post by MeLFiS »

Vizit0r wrote:и это, NewMoveXY не умеет делать ничего сверх бега из точки A в точку B
Спасибо это я и хотел узнать.
Просто теперь надо кучу координат вписывать чтобы он проверял через каждые 2 шага геморрой ((
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

зачем?

GetPathArray.

потом идешь по точкам из полученного массива, и каждые пару точек делаешь что надо.
при большом желании можно еще и в цикле это сделать.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
MeLFiS
Novice
Novice
Posts: 147
Joined: 02.02.2008 12:21

Post by MeLFiS »

Vizit0r wrote:зачем?

GetPathArray.

потом идешь по точкам из полученного массива, и каждые пару точек делаешь что надо.
при большом желании можно еще и в цикле это сделать.
тяжелая функцыя нету случаем маленького примера ??
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Post by grundick »

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;

MeLFiS
Novice
Novice
Posts: 147
Joined: 02.02.2008 12:21

Post by MeLFiS »

жаль но для меня это далеко ((
Macks
Apprentice
Apprentice
Posts: 250
Joined: 27.02.2006 22:23
Location: АоП - Age Of Power

Post by Macks »

MeLFiS wrote:жаль но для меня это далеко ((
хи хи
Post Reply