Forum in READ ONLY mode! All questions and discussions on Discord official server, invite link: https://discord.gg/VxsGzJ7
Перемещение куклы, хелп если не сложно.
Перемещение куклы, хелп если не сложно.
Есть у меня такая идея, или вернее необходимость сделать куклу чара. Чар должен вобщем то делать только несколько вещей, после входа на сервер он должен переместиться в определенное место, при это пройти через портал. Когда то давно в инжекте у меня это выходило как "взять ходилку" и сам скрипт сделать вида GoTo (координаты). Проблема в том что на стелсе я не нашел таких вот команд (мб не внимательный?). Собственно если я возьму 1 из указанных тут на форуме ходилок: эту или эту, то собственно как мне нужно прописать в стелсе чтобы персонаж прошел до нужного мне места? Еще 1 "но", в инжекте при прохождении чрез портал, чар начинал жутко глючить, так как если в пути указать координаты портала то пока чар портнется инжа не успевала понять что чар достиг цели и тупила (решалась насколько я помню через uo.pres и шаг на 1 тайл в сторону портала), как с этим можно будет справится в стелсе? Я не знаю короткий и легкий получится скрипт или нет, но если да... знающие люди может вас не затруднит его набросать? Буду вечно благодарен. Правда есть момент что если чара случайно убьют, то: вобщем можно в скрипт сделать проверну на координаты чара? и если он не на нужных то запускать скрипн сначала, тоесть опять через портал и на место, а задержки и поиск креста я уже сам воткну. В общем спасибо заранее, буду очень признателен даже просто за ответ с сылками на команды которые помог решить мою проблему 9или примеры из других скриптов с ходилками). За линк на инстукцию как сделать цикл тоже буду очень благодарен.
Из того что я порылся я вроде понял как использовать ходилку, получилось так:
так вот, вроде все замечательно и все остальное можно сделать через инжу 2 клиентом (чтобы видеть процесс), но вот я загрузил чара на стелсе, запустил скрипт... он значит пришел и скрипт врубился... все хорошо. А как можно сделать так чтобы скрит не выключался а висел постоянно и если чара дисконектит, то при реконекте, он повторял все теже действия? спасибо.
(я пока только разбираюсь, но с поиском предметов я вроде разобрался (креста там и тд), но вот как зациклить скрит как я описал выше понять не могу)
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.
(я пока только разбираюсь, но с поиском предметов я вроде разобрался (креста там и тд), но вот как зациклить скрит как я описал выше понять не могу)
а можно пример мелкого скрипта с moveXY ? и всеже как зациклить скрипт чтобы он перезапускался при реконекте?Vizit0r wrote:как много букав. очень много. и они такие лишние...
moveXY, встроенное в стелс поможет тебе куда лучше
Кстате + той ходилки является борьба с порталом, тоеть проходя тайл с телепортом он начинает пытаться пройти непойми куда, в локацию с портом... но через полторы секунды прерывается не достигнув цели, и топает уже по следующим координатам. Как я понимаю через moveXY так сделать не получится?
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 в точку разгрузки в гильде.
"Пишите код так, как будто сопровождать его будет склонный к насилию психопат, который знает, где вы живете". (с) Макконнелл, "Совершенный код".