diff options
| -rw-r--r-- | src/server/game/Entities/Creature/GossipDef.h | 47 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Handlers/NPCHandler.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Handlers/QuestHandler.cpp | 4 |
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; } |
