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:
hondacrx
2022-06-03 20:19:35 -04:00
parent 7398576615
commit 344e28352a
2 changed files with 23 additions and 14 deletions
+13 -11
View File
@@ -250,7 +250,9 @@ namespace Game.Misc
GossipMessagePkt packet = new(); GossipMessagePkt packet = new();
packet.GossipGUID = objectGUID; packet.GossipGUID = objectGUID;
packet.GossipID = (int)_gossipMenu.GetMenuId(); 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()) foreach (var pair in _gossipMenu.GetMenuItems())
{ {
@@ -275,24 +277,24 @@ namespace Game.Misc
Quest quest = Global.ObjectMgr.GetQuestTemplate(questID); Quest quest = Global.ObjectMgr.GetQuestTemplate(questID);
if (quest != null) if (quest != null)
{ {
ClientGossipText text = new(); ClientGossipText gossipText = new();
text.QuestID = questID; gossipText.QuestID = questID;
text.ContentTuningID = quest.ContentTuningId; gossipText.ContentTuningID = quest.ContentTuningId;
text.QuestType = item.QuestIcon; gossipText.QuestType = item.QuestIcon;
text.QuestFlags = (uint)quest.Flags; gossipText.QuestFlags = (uint)quest.Flags;
text.QuestFlagsEx = (uint)quest.FlagsEx; gossipText.QuestFlagsEx = (uint)quest.FlagsEx;
text.Repeatable = quest.IsAutoComplete() && quest.IsRepeatable() && !quest.IsDailyOrWeekly() && !quest.IsMonthly(); gossipText.Repeatable = quest.IsAutoComplete() && quest.IsRepeatable() && !quest.IsDailyOrWeekly() && !quest.IsMonthly();
text.QuestTitle = quest.LogTitle; gossipText.QuestTitle = quest.LogTitle;
Locale locale = _session.GetSessionDbLocaleIndex(); Locale locale = _session.GetSessionDbLocaleIndex();
if (locale != Locale.enUS) if (locale != Locale.enUS)
{ {
QuestTemplateLocale localeData = Global.ObjectMgr.GetQuestLocale(quest.Id); QuestTemplateLocale localeData = Global.ObjectMgr.GetQuestLocale(quest.Id);
if (localeData != null) 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);
} }
} }
+10 -3
View File
@@ -3063,7 +3063,6 @@ namespace Game
npcText.Data[i].BroadcastTextID = result.Read<uint>(9 + i); npcText.Data[i].BroadcastTextID = result.Read<uint>(9 + i);
} }
BitSet erasedBroadcastTexts = new(SharedConst.MaxNpcTextOptions);
for (int i = 0; i < SharedConst.MaxNpcTextOptions; i++) for (int i = 0; i < SharedConst.MaxNpcTextOptions; i++)
{ {
if (npcText.Data[i].BroadcastTextID != 0) if (npcText.Data[i].BroadcastTextID != 0)
@@ -3071,20 +3070,28 @@ namespace Game
if (!CliDB.BroadcastTextStorage.ContainsKey(npcText.Data[i].BroadcastTextID)) 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); 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; npcText.Data[i].BroadcastTextID = 0;
erasedBroadcastTexts[i] = true;
} }
} }
} }
for (byte i = 0; i < SharedConst.MaxNpcTextOptions; i++) 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); 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; 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; npcTextStorage[textID] = npcText;
} while (result.NextRow()); } while (result.NextRow());