diff options
-rw-r--r-- | src/server/game/Entities/Creature/GossipDef.cpp | 86 |
1 files changed, 44 insertions, 42 deletions
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index acb91b01deb..b074efe59e2 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -51,6 +51,18 @@ uint32 GossipMenu::AddMenuItem(int32 menuItemId, GossipOptionNpc optionNpc, std: if (menuItemId == -1) { menuItemId = 0; + if (_menuId) + { + // set baseline menuItemId as higher than whatever exists in db + Trinity::IteratorPair bounds = sObjectMgr->GetGossipMenuItemsMapBounds(_menuId); + auto itr = std::max_element(bounds.begin(), bounds.end(), [](GossipMenuItemsContainer::value_type const& a, GossipMenuItemsContainer::value_type const& b) + { + return a.second.OptionID < b.second.OptionID; + }); + if (itr != bounds.end()) + menuItemId = itr->second.OptionID + 1; + } + if (!_menuItems.empty()) { for (GossipMenuItemContainer::const_iterator itr = _menuItems.begin(); itr != _menuItems.end(); ++itr) @@ -88,52 +100,42 @@ void GossipMenu::AddMenuItem(uint32 menuId, uint32 menuItemId, uint32 sender, ui /// Find items for given menu id. Trinity::IteratorPair bounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId); - /// Iterate over each of them. - for (auto const& [_, gossipMenuOption] : bounds) + /// Find the one with the given menu item id. + auto itr = std::find_if(bounds.begin(), bounds.end(), [menuItemId](std::pair<uint32 const, GossipMenuItems> const& itemPair) { - /// Find the one with the given menu item id. - if (gossipMenuOption.OptionID != menuItemId) - continue; - - /// Store texts for localization. - std::string strOptionText, strBoxText; - BroadcastTextEntry const* optionBroadcastText = sBroadcastTextStore.LookupEntry(gossipMenuOption.OptionBroadcastTextID); - BroadcastTextEntry const* boxBroadcastText = sBroadcastTextStore.LookupEntry(gossipMenuOption.BoxBroadcastTextID); - - /// OptionText - if (optionBroadcastText) - strOptionText = DB2Manager::GetBroadcastTextValue(optionBroadcastText, GetLocale()); - else - strOptionText = gossipMenuOption.OptionText; - - /// BoxText - if (boxBroadcastText) - strBoxText = DB2Manager::GetBroadcastTextValue(boxBroadcastText, GetLocale()); - else - strBoxText = gossipMenuOption.BoxText; - - /// Check need of localization. - if (GetLocale() != DEFAULT_LOCALE) - { - if (!optionBroadcastText) - { - /// Find localizations from database. - if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(menuId, menuItemId)) - ObjectMgr::GetLocaleString(gossipMenuLocale->OptionText, GetLocale(), strOptionText); - } + return itemPair.second.OptionID == menuItemId; + }); - if (!boxBroadcastText) - { - /// Find localizations from database. - if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(menuId, menuItemId)) - ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, GetLocale(), strBoxText); - } - } + if (itr == bounds.end()) + return; + + /// Store texts for localization. + std::string strOptionText, strBoxText; + BroadcastTextEntry const* optionBroadcastText = sBroadcastTextStore.LookupEntry(itr->second.OptionBroadcastTextID); + BroadcastTextEntry const* boxBroadcastText = sBroadcastTextStore.LookupEntry(itr->second.BoxBroadcastTextID); + + /// OptionText + if (optionBroadcastText) + strOptionText = DB2Manager::GetBroadcastTextValue(optionBroadcastText, GetLocale()); + else + strOptionText = itr->second.OptionText; - /// Add menu item with existing method. Menu item id -1 is also used in ADD_GOSSIP_ITEM macro. - uint32 newOptionId = AddMenuItem(-1, gossipMenuOption.OptionNpc, strOptionText, sender, action, strBoxText, gossipMenuOption.BoxMoney, gossipMenuOption.BoxCoded); - AddGossipMenuItemData(newOptionId, gossipMenuOption.ActionMenuID, gossipMenuOption.ActionPoiID); + /// BoxText + if (boxBroadcastText) + strBoxText = DB2Manager::GetBroadcastTextValue(boxBroadcastText, GetLocale()); + else + strBoxText = itr->second.BoxText; + + if (!boxBroadcastText) + { + /// Find localizations from database. + if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(menuId, menuItemId)) + ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, GetLocale(), strBoxText); } + + /// Add menu item with existing method. Menu item id -1 is also used in ADD_GOSSIP_ITEM macro. + AddMenuItem(itr->second.OptionID, itr->second.OptionNpc, strOptionText, sender, action, strBoxText, itr->second.BoxMoney, itr->second.BoxCoded); + AddGossipMenuItemData(itr->second.OptionID, itr->second.ActionMenuID, itr->second.ActionPoiID); } void GossipMenu::AddGossipMenuItemData(uint32 menuItemId, uint32 gossipActionMenuId, uint32 gossipActionPoi) |