Ru-MaNGOS

Вернуться   Ru-MaNGOS > Ядро > Опкоды, Формулы, Клиент > Опкоды

Важная информация

Опкоды Опкоды

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 16.07.2012, 11:51   #1
Amaru
MaNGOS Dev
 
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
Amaru На верном пути
По умолчанию SMSG_TRADE_ITEM_EXTENDED (15595)

Набросал хендлер для SMSG_TRADE_STATUS_EXTENDED
http://paste2.org/p/2075442
Код:
void WorldSession::SendUpdateTrade(bool trader_state /*= true*/)
{
    TradeData* view_trade = trader_state ? _player->GetTradeData()->GetTraderData() : _player->GetTradeData();

    WorldPacket data(SMSG_TRADE_STATUS_EXTENDED, (100));    // guess size
    data << uint32(0);                                      // added in 2.4.0, this value must be equal to value from TRADE_STATUS_OPEN_WINDOW status packet (different value for different players to block multiple trades?)
    data << uint32(0);                                      // unk 2
    data << uint64(view_trade->GetMoney());                 // trader gold
    data << uint32(view_trade->GetSpell());                 // spell casted on lowest slot item
    data << uint32(TRADE_SLOT_COUNT);                       // trade slots count/number?, = next field in most cases
    data << uint32(0);                                      // unk 5
    data << uint8(trader_state ? 1 : 0);                    // send trader or own trade windows state (last need for proper show spell apply to non-trade slot)
    data << uint32(TRADE_SLOT_COUNT);                       // trade slots count/number?, = prev field in most cases

    uint8 itemCount = 0;
    for (uint8 i = 0; i < TRADE_SLOT_COUNT; ++i)
        if (Item* item = view_trade->GetItem(TradeSlots(i)))
            ++itemCount;

    data.WriteBits(itemCount, 22);

    uint8 creatorGuidMask[] = { 7, 1, 4, 6, 2, 3, 5, 0 };
    uint8 giftCreatorGuidMask[] = { 7, 1, 3, 6, 4, 2, 0, 5 };
    uint8 creatorGuidBytes[] = { 1, 6, 2, 7, 4, 3, 0, 5 };
    uint8 giftCreatorGuidBytes[] = { 6, 1, 7, 4, 0, 5, 2, 3 };

    for (uint8 i = 0; i < TRADE_SLOT_COUNT; ++i)
    {
        if (Item* item = view_trade->GetItem(TradeSlots(i)))
        {
            ObjectGuid creatorGuid = item->GetGuidValue(ITEM_FIELD_CREATOR);
            ObjectGuid giftCreatorGuid = item->GetGuidValue(ITEM_FIELD_GIFTCREATOR);

            data.WriteGuidMask(giftCreatorGuid, giftCreatorGuidMask, 2, 0);
            data.WriteBit(!item->HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_WRAPPED));
            data.WriteGuidMask(giftCreatorGuid, giftCreatorGuidMask, 1, 2);
            if (!item->HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_WRAPPED))
            {
                data.WriteGuidMask(creatorGuid, creatorGuidMask, 7, 0);
                data.WriteBit(item->GetProto()->LockID && !item->HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_UNLOCKED));
                data.WriteGuidMask(creatorGuid, creatorGuidMask, 1, 7);
            }
            data.WriteGuidMask(giftCreatorGuid, giftCreatorGuidMask, 5, 3);
        }
    }

    for (uint8 i = 0; i < TRADE_SLOT_COUNT; ++i)
    {
        if (Item* item = view_trade->GetItem(TradeSlots(i)))
        {
            ObjectGuid creatorGuid = item->GetGuidValue(ITEM_FIELD_CREATOR);
            ObjectGuid giftCreatorGuid = item->GetGuidValue(ITEM_FIELD_GIFTCREATOR);

            if (!item->HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_WRAPPED))
            {
                data.WriteGuidBytes(creatorGuid, creatorGuidBytes, 1, 0);
                data << uint32(item->GetEnchantmentId(PERM_ENCHANTMENT_SLOT));
                for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + MAX_GEM_SOCKETS; ++enchant_slot)
                    data << uint32(item->GetEnchantmentId(EnchantmentSlot(enchant_slot)));
                data << uint32(item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY));
                data.WriteGuidBytes(creatorGuid, creatorGuidBytes, 4, 1);
                data << uint32(0);                                  // reforge Id
                data << uint32(item->GetUInt32Value(ITEM_FIELD_DURABILITY));
                data << uint32(item->GetItemRandomPropertyId());
                data.WriteGuidBytes(creatorGuid, creatorGuidBytes, 1, 5);
                data << uint32(0);                                  // UnkInt32_4
                data.WriteGuidBytes(creatorGuid, creatorGuidBytes, 1, 6);
                data << uint32(item->GetSpellCharges());            // charges
                data << uint32(item->GetItemSuffixFactor());
                data.WriteGuidBytes(creatorGuid, creatorGuidBytes, 1, 7);
            }

            data.WriteGuidBytes(giftCreatorGuid, giftCreatorGuidBytes, 4, 0);
            data << uint32(item->GetProto()->ItemId);               // entry
            data.WriteGuidBytes(giftCreatorGuid, giftCreatorGuidBytes, 1, 4);
            data << uint32(item->GetCount());                       // stack count
            data.WriteGuidBytes(giftCreatorGuid, giftCreatorGuidBytes, 1, 5);
            data << uint8(i);
            data.WriteGuidBytes(giftCreatorGuid, giftCreatorGuidBytes, 2, 6);
        }
    }

    SendPacket(&data);
}

Последний раз редактировалось Amaru; 17.07.2012 в 13:06.
Amaru вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
Ranger (19.07.2012), SeT (19.02.2014)
Старый 16.07.2012, 12:59   #2
Amaru
MaNGOS Dev
 
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
Amaru На верном пути
По умолчанию

LockId судя по всему не шлется на клиент, а устанавливается флаг в
data.WriteBit(0); // seen 0 only
что сундук заперт.
Скорее всего ItemSuffixFactor тоже не нужен клиенту
А также DisplayInfo. То есть клиенту нужна инфа только о рандомных суффиксах
Обновил код

Последний раз редактировалось Amaru; 16.07.2012 в 13:45.
Amaru вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Ranger (19.07.2012)
Старый 17.07.2012, 10:21   #3
Amaru
MaNGOS Dev
 
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
Amaru На верном пути
По умолчанию

Если UnkInt32_3 > 0, то это запись из ItemRandomProperties.dbc, если < 0, то из ItemRandomSuffix.dbc
т.е. ITEM_FIELD_RANDOM_PROPERTIES_ID

Последний раз редактировалось Amaru; 17.07.2012 в 10:30.
Amaru вне форума   Ответить с цитированием
Старый 17.07.2012, 13:05   #4
Amaru
MaNGOS Dev
 
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
Amaru На верном пути
По умолчанию

разобрался, item->GetItemSuffixFactor() шлется в нижнем байте, остальные - неизвестные числа... впрочем, клиенту они судя по всему не нужны
Amaru вне форума   Ответить с цитированием
Старый 20.02.2014, 04:00   #5
SeT
Ученый
 
Аватар для SeT
 
Регистрация: 13.03.2010
Сообщений: 110
Сказал(а) спасибо: 55
Поблагодарили 23 раз(а) в 14 сообщениях
SeT На верном пути
По умолчанию

Нет у кого структуры SMSG_TRADE_STATUS_EXTENDED или снифов для 16135+ (5.х)?
p.s. ещё клиент странно реагирует на начало торговли, старый способ посылкой TRADE_STATUS_OPEN_WINDOW работает частично, у одного игрока, кому предложена торговля, показывается два одинаковых окна торговли (одинаковые имена игрока наверху), у того кто начал торговлю, окна показываются нормально, но клиент не даёт передавать деньги, сразу скидывает значение в 0.

Последний раз редактировалось SeT; 20.02.2014 в 04:10.
SeT вне форума   Ответить с цитированием
Старый 20.02.2014, 08:10   #6
Amaru
MaNGOS Dev
 
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
Amaru На верном пути
По умолчанию

enum трейд статуса обновил?
Amaru вне форума   Ответить с цитированием
Старый 20.02.2014, 16:56   #7
SeT
Ученый
 
Аватар для SeT
 
Регистрация: 13.03.2010
Сообщений: 110
Сказал(а) спасибо: 55
Поблагодарили 23 раз(а) в 14 сообщениях
SeT На верном пути
По умолчанию

Да, так бы окно вообще не открывалось (?).

Цитата:
TRADE_STATUS_OPEN_WINDOW = 17,
TRADE_STATUS_BEGIN_TRADE = 18,
SeT вне форума   Ответить с цитированием
Старый 21.02.2014, 02:35   #8
Amaru
MaNGOS Dev
 
Регистрация: 16.01.2011
Сообщений: 262
Сказал(а) спасибо: 57
Поблагодарили 73 раз(а) в 59 сообщениях
Amaru На верном пути
По умолчанию

Не открылось бы. Структуру опкодов проверять нужно
Amaru вне форума   Ответить с цитированием
Старый 21.02.2014, 16:47   #9
SeT
Ученый
 
Аватар для SeT
 
Регистрация: 13.03.2010
Сообщений: 110
Сказал(а) спасибо: 55
Поблагодарили 23 раз(а) в 14 сообщениях
SeT На верном пути
По умолчанию

Цитата:
Сообщение от Amaru Посмотреть сообщение
Не открылось бы. Структуру опкодов проверять нужно
Та да, я поэтому и спрашиваю, нет ли у кого структуры или снифов.

Последний раз редактировалось SeT; 21.02.2014 в 18:25.
SeT вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
IDB WoW 5.2.0 Build 16650 TOM_RUS Копаем клиент 74 26.03.2016 03:04


Текущее время: 05:45. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot