Вернуться   CoderX :: Forums > Lineage II > L2PacketHack > Скриптинг
Войти через OpenID

Скриптинг Форум посвещенный созданию скриптов для L2PacketHack

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 10.07.2010, 02:00   #11
Местный
 
Аватар для J-Fobos
 
Регистрация: 09.06.2008
Сообщений: 867
Сказал Спасибо: 175
Имеет 468 спасибок в 259 сообщенях
J-Fobos пока неопределено
По умолчанию

Цитата:
Сообщение от ampeg Посмотреть сообщение
Кажется, выше я писал практически тожесамое.
поробывал точно также, как написали Вы, не изменилось ничего=\
Вы думаете я просто так три раза упоминал о таймере? Сразу отвечу что не просто так. Делайте через таймер, потому что то что вы написали нихрена (извините за выражение ) не тоже самое, даже не близко.

Делай останавливает трафик, а соответственно пакет #$11 приходит уже после того как была произошла отправить 4-й пакет, а это значит что в переменную которая используется в 4-м пакете ничего не записано, а значит что она пуста, а пустую переменную использовать нельзя и потому вылазит ошибка в которой написано о не возможности прочесть с памяти переменную (потому что ее там нету).

Таймер, таймер, таймер, понятно?
__________________

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

Переходим на протокол нового поколения jabber
J-Fobos вне форума   Ответить с цитированием
За это сообщение J-Fobos нажился спасибкой от:
Старый 10.07.2010, 06:18   #12
Новичок
 
Регистрация: 09.07.2010
Сообщений: 19
Сказал Спасибо: 13
Имеет 1 спасибку в 1 сообщении
ampeg пока неопределено
По умолчанию

Код:
const
Nick='DamageControl';
var
 ListID:integer;
 Timer01: TTimer;
 TimerCyrcle:integer;

procedure Init;
begin
   Timer01:=TTimer.Create(nil); 
   Timer01.OnTimer:=@OnTimer01; 
   Timer01.enabled:=true; 
   Timer01.interval:=1500; 
   TimerCyrcle:=1;
end;
procedure OnTimer01(Sender: TObject);
begin
    case TimerCyrcle of
        1:begin   
            buf:=hstr('04 C9 2C 10 48 21 43 01 00 32 44 02 00 74 F2 FF FF 00');
            SendToServerEx(Nick);
            SendToServerEx(Nick);
            Inc(TimerCyrcle);
        end;
        2:begin
             buf:=hstr('20 74 00 65 00 73 00 74 00 5F 00 73 00 65 00 72 00 76 00 65 00 72 00 5F 00 68 00 65 00 6C 00 70 00 65 00 72 00 5F 00 67 00 6D 00 6F 00 2E 00 68 00 74 00 6D 00 00 00');
            SendToServerEx(Nick);
            Inc(TimerCyrcle);
         end; 
     3:begin
            buf:=hstr('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 31 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 31 00 32 00 00 00');
            SendToServerEx(Nick);
            TimerCyrcle:=1;
            Timer01.enabled:=false;    
        end;    
        end;
      
    end;
procedure Free;
begin
  Timer01.free;
end;    
    

  begin    
                If (ConnectName=Nick) and FromServer and (pck[1] = #$11) then begin
                ListID:=ReadD(6);
                buf:=hstr('1F' + 'IntToStr(ListID)' + '01 00 00 00 B1 19 00 00 01 00 00 00');
                SendToServerEx(Nick);
             end;    
  end.
почему-то не переходит в "тело" скрипта...
ampeg вне форума   Ответить с цитированием
Старый 10.07.2010, 14:50   #13
Местный
 
Аватар для J-Fobos
 
Регистрация: 09.06.2008
Сообщений: 867
Сказал Спасибо: 175
Имеет 468 спасибок в 259 сообщенях
J-Fobos пока неопределено
По умолчанию

Дополним чуть ваш скрипт

Добавим процедуру SendMsg2 и пару раз будем ее юзать.
Код:
procedure SendMsg2(msg:string);
begin
buf:=#$4A; WriteD(0); WriteD(10); WriteS(''); WriteS(msg);
SendToClientEx(Nick);
end;
В результате ваш скрипт будет такой:

Код:
const
Nick='DamageControl';
var
 ListID:integer;
 Timer01: TTimer;
 TimerCyrcle:integer;

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

procedure Init;
begin
   Timer01:=TTimer.Create(nil); 
   Timer01.OnTimer:=@OnTimer01; 
   Timer01.enabled:=true; 
   Timer01.interval:=1500; 
   TimerCyrcle:=1;
end;

procedure OnTimer01(Sender: TObject);
begin
    case TimerCyrcle of
        1:begin   
            buf:=hstr('04 C9 2C 10 48 21 43 01 00 32 44 02 00 74 F2 FF FF 00');
            SendToServerEx(Nick);
            SendMsg2('Отправился пакет 1');
            SendToServerEx(Nick);
            SendMsg2('Еще раз отправился пакет 1, без задержки');
            Inc(TimerCyrcle);
        end;
        2:begin
             buf:=hstr('20 74 00 65 00 73 00 74 00 5F 00 73 00 65 00 72 00 76 00 65 00 72 00 5F 00 68 00 65 00 6C 00 70 00 65 00 72 00 5F 00 67 00 6D 00 6F 00 2E 00 68 00 74 00 6D 00 00 00');
            SendToServerEx(Nick);
            SendMsg2('Отправился пакет 2');
            Inc(TimerCyrcle);
         end; 
     3:begin
            buf:=hstr('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 31 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 31 00 32 00 00 00');
            SendToServerEx(Nick);
            SendMsg2('Отправился пакет 3 и таймер остановился');
            TimerCyrcle:=1;
            Timer01.enabled:=false;    
        end;    
        end;
      
    end;
procedure Free;
begin
  Timer01.free;
end;    
    

  begin    
                If (ConnectName=Nick) and FromServer and (pck[1] = #$11) then begin
                ListID:=ReadD(6);
                SendMsg2('Поймали пакет #$11');
                buf:=hstr('1F' + 'IntToStr(ListID)' + '01 00 00 00 B1 19 00 00 01 00 00 00');
                SendToServerEx(Nick);

             end;    
  end.
Проверьте какой будет результат работы скрипта
__________________

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

Переходим на протокол нового поколения jabber
J-Fobos вне форума   Ответить с цитированием
За это сообщение J-Fobos нажился спасибкой от:
Старый 10.07.2010, 17:15   #14
Новичок
 
Регистрация: 09.07.2010
Сообщений: 19
Сказал Спасибо: 13
Имеет 1 спасибку в 1 сообщении
ampeg пока неопределено
По умолчанию

Логи это хорошо
результат работы скрипта:
отправляется 3 первых пакета и персонаж начинает крутиться.
дальше скрипт не идет.
ampeg вне форума   Ответить с цитированием
Старый 10.07.2010, 17:55   #15
Местный
 
Аватар для J-Fobos
 
Регистрация: 09.06.2008
Сообщений: 867
Сказал Спасибо: 175
Имеет 468 спасибок в 259 сообщенях
J-Fobos пока неопределено
По умолчанию

Кхм, результат должен был быть чуть другим. Должны были быть отправлены первые 3 пакета, а потом "Поймали пакет #$11". Скрипт то правильно написан, почти. Я специально добавил логи чтобы вы это увидели.

Собственно проблема в строчке
Код:
buf:=hstr('1F' + 'IntToStr(ListID)' + '01 00 00 00 B1 19 00 00 01 00 00 00');
Смотрите что происходит при выполнении этой строки (если ListID=1234567891):
1) выполняется команда IntToStr и в результате мы получаем 1234567891 -> '1234567891'
2) Дальше суммируются строки:
'1F' + '1234567891' + '01 00 00 00 B1 19 00 00 01 00 00 00' ->
'1F 12 34 56 78 91 01 00 00 00 B1 19 00 00 01 00 00 00'
3) Выполняется функция hstr и получаем пакет
'1F 12 34 56 78 91 01 00 00 00 B1 19 00 00 01 00 00 00' ->
#$1F#$12#$34#$56#$78#$91#$01#$00#$00#$00#$B1#$19#$00#$00#$01#$00#$00#$00

Синим цветом я выделил то место куда мы запихнули ListID, но сразу бросается в глаза: оно занимает 5 байтов, а должно занимать 4 байта. А если ListID будет равно 1324, то получится что оно займет 2 байта в пакете и опять же пакет будет неправильным.

В чем проблема? В том что команда ReadD вытаскивает с пакета число в 10-тиричной системе вычислений, и команда IntToStr "пихает" в пакет чистой в той же 10-тиричной системе, а надо то в 16-ти.
Для этого случая есть команда WriteD и в вашем случаи надо ее использовать.


PS:
Hебольшая догадка почему чар крутится: возможно ListID нечетное количество символов получается, например 12345. Тогда в конец отсылаемого пакета попадает не 00, а просто 0 и это приводит к нарушению чтения всех последующих данных.
__________________

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

Переходим на протокол нового поколения jabber
J-Fobos вне форума   Ответить с цитированием
За это сообщение J-Fobos нажился спасибкой от:
Старый 10.07.2010, 19:05   #16
Новичок
 
Регистрация: 09.07.2010
Сообщений: 19
Сказал Спасибо: 13
Имеет 1 спасибку в 1 сообщении
ampeg пока неопределено
По умолчанию

Код:
const
Nick='DamageControl';
var
 ListID:integer;
 Timer01: TTimer;
 TimerCyrcle:integer;

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


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

procedure OnTimer01(Sender: TObject);
begin
    case TimerCyrcle of
        1:begin   
            buf:=hstr('04 C9 2C 10 48 21 43 01 00 32 44 02 00 74 F2 FF FF 00');
            SendToServerEx(Nick);
            SendMsg2('Отправился пакет 1');
            SendToServerEx(Nick);
            SendMsg2('Еще раз отправился пакет 1, без задержки');
            Inc(TimerCyrcle);
        end;
        2:begin
             buf:=hstr('20 74 00 65 00 73 00 74 00 5F 00 73 00 65 00 72 00 76 00 65 00 72 00 5F 00 68 00 65 00 6C 00 70 00 65 00 72 00 5F 00 67 00 6D 00 6F 00 2E 00 68 00 74 00 6D 00 00 00');
            SendToServerEx(Nick);
            SendMsg2('Отправился пакет 2');
            Inc(TimerCyrcle);
         end; 
     3:begin
            buf:=hstr('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 31 00 26 00 72 00 65 00 70 00 6C 00 79 00 3D 00 31 00 32 00 00 00');
            SendToServerEx(Nick);
            SendMsg2('Отправился пакет 3 и таймер остановился');
            TimerCyrcle:=1;
            Timer01.enabled:=false;    
        end;    
        end;
      
    end;
procedure Free;
begin
  Timer01.free;
end;    
    

  begin    
                If (ConnectName=Nick) and FromServer and (pck[1] = #$11) then begin
                ListID:=ReadD(6);
                SendMsg2('Поймали пакет #$11');
                buf:=#$1F; WriteD(ListID); WriteD(1); WriteD(6577); WriteD(1);
                SendMsg2('Модифицировали пакет RequestBuyItem, ListID= ' + IntToStr(ListID));
                SendToServerEx(Nick);
                

             end;    
  end.
по логам доходит до конца, лист ИД получает правильно, реквестбай итем не отправляет.

Последний раз редактировалось ampeg, 10.07.2010 в 19:41.
ampeg вне форума   Ответить с цитированием
Старый 10.07.2010, 20:06   #17
Местный
 
Аватар для J-Fobos
 
Регистрация: 09.06.2008
Сообщений: 867
Сказал Спасибо: 175
Имеет 468 спасибок в 259 сообщенях
J-Fobos пока неопределено
По умолчанию

Видите ли, здесь есть еще один нюанс

Когда вызывается процедура SendMsg2 содержимое переменной buf меняется (внутри процедуры). Вот пример:
Код:
buf:=#$11;
SendMsg2(15);
SendToServerEx(nick);
В результате на сервер отправляется не 11, а 15 (грубо говоря).

Обратите внимание что в том скрипте который я выложил ранее процедура SendMsg2 идет всегда после SendToServerEx, а не перед.


Получается что у вас здесь отправляется не пакет покупки, а то что выводится в чат. Вы можете в этом убедится посмотрев в логе пакетов.
Код:
 buf:=hstr('1F 00 00 00 00 01 00 00 00 B1 19 00 00 01 00 00 00');
 WriteD(ListID,2);
 SendMsg2('Модифицировали пакет #$11');
SendToServerEx(Nick);
__________________

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

Переходим на протокол нового поколения jabber
J-Fobos вне форума   Ответить с цитированием
За это сообщение J-Fobos нажился спасибкой от:
Старый 10.07.2010, 20:10   #18
Новичок
 
Регистрация: 09.07.2010
Сообщений: 19
Сказал Спасибо: 13
Имеет 1 спасибку в 1 сообщении
ampeg пока неопределено
По умолчанию

Спасибо Вам огрмное,J-Fobos, я все сделал, все отлично работает
единственное - вы были првавы, обджект ИД при рестарте сервера меняется..но это не большая проблема
ampeg вне форума   Ответить с цитированием
За это сообщение ampeg нажился спасибкой от:
Старый 10.07.2010, 20:17   #19
Местный
 
Аватар для J-Fobos
 
Регистрация: 09.06.2008
Сообщений: 867
Сказал Спасибо: 175
Имеет 468 спасибок в 259 сообщенях
J-Fobos пока неопределено
По умолчанию

А вы были не правы написав "почти ничего не понимаю в программировании"
Нормально вы все понимаете, многие пользователи пакетхаком могут только позавидовать вам
__________________

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

Переходим на протокол нового поколения jabber
J-Fobos вне форума   Ответить с цитированием
За это сообщение J-Fobos нажился спасибкой от:
Старый 10.07.2010, 20:32   #20
Новичок
 
Регистрация: 09.07.2010
Сообщений: 19
Сказал Спасибо: 13
Имеет 1 спасибку в 1 сообщении
ampeg пока неопределено
По умолчанию

3-4 месяца C#, пара программ приличных...вот и весь мой опыт)
ampeg вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Lineage II > L2PacketHack > Скриптинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 01:03.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!