diff options
author | Matan Shukry <matanshukry@gmail.com> | 2021-12-28 14:24:10 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-28 13:24:10 +0100 |
commit | 8fabe5a3aacf7797f03d074ab8434f445be64955 (patch) | |
tree | dd3c977290be47d5a708947893c3544678045194 /src/server/game/Phasing/PersonalPhaseTracker.h | |
parent | 1aad7f8ddd486e60f76730d3baa36ec63711c7e8 (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.h | 85 |
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__ |