mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-18 16:38:42 +01:00
Core/PacketIO: Updated and Enabled CMSG_USE_EQUIPMENT_SET / SMSG_USE_EQUIPMENT_SET_RESULT for 6.1.2
This commit is contained in:
@@ -1638,33 +1638,28 @@ void WorldSession::HandleDeleteEquipmentSet(WorldPackets::EquipmentSet::DeleteEq
|
||||
_player->DeleteEquipmentSet(packet.ID);
|
||||
}
|
||||
|
||||
void WorldSession::HandleEquipmentSetUse(WorldPacket& recvData)
|
||||
void WorldSession::HandleUseEquipmentSet(WorldPackets::EquipmentSet::UseEquipmentSet& packet)
|
||||
{
|
||||
TC_LOG_DEBUG("network", "CMSG_EQUIPMENT_SET_USE");
|
||||
TC_LOG_DEBUG("network", "CMSG_USE_EQUIPMENT_SET");
|
||||
|
||||
ObjectGuid ignoredItemGuid;
|
||||
ignoredItemGuid.SetRawValue(0, 1);
|
||||
for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
||||
|
||||
for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
||||
{
|
||||
ObjectGuid itemGuid;
|
||||
recvData >> itemGuid.ReadAsPacked();
|
||||
|
||||
uint8 srcbag, srcslot;
|
||||
recvData >> srcbag >> srcslot;
|
||||
|
||||
TC_LOG_DEBUG("entities.player.items", "%s: srcbag %u, srcslot %u", itemGuid.ToString().c_str(), srcbag, srcslot);
|
||||
TC_LOG_DEBUG("entities.player.items", "%s: ContainerSlot: %u, Slot: %u", packet.Items[i].Item.ToString().c_str(), packet.Items[i].ContainerSlot, packet.Items[i].Slot);
|
||||
|
||||
// check if item slot is set to "ignored" (raw value == 1), must not be unequipped then
|
||||
if (itemGuid == ignoredItemGuid)
|
||||
if (packet.Items[i].Item == ignoredItemGuid)
|
||||
continue;
|
||||
|
||||
// Only equip weapons in combat
|
||||
if (_player->IsInCombat() && i != EQUIPMENT_SLOT_MAINHAND && i != EQUIPMENT_SLOT_OFFHAND && i != EQUIPMENT_SLOT_RANGED)
|
||||
continue;
|
||||
|
||||
Item* item = _player->GetItemByGuid(itemGuid);
|
||||
Item* item = _player->GetItemByGuid(packet.Items[i].Item);
|
||||
|
||||
uint16 dstpos = i | (INVENTORY_SLOT_BAG_0 << 8);
|
||||
uint16 dstPos = i | (INVENTORY_SLOT_BAG_0 << 8);
|
||||
|
||||
if (!item)
|
||||
{
|
||||
@@ -1672,28 +1667,27 @@ void WorldSession::HandleEquipmentSetUse(WorldPacket& recvData)
|
||||
if (!uItem)
|
||||
continue;
|
||||
|
||||
ItemPosCountVec sDest;
|
||||
InventoryResult msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, sDest, uItem, false);
|
||||
if (msg == EQUIP_ERR_OK)
|
||||
ItemPosCountVec itemPosCountVec;
|
||||
InventoryResult inventoryResult = _player->CanStoreItem(NULL_BAG, NULL_SLOT, itemPosCountVec, uItem, false);
|
||||
if (inventoryResult == EQUIP_ERR_OK)
|
||||
{
|
||||
_player->RemoveItem(INVENTORY_SLOT_BAG_0, i, true);
|
||||
_player->StoreItem(sDest, uItem, true);
|
||||
_player->StoreItem(itemPosCountVec, uItem, true);
|
||||
}
|
||||
else
|
||||
_player->SendEquipError(msg, uItem, NULL);
|
||||
|
||||
_player->SendEquipError(inventoryResult, uItem, NULL);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (item->GetPos() == dstpos)
|
||||
if (item->GetPos() == dstPos)
|
||||
continue;
|
||||
|
||||
_player->SwapItem(item->GetPos(), dstpos);
|
||||
_player->SwapItem(item->GetPos(), dstPos);
|
||||
}
|
||||
|
||||
WorldPacket data(SMSG_USE_EQUIPMENT_SET_RESULT, 1);
|
||||
data << uint8(0); // 4 - equipment swap failed - inventory is full
|
||||
SendPacket(&data);
|
||||
WorldPackets::EquipmentSet::UseEquipmentSetResult result;
|
||||
result.Reason = 0; // 4 - equipment swap failed - inventory is full
|
||||
SendPacket(result.Write());
|
||||
}
|
||||
|
||||
void WorldSession::HandleCharRaceOrFactionChangeOpcode(WorldPackets::Character::CharRaceOrFactionChange& packet)
|
||||
|
||||
@@ -68,3 +68,22 @@ void WorldPackets::EquipmentSet::DeleteEquipmentSet::Read()
|
||||
{
|
||||
_worldPacket >> ID;
|
||||
}
|
||||
|
||||
void WorldPackets::EquipmentSet::UseEquipmentSet::Read()
|
||||
{
|
||||
_worldPacket >> Inv;
|
||||
|
||||
for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
|
||||
{
|
||||
_worldPacket >> Items[i].Item;
|
||||
_worldPacket >> Items[i].ContainerSlot;
|
||||
_worldPacket >> Items[i].Slot;
|
||||
}
|
||||
}
|
||||
|
||||
WorldPacket const* WorldPackets::EquipmentSet::UseEquipmentSetResult::Write()
|
||||
{
|
||||
_worldPacket << uint8(Reason);
|
||||
|
||||
return &_worldPacket;
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
|
||||
#include "Packet.h"
|
||||
#include "Player.h"
|
||||
#include "ItemPackets.h"
|
||||
|
||||
namespace WorldPackets
|
||||
{
|
||||
@@ -64,5 +65,33 @@ namespace WorldPackets
|
||||
|
||||
uint64 ID;
|
||||
};
|
||||
|
||||
class UseEquipmentSet final : public ClientPacket
|
||||
{
|
||||
public:
|
||||
UseEquipmentSet(WorldPacket&& packet) : ClientPacket(CMSG_USE_EQUIPMENT_SET, std::move(packet)) { }
|
||||
|
||||
void Read() override;
|
||||
|
||||
struct EquipmentSetItem
|
||||
{
|
||||
ObjectGuid Item;
|
||||
uint8 ContainerSlot = 0;
|
||||
uint8 Slot = 0;
|
||||
};
|
||||
|
||||
WorldPackets::Item::InvUpdate Inv;
|
||||
EquipmentSetItem Items[EQUIPMENT_SLOT_END];
|
||||
};
|
||||
|
||||
class UseEquipmentSetResult final : public ServerPacket
|
||||
{
|
||||
public:
|
||||
UseEquipmentSetResult() : ServerPacket(SMSG_USE_EQUIPMENT_SET_RESULT, 1) { }
|
||||
|
||||
WorldPacket const* Write() override;
|
||||
|
||||
uint8 Reason = 0;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -813,7 +813,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_UPGRADE_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_USE_CRITTER_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_USE_EQUIPMENT_SET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetUse );
|
||||
DEFINE_HANDLER(CMSG_USE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::UseEquipmentSet, &WorldSession::HandleUseEquipmentSet);
|
||||
DEFINE_HANDLER(CMSG_USE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::UseItem, &WorldSession::HandleUseItemOpcode);
|
||||
DEFINE_OPCODE_HANDLER_OLD(CMSG_USE_TOY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
|
||||
DEFINE_HANDLER(CMSG_VIOLENCE_LEVEL, STATUS_AUTHED, PROCESS_INPLACE, WorldPackets::Misc::ViolenceLevel, &WorldSession::HandleViolenceLevel);
|
||||
@@ -1718,7 +1718,7 @@ void OpcodeTable::Initialize()
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_ADD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_REMOVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_USE_EQUIPMENT_SET_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_USE_EQUIPMENT_SET_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VENDOR_INVENTORY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VIGNETTE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_CHAT_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
|
||||
|
||||
@@ -193,6 +193,7 @@ namespace WorldPackets
|
||||
{
|
||||
class SaveEquipmentSet;
|
||||
class DeleteEquipmentSet;
|
||||
class UseEquipmentSet;
|
||||
}
|
||||
|
||||
namespace GameObject
|
||||
@@ -1407,7 +1408,7 @@ class WorldSession
|
||||
void HandleGuildSetFocusedAchievement(WorldPackets::Achievement::GuildSetFocusedAchievement& setFocusedAchievement);
|
||||
void HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipmentSet& packet);
|
||||
void HandleDeleteEquipmentSet(WorldPackets::EquipmentSet::DeleteEquipmentSet& packet);
|
||||
void HandleEquipmentSetUse(WorldPacket& recvData);
|
||||
void HandleUseEquipmentSet(WorldPackets::EquipmentSet::UseEquipmentSet& packet);
|
||||
void HandleUITimeRequest(WorldPackets::Misc::UITimeRequest& /*request*/);
|
||||
void HandleQueryQuestCompletionNPCs(WorldPackets::Query::QueryQuestCompletionNPCs& queryQuestCompletionNPCs);
|
||||
void HandleQuestPOIQuery(WorldPackets::Query::QuestPOIQuery& packet);
|
||||
|
||||
Reference in New Issue
Block a user