aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-03-13 18:51:29 +0100
committerShauren <shauren.trinity@gmail.com>2024-03-14 00:14:16 +0100
commita79b42bf681e211997923dbc6c191aae187aded6 (patch)
treedc52e4651fe17d4e6ce3437490d07313113432aa /src/server/game/Entities/Object
parent7850107a42e7709f6e92f542860160b8c1432c94 (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.cpp9
-rw-r--r--src/server/game/Entities/Object/Object.h7
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;