aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Item/Item.cpp4
-rw-r--r--src/server/game/Entities/Player/Player.cpp104
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp57
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h54
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp10
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);