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

Пример использования GetPathArray.

Only working scripts
Post Reply
grundick
Developer
Developer
Posts: 272
Joined: 31.01.2008 21:16

Пример использования GetPathArray.

Post by grundick »

Данный скрипт водит чара в хайде, пешком. Если стамины меньше максимума, то НЕ пытается пройти сквозь заданных нпц или других игроков.

Code: Select all

Program MoveInHide;

var
    sTimerHide: cardinal; 
    BadObj: array [0 .. 4] of word;
const
   TimeNeededToHide=5000;             // время, которого гарантированно хватает чтобы войти в hide
   
   Lysyi=$0040297B;

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

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

function Dest(x,y: integer): integer;
var dx,dy,Ddx : integer;
begin
  dx:= Abs(GetX(self)-x);
  dy:= Abs(GetY(self)-y);
  Ddx:=Abs(dx-dy);
 
  Result:= min(dx,dy)+Ddx;
end;

function SetDirection(x, y : integer) : byte; 
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 HideMove(X,Y: integer; accurance: word);
var 
  i: integer;
  Dir: byte;
  PathArr: TPathArray;
Begin
While Dest(X,Y)>accurance do
   begin
   If (Not Dead) then
      If (Stam<Dex) then 
         begin
         // если стамины меньше чем дексы, устанавливаем хумов и элемов в bad objects
         For i:=0 to 4 do
            SetBadObject(BadObj[i],$FFFF,0);
         end
      Else
         ClearBadObjectList;

   //  вычисляем следующую точку   
   repeat
     i:= GetPathArray(X,Y,false,accurance,PathArr);
     wait(100);
     //WaitConnection(1000);
   until i>-1;
   
   //  определяем направление шага.
   Dir:=SetDirection(PathArr[0].x,PathArr[0].y);
   If GetDirection(self)<> Dir then Step(Dir, false);
   if ((Timer-sTimerHide)>TimeNeededToHide) AND (Not Dead) AND (Not Hidden) then
         begin
               If WarMode then SetWarMode(false);
	       UseSkill('Hiding');
	       wait(300);
	       sTimerHide:=Timer;
	       
	 end;
   Step(Dir, false);
   end;
End;

BEGIN
BadObj[0]:=$0190;            // man
BadObj[1]:=$0191;            // woman
BadObj[2]:=$000E;             // элемы
BadObj[3]:=$000E;
BadObj[4]:=AMSpirit;             // энгрик

sTimerHide:= timer;
wait(5000);


hideMove(getX(Lysyi),getY(Lysyi),0); 

END.
Post Reply