Главная | Регистрация | Вход Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Скрипт на заточку оружия L2phx
WolfДата: Четверг, 17.12.2009, 10:01 | Сообщение # 1
Король Lineage 2
Группа: Администраторы
Сообщений: 356
Награды: 11 [ 10026 ]
Статус: Offline
Code
//Автоматизация заточки предметов до необходимого уровня  
program zatochka_IL;  

{Затачиваем поочереди все предметы с WeaponID пока не переломаем или не заточим  

Работа проверена на локальном Интерлюда сервере  

Необходимо затариться оружием, заточками и валерьянкой.  

Социальное действие YES - начать заточку предметов  
Социальное действие NO - остановиться  

Enjoy!  

Скрипт распространяется как есть, и я не несу ответственности за то, что  
ВЫ натворили у себя, его используя.}  

const  
   Name='NLObP'; //Вписать сюда имя чара  
   ScrollID=955;     //957 ScrollID скролла заточки  
   ItemID=129;    //129 ItemIDID затачиваемого предмета  
   MaxEnchLvl=30;//уровень заточки который требуется достич  
   max=250;     //количество слотов в инвентаре чара, максимально - 250  

var  
   ItemBase:  array[1..2,1..max] of integer;    //ItemID ObjID, lvl  
   ScrollBase:  array[1..max] of integer;    //Scroll  
   add: boolean; //прошла заточка?  
   timer: TTimer;  
   CurEnchLvl, ColvoItem, ColvoScrl, CurItem, CurScrl: integer;  
   SocialID:integer; // вспомогательная  

procedure Init; //Вызывается при включении скрипта  
var  
   i:integer;  
begin  
   //Enchant:=false;  
   CurEnchLvl:=0;  
   timer:=TTimer.Create(nil);  
   timer.OnTimer:=@OnTimerHP;  
   timer.enabled:=false;  
   timer.interval:=500; //время задержки  
   add:=false;  
   for i:=1 to max do begin  
     //очищаем масив  
     //Say('очищаем масив');  
     ItemBase[1,i]:=0;  
     ItemBase[2,i]:=0;  
   end;  

   //Пакет RequestItemList  
   buf:=hstr('0F');  
   SendToServerEx(Name);  
end;  

//******************************************************************************  
procedure Free; //Вызывается при выключении скрипта  
begin  
   ItemBase:=nil;  
   ScrollBase:=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, ItmID, 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  
      ItmID:=ReadD(j);    //ItemID  
      j:=j+14;  
      Lvl:=ReadD(j);    //Level  
      case ItmID of  
         ScrollID: begin  
             ScrollBase[ss]:=ObjID;  
             inc(ss);  
             Say('ColvoScrl='+IntToStr(ss));  
         end;  
         ItemID: begin  
             ItemBase[1,ww]:=ObjID;  
             ItemBase[2,ww]:=lvl;  
             inc(ww);  
             Say('ColvoItem='+IntToStr(ww));  
         end;  
      end;  
     j:=j+10;  
   end;  
   ColvoItem:=ww-1;  
   ColvoScrl:=ss-1;  
   Say('>ColvoItem='+IntToStr(ColvoItem)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl));  
end;  

//******************************************************************************  
procedure UpdateItemBase; //пакет 27, Создает базу ObjectID по ItemID  
var  
   i, ii, j, ss, ww, ObjID, ItmID, 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);  
     ItmID:=ReadD(j);  
     j:=j+14;  
     Lvl:=ReadH(j);  
     Say('Предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(ItemID));  
     case UpdType of  
       1:case ItmID of  
           ItemID: begin  
             ColvoItem:=ColvoItem+1;  
             Say('Добавили предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(ItemID));  
             for ii:=1 to max do  
               if ItemBase[1,ii]=0 then begin ItemBase[1,ii]:=ObjID; ItemBase[2,ii]:=lvl; end;  
           end;  
           ScrollID: begin  
             ss:=ss+1;  
             Say('Добавили скролл! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(ScrollID));  
             for ii:=1 to max do if ScrollBase[ii]=0 then ScrollBase[ii]:=ObjID;  
           end;  
       end;  
       2:case ItmID of  
         ItemID:  
           for ii:=1 to max do  
             if ItemBase[1,ii]=ObjID then ItemBase[2,ii]:=lvl;  
         ScrollID:  
           Say('Внимание! Изменения в скролле!?');  
       end;  
       //удален  
       3:case ItmID of  
         ItemID: begin  
           ColvoItem:=ColvoItem-1;  
           for ii:=1 to max do  
             if ItemBase[1,ii]=ObjID then begin ItemBase[1,ii]:=0; ItemBase[2,ii]:=0; end;  
               Say('Удаляем предмет! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(ItemID));  
         end;  
         ScrollID: begin  
           ColvoScrl:=ColvoScrl-1;  
           for ii:=1 to max do  
             if ScrollBase[ii]=ObjID then ScrollBase[ii]:=0;  
             Say('Удаляем скролл! ObjectID='+IntToStr(ObjID)+' ItemID='+IntToStr(ScrollID));  
         end;  
       end;  
     end;  
     j:=j+10; //следующее смещение для действия с предметом 1-добавлен 2-изменен 3-удален  
   end;  
   Say('>>ColvoItem='+IntToStr(ColvoItem)+' ColvoScrl='+IntToStr(ColvoScrl)+' CurEnchLvl='+IntToStr(CurEnchLvl));  
end;  

//******************************************************************************  
function GetNextItemID: 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 (ItemBase[1,i]<>0) and (ItemBase[2,i]<=CurEnchLvl) then begin  
       Result:=ItemBase[1,i];  
       exit;  
     end;  
   end;  
   inc(CurEnchLvl);  
   Result:=-3;  
end;  

//******************************************************************************  
function GetNextScroll: integer;  
//Выдает ObjID скролла, если предмет не найден в базе, выдает -1  
var  
   i: integer;  
begin  
   Result:=-1;  
   for i:=1 to max do begin  
     //находим первый подходящий предмет  
     if (ScrollBase[i]<>0) then begin  
       Result:=ScrollBase[i];  
       exit;  
     end;  
   end;  
end;  

//******************************************************************************  
procedure UseItem(ObjectID: integer);  
begin  
   buf:=#$14;  
   WriteD(ObjectID);  
   WriteD(0);  
   SendToServerEx(Name);  
end;  

//******************************************************************************  
procedure RequestEnchantItem(ObjectID: integer);  
begin  
   buf:=#$58;  
   WriteD(ObjectID);  
   SendToServerEx(Name);  
end;  

//******************************************************************************  
procedure OnTimerHP(Sender: TObject);  
var  
   Item, scrl:integer;  
begin  
     if ColvoScrl=0 then begin  
       Say('Кончились скроллы! Прервано!');  
       timer.enabled:=false;  
       exit;  
     end;  
     if ColvoItem=1 then begin  
       Say('Остался последний предмет! Прервано!');  
       timer.enabled:=false;  
       exit;  
     end;  
     Scrl:=GetNextScroll;  
     if scrl=-1 then begin  
       Say('Нет такой заточки! Прервано!');  
       timer.enabled:=false;  
       exit;  
     end;  
     Item:=GetNextItemID;  
     case Item 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);  
     RequestEnchantItem(Item);  
     //************************************************  
     Say('Заточили предмет! ItemID='+IntToStr(Item));  
end;  

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

   //****************************************************************************  
   if FromClient and (ConnectName=Name) and (pck[1]=#$1B) then begin  
     SocialID:=ReadD(2);  
     case SocialID of  
       //социальное действие Yes для начала затачивания  
       6: begin  
         CurEnchLvl:=0;  
         Say('Команда Старт!!!');  
         timer.enabled:=true;  
         exit;  
       end;  
       //социальное действие No для окончания  
       5: begin  
         Say('Команда Стоп!!!');  
         timer.enabled:=false;  
         exit;  
       end;  
     end;  
   end;  

   //****************************************************************************  
   if FromServer then  
   case pck[1] of  
     //Пакет ItemList  
     #$1B: CreateItemBase; //создание базы предметов  
     //если удалили предметы, стираем в базе предметов пары ObjectID - ItemID  
     #$27: UpdateItemBase; //Обновление базы, если принят пакет на удаление предмета  
   end;  

end.
 
  • Страница 1 из 1
  • 1
Поиск:

Хостинг от uCoz
>