diff options
-rw-r--r-- | sql/updates/world/master/2022_10_09_08_world.sql | 1 | ||||
-rw-r--r-- | src/server/game/Conditions/ConditionMgr.cpp | 13 | ||||
-rw-r--r-- | src/server/game/Entities/Creature/GossipDef.cpp | 21 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 36 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 2 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 10 |
6 files changed, 36 insertions, 47 deletions
diff --git a/sql/updates/world/master/2022_10_09_08_world.sql b/sql/updates/world/master/2022_10_09_08_world.sql new file mode 100644 index 00000000000..fc68f57362f --- /dev/null +++ b/sql/updates/world/master/2022_10_09_08_world.sql @@ -0,0 +1 @@ +DELETE FROM `gossip_menu_option` WHERE `MenuID`=0; diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 6516c7422a1..89d4a4d70c1 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -1544,16 +1544,13 @@ bool ConditionMgr::addToGossipMenus(Condition* cond) const bool ConditionMgr::addToGossipMenuItems(Condition* cond) const { - GossipMenuItemsMapBoundsNonConst pMenuItemBounds = sObjectMgr->GetGossipMenuItemsMapBoundsNonConst(cond->SourceGroup); - if (pMenuItemBounds.first != pMenuItemBounds.second) + Trinity::IteratorPair pMenuItemBounds = sObjectMgr->GetGossipMenuItemsMapBoundsNonConst(cond->SourceGroup); + for (auto& [_, gossipMenuItem] : pMenuItemBounds) { - for (GossipMenuItemsContainer::iterator itr = pMenuItemBounds.first; itr != pMenuItemBounds.second; ++itr) + if (gossipMenuItem.MenuID == cond->SourceGroup && gossipMenuItem.OptionID == uint32(cond->SourceEntry)) { - if ((*itr).second.MenuID == cond->SourceGroup && (*itr).second.OptionID == uint32(cond->SourceEntry)) - { - (*itr).second.Conditions.push_back(cond); - return true; - } + gossipMenuItem.Conditions.push_back(cond); + return true; } } diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index f9a30a849e0..acb91b01deb 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -86,34 +86,31 @@ uint32 GossipMenu::AddMenuItem(int32 menuItemId, GossipOptionNpc optionNpc, std: void GossipMenu::AddMenuItem(uint32 menuId, uint32 menuItemId, uint32 sender, uint32 action) { /// Find items for given menu id. - GossipMenuItemsMapBounds bounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId); - /// Return if there are none. - if (bounds.first == bounds.second) - return; + Trinity::IteratorPair bounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId); /// Iterate over each of them. - for (GossipMenuItemsContainer::const_iterator itr = bounds.first; itr != bounds.second; ++itr) + for (auto const& [_, gossipMenuOption] : bounds) { /// Find the one with the given menu item id. - if (itr->second.OptionID != menuItemId) + if (gossipMenuOption.OptionID != menuItemId) continue; /// Store texts for localization. std::string strOptionText, strBoxText; - BroadcastTextEntry const* optionBroadcastText = sBroadcastTextStore.LookupEntry(itr->second.OptionBroadcastTextID); - BroadcastTextEntry const* boxBroadcastText = sBroadcastTextStore.LookupEntry(itr->second.BoxBroadcastTextID); + BroadcastTextEntry const* optionBroadcastText = sBroadcastTextStore.LookupEntry(gossipMenuOption.OptionBroadcastTextID); + BroadcastTextEntry const* boxBroadcastText = sBroadcastTextStore.LookupEntry(gossipMenuOption.BoxBroadcastTextID); /// OptionText if (optionBroadcastText) strOptionText = DB2Manager::GetBroadcastTextValue(optionBroadcastText, GetLocale()); else - strOptionText = itr->second.OptionText; + strOptionText = gossipMenuOption.OptionText; /// BoxText if (boxBroadcastText) strBoxText = DB2Manager::GetBroadcastTextValue(boxBroadcastText, GetLocale()); else - strBoxText = itr->second.BoxText; + strBoxText = gossipMenuOption.BoxText; /// Check need of localization. if (GetLocale() != DEFAULT_LOCALE) @@ -134,8 +131,8 @@ 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 newOptionId = AddMenuItem(-1, itr->second.OptionNpc, strOptionText, sender, action, strBoxText, itr->second.BoxMoney, itr->second.BoxCoded); - AddGossipMenuItemData(newOptionId, itr->second.ActionMenuID, itr->second.ActionPoiID); + uint32 newOptionId = AddMenuItem(-1, gossipMenuOption.OptionNpc, strOptionText, sender, action, strBoxText, gossipMenuOption.BoxMoney, gossipMenuOption.BoxCoded); + AddGossipMenuItemData(newOptionId, gossipMenuOption.ActionMenuID, gossipMenuOption.ActionPoiID); } } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 6ba771eba41..9c59b4b5105 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -13625,18 +13625,14 @@ void Player::SendNewItem(Item* item, uint32 quantity, bool pushed, bool created, /*** GOSSIP SYSTEM ***/ /*********************************************************/ -void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool showQuests /*= false*/) +void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId, bool showQuests /*= false*/) { PlayerMenu* menu = PlayerTalkClass; menu->ClearMenus(); menu->GetGossipMenu().SetMenuId(menuId); - GossipMenuItemsMapBounds menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId); - - // if default menuId and no menu options exist for this, use options from default options - if (menuItemBounds.first == menuItemBounds.second && menuId == GetDefaultGossipMenuForSource(source)) - menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(0); + Trinity::IteratorPair menuItemBounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId); uint64 npcflags = 0; @@ -13650,18 +13646,18 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool if (showQuests && source->ToGameObject()->GetGoType() == GAMEOBJECT_TYPE_QUESTGIVER) PrepareQuestMenu(source->GetGUID()); - for (GossipMenuItemsContainer::const_iterator itr = menuItemBounds.first; itr != menuItemBounds.second; ++itr) + for (auto const& [_, gossipMenuItem] : menuItemBounds) { - if (!sConditionMgr->IsObjectMeetToConditions(this, source, itr->second.Conditions)) + if (!sConditionMgr->IsObjectMeetToConditions(this, source, gossipMenuItem.Conditions)) continue; bool canTalk = true; if (Creature* creature = source->ToCreature()) { - if (!(itr->second.OptionNpcFlag & npcflags)) + if (!(gossipMenuItem.OptionNpcFlag & npcflags)) continue; - switch (itr->second.OptionNpc) + switch (gossipMenuItem.OptionNpc) { case GossipOptionNpc::TaxiNode: if (GetSession()->SendLearnNewTaxiNode(creature)) @@ -13735,14 +13731,14 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool case GossipOptionNpc::CovenantRenown: break; // NYI default: - TC_LOG_ERROR("sql.sql", "Creature entry %u has an unknown gossip option icon %u for menu %u.", creature->GetEntry(), AsUnderlyingType(itr->second.OptionNpc), itr->second.MenuID); + TC_LOG_ERROR("sql.sql", "Creature entry %u has an unknown gossip option icon %u for menu %u.", creature->GetEntry(), AsUnderlyingType(gossipMenuItem.OptionNpc), gossipMenuItem.MenuID); canTalk = false; break; } } else if (GameObject* go = source->ToGameObject()) { - switch (itr->second.OptionNpc) + switch (gossipMenuItem.OptionNpc) { case GossipOptionNpc::None: if (go->GetGoType() != GAMEOBJECT_TYPE_QUESTGIVER && go->GetGoType() != GAMEOBJECT_TYPE_GOOBER) @@ -13757,39 +13753,39 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId /*= 0*/, bool if (canTalk) { std::string strOptionText, strBoxText; - BroadcastTextEntry const* optionBroadcastText = sBroadcastTextStore.LookupEntry(itr->second.OptionBroadcastTextID); - BroadcastTextEntry const* boxBroadcastText = sBroadcastTextStore.LookupEntry(itr->second.BoxBroadcastTextID); + BroadcastTextEntry const* optionBroadcastText = sBroadcastTextStore.LookupEntry(gossipMenuItem.OptionBroadcastTextID); + BroadcastTextEntry const* boxBroadcastText = sBroadcastTextStore.LookupEntry(gossipMenuItem.BoxBroadcastTextID); LocaleConstant locale = GetSession()->GetSessionDbLocaleIndex(); if (optionBroadcastText) strOptionText = DB2Manager::GetBroadcastTextValue(optionBroadcastText, locale, GetGender()); else - strOptionText = itr->second.OptionText; + strOptionText = gossipMenuItem.OptionText; if (boxBroadcastText) strBoxText = DB2Manager::GetBroadcastTextValue(boxBroadcastText, locale, GetGender()); else - strBoxText = itr->second.BoxText; + strBoxText = gossipMenuItem.BoxText; if (locale != DEFAULT_LOCALE) { if (!optionBroadcastText) { /// Find localizations from database. - if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(menuId, itr->second.OptionID)) + if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(menuId, gossipMenuItem.OptionID)) ObjectMgr::GetLocaleString(gossipMenuLocale->OptionText, locale, strOptionText); } if (!boxBroadcastText) { /// Find localizations from database. - if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(menuId, itr->second.OptionID)) + if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(menuId, gossipMenuItem.OptionID)) ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, locale, strBoxText); } } - menu->GetGossipMenu().AddMenuItem(itr->second.OptionID, itr->second.OptionNpc, strOptionText, 0, AsUnderlyingType(itr->second.OptionNpc), strBoxText, itr->second.BoxMoney, itr->second.BoxCoded); - menu->GetGossipMenu().AddGossipMenuItemData(itr->second.OptionID, itr->second.ActionMenuID, itr->second.ActionPoiID); + menu->GetGossipMenu().AddMenuItem(gossipMenuItem.OptionID, gossipMenuItem.OptionNpc, strOptionText, 0, AsUnderlyingType(gossipMenuItem.OptionNpc), strBoxText, gossipMenuItem.BoxMoney, gossipMenuItem.BoxCoded); + menu->GetGossipMenu().AddGossipMenuItemData(gossipMenuItem.OptionID, gossipMenuItem.ActionMenuID, gossipMenuItem.ActionPoiID); } } } diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 0b24b304a86..67cb3f97b22 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1479,7 +1479,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> /*** GOSSIP SYSTEM ***/ /*********************************************************/ - void PrepareGossipMenu(WorldObject* source, uint32 menuId = 0, bool showQuests = false); + void PrepareGossipMenu(WorldObject* source, uint32 menuId, bool showQuests = false); void SendPreparedGossip(WorldObject* source); void OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 menuId); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index d90701a8c31..91499ba7e40 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -774,8 +774,6 @@ typedef std::multimap<uint32, GossipMenus> GossipMenusContainer; typedef std::pair<GossipMenusContainer::const_iterator, GossipMenusContainer::const_iterator> GossipMenusMapBounds; typedef std::pair<GossipMenusContainer::iterator, GossipMenusContainer::iterator> GossipMenusMapBoundsNonConst; typedef std::multimap<uint32, GossipMenuItems> GossipMenuItemsContainer; -typedef std::pair<GossipMenuItemsContainer::const_iterator, GossipMenuItemsContainer::const_iterator> GossipMenuItemsMapBounds; -typedef std::pair<GossipMenuItemsContainer::iterator, GossipMenuItemsContainer::iterator> GossipMenuItemsMapBoundsNonConst; typedef std::unordered_map<uint32, GossipMenuAddon> GossipMenuAddonContainer; struct QuestPOIBlobPoint @@ -1685,13 +1683,13 @@ class TC_GAME_API ObjectMgr return _gossipMenusStore.equal_range(uiMenuId); } - GossipMenuItemsMapBounds GetGossipMenuItemsMapBounds(uint32 uiMenuId) const + Trinity::IteratorPair<GossipMenuItemsContainer::const_iterator> GetGossipMenuItemsMapBounds(uint32 uiMenuId) const { - return _gossipMenuItemsStore.equal_range(uiMenuId); + return Trinity::Containers::MapEqualRange(_gossipMenuItemsStore, uiMenuId); } - GossipMenuItemsMapBoundsNonConst GetGossipMenuItemsMapBoundsNonConst(uint32 uiMenuId) + Trinity::IteratorPair<GossipMenuItemsContainer::iterator> GetGossipMenuItemsMapBoundsNonConst(uint32 uiMenuId) { - return _gossipMenuItemsStore.equal_range(uiMenuId); + return Trinity::Containers::MapEqualRange(_gossipMenuItemsStore, uiMenuId); } GossipMenuAddon const* GetGossipMenuAddon(uint32 menuId) const { |