PDA

Просмотр полной версии : Требуется помощь.


supernewbie
04.03.2010, 22:46
begin
if FromServer and (ConnectName='01') and (pck = HStr('пакет1)) then
begin
delay(5000);
if FromServer and (ConnectName='01') and (pck = HStr('пакет2')) then else
begin

buf:=HStr('пакет3');
SendToClientEx('02');





end;

end;


end.

Задумка была как бы сделать так, приходит пакет [пакет1] на соединение 01, дальше идет проверка в течении 5 секунд на приход пакета [пакет2], если пакет не приходит, отправляется пакет [пакет3] на соединение 02.

Но у меня как я понял идет просто проверка ЧЕРЕЗ 5 секунд...

Помогите сделать так как описано у меня выше)

Суть вопроса вкратце:

Как сделать сплошную проверку в течении 5 секунд?

Vilson
05.03.2010, 00:37
Var
PckIn: Boolean = False;
TimerPck: TTimer;

procedure Init;
begin
TimerPck:=TTimer.Create(nil);
TimerPck.OnTimer:=@OnTimerPck;
TimerPck.Enabled:=False;
TimerPck.interval:=5000;
end;

procedure OnTimerPck(Sender: TObject);
begin
if not PckIn then
begin
buf:=HStr('пакет3');
SendToServerEx('02');
end;
TimerPck.Enabled := False;
PckIn := False;
end;

procedure Free;
begin
TimerPck.Free;
end;

begin
if FromServer and (ConnectName='01') then
case pck of
'пакет1': TimerPck.Enabled := True;
'пакет2': if TimerPck.Enabled then PckIn := True;
end;
end.

supernewbie
05.03.2010, 00:54
Var
PckIn: Boolean = False;
TimerPck: TTimer;

procedure Init;
begin
TimerPck:=TTimer.Create(nil);
TimerPck.OnTimer:=@OnTimerPck;
TimerPck.Enabled:=False;
TimerPck.interval:=5000;
end;

procedure OnTimerPck(Sender: TObject);
begin
if not PckIn then
begin
buf:=HStr('пакет3');
SendToServerEx('02');
end;
TimerPck.Enabled := False;
PckIn := False;
end;

procedure Free;
begin
TimerPck.Free;
end;

begin
if FromServer and (ConnectName='01') then
case pck of
'пакет1': TimerPck.Enabled := True;
'пакет2': if TimerPck.Enabled then PckIn := True;
end;
end.

это у тебя как я понял во-первых идет одновременная проверка на 2 пакета. А там сначала идет 1, а потом идет проверка на 2. И во-вторых там идет, как я понял, интервал 5 сек, а мне нужно чтобы проверялось в течении 5 сек. :o
PS Но все равно скрипт здоровский :good:

Vilson
05.03.2010, 01:40
Нифига ты не понял. В скрипте все работает как ты просил в первом посте, учи мат часть.

supernewbie
05.03.2010, 02:35
почему он не работает то тогда(

Добавлено через 20 минут
вообщем он просто не врубает таймер( я уже и 2 пакета отсылал, и каждый по 1(

Добавлено через 14 минут
перекавырял все абсолютно( не робит твой скрипт(
госпади, помогите(

Vilson
05.03.2010, 03:02
Скрипт рабочий, правь руки.

ЗЫ Пример что ты менял в скрипте и что посылал давай в студию.

supernewbie
05.03.2010, 13:43
Var
PckIn: Boolean = False;
TimerPck: TTimer;

procedure Init;
begin
TimerPck:=TTimer.Create(nil);
TimerPck.OnTimer:=@OnTimerPck;
TimerPck.Enabled:=False;
TimerPck.interval:=5000;
end;

procedure OnTimerPck(Sender: TObject);
begin
if not PckIn then
begin
buf:=HStr('19 62 26 2B 40 00 00 00 00');
SendToServerEx('02');
end;
TimerPck.Enabled := False;
PckIn := False;
end;

procedure Free;
begin
TimerPck.Free;
end;

begin
if FromServer and (ConnectName='01') then
case pck of
'29 1C 58 90 49 00 00 00 00 4D BF FE FF 08 57 02 00 A0 F3 FF FF': TimerPck.Enabled := True;
'29 1C 58 90 49 01 00 00 00 4D BF FE FF 08 57 02 00 A0 F3 FF FF': if TimerPck.Enabled then PckIn := True;
end;
end.

Вот как скрипт я делаю. Даже когда он там встает или садится, ничего абсолютно!

Vilson
05.03.2010, 14:20
Var
PckIn: Boolean = False;
TimerPck: TTimer;

procedure Init;
begin
TimerPck:=TTimer.Create(nil);
TimerPck.OnTimer:=@OnTimerPck;
TimerPck.Enabled:=False;
TimerPck.interval:=5000;
end;

procedure OnTimerPck(Sender: TObject);
begin
if not PckIn then
begin
buf:=HStr('19 62 26 2B 40 00 00 00 00');
SendToServerEx('02');
end;
TimerPck.Enabled := False;
PckIn := False;
end;

procedure Free;
begin
TimerPck.Free;
end;

begin
if FromServer and (ConnectName='01') then
case pck of
'29 1C 58 90 49 00 00 00 00 4D BF FE FF 08 57 02 00 A0 F3 FF FF': TimerPck.Enabled := True;
'29 1C 58 90 49 01 00 00 00 4D BF FE FF 08 57 02 00 A0 F3 FF FF': if TimerPck.Enabled then PckIn := True;
end;
end.

Вот как скрипт я делаю. Даже когда он там встает или садится, ничего абсолютно!
Потому что полная фигня тобой в скрипт подставлена.

У тебя что, ники чаров 01 и 02? Никогда не видел сервера где разрешены ники из двух букв, это рас.

"29 1C 58 90 49" - у тебя точно CharID = 22556 и ник чара "01"??

'19 62 26 2B 40 00 00 00 00' - что за херню ты пытаешься отправлять? 19 пакет UseItem:d(ObjectID)d(Unknown), у тебя что есть в инвентаре предмет с ObjectID = 9826? Слишком маленькое значение для ObjectID, наверняка тут написана очередная чушь..

Sherman
05.03.2010, 14:23
case pck of
'29 1C 58 90 49 00 00 00 00 4D BF FE FF 08 57 02 00 A0 F3 FF FF': TimerPck.Enabled := True;
'29 1C 58 90 49 01 00 00 00 4D BF FE FF 08 57 02 00 A0 F3 FF FF': if TimerPck.Enabled then PckIn := True;
end;



Этот код работаит? Помоему case понимает только цыфры :-D


http://coderx.ru/attachment.php?attachmentid=988&stc=1&d=1267784921

supernewbie
05.03.2010, 14:41
Потому что полная фигня тобой в скрипт подставлена.

У тебя что, ники чаров 01 и 02? Никогда не видел сервера где разрешены ники из двух букв, это рас.

"29 1C 58 90 49" - у тебя точно CharID = 22556 и ник чара "01"??

'19 62 26 2B 40 00 00 00 00' - что за херню ты пытаешься отправлять? 19 пакет UseItem:d(ObjectID)d(Unknown), у тебя что есть в инвентаре предмет с ObjectID = 9826? Слишком маленькое значение для ObjectID, наверняка тут написана очередная чушь..
дело не в пакетах, я переставлял их там. Хоть какие ставь, case pck of просто не работает!!! Эта проверка не робит и все. Дело не в пакетах. Инфа 100%.

Vilson
05.03.2010, 14:58
Этот код работаит? Помоему case понимает только цыфры :-D


Expression -> SimpleExpression [RelOp SimpleExpression]...

SimpleExpression -> ['-'] Term [AddOp Term]...

Term -> Factor [MulOp Factor]...

Factor -> Designator
-> UnsignedNumber
-> String
-> '(' Expression ')'
-> NOT Factor
-> '[' SetConstructor ']'

CaseStmt -> CASE Expression OF CaseSelector/';'...

ЗЫ Не путай FasrScript и Паскаль.

Добавлено через 6 минут
дело не в пакетах, я переставлял их там. Хоть какие ставь, case pck of просто не работает!!! Эта проверка не робит и все. Дело не в пакетах. Инфа 100%.
Ты так и не ответил - ники чаров у тебя какие, 01 и 02? на остальные вопросы ты тоже не ответил. Ладно, замени case на if

if FromServer and (ConnectName='01') then
begin
if (pck= '29 1C 58 90 49 00 00 00 00 4D BF FE FF 08 57 02 00 A0 F3 FF FF') then TimerPck.Enabled := True;
if (pck='29 1C 58 90 49 01 00 00 00 4D BF FE FF 08 57 02 00 A0 F3 FF FF') and (TimerPck.Enabled) then PckIn := True;
end;


Что теперь?

Breadfan
05.03.2010, 15:06
точно-точно: жили-жили, и не замечали что оказывается case ... of просто не работает....
Зачем ты в условия пакет пихаешь с жестким указанием координат чаров?? Вот что мне интересно

PS: кстати да, "Дело не в пакетах. Инфа 100%" - это ты верно подметил ))))

Vilson
05.03.2010, 15:15
да он вообще тут фигню проверяет, под его условие достаточно сделать так

if FromServer and (ConnectName='01') then
case pck[1] of
#$29:if not TimerPck.Enabled then TimerPck.Enabled := True else PckIn := True;
end;


Моего терпения хватит еще на 1-2 ответа..:D

supernewbie
05.03.2010, 15:31
госпади все равно ничего не работает(
не хотел палить скрипт, но ладно, выложу...

Var
PckIn: Boolean = False;
TimerPck: TTimer;

procedure Init;
begin
TimerPck:=TTimer.Create(nil);
TimerPck.OnTimer:=@OnTimerPck;
TimerPck.Enabled:=False;
TimerPck.interval:=5000;
end;

procedure OnTimerPck(Sender: TObject);
begin
if PckIn then
begin
buf:=HStr('17 C7 53 35 40 01 00 00 00 7C C9 FE FF 6A 57 02 00 8D F3 FF FF');
SendToServerEx('Jou');
end;
TimerPck.Enabled := False;
PckIn := False;
end;

procedure Free;
begin
TimerPck.Free;
end;

begin
if FromServer and (ConnectName='Karog') then
begin
if (pck='62 1E 00 00 00 01 00 00 00 03 00 00 00 B5 05 00 00') then TimerPck.Enabled := True;
if (pck='62 1E 00 00 00 01 00 00 00 03 00 00 00 53 08 00 00') and (TimerPck.Enabled) then PckIn := True;
end;
end.

Не робит абсолютно(

Vilson
05.03.2010, 15:51
не хотел палить скрипт, но ладно, выложу...
Не робит абсолютно(
Это не скрипт, это набор бессмысленного кода. Какие у тебя хроники и что по твоему должен делать этот "скрипт"?

supernewbie
05.03.2010, 16:11
Это не скрипт, это набор бессмысленного кода. Какие у тебя хроники и что по твоему должен делать этот скрипт?
Хроники ХБ. Скрипт должен проверять когда приходит сообщение что я получил кристал, потом он в течении 5 секунд проверяет не пришло ли сообщение что я получил гем, если гем я не получил, то Второй чел выбрасывает кристал.

Vilson
05.03.2010, 16:52
Хроники ХБ. Скрипт должен проверять когда приходит сообщение что я получил кристал, потом он в течении 5 секунд проверяет не пришло ли сообщение что я получил гем, если гем я не получил, то Второй чел выбрасывает кристал.

Пакет который ты хочешь отправить:

Tип: 0x19 (UseItem)
Pазмер: 9+2
0002 d ObjectID: 1076569698 (0x402B2662)
0006 d Unknown: 0 (0x00000000)
---
Ты уверен что правильно получил ObjectID: 1076569698? Как ты его получил? Ты не забыл что при получении нового предмета ObjectID будет уже совсем другой?

Пакеты которые ты анализируешь выглядят не совсем правильно:

Tип: 0x62 (SystemMessage)
Pазмер: 17+2
0002 d MsgID: Получено: $s1. ID:30 (0x001E)
0006 d typesCount: 1 (0x00000001)
[Начало повторяющегося блока 1/1]
0010 d 0=Str,1=Int,2=NpcID,3=ItmID,4=SklID,6=Amnt: 3 (0x00000003)
0014 s data: ?
[Конец повторяющегося блока 1/1]

supernewbie
05.03.2010, 17:35
если в стопке то не меняется.

Добавлено через 23 минуты
вообщем дело не в пакетах... он просто не врубает таймер, скорее всего проверка не робит твоя...

Vilson
05.03.2010, 18:47
вообщем дело не в пакетах... он просто не врубает таймер, скорее всего проверка не робит твоя...
Ну да, в пакете которым ты пытаешься выкинуть итем не хватает Z координаты и по этому он никогда не сработает, но ты прав - дело не в пакетах, дело в руках. :D


Var
PckIn: Boolean = False;
TimerPck: TTimer;

procedure Init;
begin
TimerPck:=TTimer.Create(nil);
TimerPck.OnTimer:=@OnTimerPck;
TimerPck.Enabled:=False;
TimerPck.interval:=5000;
end;

procedure OnTimerPck(Sender: TObject);
begin
SendMsg2('Karog', 'сработал таймер');
if not PckIn then
begin
SendMsg2('Karog', 'вместо этого потом будем посылать пакет на выкинуть итем');
end;
TimerPck.Enabled := False;
PckIn := False;
end;

procedure Free;
begin
TimerPck.Free;
end;

procedure SendMsg2(MyName, msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(msg);
SendToClientEx(MyName);
end;

begin
if FromServer and (ConnectName='Karog') then
begin
if (pck[1]=#$62) and (ReadD(6)=1) then
begin
if (ReadD(14)=1461) then
begin
SendMsg2('Karog', 'получен кристал А');
if not TimerPck.Enabled then TimerPck.Enabled := True;
end;
if (ReadD(14)=2131) and (TimerPck.Enabled) then
begin
SendMsg2('Karog', 'получен gem');
PckIn := True;
end;
end;
end;
end.


Что пишет в гм-чате?

supernewbie
05.03.2010, 18:59
Подбираю кристал - пишет подобран кристал, если подбираю гем, пишет что подобран гем, НО в любом случае, то есть, если подбираю или не подбираю, в любом случае пишет что таймер сработал...

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

Vilson
05.03.2010, 19:34
Подбираю кристал - пишет подобран кристал, если подбираю гем, пишет что подобран гем, НО в любом случае, то есть, если подбираю или не подбираю, в любом случае пишет что таймер сработал...

Добавлено через 2 минуты
А мне надо чтобы таймер срабатывал только если я НЕ получил гем...
*ять, таймер и должен срабатывать в любом случае через 5 секунд после прихода первого пакета. Но пакет он должен отсылать (сейчас выдавать сообщение) только в случае если сработает условие, а условие сработает только в случае если в течении 5 сек после запуска таймера придет второй пакет. Все, мои нервы обьяснять кончились. :D

supernewbie
05.03.2010, 20:10
А он выдает сообщение ВСЕГДА. А именно через 5 сеукнд после прихода 1 пакета!
PS И условие должно срабатывать если в течении 5 секунд второй пакет НЕ ПРИХОДИТ...(((((((((( госпади за что *ня*ть...

Добавлено через 45 секунд
вот "вместо этого потом будем посылать пакет на выкинуть итем" он пишет всегда... вместе с "сработал таймер"

Добавлено через 2 минуты
ну помучайся еще немного пож) вроде уже начало получатся)

Добавлено через 18 минут
нееет( неужели он меня бросил( госпади ЧТО ДЕЛАТЬ???!!!((((
Я кажется понял как робит скрипт... Если я подбираю Гем PckIn становится True и соответственно проходит проверку... Но почему-то когда гем подбираю, он не делает PckIn True((

Breadfan
05.03.2010, 20:19
3 страницы сообщений - и нигде не указано - а что собсно имеется ввиду под словами "кристал", "гем"

supernewbie
05.03.2010, 20:20
3 страницы сообщений - и нигде не указано - а что собсно имеется ввиду под словами "кристал", "гем"
Кристал - Crystal A grade

Гем - Gemstone C grade

Vilson
05.03.2010, 20:33
А он выдает сообщение ВСЕГДА. А именно через 5 сеукнд после прихода 1 пакета!

В последний раз говорю - так и должно быть.


PS И условие должно срабатывать если в течении 5 секунд второй пакет НЕ ПРИХОДИТ...(((((((((( госпади за что *ня*ть...
Там так и написано.


Добавлено через 45 секунд
вот "вместо этого потом будем посылать пакет на выкинуть итем" он пишет всегда... вместе с "сработал таймер"
Так и должно быть если в течении 5 сек после первого не пришел второй пакет.


Добавлено через 18 минут
нееет( неужели он меня бросил( госпади ЧТО ДЕЛАТЬ???!!!((((
Я кажется понял как робит скрипт... Если я подбираю Гем PckIn становится True и соответственно проходит проверку... Но почему-то когда гем подбираю, он не делает PckIn True((
Ты сам себе противоречишь. Если скрипт пишет "вместо этого потом будем посылать пакет на выкинуть итем" значит он проходит там проверку и работает как надо.

Добавлено через 2 минуты
3 страницы сообщений - и нигде не указано - а что собсно имеется ввиду под словами "кристал", "гем"
Ага, ты заметил как я тут телепатом поработал когда скрипт на прошлой странице писал? :D
У меня в условиях проверка на ItemId = 1461 и 2131 при том что я не спрашивал о чем речь. :D

supernewbie
05.03.2010, 20:41
Так и должно быть если в течении 5 сек после первого не пришел второй пакет.
А у меня пишет даже если пришел второй!

Добавлено через 2 минуты
То есть:
Вот я подобрал кристалл.
Жду 5 секунд.
Пишет про выкидывание.

Подобрал кристалл.
Подобрал гем.
Жду 5 секунд.
Пишет про выкидывание.

Vilson
05.03.2010, 20:45
А у меня пишет даже если пришел второй!

Добавлено через 2 минуты
То есть:
Вот я подобрал кристалл.
Жду 5 секунд.
Пишет про выкидывание.

Правильно пишет.


Подобрал кристалл.

Сколько времени прошло после того как подобрал и до -

Подобрал гем.
Жду 5 секунд.
Пишет про выкидывание.
Время тикает с момента подбора кристала. Если надпись "получен gem" появляется значит условие срабатывает. Возможно ты не успеваешь подобрать gem в течении 5 сек после подбора кристала, попробуй поставить задержку таймера 10 сек.

supernewbie
05.03.2010, 20:55
Подбераю почти сразу, то есть я выбрасываю рядом кристалл и гем, и почти сразу подбираю СНАЧАЛА кристалл, потом ГЕМ, но все равно этой падле пофиг!

Добавлено через 1 минуту
Я вот тоже думаю почему так происходит, ведь изначально PckIn = false
True он может стать ТОЛЬКО если я подберу гем в течении 5 секунд после подбора кристалла, но даже если я не подбераю гем, он все равно каким то образом остается false и проходит долбаную проверку! Короче PckIn не становится True... Либо его делают false после того как он стал True, либо яхз... либо он вообще true не становится...

Добавлено через 4 минуты
черт... у меня щас башка взарвется от этих скриптов(

supernewbie
05.03.2010, 21:03
вот как это выглядит

Vilson
05.03.2010, 21:07
Ну ка добавь после :

PckIn := True;
SendMsg2('Karog', 'PckIn := ' + VarToStr(PckIn));

Breadfan
05.03.2010, 21:10
Ага, ты заметил как я тут телепатом поработал когда скрипт на прошлой странице писал? :D
У меня в условиях проверка на ItemId = 1461 и 2131 при том что я не спрашивал о чем речь. :D - да я смотрел на них и думал: мож в личку получил точные названия итемов...я в шоке :) Требуны ревут от восхищения :good:

supernewbie
05.03.2010, 21:11
наверное что-то не так вставил... но...

Vilson
05.03.2010, 21:19
Еще в таймере после SendMsg2('Karog', 'сработал таймер'); поставь
SendMsg2('Karog', 'в таймере PckIn := ' + VarToStr(PckIn));

и запусти скрипт, можно еще попробовать поменять условие в таймере на if (PckIn=False) then вместо того что там сейчас

supernewbie
05.03.2010, 21:26
так, это без замены условия, ну как я и говорил, в конце оно независимо становится false...

supernewbie
05.03.2010, 21:28
в принципе, после замены условия ничего не изменилось

Vilson
05.03.2010, 21:29
меняй в
Var
PckIn: Boolean;

и добавь в
procedure Init;
begin
PckIn:= False;

Хз что там у тебя, может фастсткрипт глючит с прединициализируемыми переменными, попробуй еще так..

supernewbie
05.03.2010, 21:33
ГОСПАДИ КАК ЖЕ ТЫ КРУТ)))))

Добавлено через 1 минуту
ахренеть)) работает))))) госпади как же это круто))))
не нашел смайла, но *respect*
Спасибо огромное :D

Breadfan
05.03.2010, 23:23
Уважуха Vilson ) Вот только у меня остался один вопрос: а к чему этот скрипт нужен то вообще?
Модераторам: можно тему почистить? а то 4 страницы нафлудили....
//QaK: а не проще ее прибить нафиг?

Sherman
15.03.2010, 15:14
ЗЫ Не путай FastScript и Паскаль.
А чо их путать то. В итоге после куевой тучи оберток фастскриптовский case упретсо в паскалевский case, которому переданная в Expression строка не подходит, и сравнивая х.з. что (скорее всего указатель на эту самую строку) с х.з. чем (опять же с указателями на строки) в Statement, естественно этот case отработает только в ветке else

Vilson
15.03.2010, 19:57
и сравнивая х.з. что (скорее всего указатель на эту самую строку) с х.з. чем (опять же с указателями на строки) в Statement, естественно этот case отработает только в ветке else
Афтор, какой результат тебе выдал этот скрипт? ;)


procedure Init;
Var
s: string;
begin
s:='проверка кейса строк работает';
case s of
'автор прав': ShowMessage('Sherman прав - в fs кейс со строками не работает');
'проверка кейса строк работает': ShowMessage('Sherman НЕ прав - в fs кейс со строками работает');
'кто здесь оО': ShowMessage('нет никого');
end;
end;

begin

end.

NLObP
15.03.2010, 22:33
Vilson, у меня вот что