aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp90
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)