К примеру, копаю в шахте, вылез элементаль и стал меня бить, чар бьет в ответ на автомате. Необходимо лечиться бинтами
![Smile :)](./images/smilies/icon_smile.gif)
я уже смотрел на него, но немного не понял - он возвращает если на меня напали или если у меня вар мод включился и я на кого-то нападаю?Vizit0r wrote:есть например ивент evAttack
вроде как был evTimer внутри которого можно чекать свое хп и прочую лабуду типа вармода. Как только что-то не так, мы отписываемся от ивента делаем свои грязные дела и подписываемся назад.Stels wrote:я уже смотрел на него, но немного не понял - он возвращает если на меня напали или если у меня вар мод включился и я на кого-то нападаю?Vizit0r wrote:есть например ивент evAttack
Code: Select all
SetEventProc(evTimer1,'fight')
Code: Select all
Procedure fight;
var Elemental: Array of Cardinal;
j: integer;
Elem: cardinal;
begin
Elemental := [$0070,$0071,$006E,$006D,$00A6,$006F,$006B,$006C]; //Тип элементалей
for j:=0 to (GetArrayLength(Elemental)-1) do
begin
while FindType(Elemental[j],Ground) <> 0 do
begin
AddToSystemJournal('Охота на элементаля началась!');
if GetDistance(FindItem) < distance then
begin
distance := GetDistance(FindItem);
Elem := FindItem;
setWarMode(true);
Attack(Elem);
NewMoveXY(GetX(Elem),GetY(Elem),true,1,true);
end;
if (gethp(self) < (getmaxhp(self))) and not dead then
begin
UoSay('[BandSelf]');
checklag(LagMs);
wait(6000);
end;
wait(100);
end;
wait(100);
if dead then figh:=0;
end;
figh:= 1;
if WarMode then setWarMode(false);
end;
Code: Select all
Procedure fight;
var Elemental: Array of Cardinal;
j: integer;
Elem: cardinal;
begin
Elemental := [$0070,$0071,$006E,$006D,$00A6,$006F,$006B,$006C]; //Тип элементалей
for j:=0 to (GetArrayLength(Elemental)-1) do
begin
while FindType(Elemental[j],Ground) <> 0 do
begin
SetEventProc(evTimer1,' ');
AddToSystemJournal('Охота на элементаля началась!');
if (gethp(self) < (getmaxhp(self))) and not dead then
begin
UoSay('[BandSelf]');
checklag(LagMs);
wait(6000);
end;
if GetDistance(FindItem) < distance then
begin
distance := GetDistance(FindItem);
Elem := FindItem;
setWarMode(true);
Attack(Elem);
NewMoveXY(GetX(Elem),GetY(Elem),true,1,true);
end;
wait(100);
end;
//wait(100);
if dead then figh:=0;
end;
figh:= 1;
if WarMode then setWarMode(false);
SetEventProc(evTimer1,'fight');
end;
Code: Select all
const minWait = 100;
// Ето вставляем вместо стандартных вейтов в скрипте
CheckWaitLag(3000);
procedure CheckWaitLag(durationMS: Integer);
var i, count: Integer;
begin
count := durationMS / minWait;
for i := 0 to count-1 do
if (CheckLag(30000)) then
begin
// Будет намного лучше чекать все потенциальные проблемы тут
// Так как у тебя в 100 раз больше контроля по выполнению коллбеков
Wait(minWait);
end
else
Beep;
end;