PDA

Просмотр полной версии : Скрипт проверки отката скила


Vetal
07.12.2011, 03:04
Добрый день уважаемые скриптописатели, помогите советом, нужно в скрипте сделать проверку отката скила, ну например что бы писало в системный чат скил откатился, заране спс!

Samor888
07.12.2011, 03:47
Думаю нужно реализовать ето через таймер. В нём выставить время отката. И запускать таймер после того как скилл юзнется.

Добавлено через 17 минут
ну вот как то так
const
d1='сюда скил который юзнули'; //пакет приходящий с серва
d2='пакет посылаемый после отката скила'; //
T1=5000; /// сюда время отката скила в милисекундах 5000 = 5 секундам
name='сюда свой ник';
var
Timer1 : TTimer;
procedure Init;
begin
Timer1 := TTimer.Create(nil);
Timer1.Interval := T1; // задержка таймера 5к мс(5секунд)
Timer1.Enabled := False;
Timer1.OnTimer := @OnTimer;
end;

procedure Free;
begin
Timer1.Free;
end;

procedure OnTimer;
begin
buf:=hstr(d2);
///SendToServerEx(name);/// отправляем на сервер пакет
SendToClientEx(name);/// отправляем на клиент пакет
Timer1.Enabled := False; ///выключаем таймер
end;

begin
if FromServer and (ConnectName=name) and (pck=HStr(d1)) then Timer1.Enabled := True;
end.

dyh9l
07.12.2011, 10:05
Добрый день уважаемые скриптописатели, помогите советом, нужно в скрипте сделать проверку отката скила, ну например что бы писало в системный чат скил откатился, заране спс!

брать откат из пакета от сервера юза скила, дальше пускать таймер по этому интервалу и делать проверку таймер тру или фолс, думаю так

Vetal
08.12.2011, 16:50
Спасибо большое всем кто ответил,особенно Samor888, воспользуюсь обязательно.Хотелось бы поподробней на счет как вытащить время отката из пакета. При использовании скила в l2phx у меня идут следующие пакеты:
От клиента: RequestMagicSkillUse(2F 70 00 00 00 00 00 00 00 00)
следом пакеты от серва:
1. SetupGauge(6D 00 00 00 00 87 03 00 00 87 03 00 00)
2. UserInfo(инфа о чаре я так понимаю, большой пакет не буду тут его указывать)
3. AbnormalStatusUpdate(7F 00 00)
4. UserInfo()
5. AbnormalStatusUpdate(7F 01 00 70 00 00 00 04 00 AF 04 00 00)
вот подскажите из какого пакета можно вытащить откат скила, заранее спасибо, сильно не ругайтесь я делаю первые шаги в написании скриптов:)

Добавлено через 5 часов 43 минуты
Вобщем вроде сообразил как вытянуть откат скила, там от сервера приходит пакет MagicSkillUse в котором есть параметр reuseDelay, вообщем считую его но все равно скрипт не работает, подскажите в чем ошибка,возможно что то неправильно с таймером сделал, заранее благодарен, вот сам скрипт который я своял):


var i:integer;Timer1 : TTimer;
procedure Init; //Вызывается при включении скрипта
begin
Timer1 := TTimer.Create(nil);
//Timer1.Interval :=5000;
Timer1.Enabled := False;
Timer1.OnTimer := @OnTimer;
end;


procedure SendMsgs(msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(msg);
SendToClient;
end;
procedure Free; //Вызывается при выключении скрипта
begin
Timer1.Free;
end;

procedure OnTimer;
begin
sendMSGs('Откатился');
Timer1.Enabled := false;
end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if FromServer and (pck[1]=#$48) then
begin
i:=Readd(22);
Timer1.Interval:=i;
Timer1.Enabled:= True;
end;
end.
В скрипте таймер просто не срабатывает, то есть не выполняется procedure OnTimer;, в чем ошибка, кто может помочь?

Добавлено через 12 часов 32 минуты
Вроде разобрался, теперь все работает,еще вопросик появился, а можно как то это сообщение "Откатился" вывести не в системный чат, а предположим в какую то часть окна ла2?

dyh9l
08.12.2011, 19:54
пакет say2 отправлять на клиент

Vetal
08.12.2011, 20:04
ну я так понимаю если отправить пакет sey2, то текс придет в чат, а мне нужно что бы он выводился, ну например в справа, это можно как нить реализовать?

SeregaZ
08.12.2011, 21:44
нужны хроники примерно с6 и выше. если у тебя так - то там нужно будет чуток переделать файл системных сообщений. даже возможно добавив новое id с этим сообщением, в котором указать флаг появления сообщения в нужном поле клиента. там мысленно окно режь на 9 квадратов. один какой-то не доступен скраю. не помню правда с какого :)
а после слать этот id клиенту из л2пх. ничего сложного :) но повторюсь это если хроники подойдут. в с4 такое сделать нельзя будет. (подсказуваю - копай урон-патч.)

еще как 2 вариант посмотри каким образом выводятся географические названия областей. если клиентом автоматом - то ничего не поделаешь. если же там шлется какой-то пакет, то вот тебе и решение.

Vetal
08.12.2011, 21:59
спасибо ща покапаюсь, идею понял :)

Добавлено через 8 минут
Насколько я понял инфа о сообщениях хранится в файле systemmsg-e.dat, подскажи как его можно прочитать и отредактировать?

Pinko
08.12.2011, 23:27
Vetal,
помнится МKS
написал "скрипт для глухих" так он назвал
там вывод на экран сообщений.
а если поправить systemmsg-e.dat
то и без всего будут выводится сообщения из чата

SeregaZ
09.12.2011, 00:14
редактирование попробуй http://files.mail.ru/4Q1G62 эта версия подошла к С6. может и выше подойдет. а так нужен будет L2 FileEdit для твоей версии хроник.

вот чего я давал подсказки, если все приходится делать самому?
35 1 Вы нанесли $s1 урона. 3 0 FF 0 FF 2 0 1 1 3 $s1 battle
в конце $s1 это цифорка - количество урона, которая будет всплывать в центре экрана (аля ворлд оф варкрафт). 1 1 3 - какая-то из них содержит в себе номер ячейки - квадрата, в котором всплывет эта цифорка. какой-то из FF это повидимому цвет.
точно не скажу, писал сто лет назад. и проверить не получится, сервер тот здох давно :) ну капать в этом направлении.

Pinko
09.12.2011, 12:43
systemmsg-e оригинал
systemmsg-e тхт раскодирован
от фреи вывод сообшений на экран
правда не мной нашел в инете

как пример посмотри

SeregaZ
09.12.2011, 18:57
зачем мне смотреть? я и так все знаю :) плюс у меня фреи нет :)

я ж объяснил уже по пальцам - добавь id и сообщение. а потом шли это самое сообщение в клиент когда нужно - оно и будет тебе всплывать в каком нужно углу. кстати звука "тудум" при откате недостаточно?

Vetal
11.12.2011, 00:25
Всем спасибо за подсказки. Хотелось бы поподробней насчет звука, как его воспроизводить?

J-Fobos
11.12.2011, 02:54
Всем спасибо за подсказки. Хотелось бы поподробней насчет звука, как его воспроизводить?

http://coderx.ru/showthread.php?t=5344

supernewbie
11.12.2011, 03:32
http://coderx.ru/showthread.php?t=5344
нет там решения, в теме в основном все говорят что фс и мессадж бип гавно, проще гря - надо писать плагин

procedure Play(Path:string); - ей проигрывать

SeregaZ
11.12.2011, 04:24
надо мне посидеть и вспомнить в каком файле звуковое сопровождение имеется :) тебе просто нужно будет сопоставить id сообщения с каким либо звуком в игре. в каком-то файла все это прописано... надо вспомнить только в каком :)

Vetal
11.12.2011, 05:54
надо мне посидеть и вспомнить в каком файле звуковое сопровождение имеется :) тебе просто нужно будет сопоставить id сообщения с каким либо звуком в игре. в каком-то файла все это прописано... надо вспомнить только в каком :)

ммм, точно это вроде прописано все в том же systemmsg-e, с сообщением я разобрался, сообщение выводится где я захочу, в файле systemmsg-e добавил новое сообщение, присвоил ему свой айди, и вызываю его когда мне надо. Вот теперь новый вопрос :), а если в это сообщение мне надо передать какой то параметр, как это реализовать?

Breadfan
11.12.2011, 08:11
опаздываю с ответом, но тем не менее:

вот делал скрипт на контроль откатов (хроники - вроде фрея):

const
name='Aola';
var
TimeUse, Skills : TstringList;
MyOID, rtime, i, from_, count_ : integer;
Msc : Ttimer;
skillId_ : string;
procedure Say2(msg:string);
begin
buf:=#$4A; WriteD(0); WriteD(2); WriteS('SysInfo: '); WriteS(msg);
SendToClientEx(name);
end;
procedure Init; //Вызывается при включении скрипта
begin
Skills:=TstringList.Create;
try
Skills.LoadFromFile('settings\SkillsIdEng.ini');
except
Sendmsg('skillId.ini not found!');
exit;
end;
TimeUse:=TStringList.Create;buf:=#$56;WriteD(0);Wr iteD(0);WriteC(0);
SendToServerEx(name); MyOID:=0; Msc:=TTimer.Create(nil);
Msc.OnTimer:=@Tick; Msc.enabled:=true; Msc.interval:=100; TimeUse:=TstringList.Create;
end;
Procedure Tick;
begin
for i:=0 to TimeUse.Count-1 do begin
from_:=pos('=',TimeUse[i])+1; count_:=Length(TimeUse[i])-from_+1;
skillId_:=(copy(TimeUse[i],1,from_-2)); rtime:=strtoint(copy(TimeUse[i],from_,count_));
if (rtime>100) then begin
rtime:=rtime-100;
TimeUse.Values[skillId_]:=inttostr(rtime);
end;
If (TimeUse.Count<=0) then begin
Sendmsg('Timer off'); Msc.enabled:=false;
end;
end;
end;
procedure Free; //Вызывается при выключении скрипта
begin
Msc.enabled:=false; Msc.free; TimeUse.free;Skills.free;
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
If fromserver then begin
case (pck[1]) of
#$29: begin
if (MyOID=0) then begin MyOID:=ReadD(2); buf:=#$56;WriteD(0);WriteD(0);WriteC(0); SendToServerEx(name);
end;
end;
#$48: begin
Msc.enabled:=false;
if (ReadD(2)=MyOID) then begin
if ((readd(18))>(readd(22))) then begin rtime:=readd(18); end else begin rtime:=readd(22); end;
if (ReadD($0A)<2150)or(ReadD($0A)>2164)then begin
Say2('Use: '+Skills.Values[inttostr(ReadD($0A))]);
TimeUse.Values[inttostr(ReadD(10))]:=inttostr(rtime);
end;
if Not(Msc.enabled) then Msc.enabled:=true;
end;
end;
end;
end;
If fromclient and (connectname=name) then begin
if (pck[1]=#$39) then begin
if ((TimeUse.Values[inttostr(ReadD(2))])<>'') then begin
if (strtoint(TimeUse.Values[inttostr(ReadD(2))])>200)then begin
rtime:=strtoint(TimeUse.Values[inttostr(ReadD(2))]);
Say2(Skills.Values[inttostr(ReadD(2))]+' is not ready, wait '+inttostr(round(rtime/1000))+' seconds');
pck:='';
end;
end;
end;
end;
end.

SeregaZ
11.12.2011, 08:43
через $s1 - она будет определятся как переменная. только теперь вопрос как её передавать :) надо посмотреть аналогичные системы с переменной. например смотри ту же атаку.
в тексте чата пишется ведь:
игрок нанес столько-то урона.
тут даже две переменные. нужно посмотреть каким образом она шлется и таким же макаром послать своему id эту переменную :)

так! насчет двух переменных - или я тупой или лыжи не едут. суть в чем: для него не существует номера переменной - он понимает как идущая первая, потом идущая вторая. то есть:
петя нанес 500 повреждений
$s1 нанес $s2 повреждений
предположим мне надо изменить это сообщение на:
500 повреждений нанесено петя ("петей" конечно правильно, но линейка склонять имена не умеет :))
$s2 повреждений нанесено $s1
но эта конструкция работать не будет :) он все равно как видит первый значек $s - то присваивает ему первое значение, как видит второй $s присваивает ему второе значение. получится так:
петя повреждений нанесено 500
то есть поменять их местами не получится. по крайней мере у меня не получилось :)

Breadfan
11.12.2011, 08:47
не совсем верно. будет "$s нанес $n повреждений".
Хотя проще распаковать мсг файл и там гянуть, то могу и врать.
И, вдобавок, на разных серверах (я о фришках) - по разному передают, сталкивался что передавали ИД мобов, и думал что так и надо, а потом встретил что вместо ИД текстом передают его имя

Vetal
16.12.2011, 03:20
Всем спасибо за подсказки и советы, идея полностью реализована)