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

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

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 08.07.2014, 12:18   #1
Новичок
 
Регистрация: 08.07.2014
Сообщений: 3
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
oldog пока неопределено
По умолчанию снова инвентарь

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

Код:
var
iItemCount,iObjId,iItemId,iSlot,iCount,i,sme:integer; //сколько вещей в инвентаре

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

end;

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

end;

procedure SendMesg(msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(17); //голосом героя
WriteS('Внутренний голос'); // кто чревовещает
WriteH(65535);
WriteH(65535); // почему-то без этого мессаги не отправляются
WriteS(msg);
SendToClient;
end;

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

begin

if FromServer and (pck[1]=#$11) then
// пришел ответ на запрос списка вещей
begin
    SendMesg(inttostr(length(pck)));
    sme:=0;
    SendMesg(IntToStr(sme)+' тек смещение в пакете');
    i:=1; // не видел ни разу чтобы в инвентаре совсем было пусто, пусть будет 1
    iItemCount:=ReadH(4);
    SendMesg(IntToStr(iItemCount)+' слотов занято в инвентаре');
    iObjId:=ReadD(sme+6);
    iItemId:=ReadD(sme+10);
    iSlot:=ReadD(sme+14);
    iCount:=ReadQ(sme+18);
//    SendMesg(IntToStr(iObjId)+' ID '+IntToStr(i)+' объекта');
//    SendMesg(IntToStr(iItemId)+' ID '+IntToStr(i)+' итема');
    SendMesg(IntToStr(iSlot)+' слот '+IntToStr(i)+' итема');
    SendMesg(IntToStr(iCount)+' количество '+IntToStr(i)+' итема');

    // пока проверка цикла вручную со смещением относительно блоков
    sme:=$50;
    for i:=2 to iItemCount do
    begin
        SendMesg(IntToStr(sme)+' тек смещение в пакете');
        iObjId:=ReadD(sme);
        iItemId:=ReadD(sme);
        iSlot:=ReadD(sme);
        iCount:=ReadQ(sme);
        SendMesg(IntToStr(iObjId)+' ID '+IntToStr(i)+' объекта');
        SendMesg(IntToStr(iItemId)+' ID '+IntToStr(i)+' итема');
        SendMesg(IntToStr(iSlot)+' слот '+IntToStr(i)+' итема');
        SendMesg(IntToStr(iCount)+' количество '+IntToStr(i)+' итема');
        ReadH(sme); //it1
        ReadH(sme); //ct1
        ReadH(sme); //ie
        ReadD(sme); //bp
        ReadH(sme); //elvl
        ReadH(sme); //ct2
        ReadD(sme); //aid
        ReadD(sme); //mana
        ReadD(sme); //rt
        ReadH(sme); //ae
        ReadH(sme); //aev
        ReadH(sme); //daf
        ReadH(sme); //daw
        ReadH(sme); //dawi
        ReadH(sme); //dae
        ReadH(sme); //dah
        ReadH(sme); //dau
        ReadH(sme); //ee1
        ReadH(sme); //ee2
        ReadH(sme); //ee3
        ReadD(sme); //?
        ReadH(sme); //?
        
//        sme:=sme+$4a;  // переходим на след элемент
    end;

end;

end.
сам пакет инвентаря выглядит примерно так:

Код:
11 
01 00 
22 00 

3D C8 A4 40 oid
57 03 00 00 id
02 00 00 00 slot
01 00 00 00 00 00 00 00 count 
02 00 it2
00 00 ct1
00 00 eq
06 00 00 00 bp
00 00 el
00 00 ct
00 00 00 00 aid
FF FF FF FF mana
F1 D8 FF FF rt
01 00 ae
FE FF aev
00 00 daf
00 00 daw
00 00 dawi
00 00 dae
00 00 dah
00 00 dau
00 00 ee1
00 00 ee2
00 00 ee3
00 00 
00 00 
00 00 

14 D0 A4 40 57 03 00 00 FF FF FF FF 01 00 00 00 00 00 00 00 02 00 00 00 01 00 06 00 00 00 04 00 00 00 00 00 00 00
FF FF FF FF F1 D8 FF FF 01 00 FE FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 

и так далее, по количеству итемов в инвентаре. Здесь после цифр короткий комментарий для себя, что обозначают цифры.
скрипт выводит последнюю позицию инвентаря - 31, хотя позиций 34, останавливаясь на смещении 2300, размер пакета - 2523, никак не пойму, почему так.
Может какие гуру подскажут? Версия протокола - 488.
oldog вне форума   Ответить с цитированием
Старый 14.07.2014, 08:45   #2
Новичок
 
Регистрация: 08.07.2014
Сообщений: 3
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
oldog пока неопределено
По умолчанию

Нашел косяк, скрипт "затыкается" на чтении количества итемов (ReadQ(смещение_на_кол-во_итемов)), у меня в инвентаре лежало 4ккк аден, как только убираешь, то все работает нормально.
В связи с этим вопрос: что делать в этом случае?
oldog вне форума   Ответить с цитированием
Старый 14.07.2014, 12:37   #3
Местный
 
Аватар для kpa9pt
 
Регистрация: 13.01.2010
Сообщений: 159
Сказал Спасибо: 18
Имеет 30 спасибок в 23 сообщенях
kpa9pt имеет немного плохого в прошлом
По умолчанию

Цитата:
Сообщение от oldog Посмотреть сообщение
Нашел косяк, скрипт "затыкается" на чтении количества итемов (ReadQ(смещение_на_кол-во_итемов)), у меня в инвентаре лежало 4ккк аден, как только убираешь, то все работает нормально.
В связи с этим вопрос: что делать в этом случае?
Слушай, как то уж у тебя больно замудрёно выглядит простая вещь как создание базы инвентаря
Прости слишком глаз тупит, могу в помощь проверенную парой лет процедуру скинуть, не подводит

PHP код:
procedure Itemlist;
    var
        
i,count:integer;
        
checkIndex:integer;
        
    
begin        
        count
:=readh(4);       
        for 
i:=1 to (count+1) do
            
begin               
                itemBase
[1,i]:=ReadD((i-1)*68+6); //OID 
                
itemBase[2,i]:=ReadD((i-1)*68+6+4); //ItemID
                
itemBase[3,i]:=Readq((i-1)*68+6+4+4+4); //ItemCount
                
itemBase[4,i]:=ReadH((i-1)*68+6+4+4+4+4+4+2+2); //isEquipped
            
end;                              
    
end
И не знаю, как другим, но мне она кажется в миллион раз понятней чем твоя
kpa9pt вне форума   Ответить с цитированием
Старый 14.07.2014, 12:53   #4
Новичок
 
Регистрация: 08.07.2014
Сообщений: 3
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
oldog пока неопределено
По умолчанию

Цитата:
Сообщение от kpa9pt Посмотреть сообщение
Слушай, как то уж у тебя больно замудрёно выглядит простая вещь как создание базы инвентаря
Прости слишком глаз тупит, могу в помощь проверенную парой лет процедуру скинуть, не подводит


И не знаю, как другим, но мне она кажется в миллион раз понятней чем твоя
в том то и дело, что у меня количество полей отличается от стандартных хроник, поэтому твоя процедура работать не будет. ничего мудреного вроде нету, все тоже самое, что и ты отправил, только свойств побольше, ну и кроме того у меня количество предметов в ячейке измеряется QWORD, макс можно 999999999999 свитков например положить в ячейку. но функция ReadQ получается неправильно работает с таким числом. потом если интересно будет могу выложить полный скрипт.
oldog вне форума   Ответить с цитированием
Старый 15.07.2014, 12:10   #5
Местный
 
Аватар для SeregaZ
 
Регистрация: 16.08.2009
Сообщений: 1,224
Сказал Спасибо: 4
Имеет 229 спасибок в 182 сообщенях
SeregaZ пока неопределено
По умолчанию

99999999999 ты не запишешь в 4 этих как его там... в четыре символа? в 4 байта? и в связи с чем ReadQ по идее должно читать только 4 байта - Q - Quad по идее.
__________________
хочу картинку в подпись!
SeregaZ вне форума   Ответить с цитированием
Ответ

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


Опции темы
Опции просмотра

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

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


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

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

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