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-13 18:51:29 +0100
commit4779fa5048642b57a0f69de7ab56b9d563c1cbc4 (patch)
tree9bd8f8daccb5d3e7f8e98c3556db8f3c9b204460 /src/server/game/Entities/Object
parent18200e1b88596dbead10d0b8ecbd10557db43323 (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.cpp9
-rw-r--r--src/server/game/Entities/Object/Object.h6
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;