PDA

Просмотр полной версии : Вывод OutGame бота из игры. И вопросы по процедурам NoFree..


ChiterEPT
29.01.2008, 22:01
Еще несколько вопросов:
1. Как локализовать работу процедур NoFree... Прописывая процедуры в одном скрипте она работает для всех соединений. Есть ли возможность прописать их только для одного соединения?
2. Пробовал написать скрипт который при отключении выводил бы бота из игры. Использовал следующее:

procedure Free;
begin
YesFreeOnServerDisconnect;
YesFreeOnClientDisconnect;
buf:=#$09; //LogOut
SendToServerEX(NickName);
end;

Как вы уже догадались она не работает. :cry:
Либо нужна процедура... скажем... Disconnect (обязательно локализованная) либо обьясните мне как реализовать выход чара из игры.

У кого какие мысли?

QaK
29.01.2008, 22:11
1)Хз (ХКОР знает=)).
2) Попробуй прописать не во Free, а отдльную процедурку сделай, которая будет вызываться, например, при определенных условиях(тыркнул кнопку,конец скрипта).

ChiterEPT
31.01.2008, 00:27
2) Попробуй прописать не во Free, а отдельную процедуру сделай, которая будет вызываться, например, при определенных условиях(тыркнул кнопку,конец скрипта).
Какая разница то? Попробую сейчас, но по моему Free такая же процедура которая вызывается при определенных условиях (отключении скрипта).

Добавлено спустя 1 минуту 13 секунд:
Хз (ХКОР знает=)).
Он ВСЕ знает! Но не хочет говорить :o :P :crazy:

Добавлено спустя 23 часа 1 минуту 25 секунд:
Переименовал тему (простите если неправомерно) в надежде привлечь внимание к ней и получить таки ответы на вопросы. Прошу, у администрации сервера, прощенья за излишний сарказм.

31.01.2008, 02:17
ОЧЕНЬ инетерсна эта вещь, сейчас пытаюсь сделать так чтобы чар остался в игре, но чтото я не понимаю, читал чт о надо ещё и скрипт сделать чтобы на пакеты отвечал... и думаю как это должны выгглядеть? просто закртие клиента?

xkor
31.01.2008, 03:03
1. Как локализовать работу процедур NoFree... Прописывая процедуры в одном скрипте она работает для всех соединений. Есть ли возможность прописать их только для одного соединения?
ну можно например поставить условие)
if ConnectionID=0 then NoFreeOnClientDisconnect;
2. Пробовал написать скрипт который при отключении выводил бы бота из игры. Использовал следующее:

procedure Free;
begin
YesFreeOnServerDisconnect;
YesFreeOnClientDisconnect;
buf:=#$09; //LogOut
SendToServerEX(NickName);
end;

Как вы уже догадались она не работает. :cry:
в каком смысле неработает?) и кстати потвоему это нормально отключаться от сервера прежде чем слать пакет об отключении?)
дело в том что когда отключен клиент или сервер и вызываются YesFreeOnServerDisconnect и YesFreeOnClientDisconnect отключение окончательное происходит немедленно, так что после этого уже что то слать бессмысленно), так что лучше пиши так:procedure Free;
begin
buf:=#$09; //LogOut
SendToServerEX(NickName);
YesFreeOnServerDisconnect;
YesFreeOnClientDisconnect;
end;

ChiterEPT
31.01.2008, 16:20
ну можно например поставить условие)
if ConnectionID=0 then NoFreeOnClientDisconnect;
Зря я выбрал себе такой ник. Нет ну я конечно нуб, но не настолько :roll:

Хкор, может ли

if (ConnectName=NickName)then SendToServer;

заменить

SendToServerEX(ConnectName);

???

Предложенный тобой вариант просто проверит ID соединения и ЗащититОтРазрываСоединения ВСЕ соединения (брр каламбур), я спрашивал Есть ли, или, возможно ли сделать процедуру типа NoFreeOnClientDisconnectEX(NickName) (например) .

А теперь по поводу выхода из игры.
Вся проблема в том, что сервер сам не разрывает соединения (проверено на двух ПТС серверах, один из которых, достаточно известен)и ПакетХак тоже не разрывает соединения при NoFree... Разрывает соединение только клиент при получении ответного пакета на ЛогАут (7Е). А если клиент уже выключен то и разрывать соединение некому. Вот именно поэтому я и просил сделать процедуру типа Disconnect(NickName или Connect ID) для разрыва соединения именно ПакетХаком.

Добавлено спустя 3 минуты 58 секунд:
дело в том что когда отключен клиент или сервер и вызываются YesFreeOnServerDisconnect и YesFreeOnClientDisconnect отключение окончательное происходит немедленно
А ты проверял??? Насколько я понял работу процедур YesFree... они просто возвращают клиенту право разорвать соединение. Тебе конечно виднее, ты автор, но я то это все проверил по 10 раз.

xkor
31.01.2008, 16:55
А ты проверял??? Насколько я понял работу процедур YesFree... они просто возвращают клиенту право разорвать соединение. Тебе конечно виднее, ты автор, но я то это все проверил по 10 раз.
так и непонял в чём заключалась твоя проверка, но после вызова NoFreeOnClientDisconnect если клиент отключается то поток принимающийпакеты от клиента переходит в бесконечный цикл и выходит из него тока когда вызвана YesFreeOnClientDisconnect после чего всё происходит как и раньше тоесть разрывются оба соединения так как вызывается функция closesocket для обоих соединений, так что пакет хак 100% рвёт соединение...
NoFreeOnClientDisconnectEX(NickName) на мой взгляд бессмыслена так как логичнее всего вызывать эту функцию при создании подключения а при этом имя соединения неизвестно так как ещё небыло пакета с ним...

ChiterEPT
31.01.2008, 19:51
так и непонял в чём заключалась твоя проверка
procedure Init;
begin
NoFreeOnClientDisconnect;
NoFreeOnServerDisconnect;
end;

procedure Free;
begin
buf:=#$09;
SendToServer;
YesFreeOnClientDisconnect;
YesFreeOnServerDisconnect;
end;
В этом. После выключения скрипта соединение не разрывается. Кроме того вводил на вкладке дополнительно в скрипт две строки:
YesFreeOnClientDisconnect;
YesFreeOnServerDisconnect;
и по нажатии кнопки выполнить соединение опять не разорвалось. Вот именно поэтому пришел к выводу, что процедуры YesFree... не разрывают соединения.
NoFreeOnClientDisconnectEX(NickName) на мой взгляд бессмыслена так как логичнее всего вызывать эту функцию при создании подключения а при этом имя соединения неизвестно так как ещё небыло пакета с ним...
А другого способа привязать NoFree... к конкретным соединениям нет? Просто не хочется чтоб во время работы одного ОутГайм Бота ВСЕ твои чары после выхода оставались в игре.

xkor
31.01.2008, 20:13
procedure Init;
begin
NoFreeOnClientDisconnect;
NoFreeOnServerDisconnect;
end;

procedure Free;
begin
buf:=#$09;
SendToServer;
YesFreeOnClientDisconnect;
YesFreeOnServerDisconnect;
end;
сначала не обратил внимания, эти процедуры нельзя вызывать внутри процедур Init или Free ибо они действуют на соединение для которого они вызваны а Init и Free непривязаны к конкретному соединению!
вобщем раз так хочеш чтоб они вызывались внутри этих процедур то в следующей версии сделаю NoFreeOnClientDisconnectEX(NickName) или NoFreeOnClientDisconnectEX(ConnectID)

ChiterEPT
31.01.2008, 21:20
Тоесть если я вызову процедуры из OnConnect они будут работать исключительно для этого соединения? Если это так-то нет смысла делать специальные процедуры. Сейчас проверю вызвать их из OnConnect.

Добавлено спустя 6 минут 24 секунды:
Все проверил. Если вызывать их из OnConnect они работают только для одного соединения! Один вопрос отпал.

Добавлено спустя 7 минут 14 секунд:
Сейчас поэксперементирую с YesFree... вызову его из другой процедуры может чего и получится...

Написал такой скрипт
begin
if FromServer and (pck[1]=#$4a) and (pck[6]=#$02) then begin
i:=10;
From:=ReadS(i);
Command:=ReadS(i);
case command of
'exit': begin
YesFreeOnClientDisconnect;
YesFreeOnServerDisconnect;
end;
end;
end;
end.
Если он работоспособен, значит должен разрывать соединение при получении в приват "exit". Но соединение не разрывается. Или скрипт нерабочий, или процедуры YesFree... не работают должным образом.

xkor
31.01.2008, 21:23
Сейчас поэксперементирую с YesFree... вызову его из другой процедуры может чего и получится...
кстати я тут подумал, задать для какого соединения выполнять YesFree... можно выполнив перед её вызовом ConnectID:=0; например
так что NoFreeOnClientDisconnectEX опять начинаю считать ненужным)

ChiterEPT
01.02.2008, 02:27
так что NoFreeOnClientDisconnectEX опять начинаю считать ненужным)
Да ф топку его :D С этим уже разобрались. Я его не оттуда откуда надо вызывал =)

QaK
01.02.2008, 08:34
сначала не обратил внимания, эти процедуры нельзя вызывать внутри процедур Init или Free ибо они действуют на соединение для которого они вызваны а Init и Free непривязаны к конкретному соединению!
Я же говорил!!!2) Попробуй прописать не во Free, а отдльную процедурку сделай, которая будет вызываться, например, при определенных условиях(тыркнул кнопку,конец скрипта).
а ты мне не верил =)

ChiterEPT
01.02.2008, 14:15
:friends: :beer:
Гы офтоп развели =) А если честно то процедуры YesFree у меня и так и так соединения не разрывают.

Добавлено спустя 3 минуты 30 секунд:
У кого корректно работаю процедуры YesFreeOnClientDisconnect; YesFreeOnServerDisconnect; напишите тут, откуда вы их вызываете?

QaK
01.02.2008, 14:38
У кого корректно работаю процедуры YesFreeOnClientDisconnect; YesFreeOnServerDisconnect; напишите тут, откуда вы их вызываете?
Если успею - дома сегодня проверю ...

scorpio818
18.02.2008, 01:51
//оставлять саппорта в игре после закрытия клиента или нет
if SupportPlus and (not SupportFlag) and (ConnectName = Support) then begin
ConnectID:=ConnectIDByName(Support);
NoFreeOnClientDisconnect;
NoFreeOnServerDisconnect;
SendMsgEx('Режим Маклауда включен...',ConnectName);
SupportFlag:=true;
end;

При выполнении этого куска кода сообщение получает именно саппорт, но при закрытии клиента с саппортом в L2PH соединение с именем саппорта остается, а чар из игры выходит (наблюдаю из второго окна).

Раньше (буквально несколько дней назад) NoFreeOnClientDisconnect; и NoFreeOnServerDisconnect; у меня сидели в Init; и всё работало так, как предполагалось, т.е. при закрытии окна с саппортом тот оставался в игре. Потом что-то поломалось и саппорт стал из игры вылетать сразу по закрытию окна. Я полез сюда читать тонкости использования, в результате чего родился вышеприведённый кусок кода, вставленный в основное тело скрипта. Но саппорт по-прежнему вылетает...

p.s. Там лишняя перестраховка (ConnectID:=ConnectIDByName(Support);) но это уже от безысходности... Ведь работало же! В чем может быть причина?

18.02.2008, 08:23
Возможно на сервер посылается логаут...
Вот рабочий кусок из моего скрипта ;)

if FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin
case ReadD(2) of //SocialID
//социальное действие Yes для начала
6: begin
if ready then begin
pck:='';
NoFreeOnClientDisconnect;
NoFreeOnServerDisconnect;
//started:=true;
//timer1.enabled:=true;
buf:=#$7E; //LogOutOk
SendToClientEx(Name);
end;
end;
end;
end;

ChiterEPT
18.02.2008, 12:52
Возможно на сервер посылается логаут...

Раньше (буквально несколько дней назад) NoFreeOnClientDisconnect; и NoFreeOnServerDisconnect; у меня сидели в Init; и всё работало так, как предполагалось, т.е. при закрытии окна с саппортом тот оставался в игре.

Судя по всему у Скорпиона818 и раньше на сервер посылался логаут и все работало. Вообще на своей практике заметил, что сервера, как правило, не закрывают соединения при получении пакета ЛогАут от клиента, они просто проверяют возможность выхода из игры и если выход возможен сервер отсылает клиенту пакет 7Е ЛогАутОк и клиент уже сам разрывает соединение. Хотя конечно возможны исключения, где сервер получив пакет ЛогАут от клиента проверит возможно ли разорвать соединение и в случае положительного ответа разорвет его сам (врядли).

Проверь вариант предложенный ratvierом. Конечно трудно назвать этот кусок ЕГО куском от скрипта (уж больно он напоминает немного измененный кусок скрипта из темы "ДА БУДЕТ БОТ") ну неважно :)

P.S. Режим Маклауда включен...

Улыбнуло :D

ratvier
18.02.2008, 18:41
Конечно трудно назвать этот кусок ЕГО куском от скрипта (уж больно он напоминает немного измененный кусок скрипта из темы "ДА БУДЕТ БОТ")

Это была моя первая попытка отвечать на пинги, сейчас работает более элегантно, но не идееально
зы решил всё-таки зарегиться :)

scorpio818
20.02.2008, 04:20
Возможно на сервер посылается логаут...
Именно так и было. Вот рабочий вариант:

if SupportPlus and (ConnectName = Support) then begin
if not SupportFlag then begin
ConnectID:=ConnectIDByName(Support);
NoFreeOnClientDisconnect;
NoFreeOnServerDisconnect;
SendMsgEx('Режим Маклауда включен...',ConnectName);
SupportFlag:=true;
end;
if FromClient and (pck[1] = Logout) then begin
pck:=''; //не пропускать на сервер Logout от клиента
buf:=LogOutOk;
SendToClient; //сказать клиенту, что логаут разрешен
end;
end;

Sher
20.02.2008, 17:03
кстати после выполнения buf:=LogOutOk;
SendToClient; //сказать клиенту, что логаут разрешен
клиент просто схопывается - это у всех так или стоит поискать грабли? хотя персонаж остается в игре и проч...

ratvier
20.02.2008, 17:13
клиент просто схопывается - это у всех так или стоит поискать грабли?

так и надо :D

Sher
20.02.2008, 17:21
клиент просто схопывается - это у всех так или стоит поискать грабли?

так и надо :D
хм.... мож знаите способ чтоб например 1 окном завести нескольких чаров) т.е. что несхлопывалось)

scorpio818
20.02.2008, 19:37
хм.... мож знаите способ чтоб например 1 окном завести нескольких чаров) т.е. что несхлопывалось)
C->S: 09=Logout
S->C: 7E=LogOutOk
Это полный выход, пример использования выше.

Чтобы клиент не схлопывался, думаю, следует копать в сторону вот этих пакетов:
C->S: 46=RequestRestart
S->C: 5F=RestartResponse
Тогда ты попадешь в окно выбора чаров и сможешь перелогиниться другим акком.

Sher
21.02.2008, 14:27
до этого этапа я дошел да там одно и тоже шлетно но далее идет пакет с инфой о чаре и нада чтото отсылать) т.е. какбы понятно что но... что буит если я ченить фиксированное буду слать в этот момет - клиент не застрелится? :) сорри попробовать вчера не смог бу сеня вечерком пробовать)

tiranosaur
23.01.2010, 13:06
//монитор, показывает хп\мп\вес\имя :)
//мспользуется в процессах когда нужно nofreeondisconect
//ну или когда вам захочется//тестировался на l2c6 alpha
//v0.1b - первая версия
//v0.2b - изменет алгоритм принудительного обновления
//(c)metalFan
const
name = 'Luda' ;
//Warning! Не поставишь имя - вылетишь из игры! xD
var frm: TForm; m: TMemo; Button: TButton; MaxHP,CurHP,MaxMP,CurMP,CurLoad,MaxLoad,i: integer;
CharName: string;
procedure Init;
begin
//формочка
frm := TForm.Create(nil);
frm.Caption := 'Info by metalFan v0.2b';
frm.BorderStyle := bsDialog;
frm.Position := poScreenCenter;
frm.Width:=250;frm.Height:=125;
frm.OnClose := @FormClose;
m:=TMemo.Create(frm);
m.parent:=frm;
m.align:=alClient;
m.ReadOnly:=true;
m.ScrollBars:=ssBoth;
Button := TButton.Create(frm);
Button.Parent := frm;
Button.Caption := 'Refresh';
Button.Left := 125;
Button.Top := 15;
Button.onClick := @ForceUpdate;
frm.show;
end;

//закрываем формочку
procedure free;
begin
m.free;
Button.Free;
frm.free;
end;
//принудительное обновление
procedure ForceUpdate;
begin buf:=Hstr('6e');
SendToServerEx(name);

end;

//(c)NLObP скажи нет случайному закрытию формы
procedure FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action:=caNone;
end;
procedure OnDisconnect(WithClient: Boolean); //Вызывается при установке соединения
begin
NoFreeOnClientDisconnect;
NoFreeOnServerDisconnect;
end;
//думалка
begin
if FromServer and (ConnectName=name) and (pck[1]=#$32) then begin
i:=22; CharName:=ReadS(i); i:=i+48; MaxHP:=ReadD(i); CurHP:=ReadD(i); MaxMP:=ReadD(i); CurMP:=ReadD(i); i:=i+4; CurLoad:=ReadD(i); MaxLoad:=ReadD(i);
//выводим на экран это дело
m.lines.add('Name ' + CharName);
m.lines.add('Health ' + inttostr(CurHP) +'\' + inttostr(MaxHP));
m.lines.add('Mana ' + inttostr(CurMP)+'\' + inttostr(MaxMP));
m.lines.add('Load ' + inttostr(CurLoad)+'\' + inttostr(MaxLoad)); end;
end.

подскажите пжл в версии 3,4,1,83 работает а в версиях 3,5,28,151 и выше нет? в чем проблема? ошибка выделена красным

alexteam
23.01.2010, 13:09
они по другому называюццо.
в редакторе ctrl+space
и за useforconnectname почитай.. в хелпе..

tiranosaur
23.01.2010, 13:34
СПС СПС СПС СПС ))))))) Огромое Спс

Добавлено через 24 минуты
А почему то разрушается коннект. добавление NoCloseFrameAfterDisconnect; не помогло.

alexteam
23.01.2010, 13:48
а причем тут фрейм ?

tiranosaur
23.01.2010, 14:21
на всякий пожарный. заменил
NoCloseClientAfterServerDisconnect;
NoCloseServerAfterClientDisconnect;
NoCloseFrameAfterDisconnect;
фиг. отключается.((( вырубаю клиент через диспетчер задач.

alexteam
23.01.2010, 14:49
после всего этого дела отправ на клиент пакет ливворлд.. или как он там..

tiranosaur
23.01.2010, 15:16
84 отправил результат 0(


Помогите пжл. нифига не получается. все перепробовал. отваливается клиент-отваливается пакетхак