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

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

тут можно задать вопрос по скриптингу
Post Reply
Ermito
Posts: 4
Joined: 28.01.2010 15:16

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

Post by Ermito »

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

Post 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 клиентом (чтобы видеть процесс), но вот я загрузил чара на стелсе, запустил скрипт... он значит пришел и скрипт врубился... все хорошо. А как можно сделать так чтобы скрит не выключался а висел постоянно и если чара дисконектит, то при реконекте, он повторял все теже действия? спасибо.
(я пока только разбираюсь, но с поиском предметов я вроде разобрался (креста там и тд), но вот как зациклить скрит как я описал выше понять не могу)
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

как много букав. очень много. и они такие лишние...

moveXY, встроенное в стелс поможет тебе куда лучше
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Ermito
Posts: 4
Joined: 28.01.2010 15:16

Post by Ermito »

Vizit0r wrote:как много букав. очень много. и они такие лишние...

moveXY, встроенное в стелс поможет тебе куда лучше
а можно пример мелкого скрипта с moveXY ? и всеже как зациклить скрипт чтобы он перезапускался при реконекте?
Кстате + той ходилки является борьба с порталом, тоеть проходя тайл с телепортом он начинает пытаться пройти непойми куда, в локацию с портом... но через полторы секунды прерывается не достигнув цели, и топает уже по следующим координатам. Как я понимаю через moveXY так сделать не получится?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post 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 в точку разгрузки в гильде.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Ermito
Posts: 4
Joined: 28.01.2010 15:16

Post by Ermito »

Спасибо за пример. Вечером приду пороюсь в FAQ на сайте по поводу "step"а, а по поводу вечного цикла, тут он вроде после того как дойдет до конечной точки подождет 50 миллисекунд и пойдет обратно к первой?
User avatar
Vizit0r
Developer
Developer
Posts: 3958
Joined: 24.03.2005 17:05
Contact:

Post by Vizit0r »

да.

самый обыкновенный вечный цикл
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".
Post Reply