diff options
-rw-r--r-- | src/server/game/Entities/Creature/GossipDef.cpp | 90 |
1 files changed, 49 insertions, 41 deletions
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index 74db9dfdd80..c99b9410e7b 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -44,6 +44,18 @@ uint32 GossipMenu::AddMenuItem(int32 menuItemId, GossipOptionIcon icon, std::str if (menuItemId == -1) { menuItemId = 0; + if (_menuId) + { + // set baseline menuItemId as higher than whatever exists in db + auto [itr, end] = sObjectMgr->GetGossipMenuItemsMapBounds(_menuId); + itr = std::max_element(itr, end, [](GossipMenuItemsContainer::value_type const& a, GossipMenuItemsContainer::value_type const& b) + { + return a.second.OptionID < b.second.OptionID; + }); + if (itr != end) + menuItemId = itr->second.OptionID + 1; + } + if (!_menuItems.empty()) { for (GossipMenuItemContainer::const_iterator itr = _menuItems.begin(); itr != _menuItems.end(); ++itr) @@ -80,56 +92,52 @@ void GossipMenu::AddMenuItem(uint32 menuId, uint32 menuItemId, uint32 sender, ui { /// Find items for given menu id. GossipMenuItemsMapBounds bounds = sObjectMgr->GetGossipMenuItemsMapBounds(menuId); - /// Return if there are none. - if (bounds.first == bounds.second) - return; - - /// Iterate over each of them. - for (GossipMenuItemsContainer::const_iterator itr = bounds.first; itr != bounds.second; ++itr) + auto itr = std::find_if(bounds.first, bounds.second, [menuItemId](std::pair<uint32 const, GossipMenuItems> const& itemPair) { - /// Find the one with the given menu item id. - if (itr->second.OptionID != menuItemId) - continue; + return itemPair.second.OptionID == menuItemId; + }); - /// Store texts for localization. - std::string strOptionText, strBoxText; - BroadcastText const* optionBroadcastText = sObjectMgr->GetBroadcastText(itr->second.OptionBroadcastTextID); - BroadcastText const* boxBroadcastText = sObjectMgr->GetBroadcastText(itr->second.BoxBroadcastTextID); + if (itr == bounds.second) + return; - /// OptionText - if (optionBroadcastText) - strOptionText = optionBroadcastText->GetText(GetLocale()); - else - strOptionText = itr->second.OptionText; + /// Store texts for localization. + std::string strOptionText, strBoxText; + BroadcastText const* optionBroadcastText = sObjectMgr->GetBroadcastText(itr->second.OptionBroadcastTextID); + BroadcastText const* boxBroadcastText = sObjectMgr->GetBroadcastText(itr->second.BoxBroadcastTextID); - /// BoxText - if (boxBroadcastText) - strBoxText = boxBroadcastText->GetText(GetLocale()); - else - strBoxText = itr->second.BoxText; + /// OptionText + if (optionBroadcastText) + strOptionText = optionBroadcastText->GetText(GetLocale()); + else + strOptionText = itr->second.OptionText; - /// 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); - } + /// BoxText + if (boxBroadcastText) + strBoxText = boxBroadcastText->GetText(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); - } + /// 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); } - /// Add menu item with existing method. Menu item id -1 is also used in ADD_GOSSIP_ITEM macro. - uint32 newOptionId = AddMenuItem(-1, itr->second.OptionIcon, strOptionText, sender, action, strBoxText, itr->second.BoxMoney, itr->second.BoxCoded); - AddGossipMenuItemData(newOptionId, itr->second.ActionMenuID, itr->second.ActionPoiID); + 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.OptionIcon, 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) |