Core/Conversation: Hackfix for NextConversationLineID overflow
Port From (https://github.com/TrinityCore/TrinityCore/commit/9c6a5947de5e27755ec81f530882d6d1171fb97b)
This commit is contained in:
@@ -99,11 +99,30 @@ namespace Game.DataStorage
|
|||||||
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 Conversation actors. DB table `conversation_actors` is empty.");
|
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 Conversation actors. DB table `conversation_actors` is empty.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Remove this hack when NextConversationLineID is changed to uint32
|
||||||
|
uint getNextConversationLineId(ConversationLineRecord conversationLine)
|
||||||
|
{
|
||||||
|
if (conversationLine != null && conversationLine.NextConversationLineID != 0)
|
||||||
|
{
|
||||||
|
uint FirstLineId = 60000; // Arbitrary id to cover the affected rows
|
||||||
|
|
||||||
|
if (conversationLine.Id > FirstLineId && conversationLine.NextConversationLineID < (CliDB.ConversationLineStorage.GetNumRows() - ushort.MaxValue - 1))
|
||||||
|
return (uint)(ushort.MaxValue + conversationLine.NextConversationLineID + 1);
|
||||||
|
|
||||||
|
return (uint)conversationLine.NextConversationLineID;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0u;
|
||||||
|
};
|
||||||
|
|
||||||
// Validate FirstLineId
|
// Validate FirstLineId
|
||||||
Dictionary<uint, uint> prevConversationLineIds = new();
|
Dictionary<uint, uint> prevConversationLineIds = new();
|
||||||
foreach (var conversationLine in CliDB.ConversationLineStorage.Values)
|
foreach (var conversationLine in CliDB.ConversationLineStorage.Values)
|
||||||
if (conversationLine.NextConversationLineID != 0)
|
{
|
||||||
prevConversationLineIds[conversationLine.NextConversationLineID] = conversationLine.Id;
|
uint nextConversationLineId = getNextConversationLineId(conversationLine);
|
||||||
|
if (nextConversationLineId != 0)
|
||||||
|
prevConversationLineIds[nextConversationLineId] = conversationLine.Id;
|
||||||
|
}
|
||||||
|
|
||||||
uint getFirstLineIdFromAnyLineId(uint lineId)
|
uint getFirstLineIdFromAnyLineId(uint lineId)
|
||||||
{
|
{
|
||||||
@@ -149,10 +168,11 @@ namespace Game.DataStorage
|
|||||||
else
|
else
|
||||||
Log.outError(LogFilter.Sql, "Table `conversation_line_template` has missing template for line (ID: {0}) in Conversation {1}, skipped", currentConversationLine.Id, conversationTemplate.Id);
|
Log.outError(LogFilter.Sql, "Table `conversation_line_template` has missing template for line (ID: {0}) in Conversation {1}, skipped", currentConversationLine.Id, conversationTemplate.Id);
|
||||||
|
|
||||||
if (currentConversationLine.NextConversationLineID == 0)
|
uint nextConversationLineId = getNextConversationLineId(currentConversationLine);
|
||||||
|
if (nextConversationLineId == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
currentConversationLine = CliDB.ConversationLineStorage.LookupByKey(currentConversationLine.NextConversationLineID);
|
currentConversationLine = CliDB.ConversationLineStorage.LookupByKey(nextConversationLineId);
|
||||||
}
|
}
|
||||||
|
|
||||||
_conversationTemplateStorage[conversationTemplate.Id] = conversationTemplate;
|
_conversationTemplateStorage[conversationTemplate.Id] = conversationTemplate;
|
||||||
|
|||||||
Reference in New Issue
Block a user