diff options
| author | Shauren <shauren.trinity@gmail.com> | 2015-10-19 21:18:48 +0200 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2015-10-19 21:18:48 +0200 |
| commit | d03ff1433f76008c1add502737b15afac4a168b3 (patch) | |
| tree | 11aaa23f6cb96dca7fa10491c3c65a6ae846a2a1 /src | |
| parent | b09aa673678970986904b4db7e4286a1588746e7 (diff) | |
Core/PacketIO: Updated and enabled item refund opcodes
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 104 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/ItemPackets.cpp | 57 | ||||
| -rw-r--r-- | src/server/game/Server/Packets/ItemPackets.h | 54 | ||||
| -rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 10 |
5 files changed, 146 insertions, 83 deletions
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 6ea703280df..ffa924cc0ea 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1224,6 +1224,10 @@ void Item::SetNotRefundable(Player* owner, bool changestate /*=true*/, SQLTransa if (!HasFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE)) return; + WorldPackets::Item::ItemExpirePurchaseRefund itemExpirePurchaseRefund; + itemExpirePurchaseRefund.ItemGUID = GetGUID(); + owner->SendDirectMessage(itemExpirePurchaseRefund.Write()); + RemoveFlag(ITEM_FIELD_FLAGS, ITEM_FIELD_FLAG_REFUNDABLE); // Following is not applicable in the trading procedure if (changestate) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9d9ff325dc1..c0bff0149a0 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -25660,52 +25660,27 @@ void Player::SendRefundInfo(Item* item) return; } - ObjectGuid guid = item->GetGUID(); - WorldPacket data(SMSG_SET_ITEM_PURCHASE_DATA, 8 + 4 + 4 + 4 + 4 * 4 + 4 * 4 + 4 + 4); - data.WriteBit(guid[3]); - data.WriteBit(guid[5]); - data.WriteBit(guid[7]); - data.WriteBit(guid[6]); - data.WriteBit(guid[2]); - data.WriteBit(guid[4]); - data.WriteBit(guid[0]); - data.WriteBit(guid[1]); - data.FlushBits(); - - data.WriteByteSeq(guid[7]); - data << uint32(GetTotalPlayedTime() - item->GetPlayedTime()); + WorldPackets::Item::SetItemPurchaseData setItemPurchaseData; + setItemPurchaseData.ItemGUID = item->GetGUID(); + setItemPurchaseData.PurchaseTime = GetTotalPlayedTime() - item->GetPlayedTime(); + setItemPurchaseData.Contents.Money = item->GetPaidMoney(); + for (uint8 i = 0; i < MAX_ITEM_EXT_COST_ITEMS; ++i) // item cost data { - data << uint32(iece->RequiredItemCount[i]); - data << uint32(iece->RequiredItem[i]); + setItemPurchaseData.Contents.Items[i].ItemCount = iece->RequiredItemCount[i]; + setItemPurchaseData.Contents.Items[i].ItemID = iece->RequiredItem[i]; } - data.WriteByteSeq(guid[6]); - data.WriteByteSeq(guid[4]); - data.WriteByteSeq(guid[3]); - data.WriteByteSeq(guid[2]); - for (uint8 i = 0; i < MAX_ITEM_EXT_COST_CURRENCIES; ++i) // currency cost data + for (uint8 i = 0; i < MAX_ITEM_EXT_COST_CURRENCIES; ++i) // currency cost data { if (iece->RequirementFlags & (ITEM_EXT_COST_CURRENCY_REQ_IS_SEASON_EARNED_1 << i)) - { - data << uint32(0); - data << uint32(0); continue; - } - CurrencyTypesEntry const* currencyType = sCurrencyTypesStore.LookupEntry(iece->RequiredCurrency[i]); - uint32 precision = (currencyType && currencyType->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? CURRENCY_PRECISION : 1; - - data << uint32(iece->RequiredCurrencyCount[i] / precision); - data << uint32(iece->RequiredCurrency[i]); + setItemPurchaseData.Contents.Currencies[i].CurrencyCount = iece->RequiredCurrencyCount[i]; + setItemPurchaseData.Contents.Currencies[i].CurrencyID = iece->RequiredCurrency[i]; } - data.WriteByteSeq(guid[1]); - data.WriteByteSeq(guid[5]); - data << uint32(0); - data.WriteByteSeq(guid[0]); - data << uint32(item->GetPaidMoney()); // money cost - GetSession()->SendPacket(&data); + GetSession()->SendPacket(setItemPurchaseData.Write()); } bool Player::AddItem(uint32 itemId, uint32 count) @@ -25733,57 +25708,30 @@ bool Player::AddItem(uint32 itemId, uint32 count) void Player::SendItemRefundResult(Item* item, ItemExtendedCostEntry const* iece, uint8 error) { - ObjectGuid guid = item->GetGUID(); - WorldPacket data(SMSG_ITEM_PURCHASE_REFUND_RESULT, 1 + 1 + 8 + 4*8 + 4 + 4*8 + 1); - data.WriteBit(guid[4]); - data.WriteBit(guid[5]); - data.WriteBit(guid[1]); - data.WriteBit(guid[6]); - data.WriteBit(guid[7]); - data.WriteBit(guid[0]); - data.WriteBit(guid[3]); - data.WriteBit(guid[2]); - data.WriteBit(!error); - data.WriteBit(item->GetPaidMoney() > 0); - data.FlushBits(); + WorldPackets::Item::ItemPurchaseRefundResult itemPurchaseRefundResult; + itemPurchaseRefundResult.ItemGUID = item->GetGUID(); + itemPurchaseRefundResult.Result = error; if (!error) { - for (uint8 i = 0; i < MAX_ITEM_EXT_COST_CURRENCIES; ++i) + itemPurchaseRefundResult.Contents = boost::in_place(); + itemPurchaseRefundResult.Contents->Money = item->GetPaidMoney(); + for (uint8 i = 0; i < MAX_ITEM_EXT_COST_ITEMS; ++i) // item cost data { - if (iece->RequirementFlags & (ITEM_EXT_COST_CURRENCY_REQ_IS_SEASON_EARNED_1 << i)) - { - data << uint32(0); - data << uint32(0); - continue; - } - - CurrencyTypesEntry const* currencyType = sCurrencyTypesStore.LookupEntry(iece->RequiredCurrency[i]); - uint32 precision = (currencyType && currencyType->Flags & CURRENCY_FLAG_HIGH_PRECISION) ? CURRENCY_PRECISION : 1; - - data << uint32(iece->RequiredCurrencyCount[i] / precision); - data << uint32(iece->RequiredCurrency[i]); + itemPurchaseRefundResult.Contents->Items[i].ItemCount = iece->RequiredItemCount[i]; + itemPurchaseRefundResult.Contents->Items[i].ItemID = iece->RequiredItem[i]; } - data << uint32(item->GetPaidMoney()); // money cost - - for (uint8 i = 0; i < MAX_ITEM_EXT_COST_ITEMS; ++i) // item cost data + for (uint8 i = 0; i < MAX_ITEM_EXT_COST_CURRENCIES; ++i) // currency cost data { - data << uint32(iece->RequiredItemCount[i]); - data << uint32(iece->RequiredItem[i]); + if (iece->RequirementFlags & (ITEM_EXT_COST_CURRENCY_REQ_IS_SEASON_EARNED_1 << i)) + continue; + + itemPurchaseRefundResult.Contents->Currencies[i].CurrencyCount = iece->RequiredCurrencyCount[i]; + itemPurchaseRefundResult.Contents->Currencies[i].CurrencyID = iece->RequiredCurrency[i]; } } - data.WriteByteSeq(guid[0]); - data.WriteByteSeq(guid[3]); - data.WriteByteSeq(guid[1]); - data.WriteByteSeq(guid[6]); - data.WriteByteSeq(guid[4]); - data.WriteByteSeq(guid[2]); - data.WriteByteSeq(guid[7]); - data.WriteByteSeq(guid[5]); - - data << uint8(error); // error code - GetSession()->SendPacket(&data); + GetSession()->SendPacket(itemPurchaseRefundResult.Write()); } void Player::RefundItem(Item* item) diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index b6b69b84eac..81b1c845ac9 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -71,6 +71,63 @@ void WorldPackets::Item::GetItemPurchaseData::Read() _worldPacket >> ItemGUID; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemPurchaseRefundItem& refundItem) +{ + data << refundItem.ItemID; + data << refundItem.ItemCount; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemPurchaseRefundCurrency& refundCurrency) +{ + data << refundCurrency.CurrencyID; + data << refundCurrency.CurrencyCount; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemPurchaseContents& purchaseContents) +{ + data << purchaseContents.Money; + for (uint32 i = 0; i < 5; ++i) + data << purchaseContents.Items[i]; + + for (uint32 i = 0; i < 5; ++i) + data << purchaseContents.Currencies[i]; + + return data; +} + +WorldPacket const* WorldPackets::Item::SetItemPurchaseData::Write() +{ + _worldPacket << ItemGUID; + _worldPacket << Contents; + _worldPacket << Flags; + _worldPacket << PurchaseTime; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Item::ItemPurchaseRefundResult::Write() +{ + _worldPacket << ItemGUID; + _worldPacket << uint8(Result); + _worldPacket.WriteBit(Contents.is_initialized()); + _worldPacket.FlushBits(); + if (Contents) + _worldPacket << *Contents; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Item::ItemExpirePurchaseRefund::Write() +{ + _worldPacket << ItemGUID; + + return &_worldPacket; +} + void WorldPackets::Item::RepairItem::Read() { _worldPacket >> NpcGUID; diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index db7e9a01c0a..5435559fc74 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -115,6 +115,60 @@ namespace WorldPackets ObjectGuid ItemGUID; }; + struct ItemPurchaseRefundItem + { + int32 ItemID = 0; + int32 ItemCount = 0; + }; + + struct ItemPurchaseRefundCurrency + { + int32 CurrencyID = 0; + int32 CurrencyCount = 0; + }; + + struct ItemPurchaseContents + { + uint32 Money = 0; + ItemPurchaseRefundItem Items[5] = { }; + ItemPurchaseRefundCurrency Currencies[5] = { }; + }; + + class SetItemPurchaseData final : public ServerPacket + { + public: + SetItemPurchaseData() : ServerPacket(SMSG_SET_ITEM_PURCHASE_DATA, 4 + 4 + 4 + 5 * (4 + 4) + 5 * (4 + 4) + 16) { } + + WorldPacket const* Write() override; + + uint32 PurchaseTime = 0; + uint32 Flags = 0; + ItemPurchaseContents Contents; + ObjectGuid ItemGUID; + }; + + class ItemPurchaseRefundResult final : public ServerPacket + { + public: + ItemPurchaseRefundResult() : ServerPacket(SMSG_ITEM_PURCHASE_REFUND_RESULT, 1 + 4 + 5 * (4 + 4) + 5 * (4 + 4) + 16) { } + + WorldPacket const* Write() override; + + uint8 Result = 0; + ObjectGuid ItemGUID; + Optional<ItemPurchaseContents> Contents; + }; + + class ItemExpirePurchaseRefund final : public ServerPacket + { + public: + ItemExpirePurchaseRefund() : ServerPacket(SMSG_ITEM_EXPIRE_PURCHASE_REFUND, 16) { } + + WorldPacket const* Write() override; + + ObjectGuid ItemGUID; + }; + class RepairItem final : public ClientPacket { public: diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index c59a4bb3175..5f41c357fe4 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -398,7 +398,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GENERATE_RANDOM_CHARACTER_NAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::GenerateRandomCharacterName, &WorldSession::HandleRandomizeCharNameOpcode); DEFINE_HANDLER(CMSG_GET_CHALLENGE_MODE_REWARDS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GET_GARRISON_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Garrison::GetGarrisonInfo, &WorldSession::HandleGetGarrisonInfo); - DEFINE_HANDLER(CMSG_GET_ITEM_PURCHASE_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::GetItemPurchaseData, &WorldSession::HandleGetItemPurchaseData); + DEFINE_HANDLER(CMSG_GET_ITEM_PURCHASE_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::GetItemPurchaseData, &WorldSession::HandleGetItemPurchaseData); DEFINE_HANDLER(CMSG_GET_MIRROR_IMAGE_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::GetMirrorImageData, &WorldSession::HandleMirrorImageDataRequest); DEFINE_HANDLER(CMSG_GET_PVP_OPTIONS_ENABLED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Battleground::GetPVPOptionsEnabled, &WorldSession::HandleGetPVPOptionsEnabled); DEFINE_HANDLER(CMSG_GET_REMAINING_GAME_TIME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -1259,9 +1259,9 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_IS_QUEST_COMPLETE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ENCHANT_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_EXPIRE_PURCHASE_REFUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PURCHASE_REFUND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ENCHANT_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_EXPIRE_PURCHASE_REFUND, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PURCHASE_REFUND_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_KICK_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1616,7 +1616,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_VISIBLE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FORCED_REACTIONS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ITEM_PURCHASE_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ITEM_PURCHASE_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_LOOT_METHOD_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MAX_WEEKLY_QUANTITY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MELEE_ANIM_KIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); |
