Показать сообщение отдельно
Старый 30.04.2009, 09:22   #39
Новичок
 
Регистрация: 29.04.2009
Сообщений: 1
Сказал Спасибо: 0
Имеет 0 спасибок в 0 сообщенях
alexPPP пока неопределено
По умолчанию

Всем доброго времени суток.
У меня пару вопросов по скрипту "инвентаризации" от QaK. Для Gracia Part2
Код:
Код:
var 
ItemCount:integer;
Inventory: array[1..75,1..22]of integer;

//процедура считывания параметров одного предмета
procedure ItemAction(var Counter:integer;CurrentSlot:integer);
var c1:integer;
begin
for c1:=1 to 22 do
begin 
      if (c1=1)or(c1=6)or(c1=7)or(c1=8)or(c1=11) then
      begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
            inc(Counter);
      end;
      
      if (c1=2)or(c1=3)or(c1=4)or(c1=5)or(c1=9)or(c1=12)or(c1=13)or(c1=14)or(c1=15)or(c1=16)or(c1=17)or(c1=18)or(c1=19)or(c1=20)or(c1=21)or(c1=22) then
      begin Inventory[CurrentSlot,c1]:=ReadD(Counter);
      end;
     
      if c1=10 then
      begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
            Counter:=Counter+2;
      end;
end;
end;

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

//Пакет от сервера 21 - действия (доавить/изменить) над одним/несколькими предметами
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)*22+6) then //Если нашли
                            begin ItemAction(j,ij); //Изменяем данные о нем
                                  exit;             //Больше проверять не надо - выходим из цикла
                            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;


//основная часть скрипта
//вызывается при приходе каждого пакета если скрипт включен
begin
if pck='' then exit;
if FromServer then
   begin if (pck[1]=#$11) then
         begin CreateItemBase;
               exit;
         end;
         if (pck[1]=#$21) then
         begin UpdateItemBase;
               exit;
         end;
    end;                                           
    
end.
Так вот.... мне интерессно почему:
1. В оригинале скрипта:
Код:
 if (c1=1)or(c1=5)or(c1=6)or(c1=7)or(c1=9) then
      begin Inventory[CurrentSlot,c1]:=ReadC(Counter);
преобразовывается в ReadC, когда в самом описании пакета идет h.
2. Для чего введена переменная "j" в procedure CreateItemBase; и procedure UpdateItemBase; и какие значения она может принимать?
3. Где задаются значения переменных для {ADD} item-а ( все его 22 параметра) т.е Для создания нового предмета мне нужно "сказать" ObjID=XXXX, ItemID=XXX и т.д Где это делается.
Как я думаю нужно создать форму с инпут параметрами, которые будут принимать вводимые мною значения и что-то типа чекбокса для выполнения действий (Action=1 и Action=2) ну и кнопку чтоб запустить нужные продцедуры. Если мои предположения верны не могли бы вы
подкинуть заготовку такой лио похожей формы.

Спасибо.

И еще 1 вопрос. Получается этот скрипт работает с инвентарем на стороне клиента.
тоесть если мы добавим/редактируем свойство item-a то это изменение произойдет только на клиентской стороне, а при повторном запросе клиентом серверу о содержимом его инвентаря, он вернет значения из БД, так как будет "тягать" данные из своей БД. В соответсвии с этим у меня вопросс: Какой смысл использования этого скрипта? =)

Последний раз редактировалось alexPPP, 30.04.2009 в 09:27.
alexPPP вне форума   Ответить с цитированием