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

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

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 10.07.2010, 11:38   #21
Местный
 
Регистрация: 27.01.2009
Сообщений: 154
Сказал Спасибо: 23
Имеет 26 спасибок в 19 сообщенях
guplen пока неопределено
По умолчанию

Возможно проблема в следующем: когда в строку засовываешь пакет, и гдето посередине пакета идет подряд 2 нуля, то паскаль считает это концом строки, забывая про оставшуюся часть.

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

ПС: темку быстро пробежал глазами, если не правильно понял суть, то ногами не бить
guplen вне форума   Ответить с цитированием
Старый 10.07.2010, 11:40   #22
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

открою секрет.
pck,buff : string;
правда, фастскрипту все равно. для него все типы - variant
__________________
L2Ext - project closed.
alexteam вне форума   Ответить с цитированием
Старый 10.07.2010, 12:09   #23
Местный
 
Регистрация: 27.01.2009
Сообщений: 154
Сказал Спасибо: 23
Имеет 26 спасибок в 19 сообщенях
guplen пока неопределено
По умолчанию

Цитата:
Сообщение от alexteam Посмотреть сообщение
открою секрет.
pck,buff : string;
правда, фастскрипту все равно. для него все типы - variant
А, да, я не в лпх писал, а в делфи.
guplen вне форума   Ответить с цитированием
Старый 10.07.2010, 12:46   #24
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

Открою секрет. л2пх тоже написано на делфи %)
делфийской строке - похрен сколько у тебя #0#0 в строке встречается.
ибо там не просто "массив" байт. перед ним еще и структура есть в которой один из параметров - длина строки.

Цитата:
Вот что представляет собой эта область памяти, хранящая экземпляр строки 'abc':

Байты с 1 по 4 Счётчик ссылок равный -1
Байты с 5 по 8 Длина строки равная 3
Байт 9 Символ 'a'
Байт 10 Символ 'b'
Байт 11 Символ 'c'
Байт 12 Символ с кодом 0 (#0)

Для удобства работы с такой структурой, когда строковой переменной присваивается ссылка на эту строку, в переменную заносится адрес не начала этой структуры, а адрес её девятого байта. Т.е. адрес начала реальной строки (прямо как pChar). Для того, что бы приблизиться к реальной жизни, перепишем приведённую структуру:
Смещение Размер Значение Назначение
-8 4 -1 Счётчик ссылок
-4 4 3 Длина строки
0 1 'a'
1 1 'b'
2 1 'c'
3 1 #0

С полем по смещению -8, нам уже должно быть все ясно. Это значение, хранящееся в двойном слове (4 байта), тот самый счетчик, который позволяет оптимизировать хранение одинаковых строк. Значение этого счетчика имеет тип Integer, т.е. может быть отрицательным. На самом деле, используется лишь одно отрицательное значение – "-1", и положительные значения. 0 не используется.

Теперь, обратите внимание на поле, лежащее по смещению -4. Это, четырёхбайтовое значение длинны строки (почти как в ShortString). Думаю, Вы заметили, что размер памяти выделенной под эту строку не имеет избыточности. Т.е. компилятор выделяет под строку минимально необходимое число байт памяти. Это конечно хорошо, но, при попытке "нарастить" строку: s1 := s1 + 'd', компилятору, точнее библиотеке времени исполнения (RTL) придется перераспределить память. Ведь теперь строке требуется больше памяти, аж на целый байт. Для перераспределения памяти нужно знать текущий размер строки. Вероятно, именно для того, что бы не приходилось каждый раз сканировать строку, определяя её размер, разработчики Delphi и включили поле длины, строки в эту структуру. Длина строки, хранится как значение Integer, отсюда и ограничение на максимальный размер таких строк – 2 Гбайт. Надеюсь, мы не скоро упрёмся в это ограничение. Кстати, именно потому, что память под эти строки выделяется динамически, они и получили ещё одно свое название: динамические строки.
источник
http://sources.ru/magazine/0804/delphistr.html

Добавлено через 2 минуты
к стати, там очень неплохо описано что происходит с разнообразными типами в памяти при операциями над ними.

Добавлено через 5 минут
а вот собственно практическое подтверждение этому:

delphi Код:
var   Test : string;   len : integer; begin   test := 'HelloWorld!';   CopyMemory(@len,pointer(integer(test)-4),4);//копируем данные с участка памяти лежащего на 4 байта "левее" чем то куда ссылаеццо указатель на строку в участок памяти по которому лежит переменная len   showmessage(inttostr(len));//показываем len end;
__________________
L2Ext - project closed.

Последний раз редактировалось alexteam, 10.07.2010 в 14:28. Причина: Добавлено сообщение
alexteam вне форума   Ответить с цитированием
Старый 10.07.2010, 19:10   #25
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

delphi Код:
const Name='Glav'; Name1='1'; Name2='2'; Name3='3'; Name4='4'; Name5='EVS'; var NamesArray:array [1..20] of string; panelki:array [1..20] of string; i:integer; nashel,nashel1:boolean; msgg:string; procedure Init; //Вызывается при включении скрипта begin NamesArray[1]:=Name; NamesArray[2]:=Name1; NamesArray[3]:=Name2; NamesArray[4]:=Name3; NamesArray[5]:=Name4; NamesArray[6]:=Name5; nashel:=false; nashel1:=false; end; procedure Free; //Вызывается при выключении скрипта begin end; procedure Say(msg:string); begin   buf:=#$4A;    WriteD(0);   WriteD(3);   WriteS('1');   WriteS(msg);   SendToClient; end; procedure scanpanelki; begin say('начался скан'); for i:=1 to 20 do if (ConnectName=NamesArray[i]) then begin panelki[i]:=pck; nashel:=true; say('сосканил панельку у '+ConnectName+'.'); break; end; if (i=20) and (nashel=false) then begin say('не нашел имя'); break; end; end; //основная часть скрипта //вызывается при приходе каждого пакета если скрипт включен begin begin if FromServer and (pck[1]=#$45) then begin scanpanelki; end; end; begin if FromClient and (pck[1]=#$49) then begin msgg:=ReadS(2); for i:=1 to 20 do if (NamesArray[i]=msgg) then begin pck:=''; say('я сделаю вам панельку ' + NamesArray[i]+'.'); buf:=panelki[i]; SendToClient; nashel1:=true; break; end; if (i=20) and (nashel1=true) then begin say('че-то хз.'); end; end; end; end.

Добавлено через 1 минуту
PS обрезает пакет и прилывает всего 2 байта, причем второй байт тоже битый

Последний раз редактировалось supernewbie, 10.07.2010 в 19:10. Причина: Добавлено сообщение
supernewbie вне форума   Ответить с цитированием
Старый 10.07.2010, 19:55   #26
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

delphi Код:
var     NamesArray : array of string;     panelki : array of string;     procedure Init; //Вызывается при включении скрипта begin   setlength(NamesArray, 6);   setlength(panelki, 6);   NamesArray[0]:='Glav';   NamesArray[1]:='1';   NamesArray[2]:='2';   NamesArray[3]:='3';   NamesArray[4]:='4';   NamesArray[5]:='EVS';   ClearPackets; end; procedure Free; //Вызывается при выключении скрипта begin end; procedure Say(msg:string); begin   buf:=#$4A;    WriteD(0);   WriteD(3);   WriteS('1');   WriteS(msg);   SendToClient; end; procedure ClearPackets; //чистим масив с пакетами var   i : integer; begin   for i := 0 to length(NamesArray) - 1  do panelki[i] := '';      end; Function GetArrayIndexByName(name:string):integer; //а это я уже выкладывал.. правда щас модифицировал малех. begin   result := 0;   while (result < length(NamesArray)) and (lowercase(name) <> lowercase(NamesArray[result])) do inc(result);   if result = length(NamesArray) then result := -1; end; procedure scanpanelki; //ну и имя у функции var   ind,i : integer;   b : byte; begin   ind := GetArrayIndexByName(ConnectName);   if ind >= 0 then     begin       panelki[ind] := '';       i := 1;       while i <= length(pck) do //дети, тут я учу плохому, не стоит так делать )        begin         B := ReadC(i);         if b = 0 then           panelki[ind] := panelki[ind] + '00'         else           panelki[ind] := panelki[ind] + strtohex(chr(b));          end;       say('сосканил панельку у '+ConnectName+'. '+panelki[ind]);     end   else     say('не нашел имя'); end; procedure ActPanelki; //и у моей тоже var   msgg : string;   ind : integer; begin   msgg := ReadS(2); //читаем чтота   ind := GetArrayIndexByName(ConnectName); //получаем по этому чемуто индекс в массиве   if ind >= 0 then  //если имя существовало в масиве     if panelki[ind] <> '' then //и пакет был запомнен ранее       begin                //то делаем хз чо         pck := '';         say('я сделаю вам панельку ' + NamesArray[ind]+'.');         buf := hstr(panelki[ind]);         SendToClient;       end                          else       say('Не был запомнен пакет для : ' + msgg)    //если пакет не бул запомнен   else     say('Не нашел имя: ' + msgg); //либо отсутствует имя в массиве с именами end;   begin   if pck = '' then exit; //при юзаньи старой версии пх эта строчка в большинстве случаях обязательна.   if FromServer and (pck[1]=#$45) then scanpanelki;   if FromClient and (pck[1]=#$49) then actpanelki; end.
__________________
L2Ext - project closed.

Последний раз редактировалось alexteam, 10.07.2010 в 23:06.
alexteam вне форума   Ответить с цитированием
За это сообщение alexteam нажился спасибкой от:
Старый 10.07.2010, 21:12   #27
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

ничего не изменилось, пакет :
Код:
45 05 00 00 00 02 00 00 00 0D 00 00 00 93 04 00 00 06 00 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 CE 04 00 00 06 00 00 00 00 01 00 00 00 01 00 00 00 02 00 00 00 EB 9A 10 10 01 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 0B 00 00 00 A3 34 11 10 01 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 03 00 00 00 2D 00 00 00 01 00 00 00
он вохвращает потом как
Код:
45 0F
Добавлено через 4 минуты
PS скрипт должен переносить панельу с евса на главного чара

Последний раз редактировалось supernewbie, 10.07.2010 в 21:12. Причина: Добавлено сообщение
supernewbie вне форума   Ответить с цитированием
Старый 10.07.2010, 21:47   #28
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

delphi Код:
panelki[1] := hstr('45 05 00 00 00 02 00 00 00 0D 00 00 00 93 04 00 00 06 00 00 00 00 01 00 00 00 02 00 00 00 00 00 00 00 CE 04 00 00 06 00 00 00 00 01 00 00 00 01 00 00 00 02 00 00 00 EB 9A 10 10 01 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 0B 00 00 00 A3 34 11 10 01 00 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 03 00 00 00 2D 00 00 00 01 00 00 00'); showmessage(strtohex(panelki[1]));

забавно...

контрольный вопрос.
версия пх ?.
__________________
L2Ext - project closed.
alexteam вне форума   Ответить с цитированием
Старый 10.07.2010, 21:53   #29
Местный
 
Аватар для supernewbie
 
Регистрация: 23.09.2009
Сообщений: 1,232
Сказал Спасибо: 119
Имеет 172 спасибок в 134 сообщенях
supernewbie пока неопределено
По умолчанию

3.5.28.151
supernewbie вне форума   Ответить с цитированием
Старый 10.07.2010, 21:59   #30
Рыцарь
 
Аватар для alexteam
 
Регистрация: 07.03.2009
Сообщений: 9,139
Сказал Спасибо: 70
Имеет 2,820 спасибок в 1,735 сообщенях
alexteam на пути к лучшему
По умолчанию

весьма интересная неведомая хрень. поправил чуток скрипт.
__________________
L2Ext - project closed.
alexteam вне форума   Ответить с цитированием
Ответ

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



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

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


Часовой пояс GMT +4, время: 22: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

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