Wolf | Дата: Четверг, 17.12.2009, 10:01 | Сообщение # 1 |
Король Lineage 2
Группа: Администраторы
Сообщений: 356
| 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.
|
|
|
|