Core/Misc: Implemented spawn tracking

Port From (https://github.com/TrinityCore/TrinityCore/commit/c9099c87567ead635811ef71b990ae7f19103509)
This commit is contained in:
Hondacrx
2025-05-25 20:13:24 -04:00
parent 84642c2ccf
commit 2043ac37f9
17 changed files with 953 additions and 44 deletions
+5
View File
@@ -2732,6 +2732,10 @@ namespace Game
stmt.AddValue(0, lowGuid);
SetQuery(PlayerLoginQueryLoad.QuestStatusObjectivesCriteriaProgress, stmt);
stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_CHARACTER_QUESTSTATUS_OBJECTIVES_SPAWN_TRACKING);
stmt.AddValue(0, lowGuid);
SetQuery(PlayerLoginQueryLoad.QuestStatusSpawnTracking, stmt);
stmt = CharacterDatabase.GetPreparedStatement(CharStatements.SEL_CHARACTER_QUESTSTATUS_DAILY);
stmt.AddValue(0, lowGuid);
SetQuery(PlayerLoginQueryLoad.DailyQuestStatus, stmt);
@@ -2992,6 +2996,7 @@ namespace Game
QuestStatusObjectives,
QuestStatusObjectivesCriteria,
QuestStatusObjectivesCriteriaProgress,
QuestStatusSpawnTracking,
DailyQuestStatus,
Reputation,
Inventory,
+66 -1
View File
@@ -9,6 +9,7 @@ using Game.Networking;
using Game.Networking.Packets;
using Game.DataStorage;
using System.Collections.Generic;
using System;
namespace Game
{
@@ -416,6 +417,7 @@ namespace Game
}
}
GetPlayer().SendForceSpawnTrackingUpdate(questId);
GetPlayer().SetQuestSlot(packet.Entry, 0);
GetPlayer().TakeQuestSourceItem(questId, true); // remove quest src item from player
GetPlayer().AbandonQuest(questId); // remove all quest items player received before abandoning quest. Note, this does not remove normal drop items that happen to be quest requirements.
@@ -839,5 +841,68 @@ namespace Game
SendPacket(response);
}
[WorldPacketHandler(ClientOpcodes.SpawnTrackingUpdate)]
void HandleSpawnTrackingUpdate(SpawnTrackingUpdate spawnTrackingUpdate)
{
QuestPOIUpdateResponse response = new();
bool hasObjectTypeRequested(TypeMask objectTypeMask, SpawnObjectType objectType)
{
if (objectTypeMask.HasAnyFlag(TypeMask.Unit))
return objectType == SpawnObjectType.Creature;
else if (objectTypeMask.HasAnyFlag(TypeMask.GameObject))
return objectType == SpawnObjectType.GameObject;
return false;
}
foreach (var requestInfo in spawnTrackingUpdate.SpawnTrackingRequests)
{
SpawnTrackingResponseInfo responseInfo = new();
responseInfo.SpawnTrackingID = requestInfo.SpawnTrackingID;
responseInfo.ObjectID = requestInfo.ObjectID;
var spawnTrackingTemplateData = Global.ObjectMgr.GetSpawnTrackingData(requestInfo.SpawnTrackingID);
QuestObjective activeQuestObjective = _player.GetActiveQuestObjectiveForForSpawnTracking(requestInfo.SpawnTrackingID);
// 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))
{
responseInfo.PhaseID = (int)spawnTrackingTemplateData.PhaseId;
responseInfo.PhaseGroupID = (int)spawnTrackingTemplateData.PhaseGroup;
responseInfo.PhaseUseFlags = spawnTrackingTemplateData.PhaseUseFlags;
// Send spawn visibility data if available
if (requestInfo.ObjectTypeMask != 0 && (requestInfo.ObjectTypeMask & (int)(TypeMask.Unit | TypeMask.GameObject)) != 0)
{
// There should only be one entity
foreach (var data in Global.ObjectMgr.GetSpawnMetadataForSpawnTracking(requestInfo.SpawnTrackingID))
{
var spawnData = data.ToSpawnData();
if (spawnData == null)
continue;
if (spawnData.Id != requestInfo.ObjectID)
continue;
if (!hasObjectTypeRequested((TypeMask)requestInfo.ObjectTypeMask, data.type))
continue;
if (activeQuestObjective != null)
{
SpawnTrackingState state = _player.GetSpawnTrackingStateByObjective(requestInfo.SpawnTrackingID, activeQuestObjective.Id);
responseInfo.Visible = data.spawnTrackingStates[(int)state].Visible;
break;
}
}
}
}
response.SpawnTrackingResponses.Add(responseInfo);
}
SendPacket(response);
}
}
}
}