Core/SpawnTracking: Allow linking a spawn to more than one quest objective
Port From (https://github.com/TrinityCore/TrinityCore/commit/138b1b1a21ff871b54f1f2bd815de30a93b803eb)
This commit is contained in:
@@ -338,7 +338,9 @@ namespace Game.Entities
|
|||||||
|
|
||||||
ReplaceAllDynamicFlags(UnitDynFlags.None);
|
ReplaceAllDynamicFlags(UnitDynFlags.None);
|
||||||
|
|
||||||
SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.StateWorldEffectsQuestObjectiveID), data != null ? data.spawnTrackingQuestObjectiveId : 0);
|
// Set StateWorldEffectsQuestObjectiveID if there is only one linked objective for this creature
|
||||||
|
if (data != null && data.spawnTrackingQuestObjectives.Count == 1)
|
||||||
|
SetUpdateFieldValue(m_values.ModifyValue(m_unitData).ModifyValue(m_unitData.StateWorldEffectsQuestObjectiveID), data.spawnTrackingQuestObjectives.First());
|
||||||
|
|
||||||
SetCanDualWield(cInfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.UseOffhandAttack));
|
SetCanDualWield(cInfo.FlagsExtra.HasAnyFlag(CreatureFlagsExtra.UseOffhandAttack));
|
||||||
|
|
||||||
@@ -3033,9 +3035,9 @@ namespace Game.Entities
|
|||||||
CreatureData data = GetCreatureData();
|
CreatureData data = GetCreatureData();
|
||||||
if (data != null)
|
if (data != null)
|
||||||
{
|
{
|
||||||
if (data.spawnTrackingQuestObjectiveId != 0 && data.spawnTrackingData != null)
|
if (data.spawnTrackingData != null && !data.spawnTrackingQuestObjectives.Empty())
|
||||||
{
|
{
|
||||||
SpawnTrackingState state = player.GetSpawnTrackingStateByObjective(data.spawnTrackingData.SpawnTrackingId, data.spawnTrackingQuestObjectiveId);
|
SpawnTrackingState state = player.GetSpawnTrackingStateByObjectives(data.spawnTrackingData.SpawnTrackingId, data.spawnTrackingQuestObjectives);
|
||||||
return data.spawnTrackingStates[(int)state];
|
return data.spawnTrackingStates[(int)state];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1126,7 +1126,9 @@ namespace Game.Entities
|
|||||||
PhasingHandler.InitDbPhaseShift(GetPhaseShift(), data.PhaseUseFlags, data.PhaseId, data.PhaseGroup);
|
PhasingHandler.InitDbPhaseShift(GetPhaseShift(), data.PhaseUseFlags, data.PhaseId, data.PhaseGroup);
|
||||||
PhasingHandler.InitDbVisibleMapId(GetPhaseShift(), data.terrainSwapMap);
|
PhasingHandler.InitDbVisibleMapId(GetPhaseShift(), data.terrainSwapMap);
|
||||||
|
|
||||||
SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.StateWorldEffectsQuestObjectiveID), data != null ? data.spawnTrackingQuestObjectiveId : 0);
|
// Set StateWorldEffectsQuestObjectiveID if there is only one linked objective for this gameobject
|
||||||
|
if (data != null && data.spawnTrackingQuestObjectives.Count == 1)
|
||||||
|
SetUpdateFieldValue(m_values.ModifyValue(m_gameObjectData).ModifyValue(m_gameObjectData.StateWorldEffectsQuestObjectiveID), data.spawnTrackingQuestObjectives.First());
|
||||||
|
|
||||||
if (data.spawntimesecs >= 0)
|
if (data.spawntimesecs >= 0)
|
||||||
{
|
{
|
||||||
@@ -2741,9 +2743,9 @@ namespace Game.Entities
|
|||||||
GameObjectData data = GetGameObjectData();
|
GameObjectData data = GetGameObjectData();
|
||||||
if (data != null)
|
if (data != null)
|
||||||
{
|
{
|
||||||
if (data.spawnTrackingQuestObjectiveId != 0 && data.spawnTrackingData != null)
|
if (data.spawnTrackingData != null && !data.spawnTrackingQuestObjectives.Empty())
|
||||||
{
|
{
|
||||||
SpawnTrackingState state = player.GetSpawnTrackingStateByObjective(data.spawnTrackingData.SpawnTrackingId, data.spawnTrackingQuestObjectiveId);
|
SpawnTrackingState state = player.GetSpawnTrackingStateByObjectives(data.spawnTrackingData.SpawnTrackingId, data.spawnTrackingQuestObjectives);
|
||||||
return data.spawnTrackingStates[(int)state];
|
return data.spawnTrackingStates[(int)state];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ using Game.Networking.Packets;
|
|||||||
using Game.Spells;
|
using Game.Spells;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Numerics;
|
using System.Numerics;
|
||||||
|
|
||||||
namespace Game.Entities
|
namespace Game.Entities
|
||||||
@@ -166,8 +167,8 @@ namespace Game.Entities
|
|||||||
dynFlags |= (uint)GameObjectDynamicLowFlags.NoInterract;
|
dynFlags |= (uint)GameObjectDynamicLowFlags.NoInterract;
|
||||||
|
|
||||||
var data = Global.ObjectMgr.GetSpawnMetadata(SpawnObjectType.GameObject, gameObject.GetSpawnId());
|
var data = Global.ObjectMgr.GetSpawnMetadata(SpawnObjectType.GameObject, gameObject.GetSpawnId());
|
||||||
if (data != null && data.spawnTrackingQuestObjectiveId != 0 && data.spawnTrackingData != null)
|
if (data.spawnTrackingData != null && !data.spawnTrackingQuestObjectives.Empty())
|
||||||
if (receiver.GetSpawnTrackingStateByObjective(data.spawnTrackingData.SpawnTrackingId, data.spawnTrackingQuestObjectiveId) != SpawnTrackingState.Active)
|
if (receiver.GetSpawnTrackingStateByObjectives(data.spawnTrackingData.SpawnTrackingId, data.spawnTrackingQuestObjectives) != SpawnTrackingState.Active)
|
||||||
dynFlags &= ~(uint)GameObjectDynamicLowFlags.Activate;
|
dynFlags &= ~(uint)GameObjectDynamicLowFlags.Activate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1295,7 +1296,7 @@ namespace Game.Entities
|
|||||||
|
|
||||||
var stateWorldEffectIDs = GetViewerDependentStateWorldEffectIDs(this, owner, receiver);
|
var stateWorldEffectIDs = GetViewerDependentStateWorldEffectIDs(this, owner, receiver);
|
||||||
data.WriteInt32(stateWorldEffectIDs.Count);
|
data.WriteInt32(stateWorldEffectIDs.Count);
|
||||||
data.WriteUInt32(StateWorldEffectsQuestObjectiveID);
|
data.WriteUInt32(GetViewerDependentStateWorldEffectsQuestObjectiveID(this, owner, receiver));
|
||||||
data.WriteInt32(SpellOverrideNameID);
|
data.WriteInt32(SpellOverrideNameID);
|
||||||
for (int i = 0; i < stateWorldEffectIDs.Count; ++i)
|
for (int i = 0; i < stateWorldEffectIDs.Count; ++i)
|
||||||
data.WriteUInt32(stateWorldEffectIDs[i]);
|
data.WriteUInt32(stateWorldEffectIDs[i]);
|
||||||
@@ -1623,7 +1624,7 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
if (changesMask[12])
|
if (changesMask[12])
|
||||||
{
|
{
|
||||||
data.WriteUInt32(StateWorldEffectsQuestObjectiveID);
|
data.WriteUInt32(GetViewerDependentStateWorldEffectsQuestObjectiveID(this, owner, receiver));
|
||||||
}
|
}
|
||||||
if (changesMask[13])
|
if (changesMask[13])
|
||||||
{
|
{
|
||||||
@@ -2574,6 +2575,36 @@ namespace Game.Entities
|
|||||||
|
|
||||||
return stateAnimKitId;
|
return stateAnimKitId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint GetViewerDependentStateWorldEffectsQuestObjectiveID(UnitData unitData, Unit unit, Player receiver)
|
||||||
|
{
|
||||||
|
uint stateWorldEffectsQuestObjectiveId = unitData.StateWorldEffectsQuestObjectiveID;
|
||||||
|
|
||||||
|
if (stateWorldEffectsQuestObjectiveId == 0 && unit.IsCreature())
|
||||||
|
{
|
||||||
|
CreatureData data = unit.ToCreature().GetCreatureData();
|
||||||
|
if (data != null)
|
||||||
|
{
|
||||||
|
if (data.spawnTrackingQuestObjectives.Any())
|
||||||
|
{
|
||||||
|
// If there is no valid objective for player, fill UF with first objective (if any)
|
||||||
|
stateWorldEffectsQuestObjectiveId = data.spawnTrackingQuestObjectives.First();
|
||||||
|
int i = 0;
|
||||||
|
while (++i <= data.spawnTrackingQuestObjectives.Count)
|
||||||
|
{
|
||||||
|
var id = data.spawnTrackingQuestObjectives[i];
|
||||||
|
if (receiver.GetSpawnTrackingStateByObjective(data.spawnTrackingData.SpawnTrackingId, id) != SpawnTrackingState.Active)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
stateWorldEffectsQuestObjectiveId = id;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return stateWorldEffectsQuestObjectiveId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ChrCustomizationChoice : IComparable<ChrCustomizationChoice>
|
public class ChrCustomizationChoice : IComparable<ChrCustomizationChoice>
|
||||||
@@ -7640,7 +7671,7 @@ namespace Game.Entities
|
|||||||
data.WriteUInt32(GetViewerDependentSpawnTrackingStateAnimKitID(this, owner, receiver));
|
data.WriteUInt32(GetViewerDependentSpawnTrackingStateAnimKitID(this, owner, receiver));
|
||||||
var stateWorldEffectIDs = GetViewerDependentStateWorldEffectIDs(this, owner, receiver);
|
var stateWorldEffectIDs = GetViewerDependentStateWorldEffectIDs(this, owner, receiver);
|
||||||
data.WriteInt32(stateWorldEffectIDs.Count);
|
data.WriteInt32(stateWorldEffectIDs.Count);
|
||||||
data.WriteUInt32(StateWorldEffectsQuestObjectiveID);
|
data.WriteUInt32(GetViewerDependentStateWorldEffectsQuestObjectiveID(this, owner, receiver));
|
||||||
for (int i = 0; i < stateWorldEffectIDs.Count; ++i)
|
for (int i = 0; i < stateWorldEffectIDs.Count; ++i)
|
||||||
{
|
{
|
||||||
data.WriteUInt32(stateWorldEffectIDs[i]);
|
data.WriteUInt32(stateWorldEffectIDs[i]);
|
||||||
@@ -7762,7 +7793,7 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
if (changesMask[9])
|
if (changesMask[9])
|
||||||
{
|
{
|
||||||
data.WriteUInt32(StateWorldEffectsQuestObjectiveID);
|
data.WriteUInt32(GetViewerDependentStateWorldEffectsQuestObjectiveID(this, owner, receiver));
|
||||||
}
|
}
|
||||||
if (changesMask[10])
|
if (changesMask[10])
|
||||||
{
|
{
|
||||||
@@ -7918,6 +7949,36 @@ namespace Game.Entities
|
|||||||
return stateAnimKitId;
|
return stateAnimKitId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint GetViewerDependentStateWorldEffectsQuestObjectiveID(GameObjectFieldData gameObjectData, GameObject gameObject, Player receiver)
|
||||||
|
{
|
||||||
|
uint stateWorldEffectsQuestObjectiveId = gameObjectData.StateWorldEffectsQuestObjectiveID;
|
||||||
|
|
||||||
|
if (stateWorldEffectsQuestObjectiveId == 0)
|
||||||
|
{
|
||||||
|
GameObjectData data = gameObject.GetGameObjectData();
|
||||||
|
if (data != null)
|
||||||
|
{
|
||||||
|
if (data.spawnTrackingQuestObjectives.Any())
|
||||||
|
{
|
||||||
|
// If there is no valid objective for player, fill UF with first objective (if any)
|
||||||
|
stateWorldEffectsQuestObjectiveId = data.spawnTrackingQuestObjectives.First();
|
||||||
|
int i = 0;
|
||||||
|
while (++i <= data.spawnTrackingQuestObjectives.Count)
|
||||||
|
{
|
||||||
|
var id = data.spawnTrackingQuestObjectives[i];
|
||||||
|
if (receiver.GetSpawnTrackingStateByObjective(data.spawnTrackingData.SpawnTrackingId, id) != SpawnTrackingState.Active)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
stateWorldEffectsQuestObjectiveId = id;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return stateWorldEffectsQuestObjectiveId;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class DynamicObjectData : HasChangesMask
|
public class DynamicObjectData : HasChangesMask
|
||||||
|
|||||||
@@ -2742,9 +2742,11 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data != null && data.spawnTrackingQuestObjectiveId != 0 && data.spawnTrackingData != null)
|
if (data != null && data.spawnTrackingData != null && !data.spawnTrackingQuestObjectives.Empty())
|
||||||
{
|
{
|
||||||
if (objective.Id == data.spawnTrackingQuestObjectiveId)
|
foreach (uint spawnTrackingQuestObjectiveId in data.spawnTrackingQuestObjectives)
|
||||||
|
{
|
||||||
|
if (objective.Id == spawnTrackingQuestObjectiveId)
|
||||||
{
|
{
|
||||||
// Store spawn tracking to return correct state in Player::GetSpawnTrackingStateByObjective
|
// Store spawn tracking to return correct state in Player::GetSpawnTrackingStateByObjective
|
||||||
QuestStatusData questStatus = objectiveStatusData.QuestStatusPair.Status;
|
QuestStatusData questStatus = objectiveStatusData.QuestStatusPair.Status;
|
||||||
@@ -2756,26 +2758,27 @@ namespace Game.Entities
|
|||||||
SpawnData spawnData = spawnMetaData.ToSpawnData();
|
SpawnData spawnData = spawnMetaData.ToSpawnData();
|
||||||
if (spawnData == null)
|
if (spawnData == null)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
QuestPOIUpdateResponse response = new();
|
QuestPOIUpdateResponse response = new();
|
||||||
|
|
||||||
SpawnTrackingResponseInfo responseInfo = new();
|
SpawnTrackingResponseInfo responseInfo = new();
|
||||||
responseInfo.SpawnTrackingID = data.spawnTrackingData.SpawnTrackingId;
|
responseInfo.SpawnTrackingID = spawnMetaData.spawnTrackingData.SpawnTrackingId;
|
||||||
responseInfo.ObjectID = (int)spawnData.Id;
|
responseInfo.ObjectID = (int)spawnData.Id;
|
||||||
responseInfo.PhaseID = (int)spawnData.PhaseId;
|
responseInfo.PhaseID = (int)spawnData.PhaseId;
|
||||||
responseInfo.PhaseGroupID = (int)spawnData.PhaseGroup;
|
responseInfo.PhaseGroupID = (int)spawnData.PhaseGroup;
|
||||||
responseInfo.PhaseUseFlags = (int)spawnData.PhaseUseFlags;
|
responseInfo.PhaseUseFlags = (int)spawnData.PhaseUseFlags;
|
||||||
|
|
||||||
SpawnTrackingState state = GetSpawnTrackingStateByObjective(data.spawnTrackingData.SpawnTrackingId, objective.Id);
|
SpawnTrackingState state = GetSpawnTrackingStateByObjectives(spawnMetaData.spawnTrackingData.SpawnTrackingId, spawnMetaData.spawnTrackingQuestObjectives);
|
||||||
responseInfo.Visible = data.spawnTrackingStates[(int)state].Visible;
|
responseInfo.Visible = spawnMetaData.spawnTrackingStates[(int)state].Visible;
|
||||||
|
|
||||||
response.SpawnTrackingResponses.Add(responseInfo);
|
response.SpawnTrackingResponses.Add(responseInfo);
|
||||||
|
|
||||||
SendPacket(response);
|
SendPacket(response);
|
||||||
}
|
}
|
||||||
|
|
||||||
anyObjectiveChangedSpawnTrackingState = true;
|
anyObjectiveChangedSpawnTrackingState = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (objectiveWasComplete != objectiveIsNowComplete)
|
if (objectiveWasComplete != objectiveIsNowComplete)
|
||||||
anyObjectiveChangedCompletionState = true;
|
anyObjectiveChangedCompletionState = true;
|
||||||
@@ -3435,17 +3438,39 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public QuestObjective GetActiveQuestObjectiveForForSpawnTracking(uint spawnTrackingId)
|
public QuestObjective GetActiveQuestObjectiveForSpawnTracking(uint spawnTrackingId)
|
||||||
{
|
{
|
||||||
var questObjectiveList = Global.ObjectMgr.GetSpawnTrackingQuestObjectiveList(spawnTrackingId);
|
var questObjectiveList = Global.ObjectMgr.GetSpawnTrackingQuestObjectiveList(spawnTrackingId);
|
||||||
if (questObjectiveList != null)
|
if (questObjectiveList != null)
|
||||||
foreach (QuestObjective questObjective in questObjectiveList)
|
foreach (QuestObjective questObjective in questObjectiveList)
|
||||||
if (FindQuestSlot(questObjective.QuestID) < SharedConst.MaxQuestLogSize)
|
if (IsQuestObjectiveCompletable(questObjective.QuestID, questObjective.Id))
|
||||||
return questObjective;
|
return questObjective;
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public SpawnTrackingState GetSpawnTrackingStateByObjectives(uint spawnTrackingId, List<uint> questObjectives)
|
||||||
|
{
|
||||||
|
if (spawnTrackingId != 0 && !questObjectives.Empty())
|
||||||
|
{
|
||||||
|
bool hasAnyQuestObjectiveCompletable = false;
|
||||||
|
foreach (uint questObjectiveId in questObjectives)
|
||||||
|
{
|
||||||
|
SpawnTrackingState state = GetSpawnTrackingStateByObjective(spawnTrackingId, questObjectiveId);
|
||||||
|
if (state == SpawnTrackingState.Complete)
|
||||||
|
return SpawnTrackingState.Complete;
|
||||||
|
|
||||||
|
if (state == SpawnTrackingState.Active)
|
||||||
|
hasAnyQuestObjectiveCompletable = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasAnyQuestObjectiveCompletable)
|
||||||
|
return SpawnTrackingState.Active;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SpawnTrackingState.None;
|
||||||
|
}
|
||||||
|
|
||||||
public SpawnTrackingState GetSpawnTrackingStateByObjective(uint spawnTrackingId, uint questObjectiveId)
|
public SpawnTrackingState GetSpawnTrackingStateByObjective(uint spawnTrackingId, uint questObjectiveId)
|
||||||
{
|
{
|
||||||
if (spawnTrackingId != 0 && questObjectiveId != 0 && Global.ObjectMgr.IsQuestObjectiveForSpawnTracking(spawnTrackingId, questObjectiveId))
|
if (spawnTrackingId != 0 && questObjectiveId != 0 && Global.ObjectMgr.IsQuestObjectiveForSpawnTracking(spawnTrackingId, questObjectiveId))
|
||||||
@@ -3455,7 +3480,8 @@ namespace Game.Entities
|
|||||||
{
|
{
|
||||||
if (IsQuestRewarded(questObjective.QuestID) || IsQuestObjectiveComplete(questObjective.QuestID, questObjective.Id))
|
if (IsQuestRewarded(questObjective.QuestID) || IsQuestObjectiveComplete(questObjective.QuestID, questObjective.Id))
|
||||||
return SpawnTrackingState.Complete;
|
return SpawnTrackingState.Complete;
|
||||||
else if (GetQuestStatus(questObjective.QuestID) != QuestStatus.None && IsQuestObjectiveCompletable(questObjective.QuestID, questObjective.Id))
|
|
||||||
|
if (GetQuestStatus(questObjective.QuestID) != QuestStatus.None && IsQuestObjectiveCompletable(questObjective.QuestID, questObjective.Id))
|
||||||
{
|
{
|
||||||
var itr = m_QuestStatus.LookupByKey(questObjective.QuestID);
|
var itr = m_QuestStatus.LookupByKey(questObjective.QuestID);
|
||||||
if (itr != null && itr.Slot < SharedConst.MaxQuestLogSize)
|
if (itr != null && itr.Slot < SharedConst.MaxQuestLogSize)
|
||||||
@@ -3512,16 +3538,17 @@ namespace Game.Entities
|
|||||||
GameObjectFieldData goMask = new();
|
GameObjectFieldData goMask = new();
|
||||||
|
|
||||||
SpawnMetadata data = Global.ObjectMgr.GetSpawnMetadata(SpawnObjectType.GameObject, gameObject.GetSpawnId());
|
SpawnMetadata data = Global.ObjectMgr.GetSpawnMetadata(SpawnObjectType.GameObject, gameObject.GetSpawnId());
|
||||||
if (data != null && data.spawnTrackingQuestObjectiveId != 0 && data.spawnTrackingData != null)
|
if (data != null && data.spawnTrackingData != null && !data.spawnTrackingQuestObjectives.Empty())
|
||||||
{
|
{
|
||||||
objMask.MarkChanged(m_objectData.DynamicFlags);
|
objMask.MarkChanged(objMask.DynamicFlags);
|
||||||
goMask.MarkChanged(gameObject.m_gameObjectData.StateWorldEffectIDs);
|
goMask.MarkChanged(goMask.StateWorldEffectIDs);
|
||||||
goMask.MarkChanged(gameObject.m_gameObjectData.StateSpellVisualID);
|
goMask.MarkChanged(goMask.StateSpellVisualID);
|
||||||
goMask.MarkChanged(gameObject.m_gameObjectData.SpawnTrackingStateAnimID);
|
goMask.MarkChanged(goMask.SpawnTrackingStateAnimID);
|
||||||
goMask.MarkChanged(gameObject.m_gameObjectData.SpawnTrackingStateAnimKitID);
|
goMask.MarkChanged(goMask.SpawnTrackingStateAnimKitID);
|
||||||
|
goMask.MarkChanged(goMask.StateWorldEffectsQuestObjectiveID);
|
||||||
}
|
}
|
||||||
else if (m_questObjectiveStatus.ContainsKey((QuestObjectiveType.GameObject, (int)gameObject.GetEntry())) || gameObject.GetGoInfo().GetConditionID1() != 0)
|
else if (m_questObjectiveStatus.ContainsKey((QuestObjectiveType.GameObject, (int)gameObject.GetEntry())) || gameObject.GetGoInfo().GetConditionID1() != 0)
|
||||||
objMask.MarkChanged(gameObject.m_objectData.DynamicFlags);
|
objMask.MarkChanged(objMask.DynamicFlags);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
switch (gameObject.GetGoType())
|
switch (gameObject.GetGoType())
|
||||||
@@ -3533,7 +3560,7 @@ namespace Game.Entities
|
|||||||
case GameObjectTypes.Goober:
|
case GameObjectTypes.Goober:
|
||||||
case GameObjectTypes.GatheringNode:
|
case GameObjectTypes.GatheringNode:
|
||||||
if (Global.ObjectMgr.IsGameObjectForQuests(gameObject.GetEntry()))
|
if (Global.ObjectMgr.IsGameObjectForQuests(gameObject.GetEntry()))
|
||||||
objMask.MarkChanged(gameObject.m_objectData.DynamicFlags);
|
objMask.MarkChanged(objMask.DynamicFlags);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -3562,13 +3589,14 @@ namespace Game.Entities
|
|||||||
unitMask.MarkChanged(m_unitData.NpcFlags2);
|
unitMask.MarkChanged(m_unitData.NpcFlags2);
|
||||||
|
|
||||||
SpawnMetadata data = Global.ObjectMgr.GetSpawnMetadata(SpawnObjectType.Creature, creature.GetSpawnId());
|
SpawnMetadata data = Global.ObjectMgr.GetSpawnMetadata(SpawnObjectType.Creature, creature.GetSpawnId());
|
||||||
if (data != null && data.spawnTrackingQuestObjectiveId != 0 && data.spawnTrackingData != null)
|
if (data != null && data.spawnTrackingData != null && !data.spawnTrackingQuestObjectives.Empty())
|
||||||
{
|
{
|
||||||
objMask.MarkChanged(objMask.DynamicFlags);
|
objMask.MarkChanged(objMask.DynamicFlags);
|
||||||
unitMask.MarkChanged(unitMask.StateWorldEffectIDs);
|
unitMask.MarkChanged(unitMask.StateWorldEffectIDs);
|
||||||
unitMask.MarkChanged(unitMask.StateSpellVisualID);
|
unitMask.MarkChanged(unitMask.StateSpellVisualID);
|
||||||
unitMask.MarkChanged(unitMask.StateAnimID);
|
unitMask.MarkChanged(unitMask.StateAnimID);
|
||||||
unitMask.MarkChanged(unitMask.StateAnimKitID);
|
unitMask.MarkChanged(unitMask.StateAnimKitID);
|
||||||
|
unitMask.MarkChanged(unitMask.StateWorldEffectsQuestObjectiveID);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (objMask.GetUpdateMask().IsAnySet() || unitMask.GetUpdateMask().IsAnySet())
|
if (objMask.GetUpdateMask().IsAnySet() || unitMask.GetUpdateMask().IsAnySet())
|
||||||
|
|||||||
@@ -9265,7 +9265,7 @@ namespace Game
|
|||||||
_spawnTrackingMapStorage.Clear();
|
_spawnTrackingMapStorage.Clear();
|
||||||
|
|
||||||
// 0 1 2 3
|
// 0 1 2 3
|
||||||
SQLResult result = DB.World.Query("SELECT SpawnTrackingId, SpawnType, SpawnId, QuestObjectiveId FROM spawn_tracking");
|
SQLResult result = DB.World.Query("SELECT SpawnTrackingId, SpawnType, SpawnId, QuestObjectiveIds FROM spawn_tracking");
|
||||||
|
|
||||||
if (result.IsEmpty())
|
if (result.IsEmpty())
|
||||||
{
|
{
|
||||||
@@ -9280,7 +9280,6 @@ namespace Game
|
|||||||
uint spawnTrackingId = result.Read<uint>(0);
|
uint spawnTrackingId = result.Read<uint>(0);
|
||||||
SpawnObjectType spawnType = (SpawnObjectType)result.Read<byte>(1);
|
SpawnObjectType spawnType = (SpawnObjectType)result.Read<byte>(1);
|
||||||
ulong spawnId = result.Read<ulong>(2);
|
ulong spawnId = result.Read<ulong>(2);
|
||||||
uint objectiveId = result.Read<uint>(3);
|
|
||||||
|
|
||||||
if (!SpawnData.TypeIsValid(spawnType))
|
if (!SpawnData.TypeIsValid(spawnType))
|
||||||
{
|
{
|
||||||
@@ -9312,12 +9311,6 @@ namespace Game
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsQuestObjectiveForSpawnTracking(spawnTrackingId, objectiveId))
|
|
||||||
{
|
|
||||||
Log.outError(LogFilter.Sql, $"Table `spawn_tracking` has spawn tracking {spawnTrackingId} assigned to spawn ({spawnType},{spawnId}), but spawn tracking is not linked to quest objective {objectiveId}. Skipped.");
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spawnTrackingTemplateData.MapId != data.MapId)
|
if (spawnTrackingTemplateData.MapId != data.MapId)
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Sql, $"Table `spawn_tracking` has spawn tracking {spawnTrackingId} (map {spawnTrackingTemplateData.MapId}) assigned to spawn ({spawnType},{spawnId}), but spawn has map {data.MapId} - spawn NOT added to spawn tracking!");
|
Log.outError(LogFilter.Sql, $"Table `spawn_tracking` has spawn tracking {spawnTrackingId} (map {spawnTrackingTemplateData.MapId}) assigned to spawn ({spawnType},{spawnId}), but spawn has map {data.MapId} - spawn NOT added to spawn tracking!");
|
||||||
@@ -9332,8 +9325,33 @@ namespace Game
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<uint> objectiveList = new();
|
||||||
|
string objectivesStr = result.Read<string>(3);
|
||||||
|
if (!objectivesStr.IsEmpty())
|
||||||
|
{
|
||||||
|
foreach (var objectiveStr in objectivesStr.Split(',', StringSplitOptions.RemoveEmptyEntries))
|
||||||
|
{
|
||||||
|
if (!uint.TryParse(objectiveStr, out uint objectiveId))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!IsQuestObjectiveForSpawnTracking(spawnTrackingId, objectiveId))
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Sql, $"Table `spawn_tracking` has spawn tracking {spawnTrackingId} assigned to spawn ({spawnType},{spawnId}), but spawn tracking is not linked to quest objective {objectiveId}. Skipped.");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
objectiveList.Add(objectiveId);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (objectiveList.Empty())
|
||||||
|
{
|
||||||
|
Log.outError(LogFilter.Sql, $"Table `spawn_tracking` has spawn tracking {spawnTrackingId} assigned to spawn ({spawnType},{spawnId}), but spawn tracking is not linked to any quest objective - spawn NOT added to spawn tracking!");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
data.spawnTrackingData = spawnTrackingTemplateData;
|
data.spawnTrackingData = spawnTrackingTemplateData;
|
||||||
data.spawnTrackingQuestObjectiveId = objectiveId;
|
data.spawnTrackingQuestObjectives = objectiveList;
|
||||||
_spawnTrackingMapStorage.Add(spawnTrackingId, data);
|
_spawnTrackingMapStorage.Add(spawnTrackingId, data);
|
||||||
|
|
||||||
++count;
|
++count;
|
||||||
@@ -9435,7 +9453,7 @@ namespace Game
|
|||||||
|
|
||||||
if (!CliDB.WorldEffectStorage.HasRecord(worldEffectId))
|
if (!CliDB.WorldEffectStorage.HasRecord(worldEffectId))
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Sql, $"Table `spawn_tracking_state` references invalid StateAnimKitId {worldEffectId} for spawn ({spawnType},{spawnId}). Skipped.");
|
Log.outError(LogFilter.Sql, $"Table `spawn_tracking_state` references invalid WorldEffectId {worldEffectId} for spawn ({spawnType},{spawnId}). Skipped.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -854,7 +854,7 @@ namespace Game
|
|||||||
responseInfo.ObjectID = requestInfo.ObjectID;
|
responseInfo.ObjectID = requestInfo.ObjectID;
|
||||||
|
|
||||||
var spawnTrackingTemplateData = Global.ObjectMgr.GetSpawnTrackingData(requestInfo.SpawnTrackingID);
|
var spawnTrackingTemplateData = Global.ObjectMgr.GetSpawnTrackingData(requestInfo.SpawnTrackingID);
|
||||||
QuestObjective activeQuestObjective = _player.GetActiveQuestObjectiveForForSpawnTracking(requestInfo.SpawnTrackingID);
|
QuestObjective activeQuestObjective = _player.GetActiveQuestObjectiveForSpawnTracking(requestInfo.SpawnTrackingID);
|
||||||
|
|
||||||
// Send phase info if map is the same or spawn tracking related quests are taken or completed
|
// Send phase info if map is the same or spawn tracking related quests are taken or completed
|
||||||
if (spawnTrackingTemplateData != null && (_player.GetMapId() == spawnTrackingTemplateData.MapId || activeQuestObjective != null))
|
if (spawnTrackingTemplateData != null && (_player.GetMapId() == spawnTrackingTemplateData.MapId || activeQuestObjective != null))
|
||||||
@@ -881,7 +881,7 @@ namespace Game
|
|||||||
|
|
||||||
if (activeQuestObjective != null)
|
if (activeQuestObjective != null)
|
||||||
{
|
{
|
||||||
SpawnTrackingState state = _player.GetSpawnTrackingStateByObjective(requestInfo.SpawnTrackingID, activeQuestObjective.Id);
|
SpawnTrackingState state = _player.GetSpawnTrackingStateByObjectives(requestInfo.SpawnTrackingID, data.spawnTrackingQuestObjectives);
|
||||||
responseInfo.Visible = data.spawnTrackingStates[(int)state].Visible;
|
responseInfo.Visible = data.spawnTrackingStates[(int)state].Visible;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ namespace Game.Maps
|
|||||||
public bool dbData = true;
|
public bool dbData = true;
|
||||||
public SpawnGroupTemplateData spawnGroupData;
|
public SpawnGroupTemplateData spawnGroupData;
|
||||||
public SpawnTrackingTemplateData spawnTrackingData;
|
public SpawnTrackingTemplateData spawnTrackingData;
|
||||||
public uint spawnTrackingQuestObjectiveId;
|
public List<uint> spawnTrackingQuestObjectives = new();
|
||||||
public SpawnTrackingStateData[] spawnTrackingStates = new SpawnTrackingStateData[(int)SpawnTrackingState.Max];
|
public SpawnTrackingStateData[] spawnTrackingStates = new SpawnTrackingStateData[(int)SpawnTrackingState.Max];
|
||||||
|
|
||||||
public static bool TypeInMask(SpawnObjectType type, SpawnObjectTypeMask mask) { return ((1 << (int)type) & (int)mask) != 0; }
|
public static bool TypeInMask(SpawnObjectType type, SpawnObjectTypeMask mask) { return ((1 << (int)type) & (int)mask) != 0; }
|
||||||
|
|||||||
Reference in New Issue
Block a user