PDA

Просмотр полной версии : [Скрипт] нужна помощь в написании скрипта ....


OBERON_ZGZ
09.11.2008, 21:14
мне нужно написать скрипт для отправки пакетов серверу .....
например :

пакет...
0e 00 05 01 01 00 00 00 ff ff 01 00 17 17

в следующем пакете патый байт должен увеличиться на 1

Тоесть :

0e 00 05 01 01 00 00 00 ff ff 01 00 17 17

Потом :

0e 00 05 01 02 00 00 00 ff ff 01 00 17 17

Потом :

0e 00 05 01 03 00 00 00 ff ff 01 00 17 17

и тд и тп а когда дойдет до FF - то нужно остоновить отсылку пакетов ....

Пока жду ответов попробую сам разобраться ....

За дельные советы заранее спасибки ;)

Глюконатор
09.11.2008, 21:43
тебе их надо отправлять друг за дружкой или через какой-то интервал?

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

OBERON_ZGZ
09.11.2008, 21:53
мне нужно друг за дружкой , но только по моей команде ...
а не когда ему вздумается...

Глюконатор
09.11.2008, 23:10
лови пакет на нужный тебе социал (приветствие, смех и т.д.) - по нему будет отправляться пакет. пакет выложи сюда. скрипт напишу.

OBERON_ZGZ
09.11.2008, 23:22
пакет c>s "аплодисменты" :

05 00 0D 16 06

Глюконатор
09.11.2008, 23:42
Проверь.

var i: integer;
a,b: string;
flag: boolean;

procedure OnCreate;
begin
i:=1;
a:='0e 00 05 01';
b:='00 00 00 ff ff 01 00 17 17';
flag := true;
end;

begin
if flag then
if not _gFromServ then
if hStrCmp(_gBuff,1,5,'05 00 0D 16 06') then begin
gSys.SendS(HStr(a)+HStr(format('%x',[i]))+HStr(b));
inc(i);
if i > 255 then flag:=false;
end;
end.


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

OBERON_ZGZ
09.11.2008, 23:50
щя протестю и сообщю ...

Добавлено через 29 минут
Забыл спросить как кодировал , в FS или WPS ....???
В режиме FS говорит :
ERROR : Script[1] NOT Compiled !

В режиме WPS говорит :
ERROR(2)Scriptl: ( expected PROCEDURE ONCREATE

Запускал в онлайн редакторе ....

Что делаю не так ?

Глюконатор
10.11.2008, 00:30
Скрипт написан на FS. "Нот компилед" - как вариант старая версия WP. Для компиляции надо 6.56+ Скачать можно либо с оф сайта либо с моей темы ([Ссылки могут видеть только зарегистрированные и активированные пользователи]).

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

Добавлено через 1 минуту
зы саурон пишет, что wps морально устарел и он более тормознутый, так что юзай fs...

OBERON_ZGZ
10.11.2008, 00:34
Объясню что хочу сделать ...

при атаке моба холодным оружием клиент отсылает пакет серверу.....

при следующем ударе увеличивается байт на 1 ......

и тд. и тп.

Я хочу отправить серверу один за одним эти пакеты на дамаг

Главное чтоб каждый последующий пакет имел этот байт на единицу больше !

Пытаемся сделать овердамаг ББ ....:notme:

Глюконатор
10.11.2008, 00:48
тогда я тя сразу обломаю)) таким макаром од сделать не получится. дамаг нанесенный мобу - серверсайд.

Добавлено через 2 минуты
P.s., а чтобы все таки попробовать, поменяй пакет в скрипте на пакет атаки. пакет в хексформате. можно пробелы между байтами поставить для большей читаемости.

OBERON_ZGZ
10.11.2008, 00:56
может я не так выразился , я хочу ускорить отправку пакетов удара
, так как клиент посылает их с определенной задержкой (скорость атаки)
если я отправлю серверу за 10 сек 100 ударов вместо 10 (как отсылает клиент) и сервер их примет - то будет кулл....
скачал wp 6,58 - щя потестим

Глюконатор
10.11.2008, 01:07
ааа... ну это совсем по другому оформлять надо... ща будет.

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

var i: integer;
s: string;

begin
if not _gFromServ then
if GInt(_gBuff,3,2) = $105 then begin
gBlockPacket;
s := _gBuff;
for i:=1 to 255 do begin
s[5] := HStr(format('%x',[i]));
gSys.SendS(s);
end;
end;
end.


Добавлено через 32 минуты
йопт.. опять забыл... короч тебе надо хотя бы раз жахнуть моба. точнее так. ты его один раз бьешь (отруби автоматичскую битву) а скрипт дальше сам послыает пакеты на удар. не успокоится пока не пошлет все 255.

OBERON_ZGZ
10.11.2008, 02:01
не запускает :nono:

.ERROR(1)Script1: Found I, expected :=, (, [ or ; I : INTEGER


0E 00 05 01 01 00 00 00 FF FF 01 00 AF 21

количество ударов (при входе в игру всегда начинаеться с 01)

АйДи моба

мне нужно сделать хоть 1 удар чтоб узнать АйДи моба , дальше нужно подправить скрипт с заменой АйДи моба ....

Следующий шаг , это запуск скрипта (для этого нужно ударить еще 1 раз его) --- значит скрипт должен начинаться как минимум с i:=3 to 255 do begin
Пытался исправить , но нифига не идет :nono:

Добавлено через 3 минуты
Вот что говорит тестер скриптов :

.compiling {FS text script} 10/11/2008 0:03:38
.compiled (time: 16 ms.)
.
.'OnCreate' not found...
.running Script {FS text script} 10/11/2008 0:03:38

.var's:
i : integer = 0 ($0000) short
s : string = (len: 0 /$00)

.
.end Script ( >>> SCRIPT TIME: 16 ms. <<< )
.'OnDestroy' not found...
.end;

Глюконатор
10.11.2008, 02:30
FS все устраивает. Логика поведения скрипта:

if GInt(_gBuff,3,2) = $105 then begin //если пакет на удар, то
gBlockPacket; //блокируем пакет клиента
s := _gBuff; //копируем его в переменную
for i:=1 to 255 do begin
s[5] := HStr(format('%x',[i])); //меняем 5 элемент на текущий i в хексе
gSys.SendS(s); //отправляем пакет с заменным 5 элементом.


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

OBERON_ZGZ
10.11.2008, 02:51
сорри , понял - скрипт работает , ....
Вот только сразу после отправки первого же пакета
кикает с сервера :sad:

Тоесть скрипт даже не успевает отправить 2 пакет с патым байтом 02....
странно как то ...

если посылаю вручную
0E00050101000000FFFF0100241A
0E00050102000000FFFF0100241A
0E00050103000000FFFF0100241A
то с сервера не кикает

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

если после пакета
0e00050101000000ffff0100241a

я пошлю пакет не этот
0e00050102000000ffff0100241a

а 03 или 05 или дюбое другое значение - тогда сервак отключает ...

может что то не так в скрипте ?

Добавлено через 6 минут
Ладно , извини что надоедаю - фиг с ними с этими пакетами ...:pif::pif:
Спс за помощь.:)

Добавлено через 23 минуты
:notme:
Для размышления ......
Нашел лог пакетов (я новичёк , так что не суди строго)

Твой скрипт отправлял такие пакеты ....
0E00050110000000FFFF0100241A
0E00050120000000FFFF0100241A
0E00050130000000FFFF0100241A

и тд и тп - да еще с задержкой в 0 мс

Может всё таки сделать задержку в несколько мс ???

Глюконатор
10.11.2008, 03:15
ты смотрел в логере пакетов что скрипт отсылает? там все регистрируется, если он включен конечно. посмотри в нем какие пакеты отправляет скрипт.. может я его реально косячно написал.. =(

OBERON_ZGZ
10.11.2008, 03:23
вот

Глюконатор
10.11.2008, 03:53
доо.. косяк... ща будем править..

Добавлено через 6 минут
Я короч не стал разбираться с форматом.. просто подрправил косяк.

var i: integer;
s: string;

begin
if GInt(_gBuff,3,2) = $105 then begin
gBlockPacket;
s := _gBuff;
for i:=1 to 255 do begin
if i<16 then s[5] := HStr(format('0%x',[i]))
else s[5] := HStr(format('%x',[i]));
end;
end;
end.

OBERON_ZGZ
10.11.2008, 04:16
:rolleyeyes:

Не получилось ;)


.......

OBERON_ZGZ
10.11.2008, 04:17
Утро вечера мудренее , оставим это на потом ....:agreed:

Глюконатор
10.11.2008, 04:27
Ыы... я команды на отправку пакета забыл обратно вписать... =)

var i: integer;
s: string;

begin
if GInt(_gBuff,3,2) = $105 then begin
gBlockPacket;
s := _gBuff;
for i:=1 to 255 do begin
if i<16 then s[5] := HStr(format('0%x',[i]))
else s[5] := HStr(format('%x',[i]));
gSys.SendS(HStr(s));
end;
end;
end.


Кстати.. почему там 12? ты же говрил что с 1 начинается...

OBERON_ZGZ
10.11.2008, 04:55
ERROR: EXCEPT: HSTR: '$??' is not a valid integer value at [11:11]

:sad:

OBERON_ZGZ
10.11.2008, 05:06
сделал так :

var i: integer;
s: string;

begin
if GInt(_gBuff,3,2) = $105 then begin
gBlockPacket;
s := _gBuff;
for i:=1 to 255 do begin
if i<16 then s[5] := HStr(format('0%x',[i]))
else s[5] := HStr(format('%x',[i]));
gSys.SendS(s);
end;
end;
end.



и заработало - вот результат :d

OBERON_ZGZ
10.11.2008, 05:08
может всё таки сделать задержку , а то я в 1 сек сделал 255 ударов .....

Глюконатор
10.11.2008, 05:09
молодца)) в прогеры пойдешь))... результат есть? =)

OBERON_ZGZ
10.11.2008, 05:12
на скрине видно как сервак 255 раз прислал мне пакет "AttackErrorResult"

Добавлено через 4 минуты
там где на скрине пятый байт = 12 это я вручную посылал пакеты ,
как видишь всё проходило нормально
Сервак принимал их и присылал мне результаты о дамаге который я нанёс

Так что я думаю что что то можно замутить с этим скриптом , токо нужно еще подумать и поиграться с ним .....:sceptic:

Глюконатор
10.11.2008, 05:23
С задержкой в 200мс

var i: integer;
s: string;

function OnTimer(n,cn: integer):boolean;
begin
if n = 1 then
if cn <= 255 then begin
if cn < 16 then s[5] := HStr(format('0%x',[i]))
else s[5] := HStr(format('%x',[i]));
writelogln(HStr(s));
result := true;
end
else result := false
else result := true;
end;

begin
if GInt(_gBuff,3,2) = $105 then begin
gBlockPacket;
s := _gBuff;
gSys.SetTimer(1,200);
end;
end.


бьешь моба 1 раз и ждешь... из расчета того чтов секунду будет послываться 5 пакетов то примерно 50 секунд)) иначе за адекватность не отвечаю =)

кстати у меня этот таймер иногда косячит... смотри в логах в номере пакета название [OnTimer]. Если не обнаржуишь такого.. попробуй скрипт перезапустить..

Добавлено через 1 минуту
я вообще афк если че на 30-50 мин.

OBERON_ZGZ
10.11.2008, 05:34
Я вот подумал , а нельзя сделать по такой формуле
1 ловим пакет и блокируем его (s)
2 посылаем пакет с байтом 01 (i)
3 посылаем пакет c (i) + 1
4 если (i) =255 конец скрипта
5 если нет то пункт (3)+1

Чё то башка не варит :sad:

Короче в старом варианте по моему мы послали одним пакетом все значения, а нужно по очереди - да еще дать время серверу прислать нам инфу с дамагом ....
а может и нет , мозги уже совсем не варят - пойду спать ....:wtf:

OBERON_ZGZ
10.11.2008, 05:56
что то с таймером не то :confused:

1,200 это не 1.2 сек ???

вот что на скрине , не знаю нормально ли это ....

Глюконатор
10.11.2008, 06:14
Я короч итоговый скрипт опять забыл до конца изменить... :wtf:

var i: integer;
s: string;

function OnTimer(n,cn: integer):boolean;
begin
if n = 1 then
if cn <= 255 then begin
if cn < 16 then s[5] := HStr(format('0%x',[i]))
else s[5] := HStr(format('%x',[i]));
gSys.SendS(s);
result := true;
end
else result := false
else result := true;
end;

begin
if GInt(_gBuff,3,2) = $105 then begin
gBlockPacket;
s := _gBuff;
gSys.SetTimer(1,200);
end;
end.


По поводу первого сообщения... Скрипт по этой схеме и работает... просто разница во времени между отсылками пакетов < 0,001с, поэтому в логгере это и не отображается..

Кстати пакет с еррором тебе пришел 254 раза)) первый наш пакет серв обработал и прислал тебе результат)

Че с таймером я хз... Если ты пользовался мультиинжектором, то могу только посоветовать перезапустить ВП и саму игру.. если через проксифер - только ВП... но с учетом нашей задержки это вполне ожидаемое поведение скрипта...

ЗЫ 1200 это 1,2 сек =)

:flood:

OBERON_ZGZ
10.11.2008, 14:55
первым посылает пакет с (i) = 0

Помоему ты забыл вписать

for i:=1 to 255 do begin

Глюконатор
10.11.2008, 16:12
Для пакета с i = 0:

var i: integer;
s: string;

function OnTimer(n,cn: integer):boolean;
begin
if n = 1 then
if cn <= 256 then begin
if cn < 17 then s[5] := HStr(format('0%x',[cn-1]))
else s[5] := HStr(format('%x',[cn-1]));
gSys.SendS(s);
result := true;
end
else result := false
else result := true;
end;

begin
if GInt(_gBuff,3,2) = $105 then begin
gBlockPacket;
s := _gBuff;
gSys.SetTimer(1,200);
end;
end.


И в данном случае цикл не нужен.=)

OBERON_ZGZ
10.11.2008, 16:29
так он посылает пакет с пятым байтом 0f

при повторной отсылке 0f меня логично выкидывает из игры ......

Ivan_32
10.11.2008, 17:46
А на С-подобном синтаксисе в нем писать нельзя ?

Так уж получилось что Профессор Вирт очень серьезно повлиял на всю отрасль программирования(как науки) и наравне с наследниками ALGOL-68 стали идти наследники Pascal. Ярким представителем является Ada (в честь Ады Лавлейс - первой программистки, вобще). Кстати это фактически два типа мышления...

Глюконатор
10.11.2008, 20:25
OBERON_ZGZ - подправил косяк;

Ivan_32 - к сожалению нет, тока делфи.. =(

OBERON_ZGZ
10.11.2008, 21:13
Вероятно я не так выразился , скрипт начинал отправку пакетов с
изменяемым пятым байтом начиная с 00 ....
А нужно с 01 по ff и остановить скрипт если ты не забыл ....
В исправленном варианте он также начинает отправку с 00 ....
а это не допустимое значение и меня выкидывает из игры ....

Глюконатор
11.11.2008, 02:10
ну а в чем дело тогда? о_о первый вариант и был таким каким ты просишь. отправляет с 1 по 255 включительно потом отрубается.

OBERON_ZGZ
11.11.2008, 19:38
Скрипт работает

нужно вернуть обратно значения :

if cn < 16 then s[5] := HStr(format('0%x',[cn]))
else s[5] := HStr(format('%x',[cn]));


Наверное что то было с WP , теперь всё работае ...:agreed:

Но к сожалению , на атаку таким способом сервак присылает

ерор...

наверное контролирует скорость атаки ББ.....

Хотя непонятно почему , ведь для акретовского ланча эта фишка проходит :((

Попробую поэксперементировать с с таймером ....:sceptic:

Добавлено через 2 минуты
еще забыл

if cn <= 256 then begin

поменять на

if cn <= 255 then begin

чтобы остановился на значении FF

Добавлено через 9 минут
Кстати , не подскажите как значение таймера устанавливать ???

1,200 - это задержка в 0,2 сек ?

1,500 - это 0,5 сек ?


а 2,000 - это сколько ?

или 0,500 это что ?

:rolleyeyes:

Глюконатор
11.11.2008, 23:40
по функяим FS есть справка ([Ссылки могут видеть только зарегистрированные и активированные пользователи])

Тут вкратце скажу - gSys.SetTimer(num, time: integer);

Устанавливает таймер с номером Num на время Time в мс. Всего может быть три таймера для каждого скрипта. Установка Time = 0 вырубает данный таймер.