Форум работает в тестовом режиме. Все данные были перенесены со старого сайта 2018 года. Некоторая информация может быть недоступна, например вложения или хайды. Просьба сообщать о данных случаях через функционал "Жалоба", прямо под постом, где отсуствуют данные из хайда или проблемы с вложением.
Могут быть проблемы в "выкидыванием" с форума (слетевшей авторизацией). Нужно собрать статистику таких случаев.
Есть Тема, куда можете сообщить о проблемах с сайтом либо просто передать привет.

Не работает проверка на смерть персонажа

Рег
14 Май 2016
Сообщения
37
Реакции
0
Приветствую!

Есть на форуме пример скрипта, который проверяет жив персонаж или нет и останавливает выполнение основного скрипта в случае гибели.

Как мне показалось, я выполнил все указания из той темы, однако проверка не выполняется. Буду признателен, если укажете на ошибку и дадите краткое пояснение как делать нельзя, а как, напротив, нужно.

Начало моего скрипта:


var obj: TL2NPC;
obj2: TL2Effect;


Enemy: TL2Live;

Item: TL2Item;
Npc: TL2Npc;
L2Skill: TL2Skill;
Control: TL2Control;
TNpcList: TL2List;
function CheckDeath: Boolean;
begin
Result:=false;
if User.Dead then
begin
Result:=true;
Print('Bot Umer');
Delay(1000);
Engine.FaceControl(0,false);
Engine.GoHome;
Delay(100000);
end;
end;
Begin
while 1<>2 do begin
и далее уже шаги квеста
Заранее большое спасибо за помощь неопытному..)
 
@SaintGlory,

Begin
while 1<>2 do begin // бесконечный цикл
delay(5000);
if User.Dead then // умер
begin
Engine.FaceControl(0,false); // вырубаем интерфейс
Engine.gohome; // возврат в город и пауза 5 секунд
delay(5000);
end;
или проверку просто добавляй в скрипт

function CheckDeath: Boolean;
а лутче зацикли
Код:
procedure Dead();
begin
while 1<>2 do begin
delay(2000);   // бесконечный цикл
if User.Dead then begin
print('Умер');
Delay(5000);
engine.GoHome;
Engine.FaceControl(0, false);
end;
end;
end;
begin
Script.NewThread(@dead);
end.
 
@Huckster,

То есть функцию исключить в принципе? И в итоге мой скрипт будет выглядеть как:

var obj: TL2NPC;
obj2: TL2Effect;


Enemy: TL2Live;

Item: TL2Item;
Npc: TL2Npc;
L2Skill: TL2Skill;
Control: TL2Control;
TNpcList: TL2List;
procedure Dead();
begin
while 1<>2 do begin
delay(2000); // мой зацикленный скрипт целиком
if User.Dead then begin
print('Умер');
Delay(5000);
engine.GoHome;
Engine.FaceControl(0, false);
end;
end;
end;
begin
Script.NewThread(@dead);
end.

Я правильно понял?... И еще вопрос возник - Engine.FaceControl(0, false); останавливает и воспроизведение скрипта, и интерфейс бота полностью?
 
var obj: TL2NPC;
obj2: TL2Effect;
Enemy: TL2Live;
Item: TL2Item;
Npc: TL2Npc;
L2Skill: TL2Skill;
Control: TL2Control;
TNpcList: TL2List;
procedure Dead();
begin
while 1<>2 do begin
delay(2000); // мой зацикленный скрипт целиком
if User.Dead then begin
print('Умер');
Delay(5000);
engine.GoHome;
Engine.FaceControl(0, false);
end;
end;
end;
begin
//тело скрипта
end;
begin
Script.NewThread(@dead);
end.

Лично я так првивык делать.


Engine.FaceControl(0, false);

Выключает только интерфейс бота.
В етом случие тогда когда он умер.



Engine.FaceControl(0, True);

Включает интерфейс,обычно использую в конце скрипта (когда уже на споте).
 
@Huckster, @SaintGlory,

НЕ стоит проверку на смерть делать отдельным потоком, т.к. Другой поток продолжит выполняться и будут проблемы с реализацией.
 
SaintGlory написал(а):
while 1<>2 do begin и далее уже шаги квеста
вот там и проверку ставь на смерть персонажа.

к примеру так:
Код:
    While not Engine.QuestStatus(xxxxx, хх) do
      begin
          if User.Dead then
           begin
             //Восрешаемся и бежим к началу текущего этапа квеста
           end;
 
           //И тут уже пишешь что нужно выполнить для текущего этапа квеста

          delay(1000);
      end;
 
Назад
Сверху