Core/PacketIO: Updated and enabled item refund opcodes
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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();
|
||||
WorldPackets::Item::SetItemPurchaseData setItemPurchaseData;
|
||||
setItemPurchaseData.ItemGUID = item->GetGUID();
|
||||
setItemPurchaseData.PurchaseTime = GetTotalPlayedTime() - item->GetPlayedTime();
|
||||
setItemPurchaseData.Contents.Money = item->GetPaidMoney();
|
||||
|
||||
data.WriteByteSeq(guid[7]);
|
||||
data << uint32(GetTotalPlayedTime() - item->GetPlayedTime());
|
||||
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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user