aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/CharacterHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Handlers/CharacterHandler.cpp')
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp70
1 files changed, 29 insertions, 41 deletions
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index a2e6f4b0340..42db4f42953 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -29,6 +29,7 @@
#include "ClientConfigPackets.h"
#include "Common.h"
#include "DatabaseEnv.h"
+#include "EquipmentSetPackets.h"
#include "Group.h"
#include "Guild.h"
#include "GuildFinderMgr.h"
@@ -857,6 +858,16 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
/// Send FeatureSystemStatus
{
WorldPackets::System::FeatureSystemStatus features;
+
+ /// START OF DUMMY VALUES
+ features.ComplaintStatus = 2;
+ features.ScrollOfResurrectionRequestsRemaining = 1;
+ features.ScrollOfResurrectionMaxRequestsPerDay = 1;
+ features.CfgRealmID = 2;
+ features.CfgRealmRecID = 0;
+ features.VoiceEnabled = true;
+ /// END OF DUMMY VALUES
+
features.CharUndeleteEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_CHARACTER_UNDELETE_ENABLED);
features.BpayStoreEnabled = sWorld->getBoolConfig(CONFIG_FEATURE_SYSTEM_BPAY_STORE_ENABLED);
@@ -1525,59 +1536,36 @@ void WorldSession::HandleCharCustomizeCallback(PreparedQueryResult result, World
GetAccountId(), GetRemoteAddress().c_str(), oldName.c_str(), customizeInfo->CharGUID.ToString().c_str(), customizeInfo->CharName.c_str());
}
-void WorldSession::HandleEquipmentSetSave(WorldPacket& recvData)
+void WorldSession::HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipmentSet& packet)
{
TC_LOG_DEBUG("network", "CMSG_EQUIPMENT_SET_SAVE");
- uint64 setGuid;
- recvData.ReadPackedUInt64(setGuid);
-
- uint32 index;
- recvData >> index;
- if (index >= MAX_EQUIPMENT_SET_INDEX) // client set slots amount
+ if (packet.Set.SetID >= MAX_EQUIPMENT_SET_INDEX) // client set slots amount
return;
- std::string name;
- recvData >> name;
-
- std::string iconName;
- recvData >> iconName;
-
- EquipmentSet eqSet;
-
- eqSet.Guid = setGuid;
- eqSet.Name = name;
- eqSet.IconName = iconName;
- eqSet.state = EQUIPMENT_SET_NEW;
-
- 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();
-
- // equipment manager sends "1" (as raw GUID) for slots set to "ignore" (don't touch slot at equip set)
- if (itemGuid == ignoredItemGuid)
+ if (!(packet.Set.IgnoreMask & (1 << i)))
{
- // ignored slots saved as bit mask because we have no free special values for Items[i]
- eqSet.IgnoreMask |= 1 << i;
- continue;
- }
-
- Item* item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);
+ ObjectGuid const& itemGuid = packet.Set.Pieces[i];
- if (!item && !itemGuid.IsEmpty()) // cheating check 1
- return;
+ Item* item = _player->GetItemByPos(INVENTORY_SLOT_BAG_0, i);
- if (item && item->GetGUID() != itemGuid) // cheating check 2
- return;
+ /// cheating check 1 (item equipped but sent empty guid)
+ if (!item && !itemGuid.IsEmpty())
+ return;
- eqSet.Items[i] = itemGuid.GetCounter();
+ /// cheating check 2 (sent guid does not match equipped item)
+ if (item && item->GetGUID() != itemGuid)
+ return;
+ }
+ else
+ packet.Set.Pieces[i].Clear();
}
- _player->SetEquipmentSet(index, eqSet);
+ packet.Set.IgnoreMask &= 0x7FFFF; /// clear invalid bits (i > EQUIPMENT_SLOT_END)
+
+ _player->SetEquipmentSet(std::move(packet.Set));
}
void WorldSession::HandleEquipmentSetDelete(WorldPacket& recvData)