Показать сообщение отдельно
Старый 04.10.2007, 12:10   #6
Рыцарь
 
Аватар для QaK
 
Регистрация: 28.09.2007
Сообщений: 1,558
Сказал Спасибо: 71
Имеет 351 спасибок в 244 сообщенях
QaK пока неопределено
По умолчанию

Мой вариант "инвентаризации", описание атрибутов объектов и действий над ними взял у Shura1oplot'a
Код:
//Инвентаризация by QaK

var ItemCount:integer; //количество занятых слотов/количество вещей
    Inventory: array[1..250,1..10]of integer; //массив инвентаря
    //инвентарь
    //1 - ItemType1
    //2 - ObjectID
    //3 - ItemID
    //4 - ItemCount
    //5 - ItemType2
    //6 - CustType1
    //7 - IsEquipped
    //8 - BodyPart
    //9 - EnchantLevel
    //10 - CustType2
procedure Init; //Вызывается при включении скрипта
begin

end;

procedure Free; //Вызывается при выключении скрипта
begin

end;

//процедура считывания параметров одного предмета
procedure ItemAction(var Counter:integer;CurrentSlot:integer);
//Counter - Позиция считываемая из пакета, модифицируется функциями ReadC,ReadD
//CurrentSlot - Индекс в массиве Inventory (от 1 до 250)
var c1:integer;
begin
for c1:=1 to 10 do
begin //Если значение однобайтное
      if (c1=1)or(c1=5)or(c1=6)or(c1=7)or(c1=9) then
      begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
            inc(Counter);
      end;
      //Если значение четырехбайтное
      if (c1=2)or(c1=3)or(c1=4)or(c1=8) then
      begin Inventory[CurrentSlot,c1]:=ReadD(Counter);
      end;
      //Если значение последнее
      if c1=10 then
      begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
            Counter:=Counter+2;
      end;
end;
end;

//Пакет от сервера 1В - создаем или модифицируем весь инвентарь
procedure CreateItemBase;
var
i,j: integer;
begin
ItemCount:=ReadC(4);//Считываем количество вещей в инвентаре
j:=6;
for i:=1 to ItemCount do ItemAction(j,i);
end;

//Пакет от сервера 27 - действия (доавить/изменить/удалить) над одним/несколькими предметами
procedure UpdateItemBase;
var
  i,ij,ijk:integer; //простые счетчики для перебора значений
  j:integer; //Текущая позиция, откуда считываем значения из пакета
  count:integer; //Количество изменяемых предметов
  Action: integer; //Действие над предметом
  k:boolean; //Нашли ли мы удаляемый предмет?
begin
  k:=false;
  count:=ReadC(1);//Считываем количество изменяемых предметов
  j:=4;
  for i:=1 to count do
  begin Action:=ReadC(j);//Считываем действие
        inc(j);
  {ADD} if Action=1 then
           begin Inc(ItemCount);//Увеличиваем количество занятых слотов
                 ItemAction(j,ItemCount); //Добавляем предмет
           end;
{Update}if Action=2 then for ij:=1 to ItemCount do //Ищем изменяемый предмет по ObjectID
                         If Inventory[ij,2]=ReadD((j-1)*30+8) then //Если нашли
                            begin ItemAction(j,ij); //Изменяем данные о нем
                                  exit;             //Больше проверять не надо - выходим из цикла
                            end;
{Delete}if Action=3 then begin for ij:=1 to ItemCount-1 do //Ищем удаляемый предмет
                                   begin If Inventory[iji,2]=ReadD((j-1)*30+8) then k:=true; //Если нашли,фиксируем это
                                         If k then //если найден удаляемы объект
                                            for ijk:=1 to 10 do //то сдвигаем элементы массива-инвентаря
                                            Inventory[ij,ijk]:=Inventory[ij+1,ijk];
                                   end;
                               Dec(ItemCount);//Уменьшаем количество занятых слотов
                         end;
  end;
end;

//Получить ObjectID предмета, зная его ItemID
function GetInfo(ItemID:integer):integer;
var c1:integer;
begin Result:=-1;
      for c1:=1 to ItemCount do
      if (ItemID=Inventory[c1,3]) then
      begin Result:=Inventory[c1,2];
            exit;//Если нашли - выходим из цикла
      end;
end;

//Использовать предмет с заданным ItemID
procedure UseItem(ItemID:integer);
var c1:integer;
begin
for c1:=1 to ItemCount do
if (ItemID=Inventory[c1,3]) then
begin buf:=#$14;
      WriteD(Inventory[c1,2]);
      WriteD(0);
      SendToServer;
      exit; //Чтоб не использовать несколько предметов с одинаковым ItemID (например заточки)
end;
end;

//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
if FromServer then
   begin if (pck[1]=#$1B) then
         begin CreateItemBase;
               exit;
         end;
         if (pck[1]=#$27) then
         begin UpdateItemBase;
               exit;
         end;
    end;
end.
QaK вне форума   Ответить с цитированием
За это сообщение QaK нажился 2 спасибками от: