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

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

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 12.12.2008, 18:22   #31
Местный
 
Аватар для wanick
 
Регистрация: 20.09.2008
Сообщений: 133
Сказал Спасибо: 32
Имеет 54 спасибок в 22 сообщенях
wanick пока неопределено
По умолчанию

вообще обсуждение не в теме, но все же в последних версиях вроде бы добавилась , еще расположение предмета в инвентаре попробуй увеличить это число
wanick вне форума   Ответить с цитированием
Старый 12.12.2008, 18:36   #32
Рыцарь
 
Аватар для NLObP
 
Регистрация: 25.02.2008
Адрес: г.Волгоград
Сообщений: 2,009
Сказал Спасибо: 1,285
Имеет 1,458 спасибок в 793 сообщенях
NLObP пока неопределено
По умолчанию

Это пакет для Т1 и выше от Саурона, если его чуть поправить(последнее d(?)), то станет подходить для Грации.

Код:
11=ItemList:h(psize)c(ID)h(ShowWindow)h(count:For.0022)h(ItemType1)d(ObjectID)d(ItemID:Get.Func01)d(LocationSlot)d(Count)h(ItemType2)h(CustomType1)h(isEquipped)d(BodyPart)h(EnchantLevel)h(CustType2)d(AugmentationID)d(Mana)d(AttackAttrElement)d(AttackAttrElementVal)d(DefAttrFire)d(DefAttrWater)d(DefAttrWind)d(DefAttrEarth)d(DefAttrHoly)d(DefAttrUnholy)d(?)
PS: Для того, чтобы быстро найти пакет в просмотре надо выбрать первый и быстро набрать первые 2-3 символа названия пакета, получается типа быстрый поиск первого подходящего.
__________________
| Для самых ленивый | Телепаты в отпуске |Мы работаем над этим |
Не умеешь - учись, не хочешь учиться - плати © Суровый Закон Жизни



Последний раз редактировалось NLObP, 12.12.2008 в 18:45.
NLObP вне форума   Ответить с цитированием
Старый 23.02.2009, 15:04   #33
Новичок
 
Регистрация: 17.02.2009
Сообщений: 13
Сказал Спасибо: 10
Имеет 1 спасибку в 1 сообщении
Insane* пока неопределено
По умолчанию

Добрый день!
Я использую скрипт QaK-а с первой страницы, опечатка исправлена.
Возникает такая проблема, без изменений в скрипте я добавляю следующее:
Код:
procedure Say(msg:string);
begin 
  buf:=hstr('4A 00 00 00 00'); 
  WriteD(2); 
  WriteS(Name); 
  WriteS(msg); 
  SendToClientEx(Name); 
end;


//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
if FromServer then
   begin if (pck[1]=#$1B) then
         begin CreateItemBase;
               exit;
         end;
         if (pck[1]=#$27) then
         begin UpdateItemBase;
               exit;
         end;
    end;
if FromClient and (pck=#$1B#06#00#00#00) then begin
useitem(356);
pck:=HStr('14 CD 01 42 10 00 00 00 00 ');
SendToServer;
say('we');
end;


end.
Выделенное фиолетовым явно не выполняется (как я понял не выдирается ОИД предмета)
Хотя если я сам нахожу ОИД предмета, например стопки зелий и составляю пакет:
pck:=HStr('14 CD 01 42 10 00 00 00 00 ');
то он проходит.
Сервер на Интерлюде. Подскажите, пожалуйста в чем моя ошибка?
Заранее спасибо.
З.Ы. полный текст скрипта:
Код:
//Инвентаризация by QaK
const
name='UltraRich';


var
    ItemCount:integer; //количество занятых слотов/количество вещей
    Inventory: array[1..250,1..10]of integer; //массив инвентаря
    //инвентарь
    //1 - ItemType1
    //2 - ObjectID
    //3 - ItemID
    //4 - ItemCount
    //5 - ItemType2
    //6 - CustType1
    //7 - IsEquipped
    //8 - BodyPart
    //9 - EnchantLevel
    //10 - CustType2
procedure Init; //Вызывается при включении скрипта
begin

end;

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

end;

//процедура считывания параметров одного предмета
procedure ItemAction(var Counter:integer;CurrentSlot:integer);
//Counter - Позиция считываемая из пакета, модифицируется функциями ReadC,ReadD
//CurrentSlot - Индекс в массиве Inventory (от 1 до 250)
var c1:integer;
begin
for c1:=1 to 10 do
begin //Если значение однобайтное
      if (c1=1)or(c1=5)or(c1=6)or(c1=7)or(c1=9) then
      begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
            inc(Counter);
      end;
      //Если значение четырехбайтное
      if (c1=2)or(c1=3)or(c1=4)or(c1=8) then
      begin Inventory[CurrentSlot,c1]:=ReadD(Counter);
      end;
      //Если значение последнее
      if c1=10 then
      begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
            Counter:=Counter+2;
      end;
end;
end;

//Пакет от сервера 1В - создаем или модифицируем весь инвентарь
procedure CreateItemBase;
var
i,j: integer;
begin
ItemCount:=ReadC(4);//Считываем количество вещей в инвентаре
j:=6;
for i:=1 to ItemCount do ItemAction(j,i);
end;

//Пакет от сервера 27 - действия (доавить/изменить/удалить) над одним/несколькими предметами
procedure UpdateItemBase;
var
  i,ij,ijk:integer; //простые счетчики для перебора значений
  j:integer; //Текущая позиция, откуда считываем значения из пакета
  count:integer; //Количество изменяемых предметов
  Action: integer; //Действие над предметом
  k:boolean; //Нашли ли мы удаляемый предмет?
begin
  k:=false;
  count:=ReadC(1);//Считываем количество изменяемых предметов
  j:=4;
  for i:=1 to count do
  begin Action:=ReadC(j);//Считываем действие
        inc(j);
  {ADD} if Action=1 then
           begin Inc(ItemCount);//Увеличиваем количество занятых слотов
                 ItemAction(j,ItemCount); //Добавляем предмет
           end;
{Update}if Action=2 then for ij:=1 to ItemCount do //Ищем изменяемый предмет по ObjectID
                         If Inventory[ij,2]=ReadD((j-1)*30+8) then //Если нашли
                            begin ItemAction(j,ij); //Изменяем данные о нем
                                  exit;             //Больше проверять не надо - выходим из цикла
                            end;
{Delete}if Action=3 then begin for ij:=1 to ItemCount-1 do //Ищем удаляемый предмет
                                   begin If Inventory[ijk,2]=ReadD((j-1)*30+8) then k:=true; //Если нашли,фиксируем это
                                         If k then //если найден удаляемы объект
                                            for ijk:=1 to 10 do //то сдвигаем элементы массива-инвентаря
                                            Inventory[ij,ijk]:=Inventory[ij+1,ijk];
                                   end;
                               Dec(ItemCount);//Уменьшаем количество занятых слотов
                         end;
  end;
end;

//Получить ObjectID предмета, зная его ItemID
function GetInfo(ItemID:integer):integer;
var c1:integer;
begin Result:=-1;
      for c1:=1 to ItemCount do
      if (ItemID=Inventory[c1,3]) then
      begin Result:=Inventory[c1,2];
            exit;//Если нашли - выходим из цикла
      end;
end;

//Использовать предмет с заданным ItemID
procedure UseItem(ItemID:integer);
var c1:integer;
begin
for c1:=1 to ItemCount do
if (ItemID=Inventory[c1,3]) then
begin buf:=#$14;
      WriteD(Inventory[c1,2]);
      WriteD(0);
      SendToServer;
      exit; //Чтоб не использовать несколько предметов с одинаковым ItemID (например заточки)
end;
end;

procedure Say(msg:string);
begin 
  buf:=hstr('4A 00 00 00 00'); 
  WriteD(2); 
  WriteS(Name); 
  WriteS(msg); 
  SendToClientEx(Name); 
end;


//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
if FromServer then
   begin if (pck[1]=#$1B) then
         begin CreateItemBase;
               exit;
         end;
         if (pck[1]=#$27) then
         begin UpdateItemBase;
               exit;
         end;
    end;
if FromClient and (pck=#$1B#06#00#00#00) then begin
useitem(356);
pck:=HStr('14 CD 01 42 10 00 00 00 00 ');
SendToServer;
say('we');
end;


end.
Insane* вне форума   Ответить с цитированием
Старый 23.02.2009, 15:54   #34
Рыцарь
 
Аватар для Grinch
 
Регистрация: 29.02.2008
Сообщений: 928
Сказал Спасибо: 127
Имеет 130 спасибок в 93 сообщенях
Grinch пока неопределено
По умолчанию

Insane*, а массив заполняется инвентарём, помнится там был какой то багнутый скрипт, а если мне память не изменяет исправленный и рабочий, кроме меня и Квака ни кто не видел
Grinch вне форума   Ответить с цитированием
За это сообщение Grinch нажился спасибкой от:
Старый 23.02.2009, 16:36   #35
Рыцарь
 
Аватар для QaK
 
Регистрация: 28.09.2007
Сообщений: 1,558
Сказал Спасибо: 71
Имеет 351 спасибок в 244 сообщенях
QaK пока неопределено
По умолчанию

Insane*, этот скрипт писался под ц4 давным-давно, нужно посотреть и , скорее всего четок переписать под ИЛ.
QaK вне форума   Ответить с цитированием
За это сообщение QaK нажился спасибкой от:
Старый 23.02.2009, 18:13   #36
Новичок
 
Регистрация: 17.02.2009
Сообщений: 13
Сказал Спасибо: 10
Имеет 1 спасибку в 1 сообщении
Insane* пока неопределено
По умолчанию

QaK, методом тыка определил (взял другой скрипт), что проблема судя по всему в смещении. Как я понял, надо использовать формулу j*22+6 для определения ОИД.
Insane* вне форума   Ответить с цитированием
Старый 23.02.2009, 22:08   #37
Рыцарь
 
Аватар для QaK
 
Регистрация: 28.09.2007
Сообщений: 1,558
Сказал Спасибо: 71
Имеет 351 спасибок в 244 сообщенях
QaK пока неопределено
По умолчанию

Insane*, формулу сам подбери, я давно этот скрипт не юзал - поэтому не помню =) скорее всего ты прав - в смещении.
QaK вне форума   Ответить с цитированием
Старый 10.03.2009, 19:23   #38
Пользователь
 
Регистрация: 05.02.2009
Сообщений: 62
Сказал Спасибо: 1
Имеет 18 спасибок в 9 сообщенях
lexayar пока неопределено
По умолчанию

Предлагаю расширенный вариант функции "Пауза". При котором можно независимо вызывать несколько пауз в разных местах скрипта.
Код:
// пауза в секундах
function Wait(var tick: integer; Timewait: Integer): Boolean;
var
  t: integer;
begin
  result:=false;
  t:=Round(Time*86400);
  if t>(tick+Timewait) then begin
    if tick>0 then result:=true;
    tick:=t;
  end;
end;
lexayar вне форума   Ответить с цитированием
Старый 30.04.2009, 09:22   #39
Новичок
 
Регистрация: 29.04.2009
Сообщений: 1
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
alexPPP пока неопределено
По умолчанию

Всем доброго времени суток.
У меня пару вопросов по скрипту "инвентаризации" от QaK. Для Gracia Part2
Код:
Код:
var 
ItemCount:integer;
Inventory: array[1..75,1..22]of integer;

//процедура считывания параметров одного предмета
procedure ItemAction(var Counter:integer;CurrentSlot:integer);
var c1:integer;
begin
for c1:=1 to 22 do
begin 
      if (c1=1)or(c1=6)or(c1=7)or(c1=8)or(c1=11) then
      begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
            inc(Counter);
      end;
      
      if (c1=2)or(c1=3)or(c1=4)or(c1=5)or(c1=9)or(c1=12)or(c1=13)or(c1=14)or(c1=15)or(c1=16)or(c1=17)or(c1=18)or(c1=19)or(c1=20)or(c1=21)or(c1=22) then
      begin Inventory[CurrentSlot,c1]:=ReadD(Counter);
      end;
     
      if c1=10 then
      begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
            Counter:=Counter+2;
      end;
end;
end;

//Пакет от сервера 11 - создаем или модифицируем весь инвентарь
procedure CreateItemBase;
var
i,j: integer;
begin
ItemCount:=ReadC(4);
j:=6;
for i:=1 to ItemCount do ItemAction(j,i);
end;

//Пакет от сервера 21 - действия (доавить/изменить) над одним/несколькими предметами
procedure UpdateItemBase;
var
  i,ij,ijk:integer; 
  j:integer; 
  count:integer;
  Action: integer; 
  k:boolean;
begin
  k:=false;
  count:=ReadC(1);
  j:=4;                       
  for i:=1 to count do
  begin Action:=ReadC(j);
        inc(j);
  {ADD} if Action=1 then
           begin Inc(ItemCount);
           
                 ItemAction(j,ItemCount);
           end;
{Update}if Action=2 then for ij:=1 to ItemCount do //Ищем изменяемый предмет по ObjectID
                        If Inventory[ij,2]=ReadD((j-1)*22+6) then //Если нашли
                            begin ItemAction(j,ij); //Изменяем данные о нем
                                  exit;             //Больше проверять не надо - выходим из цикла
                            end;
  end;
end;

//Получить ObjectID предмета, зная его ItemID
function GetInfo(ItemID:integer):integer;
var c1:integer;
begin Result:=-1;
      for c1:=1 to ItemCount do
      if (ItemID=Inventory[c1,3]) then
      begin Result:=Inventory[c1,2];
            exit;//Если нашли - выходим из цикла
      end;
end;


//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
if FromServer then
   begin if (pck[1]=#$11) then
         begin CreateItemBase;
               exit;
         end;
         if (pck[1]=#$21) then
         begin UpdateItemBase;
               exit;
         end;
    end;                                           
    
end.
Так вот.... мне интерессно почему:
1. В оригинале скрипта:
Код:
 if (c1=1)or(c1=5)or(c1=6)or(c1=7)or(c1=9) then
      begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
преобразовывается в ReadC, когда в самом описании пакета идет h.
2. Для чего введена переменная "j" в procedure CreateItemBase; и procedure UpdateItemBase; и какие значения она может принимать?
3. Где задаются значения переменных для {ADD} item-а ( все его 22 параметра) т.е Для создания нового предмета мне нужно "сказать" ObjID=XXXX, ItemID=XXX и т.д Где это делается.
Как я думаю нужно создать форму с инпут параметрами, которые будут принимать вводимые мною значения и что-то типа чекбокса для выполнения действий (Action=1 и Action=2) ну и кнопку чтоб запустить нужные продцедуры. Если мои предположения верны не могли бы вы
подкинуть заготовку такой лио похожей формы.

Спасибо.

И еще 1 вопрос. Получается этот скрипт работает с инвентарем на стороне клиента.
тоесть если мы добавим/редактируем свойство item-a то это изменение произойдет только на клиентской стороне, а при повторном запросе клиентом серверу о содержимом его инвентаря, он вернет значения из БД, так как будет "тягать" данные из своей БД. В соответсвии с этим у меня вопросс: Какой смысл использования этого скрипта? =)

Последний раз редактировалось alexPPP, 30.04.2009 в 09:27.
alexPPP вне форума   Ответить с цитированием
Старый 30.04.2009, 09:30   #40
Рыцарь
 
Аватар для QaK
 
Регистрация: 28.09.2007
Сообщений: 1,558
Сказал Спасибо: 71
Имеет 351 спасибок в 244 сообщенях
QaK пока неопределено
По умолчанию

1)
Цитата:
Сообщение от alexPPP Посмотреть сообщение
преобразовывается в ReadC, когда в самом описании пакета идет h.
потому, что скрипт писался очень давно, не помню под какие хроники, и там я смотрел, что второй байтик всегда = 0, поэтому читал 1 байт и усё=)
2)
Цитата:
Сообщение от alexPPP Посмотреть сообщение
Для чего введена переменная "j" в procedure CreateItemBase; и procedure UpdateItemBase; и какие значения она может принимать?
Переменная J в CreateItemBase введена, чтоб по пакету полностью пройтись, т.к. поцедура ItemAction модифицирует значение переменной J, аналогично для UpdateItemBase.
3)
Цитата:
Сообщение от alexPPP Посмотреть сообщение
Где задаются значения переменных для {ADD} item-а ( все его 22 параметра) т.е Для создания нового предмета мне нужно "сказать" ObjID=XXXX, ItemID=XXX и т.д Где это делается.
Как я думаю нужно создать форму с инпут параметрами, которые будут принимать вводимые мною значения и что-то типа чекбокса для выполнения действий (Action=1 и Action=2) ну и кнопку чтоб запустить нужные продцедуры. Если мои предположения верны не могли бы вы
подкинуть заготовку такой лио похожей формы.
Значения переменных читаются из приходящего от сервера пакета. А то, что ты хочешь подменить ИД предмета называтся читерством, что очень сильно не есть гуд, это не чит-форум.

З.Ы. Скрипт глючный, сразы говорю, я его вроде не до конца профиксил. Возьми обработку инвентаря из скрипта Бот кач by Alexus или как-то так.

З.Ы.Ы. для грации нужно еще редактировать разборку пакетов и ИД пакетов для обработки.
QaK вне форума   Ответить с цитированием
Ответ

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


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

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

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


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

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

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