diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-03-13 18:51:29 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-03-14 00:14:16 +0100 |
| commit | a79b42bf681e211997923dbc6c191aae187aded6 (patch) | |
| tree | dc52e4651fe17d4e6ce3437490d07313113432aa /src/server/game/Entities/Object | |
| parent | 7850107a42e7709f6e92f542860160b8c1432c94 (diff) | |
Core/Misc: Use our new unique_trackable_ptr for various classes exposed to scripts (not actually used anywhere currently)
(cherry picked from commit 4779fa5048642b57a0f69de7ab56b9d563c1cbc4)
Diffstat (limited to 'src/server/game/Entities/Object')
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 9 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.h | 7 |
2 files changed, 15 insertions, 1 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 416df2cce7b..9765ef91434 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -61,7 +61,7 @@ constexpr float VisibilityDistances[AsUnderlyingType(VisibilityDistanceType::Max MAX_VISIBILITY_DISTANCE }; -Object::Object() +Object::Object() : m_scriptRef(this, NoopObjectDeleter()) { m_objectTypeId = TYPEID_OBJECT; m_objectType = TYPEMASK_OBJECT; @@ -151,6 +151,11 @@ void Object::AddToWorld() // synchronize values mirror with values array (changes will send in updatecreate opcode any way ASSERT(!m_objectUpdated); ClearUpdateMask(false); + + // Set new ref when adding to world (except if we already have one - also set in constructor to allow scripts to work in initialization phase) + // Changing the ref when adding/removing from world prevents accessing players on different maps (possibly from another thread) + if (!m_scriptRef) + m_scriptRef.reset(this, NoopObjectDeleter()); } void Object::RemoveFromWorld() @@ -162,6 +167,8 @@ void Object::RemoveFromWorld() // if we remove from world then sending changes not required ClearUpdateMask(true); + + m_scriptRef = nullptr; } void Object::BuildMovementUpdateBlock(UpdateData* data, uint32 flags) const diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 3a72759bb74..abf3bd3bf98 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -29,6 +29,7 @@ #include "Position.h" #include "SharedDefines.h" #include "SpellDefines.h" +#include "UniqueTrackablePtr.h" #include "UpdateFields.h" #include "UpdateMask.h" #include <list> @@ -200,6 +201,8 @@ class TC_GAME_API Object virtual std::string GetDebugInfo() const; + Trinity::unique_weak_ptr<Object> GetWeakPtr() const { return m_scriptRef; } + protected: Object(); @@ -243,8 +246,12 @@ class TC_GAME_API Object PackedGuid m_PackGUID; + struct NoopObjectDeleter { void operator()(Object*) const { /*noop - not managed*/ } }; + Trinity::unique_trackable_ptr<Object> m_scriptRef; + // for output helpfull error messages from asserts bool PrintIndexError(uint32 index, bool set) const; + Object(Object const& right) = delete; Object(Object&& right) = delete; Object& operator=(Object const& right) = delete; |
