From fa6f0810377117f08dc028baabe93d482b7dfc92 Mon Sep 17 00:00:00 2001 From: Shauren Date: Sat, 22 Aug 2020 18:22:57 +0200 Subject: [PATCH] Core/Creatures: Move gossip trainer assignment to creature_trainer table - same gossip can open different trainers depending on which creature it is assigned to --- src/server/game/Entities/Creature/GossipDef.cpp | 5 ++--- src/server/game/Entities/Creature/GossipDef.h | 4 +--- src/server/game/Entities/Player/Player.cpp | 4 ++-- src/server/game/Globals/ObjectMgr.h | 11 +++++++---- src/server/game/World/World.cpp | 6 +++--- src/server/scripts/Commands/cs_reload.cpp | 2 +- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index d61b789d421..dfa981a1704 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -125,17 +125,16 @@ void GossipMenu::AddMenuItem(uint32 menuId, uint32 menuItemId, uint32 sender, ui /// Add menu item with existing method. Menu item id -1 is also used in ADD_GOSSIP_ITEM macro. uint32 optionIndex = AddMenuItem(-1, itr->second.OptionIcon, strOptionText, sender, action, strBoxText, itr->second.BoxMoney, itr->second.BoxCoded); - AddGossipMenuItemData(optionIndex, itr->second.ActionMenuID, itr->second.ActionPoiID, itr->second.TrainerId); + AddGossipMenuItemData(optionIndex, itr->second.ActionMenuID, itr->second.ActionPoiID); } } -void GossipMenu::AddGossipMenuItemData(uint32 optionIndex, uint32 gossipActionMenuId, uint32 gossipActionPoi, uint32 trainerId) +void GossipMenu::AddGossipMenuItemData(uint32 optionIndex, uint32 gossipActionMenuId, uint32 gossipActionPoi) { GossipMenuItemData& itemData = _menuItemData[optionIndex]; itemData.GossipActionMenuId = gossipActionMenuId; itemData.GossipActionPoi = gossipActionPoi; - itemData.TrainerId = trainerId; } uint32 GossipMenu::GetMenuItemSender(uint32 menuItemId) const diff --git a/src/server/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h index bc09b2d01e0..b064fbd943e 100644 --- a/src/server/game/Entities/Creature/GossipDef.h +++ b/src/server/game/Entities/Creature/GossipDef.h @@ -146,8 +146,6 @@ struct GossipMenuItemData { uint32 GossipActionMenuId; // MenuId of the gossip triggered by this action uint32 GossipActionPoi; - - uint32 TrainerId; }; // need an ordered container @@ -175,7 +173,7 @@ class TC_GAME_API GossipMenu void SetLocale(LocaleConstant locale) { _locale = locale; } LocaleConstant GetLocale() const { return _locale; } - void AddGossipMenuItemData(uint32 optionIndex, uint32 gossipActionMenuId, uint32 gossipActionPoi, uint32 trainerId); + void AddGossipMenuItemData(uint32 optionIndex, uint32 gossipActionMenuId, uint32 gossipActionPoi); uint32 GetMenuItemCount() const { diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index daafa5d747e..af16f0ba9cb 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14039,7 +14039,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool } menu->GetGossipMenu().AddMenuItem(itr->second.OptionID, itr->second.OptionIcon, strOptionText, 0, itr->second.OptionType, strBoxText, itr->second.BoxMoney, itr->second.BoxCoded); - menu->GetGossipMenu().AddGossipMenuItemData(itr->second.OptionID, itr->second.ActionMenuID, itr->second.ActionPoiID, itr->second.TrainerId); + menu->GetGossipMenu().AddGossipMenuItemData(itr->second.OptionID, itr->second.ActionMenuID, itr->second.ActionPoiID); } } } @@ -14151,7 +14151,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men GetSession()->SendStablePet(guid); break; case GOSSIP_OPTION_TRAINER: - GetSession()->SendTrainerList(source->ToCreature(), menuItemData->TrainerId); + GetSession()->SendTrainerList(source->ToCreature(), sObjectMgr->GetCreatureTrainerForGossipOption(source->GetEntry(), menuId, gossipListId)); break; case GOSSIP_OPTION_LEARNDUALSPEC: if (GetSpecsCount() == 1 && getLevel() >= sWorld->getIntConfig(CONFIG_MIN_DUALSPEC_LEVEL)) diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index bc56d0f41eb..4ace9e8be16 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -791,7 +791,6 @@ struct GossipMenuItems uint32 BoxMoney; std::string BoxText; uint32 BoxBroadcastTextID; - uint32 TrainerId; ConditionContainer Conditions; }; @@ -1244,7 +1243,7 @@ class TC_GAME_API ObjectMgr void LoadVendors(); void LoadTrainers(); - void LoadCreatureDefaultTrainers(); + void LoadCreatureTrainers(); void InitializeQueriesData(QueryDataGroup mask); @@ -1495,7 +1494,11 @@ class TC_GAME_API ObjectMgr bool DeleteGameTele(std::string const& name); Trainer::Trainer const* GetTrainer(uint32 trainerId) const; - uint32 GetCreatureDefaultTrainer(uint32 creatureId) const; + uint32 GetCreatureDefaultTrainer(uint32 creatureId) const + { + return GetCreatureTrainerForGossipOption(creatureId, 0, 0); + } + uint32 GetCreatureTrainerForGossipOption(uint32 creatureId, uint32 gossipMenuId, uint32 gossipOptionIndex) const; VendorItemData const* GetNpcVendorItemList(uint32 entry) const { @@ -1756,7 +1759,7 @@ class TC_GAME_API ObjectMgr CacheVendorItemContainer _cacheVendorItemStore; std::unordered_map _trainers; - std::unordered_map _creatureDefaultTrainers; + std::map, uint32> _creatureDefaultTrainers; GraveyardOrientationContainer _graveyardOrientations; diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index 5f21f9100d4..7ec0979df05 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -2088,15 +2088,15 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Loading Trainers..."); // must be after LoadCreatureTemplates sObjectMgr->LoadTrainers(); - TC_LOG_INFO("server.loading", "Loading Creature default trainers..."); - sObjectMgr->LoadCreatureDefaultTrainers(); - TC_LOG_INFO("server.loading", "Loading Gossip menu..."); sObjectMgr->LoadGossipMenu(); TC_LOG_INFO("server.loading", "Loading Gossip menu options..."); sObjectMgr->LoadGossipMenuItems(); + TC_LOG_INFO("server.loading", "Loading Creature trainers..."); + sObjectMgr->LoadCreatureTrainers(); // must be after LoadGossipMenuItems + TC_LOG_INFO("server.loading", "Loading Vendors..."); sObjectMgr->LoadVendors(); // must be after load CreatureTemplate and ItemTemplate diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index ef43753bc83..e16502bc9e9 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -708,7 +708,7 @@ public: { TC_LOG_INFO("misc", "Re-Loading `trainer` Table!"); sObjectMgr->LoadTrainers(); - sObjectMgr->LoadCreatureDefaultTrainers(); + sObjectMgr->LoadCreatureTrainers(); handler->SendGlobalGMSysMessage("DB table `trainer` reloaded."); handler->SendGlobalGMSysMessage("DB table `trainer_locale` reloaded."); handler->SendGlobalGMSysMessage("DB table `trainer_spell` reloaded.");