Core/Gossip: Preserve OptionID from database when menu option is added from a script
Port From (https://github.com/TrinityCore/TrinityCore/commit/6d9625802cedf09a15c201100418c7e93c5f4c30)
This commit is contained in:
@@ -23,6 +23,7 @@ using Game.Entities;
|
|||||||
using Game.Networking.Packets;
|
using Game.Networking.Packets;
|
||||||
using Game.Spells;
|
using Game.Spells;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
|
|
||||||
namespace Game.Misc
|
namespace Game.Misc
|
||||||
@@ -37,6 +38,15 @@ namespace Game.Misc
|
|||||||
if (menuItemId == -1)
|
if (menuItemId == -1)
|
||||||
{
|
{
|
||||||
menuItemId = 0;
|
menuItemId = 0;
|
||||||
|
if (_menuId != 0)
|
||||||
|
{
|
||||||
|
// set baseline menuItemId as higher than whatever exists in db
|
||||||
|
var bounds = Global.ObjectMgr.GetGossipMenuItemsMapBounds(_menuId);
|
||||||
|
var itr = bounds.MaxBy(a => a.OptionId);
|
||||||
|
if (itr != null)
|
||||||
|
menuItemId = (int)(itr.OptionId + 1);
|
||||||
|
}
|
||||||
|
|
||||||
if (!_menuItems.Empty())
|
if (!_menuItems.Empty())
|
||||||
{
|
{
|
||||||
foreach (var item in _menuItems)
|
foreach (var item in _menuItems)
|
||||||
@@ -78,55 +88,40 @@ namespace Game.Misc
|
|||||||
if (bounds.Empty())
|
if (bounds.Empty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Iterate over each of them.
|
/// Find the one with the given menu item id.
|
||||||
foreach (var gossipMenuOption in bounds)
|
var gossipMenuItems = bounds.Find(menuItem => menuItem.OptionId == menuItemId);
|
||||||
|
if (gossipMenuItems == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// Store texts for localization.
|
||||||
|
string strOptionText, strBoxText;
|
||||||
|
BroadcastTextRecord optionBroadcastText = CliDB.BroadcastTextStorage.LookupByKey(gossipMenuItems.OptionBroadcastTextId);
|
||||||
|
BroadcastTextRecord boxBroadcastText = CliDB.BroadcastTextStorage.LookupByKey(gossipMenuItems.BoxBroadcastTextId);
|
||||||
|
|
||||||
|
// OptionText
|
||||||
|
if (optionBroadcastText != null)
|
||||||
|
strOptionText = Global.DB2Mgr.GetBroadcastTextValue(optionBroadcastText, GetLocale());
|
||||||
|
else
|
||||||
|
strOptionText = gossipMenuItems.OptionText;
|
||||||
|
|
||||||
|
// BoxText
|
||||||
|
if (boxBroadcastText != null)
|
||||||
|
strBoxText = Global.DB2Mgr.GetBroadcastTextValue(boxBroadcastText, GetLocale());
|
||||||
|
else
|
||||||
|
strBoxText = gossipMenuItems.BoxText;
|
||||||
|
|
||||||
|
// Check need of localization.
|
||||||
|
if (boxBroadcastText == null)
|
||||||
{
|
{
|
||||||
// Find the one with the given menu item id.
|
// Find localizations from database.
|
||||||
if (gossipMenuOption.OptionId != menuItemId)
|
GossipMenuItemsLocale gossipMenuLocale = Global.ObjectMgr.GetGossipMenuItemsLocale(menuId, menuItemId);
|
||||||
continue;
|
if (gossipMenuLocale != null)
|
||||||
|
ObjectManager.GetLocaleString(gossipMenuLocale.BoxText, GetLocale(), ref strBoxText);
|
||||||
// Store texts for localization.
|
|
||||||
string strOptionText, strBoxText;
|
|
||||||
BroadcastTextRecord optionBroadcastText = CliDB.BroadcastTextStorage.LookupByKey(gossipMenuOption.OptionBroadcastTextId);
|
|
||||||
BroadcastTextRecord boxBroadcastText = CliDB.BroadcastTextStorage.LookupByKey(gossipMenuOption.BoxBroadcastTextId);
|
|
||||||
|
|
||||||
// OptionText
|
|
||||||
if (optionBroadcastText != null)
|
|
||||||
strOptionText = Global.DB2Mgr.GetBroadcastTextValue(optionBroadcastText, GetLocale());
|
|
||||||
else
|
|
||||||
strOptionText = gossipMenuOption.OptionText;
|
|
||||||
|
|
||||||
// BoxText
|
|
||||||
if (boxBroadcastText != null)
|
|
||||||
strBoxText = Global.DB2Mgr.GetBroadcastTextValue(boxBroadcastText, GetLocale());
|
|
||||||
else
|
|
||||||
strBoxText = gossipMenuOption.BoxText;
|
|
||||||
|
|
||||||
// Check need of localization.
|
|
||||||
if (GetLocale() != Locale.enUS)
|
|
||||||
{
|
|
||||||
if (optionBroadcastText == null)
|
|
||||||
{
|
|
||||||
// Find localizations from database.
|
|
||||||
GossipMenuItemsLocale gossipMenuLocale = Global.ObjectMgr.GetGossipMenuItemsLocale(menuId, menuItemId);
|
|
||||||
if (gossipMenuLocale != null)
|
|
||||||
ObjectManager.GetLocaleString(gossipMenuLocale.OptionText, GetLocale(), ref strOptionText);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (boxBroadcastText == null)
|
|
||||||
{
|
|
||||||
// Find localizations from database.
|
|
||||||
GossipMenuItemsLocale gossipMenuLocale = Global.ObjectMgr.GetGossipMenuItemsLocale(menuId, menuItemId);
|
|
||||||
if (gossipMenuLocale != null)
|
|
||||||
ObjectManager.GetLocaleString(gossipMenuLocale.BoxText, GetLocale(), ref strBoxText);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add menu item with existing method. Menu item id -1 is also used in ADD_GOSSIP_ITEM macro.
|
|
||||||
uint newOptionId = AddMenuItem(-1, gossipMenuOption.OptionNpc, strOptionText, sender, action, strBoxText, gossipMenuOption.BoxMoney, gossipMenuOption.BoxCoded);
|
|
||||||
AddGossipMenuItemData(newOptionId, gossipMenuOption.ActionMenuId, gossipMenuOption.ActionPoiId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add menu item with existing method. Menu item id -1 is also used in ADD_GOSSIP_ITEM macro.
|
||||||
|
AddMenuItem((int)gossipMenuItems.OptionId, gossipMenuItems.OptionNpc, strOptionText, sender, action, strBoxText, gossipMenuItems.BoxMoney, gossipMenuItems.BoxCoded);
|
||||||
|
AddGossipMenuItemData(gossipMenuItems.OptionId, gossipMenuItems.ActionMenuId, gossipMenuItems.ActionPoiId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void AddGossipMenuItemData(uint menuItemId, uint gossipActionMenuId, uint gossipActionPoi)
|
public void AddGossipMenuItemData(uint menuItemId, uint gossipActionMenuId, uint gossipActionPoi)
|
||||||
|
|||||||
Reference in New Issue
Block a user