Fixed crashes in world's clientlist manipulators
This commit is contained in:
parent
8c3837987b
commit
f8757d3606
@ -817,6 +817,26 @@ void cWorld::TickClients(float a_Dt)
|
|||||||
cClientHandleList RemoveClients;
|
cClientHandleList RemoveClients;
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CSClients);
|
cCSLock Lock(m_CSClients);
|
||||||
|
|
||||||
|
// Remove clients scheduled for removal:
|
||||||
|
for (cClientHandleList::iterator itr = m_ClientsToRemove.begin(), end = m_ClientsToRemove.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
m_Clients.remove(*itr);
|
||||||
|
} // for itr - m_ClientsToRemove[]
|
||||||
|
m_ClientsToRemove.clear();
|
||||||
|
|
||||||
|
// Add clients scheduled for adding:
|
||||||
|
for (cClientHandleList::iterator itr = m_ClientsToAdd.begin(), end = m_ClientsToAdd.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
if (std::find(m_Clients.begin(), m_Clients.end(), *itr) != m_Clients.end())
|
||||||
|
{
|
||||||
|
ASSERT(!"Adding a client that is already in the clientlist");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
m_Clients.push_back(*itr);
|
||||||
|
} // for itr - m_ClientsToRemove[]
|
||||||
|
m_ClientsToAdd.clear();
|
||||||
|
|
||||||
// Tick the clients, take out those that have been destroyed into RemoveClients
|
// Tick the clients, take out those that have been destroyed into RemoveClients
|
||||||
for (cClientHandleList::iterator itr = m_Clients.begin(); itr != m_Clients.end();)
|
for (cClientHandleList::iterator itr = m_Clients.begin(); itr != m_Clients.end();)
|
||||||
{
|
{
|
||||||
@ -2018,7 +2038,7 @@ void cWorld::AddPlayer(cPlayer * a_Player)
|
|||||||
if (a_Player->GetClientHandle() != NULL)
|
if (a_Player->GetClientHandle() != NULL)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CSClients);
|
cCSLock Lock(m_CSClients);
|
||||||
m_Clients.push_back(a_Player->GetClientHandle());
|
m_ClientsToAdd.push_back(a_Player->GetClientHandle());
|
||||||
}
|
}
|
||||||
|
|
||||||
// The player has already been added to the chunkmap as the entity, do NOT add again!
|
// The player has already been added to the chunkmap as the entity, do NOT add again!
|
||||||
@ -2040,7 +2060,7 @@ void cWorld::RemovePlayer(cPlayer * a_Player)
|
|||||||
if (a_Player->GetClientHandle() != NULL)
|
if (a_Player->GetClientHandle() != NULL)
|
||||||
{
|
{
|
||||||
cCSLock Lock(m_CSClients);
|
cCSLock Lock(m_CSClients);
|
||||||
m_Clients.remove(a_Player->GetClientHandle());
|
m_ClientsToRemove.push_back(a_Player->GetClientHandle());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -667,6 +667,12 @@ private:
|
|||||||
/// List of clients in this world, these will be ticked by this world
|
/// List of clients in this world, these will be ticked by this world
|
||||||
cClientHandleList m_Clients;
|
cClientHandleList m_Clients;
|
||||||
|
|
||||||
|
/// Clients that are scheduled for removal (ticked in another world), waiting for TickClients() to remove them
|
||||||
|
cClientHandleList m_ClientsToRemove;
|
||||||
|
|
||||||
|
/// Clients that are scheduled for adding, waiting for TickClients to add them
|
||||||
|
cClientHandleList m_ClientsToAdd;
|
||||||
|
|
||||||
|
|
||||||
cWorld(const AString & a_WorldName);
|
cWorld(const AString & a_WorldName);
|
||||||
~cWorld();
|
~cWorld();
|
||||||
|
Loading…
Reference in New Issue
Block a user