Changed entity ownership model to use smart pointers
This commit is contained in:
@@ -149,12 +149,12 @@ cPlayer::cPlayer(cClientHandlePtr a_Client, const AString & a_PlayerName) :
|
||||
|
||||
|
||||
|
||||
bool cPlayer::Initialize(cWorld & a_World)
|
||||
bool cPlayer::Initialize(OwnedEntity a_Self, cWorld & a_World)
|
||||
{
|
||||
UNUSED(a_World);
|
||||
ASSERT(GetWorld() != nullptr);
|
||||
ASSERT(GetParentChunk() == nullptr);
|
||||
GetWorld()->AddPlayer(this);
|
||||
GetWorld()->AddPlayer(std::unique_ptr<cPlayer>(static_cast<cPlayer *>(a_Self.release())));
|
||||
|
||||
cPluginManager::Get()->CallHookSpawnedEntity(*GetWorld(), *this);
|
||||
|
||||
@@ -2003,7 +2003,9 @@ bool cPlayer::DoMoveToWorld(cWorld * a_World, bool a_ShouldSendRespawn, Vector3d
|
||||
GetWorld()->BroadcastDestroyEntity(*this);
|
||||
|
||||
// Remove player from world
|
||||
GetWorld()->RemovePlayer(this, false);
|
||||
// Make sure that RemovePlayer didn't return a valid smart pointer, due to the second parameter being false
|
||||
// We remain valid and not destructed after this call
|
||||
VERIFY(!GetWorld()->RemovePlayer(*this, false));
|
||||
|
||||
// Set position to the new position
|
||||
SetPosition(a_NewPosition);
|
||||
@@ -2045,8 +2047,10 @@ bool cPlayer::DoMoveToWorld(cWorld * a_World, bool a_ShouldSendRespawn, Vector3d
|
||||
a_OldWorld.GetName().c_str(), a_World->GetName().c_str(),
|
||||
ParentChunk->GetPosX(), ParentChunk->GetPosZ()
|
||||
);
|
||||
ParentChunk->RemoveEntity(this);
|
||||
a_World->AddPlayer(this, &a_OldWorld); // New world will take over and announce client at its next tick
|
||||
|
||||
// New world will take over and announce client at its next tick
|
||||
auto PlayerPtr = static_cast<cPlayer *>(ParentChunk->RemoveEntity(*this).release());
|
||||
a_World->AddPlayer(std::unique_ptr<cPlayer>(PlayerPtr), &a_OldWorld);
|
||||
});
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user