mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-16 07:30:42 +01:00
Core/Gossip: Remove gossip menu option fallback code, all menus are now required to have options defined instead of trying to get them from menuid = 0
This commit is contained in:
1
sql/updates/world/master/2022_10_09_08_world.sql
Normal file
1
sql/updates/world/master/2022_10_09_08_world.sql
Normal file
@@ -0,0 +1 @@
|
||||
DELETE FROM `gossip_menu_option` WHERE `MenuID`=0;
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user