diff --git a/include/game/game_handler.hpp b/include/game/game_handler.hpp index 215e704e..d3f3ad11 100644 --- a/include/game/game_handler.hpp +++ b/include/game/game_handler.hpp @@ -11,6 +11,7 @@ #include "game/combat_handler.hpp" #include "game/spell_handler.hpp" #include "game/quest_handler.hpp" +#include "game/movement_handler.hpp" #include "network/packet.hpp" #include #include @@ -428,12 +429,12 @@ public: void queryServerTime(); void requestPlayedTime(); void queryWho(const std::string& playerName = ""); - uint32_t getTotalTimePlayed() const { return totalTimePlayed_; } - uint32_t getLevelTimePlayed() const { return levelTimePlayed_; } + uint32_t getTotalTimePlayed() const; + uint32_t getLevelTimePlayed() const; using WhoEntry = game::WhoEntry; - const std::vector& getWhoResults() const { return whoResults_; } - uint32_t getWhoOnlineCount() const { return whoOnlineCount_; } + const std::vector& getWhoResults() const; + uint32_t getWhoOnlineCount() const; std::string getWhoAreaName(uint32_t zoneId) const { return getAreaName(zoneId); } // Social commands @@ -457,21 +458,19 @@ public: bool hasPendingBgInvite() const; void acceptBattlefield(uint32_t queueSlot = 0xFFFFFFFF); void declineBattlefield(uint32_t queueSlot = 0xFFFFFFFF); - const std::array& getBgQueues() const { return bgQueues_; } - const std::vector& getAvailableBgs() const { return availableBgs_; } + const std::array& getBgQueues() const; + const std::vector& getAvailableBgs() const; // BG scoreboard (aliased from handler_types.hpp) using BgPlayerScore = game::BgPlayerScore; using ArenaTeamScore = game::ArenaTeamScore; using BgScoreboardData = game::BgScoreboardData; void requestPvpLog(); - const BgScoreboardData* getBgScoreboard() const { - return bgScoreboard_.players.empty() ? nullptr : &bgScoreboard_; - } + const BgScoreboardData* getBgScoreboard() const; // BG flag carrier positions (aliased from handler_types.hpp) using BgPlayerPosition = game::BgPlayerPosition; - const std::vector& getBgPlayerPositions() const { return bgPlayerPositions_; } + const std::vector& getBgPlayerPositions() const; // Network latency (milliseconds, updated each PONG response) uint32_t getLatencyMs() const { return lastLatency; } @@ -482,8 +481,8 @@ public: // Instance difficulty void sendSetDifficulty(uint32_t difficulty); - bool isLoggingOut() const { return loggingOut_; } - float getLogoutCountdown() const { return logoutCountdown_; } + bool isLoggingOut() const; + float getLogoutCountdown() const; // Stand state void setStandState(uint8_t state); // 0=stand, 1=sit, 2=sit_chair, 3=sleep, 4=sit_low_chair, 5=sit_medium_chair, 6=sit_high_chair, 7=dead, 8=kneel, 9=submerged @@ -554,31 +553,27 @@ public: void buyPetition(uint64_t npcGuid, const std::string& guildName); // Guild state accessors - bool isInGuild() const { - if (!guildName_.empty()) return true; - const Character* ch = getActiveCharacter(); - return ch && ch->hasGuild(); - } - const std::string& getGuildName() const { return guildName_; } - const GuildRosterData& getGuildRoster() const { return guildRoster_; } - bool hasGuildRoster() const { return hasGuildRoster_; } - const std::vector& getGuildRankNames() const { return guildRankNames_; } - bool hasPendingGuildInvite() const { return pendingGuildInvite_; } - const std::string& getPendingGuildInviterName() const { return pendingGuildInviterName_; } - const std::string& getPendingGuildInviteGuildName() const { return pendingGuildInviteGuildName_; } - const GuildInfoData& getGuildInfoData() const { return guildInfoData_; } - const GuildQueryResponseData& getGuildQueryData() const { return guildQueryData_; } - bool hasGuildInfoData() const { return guildInfoData_.isValid(); } - bool hasPetitionShowlist() const { return showPetitionDialog_; } + bool isInGuild() const; + const std::string& getGuildName() const; + const GuildRosterData& getGuildRoster() const; + bool hasGuildRoster() const; + const std::vector& getGuildRankNames() const; + bool hasPendingGuildInvite() const; + const std::string& getPendingGuildInviterName() const; + const std::string& getPendingGuildInviteGuildName() const; + const GuildInfoData& getGuildInfoData() const; + const GuildQueryResponseData& getGuildQueryData() const; + bool hasGuildInfoData() const; + bool hasPetitionShowlist() const; void clearPetitionDialog() { showPetitionDialog_ = false; } - uint32_t getPetitionCost() const { return petitionCost_; } - uint64_t getPetitionNpcGuid() const { return petitionNpcGuid_; } + uint32_t getPetitionCost() const; + uint64_t getPetitionNpcGuid() const; // Petition signatures (guild charter signing flow) using PetitionSignature = game::PetitionSignature; using PetitionInfo = game::PetitionInfo; - const PetitionInfo& getPetitionInfo() const { return petitionInfo_; } - bool hasPetitionSignaturesUI() const { return petitionInfo_.showUI; } + const PetitionInfo& getPetitionInfo() const; + bool hasPetitionSignaturesUI() const; void clearPetitionSignaturesUI() { petitionInfo_.showUI = false; } void signPetition(uint64_t petitionGuid); void turnInPetition(uint64_t petitionGuid); @@ -593,10 +588,10 @@ public: using ReadyCheckResult = game::ReadyCheckResult; void initiateReadyCheck(); void respondToReadyCheck(bool ready); - bool hasPendingReadyCheck() const { return pendingReadyCheck_; } + bool hasPendingReadyCheck() const; void dismissReadyCheck() { pendingReadyCheck_ = false; } - const std::string& getReadyCheckInitiator() const { return readyCheckInitiator_; } - const std::vector& getReadyCheckResults() const { return readyCheckResults_; } + const std::string& getReadyCheckInitiator() const; + const std::vector& getReadyCheckResults() const; // Duel void forfeitDuel(); @@ -793,11 +788,11 @@ public: // Repeat-craft queue void startCraftQueue(uint32_t spellId, int count); void cancelCraftQueue(); - int getCraftQueueRemaining() const { return craftQueueRemaining_; } - uint32_t getCraftQueueSpellId() const { return craftQueueSpellId_; } + int getCraftQueueRemaining() const; + uint32_t getCraftQueueSpellId() const; // 400ms spell-queue window: next spell to cast when current finishes - uint32_t getQueuedSpellId() const { return queuedSpellId_; } + uint32_t getQueuedSpellId() const; void cancelQueuedSpell() { queuedSpellId_ = 0; queuedSpellTarget_ = 0; } // Unit cast state (aliased from handler_types.hpp) @@ -856,8 +851,8 @@ public: auto it = talentTabCache_.find(tabId); return (it != talentTabCache_.end()) ? &it->second : nullptr; } - const std::unordered_map& getAllTalents() const { return talentCache_; } - const std::unordered_map& getAllTalentTabs() const { return talentTabCache_; } + const std::unordered_map& getAllTalents() const; + const std::unordered_map& getAllTalentTabs() const; void loadTalentDbc(); // Action bar — 4 bars × 12 slots = 48 total @@ -983,7 +978,7 @@ public: float rem = gcdTotal_ - elapsed; return rem > 0.0f ? rem : 0.0f; } - float getGCDTotal() const { return gcdTotal_; } + float getGCDTotal() const; bool isGCDActive() const { return getGCDRemaining() > 0.0f; } // Weather state (updated by SMSG_WEATHER) @@ -1200,15 +1195,15 @@ public: /** Send CMSG_SELF_RES to use Reincarnation / Twisting Nether. */ void useSelfRes(); const std::string& getResurrectCasterName() const { return resurrectCasterName_; } - bool showTalentWipeConfirmDialog() const { return talentWipePending_; } - uint32_t getTalentWipeCost() const { return talentWipeCost_; } + bool showTalentWipeConfirmDialog() const; + uint32_t getTalentWipeCost() const; void confirmTalentWipe(); - void cancelTalentWipe() { talentWipePending_ = false; } + void cancelTalentWipe(); // Pet talent respec confirm - bool showPetUnlearnDialog() const { return petUnlearnPending_; } - uint32_t getPetUnlearnCost() const { return petUnlearnCost_; } + bool showPetUnlearnDialog() const; + uint32_t getPetUnlearnCost() const; void confirmPetUnlearn(); - void cancelPetUnlearn() { petUnlearnPending_ = false; } + void cancelPetUnlearn(); // Barber shop bool isBarberShopOpen() const { return barberShopOpen_; } @@ -1216,9 +1211,9 @@ public: void sendAlterAppearance(uint32_t hairStyle, uint32_t hairColor, uint32_t facialHair); // Instance difficulty (0=5N, 1=5H, 2=25N, 3=25H for WotLK) - uint32_t getInstanceDifficulty() const { return instanceDifficulty_; } - bool isInstanceHeroic() const { return instanceIsHeroic_; } - bool isInInstance() const { return inInstance_; } + uint32_t getInstanceDifficulty() const; + bool isInstanceHeroic() const; + bool isInInstance() const; /** True when ghost is within 40 yards of corpse position (same map). */ bool canReclaimCorpse() const; @@ -1262,16 +1257,16 @@ public: const std::string& getPendingInviterName() const { return pendingInviterName; } // ---- Item text (books / readable items) ---- - bool isItemTextOpen() const { return itemTextOpen_; } - const std::string& getItemText() const { return itemText_; } - void closeItemText() { itemTextOpen_ = false; } + bool isItemTextOpen() const; + const std::string& getItemText() const; + void closeItemText(); void queryItemText(uint64_t itemGuid); // ---- Shared Quest ---- - bool hasPendingSharedQuest() const { return pendingSharedQuest_; } - uint32_t getSharedQuestId() const { return sharedQuestId_; } - const std::string& getSharedQuestTitle() const { return sharedQuestTitle_; } - const std::string& getSharedQuestSharerName() const { return sharedQuestSharerName_; } + bool hasPendingSharedQuest() const; + uint32_t getSharedQuestId() const; + const std::string& getSharedQuestTitle() const; + const std::string& getSharedQuestSharerName() const; void acceptSharedQuest(); void declineSharedQuest(); @@ -1327,22 +1322,16 @@ public: void setTradeGold(uint64_t copper); // ---- Duel ---- - bool hasPendingDuelRequest() const { return pendingDuelRequest_; } - const std::string& getDuelChallengerName() const { return duelChallengerName_; } + bool hasPendingDuelRequest() const; + const std::string& getDuelChallengerName() const; void acceptDuel(); // forfeitDuel() already declared at line ~399 // Returns remaining duel countdown seconds, or 0 if no active countdown - float getDuelCountdownRemaining() const { - if (duelCountdownMs_ == 0) return 0.0f; - auto elapsed = std::chrono::duration_cast( - std::chrono::steady_clock::now() - duelCountdownStartedAt_).count(); - float rem = (static_cast(duelCountdownMs_) - static_cast(elapsed)) / 1000.0f; - return rem > 0.0f ? rem : 0.0f; - } + float getDuelCountdownRemaining() const; // Instance lockouts (aliased from handler_types.hpp) using InstanceLockout = game::InstanceLockout; - const std::vector& getInstanceLockouts() const { return instanceLockouts_; } + const std::vector& getInstanceLockouts() const; // Boss encounter unit tracking (SMSG_UPDATE_INSTANCE_ENCOUNTER_UNIT) static constexpr uint32_t kMaxEncounterSlots = 5; @@ -1379,25 +1368,25 @@ public: void lfgAcceptProposal(uint32_t proposalId, bool accept); void lfgSetBootVote(bool vote); void lfgTeleport(bool toLfgDungeon = true); - LfgState getLfgState() const { return lfgState_; } - bool isLfgQueued() const { return lfgState_ == LfgState::Queued; } - bool isLfgInDungeon() const { return lfgState_ == LfgState::InDungeon; } - uint32_t getLfgDungeonId() const { return lfgDungeonId_; } - std::string getCurrentLfgDungeonName() const { return getLfgDungeonName(lfgDungeonId_); } + LfgState getLfgState() const; + bool isLfgQueued() const; + bool isLfgInDungeon() const; + uint32_t getLfgDungeonId() const; + std::string getCurrentLfgDungeonName() const; std::string getMapName(uint32_t mapId) const; - uint32_t getLfgProposalId() const { return lfgProposalId_; } - int32_t getLfgAvgWaitSec() const { return lfgAvgWaitSec_; } - uint32_t getLfgTimeInQueueMs() const { return lfgTimeInQueueMs_; } - uint32_t getLfgBootVotes() const { return lfgBootVotes_; } - uint32_t getLfgBootTotal() const { return lfgBootTotal_; } - uint32_t getLfgBootTimeLeft() const { return lfgBootTimeLeft_; } - uint32_t getLfgBootNeeded() const { return lfgBootNeeded_; } - const std::string& getLfgBootTargetName() const { return lfgBootTargetName_; } - const std::string& getLfgBootReason() const { return lfgBootReason_; } + uint32_t getLfgProposalId() const; + int32_t getLfgAvgWaitSec() const; + uint32_t getLfgTimeInQueueMs() const; + uint32_t getLfgBootVotes() const; + uint32_t getLfgBootTotal() const; + uint32_t getLfgBootTimeLeft() const; + uint32_t getLfgBootNeeded() const; + const std::string& getLfgBootTargetName() const; + const std::string& getLfgBootReason() const; // Arena team stats (aliased from handler_types.hpp) using ArenaTeamStats = game::ArenaTeamStats; - const std::vector& getArenaTeamStats() const { return arenaTeamStats_; } + const std::vector& getArenaTeamStats() const; void requestArenaTeamRoster(uint32_t teamId); // Arena team roster (aliased from handler_types.hpp) @@ -1416,24 +1405,24 @@ public: void lootItem(uint8_t slotIndex); void closeLoot(); void activateSpiritHealer(uint64_t npcGuid); - bool isLootWindowOpen() const { return lootWindowOpen; } - const LootResponseData& getCurrentLoot() const { return currentLoot; } - void setAutoLoot(bool enabled) { autoLoot_ = enabled; } - bool isAutoLoot() const { return autoLoot_; } - void setAutoSellGrey(bool enabled) { autoSellGrey_ = enabled; } - bool isAutoSellGrey() const { return autoSellGrey_; } - void setAutoRepair(bool enabled) { autoRepair_ = enabled; } - bool isAutoRepair() const { return autoRepair_; } + bool isLootWindowOpen() const; + const LootResponseData& getCurrentLoot() const; + void setAutoLoot(bool enabled); + bool isAutoLoot() const; + void setAutoSellGrey(bool enabled); + bool isAutoSellGrey() const; + void setAutoRepair(bool enabled); + bool isAutoRepair() const; // Master loot candidates (from SMSG_LOOT_MASTER_LIST) - const std::vector& getMasterLootCandidates() const { return masterLootCandidates_; } - bool hasMasterLootCandidates() const { return !masterLootCandidates_.empty(); } + const std::vector& getMasterLootCandidates() const; + bool hasMasterLootCandidates() const; void lootMasterGive(uint8_t lootSlot, uint64_t targetGuid); // Group loot roll (aliased from handler_types.hpp) using LootRollEntry = game::LootRollEntry; - bool hasPendingLootRoll() const { return pendingLootRollActive_; } - const LootRollEntry& getPendingLootRoll() const { return pendingLootRoll_; } + bool hasPendingLootRoll() const; + const LootRollEntry& getPendingLootRoll() const; void sendLootRoll(uint64_t objectGuid, uint32_t slot, uint8_t rollType); // rollType: 0=need, 1=greed, 2=disenchant, 96=pass @@ -1475,24 +1464,24 @@ public: // Gossip POI (aliased from handler_types.hpp) using GossipPoi = game::GossipPoi; - const std::vector& getGossipPois() const { return gossipPois_; } + const std::vector& getGossipPois() const; void clearGossipPois() { gossipPois_.clear(); } // Quest turn-in - bool isQuestRequestItemsOpen() const { return questRequestItemsOpen_; } - const QuestRequestItemsData& getQuestRequestItems() const { return currentQuestRequestItems_; } + bool isQuestRequestItemsOpen() const; + const QuestRequestItemsData& getQuestRequestItems() const; void completeQuest(); // Send CMSG_QUESTGIVER_COMPLETE_QUEST void closeQuestRequestItems(); - bool isQuestOfferRewardOpen() const { return questOfferRewardOpen_; } - const QuestOfferRewardData& getQuestOfferReward() const { return currentQuestOfferReward_; } + bool isQuestOfferRewardOpen() const; + const QuestOfferRewardData& getQuestOfferReward() const; void chooseQuestReward(uint32_t rewardIndex); // Send CMSG_QUESTGIVER_CHOOSE_REWARD void closeQuestOfferReward(); // Quest log using QuestLogEntry = QuestHandler::QuestLogEntry; - const std::vector& getQuestLog() const { return questLog_; } - int getSelectedQuestLogIndex() const { return selectedQuestLogIndex_; } + const std::vector& getQuestLog() const; + int getSelectedQuestLogIndex() const; void setSelectedQuestLogIndex(int idx) { selectedQuestLogIndex_ = idx; } void abandonQuest(uint32_t questId); void shareQuestWithParty(uint32_t questId); // CMSG_PUSHQUESTTOPARTY @@ -1503,7 +1492,7 @@ public: else trackedQuestIds_.erase(questId); saveCharacterConfig(); } - const std::unordered_set& getTrackedQuestIds() const { return trackedQuestIds_; } + const std::unordered_set& getTrackedQuestIds() const; bool isQuestQueryPending(uint32_t questId) const { return pendingQuestQueryIds_.count(questId) > 0; } @@ -1685,7 +1674,7 @@ public: auto it = npcQuestStatus_.find(guid); return (it != npcQuestStatus_.end()) ? it->second : QuestGiverStatus::NONE; } - const std::unordered_map& getNpcQuestStatuses() const { return npcQuestStatus_; } + const std::unordered_map& getNpcQuestStatuses() const; // Charge callback — fires when player casts a charge spell toward target // Parameters: targetGuid, targetX, targetY, targetZ (canonical WoW coordinates) @@ -1853,14 +1842,14 @@ public: bool isMounted() const { return currentMountDisplayId_ != 0; } bool isHostileAttacker(uint64_t guid) const; bool isHostileFactionPublic(uint32_t factionTemplateId) const { return isHostileFaction(factionTemplateId); } - float getServerRunSpeed() const { return serverRunSpeed_; } - float getServerWalkSpeed() const { return serverWalkSpeed_; } - float getServerSwimSpeed() const { return serverSwimSpeed_; } - float getServerSwimBackSpeed() const { return serverSwimBackSpeed_; } - float getServerFlightSpeed() const { return serverFlightSpeed_; } - float getServerFlightBackSpeed() const { return serverFlightBackSpeed_; } - float getServerRunBackSpeed() const { return serverRunBackSpeed_; } - float getServerTurnRate() const { return serverTurnRate_; } + float getServerRunSpeed() const; + float getServerWalkSpeed() const; + float getServerSwimSpeed() const; + float getServerSwimBackSpeed() const; + float getServerFlightSpeed() const; + float getServerFlightBackSpeed() const; + float getServerRunBackSpeed() const; + float getServerTurnRate() const; bool isPlayerRooted() const { return (movementInfo.flags & static_cast(MovementFlags::ROOT)) != 0; } @@ -1890,38 +1879,21 @@ public: void dismount(); // Taxi / Flight Paths - bool isTaxiWindowOpen() const { return taxiWindowOpen_; } + bool isTaxiWindowOpen() const; void closeTaxi(); void activateTaxi(uint32_t destNodeId); - bool isOnTaxiFlight() const { return onTaxiFlight_; } - bool isTaxiMountActive() const { return taxiMountActive_; } - bool isTaxiActivationPending() const { return taxiActivatePending_; } + bool isOnTaxiFlight() const; + bool isTaxiMountActive() const; + bool isTaxiActivationPending() const; void forceClearTaxiAndMovementState(); - const std::string& getTaxiDestName() const { return taxiDestName_; } - const ShowTaxiNodesData& getTaxiData() const { return currentTaxiData_; } - uint32_t getTaxiCurrentNode() const { return currentTaxiData_.nearestNode; } + const std::string& getTaxiDestName() const; + const ShowTaxiNodesData& getTaxiData() const; + uint32_t getTaxiCurrentNode() const; - struct TaxiNode { - uint32_t id = 0; - uint32_t mapId = 0; - float x = 0, y = 0, z = 0; - std::string name; - uint32_t mountDisplayIdAlliance = 0; - uint32_t mountDisplayIdHorde = 0; - }; - struct TaxiPathEdge { - uint32_t pathId = 0; - uint32_t fromNode = 0, toNode = 0; - uint32_t cost = 0; - }; - struct TaxiPathNode { - uint32_t id = 0; - uint32_t pathId = 0; - uint32_t nodeIndex = 0; - uint32_t mapId = 0; - float x = 0, y = 0, z = 0; - }; - const std::unordered_map& getTaxiNodes() const { return taxiNodes_; } + using TaxiNode = MovementHandler::TaxiNode; + using TaxiPathEdge = MovementHandler::TaxiPathEdge; + using TaxiPathNode = MovementHandler::TaxiPathNode; + const std::unordered_map& getTaxiNodes() const; bool isKnownTaxiNode(uint32_t nodeId) const { if (nodeId == 0 || nodeId > 384) return false; uint32_t idx = nodeId - 1; @@ -1953,7 +1925,7 @@ public: void buyBackItem(uint32_t buybackSlot); void repairItem(uint64_t vendorGuid, uint64_t itemGuid); void repairAll(uint64_t vendorGuid, bool useGuildBank = false); - const std::deque& getBuybackItems() const { return buybackItems_; } + const std::deque& getBuybackItems() const; void autoEquipItemBySlot(int backpackIndex); void autoEquipItemInBag(int bagIndex, int slotIndex); void useItemBySlot(int backpackIndex); @@ -1966,19 +1938,19 @@ public: void swapContainerItems(uint8_t srcBag, uint8_t srcSlot, uint8_t dstBag, uint8_t dstSlot); void swapBagSlots(int srcBagIndex, int dstBagIndex); void useItemById(uint32_t itemId); - bool isVendorWindowOpen() const { return vendorWindowOpen; } - const ListInventoryData& getVendorItems() const { return currentVendorItems; } - void setVendorCanRepair(bool v) { currentVendorItems.canRepair = v; } + bool isVendorWindowOpen() const; + const ListInventoryData& getVendorItems() const; + void setVendorCanRepair(bool v); // Mail - bool isMailboxOpen() const { return mailboxOpen_; } - const std::vector& getMailInbox() const { return mailInbox_; } - int getSelectedMailIndex() const { return selectedMailIndex_; } - void setSelectedMailIndex(int idx) { selectedMailIndex_ = idx; } - bool isMailComposeOpen() const { return showMailCompose_; } - void openMailCompose() { showMailCompose_ = true; clearMailAttachments(); } - void closeMailCompose() { showMailCompose_ = false; clearMailAttachments(); } - bool hasNewMail() const { return hasNewMail_; } + bool isMailboxOpen() const; + const std::vector& getMailInbox() const; + int getSelectedMailIndex() const; + void setSelectedMailIndex(int idx); + bool isMailComposeOpen() const; + void openMailCompose(); + void closeMailCompose(); + bool hasNewMail() const; void closeMailbox(); void sendMail(const std::string& recipient, const std::string& subject, const std::string& body, uint64_t money, uint64_t cod = 0); @@ -1996,7 +1968,7 @@ public: bool attachItemFromBag(int bagIndex, int slotIndex); bool detachMailAttachment(int attachIndex); void clearMailAttachments(); - const std::array& getMailAttachments() const { return mailAttachments_; } + const std::array& getMailAttachments() const; int getMailAttachmentCount() const; void mailTakeMoney(uint32_t mailId); void mailTakeItem(uint32_t mailId, uint32_t itemGuidLow); @@ -2010,10 +1982,10 @@ public: void buyBankSlot(); void depositItem(uint8_t srcBag, uint8_t srcSlot); void withdrawItem(uint8_t srcBag, uint8_t srcSlot); - bool isBankOpen() const { return bankOpen_; } - uint64_t getBankerGuid() const { return bankerGuid_; } - int getEffectiveBankSlots() const { return effectiveBankSlots_; } - int getEffectiveBankBagSlots() const { return effectiveBankBagSlots_; } + bool isBankOpen() const; + uint64_t getBankerGuid() const; + int getEffectiveBankSlots() const; + int getEffectiveBankBagSlots() const; // Guild Bank void openGuildBank(uint64_t guid); @@ -2024,10 +1996,10 @@ public: void withdrawGuildBankMoney(uint32_t amount); void guildBankWithdrawItem(uint8_t tabId, uint8_t bankSlot, uint8_t destBag, uint8_t destSlot); void guildBankDepositItem(uint8_t tabId, uint8_t bankSlot, uint8_t srcBag, uint8_t srcSlot); - bool isGuildBankOpen() const { return guildBankOpen_; } - const GuildBankData& getGuildBankData() const { return guildBankData_; } - uint8_t getGuildBankActiveTab() const { return guildBankActiveTab_; } - void setGuildBankActiveTab(uint8_t tab) { guildBankActiveTab_ = tab; } + bool isGuildBankOpen() const; + const GuildBankData& getGuildBankData() const; + uint8_t getGuildBankActiveTab() const; + void setGuildBankActiveTab(uint8_t tab); // Auction House void openAuctionHouse(uint64_t guid); @@ -2042,18 +2014,18 @@ public: void auctionCancelItem(uint32_t auctionId); void auctionListOwnerItems(uint32_t offset = 0); void auctionListBidderItems(uint32_t offset = 0); - bool isAuctionHouseOpen() const { return auctionOpen_; } - uint64_t getAuctioneerGuid() const { return auctioneerGuid_; } - const AuctionListResult& getAuctionBrowseResults() const { return auctionBrowseResults_; } - const AuctionListResult& getAuctionOwnerResults() const { return auctionOwnerResults_; } - const AuctionListResult& getAuctionBidderResults() const { return auctionBidderResults_; } - int getAuctionActiveTab() const { return auctionActiveTab_; } - void setAuctionActiveTab(int tab) { auctionActiveTab_ = tab; } - float getAuctionSearchDelay() const { return auctionSearchDelayTimer_; } + bool isAuctionHouseOpen() const; + uint64_t getAuctioneerGuid() const; + const AuctionListResult& getAuctionBrowseResults() const; + const AuctionListResult& getAuctionOwnerResults() const; + const AuctionListResult& getAuctionBidderResults() const; + int getAuctionActiveTab() const; + void setAuctionActiveTab(int tab); + float getAuctionSearchDelay() const; // Trainer - bool isTrainerWindowOpen() const { return trainerWindowOpen_; } - const TrainerListData& getTrainerSpells() const { return currentTrainerList_; } + bool isTrainerWindowOpen() const; + const TrainerListData& getTrainerSpells() const; void trainSpell(uint32_t spellId); void closeTrainer(); const std::string& getSpellName(uint32_t spellId) const; @@ -2078,7 +2050,7 @@ public: std::string name; std::vector spells; }; - const std::vector& getTrainerTabs() const { return trainerTabs_; } + const std::vector& getTrainerTabs() const; const ItemQueryResponseData* getItemInfo(uint32_t itemId) const { auto it = itemInfoCache_.find(itemId); return (it != itemInfoCache_.end()) ? &it->second : nullptr; @@ -2109,7 +2081,7 @@ public: if (it == onlineItems_.end()) return {}; return it->second.socketEnchantIds; } - uint64_t getVendorGuid() const { return currentVendorItems.vendorGuid; } + uint64_t getVendorGuid() const; /** * Set callbacks diff --git a/include/game/social_handler.hpp b/include/game/social_handler.hpp index 6f2cdbc2..53ffdf0f 100644 --- a/include/game/social_handler.hpp +++ b/include/game/social_handler.hpp @@ -205,6 +205,11 @@ public: // Instance lockouts const std::vector& getInstanceLockouts() const { return instanceLockouts_; } + // Instance difficulty + uint32_t getInstanceDifficulty() const { return instanceDifficulty_; } + bool isInstanceHeroic() const { return instanceIsHeroic_; } + bool isInInstance() const { return inInstance_; } + // Minimap ping void sendMinimapPing(float wowX, float wowY); diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index a1240acf..94510a1b 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -5142,6 +5142,202 @@ void GameHandler::deleteEquipmentSet(uint64_t setGuid) { if (inventoryHandler_) inventoryHandler_->deleteEquipmentSet(setGuid); } +// --- Inventory state delegation (canonical state lives in InventoryHandler) --- + +// Item text +bool GameHandler::isItemTextOpen() const { + return inventoryHandler_ ? inventoryHandler_->isItemTextOpen() : itemTextOpen_; +} +const std::string& GameHandler::getItemText() const { + if (inventoryHandler_) return inventoryHandler_->getItemText(); + return itemText_; +} +void GameHandler::closeItemText() { + if (inventoryHandler_) inventoryHandler_->closeItemText(); + else itemTextOpen_ = false; +} + +// Loot +bool GameHandler::isLootWindowOpen() const { + return inventoryHandler_ ? inventoryHandler_->isLootWindowOpen() : lootWindowOpen; +} +const LootResponseData& GameHandler::getCurrentLoot() const { + if (inventoryHandler_) return inventoryHandler_->getCurrentLoot(); + return currentLoot; +} +void GameHandler::setAutoLoot(bool enabled) { + if (inventoryHandler_) inventoryHandler_->setAutoLoot(enabled); + else autoLoot_ = enabled; +} +bool GameHandler::isAutoLoot() const { + return inventoryHandler_ ? inventoryHandler_->isAutoLoot() : autoLoot_; +} +void GameHandler::setAutoSellGrey(bool enabled) { + if (inventoryHandler_) inventoryHandler_->setAutoSellGrey(enabled); + else autoSellGrey_ = enabled; +} +bool GameHandler::isAutoSellGrey() const { + return inventoryHandler_ ? inventoryHandler_->isAutoSellGrey() : autoSellGrey_; +} +void GameHandler::setAutoRepair(bool enabled) { + if (inventoryHandler_) inventoryHandler_->setAutoRepair(enabled); + else autoRepair_ = enabled; +} +bool GameHandler::isAutoRepair() const { + return inventoryHandler_ ? inventoryHandler_->isAutoRepair() : autoRepair_; +} +const std::vector& GameHandler::getMasterLootCandidates() const { + if (inventoryHandler_) return inventoryHandler_->getMasterLootCandidates(); + return masterLootCandidates_; +} +bool GameHandler::hasMasterLootCandidates() const { + return inventoryHandler_ ? inventoryHandler_->hasMasterLootCandidates() : !masterLootCandidates_.empty(); +} +bool GameHandler::hasPendingLootRoll() const { + return inventoryHandler_ ? inventoryHandler_->hasPendingLootRoll() : pendingLootRollActive_; +} +const LootRollEntry& GameHandler::getPendingLootRoll() const { + if (inventoryHandler_) return inventoryHandler_->getPendingLootRoll(); + return pendingLootRoll_; +} + +// Vendor +bool GameHandler::isVendorWindowOpen() const { + return inventoryHandler_ ? inventoryHandler_->isVendorWindowOpen() : vendorWindowOpen; +} +const ListInventoryData& GameHandler::getVendorItems() const { + if (inventoryHandler_) return inventoryHandler_->getVendorItems(); + return currentVendorItems; +} +void GameHandler::setVendorCanRepair(bool v) { + if (inventoryHandler_) inventoryHandler_->setVendorCanRepair(v); + else currentVendorItems.canRepair = v; +} +const std::deque& GameHandler::getBuybackItems() const { + if (inventoryHandler_) { + // Layout-identical structs (InventoryHandler::BuybackItem == GameHandler::BuybackItem) + return reinterpret_cast&>(inventoryHandler_->getBuybackItems()); + } + return buybackItems_; +} +uint64_t GameHandler::getVendorGuid() const { + if (inventoryHandler_) return inventoryHandler_->getVendorGuid(); + return currentVendorItems.vendorGuid; +} + +// Mail +bool GameHandler::isMailboxOpen() const { + return inventoryHandler_ ? inventoryHandler_->isMailboxOpen() : mailboxOpen_; +} +const std::vector& GameHandler::getMailInbox() const { + if (inventoryHandler_) return inventoryHandler_->getMailInbox(); + return mailInbox_; +} +int GameHandler::getSelectedMailIndex() const { + return inventoryHandler_ ? inventoryHandler_->getSelectedMailIndex() : selectedMailIndex_; +} +void GameHandler::setSelectedMailIndex(int idx) { + if (inventoryHandler_) inventoryHandler_->setSelectedMailIndex(idx); + else selectedMailIndex_ = idx; +} +bool GameHandler::isMailComposeOpen() const { + return inventoryHandler_ ? inventoryHandler_->isMailComposeOpen() : showMailCompose_; +} +void GameHandler::openMailCompose() { + if (inventoryHandler_) inventoryHandler_->openMailCompose(); + else { showMailCompose_ = true; clearMailAttachments(); } +} +void GameHandler::closeMailCompose() { + if (inventoryHandler_) inventoryHandler_->closeMailCompose(); + else { showMailCompose_ = false; clearMailAttachments(); } +} +bool GameHandler::hasNewMail() const { + return inventoryHandler_ ? inventoryHandler_->hasNewMail() : hasNewMail_; +} +const std::array& GameHandler::getMailAttachments() const { + if (inventoryHandler_) { + // Layout-identical structs (InventoryHandler::MailAttachSlot == GameHandler::MailAttachSlot) + return reinterpret_cast&>(inventoryHandler_->getMailAttachments()); + } + return mailAttachments_; +} + +// Bank +bool GameHandler::isBankOpen() const { + return inventoryHandler_ ? inventoryHandler_->isBankOpen() : bankOpen_; +} +uint64_t GameHandler::getBankerGuid() const { + return inventoryHandler_ ? inventoryHandler_->getBankerGuid() : bankerGuid_; +} +int GameHandler::getEffectiveBankSlots() const { + return inventoryHandler_ ? inventoryHandler_->getEffectiveBankSlots() : effectiveBankSlots_; +} +int GameHandler::getEffectiveBankBagSlots() const { + return inventoryHandler_ ? inventoryHandler_->getEffectiveBankBagSlots() : effectiveBankBagSlots_; +} + +// Guild Bank +bool GameHandler::isGuildBankOpen() const { + return inventoryHandler_ ? inventoryHandler_->isGuildBankOpen() : guildBankOpen_; +} +const GuildBankData& GameHandler::getGuildBankData() const { + if (inventoryHandler_) return inventoryHandler_->getGuildBankData(); + return guildBankData_; +} +uint8_t GameHandler::getGuildBankActiveTab() const { + return inventoryHandler_ ? inventoryHandler_->getGuildBankActiveTab() : guildBankActiveTab_; +} +void GameHandler::setGuildBankActiveTab(uint8_t tab) { + if (inventoryHandler_) inventoryHandler_->setGuildBankActiveTab(tab); + else guildBankActiveTab_ = tab; +} + +// Auction House +bool GameHandler::isAuctionHouseOpen() const { + return inventoryHandler_ ? inventoryHandler_->isAuctionHouseOpen() : auctionOpen_; +} +uint64_t GameHandler::getAuctioneerGuid() const { + return inventoryHandler_ ? inventoryHandler_->getAuctioneerGuid() : auctioneerGuid_; +} +const AuctionListResult& GameHandler::getAuctionBrowseResults() const { + if (inventoryHandler_) return inventoryHandler_->getAuctionBrowseResults(); + return auctionBrowseResults_; +} +const AuctionListResult& GameHandler::getAuctionOwnerResults() const { + if (inventoryHandler_) return inventoryHandler_->getAuctionOwnerResults(); + return auctionOwnerResults_; +} +const AuctionListResult& GameHandler::getAuctionBidderResults() const { + if (inventoryHandler_) return inventoryHandler_->getAuctionBidderResults(); + return auctionBidderResults_; +} +int GameHandler::getAuctionActiveTab() const { + return inventoryHandler_ ? inventoryHandler_->getAuctionActiveTab() : auctionActiveTab_; +} +void GameHandler::setAuctionActiveTab(int tab) { + if (inventoryHandler_) inventoryHandler_->setAuctionActiveTab(tab); + else auctionActiveTab_ = tab; +} +float GameHandler::getAuctionSearchDelay() const { + return inventoryHandler_ ? inventoryHandler_->getAuctionSearchDelay() : auctionSearchDelayTimer_; +} + +// Trainer +bool GameHandler::isTrainerWindowOpen() const { + return inventoryHandler_ ? inventoryHandler_->isTrainerWindowOpen() : trainerWindowOpen_; +} +const TrainerListData& GameHandler::getTrainerSpells() const { + if (inventoryHandler_) return inventoryHandler_->getTrainerSpells(); + return currentTrainerList_; +} +const std::vector& GameHandler::getTrainerTabs() const { + if (inventoryHandler_) { + // Layout-identical structs (InventoryHandler::TrainerTab == GameHandler::TrainerTab) + return reinterpret_cast&>(inventoryHandler_->getTrainerTabs()); + } + return trainerTabs_; +} + void GameHandler::sendMinimapPing(float wowX, float wowY) { if (socialHandler_) socialHandler_->sendMinimapPing(wowX, wowY); } @@ -9484,5 +9680,412 @@ void GameHandler::requestCalendar() { if (socialHandler_) socialHandler_->requestCalendar(); } +// ============================================================ +// Delegating getters — SocialHandler owns the canonical state +// ============================================================ + +uint32_t GameHandler::getTotalTimePlayed() const { + return socialHandler_ ? socialHandler_->getTotalTimePlayed() : 0; +} + +uint32_t GameHandler::getLevelTimePlayed() const { + return socialHandler_ ? socialHandler_->getLevelTimePlayed() : 0; +} + +const std::vector& GameHandler::getWhoResults() const { + if (socialHandler_) return socialHandler_->getWhoResults(); + static const std::vector empty; + return empty; +} + +uint32_t GameHandler::getWhoOnlineCount() const { + return socialHandler_ ? socialHandler_->getWhoOnlineCount() : 0; +} + +const std::array& GameHandler::getBgQueues() const { + if (socialHandler_) return socialHandler_->getBgQueues(); + static const std::array empty{}; + return empty; +} + +const std::vector& GameHandler::getAvailableBgs() const { + if (socialHandler_) return socialHandler_->getAvailableBgs(); + static const std::vector empty; + return empty; +} + +const GameHandler::BgScoreboardData* GameHandler::getBgScoreboard() const { + return socialHandler_ ? socialHandler_->getBgScoreboard() : nullptr; +} + +const std::vector& GameHandler::getBgPlayerPositions() const { + if (socialHandler_) return socialHandler_->getBgPlayerPositions(); + static const std::vector empty; + return empty; +} + +bool GameHandler::isLoggingOut() const { + return socialHandler_ ? socialHandler_->isLoggingOut() : false; +} + +float GameHandler::getLogoutCountdown() const { + return socialHandler_ ? socialHandler_->getLogoutCountdown() : 0.0f; +} + +bool GameHandler::isInGuild() const { + if (socialHandler_) return socialHandler_->isInGuild(); + const Character* ch = getActiveCharacter(); + return ch && ch->hasGuild(); +} + +const std::string& GameHandler::getGuildName() const { + if (socialHandler_) return socialHandler_->getGuildName(); + static const std::string empty; + return empty; +} + +const GuildRosterData& GameHandler::getGuildRoster() const { + if (socialHandler_) return socialHandler_->getGuildRoster(); + static const GuildRosterData empty; + return empty; +} + +bool GameHandler::hasGuildRoster() const { + return socialHandler_ ? socialHandler_->hasGuildRoster() : false; +} + +const std::vector& GameHandler::getGuildRankNames() const { + if (socialHandler_) return socialHandler_->getGuildRankNames(); + static const std::vector empty; + return empty; +} + +bool GameHandler::hasPendingGuildInvite() const { + return socialHandler_ ? socialHandler_->hasPendingGuildInvite() : false; +} + +const std::string& GameHandler::getPendingGuildInviterName() const { + if (socialHandler_) return socialHandler_->getPendingGuildInviterName(); + static const std::string empty; + return empty; +} + +const std::string& GameHandler::getPendingGuildInviteGuildName() const { + if (socialHandler_) return socialHandler_->getPendingGuildInviteGuildName(); + static const std::string empty; + return empty; +} + +const GuildInfoData& GameHandler::getGuildInfoData() const { + if (socialHandler_) return socialHandler_->getGuildInfoData(); + static const GuildInfoData empty; + return empty; +} + +const GuildQueryResponseData& GameHandler::getGuildQueryData() const { + if (socialHandler_) return socialHandler_->getGuildQueryData(); + static const GuildQueryResponseData empty; + return empty; +} + +bool GameHandler::hasGuildInfoData() const { + return socialHandler_ ? socialHandler_->hasGuildInfoData() : false; +} + +bool GameHandler::hasPetitionShowlist() const { + return socialHandler_ ? socialHandler_->hasPetitionShowlist() : false; +} + +uint32_t GameHandler::getPetitionCost() const { + return socialHandler_ ? socialHandler_->getPetitionCost() : 0; +} + +uint64_t GameHandler::getPetitionNpcGuid() const { + return socialHandler_ ? socialHandler_->getPetitionNpcGuid() : 0; +} + +const GameHandler::PetitionInfo& GameHandler::getPetitionInfo() const { + if (socialHandler_) return socialHandler_->getPetitionInfo(); + static const PetitionInfo empty; + return empty; +} + +bool GameHandler::hasPetitionSignaturesUI() const { + return socialHandler_ ? socialHandler_->hasPetitionSignaturesUI() : false; +} + +bool GameHandler::hasPendingReadyCheck() const { + return socialHandler_ ? socialHandler_->hasPendingReadyCheck() : false; +} + +const std::string& GameHandler::getReadyCheckInitiator() const { + if (socialHandler_) return socialHandler_->getReadyCheckInitiator(); + static const std::string empty; + return empty; +} + +const std::vector& GameHandler::getReadyCheckResults() const { + if (socialHandler_) return socialHandler_->getReadyCheckResults(); + static const std::vector empty; + return empty; +} + +uint32_t GameHandler::getInstanceDifficulty() const { + return socialHandler_ ? socialHandler_->getInstanceDifficulty() : 0; +} + +bool GameHandler::isInstanceHeroic() const { + return socialHandler_ ? socialHandler_->isInstanceHeroic() : false; +} + +bool GameHandler::isInInstance() const { + return socialHandler_ ? socialHandler_->isInInstance() : false; +} + +bool GameHandler::hasPendingDuelRequest() const { + return socialHandler_ ? socialHandler_->hasPendingDuelRequest() : false; +} + +const std::string& GameHandler::getDuelChallengerName() const { + if (socialHandler_) return socialHandler_->getDuelChallengerName(); + static const std::string empty; + return empty; +} + +float GameHandler::getDuelCountdownRemaining() const { + return socialHandler_ ? socialHandler_->getDuelCountdownRemaining() : 0.0f; +} + +const std::vector& GameHandler::getInstanceLockouts() const { + if (socialHandler_) return socialHandler_->getInstanceLockouts(); + static const std::vector empty; + return empty; +} + +GameHandler::LfgState GameHandler::getLfgState() const { + return socialHandler_ ? socialHandler_->getLfgState() : LfgState::None; +} + +bool GameHandler::isLfgQueued() const { + return socialHandler_ ? socialHandler_->isLfgQueued() : false; +} + +bool GameHandler::isLfgInDungeon() const { + return socialHandler_ ? socialHandler_->isLfgInDungeon() : false; +} + +uint32_t GameHandler::getLfgDungeonId() const { + return socialHandler_ ? socialHandler_->getLfgDungeonId() : 0; +} + +std::string GameHandler::getCurrentLfgDungeonName() const { + return socialHandler_ ? socialHandler_->getCurrentLfgDungeonName() : std::string{}; +} + +uint32_t GameHandler::getLfgProposalId() const { + return socialHandler_ ? socialHandler_->getLfgProposalId() : 0; +} + +int32_t GameHandler::getLfgAvgWaitSec() const { + return socialHandler_ ? socialHandler_->getLfgAvgWaitSec() : -1; +} + +uint32_t GameHandler::getLfgTimeInQueueMs() const { + return socialHandler_ ? socialHandler_->getLfgTimeInQueueMs() : 0; +} + +uint32_t GameHandler::getLfgBootVotes() const { + return socialHandler_ ? socialHandler_->getLfgBootVotes() : 0; +} + +uint32_t GameHandler::getLfgBootTotal() const { + return socialHandler_ ? socialHandler_->getLfgBootTotal() : 0; +} + +uint32_t GameHandler::getLfgBootTimeLeft() const { + return socialHandler_ ? socialHandler_->getLfgBootTimeLeft() : 0; +} + +uint32_t GameHandler::getLfgBootNeeded() const { + return socialHandler_ ? socialHandler_->getLfgBootNeeded() : 0; +} + +const std::string& GameHandler::getLfgBootTargetName() const { + if (socialHandler_) return socialHandler_->getLfgBootTargetName(); + static const std::string empty; + return empty; +} + +const std::string& GameHandler::getLfgBootReason() const { + if (socialHandler_) return socialHandler_->getLfgBootReason(); + static const std::string empty; + return empty; +} + +const std::vector& GameHandler::getArenaTeamStats() const { + if (socialHandler_) return socialHandler_->getArenaTeamStats(); + static const std::vector empty; + return empty; +} + +// ---- SpellHandler delegating getters ---- + +int GameHandler::getCraftQueueRemaining() const { + return spellHandler_ ? spellHandler_->getCraftQueueRemaining() : 0; +} +uint32_t GameHandler::getCraftQueueSpellId() const { + return spellHandler_ ? spellHandler_->getCraftQueueSpellId() : 0; +} +uint32_t GameHandler::getQueuedSpellId() const { + return spellHandler_ ? spellHandler_->getQueuedSpellId() : 0; +} +const std::unordered_map& GameHandler::getAllTalents() const { + if (spellHandler_) return spellHandler_->getAllTalents(); + static const std::unordered_map empty; + return empty; +} +const std::unordered_map& GameHandler::getAllTalentTabs() const { + if (spellHandler_) return spellHandler_->getAllTalentTabs(); + static const std::unordered_map empty; + return empty; +} +float GameHandler::getGCDTotal() const { + return spellHandler_ ? spellHandler_->getGCDTotal() : 0.0f; +} +bool GameHandler::showTalentWipeConfirmDialog() const { + return spellHandler_ ? spellHandler_->showTalentWipeConfirmDialog() : false; +} +uint32_t GameHandler::getTalentWipeCost() const { + return spellHandler_ ? spellHandler_->getTalentWipeCost() : 0; +} +void GameHandler::cancelTalentWipe() { + if (spellHandler_) spellHandler_->cancelTalentWipe(); +} +bool GameHandler::showPetUnlearnDialog() const { + return spellHandler_ ? spellHandler_->showPetUnlearnDialog() : false; +} +uint32_t GameHandler::getPetUnlearnCost() const { + return spellHandler_ ? spellHandler_->getPetUnlearnCost() : 0; +} +void GameHandler::cancelPetUnlearn() { + if (spellHandler_) spellHandler_->cancelPetUnlearn(); +} + +// ---- QuestHandler delegating getters ---- + +const std::vector& GameHandler::getGossipPois() const { + if (questHandler_) return questHandler_->getGossipPois(); + static const std::vector empty; + return empty; +} +const std::unordered_map& GameHandler::getNpcQuestStatuses() const { + if (questHandler_) return questHandler_->getNpcQuestStatuses(); + static const std::unordered_map empty; + return empty; +} +const std::vector& GameHandler::getQuestLog() const { + if (questHandler_) return questHandler_->getQuestLog(); + static const std::vector empty; + return empty; +} +bool GameHandler::isQuestOfferRewardOpen() const { + return questHandler_ ? questHandler_->isQuestOfferRewardOpen() : false; +} +const QuestOfferRewardData& GameHandler::getQuestOfferReward() const { + if (questHandler_) return questHandler_->getQuestOfferReward(); + static const QuestOfferRewardData empty; + return empty; +} +bool GameHandler::isQuestRequestItemsOpen() const { + return questHandler_ ? questHandler_->isQuestRequestItemsOpen() : false; +} +const QuestRequestItemsData& GameHandler::getQuestRequestItems() const { + if (questHandler_) return questHandler_->getQuestRequestItems(); + static const QuestRequestItemsData empty; + return empty; +} +int GameHandler::getSelectedQuestLogIndex() const { + return questHandler_ ? questHandler_->getSelectedQuestLogIndex() : 0; +} +uint32_t GameHandler::getSharedQuestId() const { + return questHandler_ ? questHandler_->getSharedQuestId() : 0; +} +const std::string& GameHandler::getSharedQuestSharerName() const { + if (questHandler_) return questHandler_->getSharedQuestSharerName(); + static const std::string empty; + return empty; +} +const std::string& GameHandler::getSharedQuestTitle() const { + if (questHandler_) return questHandler_->getSharedQuestTitle(); + static const std::string empty; + return empty; +} +const std::unordered_set& GameHandler::getTrackedQuestIds() const { + if (questHandler_) return questHandler_->getTrackedQuestIds(); + static const std::unordered_set empty; + return empty; +} +bool GameHandler::hasPendingSharedQuest() const { + return questHandler_ ? questHandler_->hasPendingSharedQuest() : false; +} + +// ---- MovementHandler delegating getters ---- + +float GameHandler::getServerRunSpeed() const { + return movementHandler_ ? movementHandler_->getServerRunSpeed() : 7.0f; +} +float GameHandler::getServerWalkSpeed() const { + return movementHandler_ ? movementHandler_->getServerWalkSpeed() : 2.5f; +} +float GameHandler::getServerSwimSpeed() const { + return movementHandler_ ? movementHandler_->getServerSwimSpeed() : 4.722f; +} +float GameHandler::getServerSwimBackSpeed() const { + return movementHandler_ ? movementHandler_->getServerSwimBackSpeed() : 2.5f; +} +float GameHandler::getServerFlightSpeed() const { + return movementHandler_ ? movementHandler_->getServerFlightSpeed() : 7.0f; +} +float GameHandler::getServerFlightBackSpeed() const { + return movementHandler_ ? movementHandler_->getServerFlightBackSpeed() : 4.5f; +} +float GameHandler::getServerRunBackSpeed() const { + return movementHandler_ ? movementHandler_->getServerRunBackSpeed() : 4.5f; +} +float GameHandler::getServerTurnRate() const { + return movementHandler_ ? movementHandler_->getServerTurnRate() : 3.14159f; +} +bool GameHandler::isTaxiWindowOpen() const { + return movementHandler_ ? movementHandler_->isTaxiWindowOpen() : false; +} +bool GameHandler::isOnTaxiFlight() const { + return movementHandler_ ? movementHandler_->isOnTaxiFlight() : false; +} +bool GameHandler::isTaxiMountActive() const { + return movementHandler_ ? movementHandler_->isTaxiMountActive() : false; +} +bool GameHandler::isTaxiActivationPending() const { + return movementHandler_ ? movementHandler_->isTaxiActivationPending() : false; +} +const std::string& GameHandler::getTaxiDestName() const { + if (movementHandler_) return movementHandler_->getTaxiDestName(); + static const std::string empty; + return empty; +} +const ShowTaxiNodesData& GameHandler::getTaxiData() const { + if (movementHandler_) return movementHandler_->getTaxiData(); + static const ShowTaxiNodesData empty; + return empty; +} +uint32_t GameHandler::getTaxiCurrentNode() const { + if (movementHandler_) return movementHandler_->getTaxiData().nearestNode; + return 0; +} +const std::unordered_map& GameHandler::getTaxiNodes() const { + if (movementHandler_) return movementHandler_->getTaxiNodes(); + static const std::unordered_map empty; + return empty; +} + } // namespace game } // namespace wowee