Core/Gossip: Send broadcast text id in SMSG_GOSSIP_MESSAGE instead of npc_text id
Port From (https://github.com/TrinityCore/TrinityCore/commit/2213d87a45660e0ecbc51b36e9171991104884a8)
This commit is contained in:
@@ -250,7 +250,9 @@ namespace Game.Misc
|
||||
GossipMessagePkt packet = new();
|
||||
packet.GossipGUID = objectGUID;
|
||||
packet.GossipID = (int)_gossipMenu.GetMenuId();
|
||||
packet.TextID = (int)titleTextId;
|
||||
NpcText text = Global.ObjectMgr.GetNpcText(titleTextId);
|
||||
if (text != null)
|
||||
packet.TextID = (int)text.Data.SelectRandomElementByWeight(data => data.Probability).BroadcastTextID;
|
||||
|
||||
foreach (var pair in _gossipMenu.GetMenuItems())
|
||||
{
|
||||
@@ -275,24 +277,24 @@ namespace Game.Misc
|
||||
Quest quest = Global.ObjectMgr.GetQuestTemplate(questID);
|
||||
if (quest != null)
|
||||
{
|
||||
ClientGossipText text = new();
|
||||
text.QuestID = questID;
|
||||
text.ContentTuningID = quest.ContentTuningId;
|
||||
text.QuestType = item.QuestIcon;
|
||||
text.QuestFlags = (uint)quest.Flags;
|
||||
text.QuestFlagsEx = (uint)quest.FlagsEx;
|
||||
text.Repeatable = quest.IsAutoComplete() && quest.IsRepeatable() && !quest.IsDailyOrWeekly() && !quest.IsMonthly();
|
||||
ClientGossipText gossipText = new();
|
||||
gossipText.QuestID = questID;
|
||||
gossipText.ContentTuningID = quest.ContentTuningId;
|
||||
gossipText.QuestType = item.QuestIcon;
|
||||
gossipText.QuestFlags = (uint)quest.Flags;
|
||||
gossipText.QuestFlagsEx = (uint)quest.FlagsEx;
|
||||
gossipText.Repeatable = quest.IsAutoComplete() && quest.IsRepeatable() && !quest.IsDailyOrWeekly() && !quest.IsMonthly();
|
||||
|
||||
text.QuestTitle = quest.LogTitle;
|
||||
gossipText.QuestTitle = quest.LogTitle;
|
||||
Locale locale = _session.GetSessionDbLocaleIndex();
|
||||
if (locale != Locale.enUS)
|
||||
{
|
||||
QuestTemplateLocale localeData = Global.ObjectMgr.GetQuestLocale(quest.Id);
|
||||
if (localeData != null)
|
||||
ObjectManager.GetLocaleString(localeData.LogTitle, locale, ref text.QuestTitle);
|
||||
ObjectManager.GetLocaleString(localeData.LogTitle, locale, ref gossipText.QuestTitle);
|
||||
}
|
||||
|
||||
packet.GossipText.Add(text);
|
||||
packet.GossipText.Add(gossipText);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3063,7 +3063,6 @@ namespace Game
|
||||
npcText.Data[i].BroadcastTextID = result.Read<uint>(9 + i);
|
||||
}
|
||||
|
||||
BitSet erasedBroadcastTexts = new(SharedConst.MaxNpcTextOptions);
|
||||
for (int i = 0; i < SharedConst.MaxNpcTextOptions; i++)
|
||||
{
|
||||
if (npcText.Data[i].BroadcastTextID != 0)
|
||||
@@ -3071,20 +3070,28 @@ namespace Game
|
||||
if (!CliDB.BroadcastTextStorage.ContainsKey(npcText.Data[i].BroadcastTextID))
|
||||
{
|
||||
Log.outError(LogFilter.Sql, "NPCText (Id: {0}) has a non-existing BroadcastText (ID: {1}, Index: {2})", textID, npcText.Data[i].BroadcastTextID, i);
|
||||
npcText.Data[i].Probability = 0.0f;
|
||||
npcText.Data[i].BroadcastTextID = 0;
|
||||
erasedBroadcastTexts[i] = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (byte i = 0; i < SharedConst.MaxNpcTextOptions; i++)
|
||||
{
|
||||
if (npcText.Data[i].Probability > 0 && npcText.Data[i].BroadcastTextID == 0 && !erasedBroadcastTexts[i])
|
||||
if (npcText.Data[i].Probability > 0 && npcText.Data[i].BroadcastTextID == 0)
|
||||
{
|
||||
Log.outError(LogFilter.Sql, "NPCText (ID: {0}) has a probability (Index: {1}) set, but no BroadcastTextID to go with it", textID, i);
|
||||
npcText.Data[i].Probability = 0;
|
||||
}
|
||||
}
|
||||
|
||||
float probabilitySum = npcText.Data.Aggregate(0f, (float sum, NpcTextData data) => { return sum + data.Probability; });
|
||||
if (probabilitySum <= 0.0f)
|
||||
{
|
||||
Log.outError(LogFilter.Sql, $"NPCText (ID: {textID}) has a probability sum 0, no text can be selected from it, skipped.");
|
||||
continue;
|
||||
}
|
||||
|
||||
npcTextStorage[textID] = npcText;
|
||||
} while (result.NextRow());
|
||||
|
||||
|
||||
Reference in New Issue
Block a user