PDA

Просмотр полной версии : Что нужно знать для написания скриптов


xkor
14.08.2007, 11:18
Прежде всего вам понадобится умение программирования на Object Pascal (или Delphi, что примерно тоже самое) и для манипуляций с пакетами естественно понадобится знать что они из себя представляют, о пакетах подробнее можно почитать в соответствующем разделе.

В этой теме я лиш приведу описания внутренних функций и переменных программы.

Описание FastScript: (это скриптовой движек использованный в программе)
http://forum.coderx.ru/uploads/fs.rtf

Доступные переменные:
pck (string) - текущий обрабатываемый пакет (без первых двух байт с размером)
FromClient (boolean) - пакет (pck) пришел от клиента (всёравно что not FromServer)
FromServer (boolean) - пакет (pck) пришел от сервера (всёравно что not FromClient)
buf (string) - буфер, используемый некоторыми функциями
ConnectName (string) - имя чара от или к которому идёт пакет (v. 3.1.3+)
ConnectID (integer) - номер соединения для которого выполняется скрипт

Доступные функции:
ShowTab и HideTab - для отображения/скрытия панели (UserTab), управлять которой можно из скрипта
Для рисования на ней контролов надо указывать UserTab в качестве родителя
SendToClient - отправляет клиенту содержимое переменной buf
SendToServer - отправляет серверу содержимое переменной buf
SendToClientEx(CharName: string) - отправляет клиенту с именем CharName содержимое переменной buf (v. 3.1.3+)
SendToServerEx(CharName: string) - отправляет серверу с именем CharName содержимое переменной buf (v. 3.1.3+)
(к пакету buf автоматически добавляются 2 байта длины)

NoFreeOnClientDisconnect - запрещает закрытие соединения при дисконекте клиента (v. 3.1.9+)
NoFreeOnServerDisconnect - запрещает закрытие соединения при дисконекте сервера (v. 3.1.9+)
YesFreeOnClientDisconnect - разрешает закрытие соединения при дисконекте клиента (v. 3.1.9+)
YesFreeOnServerDisconnect - разрешает закрытие соединения при дисконекте сервера (v. 3.1.9+)
(по умолчанию закрытия разрешены)
DisconnectServer - закрывает соединение с сервером (v. 3.2.0+)
DisconnectClient - закрывает соединение с клиентом (v. 3.2.0+)

ConnectNameByID(id:integer):string - возвращает имя соединения по его ID (v. 3.2.0+)
ConnectIDByName(name:string):integer - возвращает ID соединения по его имени (v. 3.2.0+)
SetName(Name:string) - устанавливает имя соединения (v. 3.2.0+)

ReadC(var index:integer):byte - читает из переменной pck байт
ReadH(var index:integer):word - читает из переменной pck число (2 байта) (v. 3.1.8+)
ReadD(var index:integer):integer - читает из переменной pck число (4 байта)
ReadF(var index:integer):double - читает из переменной pck число c плавающей запятой(8 байт) (v. 3.1.8+)
ReadS(var index:integer):string - читает из переменной pck строку (в пакете строка unicode нультерминированная, а результирующая строка обычная паскалевская)
Index - начальная позиция чтения, которая модифицируется функцией (сдвигается на число считанных байт)

HStr(h:string):string - преобразует строку в HEX-последовательность
К примеру, HStr('AA 00 BB 00 CC 00') вернёт цепочку байт #$AA#$00#$BB#$00#$CC#$00. Можно передавать строку как с пробелами, так и без них; регистр символов не имеет значения.

WriteC(v:byte; ind:integer=0) - пишет в переменную buf один байт
WriteH(v:word; ind:integer=0) - пишет в переменную buf число (2 байта) (v. 3.1.8+)
WriteD(v:integer; ind:integer=0) - пишет в переменную buf число (4 байта)
WriteF(v:double; ind:integer=0) - пишет в переменную buf число c плавающей запятой(8 байт) (v. 3.1.8+)
WriteS(v:string) - пишет в переменную buf строку (автоматический перевод в unicode)
В первых четырёх процедурах присутствует необязательный параметр ind. Если параметр не указан, то переменная buf дополняется байтом/числом, иначе модифицируется часть буфера.

LoadLibrary(LibName:String):Integer - подгружает к программе библиотеку LibName и возвращает указатель на неё (v. 3.1.8+)
FreeLibrary(LibHandle:Integer):Boolean - выгружает из памяти программы библиотеку (v. 3.1.8+)
CallFunction(LibHandle:integer;FunctionName:String ;Count:Integer;Params:array of variant):variant - вызывает функцию FunctionName из зарание подгруженной библиотеки с указателем LibHandle и параметрами перечисленными в Params (v. 3.1.8+)

Пример:
buf=HStr('AA BB CC DD EE');
Если вызвать функцию WriteD(10,1), то получим buf=[0A 00 00 00 EE].
А если просто WriteD(10), то [AA BB CC DD EE 0A 00 00 00].

Например скрипт:begin
if FromClient and (ConnectName='SokolA')
and (pck=HStr('1b 04 00 00 00')) then begin
buf:=HStr('45 00 00 00 00 00 00 00 00 00');
SendToServerEx('SokolB');
pck:='';
end;
end.При получении от клиента играющего за чара с ником SokolA пакета 1b 04 00 00 00 (социальное действие "Victory") непропустит этот пакет и отправит пакет 45 00 00 00 00 00 00 00 00 00 (команда сесть) от имени клиента играющего за чара с ником SokolB, тоесть играете вы в два окна, в одном SokolA, в другом SokolB, нажимаете в первом Victory, и SokolB садится.

Пример вызова функций из системных библиотек:var
lib,Lib1:Integer;
Res:variant;
ar:array of variant;
begin
lib := loadLibrary('User32.dll');
lib1 := loadLibrary('GDI32.dll');
Res := CallFunction(lib,'MessageBoxW',4,[nil,'Text1','text2',0]);
Res := CallFunction(lib,'GetDC',1,[0]);
CallFunction(lib1,'LineTo',3,[Res,100,100]);
CallFunction(lib,'ReleaseDC',2,[0,Res]);
FreeLibrary(lib);
FreeLibrary(lib1);
end.

На вкладке Скрипты:
Процедура OnConnect(WithClient: Boolean) вызывается при установке соединения, флаг WithClient указывает с клиентом ли произошло соединение (v. 3.1.9+)
Процедура OnDisconnect(WithClient: Boolean) вызывается при потере соединения (v. 3.1.9+)
Процедура Init вызывается когда вы устанавливаете рядом со скриптом галочку.
Процедура Free вызывается когда вы убираете рядом со скриптом галочку.
Основное тело скрипта (между begin и end) вызывается каждый раз при получении пакета от сервера или клиента если скрипт отмечен галочкой.

На вкладке Дополнительно:
Основное тело скрипта (между begin и end) вызывается по нажатию кнопки Выполнить, и прекращается либо по нажатию Стоп, либо по окончанию работы скрипта.

03.10.2007, 16:05
а можно вопрос если мне нужна пауза менее целого числа что деалть насколько я понял delay() только с целыми числами работает?

03.10.2007, 16:07
то есть нужна пауза не в милли а в МИКРО секунды - не спрашивайте только плиз зачем надо) потом объясню если создатут раздел баги)))

xkor
03.10.2007, 16:16
то есть нужна пауза не в милли а в МИКРО секунды - не спрашивайте только плиз зачем надо) потом объясню если создатут раздел баги)))
ну ты мазахист), такой функции и в самом дельфи нет), хотя можно написать и на скрипте немного подумав...

03.10.2007, 16:39
Можно хоть наводку дать как это сделать - я туплю уже второй день - могу написать в пм зачем мне оно надо - только плиииз объясни - нужна пауза в 22,5 мс 48,5 мс и 120,25 мс

xkor
03.10.2007, 21:24
Можно хоть наводку дать как это сделать - я туплю уже второй день - могу написать в пм зачем мне оно надо - только плиииз объясни - нужна пауза в 22,5 мс 48,5 мс и 120,25 мс
с фразой "хотя можно написать и на скрипте немного подумав..." я походу погоречился, почитав пару статей я понял что в винде задержку с точностью до микросекунд реализовать можно только погемороившись с написанием драйвера.., я уж не говорю про доли микросекунд.., вобщем забудь о своей идее...

03.10.2007, 22:25
Спасибо хкор - реализовал точьность делителем - есть снифферы с замедлением - как вариант - уфасофт сниффер там стоит драйвер на замедление до долей мс какраз как надо ) спс за то что нагрузил.

VORON
09.10.2007, 07:22
Спасибо хкор - реализовал точьность делителем - есть снифферы с замедлением - как вариант - уфасофт сниффер там стоит драйвер на замедление до долей мс какраз как надо ) спс за то что нагрузил.
дело в том что никто не понимает что ты хочеш добиться... расскажи нам свою идею плиз для которой ты применяеш микрозадержку...
дело в том что задержка в протоколе игры на такое мизерное время- ничего толком не изменит...
ты пытаешся сделать задержку искуственно с помощью программ но ето врямя превышает время ПИНГА в 10 раз примерно...
причем у пинга еще РАНДОМ есть.. реальные условия показывают что 10-200 Мс надо на пинг до сервера.. с таким разбросом значений.. применять задержку 25мс я не понимаю... ето работать не будет... сервак примет твои сообщения с разбросом матнематическим примерно 100 мс... одно сообщение прийдет через 20 мс а другое через 500 мс.. и с помощью клиента ты неможеш ето контролировать...
плиз поясни суть своей идеи чтоб мы вмести подумали...

xkor
09.10.2007, 10:08
дело в том что никто не понимает что ты хочеш добиться... расскажи нам свою идею плиз для которой ты применяеш микрозадержку...
дело в том что задержка в протоколе игры на такое мизерное время- ничего толком не изменит...
ты пытаешся сделать задержку искуственно с помощью программ но ето врямя превышает время ПИНГА в 10 раз примерно...
причем у пинга еще РАНДОМ есть.. реальные условия показывают что 10-200 Мс надо на пинг до сервера.. с таким разбросом значений.. применять задержку 25мс я не понимаю... ето работать не будет... сервак примет твои сообщения с разбросом матнематическим примерно 100 мс... одно сообщение прийдет через 20 мс а другое через 500 мс.. и с помощью клиента ты неможеш ето контролировать...
плиз поясни суть своей идеи чтоб мы вмести подумали...
эт он баг с сабами пытается реализовать в безлаговых условиях.., но ты почти прав за исключением таких больших значений пингов, для пакетов посланных с мизерной задержкой пинг будет различаться скорее всего не более чем на пару милисекнд что конечно много больше чем задержка между отправкой но это максимальное значение а мимальное 0), но минимальное практически недостижимо...

Grinch
10.10.2007, 19:39
если с сабами в не баговых условиях хз но послушай карифеев лутьше подумай о ловли лага и как сделать что б при удачной попытке не осталось так называемой копии которая у народа тупа висит пока релогин не сделает или не обновится локация( тока если отойти подальше и вернуться ) просто удевляюсь как я сам не пропалился :)

VORON
11.10.2007, 05:46
ИФ я тебя пон ты пытаешся реадилозавать- очень древнийй баг.. из ц3.. давным давно был такойб аг в ц3 что можно было 5 расс одновременно одним персом в игру зайти...

Grinch
11.10.2007, 07:11
я но Шоках ловил лаг соски спецом т.е. стоял и надрачивал пушку лаг по моей статистике появляется каждые 15 минут подрят от 1-3 раз при количестве народа от 700-1500чел при боолее 2к минут 10. ЗЫ когда кто то начинает учить скилы с 40-го до 78 лвл лагает всегда я хз почему так проискходит или мне просто показалось :) но когда учили скилы С5 всем сервером на мобах их лутьше было не проверять соски не работали совсем.

Добавлено спустя 20 минут 44 секунды:
ЗЫ кто знает где скачать учебники по прагромированию FastScript, и ещё очень надо вспомнить как в школе учили квадратиками и треуголниками на бумажке програмить :D думал помню но это было лет 6-8 назад.

Добавлено спустя 8 минут 57 секунд:
мне товаришь програмер говорил что организация строительства по логике напоминает грамотное построение программ бум проверять :D

Agat
26.10.2007, 14:17
мне товаришь програмер говорил что организация строительства по логике напоминает грамотное построение программ бум проверять :D
Тогда я асс! :) Как раз по работе составляю графики производства работ. :P Дать ссылки на форумы менеджмента проектов? :ROFL:

PIONER
27.10.2007, 05:06
Что-то я запутался, Сколько в секунде милисекунд и микросекунд?



const
greeting=('1b 04 00 00 00');
victory=('1b 03 00 00 00');
advance=('1b 04 00 00 00');
yes=('1b 06 00 00 00');
begin
buf:=HStr(greeting);
SendToServer;
end.
delay(9999)
begin
buf:=HStr(victory);
SendToServer;
end.
delay(9999)
begin
buf:=HStr(advance);
SendToServer;
delay(9999)
end.
delay(9999)
begin
buf:=HStr(yes);
SendToServer;
end.
delay(9999)

Как выставить задержку побольше? а то я ставил и 9999 и 9999999, помоему эффект одинаковый, может она вобще не включается?
Как сделать так, чтобы victory повторился 10 раз(с задержкой между повторениями), перед тем как перейти к выполнению advance?

NLObP
28.10.2007, 01:20
В этой теме обсуждается задержка в скрипте http://xkorem.net/vbforum/showthread.php?t=345 (http://xkorem.net/vbforum/showthread.php?t=345) и здесь http://xkorem.net/vbforum/showpost.php? ... stcount=21 (http://xkorem.net/vbforum/showpost.php?p=4591&postcount=21)

22.12.2007, 22:10
что-то у вас не то =/
по такому скрипту, по вашему описанию, вместо действия victory должно выполняться действие сесть:


procedure Init;
begin
end;

procedure Free;
begin
end;

begin
if FromClient and (ConnectName='nickname') and (pck=HStr('1b 04 00 00 00'))
then
begin
buf:=HStr('45 00 00 00 00 00 00 00 00 00');
SendToServerEx('nickname');
pck:='';
end;
end.


Или я неверно понял принцип работы программы?

VORON
18.01.2008, 04:58
если кто то что то не понимает.. то для обсуждения скриптов и их производства используется топ - "ДА БУДЕТ БОТ"..
етот топ нужен лищ для частных члучаев.. чтоб понять ваще- общий смысл...
если не тут не там не понятно- то респект...

boyan
25.01.2008, 14:38
NoFreeOnClientDisconnect - запрещает закрытие соединения при дисконекте клиента (v. 3.1.9+)
NoFreeOnServerDisconnect - запрещает закрытие соединения при дисконекте сервера (v. 3.1.9+)
YesFreeOnClientDisconnect - разрешает закрытие соединения при дисконекте клиента (v. 3.1.9+)
YesFreeOnServerDisconnect - разрешает закрытие соединения при дисконекте сервера (v. 3.1.9+)
(по умолчанию закрытия разрешены)

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

QaK
25.01.2008, 15:08
т.е. если мы запретим закрытие соединения, при дисконекте клиента, сделаем скриптик на ответ на нет пинг, то при выключении клиента, наш перс будет например: сидеть на трейде?
Именно,если мы его на трейд посадили =)

boyan
25.01.2008, 20:12
Именно,если мы его на трейд посадили =)
можно попросить пример использования?

31.01.2008, 01:59
Да, можно пример того как продолжать поддерживать связь?

31.01.2008, 01:59
Да, можно пример того как продолжать поддерживать связь?

ChiterEPT
31.01.2008, 21:26
Добавьте в любой скрипт:
procedure OnConnect(WithClient: Boolean);
begin
NoFreeOnClientDisconnect;
NoFreeOnServerDisconnect;
end;

И Бот останется в игре после выхода клиента.

Добавлено спустя 1 минуту 56 секунд:
Да и еще... Сначала включите скрипт потом входите в игру, чтоб процедура OnConnect выполнилась.

Emocean
04.02.2008, 16:06
lQaKl, ясно. А можно ли как-то минимизировать трафик от сервера?
Ведь как я понимаю, даже с закрытым клиентом игры, весь трафик от перса получает l2phx...

QaK
04.02.2008, 16:54
А можно ли как-то минимизировать трафик от сервера?
С какой целью? С целью уменьшения стоимости просиженнного инета - наверно можно, но я хз как =) С точки зрения загруженности компа - в скрипте пишешь типа такого

begin
......
if FromServer then
begin if (pck[1]=#$01)or(pck[1]=#$01)or(pck[1]=#$01) и т.д.// сюда пишешь те пакеты (первый байт - идентификатор типа пакета) которые тебе не нуны.
then pck:='';
end;
.....
end.

Emocean
04.02.2008, 17:03
С какой целью? С целью уменьшения стоимости просиженнного инета - наверно можно, но я хз как =)
Для экономии трафика и для избежания лагов на узком канале. Жаль, что нельзя :(

boyan
07.02.2008, 17:36
А можно ли как-то минимизировать трафик от сервера?
С какой целью? С целью уменьшения стоимости просиженнного инета - наверно можно, но я хз как =) С точки зрения загруженности компа - в скрипте пишешь типа такого

begin
......
if FromServer then
begin if (pck[1]=#$01)or(pck[1]=#$01)or(pck[1]=#$01) и т.д.// сюда пишешь те пакеты (первый байт - идентификатор типа пакета) которые тебе не нуны.
then pck:='';
end;
.....
end.

это не спасет.. пакет то уже пришел..

QaK
08.02.2008, 08:18
Я и говорю С точки зрения загруженности компа - в скрипте пишешь типа такого

PanAm
18.02.2008, 17:55
глупый вопрос наверно... как вызвать в CallFunction функцию без параметров?

xkor
18.02.2008, 18:02
ну указать в количестве параметров 0 и всё)

PanAm
19.02.2008, 18:33
CallFunction(lib,'MyFunc',0,?)
что-то у меня не проходит проверу, как не писал.

xkor
20.02.2008, 01:09
CallFunction(lib,'MyFunc',0,[0])

23.02.2008, 22:47
У меня вопрос по поводу функции NoFreeOnClientDisconnect , если я перехватываю пакет от клиента и посылаю его серверу с определенной периодичностью, возможно ли сделать так, чтобы этот пакет отправлялся еще какое то время серверу, даже если он оборвал соединение с клиентом?

xkor
24.02.2008, 14:02
Plastid, если сервер оборвал соединение то слать уже некуда)

QaK
26.02.2008, 11:33
Хкор, ты еще не правил перредачу данных из/в дллку, или это будет поправленно только уже в 4.0.0?

xkor
27.02.2008, 12:14
lQaKl, это надо движок менять.., мне в ближайшее время не до этого...

PanAm
05.03.2008, 16:54
CallFunction(lib,'MyFunc',0,[0])
господи, неделю думал, чтож у меня не работает... крэзи...
нашел - на автомате написал fmForm.Create(nil) вместо - fmForm := TForm.Create(nil) %)

PanAm
11.03.2008, 13:43
Появилась другая проблема...
Как все-таки оптимально передать целиком пакет в dll?
Как, если возможно вообще, в скрипте вызвать WinAPI например функцию SetWindowPos, чтоб создать по настоящему СтейОнТоп окно?

QaK
12.03.2008, 08:43
Как все-таки оптимально передать целиком пакет в dll?
Пока никак, передача данных в/из длл фигово реализована в нынешнем пакетхаке, ждем нового релиза.

13.03.2008, 17:56
Напишите пожалуйста, скрипт для блока определённого пакета, и замена его другим....

QaK
13.03.2008, 18:26
const CharName='Сюдапишешьимятвоегочара';

procedure Init;
begin
end;

procedure Free;
begin
end;

begin
//сначала пример блока от клиента с заменой
if (FromClient) and (ConnectName=CharName) then
begin if pck=#$2F+#$06+#$00 //пример абсолютно нереальный сюда ставишь свой пакет
then begin pck:=''; //блокируем пакет
buf:=#$2F+#$07 //аналогично формируем другой пакет
SendToServerEx(CharName); // посылаем подмененный пакет
end;

end;
//для блокировки со стороны сервера и замены изменить FromClient на FromServer и SendToServerEx на SendToClientEx
end.

А вообше - учись юзать поиск, таких решений уже 1000 раз просили и писали.

13.03.2008, 20:06
Поиска кoрявый ИМХО
const CharName='OrcCanFly';
begin
if (FromClient) then
begin if (pck=HStr('45 00 00 00 00 00 00 00 00 00'))
then begin pck:='';
end;
end;
end.
Собственно долже блокировать вот такой-то пакет, но не работает.... Тыркните носом в ошибку...

QaK
14.03.2008, 16:28
Собственно долже блокировать вот такой-то пакет, но не работает.... Тыркните носом в ошибку..
поменяй в условии
if fromClient
на
if (fromclient) and (ConnectName=CharName)

ты уверен что именно такой пакет отправляет клиент?

PanAm
14.03.2008, 16:45
Cowcanfly
я б написал так
const
MyAction = 0;
begin
if FromClient and pck[1]=#$45 then
if ReadD(2) = MyAction then
pck:='';
end.

14.03.2008, 17:31
Собственно долже блокировать вот такой-то пакет, но не работает.... Тыркните носом в ошибку..
ты уверен что именно такой пакет отправляет клиент?
Это идёт расшифрованый пакет интерлюдии, это пакет, чтобы сесть...
Если нужно не расшифрованые посылать, где их посмотреть?...

h82w8
20.04.2008, 04:36
если часть пакета постоянно меняется, то как написать скрипт чтоб он видел этот пакет всегда?

NLObP
20.04.2008, 04:40
если часть пакета постоянно меняется, то как написать скрипт чтоб он видел этот пакет всегда?

У пакета есть идентификатор (первый байт). По нему и определяй.

h82w8
20.04.2008, 04:43
ну вот пример скрипта
begin
if FromClient and (ConnectName='name')
and (pck=HStr('15 55 B0 F1)) then begin //B0 F1 постоянно меняются
buf:=HStr('51 55 B0 F1'); // но мне надо чтобы пакет изменялся всегда на этот
SendToServerEx('name);
pck:='';
end;
end.
что надо изменить чтобы всегда работало? не писать целый пакет а токо ту часть которая не меняется или как?

Emocean
20.04.2008, 13:10
что надо изменить чтобы всегда работало?
По идее надо так:
begin
if FromClient and (ConnectName='name')
and pck[1]=#$15 then begin
buf:=HStr('51 55 B0 F1');
SendToServerEx('name);
pck:='';
end;
end.
Но ты уверен, что тебе нужны именно эти пакеты?
15=TradeRequest:h(ObjectID)
51=RequestSurrenderPledgeWar:s(PledgeName)
Короче что-то здесь не так)

h82w8
20.04.2008, 16:32
нет я от балды пакеты написал
как вычислить pck[1]=#$15 из обычного пакета?

ad01f
20.04.2008, 19:07
то есть нужна пауза не в милли а в МИКРО секунды - не спрашивайте только плиз зачем надо) потом объясню если создатут раздел баги)))
мне сейчас понадобилось примерно тоже самое. но, движок unreal engine имеет т.н. тикрейт в районе 30-70 (секунда делится на количество тиков) я не знаю какой именно используется в ла2 но в любом случае тик получается больше 30 мс, а если нужны микросекунды? нужно примерно для того же что автору, только частный случай не саб а другой. как ни удивительно баги использующие "лаги сосок" еще есть, только сами лаги поймать очень тяжело. короче эт он баг с сабами пытается реализовать в безлаговых условиях.. это возможно? повторюсь, саб и клон не нужны, нужны условия

h82w8
20.04.2008, 23:40
короче всё разобрался, мультибафф овнед :)

VORON
28.06.2008, 18:05
ну вот пример скрипта
begin
if FromClient and (ConnectName='name')
and (pck=HStr('15 55 B0 F1)) then begin //B0 F1 постоянно меняются
buf:=HStr('51 55 B0 F1'); // но мне надо чтобы пакет изменялся всегда на этот
SendToServerEx('name);
pck:='';
end;
end.
что надо изменить чтобы всегда работало? не писать целый пакет а токо ту часть которая не меняется или как?

прочитал- вдумался ответ: сервак не шифрован?
че за куйня ак могут 3-4 байты меняться? таково не должно быть...
если сервак шифрован то ждем тебя в теме "ДЕШИРИРУЕМ ТРАФИК"
хотя гонево какоето вапще выходит с твоим случаем.. явно кто то ковото не понимает- (наверно я)
когда перехвачен пакет- ты его насильно переправляеш на другой...
в скрипте
я етого не понима. ваще какие причины тябя заставили делать так?

nechaevrus
19.10.2008, 19:51
const
ww=('23 51 00 75 00 65 00 73 00 74 00 20 00 39 00 39 00 39 00 39 00 5F 00 4E 00 50 00 43 00 42 00 75 00 66 00 66 00 65 00 72 00 20 00 37 00 00 00');
shield=('23 51 00 75 00 65 00 73 00 74 00 20 00 39 00 39 00 39 00 39 00 5F 00 4E 00 50 00 43 00 42 00 75 00 66 00 66 00 65 00 72 00 20 00 39 00 00 00');
begin
if FromClient and (ConnectName='lMixeRl')
and (pck=HStr('49 4B 04 47 04 00 00 00 00 00 00')) then begin
buf:=HStr('23 51 00 75 00 65 00 73 00 74 00 20 00 39 00 39 00 39 00 39 00 5F 00 4E 00 50 00 43 00 42 00 75 00 66 00 66 00 65 00 72 00 20 00 37 00 00 00');
SendToServerEx('lMixeRl');
pck:='';
end;
begin
buf:=HStr('shield');
SendToServerEx('lMixeRl');
pck:='';
end;
end.

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

Grinch
19.10.2008, 22:50
Моя цель - создать быстрый ребаф(канцелюги достали). То есть я подхожу к баферу, открываю окно с бафами, печатаю в чат "ыч" и бафер быстро меня бафает. В данном скрипте реализовано бафание только двух бафов(вв и шилд). Однако когда я включаю клиент, запускаю скрипт и ввожу "ыч" меня просто выкидывает с сервера. Ткните носом плз).
юзай поиск http://coderx.ru/showpost.php?p=3397&postcount=258 тока не помню последний это вариант или нет

xkor
23.10.2008, 09:40
buf:=HStr('shield'); и что это такое? с чего бы серву тя не кикать если ты вместо пакета отправляеш слово shield.., кавычки то убери, shield это переменная а не текст...

Nostalgy
15.12.2008, 16:46
Сорри за дебильный вопрос.. А скрипт для л2пх отличается чем-то от скрипта для валкера? Как там правила писания его? Скажем тот же скрипт на манор для л2пх. Если его тупо скопировать и вставить в бота он ведь не будет работать или будет?)

vovanchik
15.12.2008, 17:24
Сорри за дебильный вопрос.. А скрипт для л2пх отличается чем-то от скрипта для валкера? Как там правила писания его? Скажем тот же скрипт на манор для л2пх. Если его тупо скопировать и вставить в бота он ведь не будет работать или будет?)

нет

xkor
16.12.2008, 15:35
Nostalgy, акромя того что и скрипты для валкера и скрипты для phx называются скриптами больше у них ничего общего нет...

-=[B1@©k}{ac]{e®]=-™
16.01.2009, 11:52
Если запретить закрытие соединения при дисконнекте клиента, то будут ли работать скрипты для данного чара ?

QaK
16.01.2009, 12:13
-=[B1@©k}{ac]{e®]=-™, если скрипт грамотно написан и заточен на то, чтоб работать даже без клиента - то да.

-=[B1@©k}{ac]{e®]=-™
16.01.2009, 13:00
QaK, пытался править скрипт бота-бафера...
//by vimin
//Скрипт для SE, чтобы бегал, лечил и бафал по команде от командира.

const //баффы
b1='2F 10 04 00 00 00 00 00 00 00'; // Shield
b2='2F 0B 04 00 00 00 00 00 00 00'; // Mental Shield
b3='2F 23 04 00 00 00 00 00 00 00'; // Empower
b4='2F B4 04 00 00 00 00 00 00 00'; // Wind Walk
b5='2F 36 04 00 00 00 00 00 00 00'; // Concentration

var
IDPartyMember, IDAssistTarget: String; //ИД командира и ИД его таргета и Собственный ИД
CoordBufX, CoordBufY, CoordBufZ :String; //координаты бота
NameBuffer, NameKomandos : String; // Имена
x: integer;
timer1: TTimer;

procedure OnTimer(Sender: TObject);
begin
case x of
1: begin
//выделяем командира, эмулируя щелчек мыши
buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
SendToServerEX(NameBuffer);

buf:=hstr(b1);
SendToServerEx(NameBuffer);
x:=x+1;
end;
2: begin
buf:=hstr(b2);
SendToServerEx(NameBuffer);
x:=x+1;
end;
3: begin
buf:=hstr(b3);
SendToServerEx(NameBuffer);
x:=x+1;
end;
4: begin
buf:=hstr(b4);
SendToServerEx(NameBuffer);
x:=x+1;
end;
5: begin
buf:=hstr(b5);
SendToServerEx(NameBuffer);
x:=0;
timer1.enabled:=false;
end;
end;
end;

procedure bRun;
begin
if (CoordBufX <> '') and (IDPartyMember <> '') then
begin
//выделяем командира, эмулируя щелчек мыши
buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
SendToServerEX(NameBuffer);
//бежим за командиром эмулируя повторный щелчек мыши по таргету
buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
SendToServerEX(NameBuffer);
end;
end;

procedure bHeal;
begin
if (CoordBufX <> '') and (IDPartyMember <> '') then
//if (IDPartyMember <> '') then
begin
//выделяем командира, эмулируя щелчек мыши
buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
SendToServerEx(NameBuffer);

// хил
buf:=hstr('2F C1 04 00 00 00 00 00 00 00'); // Greater Heal

//отправляем пакет серваку
SendToServerEx(NameBuffer);
end;
end;

procedure bRecharge;
begin
// таргет командира
buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
SendToServerEx(NameBuffer);

// речарж
buf:=hstr('2F F5 03 00 00 00 00 00 00 00'); // Recharge

//отправляем пакет серваку
SendToServerEx(NameBuffer);
//Say('Make recharge');
end;

procedure Init; //Вызывается при включении скрипта
begin
NameBuffer:='Buffer';
NameKomandos:='Komandos';
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer;
timer1.enabled:=false;
timer1.interval:=5000;
x:=0;
end;

procedure Free; //Вызывается при выключении скрипта
begin
timer1.Free;
end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;

//если от сервака принят пакет с ИД и Координатами членов пати то
if FromServer and (pck[1]=#$a7) then
begin
//запоминаем ИД командира
IDPartyMember:=pck[6] + pck[7] + pck[8] + pck[9];
end;

//если принят пакет от клиента с кординатами бафера то
if FromClient and (ConnectName=NameBuffer) and (pck[1]=#$48) then
begin
//запоминаем координаты
CoordBufX:= pck[6] + pck[7] + pck[8] + pck[9];
CoordBufY:= pck[10] + pck[11] + pck[12] + pck[13];
CoordBufZ:= pck[14] + pck[15] + pck[16] + pck[17];
end;

//далее идут управляющие команды

//если КОМАНДИР пишет в любой чат цифру "1" (код "#$31 #$00" в юникоде (в юникоде под 1 символ используются 2 байта) я так понял) то
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$31) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';
//Бафер БЕЖИТ за КОМАНДИРОМ
bRun;

//выйти из рабочей части скрипта чтобы другие услови не проверяли убитый пакет нулевой длинны
exit;
end;

// если КОМАНДИР пишет в любой чат цифру "2"
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$32) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';
bHeal;
exit;
end;

// если КОМАНДИР пишет в любой чат цифру "3" (речардж)
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$33) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';
bRecharge;
exit;
end;

// если КОМАНДИР пишет в любой чат цифру "4" (ребаф)
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$34) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';

// бафы
timer1.enabled:=true;
x:=1;
exit;
end;

end.

нужно было, что бы чар кидал Seed of fire... поправил на

const //баффы
b1='2F 05 05 00 00 00 00 00 00 00'; // Seed of fire

var
IDPartyMember, IDAssistTarget: String; //ИД командира и ИД его таргета и Собственный ИД
CoordBufX, CoordBufY, CoordBufZ :String; //координаты бота
NameBuffer, NameKomandos : String; // Имена
x: integer;
timer1: TTimer;

procedure OnTimer(Sender: TObject);
begin
if x=1 then
begin
//выделяем командира, эмулируя щелчек мыши
buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
SendToServerEX(NameBuffer);
x:=2;
end
else if x=2 then
begin
buf:=hstr(b1);
SendToServerEx(NameBuffer);
x:=0;
end;
end;

procedure bRun;
begin
if (CoordBufX <> '') and (IDPartyMember <> '') then
begin
//выделяем командира, эмулируя щелчек мыши
buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
SendToServerEX(NameBuffer);
//бежим за командиром эмулируя повторный щелчек мыши по таргету
buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
SendToServerEX(NameBuffer);
end;
end;

procedure bHeal;
begin
if (CoordBufX <> '') and (IDPartyMember <> '') then
//if (IDPartyMember <> '') then
begin
//выделяем командира, эмулируя щелчек мыши
buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
SendToServerEx(NameBuffer);

// хил
buf:=hstr('2F C1 04 00 00 00 00 00 00 00'); // Greater Heal

//отправляем пакет серваку
SendToServerEx(NameBuffer);
end;
end;

procedure bRecharge;
begin
// таргет командира
buf:=hstr('04') + IDPartyMember + CoordBufX + CoordBufY + CoordBufZ + hstr('00');
SendToServerEx(NameBuffer);

// речарж
buf:=hstr('2F F5 03 00 00 00 00 00 00 00'); // Recharge

//отправляем пакет серваку
SendToServerEx(NameBuffer);
//Say('Make recharge');
end;

procedure Init; //Вызывается при включении скрипта
begin
NameBuffer:='BlackStyle';
NameKomandos:='GamellOver';
timer1:=TTimer.Create(nil);
timer1.OnTimer:=@OnTimer;
timer1.enabled:=false;
timer1.interval:=5000;
x:=0;
end;

procedure Free; //Вызывается при выключении скрипта
begin
timer1.Free;
end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;

//если от сервака принят пакет с ИД и Координатами членов пати то
if FromServer and (pck[1]=#$a7) then
begin
//запоминаем ИД командира
IDPartyMember:=pck[6] + pck[7] + pck[8] + pck[9];
end;

//если принят пакет от клиента с кординатами бафера то
if FromClient and (ConnectName=NameBuffer) and (pck[1]=#$48) then
begin
//запоминаем координаты
CoordBufX:= pck[6] + pck[7] + pck[8] + pck[9];
CoordBufY:= pck[10] + pck[11] + pck[12] + pck[13];
CoordBufZ:= pck[14] + pck[15] + pck[16] + pck[17];
end;

//далее идут управляющие команды

//если КОМАНДИР пишет в любой чат цифру "1" (код "#$31 #$00" в юникоде (в юникоде под 1 символ используются 2 байта) я так понял) то
if FromClient and (ConnectName=NameKomandos)and (pck[1]=#$38) then
if (pck[2]=#$31) and (pck[3]=#$00) then
begin
//убиваем этот пакет, чтоб сервер его не получил
pck:='';
//Бафер БЕЖИТ за КОМАНДИРОМ
bRun;
// бафы
timer1.enabled:=true;
x:=1;
exit;
//выйти из рабочей части скрипта чтобы другие услови не проверяли убитый пакет нулевой длинны
exit;
end;


end.

но неработает... все ли я правильно сделал ?.. если нет, поправьте плз..

QaK
16.01.2009, 13:33
Поправил второй твой скрипт, проверь.

-=[B1@©k}{ac]{e®]=-™
18.01.2009, 13:47
не работает... не происходит выделение основного чара... если через бота выделить, то норм.... а так неработает..

Snat4
18.02.2009, 01:25
if ((FromClient) and (pck[1]=#$1F) and (ConnectName='Nick') and (NSetup=0)) then
begin
MyID:=ReadD(2);
NSetup:=1;
pck:='';
end;
phx выдает ошибку и пакет не блокируется. Подскажите почему.

lexayar
18.02.2009, 19:23
Snat4, Вроде нормально все. Попробуй перед этим кодом добавить:
if pck = '' then exit;
Да, и написал бы еще какая ошибка хоть.

Grinch
18.02.2009, 21:47
Snat4, а выложи полностью пакет. и что это за пакет хотя б какие хроники.

Snat4
19.02.2009, 01:26
Такая ошибка:
Access violation at address 00550C21 in module 'l2pbx.exe'. Read of address 00000000.

#$1F - пакет от клиента "Action" (в основном выбор таргета).
К примеру такой:
1F BD D8 00 4B C2 6D 00 00 C8 2A 00 00 77 EF FF FF 00

Основная прелесть в том, что даже если я пишу вот такое, то та же ошибка:
if ((FromClient) and (pck[1]=#$19) and (NSetup=1)) then
begin
ItemWindStrike:=ReadD(2);
pck:='';
NSetup:=2;
Mess('Blah-Blah-Blah');
end;
Где #$19 - от клиента UseItem пакет.

ItemWindStrike, MyID: integer;

Хроники - камаэль Хэллбаунд. В настройках пнх у меня стоит галочка на Kamael и снята с Gracia. Версия пнх - L2phx 3.4.1.61.

ЗЫ: прошу прощения что сразу не все написал подробно.

lexayar
19.02.2009, 14:10
Snat4, Тут уже похоже дело не в скрипте а пакетхаке. У меня бывает слетает так же, рестарт PHX помогает.
Если вообще этот код убрать, ошибка вылетает?

Snat4
19.02.2009, 15:09
Snat4, Тут уже похоже дело не в скрипте а пакетхаке. У меня бывает слетает так же, рестарт PHX помогает.
Если вообще этот код убрать, ошибка вылетает?

Если убрать строчку pck:='';, тогда все нормально работает. Но мне желательно бы блокировать эти пакеты :(

Есть нъюанс: Если нажать на кнопочку "Ок" когда вылетает эта ошибка в РНХ, то скрипт продолжает нормально работать, при этом пакет, которых я хотел блокировать, все-таки проходит. Что-то похоже на Delay но только пока не нажму на кнопку "Ок"))

Еще нъюансик: когда вылетает эта ошибка - клиент полностью зависает и ни на что не реагирует. После нажатия на кнопочке "Ок" все продолжает нормально работать.

lexayar
19.02.2009, 16:49
У тебя походу еще скрипты запущены после этого, добавь в них проверку: if pck = '' then exit;

Добавлено через 2 минуты
Либо в этом же скрипте ниже идет проверка 1-го элемента пакета, а т.к. пакет уже пустой (у него нет 1-го элемента), то вылетает ошибка. еще после Mess('Blah-Blah-Blah'); поставь Exit;

Добавлено через 8 минут
Вообще то при этом должна другая ошибка выдаваться, но у PHX походу крышу сносит:)

Snat4
19.02.2009, 18:45
До меня дошло! Спасибо, lexayar! Сейчас попробую))

telefunken82
20.05.2009, 03:37
Доброй ночки у меня вопросик есть, Xkor показал в первом обучающем скриптике;
begin
if FromClient and (ConnectName='SokolA')
and (pck=HStr('1b 04 00 00 00')) then begin
buf:=HStr('45 00 00 00 00 00 00 00 00 00');
SendToServerEx('SokolB');
pck:='';
end;
end.
я запустил 2 окна рнх включен и работает именя персов есть пакеты бегают ))
имена чаров заменил в скрипте на свои но после нажатия выполнить получаю следующее

List index out of bounds (24).

подскажите что сделал не правильно

Добавлено через 24 минуты
с ошибкой разобрался
изменил пакеты ( у меня грация финал)
begin
if FromClient and (ConnectName='terr1')
and (pck=HStr('56 0D 00 00 00 00 00 00 00')) then begin
buf:=HStr('56 0E 00 00 00 00 00 00 00 00');
SendToServerEx('terr2');
pck:='';
end;
end.

но теперь когда terr1 выполняет действие победа, терр2 стоит а терр1 выполняет ето же действие победа

Grinch
20.05.2009, 12:40
но теперь когда terr1 выполняет действие победа, терр2 стоит а терр1 выполняет ето же действие победа
:confused:

telefunken82
21.05.2009, 01:56
разобрался
вот что получил
begin
if FromClient and (ConnectName='terr1') and (pck=HStr('56 00 00 00 00 00 00 00 00 00'))
then
begin
buf:=HStr('56 0D 00 00 00 00 00 00 00 00');
SendToServerEx('terr2');
pck:='';
end;
end.
так все работает

TAMBIK
29.08.2009, 23:53
ReadC(var index:integer):byte - читает из переменной pck байт
ReadH(var index:integer):word - читает из переменной pck число (2 байта) (v. 3.1.8+)
ReadD(var index:integer):integer - читает из переменной pck число (4 байта)
ReadF(var index:integer):double - читает из переменной pck число c плавающей запятой(8 байт) (v. 3.1.8+)
ReadS(var index:integer):string - читает из переменной pck строку (в пакете строка unicode нультерминированная, а результирующая строка обычная паскалевская)
Index - начальная позиция чтения, которая модифицируется функцией (сдвигается на число считанных байт)
а это как:
ReadG ?????????????????????????

NLObP
30.08.2009, 04:00
TAMBIK, ReadG это 8 байт? Посмотри темку (http://coderx.ru/showthread.php?t=1842), там предлогались решения. Я старшие 4 байта игнорирую и считываю 4 младших.


BaseItems[i,5]:=ReadD(j); //Count
ReadD(j); //Count (пропускаем старшую часть)

buka
01.11.2009, 00:42
заранее благодарен за развёрнутый ответ.. итак есть куча скрипто писальщиков есть даже тема про бот авто боот и так далее.... отсюда вопрос к гуру
Нет ли более менее стандартных функций отсылки пакетов к примеру мне надо например реализовать атаку моба если он в приделах видимости или на каком то расстоянии от меня. атаку тем оружием которое одето и не более если можно приведите пример с теми же гремлинами
Заранее благодарен.

Зы хотелось бы также в случае приближения кого либо тоесть реального человека сделать бсое или отключиться....

Есть ШЕ как залить ману на того игрока кто в пати чат написал 1?

Я более чем уверен что многие пошлют смотреть пакеты... но можно ли привести подобные примеры еще раз спс

TAMBIK
01.11.2009, 05:07
советы
но не мои
или на каком то расстоянии от мен
function rastoyanie(xpos1, ypos1, xpos2, ypos2:extended):integer; //возвращ rezu растояние
begin
result:= Round(Sqrt(((xpos1-xpos2)*(xpos1-xpos2))+((ypos1-ypos2)*(ypos1-ypos2))));
end;
=================================================
if (rastoyanie(MyXpos, MyYpos, ReadD(14), ReadD(18))<=1600) then
при менее или 1600 выполнить >>>>
====================

BioDread
11.03.2010, 18:01
Люди подскажите плиз почему при выполнении скрипта:
begin
begin
Buf:=HStr('A7 4A 27 00 00 00 9F 24 00 E8 03 00 00 00 00 00 00 00 00 00 00');
SendToServer;
delay(800);
end;


begin
Buf:=HStr('04 4D 85 00 10 99 46 01 00 75 D9 00 00 1A FA FF FF 00');
SendToServer;
delay(500);
end;
begin
Buf:=HStr('1E 00 00 00 00 01 00 00 00 C7 13 01 10 B6 05 00 00 80 38 01 00 ');
SendToServer;
delay(500);
end.
end.
пару сек отправляются пакеты но КОПМ ЖУТКО ЛАГАЕТ ЛАГАЕТ и мну дисконнектит от серва подскажите плиз в чём причина или напишите скрипт на посылку 3х пакетов с задержкой ПЛИИИЗ
П.С. Если не писать begin end после каждого то комп ещё быстрее залагивает.....

Vilson
11.03.2010, 20:26
Люди подскажите плиз почему при выполнении скрипта:

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

BioDread
11.03.2010, 21:17
Аааааа а я то думал что оно не ЗАмораживает а просто ждёт.....
Всем Спс я допёр)) -Просто сегодня решил попробовать написать скрипт простенький для удобства а никаких программных языков не учил до этого)))СПС!

dyh9l
16.07.2010, 16:24
Как можно поставить условие в скрипте что если адены меньше чем 10кк то он в гм шопе обменивает манетку на 2ккк.
Это пакет от ГМ шопа до обменника (меню):
21 6D 00 65 00 6E 00 75 00 5F 00 73 00 65 00 6C 00 65 00 63 00 74 00 3F 00 61 00 73 00 6B 00 3D 00 2D 00 33 00 30 00 33 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 35 00 35 00 38 00 00 00
Это пакет обмена монетки на 2ккк:
A7 2E 02 00 00 43 00 00 00 01 00 00 00

J-Fobos
16.07.2010, 19:53
Как можно поставить условие в скрипте что если адены меньше чем 10кк то он в гм шопе обменивает манетку на 2ккк.
Это пакет от ГМ шопа до обменника (меню):
21 6D 00 65 00 6E 00 75 00 5F 00 73 00 65 00 6C 00 65 00 63 00 74 00 3F 00 61 00 73 00 6B 00 3D 00 2D 00 33 00 30 00 33 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 35 00 35 00 38 00 00 00
Это пакет обмена монетки на 2ккк:
A7 2E 02 00 00 43 00 00 00 01 00 00 00
Условие выставляется оператором if <условие> then <набор действий> else <другой набор действий>;

s1mptom
17.01.2011, 21:06
как из скрипта открыть фаил? на ShellExecute ругаец... или надо чтото подгрузить?

J-Fobos
17.01.2011, 21:19
как из скрипта открыть фаил? на ShellExecute ругаец... или надо чтото подгрузить?
Если подгрузить информацию из текстового файла, то я использую TListString.LoadFromFile, это удобно, быстро и просто.
Для остальных типов есть класс TFileStream

s1mptom
17.01.2011, 21:43
Если подгрузить информацию из текстового файла, то я использую TListString.LoadFromFile, это удобно, быстро и просто.
Для остальных типов есть класс TFileStream
дело в том что мне надо не текстовый фаил открыть а просто запустить программу грубо говоря.... выполнился скрипт-открылся фаил )

J-Fobos
18.01.2011, 00:47
Просто фразы "открыть файл" и "запустить программу" разные, вы спрашивали об открытии файла, я и дал ответ =)
Для запуска других программ используйте вызов функции из длл, вот пример подключения длл и вызова функции:

var
lib:Integer;
Res:variant;
begin
lib := loadLibrary('User32.dll');
Res := CallFunction(lib,'GetDC',1,[0]);
CallFunction(lib,'ReleaseDC',2,[0,Res]);
FreeLibrary(lib);
end.

s1mptom
18.01.2011, 01:38
Просто фразы "открыть файл" и "запустить программу" разные, вы спрашивали об открытии файла, я и дал ответ =)
Для запуска других программ используйте вызов функции из длл, вот пример подключения длл и вызова функции:
я пробовал подгружать shell32.dll но он всеравно на ShellExecute ругался... может что делаю не так...

J-Fobos
18.01.2011, 19:13
s1mptom, свою дллку написать желательно, а уже в ней (в своей длл) использовать ShellExecute.

s1mptom
18.01.2011, 21:40
J-Fobos, вот от этого очень далек =( а мне всего то нужно лампочками клавы помигать :D пробовал также через ивенткейбоард ну и собственно аналогичная проблема...

J-Fobos
18.01.2011, 22:18
Такие вещи делаются только с помощью длл, скриптовый движек пакетхака является скриптовым движком, а не языком программирования, его возможности ограничены.

ps: это не так сложно как звучит, надо только попробовать ;)

s1mptom
18.01.2011, 23:17
J-Fobos, ну ладно,спасибо ) буду стараться )

Deffol
04.07.2011, 19:20
как можно командой повторить процедуру несколько раз, например мне надо по приходу пакета, послать другой пакет на сервер 10 раз, чтоб не городить эти пакеты, хочу одной командой это выполнить

wimax
05.07.2011, 18:49
Deffol, таймер

Diverclaim
05.07.2011, 19:18
buf := HStr('ff ff ff ff');

For i:= 1 to 10 do
begin
SendToServer;
end;

Deffol
15.07.2011, 18:15
а как можно запоминать целый пакет, потом отправить его по команде? только пакетов несколько разных, я так понял надо им имя присваивать

Breadfan
15.07.2011, 18:20
строкой.
a:string
.........
a:=pck;
..........
buf:=a;
sendtoserver;
...................

dyh9l
15.07.2011, 18:23
Я читал что стринг может вмещать в себя до 255 символов, а если мне надо больше то что используют?

Deffol
15.07.2011, 18:32
пасиб, а я писал pck:=a;
думал чо не так :)
помоему он так будет запоминать только первый пришедший пакет, а можно сделать, чтоб запоминал именно новый пришедший?
хотя вроде он итак это делает)) пока не пробовал

Breadfan
15.07.2011, 18:36
"...в фс нет..типа данных ShortStrings..." -->> ссылка (http://www.fast-report.com/ru/documentation/)
выполни var
a:string;
i:integer;
procedure Init; //Вызывается при включении скрипта
begin
for i:=1 to 500 do
begin
a:=a+'-'+inttostr(i);
end;
Sendmsg('a = '+a+' === '+inttostr(length(a)))
end;
procedure Free; //Вызывается при выключении скрипта
begin
end;
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
end. и сам увидишь сколько байт в а

J-Fobos
15.07.2011, 18:36
Я читал что стринг может вмещать в себя до 255 символов, а если мне надо больше то что используют?
Ограничение 255 байт было в турбо паскале :)

пасиб, а я писал pck:=a;
думал чо не так :)
помоему он так будет запоминать только первый пришедший пакет, а можно сделать, чтоб запоминал именно новый пришедший?
Какой пакет оно будет запоминать уже зависит от того в каком виде вы будете использовать выше написанные строчки.

Breadfan
15.07.2011, 18:40
Deffol: ну делай присваивание (запоминание) только лишь после того, как пройдена проверка на необходимость запоминания.

dyh9l
15.07.2011, 18:45
Главные бегин енд срабатывают при приходе любого пакета независемо от сервера или от клиента, т.е, в этом гланом бегине енде уже отсортируй какие тебе пакеты запоминать и откуда)

Дмитрий Решетников
03.10.2011, 22:24
А как узнавать свой ItemId и ScrollId ???

Pinko
04.10.2011, 00:58
А как узнавать свой ItemId и ScrollId ???

в папке \l2phx\settings
есть файл ItemsID
в нем ID всех предметов

Nevec
13.01.2012, 20:26
Доброго времени суток уважаемые участники формума.
Я поглядел, что тут используется в скриптах движок языка Delphi.
У меня собственно ворос таковой:
Я незнаю, что возвращает значение переменной Функция или процедура?
Для чего это мне нужно собственно->>
[
if FromClient and (ConnectName='Nevec') and (pck[1]=#$19) then
begin
Передать Функции или Процедуре по этому условию пакет,
затем Функция или Процедура обработает так как мне нужно этот
пакет, чтобы затем я смог его присвоить допустим->>
buf:=Сюда;
end;
]
Часть кода моего:
Const Name='nucLear';
Procedure SendMessage(Msg:String);
Begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(Msg);
SendToClientEx(Name);
End;
//Function SelectEnchantScroll(Scroll:String):String;
//Begin
// if FromClient and (ConnectName=Name) and (pck[1]=HStr('19')) then
// Begin
// Scroll:=pck;
// End;
//End;
begin
if FromClient and (ConnectName=Name) and (pck=HStr('56 18 00 00 00 00 00 00 00 00')) then
begin
buf:=SelectEnchantScroll(pck);
SendToServerEx(Name);
pck:='';
delay(400);
buf:=HStr('D0 4C 00 D6 B3 10 40');
SendToServerEx(Name);
pck:='';
delay(1000);
buf:=HStr('5F D6 B3 10 40 00 00 00 00');
SendToServerEx(Name);
pck:='';
SendMessage('Заточено!!!');
end;
if FromServer and (ConnectName=Name) and (pck=HStr('87 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00')) then
begin
SendMessage('Слетело!!!');
end;
end.

EmL
15.01.2012, 11:36
Доброе время суток,кто может разобратся что за скрипт?

Const UserName=('онатоле');
var
ObjectID, KarmaPK, TargetPK, MessagePK, ClassPK, i, x, y, z, TempPK: Integer;
NamePK, CvarPK : String;
ClassName: TStringList;
procedure Init;
begin
MessagePK:=1;
TargetPK:=0;
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS('PK Scanner for Gracia 1.5 by Furious, metalFan');
SendToClientEx(UserName);
ClassName :=TStringList.Create;
ClassName.LoadFromFile('ClassName.ini');
end;
procedure Free;
begin
ClassName.free;
end;
procedure OnConnect(WithClient: Boolean);
begin
end;
procedure OnDisonnect(WithClient: Boolean);
begin
end;
procedure MessageSend(Msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(Msg);
SendToClientEx(UserName);
end;
procedure TargetingPK(ObjectID: Integer);
begin
if TargetPK=1 then begin
buf:=#$1F;
WriteD(ObjectID); WriteD(0); Writed(0); Writed(0); WriteC(0);
SendToServerEx(UserName); end;
end;
procedure KillRadar;
begin
buf:=#$F1;
WriteD(0);
WriteD(1);
WriteD(0);
WriteD(0);
WriteD(0);
SendToClientEx(UserName);
end;
function GetClassName(CID : integer) : string;
begin
result:=ClassName.Strings[CID];
end;
begin
if (FromServer) and (ConnectName=UserName) and (pck[1]=#$31) then
begin
x:=ReadD(2);
y:=ReadD(6);
z:=ReadD(10);
i:=22;
NamePK:=ReadS(i);
ClassPK:=ReadD(i+8);
KarmaPK:=ReadD(i+176);
if (KarmaPK>0) then
begin
ObjectID:=ReadD(18);
TargetingPK(ObjectID);
if MessagePK=1 then begin MessageSend(''+NamePK+' | '+GetClassName(ClassPK)+' | '+IntToStr(KarmaPK)+) end;
buf:=#$F1;
WriteD(0);
WriteD(1);
WriteD(X);
WriteD(Y);
WriteD(Z);
SendToClientEx(UserName);
end;
end;
if (FromServer) and (ConnectName=UserName) and (pck[1]=#$08) then begin
TempPK:=ReadD(2);
case TempPK of ObjectID:
KillRadar;
end;
end;
if (FromClient) and (ConnectName=UserName) and (pck[1]=#$49) then
begin
CvarPK:=ReadS(2);
case CvarPK of
'\start':
begin
TargetPK:=1;
MessageSend('Search On!');
pck:='';
end;
'\stop':
begin
TargetPK:=0;
MessageSend('Stopped all services!');
pck:='';
end;
'\radar':
begin
MessageSend('Radar Killed');
KillRadar;
pck:='';
end;
end;
end;
end.

Nickers
15.01.2012, 12:45
EmL, PK Scanner for Gracia 1.5 by Furious, metalFan

joersun
30.01.2012, 02:13
до этого не юзал скриптовую чать проги, и сегодня заинтересовался этим.
вопрос такой

procedure Init; //Вызывается при включении скрипта
begin
buf:= HStr('19 74 1D 09 10 00 00 00 00');
SendToServer();
end;

procedure Free; //Вызывается при выключении скрипта
begin

end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin


end.

нажимаю на кнопку выполнить, ниче не происходит. попробовал этот пакет отправить "посылкой", получилось нормально.
где ошибся?

J-Fobos
30.01.2012, 03:47
Используйте SendToServerEx();

Sherman
30.01.2012, 21:42
Люди подскажите плиз почему при выполнении скрипта:
begin
begin
Buf:=HStr('A7 4A 27 00 00 00 9F 24 00 E8 03 00 00 00 00 00 00 00 00 00 00');
SendToServer;
delay(800);
end;


begin
Buf:=HStr('04 4D 85 00 10 99 46 01 00 75 D9 00 00 1A FA FF FF 00');
SendToServer;
delay(500);
end;
begin
Buf:=HStr('1E 00 00 00 00 01 00 00 00 C7 13 01 10 B6 05 00 00 80 38 01 00 ');
SendToServer;
delay(500);
end.
end.
пару сек отправляются пакеты но КОПМ ЖУТКО ЛАГАЕТ ЛАГАЕТ и мну дисконнектит от серва подскажите плиз в чём причина или напишите скрипт на посылку 3х пакетов с задержкой ПЛИИИЗ
П.С. Если не писать begin end после каждого то комп ещё быстрее залагивает.....

У тебя принудительньнная остановка пакетхака на 1,8 секунды.
Что бы не тормозить работу пакетхака кури в сторону выполнения скрипта в отдельном потоке с помощью TTimer. Примеров в "ДА БУДЕТ БОТ" предостаточно. Там же где то есть отправка с задержкой.
И да, научись уже писать на Pascal.

joersun
30.01.2012, 22:17
возник еще один вопрос.
prodecure Action
вызывается, когда отправляется пакет, первый байт которого соответствует 'Action' ?

и если в основном(когда при поступлении любого пакета действующего) бегинэнде напишу фигню, то этим я просто блокирую все исходящие и входящие пакеты ?
например

var
n : integer;
procedure Init; //will be called on script initialization
begin

end;

procedure Free; //This method calls when script don't need anymore
begin

end;

//Primary part of dcript
//calls alltime when l2ph got new packet
begin
n:= n + 1;
end.

J-Fobos
30.01.2012, 22:48
Надо задать начальное значение для n, тогда этим скриптом вы будете считать количество пакетов что прошли через пакетхак.

SeregaZ
30.01.2012, 22:50
неа. этим ты будешь просто вести учет общего количества пакетов :)
чтобы блокировать нужно дописать будет:
pck:='';

joersun
31.01.2012, 17:00
Надо задать начальное значение для n, тогда этим скриптом вы будете считать количество пакетов что прошли через пакетхак.
n тут просто взял, не планирую считать количество пакетов

неа. этим ты будешь просто вести учет общего количества пакетов :)
чтобы блокировать нужно дописать будет:
pck:='';

вопрос был вот такой:
тоесть, сервер отправляет пакет pck, а этот pck залетает в l2ph, и если я с этим пакетом ниче не делаю, пакет дальше идет к клиенту.

в обратном направлении тоже самое

или если я поменяю пакет, и не буду отправлять. то это не блокировка?

J-Fobos
31.01.2012, 22:03
В переменной pck находится пакет который пришел в пакетхак. Чтобы заблокировать пакет, надо очистить переменную pck (pck:='';), соответственно из пакетхака выйдет пустая переменная, тоесть ничего.
Чтобы что-то изменить пакете, надо изменить переменную pck. В любом случаи содержимое этой переменной выйдет из пакетхака, отправлять ее не надо.

mattrix
09.04.2012, 07:00
Не работает подмена пакетов, тоесть надо писать ЦЕЛЫЙ пакет чтоб он заменился, а по первому байту - хрен, тоесть
(pck[1]=#$56) - это соц действие, нифига не заменяет, а если написать конкретное
(pck=HStr('56 0C....')) то всё ок
в чем может быть проблема???

//J-Fobos: Какая версия пакетхака? Что-то схожее уже было. Подождите немного, разберусь и отвечу...

Gidentix
01.07.2013, 06:31
Не работает данный скрипт на интерлюд серверах. Phx коннектится свободно, скрипт на автовставку лсов работает.

const
nik='xxxxx';
Enchant=13;

var
SubID, SkillID, SkillLvl, CurrEnch: integer;

procedure Init; //Вызывается при включении скрипта
begin

end;

procedure OnTimer01(Sender: TObject);
begin

end;

procedure Free; //Вызывается при выключении скрипта
begin
CurrEnch:=0;
end;

procedure OnConnect(WithClient: Boolean); //Вызывается при установке соединения
begin

end;

procedure OnDisonnect(WithClient: Boolean); //Вызывается при потере соединения
begin

end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if FromServer and (pck[1]=#$62) then case pck[2] of
#$A0: //точнулся
if CurrEnch<Enchant then
begin
CurrEnch:=CurrEnch+1;
Buf:=#$D0;
WriteH(SubID);
WriteD(SkillID);
WriteD(SkillLvl+CurrEnch);
SendToServerEx(nik);
end;
#$A1: //не точнулся
begin
CurrEnch:=1;

Buf:=#$D0;
WriteH(SubID);
WriteD(SkillID);
WriteD(SkillLvl+CurrEnch);
SendToServerEx(nik);

end;
end;

if FromClient and (pck[1]=#$D0) then
begin
SubID:=ReadH(2);
SkillID:=ReadD(4);
SkillLvl:=ReadD(8)-1;
CurrEnch:=1;
end;
end.

Делаю все как написано, ничего не происходит.

J-Fobos
01.07.2013, 23:13
Gidentix, напишите собственный скрипт.

Gidentix
02.07.2013, 20:50
Gidentix, напишите собственный скрипт.

К сожалению, не понимаю в написании скриптов ничего абсолютно.

kpa9pt
02.07.2013, 21:27
К сожалению, не понимаю в написании скриптов ничего абсолютно.

Тогда или смирись, что в твоей версии ничего не работает или же пойми в написании скриптов пару азов и переделай за вечер скрипт.

SeregaZ
02.07.2013, 21:51
все хотят быть супер читорами, но никто не хочет учить теорию :) хотя я сам такой-же... хочу стать крутым радиоэлектронщиком, но теорию нихера не читаю - мне сразу схемы готовые подавай, которые я потом паять буду :)

Gidentix, даже на примере этого своего скрипта уже можно понять многие вещи. ты главное пойми как построить простейшую конструкцию "если" - IF. по сути это и есть самая главная хрень во всех языках программирования.

J-Fobos
03.07.2013, 21:57
SeregaZ, в случаи схемотехники такой подход более чем оправдан, именно по готовым схемам легче всего научится, теория слишком суха :)

Helleraser
05.07.2013, 03:14
А зачем вообще это нужно сейчас? Радиоэлектроника. Хобби?

s2lx
05.07.2013, 08:38
А зачем вообще это нужно сейчас? Радиоэлектроника. Хобби?
т.е. это попытка сказать, что всё можно купить в готовом виде?

А смотрю готовые боты чем-то да не устраивают:rolleyes:
Вот у радиолюбителя есть возможность собрать ус-во "под себя".
А разрабатывают электронику для производства кто?
Типа пришёл товариСЧ закончив учебку и его посадили конструировать?
Нет уж.
Для этого нужно иметь желание и навык в определённой сфере.
Как и в любой другой.
Одним интересно тратить деньги на то что ему предлагают.
Другим изготавливать и пользоваться "плодом" СВОИХ ТРУДОВ, а это довольно-таки приятно:good:

Helleraser
06.07.2013, 05:57
Например что? Что можно самому склепать?

Зы: Если не устраивает готовый бот, есть куча других ботов, есть скрипты, которые дополнят что не устраивает. Я бы не рехнулся никогда сам пробовать писать бота, зачем? В конце концов, можно достать владельца бота и он добавит желаемую функцию :blush:

J-Fobos
06.07.2013, 15:51
Можно сделать контроллер, который бы подключался к юсб порту и емулировал мышку и клаву. Получится что-то вроде кликера, работу которого ни одна программная защита не подпортит.

Helleraser
07.07.2013, 00:03
Есть более простой выход, делаешь манюсенькую программку на OCR и никакая программная защита не важна. Можно обычным автохоткеем. Когда я был параноик, ботил таким образом в ладве.