Если бежать надо далеко Move
Posted: 09.10.2010 17:34
NewMoveXY Как сделать что бы на каждой клетке или через несколько он проверял на наличие персонажей бегая от одной точки к другой вобще реально ли это ?
Альтернативный клиент Ultima Online
https://stealth.od.ua/forum/
Спасибо это я и хотел узнать.Vizit0r wrote:и это, NewMoveXY не умеет делать ничего сверх бега из точки A в точку B
тяжелая функцыя нету случаем маленького примера ??Vizit0r wrote:зачем?
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;
хи хиMeLFiS wrote:жаль но для меня это далеко ((