aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-11-04 21:39:21 +0100
committerShauren <shauren.trinity@gmail.com>2020-12-08 18:16:41 +0100
commitcab4c87d2d7f6d734ef067d6bf50f4b1d338a7bc (patch)
tree2eaf0fd8bc9e937a4c9611e18dd04d5001189036 /src/server/game/Handlers
parent16b39a448acbe8ace88550a367be8e6bf565b00d (diff)
Core/PacketIO: Updated most packet structures to 9.0.1
Diffstat (limited to 'src/server/game/Handlers')
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp2
-rw-r--r--src/server/game/Handlers/CalendarHandler.cpp42
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp69
-rw-r--r--src/server/game/Handlers/GarrisonHandler.cpp4
-rw-r--r--src/server/game/Handlers/HotfixHandler.cpp2
-rw-r--r--src/server/game/Handlers/LFGHandler.cpp10
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp2
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp33
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp9
-rw-r--r--src/server/game/Handlers/TicketHandler.cpp48
10 files changed, 113 insertions, 108 deletions
diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp
index 56eca9b75b1..6e94c89917d 100644
--- a/src/server/game/Handlers/BattleGroundHandler.cpp
+++ b/src/server/game/Handlers/BattleGroundHandler.cpp
@@ -600,7 +600,7 @@ void WorldSession::HandleReportPvPAFK(WorldPackets::Battleground::ReportPvPPlaye
reportedPlayer->ReportedAfkBy(_player);
}
-void WorldSession::HandleRequestRatedBattlefieldInfo(WorldPackets::Battleground::RequestRatedBattlefieldInfo& /*packet*/)
+void WorldSession::HandleRequestRatedPvpInfo(WorldPackets::Battleground::RequestRatedPvpInfo& /*packet*/)
{
WorldPackets::Battleground::RatedPvpInfo ratedPvpInfo;
SendPacket(ratedPvpInfo.Write());
diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp
index 0470e6f77e2..e80a8b3add6 100644
--- a/src/server/game/Handlers/CalendarHandler.cpp
+++ b/src/server/game/Handlers/CalendarHandler.cpp
@@ -124,10 +124,10 @@ void WorldSession::HandleCalendarGetEvent(WorldPackets::Calendar::CalendarGetEve
sCalendarMgr->SendCalendarCommandResult(_player->GetGUID(), CALENDAR_ERROR_EVENT_INVALID);
}
-void WorldSession::HandleCalendarCommunityFilter(WorldPackets::Calendar::CalendarCommunityFilter& calendarCommunityFilter)
+void WorldSession::HandleCalendarCommunityInvite(WorldPackets::Calendar::CalendarCommunityInviteRequest& calendarCommunityInvite)
{
if (Guild* guild = sGuildMgr->GetGuildById(_player->GetGuildId()))
- guild->MassInviteToEvent(this, calendarCommunityFilter.MinLevel, calendarCommunityFilter.MaxLevel, calendarCommunityFilter.MaxRankOrder);
+ guild->MassInviteToEvent(this, calendarCommunityInvite.MinLevel, calendarCommunityInvite.MaxLevel, calendarCommunityInvite.MaxRankOrder);
}
void WorldSession::HandleCalendarAddEvent(WorldPackets::Calendar::CalendarAddEvent& calendarAddEvent)
@@ -239,7 +239,7 @@ void WorldSession::HandleCalendarCopyEvent(WorldPackets::Calendar::CalendarCopyE
sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID);
}
-void WorldSession::HandleCalendarEventInvite(WorldPackets::Calendar::CalendarEventInvite& calendarEventInvite)
+void WorldSession::HandleCalendarInvite(WorldPackets::Calendar::CalendarInvite& calendarEventInvite)
{
ObjectGuid playerGuid = _player->GetGUID();
@@ -347,22 +347,22 @@ void WorldSession::HandleCalendarEventSignup(WorldPackets::Calendar::CalendarEve
sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID);
}
-void WorldSession::HandleCalendarEventRsvp(WorldPackets::Calendar::CalendarEventRSVP& calendarEventRSVP)
+void WorldSession::HandleCalendarRsvp(WorldPackets::Calendar::CalendarRSVP& calendarRSVP)
{
ObjectGuid guid = _player->GetGUID();
- if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarEventRSVP.EventID))
+ if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarRSVP.EventID))
{
// I think we still should be able to remove self from locked events
- if (calendarEventRSVP.Status != CALENDAR_STATUS_REMOVED && calendarEvent->IsLocked())
+ if (calendarRSVP.Status != CALENDAR_STATUS_REMOVED && calendarEvent->IsLocked())
{
sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_LOCKED);
return;
}
- if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarEventRSVP.InviteID))
+ if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarRSVP.InviteID))
{
- invite->SetStatus(CalendarInviteStatus(calendarEventRSVP.Status));
+ invite->SetStatus(CalendarInviteStatus(calendarRSVP.Status));
invite->SetResponseTime(time(nullptr));
sCalendarMgr->UpdateInvite(invite);
@@ -398,23 +398,23 @@ void WorldSession::HandleCalendarEventRemoveInvite(WorldPackets::Calendar::Calen
sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_NO_INVITE);
}
-void WorldSession::HandleCalendarEventStatus(WorldPackets::Calendar::CalendarEventStatus& calendarEventStatus)
+void WorldSession::HandleCalendarStatus(WorldPackets::Calendar::CalendarStatus& calendarStatus)
{
ObjectGuid guid = _player->GetGUID();
- TC_LOG_DEBUG("network", "CMSG_CALENDAR_EVENT_STATUS [%s] EventId ["
+ TC_LOG_DEBUG("network", "CMSG_CALENDAR_STATUS [%s] EventId ["
UI64FMTD "] ownerInviteId [" UI64FMTD "], Invitee ([%s] id: ["
- UI64FMTD "], status %u", guid.ToString().c_str(), calendarEventStatus.EventID, calendarEventStatus.ModeratorID, calendarEventStatus.Guid.ToString().c_str(), calendarEventStatus.InviteID, calendarEventStatus.Status);
+ UI64FMTD "], status %u", guid.ToString().c_str(), calendarStatus.EventID, calendarStatus.ModeratorID, calendarStatus.Guid.ToString().c_str(), calendarStatus.InviteID, calendarStatus.Status);
- if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarEventStatus.EventID))
+ if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarStatus.EventID))
{
- if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarEventStatus.InviteID))
+ if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarStatus.InviteID))
{
- invite->SetStatus((CalendarInviteStatus)calendarEventStatus.Status);
+ invite->SetStatus((CalendarInviteStatus)calendarStatus.Status);
sCalendarMgr->UpdateInvite(invite);
sCalendarMgr->SendCalendarEventStatus(*calendarEvent, *invite);
- sCalendarMgr->SendCalendarClearPendingAction(calendarEventStatus.Guid);
+ sCalendarMgr->SendCalendarClearPendingAction(calendarStatus.Guid);
}
else
sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_NO_INVITE); // correct?
@@ -423,19 +423,19 @@ void WorldSession::HandleCalendarEventStatus(WorldPackets::Calendar::CalendarEve
sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID);
}
-void WorldSession::HandleCalendarEventModeratorStatus(WorldPackets::Calendar::CalendarEventModeratorStatus& calendarEventModeratorStatus)
+void WorldSession::HandleCalendarModeratorStatus(WorldPackets::Calendar::CalendarModeratorStatusQuery& calendarModeratorStatus)
{
ObjectGuid guid = _player->GetGUID();
- TC_LOG_DEBUG("network", "CMSG_CALENDAR_EVENT_MODERATOR_STATUS [%s] EventID ["
+ TC_LOG_DEBUG("network", "CMSG_CALENDAR_MODERATOR_STATUS [%s] EventID ["
UI64FMTD "] ModeratorID [" UI64FMTD "], Invitee ([%s] InviteID: ["
- UI64FMTD "], Status %u", guid.ToString().c_str(), calendarEventModeratorStatus.EventID, calendarEventModeratorStatus.ModeratorID, calendarEventModeratorStatus.Guid.ToString().c_str(), calendarEventModeratorStatus.InviteID, calendarEventModeratorStatus.Status);
+ UI64FMTD "], Status %u", guid.ToString().c_str(), calendarModeratorStatus.EventID, calendarModeratorStatus.ModeratorID, calendarModeratorStatus.Guid.ToString().c_str(), calendarModeratorStatus.InviteID, calendarModeratorStatus.Status);
- if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarEventModeratorStatus.EventID))
+ if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarModeratorStatus.EventID))
{
- if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarEventModeratorStatus.InviteID))
+ if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarModeratorStatus.InviteID))
{
- invite->SetRank(CalendarModerationRank(calendarEventModeratorStatus.Status));
+ invite->SetRank(CalendarModerationRank(calendarModeratorStatus.Status));
sCalendarMgr->UpdateInvite(invite);
sCalendarMgr->SendCalendarEventModeratorStatusAlert(*calendarEvent, *invite);
}
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 9461ebdb276..49283ac0c26 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -309,10 +309,6 @@ bool LoginQueryHolder::Initialize()
void WorldSession::HandleCharEnum(PreparedQueryResult result)
{
- uint8 demonHunterCount = 0; // We use this counter to allow multiple demon hunter creations when allowed in config
- bool canAlwaysCreateDemonHunter = HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_DEMON_HUNTER);
- if (sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_DEMON_HUNTER) == 0) // char level = 0 means this check is disabled, so always true
- canAlwaysCreateDemonHunter = true;
WorldPackets::Character::EnumCharactersResult charEnum;
charEnum.Success = true;
charEnum.IsDeletedCharacters = false;
@@ -358,21 +354,11 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result)
if (!sCharacterCache->HasCharacterCacheEntry(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet.
sCharacterCache->AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.SexID, charInfo.RaceID, charInfo.ClassID, charInfo.ExperienceLevel, false);
- if (charInfo.ClassID == CLASS_DEMON_HUNTER)
- demonHunterCount++;
-
- if (demonHunterCount >= sWorld->getIntConfig(CONFIG_DEMON_HUNTERS_PER_REALM) && !canAlwaysCreateDemonHunter)
- charEnum.HasDemonHunterOnRealm = true;
- else
- charEnum.HasDemonHunterOnRealm = false;
-
charEnum.MaxCharacterLevel = std::max<int32>(charEnum.MaxCharacterLevel, charInfo.ExperienceLevel);
}
while (result->NextRow());
}
- charEnum.IsTestDemonHunterCreationAllowed = canAlwaysCreateDemonHunter;
- charEnum.IsDemonHunterCreationAllowed = GetAccountExpansion() >= EXPANSION_LEGION || canAlwaysCreateDemonHunter;
charEnum.IsAlliedRacesCreationAllowed = GetAccountExpansion() >= EXPANSION_BATTLE_FOR_AZEROTH;
for (std::pair<uint8 const, RaceUnlockRequirement> const& requirement : sObjectMgr->GetRaceUnlockRequirements())
@@ -643,26 +629,12 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact
if (result)
{
uint32 team = Player::TeamForRace(createInfo->Race);
- uint32 freeDemonHunterSlots = sWorld->getIntConfig(CONFIG_DEMON_HUNTERS_PER_REALM);
Field* field = result->Fetch();
uint8 accRace = field[1].GetUInt8();
if (checkDemonHunterReqs)
{
- uint8 accClass = field[2].GetUInt8();
- if (accClass == CLASS_DEMON_HUNTER)
- {
- if (freeDemonHunterSlots > 0)
- --freeDemonHunterSlots;
-
- if (freeDemonHunterSlots == 0)
- {
- SendCharCreate(CHAR_CREATE_FAILED);
- return;
- }
- }
-
if (!hasDemonHunterReqLevel)
{
uint8 accLevel = field[0].GetUInt8();
@@ -1376,6 +1348,40 @@ void WorldSession::HandleRequestForcedReactionsOpcode(WorldPackets::Reputation::
_player->GetReputationMgr().SendForceReactions();
}
+void WorldSession::HandleCheckCharacterNameAvailability(WorldPackets::Character::CheckCharacterNameAvailability& checkCharacterNameAvailability)
+{
+ // prevent character rename to invalid name
+ if (!normalizePlayerName(checkCharacterNameAvailability.Name))
+ {
+ SendPacket(WorldPackets::Character::CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, CHAR_NAME_NO_NAME).Write());
+ return;
+ }
+
+ ResponseCodes res = ObjectMgr::CheckPlayerName(checkCharacterNameAvailability.Name, GetSessionDbcLocale(), true);
+ if (res != CHAR_NAME_SUCCESS)
+ {
+ SendPacket(WorldPackets::Character::CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, res).Write());
+ return;
+ }
+
+ // check name limitations
+ if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME) && sObjectMgr->IsReservedName(checkCharacterNameAvailability.Name))
+ {
+ SendPacket(WorldPackets::Character::CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, CHAR_NAME_RESERVED).Write());
+ return;
+ }
+
+ // Ensure that there is no character with the desired new name
+ CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHECK_NAME);
+ stmt->setString(0, checkCharacterNameAvailability.Name);
+
+ _queryProcessor.AddCallback(CharacterDatabase.AsyncQuery(stmt)
+ .WithPreparedCallback([this, sequenceIndex = checkCharacterNameAvailability.SequenceIndex](PreparedQueryResult result)
+ {
+ SendPacket(WorldPackets::Character::CheckCharacterNameAvailabilityResult(sequenceIndex, result ? CHAR_CREATE_NAME_IN_USE : RESPONSE_SUCCESS).Write());
+ }));
+}
+
void WorldSession::HandleCharRenameOpcode(WorldPackets::Character::CharacterRenameRequest& request)
{
if (!IsLegitCharacterForAccount(request.RenameInfo->Guid))
@@ -2670,13 +2676,8 @@ void WorldSession::SendCharFactionChange(ResponseCodes result, WorldPackets::Cha
packet.Display = boost::in_place();
packet.Display->Name = factionChangeInfo->Name;
packet.Display->SexID = factionChangeInfo->SexID;
- packet.Display->SkinID = factionChangeInfo->SkinID;
- packet.Display->HairColorID = factionChangeInfo->HairColorID;
- packet.Display->HairStyleID = factionChangeInfo->HairStyleID;
- packet.Display->FacialHairStyleID = factionChangeInfo->FacialHairStyleID;
- packet.Display->FaceID = factionChangeInfo->FaceID;
+ packet.Display->Customizations = &factionChangeInfo->Customizations;
packet.Display->RaceID = factionChangeInfo->RaceID;
- packet.Display->CustomDisplay = factionChangeInfo->CustomDisplay;
}
SendPacket(packet.Write());
diff --git a/src/server/game/Handlers/GarrisonHandler.cpp b/src/server/game/Handlers/GarrisonHandler.cpp
index 22f42084aa1..ef725a3cd39 100644
--- a/src/server/game/Handlers/GarrisonHandler.cpp
+++ b/src/server/game/Handlers/GarrisonHandler.cpp
@@ -50,8 +50,8 @@ void WorldSession::HandleGarrisonRequestBlueprintAndSpecializationData(WorldPack
garrison->SendBlueprintAndSpecializationData();
}
-void WorldSession::HandleGarrisonGetBuildingLandmarks(WorldPackets::Garrison::GarrisonGetBuildingLandmarks& /*garrisonGetBuildingLandmarks*/)
+void WorldSession::HandleGarrisonGetMapData(WorldPackets::Garrison::GarrisonGetMapData& /*garrisonGetMapData*/)
{
if (Garrison* garrison = _player->GetGarrison())
- garrison->SendBuildingLandmarks(_player);
+ garrison->SendMapData(_player);
}
diff --git a/src/server/game/Handlers/HotfixHandler.cpp b/src/server/game/Handlers/HotfixHandler.cpp
index 798b7060f2d..85880fd0786 100644
--- a/src/server/game/Handlers/HotfixHandler.cpp
+++ b/src/server/game/Handlers/HotfixHandler.cpp
@@ -42,7 +42,7 @@ void WorldSession::HandleDBQueryBulk(WorldPackets::Hotfix::DBQueryBulk& dbQuery)
if (store->HasRecord(record.RecordID))
{
- dbReply.Allow = true;
+ dbReply.Status = 1;
dbReply.Timestamp = GameTime::GetGameTime();
store->WriteRecord(record.RecordID, GetSessionDbcLocale(), dbReply.Data);
}
diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp
index dd15b7e7590..b2982d5c36d 100644
--- a/src/server/game/Handlers/LFGHandler.cpp
+++ b/src/server/game/Handlers/LFGHandler.cpp
@@ -151,7 +151,7 @@ void WorldSession::SendLfgPlayerLockInfo()
// Get player locked Dungeons
for (auto const& lock : sLFGMgr->GetLockedDungeons(_player->GetGUID()))
- lfgPlayerInfo.BlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel);
+ lfgPlayerInfo.BlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel, 0);
for (uint32 slot : randomDungeons)
{
@@ -224,7 +224,7 @@ void WorldSession::SendLfgPartyLockInfo()
WorldPackets::LFG::LFGBlackList& lfgBlackList = lfgPartyInfo.Player.back();
lfgBlackList.PlayerGuid = pguid;
for (auto const& lock : sLFGMgr->GetLockedDungeons(pguid))
- lfgBlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel);
+ lfgBlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel, 0);
}
TC_LOG_DEBUG("lfg", "SMSG_LFG_PARTY_INFO %s", GetPlayerInfo().c_str());
@@ -347,15 +347,15 @@ void WorldSession::SendLfgJoinResult(lfg::LfgJoinResultData const& joinData)
for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it)
{
lfgJoinResult.BlackList.emplace_back();
- WorldPackets::LFG::LFGJoinBlackList& blackList = lfgJoinResult.BlackList.back();
- blackList.Guid = it->first;
+ WorldPackets::LFG::LFGBlackList& blackList = lfgJoinResult.BlackList.back();
+ blackList.PlayerGuid = it->first;
for (lfg::LfgLockMap::const_iterator itr = it->second.begin(); itr != it->second.end(); ++itr)
{
TC_LOG_TRACE("lfg", "SendLfgJoinResult:: %s DungeonID: %u Lock status: %u Required itemLevel: %u Current itemLevel: %f",
it->first.ToString().c_str(), (itr->first & 0x00FFFFFF), itr->second.lockStatus, itr->second.requiredItemLevel, itr->second.currentItemLevel);
- blackList.Slots.emplace_back(itr->first, itr->second.lockStatus, itr->second.requiredItemLevel, itr->second.currentItemLevel);
+ blackList.Slot.emplace_back(itr->first, itr->second.lockStatus, itr->second.requiredItemLevel, itr->second.currentItemLevel, 0);
}
}
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index 66e891fe3ee..9f7c2532005 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -240,7 +240,7 @@ void WorldSession::HandleSuspendTokenResponse(WorldPackets::Movement::SuspendTok
WorldPackets::Movement::NewWorld packet;
packet.MapID = loc.GetMapId();
- packet.Pos = loc;
+ packet.Loc.Pos = loc;
packet.Reason = !_player->IsBeingTeleportedSeamlessly() ? NEW_WORLD_NORMAL : NEW_WORLD_SEAMLESS;
SendPacket(packet.Write());
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index 6bcb4f29a0b..9590356f3dd 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -26,6 +26,7 @@
#include "GossipDef.h"
#include "Group.h"
#include "Log.h"
+#include "LootMgr.h"
#include "ObjectAccessor.h"
#include "ObjectMgr.h"
#include "Player.h"
@@ -252,26 +253,31 @@ void WorldSession::HandleQuestQueryOpcode(WorldPackets::Quest::QueryQuestInfo& p
void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::QuestGiverChooseReward& packet)
{
- TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_CHOOSE_REWARD npc = %s, quest = %u, reward = %u", packet.QuestGiverGUID.ToString().c_str(), packet.QuestID, packet.ItemChoiceID);
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_CHOOSE_REWARD npc = %s, quest = %u, reward = %u",
+ packet.QuestGiverGUID.ToString().c_str(), packet.QuestID, packet.Choice.Item.ItemID);
Quest const* quest = sObjectMgr->GetQuestTemplate(packet.QuestID);
if (!quest)
return;
- // This is Real Item Entry, not slot id as pre 5.x
- if (packet.ItemChoiceID)
+ // TODO: currency choice items
+ if (packet.Choice.LootItemType != LootItemType::Item)
+ return;
+
+ if (packet.Choice.Item.ItemID)
{
- ItemTemplate const* rewardProto = sObjectMgr->GetItemTemplate(packet.ItemChoiceID);
+ ItemTemplate const* rewardProto = sObjectMgr->GetItemTemplate(packet.Choice.Item.ItemID);
if (!rewardProto)
{
- TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get invalid reward item (Item Entry: %u) for quest %u (possible packet-hacking detected)", _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.ItemChoiceID, packet.QuestID);
+ TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get invalid reward item (Item Entry: %u) for quest %u (possible packet-hacking detected)",
+ _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.Choice.Item.ItemID, packet.QuestID);
return;
}
bool itemValid = false;
for (uint32 i = 0; i < quest->GetRewChoiceItemsCount(); ++i)
{
- if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemId[i] == uint32(packet.ItemChoiceID))
+ if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemId[i] == packet.Choice.Item.ItemID)
{
itemValid = true;
break;
@@ -284,7 +290,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest
{
for (QuestPackageItemEntry const* questPackageItem : *questPackageItems)
{
- if (questPackageItem->ItemID != packet.ItemChoiceID)
+ if (questPackageItem->ItemID != packet.Choice.Item.ItemID)
continue;
if (_player->CanSelectQuestPackageItem(questPackageItem))
@@ -301,7 +307,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest
{
for (QuestPackageItemEntry const* questPackageItem : *questPackageItems)
{
- if (questPackageItem->ItemID != packet.ItemChoiceID)
+ if (questPackageItem->ItemID != packet.Choice.Item.ItemID)
continue;
itemValid = true;
@@ -313,7 +319,8 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest
if (!itemValid)
{
- TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get reward item (Item Entry: %u) wich is not a reward for quest %u (possible packet-hacking detected)", _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.ItemChoiceID, packet.QuestID);
+ TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get reward item (Item Entry: %u) wich is not a reward for quest %u (possible packet-hacking detected)",
+ _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.Choice.Item.ItemID, packet.QuestID);
return;
}
}
@@ -339,9 +346,9 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest
return;
}
- if (_player->CanRewardQuest(quest, packet.ItemChoiceID, true))
+ if (_player->CanRewardQuest(quest, packet.Choice.Item.ItemID, true))
{
- _player->RewardQuest(quest, packet.ItemChoiceID, object);
+ _player->RewardQuest(quest, packet.Choice.Item.ItemID, object);
switch (object->GetTypeId())
{
@@ -364,7 +371,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest
}
_player->PlayerTalkClass->ClearMenus();
- creatureQGiver->GetAI()->QuestReward(_player, quest, packet.ItemChoiceID);
+ creatureQGiver->GetAI()->QuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID);
break;
}
case TYPEID_GAMEOBJECT:
@@ -384,7 +391,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest
}
_player->PlayerTalkClass->ClearMenus();
- questGiver->AI()->QuestReward(_player, quest, packet.ItemChoiceID);
+ questGiver->AI()->QuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID);
break;
}
default:
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index 5ff33e97bf3..8ccfd1c29c3 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -541,13 +541,8 @@ void WorldSession::HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorI
Guild* guild = player->GetGuild();
- mirrorImageComponentedData.SkinColor = player->m_playerData->SkinID;
- mirrorImageComponentedData.FaceVariation = player->m_playerData->FaceID;
- mirrorImageComponentedData.HairVariation = player->m_playerData->HairStyleID;
- mirrorImageComponentedData.HairColor = player->m_playerData->HairColorID;
- mirrorImageComponentedData.BeardVariation = player->m_playerData->FacialHairStyleID;
- for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i)
- mirrorImageComponentedData.CustomDisplay[i] = player->m_playerData->CustomDisplayOption[i];
+ for (UF::ChrCustomizationChoice customization : player->m_playerData->Customizations)
+ mirrorImageComponentedData.Customizations.push_back({ customization.ChrCustomizationOptionID, customization.ChrCustomizationChoiceID });
mirrorImageComponentedData.GuildGUID = (guild ? guild->GetGUID() : ObjectGuid::Empty);
mirrorImageComponentedData.ItemDisplayID.reserve(11);
diff --git a/src/server/game/Handlers/TicketHandler.cpp b/src/server/game/Handlers/TicketHandler.cpp
index ef1332dc4a2..af1b54218cd 100644
--- a/src/server/game/Handlers/TicketHandler.cpp
+++ b/src/server/game/Handlers/TicketHandler.cpp
@@ -40,30 +40,32 @@ void WorldSession::HandleGMTicketSystemStatusOpcode(WorldPackets::Ticket::GMTick
SendPacket(response.Write());
}
-void WorldSession::HandleSupportTicketSubmitBug(WorldPackets::Ticket::SupportTicketSubmitBug& packet)
+void WorldSession::HandleSubmitUserFeedback(WorldPackets::Ticket::SubmitUserFeedback& userFeedback)
{
- if (!sSupportMgr->GetBugSystemStatus())
- return;
-
- BugTicket* ticket = new BugTicket(GetPlayer());
- ticket->SetPosition(packet.Header.MapID, packet.Header.Position);
- ticket->SetFacing(packet.Header.Facing);
- ticket->SetNote(packet.Note);
-
- sSupportMgr->AddTicket(ticket);
-}
-
-void WorldSession::HandleSupportTicketSubmitSuggestion(WorldPackets::Ticket::SupportTicketSubmitSuggestion& packet)
-{
- if (!sSupportMgr->GetSuggestionSystemStatus())
- return;
-
- SuggestionTicket* ticket = new SuggestionTicket(GetPlayer());
- ticket->SetPosition(packet.Header.MapID, packet.Header.Position);
- ticket->SetFacing(packet.Header.Facing);
- ticket->SetNote(packet.Note);
-
- sSupportMgr->AddTicket(ticket);
+ if (userFeedback.IsSuggestion)
+ {
+ if (!sSupportMgr->GetSuggestionSystemStatus())
+ return;
+
+ SuggestionTicket* ticket = new SuggestionTicket(GetPlayer());
+ ticket->SetPosition(userFeedback.Header.MapID, userFeedback.Header.Position);
+ ticket->SetFacing(userFeedback.Header.Facing);
+ ticket->SetNote(userFeedback.Note);
+
+ sSupportMgr->AddTicket(ticket);
+ }
+ else
+ {
+ if (!sSupportMgr->GetBugSystemStatus())
+ return;
+
+ BugTicket* ticket = new BugTicket(GetPlayer());
+ ticket->SetPosition(userFeedback.Header.MapID, userFeedback.Header.Position);
+ ticket->SetFacing(userFeedback.Header.Facing);
+ ticket->SetNote(userFeedback.Note);
+
+ sSupportMgr->AddTicket(ticket);
+ }
}
void WorldSession::HandleSupportTicketSubmitComplaint(WorldPackets::Ticket::SupportTicketSubmitComplaint& packet)