Page 1 of 1

Перемещение куклы, хелп если не сложно.

Posted: 28.01.2010 15:30
by Ermito
Есть у меня такая идея, или вернее необходимость сделать куклу чара. Чар должен вобщем то делать только несколько вещей, после входа на сервер он должен переместиться в определенное место, при это пройти через портал. Когда то давно в инжекте у меня это выходило как "взять ходилку" и сам скрипт сделать вида GoTo (координаты). Проблема в том что на стелсе я не нашел таких вот команд (мб не внимательный?). Собственно если я возьму 1 из указанных тут на форуме ходилок: эту или эту, то собственно как мне нужно прописать в стелсе чтобы персонаж прошел до нужного мне места? Еще 1 "но", в инжекте при прохождении чрез портал, чар начинал жутко глючить, так как если в пути указать координаты портала то пока чар портнется инжа не успевала понять что чар достиг цели и тупила (решалась насколько я помню через uo.pres и шаг на 1 тайл в сторону портала), как с этим можно будет справится в стелсе? Я не знаю короткий и легкий получится скрипт или нет, но если да... знающие люди может вас не затруднит его набросать? Буду вечно благодарен. Правда есть момент что если чара случайно убьют, то: вобщем можно в скрипт сделать проверну на координаты чара? и если он не на нужных то запускать скрипн сначала, тоесть опять через портал и на место, а задержки и поиск креста я уже сам воткну. В общем спасибо заранее, буду очень признателен даже просто за ответ с сылками на команды которые помог решить мою проблему 9или примеры из других скриптов с ходилками). За линк на инстукцию как сделать цикл тоже буду очень благодарен.

Posted: 28.01.2010 22:42
by Alexej

Posted: 29.01.2010 0:28
by Ermito
Из того что я порылся я вроде понял как использовать ходилку, получилось так:

Code: Select all

program perehod;

const
FMoveArrMax = 300; // ставь здесь больше, если твой чар ходит на дистанции больше 13 тайлов или вокруг чара очень много препятствий. Если препятствий на пути мало, то можно оставить как есть.
var
PrognosisX, PrognosisY, FMoveArrCount : integer;
FMoveArr : array [1..FMoveArrMax] of array [1..2] of smallint;


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

function SetDirection(x, y : integer) : integer;
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 CalcPrognosis(Dir : integer);
begin
   if (Dir = 1) or (Dir = 2) or (Dir = 3) then PrognosisX := GetX(self) + 1;
   if (Dir = 5) or (Dir = 6) or (Dir = 7) then PrognosisX := GetX(self) - 1;
   if (Dir = 0) or (Dir = 4) then PrognosisX := GetX(self);

   if (Dir = 3) or (Dir = 4) or (Dir = 5) then PrognosisY := GetY(self) + 1;
   if (Dir = 7) or (Dir = 0) or (Dir = 1) then PrognosisY := GetY(self) - 1;
   if (Dir = 2) or (Dir = 6) then PrognosisY := GetY(self);
end;

function TryToMove(Direction : integer; RunFlag : boolean) : boolean;
begin
   if GetDirection(self) <> Direction then Raw_Move(Direction, RunFlag);
   result := Raw_Move(Direction, RunFlag);
end;

function WrongMove(x, y : integer) : boolean;
var
i : integer;
begin
   result := false;
   if FMoveArrCount = 0 then exit;
   for i := 1 to FMoveArrCount do
      begin
      if (x = FMoveArr[i][1]) and (y = FMoveArr[i][2]) then
         begin
         result := true;
         exit;
         end;
      end;
end;


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

function HEst(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:= min(dx,dy)+Ddx;
end;

procedure SetWrongMove(x, y : integer);
begin
   FMoveArrCount := FMoveArrCount + 1;
   FMoveArr[FMoveArrCount][1] := x;
   FMoveArr[FMoveArrCount][2] := y;
end;

function RewindDir(Dir, c : integer) : integer;
begin
   result := Dir + c;
   if result < 0 then result := result + 8;
   if result > 7 then result := result - 8;
end;

function Move(x, y, tolerance : integer) : boolean;
var
Dir, Dist, lastX, lastY, t, i, timeout : integer;
begin
   FMoveArrCount := 0;
   Dist := HEst(x, y);
   timeout := Dist * 1500; // 13 секунд времени на шаг
   t := timer;
   while true do
      begin
      Dist := HEst(x, y);
      if Dist <= tolerance then // пришёл
         begin
         result := true;
         exit;
      end;
      if timer - t > timeout then // провал по таймауту
      begin
         AddToSystemJournal('Move: Time moved out!');
         result := false;
         exit;
      end;
      Dir := SetDirection(x, y);
      CalcPrognosis(Dir);
      if WrongMove(PrognosisX, PrognosisY) then
         begin
         for i := 1 to 7 do
            begin
            Dir := RewindDir(Dir, 1);
            CalcPrognosis(Dir);
            if not WrongMove(PrognosisX, PrognosisY) then break;
            end;
      if i = 8 then
         begin
         AddToSystemJournal('Move: Cannot move');
         result := false;
         exit;
         end;
      end;
      timeout := timeout;
      lastX := GetX(self); lastY := GetY(self);
      if TryToMove(Dir, false) then SetWrongMove(lastX, lastY) // отсюда чар пришёл
      else SetWrongMove(PrognosisX, PrognosisY);
      end;
end;

procedure _move(x, y, tolerance : integer);
begin
while not Move(x, y, tolerance) do wait(100);
end; 

begin
move(4207,1447,1);
_move(4787,1278,0);
_move(4788,1190,0);
_move(4805,1190,0);
end.
так вот, вроде все замечательно и все остальное можно сделать через инжу 2 клиентом (чтобы видеть процесс), но вот я загрузил чара на стелсе, запустил скрипт... он значит пришел и скрипт врубился... все хорошо. А как можно сделать так чтобы скрит не выключался а висел постоянно и если чара дисконектит, то при реконекте, он повторял все теже действия? спасибо.
(я пока только разбираюсь, но с поиском предметов я вроде разобрался (креста там и тд), но вот как зациклить скрит как я описал выше понять не могу)

Posted: 29.01.2010 1:00
by Vizit0r
как много букав. очень много. и они такие лишние...

moveXY, встроенное в стелс поможет тебе куда лучше

Posted: 29.01.2010 4:16
by Ermito
Vizit0r wrote:как много букав. очень много. и они такие лишние...

moveXY, встроенное в стелс поможет тебе куда лучше
а можно пример мелкого скрипта с moveXY ? и всеже как зациклить скрипт чтобы он перезапускался при реконекте?
Кстате + той ходилки является борьба с порталом, тоеть проходя тайл с телепортом он начинает пытаться пройти непойми куда, в локацию с портом... но через полторы секунды прерывается не достигнув цели, и топает уже по следующим координатам. Как я понимаю через moveXY так сделать не получится?

Posted: 29.01.2010 9:30
by Vizit0r
Ermito wrote:а можно пример мелкого скрипта с moveXY ?

Code: Select all

Program test; 

Begin
while True do
begin
  MoveXY(5934,1927,true,0,true);
  MoveXY(5958,1926,true,0,true);
  wait(50);
end;
End.
Ermito wrote:и всеже как зациклить скрипт чтобы он перезапускался при реконекте?
Кстате + той ходилки является борьба с порталом, тоеть проходя тайл с телепортом он начинает пытаться пройти непойми куда, в локацию с портом... но через полторы секунды прерывается не достигнув цели, и топает уже по следующим координатам. Как я понимаю через moveXY так сделать не получится?
вон в примере вечный цикл.

в гильдию через портал я захожу так:
1) moveXY в точку рядом с порталом
2) step в направлении портала (он шагает в портал, падает в гильду)
3) moveXY в точку разгрузки в гильде.

Posted: 29.01.2010 14:30
by Ermito
Спасибо за пример. Вечером приду пороюсь в FAQ на сайте по поводу "step"а, а по поводу вечного цикла, тут он вроде после того как дойдет до конечной точки подождет 50 миллисекунд и пойдет обратно к первой?

Posted: 29.01.2010 15:59
by Vizit0r
да.

самый обыкновенный вечный цикл