PDA

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


creaDo
18.10.2008, 23:58
Где-то видел функцию отключение клиента от ПХ без остановки скрипта
при использовании
procedure Init;
begin
NoFreeOnClientDisconnect;
DisconnectClient;
start;
end;
Клиент подвисает и чар выходит из игры. хроника - Gracia, нешифрованый трафик.
Неотклюая клиент скрипт работает прекрасно

Кста ето может быть из-за того что я пх собрал по кускам из разных версий? :D
l2phx 3.3.9, inject.dll 3.3.0 и без newxor.dll работает только так :confused:
перепробывал кучу варинтов или неправельно пакеты читает или их неловит или имя неправельно пишет или вообще имя не прописывает

kamil
11.12.2008, 17:19
подымаю топик вверх. Вопрос интересен. Как отвязать l2pnh от клиента.

Напишите плиз небольшой примерчик чтобы можно было клиента вырубить, а перс все еще был бы на сервере....

QaK
11.12.2008, 18:15
Данный вопрос уже поднимался и рассматривался в топике Пакетхак 3.2.0

NLObP
11.12.2008, 18:18
Напишите плиз небольшой примерчик чтобы можно было клиента вырубить, а перс все еще был бы на сервере....

Всё ниже перечисленное проверяем и используем на свой страх и риск!!!
Основные моменты скрипта для С4, С5, Т0:
//************************************************** *************
// вызывается при приходе каждого пакета, если скрипт включен
//************************************************** *************
begin
//************************************************** **************************
//не обрабатываем пустые пакеты
if pck='' then exit;

//************************************************** **************************
if (ConnectName=Name) and FromServer then begin
case pck[1] of
#$D3: begin // D3=NetPing:d(kID) на Нетпинг сервера шлем сохранённый пакет Нетпинга от клиента
//msg.Lines.Add('S>Пакет NetPing #$D3');
if LogOutOk then begin
buf:=NetPing;
SendToServerEx(Name);
//msg.Lines.Add('C>Пакет NetPing #$A8');
end;
end;
end;
end;
//************************************************** **************************
if (ConnectName=Name) and FromClient then begin
case pck[1] of
#$09: begin //C>09=LogoutRequest - выходим ручками из клиента
//msg.Lines.Add('S>Пакет LogoutRequest #$09');
// вроде не надо тут их ставить?
NoFreeOnClientDisconnect;
NoFreeOnServerDisconnect;
pck:='';
// шлем s7E=LogOutOk, для отключения клиента
msg.Lines.Add('S>Пакет LogOutOk #$7E');
buf:=#$7E;
SendToClientEx(Name);
LogOutOk:=true;
end;
#$A8: begin // C>A8=NetPing:d(kID)d(PING)d(dta)
//msg.Lines.Add('C>Пакет NetPing #$A8');
NetPing:=pck; // запомним его
pck:='';
end;
#$1B: begin
//msg.Lines.Add('C>Пакет RequestSicialAction #$1B');
case ReadD(2) of
//социальное действие Yes для начала ловли
6: begin
//msg.Lines.Add('Отключили клиент из скрипта...');
//для версии 3.1.9+ можно попробовать отключить клиента
//Варнинг! Опасно для жизни! =)
NoFreeOnClientDisconnect;
NoFreeOnServerDisconnect;
LogOutOk:=true;
buf:=#$7E;
SendToClientEx(Name); // отключаем клиент
//msg.Lines.Add('S>Пакет LogOutOk #$7E');
//не передаем серверу социальное действие
pck:='';
end;
end;
end;
end; //case
end;
end.

Xelat
11.12.2008, 19:57
NLObP,
Незнаю как в C4,C5,T0, но в грации (руофф) к примеру ещё идёт запрос GameGuardQuery, на который поидее тоже нужно отвечать. (Естессно если наличествует ГГ)

PanAm
13.12.2008, 07:49
а ПХ работает с ГГ?

NLObP
13.12.2008, 09:51
а ПХ работает с ГГ?

На руофф работает.

PanAm
17.12.2008, 10:02
На руофф работает.дык там вроде ГГ ене работает?

__name__
07.01.2011, 05:40
имеется скрипт он должен отключать клиент от сервера. по непонятной причине отключает только одно соединение(из чего делаю вывод что скрипт функционирует),а все последующие отключатся отказываются, и клиент находится в игре. поиск ничего толкового не дал может быть плохо ищу.

l2ph v.3.5.33.164
сервер локальная фришка Gracia Epilogue какая либо защита или кодировка отсутсвует.


const
n = 100;
fs_netping = #$D9;

fc_EnterWorld = #$11;
fc_logout = #$00;
fc_netping = #$B1;

var
NetPing: string;
LogOutOk: array of boolean;
playid : array of integer;
i,cnt:integer;

procedure init;
begin
cnt:=0;
NoCloseFrameAfterDisconnect;
NoCloseClientAfterServerDisconnect;
NoCloseServerAfterClientDisconnect;
end;


procedure onfromserver;
begin
case pck[1] of
fs_netping: begin
for i:=0 to cnt do
if (playid[i]=connectid) and (LogOutOk[i]) then begin
buf:=NetPing;
SendToServerEx(connectname);
end;
end;
end;
end;


procedure onfromclient;
begin
case pck[1] of

fc_logout: begin
pck:='';
buf:=#$20;
SendToClientEx(connectname);
for i:=0 to cnt do
if (playid[i]=connectid) then begin
LogOutOk[i]:=true;
end;
end;
fc_netping: begin
NetPing:=pck;
pck:='';
end;

fc_enterworld: begin
playid[cnt]:=connectid;
logoutok[cnt]:=false;
inc(cnt);
if cnt >= 101 then cnt := 0;
end;
end;
end;



begin
if fromServer then
onfromserver
else
onfromclient;
end.


прошу помочь.

P.S.: для тех кто не понял суть скрита чтобы отключить более 2 клиентов(соединений).

supernewbie
08.01.2011, 23:07
как-то так чтоли

const
n = 100;
fs_netping = #$D9;

fc_EnterWorld = #$11;
fc_logout = #$00;
fc_netping = #$B1;

var
NetPing: string;
LogOutOk: array of boolean;
playid : array of integer;
i,cnt:integer;

procedure init;
begin
cnt:=0;
end;

procedure NoClose;
begin
NoCloseFrameAfterDisconnect;
NoCloseClientAfterServerDisconnect;
NoCloseServerAfterClientDisconnect;
end;


procedure onfromserver;
begin
case pck[1] of
fs_netping: begin
for i:=0 to cnt do
if (playid[i]=connectid) and (LogOutOk[i]) then begin
buf:=NetPing;
SendToServer;
exit;
end;
end;
end;
end;


procedure onfromclient;
begin
case pck[1] of

fc_logout: begin
pck:='';
buf:=#$20;
SendToClient;
for i:=0 to cnt do
if (playid[i]=connectid) then begin
LogOutOk[i]:=true;
NoClose;
exit;
end;
end;
fc_netping: begin
NetPing:=pck;
pck:='';
end;

fc_enterworld: begin
SetLength(playid,cnt+1)
SetLength(logoutok,cnt+1)
playid[cnt]:=connectid;
logoutok[cnt]:=false;
inc(cnt);
if cnt >= 101 then cnt := 0;
end;
end;
end;



begin
if fromServer then
onfromserver
else
onfromclient;
end.

PS на нетпинг надо отвечать нихрена не так

Roman32
12.03.2012, 16:36
NLObP,
Незнаю как в C4,C5,T0, но в грации (руофф) к примеру ещё идёт запрос GameGuardQuery, на который поидее тоже нужно отвечать. (Естессно если наличествует ГГ)

как мне сделать чтоб отвечал на этот пакет=F9(GameGuardQuery) этим :CA 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00,а то через иг норм отправляет а ООГ фигню какую то