diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-03-13 18:51:29 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-03-13 18:51:29 +0100 |
| commit | 4779fa5048642b57a0f69de7ab56b9d563c1cbc4 (patch) | |
| tree | 9bd8f8daccb5d3e7f8e98c3556db8f3c9b204460 /src/server/game/Entities/Object | |
| parent | 18200e1b88596dbead10d0b8ecbd10557db43323 (diff) | |
Core/Misc: Use our new unique_trackable_ptr for various classes exposed to scripts (not actually used anywhere currently)
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 | 6 |
2 files changed, 14 insertions, 1 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 51c85f241df..af8de31d58b 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -69,7 +69,7 @@ constexpr float VisibilityDistances[AsUnderlyingType(VisibilityDistanceType::Max MAX_VISIBILITY_DISTANCE }; -Object::Object() : m_values(this) +Object::Object() : m_values(this), m_scriptRef(this, NoopObjectDeleter()) { m_objectTypeId = TYPEID_OBJECT; m_objectType = TYPEMASK_OBJECT; @@ -114,6 +114,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() @@ -125,6 +130,8 @@ void Object::RemoveFromWorld() // if we remove from world then sending changes not required ClearUpdateMask(true); + + m_scriptRef = nullptr; } void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) const diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index 07cf03d3e28..2df91649ae5 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -32,6 +32,7 @@ #include "Position.h" #include "SharedDefines.h" #include "SpellDefines.h" +#include "UniqueTrackablePtr.h" #include "UpdateFields.h" #include <list> #include <unordered_map> @@ -260,6 +261,8 @@ class TC_GAME_API Object virtual std::string GetDebugInfo() const; + Trinity::unique_weak_ptr<Object> GetWeakPtr() const { return m_scriptRef; } + virtual Loot* GetLootForPlayer([[maybe_unused]] Player const* player) const { return nullptr; } protected: @@ -399,6 +402,9 @@ class TC_GAME_API Object bool m_isNewObject; bool m_isDestroyedObject; + struct NoopObjectDeleter { void operator()(Object*) const { /*noop - not managed*/ } }; + Trinity::unique_trackable_ptr<Object> m_scriptRef; + Object(Object const& right) = delete; Object(Object&& right) = delete; Object& operator=(Object const& right) = delete; |
