aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Phasing/PersonalPhaseTracker.h
diff options
context:
space:
mode:
authorMatan Shukry <matanshukry@gmail.com>2021-12-28 14:24:10 +0200
committerGitHub <noreply@github.com>2021-12-28 13:24:10 +0100
commit8fabe5a3aacf7797f03d074ab8434f445be64955 (patch)
treedd3c977290be47d5a708947893c3544678045194 /src/server/game/Phasing/PersonalPhaseTracker.h
parent1aad7f8ddd486e60f76730d3baa36ec63711c7e8 (diff)
Core/Phasing: Implemented db spawns in personal phases (#26345)
Co-authored-by: Shauren <shauren.trinity@gmail.com>
Diffstat (limited to 'src/server/game/Phasing/PersonalPhaseTracker.h')
-rw-r--r--src/server/game/Phasing/PersonalPhaseTracker.h85
1 files changed, 85 insertions, 0 deletions
diff --git a/src/server/game/Phasing/PersonalPhaseTracker.h b/src/server/game/Phasing/PersonalPhaseTracker.h
new file mode 100644
index 00000000000..641cbece9fa
--- /dev/null
+++ b/src/server/game/Phasing/PersonalPhaseTracker.h
@@ -0,0 +1,85 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef PersonalPhaseTracker_h__
+#define PersonalPhaseTracker_h__
+
+#include "Common.h"
+#include "Duration.h"
+#include "GridDefines.h"
+#include "ObjectGuid.h"
+#include "Optional.h"
+
+class Map;
+class PhaseShift;
+class WorldObject;
+struct Cell;
+
+struct PersonalPhaseSpawns
+{
+ static constexpr Milliseconds DELETE_TIME_DEFAULT = 1min;
+
+ std::unordered_set<WorldObject*> Objects;
+ std::unordered_set<uint16> Grids;
+ Optional<Milliseconds> DurationRemaining;
+
+ bool IsEmpty() const { return Objects.empty() && Grids.empty(); }
+};
+
+/* Tracks personal phases for a single owner */
+struct PlayerPersonalPhasesTracker
+{
+public:
+ void RegisterTrackedObject(uint32 phaseId, WorldObject* object);
+ void UnregisterTrackedObject(WorldObject* object);
+
+ void OnOwnerPhasesChanged(WorldObject const* owner);
+ void MarkAllPhasesForDeletion();
+
+ void Update(Map* map, uint32 diff);
+
+ bool IsGridLoadedForPhase(uint32 gridId, uint32 phaseId) const;
+ void SetGridLoadedForPhase(uint32 gridId, uint32 phaseId);
+ void SetGridUnloaded(uint32 gridId);
+
+ bool IsEmpty() const { return _spawns.empty(); }
+
+private:
+ void DespawnPhase(Map* map, PersonalPhaseSpawns& spawns);
+
+ std::unordered_map<uint32 /*phaseId*/, PersonalPhaseSpawns> _spawns;
+};
+
+/* Handles personal phase trackers for all owners */
+struct MultiPersonalPhaseTracker
+{
+ void LoadGrid(PhaseShift const& phaseShift, NGridType& grid, Map* map, Cell const& cell);
+ void UnloadGrid(NGridType& grid);
+
+ void RegisterTrackedObject(uint32 phaseId, ObjectGuid const& phaseOwner, WorldObject* object);
+ void UnregisterTrackedObject(WorldObject* object);
+
+ void OnOwnerPhaseChanged(WorldObject const* phaseOwner, NGridType* grid, Map* map, Cell const& cell);
+ void MarkAllPhasesForDeletion(ObjectGuid const& phaseOwner);
+
+ void Update(Map* map, uint32 diff);
+
+private:
+ std::unordered_map<ObjectGuid /*owner*/, PlayerPersonalPhasesTracker> _playerData;
+};
+
+#endif // PersonalPhaseTracker_h__