aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
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
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')
-rw-r--r--src/server/game/Entities/Object/Object.cpp9
-rw-r--r--src/server/game/Entities/Object/Object.h6
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp6
-rw-r--r--src/server/game/Entities/Unit/Unit.h3
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.cpp5
-rw-r--r--src/server/game/Entities/Vehicle/Vehicle.h5
7 files changed, 29 insertions, 7 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;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 469bbee9e74..271c2196ceb 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -3861,7 +3861,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
if (ObjectGuid::LowType guildId = sCharacterCache->GetCharacterGuildIdByGuid(playerguid))
if (Guild* guild = sGuildMgr->GetGuildById(guildId))
- guild->DeleteMember(trans, playerguid, false, false, true);
+ guild->DeleteMember(trans, playerguid, false, false);
// remove from arena teams
LeaveAllArenaTeams(playerguid);
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index bfdb97d3afb..9e56adcebb1 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -4274,8 +4274,8 @@ void Unit::RemoveAllAuras()
{
sstr << "m_ownedAuras:" << "\n";
- for (std::pair<uint32 const, Aura*>& auraPair : m_ownedAuras)
- sstr << auraPair.second->GetDebugInfo() << "\n";
+ for (auto const& [spellId, aura] : m_ownedAuras)
+ sstr << aura->GetDebugInfo() << "\n";
}
TC_LOG_ERROR("entities.unit", "{}", sstr.str());
@@ -11446,7 +11446,7 @@ bool Unit::CreateVehicleKit(uint32 id, uint32 creatureEntry, bool loading /*= fa
if (!vehInfo)
return false;
- m_vehicleKit = std::make_unique<Vehicle>(this, vehInfo, creatureEntry);
+ m_vehicleKit = Trinity::make_unique_trackable<Vehicle>(this, vehInfo, creatureEntry);
m_updateFlag.Vehicle = true;
m_unitTypeMask |= UNIT_MASK_VEHICLE;
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index f5a0c91f780..abcf9c295b5 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -1709,6 +1709,7 @@ class TC_GAME_API Unit : public WorldObject
bool CreateVehicleKit(uint32 id, uint32 creatureEntry, bool loading = false);
void RemoveVehicleKit(bool onRemoveFromWorld = false);
Vehicle* GetVehicleKit() const { return m_vehicleKit.get(); }
+ Trinity::unique_weak_ptr<Vehicle> GetVehicleKitWeakPtr() const { return m_vehicleKit; }
Vehicle* GetVehicle() const { return m_vehicle; }
void SetVehicle(Vehicle* vehicle) { m_vehicle = vehicle; }
bool IsOnVehicle(Unit const* vehicle) const;
@@ -1907,7 +1908,7 @@ class TC_GAME_API Unit : public WorldObject
uint32 m_regenTimer;
Vehicle* m_vehicle;
- std::unique_ptr<Vehicle> m_vehicleKit;
+ Trinity::unique_trackable_ptr<Vehicle> m_vehicleKit;
uint32 m_unitTypeMask;
LiquidTypeEntry const* _lastLiquid;
diff --git a/src/server/game/Entities/Vehicle/Vehicle.cpp b/src/server/game/Entities/Vehicle/Vehicle.cpp
index d00f313e56d..1d5a4abede9 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.cpp
+++ b/src/server/game/Entities/Vehicle/Vehicle.cpp
@@ -993,3 +993,8 @@ std::string Vehicle::GetDebugInfo() const
return sstr.str();
}
+
+Trinity::unique_weak_ptr<Vehicle> Vehicle::GetWeakPtr() const
+{
+ return _me->GetVehicleKitWeakPtr();
+}
diff --git a/src/server/game/Entities/Vehicle/Vehicle.h b/src/server/game/Entities/Vehicle/Vehicle.h
index a888a8a9007..e0ca5e9d632 100644
--- a/src/server/game/Entities/Vehicle/Vehicle.h
+++ b/src/server/game/Entities/Vehicle/Vehicle.h
@@ -19,8 +19,9 @@
#define __TRINITY_VEHICLE_H
#include "Object.h"
-#include "VehicleDefines.h"
+#include "UniqueTrackablePtr.h"
#include "Unit.h"
+#include "VehicleDefines.h"
#include <list>
struct VehicleEntry;
@@ -73,6 +74,8 @@ class TC_GAME_API Vehicle final : public TransportBase
std::string GetDebugInfo() const;
+ Trinity::unique_weak_ptr<Vehicle> GetWeakPtr() const;
+
protected:
friend class VehicleJoinEvent;
uint32 UsableSeatNum; ///< Number of seats that match VehicleSeatEntry::UsableByPlayer, used for proper display flags