Просмотр полной версии : Требуется помощь.
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 секунд?
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:
Нифига ты не понял. В скрипте все работает как ты просил в первом посте, учи мат часть.
supernewbie
05.03.2010, 02:35
почему он не работает то тогда(
Добавлено через 20 минут
вообщем он просто не врубает таймер( я уже и 2 пакета отсылал, и каждый по 1(
Добавлено через 14 минут
перекавырял все абсолютно( не робит твой скрипт(
госпади, помогите(
Скрипт рабочий, правь руки.
ЗЫ Пример что ты менял в скрипте и что посылал давай в студию.
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.
Вот как скрипт я делаю. Даже когда он там встает или садится, ничего абсолютно!
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, наверняка тут написана очередная чушь..
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%.
Этот код работаит? Помоему 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%" - это ты верно подметил ))))
да он вообще тут фигню проверяет, под его условие достаточно сделать так
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.
Не робит абсолютно(
не хотел палить скрипт, но ладно, выложу...
Не робит абсолютно(
Это не скрипт, это набор бессмысленного кода. Какие у тебя хроники и что по твоему должен делать этот "скрипт"?
supernewbie
05.03.2010, 16:11
Это не скрипт, это набор бессмысленного кода. Какие у тебя хроники и что по твоему должен делать этот скрипт?
Хроники ХБ. Скрипт должен проверять когда приходит сообщение что я получил кристал, потом он в течении 5 секунд проверяет не пришло ли сообщение что я получил гем, если гем я не получил, то Второй чел выбрасывает кристал.
Хроники ХБ. Скрипт должен проверять когда приходит сообщение что я получил кристал, потом он в течении 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 минуты
вообщем дело не в пакетах... он просто не врубает таймер, скорее всего проверка не робит твоя...
вообщем дело не в пакетах... он просто не врубает таймер, скорее всего проверка не робит твоя...
Ну да, в пакете которым ты пытаешься выкинуть итем не хватает 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 минуты
А мне надо чтобы таймер срабатывал только если я НЕ получил гем...
Подбираю кристал - пишет подобран кристал, если подбираю гем, пишет что подобран гем, НО в любом случае, то есть, если подбираю или не подбираю, в любом случае пишет что таймер сработал...
Добавлено через 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
А он выдает сообщение ВСЕГДА. А именно через 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 секунд.
Пишет про выкидывание.
А у меня пишет даже если пришел второй!
Добавлено через 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
вот как это выглядит
Ну ка добавь после :
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
наверное что-то не так вставил... но...
Еще в таймере после SendMsg2('Karog', 'сработал таймер'); поставь
SendMsg2('Karog', 'в таймере PckIn := ' + VarToStr(PckIn));
и запусти скрипт, можно еще попробовать поменять условие в таймере на if (PckIn=False) then вместо того что там сейчас
supernewbie
05.03.2010, 21:26
так, это без замены условия, ну как я и говорил, в конце оно независимо становится false...
supernewbie
05.03.2010, 21:28
в принципе, после замены условия ничего не изменилось
меняй в
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: а не проще ее прибить нафиг?
ЗЫ Не путай FastScript и Паскаль.
А чо их путать то. В итоге после куевой тучи оберток фастскриптовский case упретсо в паскалевский case, которому переданная в Expression строка не подходит, и сравнивая х.з. что (скорее всего указатель на эту самую строку) с х.з. чем (опять же с указателями на строки) в Statement, естественно этот case отработает только в ветке else
и сравнивая х.з. что (скорее всего указатель на эту самую строку) с х.з. чем (опять же с указателями на строки) в Statement, естественно этот case отработает только в ветке else
Афтор, какой результат тебе выдал этот скрипт? ;)
procedure Init;
Var
s: string;
begin
s:='проверка кейса строк работает';
case s of
'автор прав': ShowMessage('Sherman прав - в fs кейс со строками не работает');
'проверка кейса строк работает': ShowMessage('Sherman НЕ прав - в fs кейс со строками работает');
'кто здесь оО': ShowMessage('нет никого');
end;
end;
begin
end.
vBulletin® v3.6.11, Copyright ©2000-2024, Jelsoft Enterprises Ltd. Перевод: zCarot