PDA

Просмотр полной версии : Кристаллизация


ogogo
11.02.2010, 02:19
//----------------------------------------------------------------
const
ItemID = 9455; // ItemID шмотки
myname = 'ник;
//----------------------------------------------------------------
var
ItemBase: array of integer;
Crystal: boolean;
//------------------------------------------------------------------
procedure SendMsg2(msg:string);
begin
buf:=#$4A;
WriteD(0);
WriteD(10);
WriteS('');
WriteS(msg);
SendToClientEx(myname);
end;
//----------------------------------------------------------------
procedure Init; //Вызывается при включении скрипта
begin
SendMsg2('Начало инициализации скрипта, откройте инвентарь' );
Crystal:=false;
end;
//-----------------------------------------------------------------
procedure Free; //Вызывается при выключении скрипта
begin

end;

//----------------------------------------------------------------
procedure CreateItemBase; //Создает базу ObjectID и ItemID, опять же не проверяет пакет на правильность для экономия ресурсов
var
i,j: integer;
begin
j:=8;
SetLength(ItemBase,int((length(pck)-5)/14)); //1ый байт - идентификатор пакета, следующие 4 байта хз, далее для каждого итема отводится 28 байт, размер массива должен быть в 2 раза больше, чем итемов.
for i:=0 to int(Length(ItemBase)/2-1) do begin
ItemBase[i*2]:=ReadD(j);
ItemBase[i*2+1]:=ReadD(j);
j:=j+40;
end;
end;
//---------------------------------------------------------
procedure UpdateItemBase; //Удаляет без проверки, использовать аккуратно
var
i: integer;
begin
for i:=0 to int(Length(ItemBase)/2-1) do
if (ItemBase[i*2]=ReadD(8)) or (ItemBase[i*2+1]=ReadD(12)) then begin
ItemBase[i*2]:=0;
ItemBase[i*2+1]:=0;
Exit;
end
end;
//---------------------------------------------------------
function GetObjID(ItemID:integer): integer; //Выдает ObjectID по его ItemID, если ItemID не найден в базе, выдает -1
var
i: integer;
begin
for i:=0 to int(Length(ItemBase)/2-1) do
if (ItemBase[i*2+1]=ItemID) then begin
Result:=ItemBase[i*2];
Exit;
end;
Result:=-1;
end;
//-----------------------------------------------------------
procedure Crystallize(ObjectID: integer);
begin
buf:=#$2F;
WriteD(ObjectID);
WriteF(1);
SendToServer;
end;
//---------------------------------------------------------
//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен

begin
if FromServer and (pck[1]=#$11) then CreateItemBase; //создание базы предметов
if (length(ItemBase)=0) then exit; // если нет базы итемов, скрипт дальше не пустит
if FromServer and (pck[1]=#$21) and (pck[4]=#$31) then begin
UpdateItemBase; //Обновление базы, если принят пакет на удаление предмета


if Crystal and (GetObjID(ItemID)>0) then Crystallize(GetObjID(ItemID))
else begin
Crystal:=false;
SetLength(ItemBase,0);
SendMsg('Весь шмот кристаллизован');
end;
end;
if FromClient and (pck=HStr('56 0C 00 00 00 00 00 00 00 00 ')) then
begin
SendMsg('Панеслася!!!');
if (GetObjID(ItemID)>0) then begin
Crystal:=true;
Crystallize(GetObjID(ItemID));
end else SendMsg('Нужная шмотка не найдена');

end;
end.
скрипт заработал, но приходится передкаждым действием, открывать инвентарь заново, видимо чтобы обновить ItemBase.
хотелось бы избежать этого, гуру форума, подскажите :)

NLObP
16.02.2010, 02:28
Можно пакетом
//RequestItemList вызываем инвентарь
buf:=hstr('14');
SendToServerEx(Name);