Core/Quests: Fixed marking quest objectives as complete clientside for objectives using flagging instead of counters

Port From (https://github.com/TrinityCore/TrinityCore/commit/e3a9b18567866ab5b309758168fbe4ce579b30f3)
This commit is contained in:
hondacrx
2021-01-26 19:35:05 -05:00
parent b22dc3bc8a
commit 322920ab8c
3 changed files with 19 additions and 7 deletions
@@ -2311,7 +2311,7 @@ namespace Game.Entities
public UpdateField<uint> StateFlags = new UpdateField<uint>(0, 2); public UpdateField<uint> StateFlags = new UpdateField<uint>(0, 2);
public UpdateField<uint> EndTime = new UpdateField<uint>(0, 3); public UpdateField<uint> EndTime = new UpdateField<uint>(0, 3);
public UpdateField<uint> AcceptTime = new UpdateField<uint>(0, 4); public UpdateField<uint> AcceptTime = new UpdateField<uint>(0, 4);
public UpdateField<uint> Field_10 = new UpdateField<uint>(0, 5); public UpdateField<uint> ObjectiveFlags = new UpdateField<uint>(0, 5);
public UpdateFieldArray<ushort> ObjectiveProgress = new UpdateFieldArray<ushort>(24, 6, 7); public UpdateFieldArray<ushort> ObjectiveProgress = new UpdateFieldArray<ushort>(24, 6, 7);
public QuestLog() : base(31) { } public QuestLog() : base(31) { }
@@ -2322,7 +2322,7 @@ namespace Game.Entities
data.WriteUInt32(StateFlags); data.WriteUInt32(StateFlags);
data.WriteUInt32(EndTime); data.WriteUInt32(EndTime);
data.WriteUInt32(AcceptTime); data.WriteUInt32(AcceptTime);
data.WriteUInt32(Field_10); data.WriteUInt32(ObjectiveFlags);
for (int i = 0; i < 24; ++i) for (int i = 0; i < 24; ++i)
{ {
data.WriteUInt16(ObjectiveProgress[i]); data.WriteUInt16(ObjectiveProgress[i]);
@@ -2360,7 +2360,7 @@ namespace Game.Entities
} }
if (changesMask[5]) if (changesMask[5])
{ {
data.WriteUInt32(Field_10); data.WriteUInt32(ObjectiveFlags);
} }
} }
if (changesMask[6]) if (changesMask[6])
@@ -2381,7 +2381,7 @@ namespace Game.Entities
ClearChangesMask(StateFlags); ClearChangesMask(StateFlags);
ClearChangesMask(EndTime); ClearChangesMask(EndTime);
ClearChangesMask(AcceptTime); ClearChangesMask(AcceptTime);
ClearChangesMask(Field_10); ClearChangesMask(ObjectiveFlags);
ClearChangesMask(ObjectiveProgress); ClearChangesMask(ObjectiveProgress);
_changesMask.ResetAll(); _changesMask.ResetAll();
} }
+1 -1
View File
@@ -763,7 +763,7 @@ namespace Game.Entities
if (!objectiveItr.IsStoringFlag()) if (!objectiveItr.IsStoringFlag())
SetQuestSlotCounter(slot, objectiveIndex, (ushort)data); SetQuestSlotCounter(slot, objectiveIndex, (ushort)data);
else if (data != 0) else if (data != 0)
SetQuestSlotState(slot, (QuestSlotStateMask)(256 << objectiveIndex)); SetQuestSlotObjectiveFlag(slot, (sbyte)objectiveIndex);
} }
else else
Log.outError(LogFilter.Player, "Player {0} ({1}) has quest {2} out of range objective index {3}.", GetName(), GetGUID().ToString(), questID, objectiveIndex); Log.outError(LogFilter.Player, "Player {0} ({1}) has quest {2} out of range objective index {3}.", GetName(), GetGUID().ToString(), questID, objectiveIndex);
+14 -2
View File
@@ -2060,6 +2060,18 @@ namespace Game.Entities
SetUpdateFieldValue(questLog.ModifyValue(questLog.EndTime), timer); SetUpdateFieldValue(questLog.ModifyValue(questLog.EndTime), timer);
} }
void SetQuestSlotObjectiveFlag(ushort slot, sbyte objectiveIndex)
{
QuestLog questLog = m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.QuestLog, slot);
SetUpdateFieldFlagValue(questLog.ModifyValue(questLog.ObjectiveFlags), 1u << objectiveIndex);
}
void RemoveQuestSlotObjectiveFlag(ushort slot, sbyte objectiveIndex)
{
QuestLog questLog = m_values.ModifyValue(m_playerData).ModifyValue(m_playerData.QuestLog, slot);
RemoveUpdateFieldFlagValue(questLog.ModifyValue(questLog.ObjectiveFlags), 1u << objectiveIndex);
}
void SetQuestCompletedBit(uint questBit, bool completed) void SetQuestCompletedBit(uint questBit, bool completed)
{ {
if (questBit == 0) if (questBit == 0)
@@ -2756,9 +2768,9 @@ namespace Game.Entities
if (!objective.IsStoringFlag()) if (!objective.IsStoringFlag())
SetQuestSlotCounter(log_slot, (byte)objective.StorageIndex, (ushort)status.ObjectiveData[objective.StorageIndex]); SetQuestSlotCounter(log_slot, (byte)objective.StorageIndex, (ushort)status.ObjectiveData[objective.StorageIndex]);
else if (data != 0) else if (data != 0)
SetQuestSlotState(log_slot, (QuestSlotStateMask)(256 << objective.StorageIndex)); SetQuestSlotObjectiveFlag(log_slot, objective.StorageIndex);
else else
RemoveQuestSlotState(log_slot, (QuestSlotStateMask)(256 << objective.StorageIndex)); RemoveQuestSlotObjectiveFlag(log_slot, objective.StorageIndex);
} }
} }