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 | |
| 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')
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 9 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.h | 6 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 6 | ||||
| -rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 3 | ||||
| -rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.cpp | 5 | ||||
| -rw-r--r-- | src/server/game/Entities/Vehicle/Vehicle.h | 5 |
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 |
