Показать сообщение отдельно
Старый 24.02.2011, 21:31   #13
RomanRom2
WowCore Dev
 
Аватар для RomanRom2
 
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
RomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всем
По умолчанию

чото вы напутали с этими пропертями и суффиксами. вообще говоря проперти это некое ID, которое вроде даже где то в дбц было в виде вариаций. и грубо говоря это ID от нуля до некоего конечного числа, типа 100 или может 1000, не помню.

а те громадные числа я перевел в hex и оно мне TimeStamp больше напоминает. да и откуда вы взяли рандом проперти поле в SMSG_ITEM_QUERY_SINGLE_RESPONSE, его там от родясь никогда не было. это апдейт поле итема:
ITEM_FIELD_RANDOM_PROPERTIES_ID = 59; // 001 - [1] Integer - [001] PUBLIC

вот еще есть поле ITEM_FIELD_PROPERTY_SEED, вот тут более вероятно встретить таймстап, кажется это он и есть (не помню уж). но опять же, это А9, а не SMSG_ITEM_QUERY_SINGLE_RESPONSE.

покажите дамп всего пакета.

но вообще не о том говорим. и да, если апдейт поле цельное (не составные байты или слова), если оно integer и если оно равно нулю, то такое поле не передается в апдейтпакете. это такое правило. нельзя передавать зануленные поля.

я чесно говоря потерял нить проблемы, напомните плиз. клиент не воспринимает SMSG_LOOT_RESPONSE, сформированный вами? судя по вашему разобранному представлению этот пакет не менялся со времен царя гороха. вот у меня что:
Код:
  // лут-лист
  pkt := TPkt.InitCmd(SMSG_LOOT_RESPONSE);
  pkt.AddInt64(LootObject.woGuid);

//  LOOT_TYPE_CORPSE = 1;
//  LOOT_TYPE_SKINNING = 2;
//  LOOT_TYPE_FISHING = 3;
  pkt.AddByte(L.LootType); // тип лута
  pkt.AddLong(L.Coinage); // деньги
  pkt.AddByte(count); // сколько итемов в списке

  count:=0;
  for i:=1 to MAX_LOOT_ITEMS do
    if (L.Slot[i].Entry<>0)and(ItemTPL[L.Slot[i].Entry]<>nil) then
      begin
        pkt.AddByte(count); // номер итема по порядку, он потом будет фигурировать в лут-пакетах рассылки
        inc(count);
        pkt.AddLong(L.Slot[i].Entry); // item_id
        k:=random(ItemTPL[L.Slot[i].Entry].itMaxStackCount);
        if k<1 then k:=1;
        if k>ItemTPL[L.Slot[i].Entry].itMaxStackCount then k:=ItemTPL[L.Slot[i].Entry].itMaxStackCount;
        pkt.AddLong(k); // item_count
        pkt.AddLong(ItemTPL[L.Slot[i].Entry].itDisplayInfoID); // item_model
        pkt.AddLong(L.Slot[i].PropertySEED); // seed
        pkt.AddLong(L.Slot[i].RandomPropertyID); // RandomPropertyID

        // 0 - norm
        // 1 - that item is still being rolled for
        // 2 - нет опкода, нет сообщения, нельзя взять предмет

        // 1. статус итема может быть установлен командой "START ROLL"
        // 2. нужно выставить статус 2, если этот итем >=Trashold,
        //    что бы итем невозможно было просто взять,
        //    а можно передевать только через список плееров у мастерлутера или через розыгрыш need/greed
        pkt.AddByte(L.Slot[i].Status);
      end;

  sender.SockSend(pkt);
RomanRom2 вне форума   Ответить с цитированием