From 344e28352aee3f73347faa18896748271d3ca133 Mon Sep 17 00:00:00 2001 From: hondacrx Date: Fri, 3 Jun 2022 20:19:35 -0400 Subject: [PATCH] Core/Gossip: Send broadcast text id in SMSG_GOSSIP_MESSAGE instead of npc_text id Port From (https://github.com/TrinityCore/TrinityCore/commit/2213d87a45660e0ecbc51b36e9171991104884a8) --- Source/Game/Entities/Creature/Gossip.cs | 24 +++++++++++++----------- Source/Game/Globals/ObjectManager.cs | 13 ++++++++++--- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/Source/Game/Entities/Creature/Gossip.cs b/Source/Game/Entities/Creature/Gossip.cs index 1d53f19c6..2cbc0ecc6 100644 --- a/Source/Game/Entities/Creature/Gossip.cs +++ b/Source/Game/Entities/Creature/Gossip.cs @@ -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); } } diff --git a/Source/Game/Globals/ObjectManager.cs b/Source/Game/Globals/ObjectManager.cs index 72ed30403..dece5f183 100644 --- a/Source/Game/Globals/ObjectManager.cs +++ b/Source/Game/Globals/ObjectManager.cs @@ -3063,7 +3063,6 @@ namespace Game npcText.Data[i].BroadcastTextID = result.Read(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());