aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Creature/GossipDef.h47
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Handlers/NPCHandler.cpp4
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp4
4 files changed, 40 insertions, 17 deletions
diff --git a/src/server/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h
index 03ac95cb8f7..b596a3ec5ed 100644
--- a/src/server/game/Entities/Creature/GossipDef.h
+++ b/src/server/game/Entities/Creature/GossipDef.h
@@ -21,6 +21,7 @@
#include "Common.h"
#include "ObjectGuid.h"
#include "Optional.h"
+#include <variant>
class Object;
class Quest;
@@ -233,19 +234,41 @@ class TC_GAME_API QuestMenu
class InteractionData
{
- public:
- void Reset()
- {
- SourceGuid.Clear();
- TrainerId = 0;
- PlayerChoiceId = 0;
- IsLaunchedByQuest = false;
- }
+ template <typename>
+ struct TaggedId
+ {
+ TaggedId() = default;
+ explicit TaggedId(uint32 id) : Id(id) { }
+
+ uint32 Id = 0;
+ };
+
+ struct TrainerTag;
+ using TrainerData = TaggedId<TrainerTag>;
+
+ struct PlayerChoiceTag;
+ using PlayerChoiceData = TaggedId<PlayerChoiceTag>;
+
+public:
+ void Reset()
+ {
+ SourceGuid.Clear();
+ IsLaunchedByQuest = false;
+ _data.emplace<std::monostate>();
+ }
+
+ ObjectGuid SourceGuid;
+
+ Optional<uint32> GetTrainerId() const { return std::holds_alternative<TrainerData>(_data) ? std::get<TrainerData>(_data).Id : Optional<uint32>(); }
+ void SetTrainerId(uint32 trainerId) { _data.emplace<TrainerData>(trainerId); }
+
+ Optional<uint32> GetPlayerChoiceId() const { return std::holds_alternative<TrainerData>(_data) ? std::get<PlayerChoiceData>(_data).Id : Optional<uint32>(); }
+ void SetPlayerChoice(uint32 choiceId) { _data.emplace<PlayerChoiceData>(choiceId); }
+
+ bool IsLaunchedByQuest = false;
- ObjectGuid SourceGuid;
- uint32 TrainerId = 0;
- uint32 PlayerChoiceId = 0;
- bool IsLaunchedByQuest = false;
+private:
+ std::variant<std::monostate, TrainerData, PlayerChoiceData> _data;
};
class TC_GAME_API PlayerMenu
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index cd495516c39..6e37b039fe1 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -29786,7 +29786,7 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId)
PlayerTalkClass->GetInteractionData().Reset();
PlayerTalkClass->GetInteractionData().SourceGuid = sender;
- PlayerTalkClass->GetInteractionData().PlayerChoiceId = uint32(choiceId);
+ PlayerTalkClass->GetInteractionData().SetPlayerChoice(choiceId);
WorldPackets::Quest::DisplayPlayerChoice displayPlayerChoice;
displayPlayerChoice.SenderGUID = sender;
diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp
index f1cebdf0746..3505651926b 100644
--- a/src/server/game/Handlers/NPCHandler.cpp
+++ b/src/server/game/Handlers/NPCHandler.cpp
@@ -124,7 +124,7 @@ void WorldSession::SendTrainerList(Creature* npc, uint32 trainerId)
_player->PlayerTalkClass->GetInteractionData().Reset();
_player->PlayerTalkClass->GetInteractionData().SourceGuid = npc->GetGUID();
- _player->PlayerTalkClass->GetInteractionData().TrainerId = trainerId;
+ _player->PlayerTalkClass->GetInteractionData().SetTrainerId(trainerId);
trainer->SendSpells(npc, _player, GetSessionDbLocaleIndex());
}
@@ -146,7 +146,7 @@ void WorldSession::HandleTrainerBuySpellOpcode(WorldPackets::NPC::TrainerBuySpel
if (_player->PlayerTalkClass->GetInteractionData().SourceGuid != packet.TrainerGUID)
return;
- if (_player->PlayerTalkClass->GetInteractionData().TrainerId != uint32(packet.TrainerID))
+ if (_player->PlayerTalkClass->GetInteractionData().GetTrainerId() != uint32(packet.TrainerID))
return;
Trainer::Trainer const* trainer = sObjectMgr->GetTrainer(packet.TrainerID);
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index 2c6b809c0dc..1ad44984893 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -770,10 +770,10 @@ void WorldSession::HandleRequestWorldQuestUpdate(WorldPackets::Quest::RequestWor
void WorldSession::HandlePlayerChoiceResponse(WorldPackets::Quest::ChoiceResponse& choiceResponse)
{
- if (_player->PlayerTalkClass->GetInteractionData().PlayerChoiceId != uint32(choiceResponse.ChoiceID))
+ if (_player->PlayerTalkClass->GetInteractionData().GetPlayerChoiceId() != uint32(choiceResponse.ChoiceID))
{
TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_CHOICE_RESPONSE: {} tried to respond to invalid player choice {} (allowed {}) (possible packet-hacking detected)",
- GetPlayerInfo(), choiceResponse.ChoiceID, _player->PlayerTalkClass->GetInteractionData().PlayerChoiceId);
+ GetPlayerInfo(), choiceResponse.ChoiceID, _player->PlayerTalkClass->GetInteractionData().GetPlayerChoiceId());
return;
}