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

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

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 10.03.2009, 19:23   #1
Пользователь
 
Регистрация: 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   #2
Новичок
 
Регистрация: 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   #3
Рыцарь
 
Аватар для 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 вне форума   Ответить с цитированием
Старый 06.08.2009, 18:39   #4
Рыцарь
 
Аватар для TAMBIK
 
Регистрация: 03.03.2009
Сообщений: 773
Сказал Спасибо: 361
Имеет 300 спасибок в 168 сообщенях
TAMBIK на пути к лучшему
По умолчанию function / procedure

Код:
function EncodeDate(Year, Month, Day: Word): TDateTime  
перевод года, месяца и дня в формат даты

procedure DecodeDate(Date: TDateTime; var Year, Month, Day: Word) 
Перевод даты в года, месяц и день

function EncodeTime(Hour, Min, Sec, MSec: Word): TDateTime  
Перевод часов, минут и секунд в формат времени

procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word) 
Перевод времени в часы, минуты и секунды

function Date: TDateTime  
Текущая дата

function Time: TDateTime  
Текущее время

function Now: TDateTime 
Текущие дата и время

function DayOfWeek(aDate: DateTime): Integer  
День недели

function IsLeapYear(Year: Word): Boolean  
Високосный год

function DaysInMonth(nYear, nMonth: Integer): Integer 
Дней в месяце

function IntToStr(i: Integer): String 
Перевод целого в строку

function FloatToStr(e: Extended): String  
Перевод числа с плавающей запятой в строку

function DateToStr(e: Extended): String 
Перевод даты в строку

function TimeToStr(e: Extended): String 
Перевод времени в строку

function DateTimeToStr(e: Extended): String 
Перевод даты и времени в строку
  
function VarToStr(v: Variant): String
Перевод variant в строку

function StrToInt(s: String): Integer 
Перевод строки в целое

function StrToFloat(s: String): Extended  
Перевод строки в число с плавающей запятой

function StrToDate(s: String): Extended 
Перевод строки в дату

function StrToTime(s: String): Extended 
Перевод строки во время

function StrToDateTime(s: String): Extended 
Перевод строки в дату и время

function Round(e: Extended): Integer  
Округление до ближайшего

function Trunc(e: Extended): Integer  
Округление до меньшего

function Int(e: Extended): Integer  
Возвращает целую часть

function Frac(X: Extended): Extended  
Возвращает дробную часть

function Sqrt(e: Extended): Extended  
Возвращает квадратный корень

function Abs(e: Extended): Extended 
Возвращает модуль числа

function Sin(e: Extended): Extended 
Синус

function Cos(e: Extended): Extended 
Косинус

function ArcTan(X: Extended): Extended  
Арктангенс

function Tan(X: Extended): Extended 
Тангенс

function Exp(X: Extended): Extended 
Экспонента

function Ln(X: Extended): Extended  
Натуральный логарифм

function Pi: Extended 
Число Пи
__________________
Тут не форум гадалок, если ты делаешь все правильно и по пунктам - то все должно работать
TAMBIK вне форума   Ответить с цитированием
За это сообщение TAMBIK нажился спасибкой от:
Старый 13.08.2009, 12:46   #5
Рыцарь
 
Аватар для TAMBIK
 
Регистрация: 03.03.2009
Сообщений: 773
Сказал Спасибо: 361
Имеет 300 спасибок в 168 сообщенях
TAMBIK на пути к лучшему
По умолчанию является ли символ

что то нашел может пригодится
Код:
Как определить, является ли символ буквой русского алфавита, буквой английского алфавита, является ли символ цифрой?

Как определить, является ли символ буквой русского алфавита?

function isAlphaRu( c: Char ): boolean;
begin
   Result := Ord( c ) in [168,184,192..223,224..255];
end;

Как определить, является ли символ буквой английского алфавита?

function isAlphaEn( c: Char ): boolean;
begin
   Result := Ord( c ) in [65..90,97..122];
end;

Как определить, является ли символ цифрой?

function isDigit( c: Char ): boolean;
begin
   Result := Ord( c ) in [48..57];
end;
Код:
procedure Inc(var i: Integer; incr: Integer = 1)  
Инкремент

procedure Dec(var i: Integer; decr: Integer = 1)  
Декремент

procedure RaiseException(Param: String) 
Генерация исключения

procedure ShowMessage(Msg: Variant) 
Вывод сообщения

procedure Randomize 
Инициализация генератора псевдослучайных чисел

function Random: Extended 
Генерация псевдослучайного числа

function ValidInt(cInt: String): Boolean  
Проверка валидности целого в строке

function ValidFloat(cFlt: String): Boolean  
Проверка валидности цисла с плавающей запятой в строке

function ValidDate(cDate: String): Boolean  
Проверка валидности даты в строке

function CreateOleObject(ClassName: String): Variant
Создание OLE-объекта

function VarArrayCreate(Bounds: Array; Typ: Integer): Variant
Создание динамического массива
__________________
Тут не форум гадалок, если ты делаешь все правильно и по пунктам - то все должно работать

Последний раз редактировалось TAMBIK, 13.08.2009 в 13:19.
TAMBIK вне форума   Ответить с цитированием
За это сообщение TAMBIK нажился спасибкой от:
Старый 01.06.2010, 14:17   #6
Новичок
 
Регистрация: 03.01.2009
Сообщений: 12
Сказал Спасибо: 4
Имеет 1 спасибку в 1 сообщении
Rifleman пока неопределено
Сообщение Макрос средствами пакетхака

Решил выложить свою разработку. Может, кому пригодится. Для Hellbound'а.
Суть кода: В массиве задаётся последовательность действий, это может быть просто пакет в формате строки (например '39 2A 01 00 00 00 00 00 00 00'), либо какая-то спец команда (например 'Attack').
Далее, по таймеру считываются последовательно строки массива, и то, что там записано отправляется на выполнение. Т.к. время на выполнение скилла может быть различное в зависимости от ситуации, то для такого случая я ввёл динамически изменяющееся время у таймера. Как только от серва приходит пакет с использованием скилла, скрипт считывает время использования и задаёт его таймеру + некоторая поправка.
Код:
Const
   NICK='Указываете ваш ник';
var
 tmrActions:  TTimer; // Таймер для последовательность действий
 Actions:    Array[0..10, 0..2] of String;  //Массив действий. 
{Записываются в ячейки массива пакеты, которые нужно послать. Далее, по таймеру посылается следующий пакет из списка.
 Первый индекс массива - номер действия, второй индекс: 
 0 - собственно действие, 1 - Параметр действия (напр. Ид скилла), 2 - время таймера до следующего действия
}
 MyID, : Integer;
 NumAct:     Integer; // Номер текущего действия
 IsSkill: Boolean; // Показывает, используем ли мы скилл в данный момент

Procedure UseSkill(ID: Integer); // Процедура использования скилла
begin
  buf:=#$39;
  WriteD(ID);
  WriteD(0);
  WriteC(0);
  SendToServerEX(NICK);
end;

Procedure OntmrAction(Sender: TObject); 
begin
   Case Actions[NumAct, 0] of // Сдесь мы определяем тип действия.
   'Attack': begin // Атаковать текущую цель
                
             end;

   'Use':    begin // Использование предмета
                UseItem(StrToInt(Actions[NumAct, 1])); // Эта процедура может быть разная, потому не привожу
             end;

   'Skill':  begin // Использование скилла
                UseSkill(StrToInt(Actions[NumAct, 1]));
                IsSkill:= True;
             end;
   '-1':     begin // Останов макроса
                NumAct:=0;
                tmrActions.Enabled:=False;
                Times:=0;
                exit;
             end;
   else begin // Если же не приведена внутренняя команда, то просто отсылаем пакет
                buf:= Hstr(Actions[NumAct, 0]); 
                SendToServerEX(NICK);
        end;
   end;
   NumAct:= NumAct+1; 
   If (IsSkill=False) then tmrActions.Interval:= StrToInt(Actions[NumAct, 2]); // Изменяем время у таймера до следующего пункта
   //В случае скилла время изменяется считыванием нужного пакета
end;

procedure Init; //Вызывается при включении скрипта
begin
  tmrActions:= TTimer.Create(nil);
  tmrActions.OnTimer:= @OntmrAction;
  tmrActions.Enabled:= False;
  tmrActions.Interval:= 200;

  // 6590 - Angel Slayer
  // 6602 - Demon Splinter  (один из ))))
  // 425 - Hawk Spirit Totem
  // Макрос представляет из себя: Одеть Сплинтеры, потом юзнуть Хавка, одеть АС, начать атаку
  Actions[0, 0]:='Use';
  Actions[0, 1]:='6602';
  Actions[0, 2]:='300';  // Задаём время до следующего пункта, в мс

  Actions[1, 0]:='Skill';
  Actions[1, 1]:='425';
  Actions[1, 2]:='2000'; // В принципе, можно и не ставить

  Actions[2, 0]:='Use';
  Actions[2, 1]:='6590';
  Actions[2, 2]:='300';

  Actions[3, 0]:='Attack';
  Actions[3, 1]:='';
  Actions[3, 2]:='300';

  Actions[4, 0]:='-1';

  MyID:= -1;
end;

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

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
  if pck='' then exit;

  if FromServer and (ConnectName=NICK) then case pck[1] of
    #$32: Begin    // User Info
             If (MyID <> -1) then exit;
             MyID:=ReadD(18); // запоминаем наш ИД
          end;
    #$11: begin;  // Инвентаризация барахла в карманах
             InventoryCreate; // Инвентаризацию берите, какая удобнее
          end;
    #$21: Begin  // Обновление инвентаря
             InventoryUpdate;
          End;
    #$48: begin // MagicSkillUse 
             If (ReadD(2)<>MyID) Or (IsSkill=False) then Exit; // Если не мы юзаем - не обрабатываем
             tmrActions.Interval:= ReadD(18)+100; // Изменяем время у таймера с учётом времени произношения скилла, 100 - небольшая добавка, чтоб лучше работало
             IsSkill:= False;
          end;
  end;
end.
P.S. Из кода выкинул весь мусор, что мне был нужен, просьба очень "внимательно следить за запятыми в десятичных дробях" ©Р. Хайнлайн

Последний раз редактировалось Rifleman, 01.06.2010 в 14:33.
Rifleman вне форума   Ответить с цитированием
За это сообщение Rifleman нажился спасибкой от:
Старый 29.07.2010, 02:30   #7
Местный
 
Аватар для Breadfan
 
Регистрация: 29.04.2008
Сообщений: 830
Сказал Спасибо: 80
Имеет 230 спасибок в 169 сообщенях
Breadfan пока неопределено
По умолчанию

Автобег в указанную сторону: запустить скрипт, нажать "Приветствие", ткнуть мышкой в нужную сторону - бежит не останавливаясь пока не упрется. На ходу возможно изменение направления\шага пробежки. Интерлюд.
Оффтоп
__________________
На фразы в аську типа "слух карочь 1)как точить 2)как раскачаться за 5 мин" - игнор. ИМХО идиотизм
Дай голодному рыбу - он будет один день сыт. Покажи ему, как удить рыбу - он пошлёт тебя и скажет, что у него есть более интересные занятия, чем забрасывать снасти в воду
David Kastrup @ de.comp.text.tex.
"Приобретенные навыки общения с маленькими детьми - сильно упрощают взаимопонимание на форумах..."

А вы знаете, что для качественной сварки - место шва нужно протереть спиртом?
Breadfan вне форума   Ответить с цитированием
За это сообщение Breadfan нажился спасибкой от:
Старый 26.01.2012, 16:37   #8
Новичок
 
Регистрация: 22.01.2012
Сообщений: 3
Сказал Спасибо: 1
Имеет 2 спасибок в 2 сообщенях
brotherrus пока неопределено
По умолчанию

Часть моего бота для получения инвентаря (используется только для банок). Может кому пригодится. Использую на известном фришарде с HF P5.
DELPHI Код:
const     InventoryCountMax=250; var     Inventory:array[0..InventoryCountmax,1..3] of integer;     InventoryCount:integer; procedure GetItemsList; var     i:integer; begin     InventoryCount:=readH(4);     for i:=0 to InventoryCountMax do begin         Inventory[i,1]:=0;Inventory[i,2]:=0;Inventory[i,3]:=0;        end;     for i:=0 to InventoryCount do begin         Inventory[i,1]:=ReadD(6+i*68)//ObjID         Inventory[i,2]:=ReadD(10+i*68); //ItemID         Inventory[i,3]:=ReadD(18+i*68); //Count     end; end; function GetFromInventoryByID(id:integer):integer; var     i:integer; begin     result:=-1;     for i:=0 to InventoryCount do begin         if Inventory[i,2]=id then begin             result:=i;             break;         end;     end;    end; function GetFromInventoryByObjID(id:integer):integer; var     i:integer; begin     result:=-1;     for i:=0 to InventoryCount do begin         if Inventory[i,1]=id then begin             result:=i;             break;         end;     end;    end; procedure UpdateInventory; var     i,count,find,ObjID,m:integer; begin     count:=readH(2);     m:=readH(4);     if m=2 then begin         for i:=0 to count do begin             ObjID:=ReadD(6+i*68);             find:=GetFromInventoryByObjID(ObjId);             if find>-1 then begin                 Inventory[find,2]:=ReadD(10+i*68); //ItemID                 Inventory[find,3]:=ReadD(18+i*68); //Count                      end;          end;              end;     if m=3 then begin         for i:=0 to count do begin             ObjID:=ReadD(6+i*68);             find:=GetFromInventoryByObjID(ObjId);             if find>-1 then begin                 Inventory[find,1]:=0;                 Inventory[find,2]:=0;                 Inventory[find,3]:=0;             end;            end;        end;     if m=1 then begin         for i:=0 to count do begin             InventoryCount:=InventoryCount+1;             Inventory[InventoryCount,1]:=ReadD(6+i*68)//ObjID             Inventory[InventoryCount,2]:=ReadD(10+i*68); //ItemID             Inventory[InventoryCount,3]:=ReadD(18+i*68); //Count         end;        end; end;
DELPHI Код:
#$11: GetItemsList; #$21: UpdateInventory;
p.s. спасибо dyh9l за тег делфи)

Последний раз редактировалось brotherrus, 26.01.2012 в 17:02.
brotherrus вне форума   Ответить с цитированием
Старый 26.01.2012, 16:51   #9
Местный
 
Регистрация: 11.06.2010
Сообщений: 644
Сказал Спасибо: 119
Имеет 85 спасибок в 77 сообщенях
dyh9l пока неопределено
По умолчанию

тег делфи [ HIGHLIGHT="DELPHI"][/highlight]
__________________
dyh9l вне форума   Ответить с цитированием
За это сообщение dyh9l нажился спасибкой от:
Старый 01.04.2014, 23:03   #10
Пользователь
 
Регистрация: 01.08.2010
Сообщений: 82
Сказал Спасибо: 49
Имеет 5 спасибок в 4 сообщенях
semiromid пока неопределено
По умолчанию

...........
end;[/code]

StrToHex преобразование
Код:
//(c) xkor
function StrToHex(packet: string):string;
var
  i:integer;
  tmp:byte;

  function ByteToHex(b: byte): Char;
  begin
    if b<10 then result:=chr(b+$30)
      else result:=chr(b+$37);
  end;

begin
  result:='';
  for i:=1 to length(packet) do begin
    tmp:=ord(packet[i]) div 16;
    result:=result+ByteToHex(tmp);
    tmp:=ord(packet[i]) - tmp*16;
    result:=result+ByteToHex(tmp)+' ';
  end;
end;
пример использования
Код:
    hextr2:=hextostr(pck);
    SHOWMESSAGE(hextr2);
[/quote]

Подскажите пожалуйста , как правильно пользоваться этой функцией? У меня при компиляции ошибку выдает .
semiromid вне форума   Ответить с цитированием
Ответ

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



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

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


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

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

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