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();
|
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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user