1. void WorldSession::SendUpdateTrade(bool trader_state /*= true*/)
  2. {
  3. TradeData* view_trade = trader_state ? _player->GetTradeData()->GetTraderData() : _player->GetTradeData();
  4. WorldPacket data(SMSG_TRADE_STATUS_EXTENDED, (100)); // guess size
  5. 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?)
  6. data << uint32(0); // unk 2
  7. data << uint64(view_trade->GetMoney()); // trader gold
  8. data << uint32(view_trade->GetSpell()); // spell casted on lowest slot item
  9. data << uint32(TRADE_SLOT_COUNT); // trade slots count/number?, = next field in most cases
  10. data << uint32(0); // unk 5
  11. data << uint8(trader_state ? 1 : 0); // send trader or own trade windows state (last need for proper show spell apply to non-trade slot)
  12. data << uint32(TRADE_SLOT_COUNT); // trade slots count/number?, = prev field in most cases
  13. uint8 itemCount = 0;
  14. for (uint8 i = 0; i < TRADE_SLOT_COUNT; ++i)
  15. if (Item* item = view_trade->GetItem(TradeSlots(i)))
  16. ++itemCount;
  17. data.WriteBits(itemCount, 22);
  18. uint8 creatorGuidMask[] = { 7, 1, 4, 6, 2, 3, 5, 0 };
  19. uint8 giftCreatorGuidMask[] = { 7, 1, 3, 6, 4, 2, 0, 5 };
  20. uint8 creatorGuidBytes[] = { 1, 6, 2, 7, 4, 3, 0, 5 };
  21. uint8 giftCreatorGuidBytes[] = { 6, 1, 7, 4, 0, 5, 2, 3 };
  22. for (uint8 i = 0; i < TRADE_SLOT_COUNT; ++i)
  23. {
  24. if (Item* item = view_trade->GetItem(TradeSlots(i)))
  25. {
  26. ObjectGuid creatorGuid = item->GetGuidValue(ITEM_FIELD_CREATOR);
  27. ObjectGuid giftCreatorGuid = item->GetGuidValue(ITEM_FIELD_GIFTCREATOR);
  28. data.WriteGuidMask(giftCreatorGuid, giftCreatorGuidMask, 2, 0);
  29. data.WriteBit(!item->HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_WRAPPED));
  30. data.WriteGuidMask(giftCreatorGuid, giftCreatorGuidMask, 1, 2);
  31. if (!item->HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_WRAPPED))
  32. {
  33. data.WriteGuidMask(creatorGuid, creatorGuidMask, 7, 0);
  34. data.WriteBit(item->GetProto()->LockID && !item->HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_UNLOCKED));
  35. data.WriteGuidMask(creatorGuid, creatorGuidMask, 1, 7);
  36. }
  37. data.WriteGuidMask(giftCreatorGuid, giftCreatorGuidMask, 5, 3);
  38. }
  39. }
  40. for (uint8 i = 0; i < TRADE_SLOT_COUNT; ++i)
  41. {
  42. if (Item* item = view_trade->GetItem(TradeSlots(i)))
  43. {
  44. ObjectGuid creatorGuid = item->GetGuidValue(ITEM_FIELD_CREATOR);
  45. ObjectGuid giftCreatorGuid = item->GetGuidValue(ITEM_FIELD_GIFTCREATOR);
  46. if (!item->HasFlag(ITEM_FIELD_FLAGS, ITEM_DYNFLAG_WRAPPED))
  47. {
  48. data.WriteGuidBytes(creatorGuid, creatorGuidBytes, 1, 0);
  49. data << uint32(item->GetEnchantmentId(PERM_ENCHANTMENT_SLOT));
  50. for (uint32 enchant_slot = SOCK_ENCHANTMENT_SLOT; enchant_slot < SOCK_ENCHANTMENT_SLOT + MAX_GEM_SOCKETS; ++enchant_slot)
  51. data << uint32(item->GetEnchantmentId(EnchantmentSlot(enchant_slot)));
  52. data << uint32(item->GetUInt32Value(ITEM_FIELD_MAXDURABILITY));
  53. data.WriteGuidBytes(creatorGuid, creatorGuidBytes, 4, 1);
  54. data << uint32(0); // reforge Id
  55. data << uint32(item->GetUInt32Value(ITEM_FIELD_DURABILITY));
  56. data << uint32(item->GetItemRandomPropertyId());
  57. data.WriteGuidBytes(creatorGuid, creatorGuidBytes, 1, 5);
  58. data << uint32(0); // UnkInt32_4
  59. data.WriteGuidBytes(creatorGuid, creatorGuidBytes, 1, 6);
  60. data << uint32(item->GetSpellCharges()); // charges
  61. data << uint32(item->GetItemSuffixFactor());
  62. data.WriteGuidBytes(creatorGuid, creatorGuidBytes, 1, 7);
  63. }
  64. data.WriteGuidBytes(giftCreatorGuid, giftCreatorGuidBytes, 4, 0);
  65. data << uint32(item->GetProto()->ItemId); // entry
  66. data.WriteGuidBytes(giftCreatorGuid, giftCreatorGuidBytes, 1, 4);
  67. data << uint32(item->GetCount()); // stack count
  68. data.WriteGuidBytes(giftCreatorGuid, giftCreatorGuidBytes, 1, 5);
  69. data << uint8(i);
  70. data.WriteGuidBytes(giftCreatorGuid, giftCreatorGuidBytes, 2, 6);
  71. }
  72. }
  73. SendPacket(&data);
  74. }