PDA

Просмотр полной версии : Будьте любезны, помогите со скриптом.


ПомогитеПожалуйста
13.02.2011, 20:15
Добрый вечер! Если не затруднит, мог-бы кто-нибудь в этом деле разбирающийся написать простенький скрипт? Только не для LA2, а для Aion. Я просто совсем ничего не соображаю в таких делах. Спасибо!

J-Fobos
13.02.2011, 20:30
Уточните что за скрипт и учтите, что скорее всего мы заставим вас самого писать этот скрипт, будем только помогать советами ;)

ПомогитеПожалуйста
13.02.2011, 20:35
Дело вот в чём: юзая скилл по мобу, на сервер отправляется уникальный пакет для каждого моба. Поэтому при его смерти, чтобы это сработало и с новым мобом, приходится опять ловить точно такой-же пакет. И так до бесконечности. Скрипт должен делать примерно следующее, если возможно: при использовании одного конкретного скилла ловить этот пакет и посылать его в отправку автоматом. Чтобы не приходилось каждый раз его вылавливать вручную. Спасибо!

J-Fobos
13.02.2011, 22:07
В аион я не играю и с его пакетами не знаком, но думаю там также как и в линейке у каджого моба имеется свой уникальный ObjectID (по идее это 4 байта в пакете). Покажите пакеты использования одного скила по разных мобах, проверим имеется ли ObjectID.
А также покажите пакет взятия в цель моба(пригодится чуть позже).

ПомогитеПожалуйста
13.02.2011, 22:11
CF 66 59 47 05 03 00 66 0B 44 00 43 02 15 E0 00 00
CF 66 59 47 05 04 00 0B E4 45 00 6A 04 15 E0 00 00

Один и тот же скилл на 2х разных мобов

C9 66 53 00
B5 66 47 AD 87 45 00 00


Взятие в таргет.

BioDread
13.02.2011, 22:13
Задача тут такая: Отловить пакет
pck[1]=#$23
И отправить X раз на сервер.
При получении нового такого пакета запомнить новый и опять отправить.


Вот что мы пытались сделать:
begin
if FromServer and (pck[1]=#$23) then begin

sendtoserver;
sendtoserver;
sendtoserver;
sendtoserver;
sendtoserver;

end;
end.
И соединение с сервером разрывалось.....

J-Fobos
13.02.2011, 22:51
ПомогитеПожалуйста, все так как я и думал. Но скрипт будете писать сами. Вот набросок процедуры таймера и главного блока:
Procedure OnTimer01(Sender: TObject);
begin
buf:=#$CF;
WriteD(a);
WriteD(b);
WriteD(c);
WriteD(d);
SendToServerEx(name);
end;
begin
if (FromServer) and (pck[1]=#$CF) and (ConnectName=name) then
begin
a:=ReadD(2);
b:=ReadD(6);
c:=ReadD(10);
d:=ReadD(14);
end;
end.
Числа a,b,c,d целые. Вам остается организовать создание и включение таймера, а также объявить переменные.


BioDread, вы также создавайте таймер, в нем делаете отправку пакета нужное количество раз с помощью команды SendToServerEx(name); и выключение таймера. При получении нового пакета #$23 сбиваете счетчик итераций таймера на начальное значение и включаете его.
begin
if FromServer and (pck[1]=#$23) and (ConnectName=name) then
begin
buf:=pck;
Timer01.Enabled:=True;
end;
end.

Информацию по работе таймера можете без проблем найти на форуме.

ПомогитеПожалуйста
13.02.2011, 22:57
!1

J-Fobos
13.02.2011, 23:02
Только пакеты у вас разные почему-то) У дреда 23, а у помогите CF

BioDread
13.02.2011, 23:03
В аионе всё не так просто там не считываются имена чаров.
Тоесть получится SendToServerEx(name); изменить на
SendToServerEx; или SendToServer; ?
И ещё у меня получается не FromServer а FromClient это ж ничего не меняет?

ПомогитеПожалуйста
13.02.2011, 23:04
Только пакеты у вас разные почему-то) У дреда 23, а у помогите CF

Два разных примера. 23 - это нужное нам действие. А CF - это я юзанул рандомный скилл. Не было возможности 23 юзать.

J-Fobos
13.02.2011, 23:12
В аионе всё не так просто там не считываются имена чаров.
Тоесть получится SendToServerEx(name); изменить на
SendToServerEx; или SendToServer; ?
И ещё у меня получается не FromServer а FromClient это ж ничего не меняет?
В данном случаи FromClient будет правильно, я просто скопировал и не обратил внимания, хорошо что вы поправили )
А вот использование SendToServerEx крайне желательно. На вкладке "выполнить" (в главном окне, там где список пакетов и оправка пакетов) запустите на выполнение следующий скрипт:
begin
SetName('asdasd')
end.
Он задаст нужное имя для соединения и можно будет использовать функцию SendToServerEx. Скрипт надо будет выполнять при каждом открытии соединения.

BioDread
13.02.2011, 23:16
А можно по такому способу?
begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
for i:=1 to 50 do
buf:=pck;
SendToServerEx(name);

end;
end.
Так думаю будет лучше ибо в нашем случае чем быстрее будут посылатся пакеты тем лучше :)
Имя я укажу.

Кстати А можно сделать так чтобы пакеты посылались очень быстро до получения пакета на клиент "Моб умер"?

J-Fobos
13.02.2011, 23:22
Циклом будет проще, но не лучше. Задержки между отправкой пакетов не будет, скорее всего чар будет кикнут за спам пакетами, в линейдже на некоторых серверах за такое банят.

ПомогитеПожалуйста
13.02.2011, 23:23
Нет, в айоне не кикнут. Мы-же тестили это просто пакетами, с минимальным таймером, без скрипта. Скрипт нужен для автоматизации. Поэтому чем быстрее - тем лучше.

J-Fobos
13.02.2011, 23:32
Быстрее всего будет так, но все же я считаю что лучше организовать таймер с небольшой задержкой :)
begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
buf:=pck;
for i:=1 to 50 do
SendToServerEx(name);
end;
end.

ПомогитеПожалуйста
13.02.2011, 23:46
А можно пожалуйста немного больше информации про таймер? В частности, можно-ли сделать так, что после смерти моба таймер обнулялся? Иначе придётся ждать, пока все пакеты будут отправлены.

J-Fobos
13.02.2011, 23:51
http://coderx.ru/showpost.php?p=30293&postcount=404
Если полазить по форуму можно найти много примеров :)

BioDread
14.02.2011, 00:12
Ну вот чтото получилось только не знаем как его запустить при условии (pck[1]=#$23) и остановить при условии pck[1]=#$xx) (xx-тип пакета на смерть моба)
куда вставлять условие? "if FromClient and (pck[1]=#$23) and (ConnectName='name') then"


const
name = 'IhelpYou';
interval = 100; //в мс
var
TimerEnchant:TTimer;



procedure Init;
begin
TimerEnchant:=TTimer.Create(nil);
TimerEnchant.OnTimer:=@enchant;
TimerEnchant.enabled:=true;
TimerEnchant.interval:=interval;
end;


procedure Free;
begin
TimerEnchant.free;
end;

procedure enchant;
begin
buf:=pck;
SendToServerEx(name);
end;

begin
end.

J-Fobos
14.02.2011, 00:39
Ну вот, все правильно сделали, молодцы. С включением будет выглядить так:
const
name = 'IhelpYou';
interval = 100; //в мс
var
TimerEnchant:TTimer;



procedure Init;
begin
TimerEnchant:=TTimer.Create(nil);
TimerEnchant.OnTimer:=@enchant;
TimerEnchant.enabled:=false;
TimerEnchant.interval:=interval;
end;


procedure Free;
begin
TimerEnchant.free;
end;

procedure enchant;
begin
SendToServerEx(name);
end;

begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
buf:=pck;
TimerEnchant.enabled:=true;
end;

end.
Ну а выключение я думаю сумеете дописать :)

BioDread
14.02.2011, 00:46
както так?)
const
name = 'IhelpYou';
interval = 100; //в мс
var
TimerEnchant:TTimer;



procedure Init;
begin
TimerEnchant:=TTimer.Create(nil);
TimerEnchant.OnTimer:=@enchant;
TimerEnchant.enabled:=false;
TimerEnchant.interval:=interval;
end;


procedure Free;
begin
TimerEnchant.free;
end;

procedure enchant;
begin
SendToServerEx(name);
end;

begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
buf:=pck;
TimerEnchant.enabled:=true;
end;

begin
if FromServer and (pck[1]=#$EA) and (ConnectName=name) then
begin
TimerEnchant.enabled:=false;
end;
end;
end.
EA пакет на смерть моба.

J-Fobos
14.02.2011, 01:01
Все верно :)

Хочу обратить внимание на одну вещь.
procedure enchant;
begin
SendToServerEx(name);
end;

begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
buf:=pck;
TimerEnchant.enabled:=true;
end;
Присваивать значение buf в одной процедуре и отправлять на сервер в другой (в нашем случаи в основном блоке buf:=pck, а в таймере идет отправка) довольно рискованно (можно допустить много ошибок) и следует избегать такого варианта. Но в случаи этого скрипта - исключение, сейчас это оптимальный способ.

ПомогитеПожалуйста
14.02.2011, 01:30
При использовании скилла с работающим скриптом "Соединение с сервером прервано". В чём может быть дело?

J-Fobos
14.02.2011, 01:39
Может кикает из за слишком частой отправки пакета? Попробуйте увеличить интервал до 2 сек и проверить скрипт.

ПомогитеПожалуйста
14.02.2011, 01:42
Неа, не в этом дело. Всё равно дисконект. Может connectname лишнее?

BioDread
14.02.2011, 01:43
Отправляю отдельно с частотой 0,1 всё нормально. Может чтото не то на сервер посылается?)
С именем всё норм (Пробовал поставить другое имя то ничего не происходило а как поставил то что в скрипте сразу дисконнект).

J-Fobos
14.02.2011, 01:48
Дело не connectname, пока что не знаю в чем причина, правильный скрипт который должен работать. Завтра на свежую голову еще раз все обдумаю и отпишусь.

BioDread
14.02.2011, 02:22
Спасибо ещё раз за помощь :)

Добавлено через 32 минуты
Я пришёл к выводу что buf:=pck; не присваивается и на сервер отсылается пакет толи пустой толи 00 в логе тип 00 а выделить его нельзя. Подскажите как по другому присвоить buf:=pck;

J-Fobos
14.02.2011, 02:31
Тогда такой вариант скрипта:

const
name = 'IhelpYou';
interval = 100; //в мс
var
TimerEnchant:TTimer;



procedure Init;
begin
TimerEnchant:=TTimer.Create(nil);
TimerEnchant.OnTimer:=@enchant;
TimerEnchant.enabled:=false;
TimerEnchant.interval:=interval;
end;


procedure Free;
begin
TimerEnchant.free;
end;

procedure enchant(Sender: TObject);
begin
SendToServerEx(name);
end;

begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
buf:=pck;
TimerEnchant.enabled:=true;
end;

begin
if FromServer and (pck[1]=#$EA) and (ConnectName=name) then
begin
TimerEnchant.enabled:=false;
end;
end;
end.

BioDread
14.02.2011, 02:37
ДА!!!!!!!! РАБОТАЕТ!!!!! Огромное спасибо за помощь!

J-Fobos
14.02.2011, 02:39
Я понял в чем ошибка была) В скрипте имеется procedure enchant;, в эту процедуру не передается значение переменной buf, надо использовать procedure enchant(Sender: TObject); чтобы значение передавалось(поправил пост с конечным скриптом).

ПомогитеПожалуйста
14.02.2011, 17:16
Фобос, огромное спасибо за помощь, но если не затруднит, скажи пожалуйста, куда вставить функцию, которая бы активировала скилл не при юзе скилла, а при таргете на моба?

procedure enchant;
begin
buf:=s;
SendToServerEx(name);
end;

СЮДА?

begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
s:=pck;
TimerEnchant.enabled:=true;
end;

Примерно нужно так: при виде пакета на таргет моба, кастуется этот 23 скилл.

J-Fobos
14.02.2011, 18:48
Каждый раз пакет #$23 другой? Тогда надо разобрать какие данные входят в пакет.

ПомогитеПожалуйста
14.02.2011, 19:03
Да, каждый пакет 23 другой. Они все начинаются и кончаются одинаково, а в середине, вероятно, содержится ИД моба. Вот пример:

23 66 F5 E7 9D 13 00 75 45 01 47 94 0F 00 9A 99 99 3F
23 66 F5 E7 9D 13 00 75 45 01 92 96 10 00 9A 99 99 3F
23 66 F5 E7 9D 13 00 75 45 01 28 56 0D 00 9A 99 99 3F

Три разных моба.

J-Fobos
14.02.2011, 19:30
Покажите пакеты на таргет и на юз скил для одного моба.

ПомогитеПожалуйста
14.02.2011, 19:52
Таргет

C9 66 53 00
B5 66 47 81 AA 0F 00 00

Скилл

23 66 F5 42 BB 14 00 75 45 01 7E 3F 10 00 9A 99 99 3F

J-Fobos
14.02.2011, 19:57
Почему таргет 2 строчки? Это получается 2 действия?

ПомогитеПожалуйста
14.02.2011, 20:01
Действие одно. Это два пакета. Причём первый статичный, а второй при каждом мобе меняется.

J-Fobos
14.02.2011, 20:06
Не повезло вам, что я в аион не играю =\ Не вижу связи между пакетами таргета и юзскила, а надо ее найти. Надо любым способом узнать как формируется пакет юзскил.

ПомогитеПожалуйста
14.02.2011, 20:09
Дело в том, что это скилл моего самонна.

Мой скилл А.
Скилл самонна Б.

Юзаю А -> cамон юзает Б.

У скилла А задержка 12 секунд, у скилла Б задержки нету.

Вот и хочется сделать так, чтобы самон скилл Б кидал сам постоянно, т.к тогда не будет задержки в 12 секунд.


CF 66 59 E5 06 01 00 4D B2 11 00 D2 00 C5 90 00 00 - скилл А.

J-Fobos
14.02.2011, 20:14
Думаем вместе, может чего надумаем. Может есть какая-то закономерность в пакетах скила А и Б и таргета?

ПомогитеПожалуйста
14.02.2011, 20:18
CF 66 59 E5 06 01 00 E4 F8 00 00 D2 00 C5 90 00 00
23 66 F5 E3 C5 0F 00 75 45 01 E4 F8 00 00 9A 99 99 3F

Вот, это скилл А и Б для одного моба.

J-Fobos
14.02.2011, 20:31
F8 00 0E40 этот кусочек общий, что бы он мог значить?

ПомогитеПожалуйста
14.02.2011, 20:36
ИД моба?

J-Fobos
14.02.2011, 20:38
Я не знаю, кто из нас в аион играет?))

ПомогитеПожалуйста
14.02.2011, 20:40
Надо Дреда подождать :D

//J-Fobos: предлагаю когда он придет пообщатся в мини чате, может чего надумаем (чтоб форум не зафлуживать)

BioDread
14.02.2011, 22:26
В5-таргет 23- Скил
B5 66 47 AF 2C 15 00 00
23 66 F5 B8 B8 10 00 75 45 01 AF 2C 15 00 9A 99 99 3F
B5 66 47 67 E8 15 00 00
23 66 F5 36 89 07 00 75 45 01 67 E8 15 00 9A 99 99 3F
B5 66 47 CE AB 16 00 00
23 66 F5 84 69 16 00 75 45 01 CE AB 16 00 67 66 66 3F
B5 66 47 20 48 13 00 00
23 66 F5 84 69 16 00 75 45 01 20 48 13 00 9A 99 99 3F
B5 66 47 DA 80 15 00 00
23 66 F5 84 69 16 00 75 45 01 DA 80 15 00 9A 99 99 3F
B5 66 47 73 3C 0F 00 00
23 66 F5 84 69 16 00 75 45 01 73 3C 0F 00 9A 99 99 3F
B5 66 47 91 08 16 00 00
23 66 F5 84 69 16 00 75 45 01 91 08 16 00 9A 99 99 3F



думаю должно выглядеть както так: если от серва пакет первый байт которого В5 то взять из него 4й 5й и 6й 7й байт и записать в 11й 12й 13й 14й байты пакета, подготовленного юзверем.
23 66 F5 36 89 07 00 75 45 01 xx xx xx xx 9A 99 99 3F
и включить таймер
а после смерти отключить.
Тоесть лучше взять предыдущий скрипт и переписать чуток условие старта таймера.

J-Fobos
14.02.2011, 22:39
const
name = 'IhelpYou';
interval = 100; //в мс
var
TimerEnchant:TTimer;
a:integer;



procedure Init;
begin
TimerEnchant:=TTimer.Create(nil);
TimerEnchant.OnTimer:=@enchant;
TimerEnchant.enabled:=false;
TimerEnchant.interval:=interval;
end;


procedure Free;
begin
TimerEnchant.free;
end;

procedure enchant(Sender: TObject);
begin
buf:=HStr('23 66 F5 36 89 07 00 75 45 01');
WriteD(a);
buf:=buf+Hstr('9A 99 99 3F');
SendToServerEx(name);
end;

begin
if FromClient and (pck[1]=#$B5) and (ConnectName=name) then
begin
a:=ReadD(11);
TimerEnchant.enabled:=true;
end;

begin
if FromServer and (pck[1]=#$EA) and (ConnectName=name) then
begin
TimerEnchant.enabled:=false;
end;
end;
end.

Deffol
17.02.2011, 09:55
а можно написать скрипт, чтоб при юзе скила сумона, а не при таргете, суммон начинал бы бить с минимальным временем и интервалом отправки пакетов, до тех пор, пока моб не умрет...а потом бы часики выключились?
:) сам не понимаю...
пакеты скилла такие как в верхнем посте
=-------------------------------------------=
Вот скиллы сумона:
23 57 C0 E5 B9 03 00 FC 44 01 BD D4 00 00 00 00 80 3F
23 57 C0 E5 B9 03 00 FC 44 01 98 D2 00 00 00 00 80 3F
23 57 C0 E5 B9 03 00 FC 44 01 B3 CB 00 00 00 00 80 3F
Вот сам скилл:
CF 57 6C 84 06 09 00 B3 CB 00 00 18 01 45 82 00 00
Убийство моба не нашел пакет, но думаю, что он такой же, я сам пробовал написать скрипт, но не работает...

J-Fobos
17.02.2011, 17:31
Да, можно сделать, не вижу никаких препятствий :)

Deffol
17.02.2011, 18:02
может поможешь? :) ...буду очень признателен...ты хорошо разбираешься в этом..

J-Fobos
17.02.2011, 18:06
Как помогать?

Deffol
17.02.2011, 18:32
Как помогать?
написать скрипт...если будет не сложно

J-Fobos
17.02.2011, 18:45
Это не "помочь", это сделать вместо вас. Удачи.

Deffol
17.02.2011, 18:52
то есть, не сделаешь?

vex2865
17.02.2011, 19:45
Тогда такой вариант скрипта:

const
name = 'asdasd';
interval = 100; //в мс
var
TimerEnchant:TTimer;



procedure Init;
begin
TimerEnchant:=TTimer.Create(nil);
TimerEnchant.OnTimer:=@enchant;
TimerEnchant.enabled:=false;
TimerEnchant.interval:=interval;
end;


procedure Free;
begin
TimerEnchant.free;
end;

procedure enchant(Sender: TObject);
begin
SendToServerEx(name);
end;

begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
buf:=pck;
TimerEnchant.enabled:=true;
end;

begin
if FromServer and (pck[1]=#$EA) and (ConnectName=name) then
begin
TimerEnchant.enabled:=false;
end;
end;
end.

J-Fobos помоги плиз. Пытаюсь заюзать этот скрипт, но меня дисконектит сразу же как только запускаю на выполнение следующий скрипт:
Код:

begin
SetName('asdasd')
end.

что может быть не так?

J-Fobos
17.02.2011, 20:01
vex2865, все просто. Скрипт писали не вы, у вас он не будет работать ;)
Deffol, нет конечно. Не вижу смысла вкалывать вместо других.

ПомогитеПожалуйста и BioDread сами написали себе скрипт, молодцы. А то что я выкладывал - это просто подсказки.

vex2865
17.02.2011, 20:08
vex2865, все просто. Скрипт писали не вы, у вас он не будет работать ;)
Deffol, нет конечно. Не вижу смысла вкалывать вместо других.

ПомогитеПожалуйста и BioDread сами написали себе скрипт, молодцы. А то что я выкладывал - это просто подсказки.

то что скрипт писал не я это ясно, но почему он у меня работать не будет? он же не привязан к BioDread или Помогите пожалуйста, канеш они молодцы что написали такой скрипт! и у них тоже была проблема с дисконектом! я просто хочу узнать почему дисконектит!

Deffol
17.02.2011, 20:18
фобос, тебе так сложно подсказать? звездная болезнь....
вместо того, что бы помочь, ты тупо строишь из себя бога, и каждого тут судишь, дай тоже какую нибудь подсказку

J-Fobos
17.02.2011, 20:24
vex2865, скрипт не будет работать, потому что он не полный.

Deffol, раньше вы готовый скрипт просили. А все подсказки имеются на форуме, если интересует что-то более конкретное: спрашивайте конкретно.

Deffol
17.02.2011, 20:28
раньше вы готовый скрипт просили. А все подсказки имеются на форуме
раньше я помочь просил, еслиб я знал, что ты так относишься, я бы и не попросил, мне не в кайф перед кем то унижаться....
я понял твою точку зрения, надеюсь смогу сам немного разобраться...
и надеюсь следующая переписка будет более компитентна...спасибо за помощь :)

//J-Fobos: никто вместо вас не выучит табличку умножения. К сожалению, иногда, чтобы заставить человека взяться за удочку и самому научится ловить рыбу приходится ставить его в глухой угол. Может это не лучший метод, но он действует. Все начинают с нуля, главное не сдаваться и все получится.

vex2865
17.02.2011, 20:49
что может быть не так со скриптом
const
name = 'IhelpYou';
interval = 100; //в мс
var
TimerEnchant:TTimer;



procedure Init;
begin
TimerEnchant:=TTimer.Create(nil);
TimerEnchant.OnTimer:=@enchant;
TimerEnchant.enabled:=false;
TimerEnchant.interval:=interval;
end;


procedure Free;
begin
TimerEnchant.free;
end;

procedure enchant;
begin
SendToServerEx(name);
end;

begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
buf:=pck;
TimerEnchant.enabled:=true;
end;

begin
if FromServer and (pck[1]=#$EA) and (ConnectName=name) then
begin
TimerEnchant.enabled:=false;
end;
end;
end.


когда юзаю скил сумона приходит пакет 23, но он не повторяется, вместо этого отправляет пакет 00 и дисконектит

подскажите в чем может быть ошибка

supernewbie
17.02.2011, 21:08
создай переменную для пакета, записывай его туда и в таймере равняй buf на него и отсылай

J-Fobos
17.02.2011, 21:11
Ошибка в том, что в процедуру еnchant не передается значение переменной buf. Есть 2 варианта:
1) придумал supernewbie: ввести дополнительную глобальную переменную и использовать ее для передачи значения.
2) использовать ссылку на объект вызывающий процедуру Sender: TObject

vex2865
17.02.2011, 21:34
Ошибка в том, что в процедуру еnchant не передается значение переменной buf. Есть 2 варианта:
1) придумал supernewbie: ввести дополнительную глобальную переменную и использовать ее для передачи значения.
2) использовать ссылку на объект вызывающий процедуру Sender: TObject

даже если так
procedure enchant(Sender: TObject);
begin
SendToServerEx(name);
end;

всё равно дисконектит((

//J-Fobos: procedure enchant(Sender: TObject) и делает такая конструкция? :)

supernewbie
17.02.2011, 21:49
мой спосаб 100500 робит

vex2865
17.02.2011, 23:01
даже если так
procedure enchant(Sender: TObject);
begin
SendToServerEx(name);
end;

всё равно дисконектит((

//J-Fobos: procedure enchant(Sender: TObject) и делает такая конструкция? :)

подскажите че мне еще исправить чтоб не дисконектило.
может проблема в (ConnectName=name) ?

supernewbie
17.02.2011, 23:23
var
s:string;

pck:=s;

s:=buf;

догадайся что куда

vex2865
17.02.2011, 23:44
var
s:string;

pck:=s;

s:=buf;

догадайся что куда

получается так? если так, то все равно что-то не так, всё равно дисконект((

const
name = 'IhelpYou';
interval = 10; //в мс
var
TimerEnchant:TTimer;
s:string;


procedure Init;
begin
pck:=s;
TimerEnchant:=TTimer.Create(nil);
TimerEnchant.OnTimer:=@enchant;
TimerEnchant.enabled:=false;
TimerEnchant.interval:=interval;
end;


procedure Free;
begin
TimerEnchant.free;
end;

procedure enchant;
begin
s:=buf;
SendToServerEx(name);
end;

begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
buf:=pck;
TimerEnchant.enabled:=true;
end;

begin
if FromServer and (pck[1]=#$EA) and (ConnectName=name) then
begin
TimerEnchant.enabled:=false;
end;
end;
end.

supernewbie
17.02.2011, 23:47
*ля!

buf:=pck; замени на s:=pck; епт

BioDread
17.02.2011, 23:57
Вахах=) Ажиотаж пошёл..
П.С. Зря я назвал назначение пакетов терь все хотят такой сделать :)
Теперь тему переименовываем "В поисках шары" :)
П.С.С. ещё раз спс Фобосу за помощь и ОН МНЕ СКРИПТ НЕ ПИСАЛ он говорил какие лучше использовать команды и для чего.

vex2865
18.02.2011, 00:12
*ля!

buf:=pck; замени на s:=pck; епт

сделал всё вроде правильно
const
name = 'имя чара';
interval = 100; //в мс
var
TimerEnchant:TTimer;
s:string;


procedure Init;
begin
pck:=s;
TimerEnchant:=TTimer.Create(nil);
TimerEnchant.OnTimer:=@enchant;
TimerEnchant.enabled:=false;
TimerEnchant.interval:=interval;
end;


procedure Free;
begin
TimerEnchant.free;
end;

procedure enchant;
begin
s:=buf;
SendToServerEx(name);
end;

begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
s:=pck;
TimerEnchant.enabled:=true;
end;

begin
if FromServer and (pck[1]=#$EA) and (ConnectName=name) then
begin
TimerEnchant.enabled:=false;
end;
end;
end.

но дисконект после того как на вкладке "выполнить" (в главном окне, там где список пакетов и оправка пакетов) запускаю на выполнение следующий скрипт и юзаю пакет 23:

begin
SetName('имя чара')
end.

подскажите, что тут не так?

supernewbie
18.02.2011, 01:09
вы выкручиваете мне яйца со своим аионом,
UseForConnectID(ConnectID);
потому что SetName не пашет вроде

//J-Fobos : как показала практика - пашет :)

BioDread
18.02.2011, 02:01
Безотказно пашет:)

vex2865
18.02.2011, 02:13
Безотказно пашет:)

BioDread, ну подскажи ты пожалуйста, че не так?

Deffol
18.02.2011, 16:17
Еще раз приветствую..
я пробовал разобраться в скрипте, теперь у меня уже конкретные вопросы
в общем я задал в константе интервал 100 и в поцедуре инит 100
присвоил свое имя в вкладке дополнительно и нажал выполнить, в константе так же вписал это имя!
первый вопрос, в процедуре инит я скопировал, что дал фобос
Timer01:=TTimer.Create(nil);
Timer01.OnTimer:=@OnTimer01;
Timer01.enabled:=false;
Timer01.interval:=100;
Немного изменил, вот тут надо что нибудь менять? или можно использовать его так в практике?
пс начальное положение таймера должно же быть выключено?
и сколько минимум можно ставить интервал? а то меня дисконектит постоянно

J-Fobos
18.02.2011, 17:50
Deffol, минимальный интервал может быть 10 мс (делаю такое заключение основываясь на линейке, в аион возможно не так жестко).
Но в данному случаи дисконект происходит не из за интервала. Если вы посмотрите лог пакетов, то увидите что дисконектит из за того что на сервер отправляется пустой пакет.

Deffol
18.02.2011, 20:42
пакет не пустой отправился, по логам видно, что после посылки 1го пакета, наверно включился таймер и посылались эти пакеты 23, один за одним, потом, от сервера пришел какой то пакет, и эти пакеты полетели на клиент, так же много...после этого последовал дисконект!
Не могу понять почему

Добавлено через 41 минуту
я разобрался и сам сделал :):):) спасибо фобос!!! и Дред!

Добавлено через 28 минут
Кстати у меня получилось только через интежер, зато быстро и круто :)

Вот у меня вопросик, а не могу разобраться как сделать, чтоб при отправке постоянного пакета на клиент, начался спам других пакетов ( скилов ) например!...таймер я уже знаю как делать..
Вот это не могу понять

J-Fobos
18.02.2011, 20:47
Ну можно несколько таймеров создать, или несколько скриптов с таймерами.

Deffol
18.02.2011, 21:04
а вот у меня интежер выполняет почти мгновенную посылку пакетов
А нужен ли мне интервал тогда? :)
ведь после того как пакеты интежер закончит посылать, и опирация кончается...интервал получается не работает

J-Fobos
18.02.2011, 21:09
integer это тип данных, я не понял вопроса О_о

Deffol
19.02.2011, 00:13
ладно забудь :)

Помоги пожалуйста...
Вот скрипт мой:
begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
buf:=pck;
for i:=1 to 2000 do
SendToServerEx(name)
end;

begin
if FromServer and (pck[1]=#$EA) and (ConnectName=name) then
begin
Timer01.enabled:=false;
end;
end;
end.

Но когда идет пакет EA, скрипт не останавливается...я не могу понять почему...бьет моба когда тот уже мертв, 2000 раз, лагает из за этого у всех кто рядом стоит)

Добавлено через 5 минут
может вот так надо в конце?
begin
if FromServer and (pck[1]=#$EA) and (ConnectName=name) then
begin
Timer01.enabled:=false;
i:=0;
end;
end;
end.

J-Fobos
19.02.2011, 00:32
Бить будет пока не убьет наверняка :D
for i:=1 to 2000 do просто 2к раз ударит и все. Как видно из цикла, никакой остановки в нем не предусмотрено. А таймер как я понял не используется, так что его активность не будет влиять на остановку.

Deffol
19.02.2011, 04:22
я просто с таймером не разобрался, если вот так сделать, должен же работать?
begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
buf:=pck;
Timer01.enabled:=true;
end;
begin
if FromServer and (pck[1]=#$EA) and (ConnectName=name) then
begin
Timer01.enabled:=false;
end;
end;
end.

Добавлено через 12 минут
а в процедуре инита, он должен влючен быть или выключен? :)

Добавлено через 33 минуты
меня постоянно дисконектит...только с отправкой через интежер нормально...
помоги с таймером пожалуйста

//J-Fobos: вот инфа по таймеру (http://coderx.ru/showpost.php?p=30293&postcount=404), не сдавайся и все получится ;)

Добавлено через 2 часа 50 минут
const
name = 'Destroer';
interval = 100;
var
Timer01:TTimer;
i:integer;

procedure Init;
begin
Timer01:=TTimer.Create(nil);
Timer01.OnTimer:=@enchant;
Timer01.enabled:=false;
Timer01.interval:=interval;
end;


procedure Free;
begin
Timer01.free;
end;

procedure enchant(Sender: TObject);
begin;
SendToServerEx(name);
end;

begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
buf:=pck;
for i:=1 to 2000 do
SendToServerEx(name);
end;
end.
begin
if FromServer and (pck[1]=#$EA) and (ConnectName=name) then
begin
i:=0;
end;
end;
end.
Этот скрипт у меня получилось включить!!! но выключить не могу :) при убийстве моба

const
name = 'Destroer';
var
Timer01:TTimer;



procedure Init;
begin
Timer01:=TTimer.Create(nil);
Timer01.OnTimer:=@OnTimer01;
Timer01.enabled:=false;
Timer01.interval:=100;
end;


procedure Free;
begin
Timer01.free;
end;

procedure OnTimer01(Sender: TObject);
begin
SendToServerEx(name);
end;

begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
Timer01.enabled:=true;
buf:=pck;
end;

begin
if FromServer and (pck[1]=#$EA) and (ConnectName=name) then
begin
Timer01.enabled:=false;
end;
end;
end. - это я пробовал с таймером, не получается, куда только не вставлял таймер=тру, и баф=пак

supernewbie
19.02.2011, 04:25
const
name = 'Destroer';
var
Timer01:TTimer;
MyPck:string; //блеать 1

procedure Init;
begin
Timer01:=TTimer.Create(nil);
Timer01.OnTimer:=@OnTimer01;
Timer01.enabled:=false;
Timer01.interval:=1000;
end;

procedure Free;
begin
Timer01.destroy;
end;

procedure OnTimer01(Sender: TObject);
begin
buf:=MyPck; //блеать 2
SendToServerEx(name);
end;

begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
MyPck:=pck; //блеать 3
Timer01.enabled:=true;
end;

if FromServer and (pck[1]=#$EA) and (ConnectName=name) then Timer01.enabled:=false;
end.

Deffol
19.02.2011, 05:37
хех, а я думал, что таймер не правильно засунул) а тут с пакетом косяк

Deffol
20.02.2011, 16:45
помогите если не трудно :)
вот я хочу написать скрипт, чтоб когда отправлялся пакет, он сразу юзался
и юзал еще один пакет...
Вот, я сам пытался:
begin
if FromClient and (pck=HStr('Тут будет сам пакет, постоянный') then
begin
buf:=pck;
SendToSever;
pck:='';
buf:=HStr('тут второй пакет')
SendToServer;
pck:='';
end;
end.
Вот, что тут не так? :) не могу до ума довести

J-Fobos
20.02.2011, 17:12
Вместо SendToServer лучше использовать SendToServerEx;

buf:=pck;
SendToServer;
pck:='';
Что делает такая конструкция?

Deffol
20.02.2011, 17:47
Что делает такая конструкция?
Елси честно, я не знаю :) я делаю на примере, вот у меня есть скрипт, на подмену пакетов:
begin
if FromClient and (pck=HStr('C9 57 66 15 02 00 00 00 00 00'))//эмоция гнев
then
begin
buf:=HStr('67 57 04');//Призрак

SendToServer;
pck:='';

end;


end.
То есть, когда приходит этот пакет, юзается другой, вот я и подумал, может сделать так, чтоб когда приходил пакет, юзался он же, и потом еще один!
и смотрел пример с этим:
begin
if FromClient and (pck[1]=#$23) and (ConnectName=name) then
begin
MyPck:=pck;
end;
end.
Когда юзается пакет, отправляется он же как я понял этой командой:
MyPck:=pck;
Но в своем скрипте, решил отправку пакета, который был выше, написать обычно:
buf:=pck;
Так как таймера нет :)
Суть в том, что я хочу, когда меня станят, появляется скил - антистан, чтоб он юзался и сразу юзался скил, контр атаки...

Добавлено через 20 минут
Я понял, что делает эта конструкция, в общем, buf:=pck; - отправляет пакет который вначале..
SendToServer что означает, я не понял
А pck:=''; означает, что первый пакет не посылается :) это для подмены скилов, когда юзается один скил, отправляется другой, а чтоб 1й не отправлялся, нужн описать это!
Только теперь я запутался немного :)

J-Fobos
20.02.2011, 17:51
Это хорошо что вы пользуетесь примерами, что умеете их склеить вместе. Но надо еще понимать что из этого получается. Попробуйте ответить на пару вопросов, думаю эти ответы помогут вам :)
1) Что такое buf? (чем подробнее напишете, тем лучше)
2) Что такое pck?
3) Что будет если pck:=''; ?

Deffol
20.02.2011, 19:40
я кажется понял :)
Вот набросок:
begin
if FromClient and (pck=HStr('пакет стана')
then
begin
buf:=HStr('Пакет антистана');
SendToServer;
buf:=HStr('Пакет контр атаки');
SendToServer;
end;
end.
Вроде так? :)

//J-Fobos: Да, все правильно написано.

И на счет SendToServerEx, с ним не получается...в скрипте ошибку пишет

//J-Fobos: Возможно не так его используете? Формат следующий SendToServerEx('имя соединения'). Ну а имя, как уже раньше писали задается с помощью SetName.

Добавлено через 18 минут
Спасибо большое за помощь :)

Добавлено через 1 час 25 минут
да, все работает! указал имя в const :) но оч быстро...не успевают скилы юзаться
Но я еще не могу разобраться как правильно организовать таймер, поможешь? я пишу пишу, а он ошибки выдает, написать я его смогу, но вот я не знаю где его и как включать!
в коде вверху!

J-Fobos
20.02.2011, 22:07
Не представляю какие еще объяснения по таймеру можно написать, кроме тех на которые я ссылки кидал =)

supernewbie
20.02.2011, 22:46
процедура из OnTimer вызывается в том же потоке, в котором создан таймер например)
PS именно это свойство делает таймер крутым

Deffol
21.02.2011, 08:17
Не представляю какие еще объяснения по таймеру можно написать, кроме тех на которые я ссылки кидал =)
просто не пойму, как после начала таймера, конструировать пакеты:
Вот пример, того как я его включил,
begin
if FromClient and (pck=HStr('C9 57 66 15 5F 00 00 00 00 00')) and (ConnectName=name)
then
begin
t.enabled:=true;
P:=HStr('C9 57 66 15 61 00 00 00 00 00');
end;
После того как юзается пакет 1-й, через интервал, юзается 2-й
Но, мне нужно, чтоб еще один следом юзнулся, и я не знаю как его правильно вставить, ибо, как не пробую, получается, что, после 1-го пакета, юзается сразу последний, а 2-й вообще не юзается :) вот..

Добавлено через 2 часа 41 минуту
procedure OnTimer(Sender: TObject);
begin
buf:=HStr('C9 57 66 15 60 00 00 00 00 00');
SendToServerEx(name);
buf:=Hstr('C9 57 66 15 61 00 00 00 00 00');
SendToServerEx(name);
end;
Вот между этим мне нужна задержка, всю ночь думал над ней :)
Получилось, только через Delay
1 таймер у меня есть ниже такой:
begin
if FromClient and (pck=HStr('C9 57 66 15 5F 00 00 00 00 00')) and (ConnectName=name)
then
T.enabled:=true;

if FromClient and (pck[1]=#$9E) and (ConnectName=name)
then
T.enabled:=false;
end.

Можно ли использовать как то этот таймер, чтоб была задержка после срабатывания, между пакетами...?? или нужно делать 2й таймер? я не могу додуматься...

J-Fobos
22.02.2011, 23:22
Используй в таймере case и счетчик итераций. Пару примеров с таким есть на форуме. Целые наборы пакетов (с разными задежками) можно отправлять одним таймером :)