Показать сообщение отдельно
Старый 15.10.2007, 16:14   #33
Новичок
 
Регистрация: 05.10.2007
Адрес: Украина
Сообщений: 19
Сказал Спасибо: 0
Имеет 23 спасибок в 13 сообщенях
DeVolf пока неопределено
По умолчанию

Код:
//Автоматизация заточки предметов до необходимого уровня by NLObP
    //Затачиваем поочереди все предметы с Weapon ID пока не переломаем или не заточим

    //Работа проверена на L2C4 Protocol 660 LocalServer "L2J FORTRESS"

    //Необходимо затариться оружием, заточками и валерьянкой
    //Открываем инвентарь для инициализации скрипта
    //Социальное действие YES начать
    //Социальное действие NO остановиться

    //Enjoy!

    {Disclaimer of Warranty. Unless required by applicable law or
    agreed to in writing, Licensor provides the Work (and each
    Contributor provides its Contributions) on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
    implied, including, without limitation, any warranties or conditions
    of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
    PARTICULAR PURPOSE. You are solely responsible for determining the
    appropriateness of using or redistributing the Work and assume any
    risks associated with Your exercise of permissions under this License.}

    //******************************************************************************
    const
      Name='DeVolf';
      Scroll=959; // ItemID  Scroll Enchant Weapon (Grade S)
      Weapon=6579; // ItemID Arcana Mace
      MaxEnchLvl=10; //max уровень заточки
      max=100;    //max количество предметов в базе
    var
    //  WpnObjID:  array[1..maxwpn,1..maxwpn] of integer;    //Weapon ObjID
      WpnBase:  array[1..2,1..max] of integer;    //Weapon ObjID,lvl
      ScrlBase:  array[1..max] of integer;    //Scroll ObjID
      add: boolean; //прошла заточка?
      timer: TTimer;
      CurEnchLvl, ColvoWpn, ColvoScrl, CurWpn, CurScrl: integer;
    //******************************************************************************
    procedure Init; //Вызывается при включении скрипта
    var
      i:integer;
    begin
      //Enchant:=false;
      CurEnchLvl:=0;
      timer:=TTimer.Create(nil);
      timer.OnTimer:=@OnTimerHP;
      timer.enabled:=false;
      timer.interval:=2500; //время задержки
      Say('Для инициализации скрипта, откройте инвентарь');
    end;
    //******************************************************************************
    procedure Free; //Вызывается при выключении скрипта
    begin
      WpnBase:=nil;
      ScrlBase:=nil;
      timer.Free;
    end;
    //******************************************************************************
    procedure Say(msg:string);
    begin
      buf:=hstr('4A 00 00 00 00');
      WriteD(2);
      WriteS(Name);
      WriteS(msg);
      SendToClientEx(Name);
    end;
    //******************************************************************************
    procedure CreateItemBase; //пакет 1B, Создает базу ObjectID по ItemID
    var
      i, ss, ww, j, ObjID, ItemID, lvl, ListCount: integer;
    begin
      ss:=1; //индекс в массиве скроллов
      ww:=1; //индекс в массиве предметов
      j:=4; //смещение для ListCount
      ListCount:=ReadH(j); //количество итемов не должно превышать max!
      if ListCount>max then ListCount:=max;
      j:=8; //смещение для ObjectID
      //Пробегаем по Инвентарю и сохраняем ObjectID соответствующие необходимым ItemID
      for i:=1 to ListCount do begin
         ObjID:=ReadD(j);      //ObjectID
         ItemID:=ReadD(j);    //ItemID
         j:=j+14;
         Lvl:=ReadD(j);    //Level
         case ItemID of
            scroll: begin
                ScrlBase[ss]:=ObjID;
                ss:=ss+1;
                //Say('ColvoScrl='+IntToStr(ss));
            end;
            weapon: begin
                WpnBase[1,ww]:=ObjID;
                WpnBase[2,ww]:=lvl;
                ww:=ww+1;
                //Say('ColvoWpn='+IntToStr(ww));
            end;
         end;
        j:=j+2;
      end;
      ColvoWpn:=ww-1;
      ColvoScrl:=ss-1;
      Say('>ColvoWpn='+IntToStr(ColvoWpn)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl));
    end;
    //******************************************************************************
    procedure UpdateItemBase; //пакет 27, Создает базу ObjectID по ItemID
    var
      i, ii, j, ss, ww, ObjID, ItemID, Lvl, ListCount, UpdType: integer;
    begin
      ListCount:=ReadH(2); //количество итемов
      //Пробегаем по Инвентарю и сохраняем пары ObjectID - Lvl
      j:=4; //смещение для действия с предметом 1-добавлен 2-изменен 3-удален
    //  Say('Апдейт базы!');
      for i:=1 to ListCount do begin
        UpdType:=ReadH(j);
        j:=j+2;
        ObjID:=ReadD(j);
        ItemID:=ReadD(j);
        j:=j+14;
        Lvl:=ReadH(j);
    //    Say('Предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(ItemID));
        case UpdType of
          1:case ItemID of
              weapon: begin
                ColvoWpn:=ColvoWpn+1;
                //Say('Добавили предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(weapon));
                for ii:=1 to max do
                  if WpnBase[1,ii]=0 then begin WpnBase[1,ii]:=ObjID; WpnBase[2,ii]:=lvl; end;
              end;
              scroll: begin
                ss:=ss+1;
                //Say('Добавили скролл! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(scroll));
                for ii:=1 to max do
                  if ScrlBase[ii]=0 then ScrlBase[ii]:=ObjID;
              end;
          end;
          2:case ItemID of
              weapon:
                for ii:=1 to max do
                  if WpnBase[1,ii]=ObjID then WpnBase[2,ii]:=lvl;
              scroll:
                //Say('Внимание! Изменения в скролле!?');
          end;
          //удален
          3:case ItemID of
              weapon: begin
                 ColvoWpn:=ColvoWpn-1;
                 for ii:=1 to max do
                  if WpnBase[1,ii]=ObjID then begin WpnBase[1,ii]:=0; WpnBase[2,ii]:=0; end;
                  //Say('Удаляем предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(weapon));
              end;
              scroll: begin
                 ColvoScrl:=ColvoScrl-1;
                 for ii:=1 to max do
                  if ScrlBase[ii]=ObjID then ScrlBase[ii]:=0;
                  //Say('Удаляем скролл! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(scroll));
              end;
          end;
        end;
        j:=j+2; //следующее смещение для действия с предметом 1-добавлен 2-изменен 3-удален
      end;
      Say('>>ColvoWpn='+IntToStr(ColvoWpn)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl));
    end;
    //******************************************************************************
    function GetNextWeapon: integer; //Выдает ObjID предмета, если  не найден в базе, выдает -1,
    //достигли макс уровня заточки -2, подбираем мин текущий уровень заточки -3
    var
      i: integer;
    begin
      Result:=-1;
      if CurEnchLvl>=MaxEnchLvl then begin
        Result:=-2;
        exit;
      end;
      for i:=1 to max do begin
        //находим первый подходящий предмет
        if (WpnBase[1,i]<>0) and (WpnBase[2,i]<=CurEnchLvl) then begin
          Result:=WpnBase[1,i];
          exit;
        end;
      end;
      CurEnchLvl:=CurEnchLvl+1;
      Result:=-3;
    end;
    //******************************************************************************
    function GetNextScroll: integer; //Выдает ObjID скролла, если  не найден в базе, выдает -1
    var
      i: integer;
    begin
      Result:=-1;
      for i:=1 to max do begin
        //находим первый подходящий предмет
        if (ScrlBase[i]<>0) then begin
          Result:=ScrlBase[i];
          exit;
        end;
      end;
    end;
    //******************************************************************************
    procedure UseItem(ObjectID: integer);
    begin
      buf:=#$14;
      WriteD(ObjectID);
      WriteD(0);
      SendToServerEx(Name);
    end;
    //******************************************************************************
    procedure RequesEnchantItem(ObjectID: integer);
    begin
      buf:=#$58;
      WriteD(ObjectID);
      SendToServerEx(Name);
    end;
    //******************************************************************************
    procedure OnTimerHP(Sender: TObject);
    var
      wpn, scrl:integer;
    begin
        if ColvoScrl=0 then begin
          Say('Кончились скроллы! Прервано!');
          timer.enabled:=false;
          exit;
        end;
        if ColvoWpn=1 then begin
          Say('Остался последний предмет! Прервано!');
          timer.enabled:=false;
          exit;
        end;
        Scrl:=GetNextScroll;
        if scrl=-1 then begin
          Say('Нет такой заточки! Прервано!');
          timer.enabled:=false;
          exit;
        end;
        Wpn:=GetNextWeapon;
        case wpn of
        -1: begin
              Say('Нет такого предмета! Прервано!');
              timer.enabled:=false;
              exit;
           end;
        -2: begin
              Say('Достигли максимальный уровень заточки! Прервано!');
              timer.enabled:=false;
              exit;
            end;
        -3: begin
              //Say('Подбираем текущий уровень заточки!');
              timer.enabled:=true;
              exit;
            end;
        end;
        //************************************************
        UseItem(Scrl);
        RequesEnchantItem(Wpn);
        //************************************************
        Say('Заточили предмет! Weapon='+IntToStr(Wpn));
    end;
    //******************************************************************************
    // вызывается при приходе каждого пакета, если скрипт включен
    //******************************************************************************
    begin
      //****************************************************************************
      //не обрабатываем пустые пакеты
      if pck='' then exit;
      //****************************************************************************
      //социальное действие yes для начало точки
      if FromClient and (ConnectName=Name) and (pck=HStr('1B 06 00 00 00')) then begin
        CurEnchLvl:=0;
        Say('Команда Старт!!!');
        timer.enabled:=true;
      end;
      //****************************************************************************
      //социальное действие no для начало точки
      if FromClient and (ConnectName=Name) and (pck=HStr('1B 05 00 00 00')) then begin
        Say('Команда Стоп!!!');
        timer.enabled:=false;
      end;
      //****************************************************************************
      //ItemList
      if FromServer and (ConnectName=Name) and (pck[1]=#$1B) then CreateItemBase; //создание базы предметов
    //  if (ColvoWpn=0) or (ColvoScrl=0) then exit; //если нет базы итемов, скрипт дальше не пустит
      //****************************************************************************
      //если удалились предметы, стираем в базе предметов пары ObjectID - ItemID
      if FromServer and (ConnectName=Name) and (pck[1]=#$27) then UpdateItemBase; //Обновление базы, если принят пакет на удаление предмета
    end.
усе подставил всеравно говорить что кончились скролы
DeVolf вне форума   Ответить с цитированием