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

Помогите поправить скрипт на оповещение о использованных скиллах

Рег
11 Дек 2015
Сообщения
51
Реакции
0
Оповещение о окончании действия умения иногда приходят с неверным ником, или совсем без него.


Код:
uses SysUtils,Classes;


procedure skilluse;
var
eu,char2:tl2char;
obj,obj1,cast:tl2effect;
i,j,g,pis,pis2:integer;






function proxy : boolean;


begin
result:=false;


for i := 0 to CharList.count -1 do begin
Char2 := CharList.Items(i);
//апетит готово
if (char2.cast.endtime>0) and (char2.cast.id=1476) and not (char2.dead) and not (char2.ismember) and not (char2.clanid=user.clanid)
then begin
delay(500);
//engine.say(' apetit ' + char2.name ,2,user.name);
engine.entertext('#' + ' ' + char2.name + ' used [Appetite for Destruction] ON');
delay(30000);
//engine.say('apetit off ' , 2 , user.name);break
engine.entertext('#' + ' ' + char2.name + ' [Appetite for Destruction] OFF');
end;


if (char2.cast.endtime>0) and (char2.cast.id=1478) and not (char2.dead) and not (char2.ismember) and not (char2.clanid=user.clanid)
then begin
delay(500);
//engine.say(' apetit ' + char2.name ,2,user.name);
engine.entertext('#' + ' ' + char2.name + ' used [Protection Instinct] ON');
delay(30000);
//engine.say('apetit off ' , 2 , user.name);break
engine.entertext('#' + ' ' + char2.name + ' [Protection Instinct] OFF');
end;


//Шилка (готово)
if (char2.cast.endtime>0) and (char2.cast.id=789) and not (char2.ismember) and not (char2.clanid=user.clanid) then begin
delay(500);
//engine.say('WILKU UZAET -> ' +char2.name,2,user.name);
engine.entertext('#' + ' ' + char2.name + ' used [Spirit of Shilen] (Шилка) ON');
delay(59000);
//engine.say('wilka off' ,2 , user.name);break
engine.entertext('#' + ' ' + char2.name + ' [Spirit of Shilen] (Шилка) OFF');
end;
//икона готово
if (char2.cast.endtime>0) and (char2.cast.id=785) and not (char2.ismember) and not (char2.clanid=user.clanid) then begin
delay(500);
//engine.say('WILKU UZAET -> ' +char2.name,2,user.name);
engine.entertext('#' + ' ' + char2.name + ' used [Flame Archon] (Икона) ON');
delay(59000);
//engine.say('wilka off' ,2 , user.name);break
engine.entertext('#' + ' ' + char2.name + ' [Flame Archon] (Икона) OFF');
end;


if (char2.cast.endtime>0) and (char2.cast.id=1532) and not (char2.dead) and not (char2.ismember) and not (char2.clanid=user.clanid)
then begin
//engine.say('Prosvet   ->' + char2.name , 2 , user.name);
engine.entertext('#' + ' ' + char2.name + ' used [Enlightenment] ON');
delay(20000);
//engine.say('Prosvet off -->> ' + char2.name , 2 ,user.name ) ;break
engine.entertext('#' + ' ' + char2.name + ' [Enlightenment] OFF');
end;


if (char2.cast.endtime>0) and (char2.cast.id=1470) and not (char2.dead) and not (char2.ismember) and not (char2.clanid=user.clanid)
then begin
engine.entertext('#' + ' ' + char2.name + ' used [Prahnah] ON');
delay(59000);
engine.entertext('#' + ' ' + char2.name + ' [Prahnah] OFF');
end;


if (char2.cast.endtime>0) and (char2.cast.id=528) and not (char2.dead) and not (char2.ismember) and not (char2.clanid=user.clanid)
then begin
engine.entertext('#' + ' ' + char2.name + ' used [Shield of Faith] (Пати УД) ON');
delay(29000);
engine.entertext('#' + ' ' + char2.name + ' [Shield of Faith] (Пати УД) OFF');
end;


end;
result:=true;
end;




begin
while engine.status = lsonline do begin
if proxy then delay(1);
Delay(1);
end;
end;


begin
script.newthread(@skilluse);


delay(100)
end.
 
жуткая реализация.
можно что то типа такого:
uses SysUtils;

type TSkillUse = class
public
skillId: cardinal;
endTime: cardinal;
skillName: string;
function isExpired: boolean;
end;

function TSkillUse.isExpired: boolean;
begin
result:= self.endTime < getTickCount;
end;

//cfg
const
skillNames: array[0..0] of string = (
'Enlightenment'
);

skillIds: array[0..0] of cardinal = (
1532
);

skillTimes: array[0..0] of cardinal = (
20000
);

procedure onSkillUse;
var
p1, p2: pointer;
actor: TL2Live;
i: cardinal;
skillUse: TSkillUse;
begin
while true do begin
engine.waitAction([laCast], p1, p2);
actor:= TL2Live(p1);

for i:= low(skillIds) to high(skillIds) do begin

if (actor.cast.id = skillIds) and (actor <> user) then begin

print(format('%s uses %s', [actor.name, skillNames]));

skillUse:= TSkillUse.Create;
skillUse.skillId:= actor.cast.id;
skillUse.endTime:= skillTimes + getTickCount;
skillUse.skillName:= skillNames;

actor.setVar(cardinal(pointer(skillUse)));

end;

end;

end;
end;

procedure onWaitEndTime;
var
skillUse: TSkillUse;
i: cardinal;
actor: TL2Live;
begin
while delay(100) do begin
for i:= 0 to charList.count - 1 do begin

actor:= charList.Items(i);
if actor.getVar > 0 then begin
skillUse:= TSkillUse(pointer(actor.getVar));

if skillUse.isExpired then begin
print(format('[%s] %s OFF', [actor.name, skillUse.skillName]));

actor.setVar(0);
skillUse.Destroy;
end;

end;

end;
end;
end;

begin
script.newThread(@onSkillUse);
script.newThread(@onWaitEndTime);
delay(-1);
end.
 
@rsd, спасибо за пример с массивами, намотал на ус :)
 
Назад
Сверху