Смотрите видео ниже, чтобы узнать, как установить наш сайт в качестве веб-приложения на домашнем экране.
Примечание: Эта возможность может быть недоступна в некоторых браузерах.
Как решил?)saine написал(а):проблема решена
uses SysUtils;
procedure Sticking_Thread(sec: integer);
var Timer: int64; X, Y, Z: integer;
begin
while (Engine.Status <> lsOnline) do delay(555);
X:= User.X;
Y:= User.Y;
Z:= User.Z;
Timer:= GetTickCount + sec*1000;
while delay(555) do begin
if (Abs(User.X-X) < 50) and (Abs(User.Y-Y) < 50) and (Abs(User.Z-Z) < 50) then begin
if (GetTickCount > Timer) then begin
if Engine.UseItem(736) then begin
while (User.Cast.EndTime <> 0) do delay(555);
delay(5555);
end;
end;
end else begin
X:= User.X;
Y:= User.Y;
Z:= User.Z;
Timer:= GetTickCount + sec*1000;
end;
end;
end;
begin
Script.NewThread(@Sticking_Thread(10)); // параметром указываем время (в сек), после которого юзать СОЕ
end.
uses SysUtils;
procedure Sticking_Thread(sec: integer);
var X, Y, Z: integer;
begin
while (Engine.Status = lsOnline) do begin
X:= User.X;
Y:= User.Y;
Z:= User.Z;
delay((sec*1000));
if (User.X = X) or (User.Y = Y) or (User.Z = Z) then begin
Engine.UseItem(736);
delay(30000);
end;
end;
end;
begin
Script.NewThread(@Sticking_Thread(10)); // параметром указываем время (в сек), после которого юзать СОЕ
end.
procedure Sticking_Thread(sec: integer);
var Timer: int64; X, Y, Z: integer;
begin
engine.msg('Событие', 'Q.', 25855);
while Engine.Status <> lsOnline do delay(5555);
X:= User.X;
Y:= User.Y;
Z:= User.Z;
Timer:= GetTickCount + sec*1000;
while Engine.Status = lsOnline do begin
if (Abs(User.X-X) < 50) and (Abs(User.Y-Y) < 50) and (Abs(User.Z-Z) < 50) then begin
if (GetTickCount > Timer) then begin
if Engine.UseItem(736) then begin
while (User.Cast.EndTime <> 0) do delay(555);
delay(5555);
end;
end;
end else begin
X:= User.X;
Y:= User.Y;
Z:= User.Z;
Timer:= GetTickCount + sec*1000;
end;
end;
end;
begin
Script.NewThread(@reconnect);// reconnect - процедура, в которой выполняется перезаход при дисконнекте
Script.NewThread(@Sticking_Thread(5));
if (User.Level<26) then QuestExp_1to25lvl();
........
Спасибо, работает четко.farmwl написал(а):Script.NewThread(@Sticking_Thread);
varfarmwl написал(а):if (Abs(User.X-X) < 50) and (Abs(User.Y-Y) < 50) and (Abs(User.Z-Z) < 50) then begin
Да, действительно после дня тестирвания заметил такой нюанс, раза 3 не реагировал на горе кода персонаж стоял. Я вот не до конца пойму причем тут скорость бега? Наверно когда персонаж меняет 2-3 координата скорость бега не задействуется в игре, и таким образом можно точно вычислить застрял персонаж или нет? Что тут тогда динамически вычислять? Поставил <156 и все. (это вроде бы минимум, не считая дебафов, если дебафы есть, значит персонаж скорее всего в режиме боя, а значит поможет команда User.InCombat = false )Ivanius написал(а):Добавлю от себя, давно уже решил тоже эту проблему и такой вариант не всегда срабатывает четко ибо часто ГЕОДАТА ОЧЕНЬ КРИВАЯ и персонаж при застревании "дергается" и постоянно меняется +- 2-3 координаты, опытным путем вычислил от чего зависит (конечно от скорости персонажа), в скрипте от Фарма это значение равно 50, на самом деле оно на много меньше, но вы смотрите сами:
farmwl написал(а):ser.Z-Z
Простите был не правKrickt написал(а):ser.Z-Z
не прокатывает если кап по лвлу и эксп/спTfox написал(а):Зайди в События - выбери Событие EXP, если не меняется exp в течении N секунд
procedure Sticking_Thread1; // в объявлении процедуры убираешь подаваемые аргументы
var Timer: int64; UserSpeedDelay, X, Y, Z: integer;
begin
Print('Запомнил точку');
while (Engine.Status <> lsOnline) do delay(5555);
X:= User.X;
Y:= User.Y;
Z:= User.Z;
UserSpeedDelay:=round(User.Speed / 120);
Timer:= GetTickCount + 120*1000; // здесь вместо sec указываешь точную цифру, ее при желании можно вынести в const
while User.InCombat = false do begin // здесь меняешь delay(555) на true, так как в старых версиях delay - это процедура, а не функция
delay(3000); // добавляешь задержку сюда, т.к. циклы без зедержки грузят ЦП
if ((abs(X-User.X)<UserSpeedDelay)and(abs(Y-User.Y)<UserSpeedDelay))and (user.cast.endtime=0) then begin
if (GetTickCount > Timer) then begin
if user.dead then engine.msg('Важно', 'Что-то пошло не так! Персонаж умер.', 255);
if not user.dead then engine.msg('Важно', 'Что-то пошло не так. Возможно персонаж застрял.', 255);
engine.msg('Важно', 'Лечу в город и пытаюсь продолжить.', 255);
engine.useitem (736);
end;
end else begin
X:= User.X;
Y:= User.Y;
Z:= User.Z;
Timer:= GetTickCount + 120*1000; // здесь как и выше вместо sec указываешь точную цифру
end;
end;
end;
procedure Sticking_Thread(sec: integer);
var Timer: int64; X, Y, Z: integer;
begin
while (Engine.Status <> lsOnline) do delay(555);
X:= User.X;
Y:= User.Y;
Z:= User.Z;
Timer:= GetTickCount + sec*1000;
while User.InCombat = false do begin
if (Abs(User.X-X) < 2) and (Abs(User.Y-Y) < 2) and (Abs(User.Z-Z) < 2) and (user.cast.endtime=0) then begin
if (GetTickCount > Timer) then begin
if user.dead then engine.msg('Важно', 'Что-то пошло не так! Персонаж умер.', 255);
if not user.dead then engine.msg('Важно', 'Что-то пошло не так. Возможно персонаж застрял.', 255);
engine.msg('Важно', 'Лечу в город и пытаюсь продолжить.', 255);
engine.useitem (736);
if Engine.UseItem(736) then begin
while (User.Cast.EndTime <> 0) do delay(555);
delay(5555);
end;
end;
end else begin
X:= User.X;
Y:= User.Y;
Z:= User.Z;
Timer:= GetTickCount + sec*1000;
end;
end;
end;