Показать сообщение отдельно
Старый 19.10.2008, 04:28   #487
Новичок
 
Регистрация: 05.10.2008
Сообщений: 10
Сказал Спасибо: 4
Имеет 1 спасибку в 1 сообщении
creaDo пока неопределено
По умолчанию

delphi Код:
//Автоматизация заточки предметов до необходимого уровня by NLObP //Адаптированая под Gracia by CreaDo     //Затачиваем поочереди все предметы с 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='Fatish';       Scroll=959; // 959 - ItemID Scroll Enchant Weapon (Grade S)       Weapon=9866; // 9866 - ItemID Dinasty dager focus (Grade S80)       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: 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, sc, 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+4;      sc:=readD(j);      j:=j+10;      Lvl:=ReadH(j);    //Level      say(inttostr(lvl));      case ItemID of         scroll: begin         ss:=sc;         ScrlBase:=ObjID; //                        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+44   //Gracia //    j:=j+2; //для С4 //    j:=j+10; //для Интерлюдии   end;   ColvoWpn:=ww-1;   ColvoScrl:=ss;   Say('>ColvoWpn='+IntToStr(ColvoWpn)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl)); end;     //****************************************************************************** procedure UpdateItemBase; //пакет 27, Создает базу ObjectID по ItemID var   i, ii, j, ss, sc, 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);      //ObjectID      ItemID:=ReadD(j);    //ItemID      j:=j+4;      sc:=readD(j);      j:=j+10;      Lvl:=ReadH(j);    //Level //    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;           if ScrlBase=0 then ScrlBase:=ObjID;           end;       end;       2:case ItemID of           weapon:             for ii:=1 to max do               if WpnBase[1,ii]=ObjID then begin WpnBase[2,ii]:=lvl; say(inttostr(WpnBase[2,ii])); end;           scroll:   sc:=ss;             //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=ObjID then ScrlBase:=0;               //Say('Удаляем скролл! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(scroll));           end;       end;     end;     j:=j+44; //    j:=j+2; //для С4 //    j:=j+10; //для Интерлюдии   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<>0) then begin           Result:=ScrlBase;           exit;         end;       end;     end;     //******************************************************************************     procedure UseItem(ObjectID: integer);     begin       buf:=#$19;       WriteD(ObjectID);       WriteD(0);       SendToServerEx(Name);     end;     //******************************************************************************     procedure RequesEnchantItem(ObjectID: integer);     begin       buf:=#$5F;       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('34 06 00 00 00')) then begin         CurEnchLvl:=0;         Say('Команда Старт!!!');         timer.enabled:=true;       end;       //****************************************************************************       //социальное действие no для начало точки       if FromClient and (ConnectName=Name) and (pck=HStr('34 05 00 00 00')) then begin         Say('Команда Стоп!!!');         timer.enabled:=false;       end;       //****************************************************************************       //ItemList       if FromServer and (ConnectName=Name) and (pck[1]=#$11) then CreateItemBase; //создание базы предметов     //  if (ColvoWpn=0) or (ColvoScrl=0) then exit; //если нет базы итемов, скрипт дальше не пустит       //****************************************************************************       //если удалились предметы, стираем в базе предметов пары ObjectID - ItemID       if FromServer and (ConnectName=Name) and (pck[1]=#$21) then UpdateItemBase; //Обновление базы, если принят пакет на удаление предмета     end.
Протестил все работает
creaDo вне форума   Ответить с цитированием
За это сообщение creaDo нажился спасибкой от: