Added queue for adding entities to cWorld.
This alone doesn't work properly yet, further changes to cPlayer are needed.
This commit is contained in:
parent
c5d1ca7dac
commit
b904223b9d
@ -250,7 +250,8 @@ public:
|
|||||||
|
|
||||||
void SendData(const char * a_Data, size_t a_Size);
|
void SendData(const char * a_Data, size_t a_Size);
|
||||||
|
|
||||||
/** Called when the player moves into a different world; queues sreaming the new chunks */
|
/** Called when the player moves into a different world.
|
||||||
|
Locks the current world, doesn't lock the new world. */
|
||||||
void MoveToWorld(cWorld & a_World, bool a_SendRespawnPacket);
|
void MoveToWorld(cWorld & a_World, bool a_SendRespawnPacket);
|
||||||
|
|
||||||
/** Called when the player will enchant a Item */
|
/** Called when the player will enchant a Item */
|
||||||
|
@ -421,6 +421,9 @@ public:
|
|||||||
UNUSED(a_Killer);
|
UNUSED(a_Killer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Sets the internal world pointer to a new cWorld, doesn't update anything else. */
|
||||||
|
void SetWorld(cWorld * a_World) { m_World = a_World; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
static cCriticalSection m_CSCount;
|
static cCriticalSection m_CSCount;
|
||||||
static int m_EntityCount;
|
static int m_EntityCount;
|
||||||
@ -485,8 +488,6 @@ protected:
|
|||||||
|
|
||||||
virtual void Destroyed(void) {} // Called after the entity has been destroyed
|
virtual void Destroyed(void) {} // Called after the entity has been destroyed
|
||||||
|
|
||||||
void SetWorld(cWorld * a_World) { m_World = a_World; }
|
|
||||||
|
|
||||||
/** Called in each tick to handle air-related processing i.e. drowning */
|
/** Called in each tick to handle air-related processing i.e. drowning */
|
||||||
virtual void HandleAir();
|
virtual void HandleAir();
|
||||||
|
|
||||||
|
@ -1595,8 +1595,6 @@ bool cPlayer::MoveToWorld(const char * a_WorldName)
|
|||||||
m_ClientHandle->MoveToWorld(*World, (OldDimension != World->GetDimension()));
|
m_ClientHandle->MoveToWorld(*World, (OldDimension != World->GetDimension()));
|
||||||
|
|
||||||
// Add player to all the necessary parts of the new world
|
// Add player to all the necessary parts of the new world
|
||||||
SetWorld(World);
|
|
||||||
m_ClientHandle->StreamChunks();
|
|
||||||
World->AddEntity(this);
|
World->AddEntity(this);
|
||||||
World->AddPlayer(this);
|
World->AddPlayer(this);
|
||||||
|
|
||||||
|
@ -328,6 +328,8 @@ public:
|
|||||||
void SetVisible( bool a_bVisible ); // tolua_export
|
void SetVisible( bool a_bVisible ); // tolua_export
|
||||||
bool IsVisible(void) const { return m_bVisible; } // tolua_export
|
bool IsVisible(void) const { return m_bVisible; } // tolua_export
|
||||||
|
|
||||||
|
/** Moves the player to the specified world.
|
||||||
|
Returns true if successful, false on failure (world not found). */
|
||||||
bool MoveToWorld(const char * a_WorldName); // tolua_export
|
bool MoveToWorld(const char * a_WorldName); // tolua_export
|
||||||
|
|
||||||
bool SaveToDisk(void);
|
bool SaveToDisk(void);
|
||||||
|
@ -743,6 +743,17 @@ void cWorld::Tick(float a_Dt, int a_LastTickDurationMSec)
|
|||||||
m_LastTimeUpdate = m_WorldAge;
|
m_LastTimeUpdate = m_WorldAge;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add entities waiting in the queue to be added:
|
||||||
|
{
|
||||||
|
cCSLock Lock(m_CSEntitiesToAdd);
|
||||||
|
for (cEntityList::iterator itr = m_EntitiesToAdd.begin(), end = m_EntitiesToAdd.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
(*itr)->SetWorld(this);
|
||||||
|
m_ChunkMap->AddEntity(*itr);
|
||||||
|
}
|
||||||
|
m_EntitiesToAdd.clear();
|
||||||
|
}
|
||||||
|
|
||||||
m_ChunkMap->Tick(a_Dt);
|
m_ChunkMap->Tick(a_Dt);
|
||||||
|
|
||||||
TickClients(a_Dt);
|
TickClients(a_Dt);
|
||||||
@ -2808,9 +2819,11 @@ void cWorld::ScheduleTask(int a_DelayTicks, cTask * a_Task)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void cWorld::AddEntity(cEntity * a_Entity)
|
void cWorld::AddEntity(cEntity * a_Entity)
|
||||||
{
|
{
|
||||||
m_ChunkMap->AddEntity(a_Entity);
|
cCSLock Lock(m_CSEntitiesToAdd);
|
||||||
|
m_EntitiesToAdd.push_back(a_Entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2819,6 +2832,19 @@ void cWorld::AddEntity(cEntity * a_Entity)
|
|||||||
|
|
||||||
bool cWorld::HasEntity(int a_UniqueID)
|
bool cWorld::HasEntity(int a_UniqueID)
|
||||||
{
|
{
|
||||||
|
// Check if the entity is in the queue to be added to the world:
|
||||||
|
{
|
||||||
|
cCSLock Lock(m_CSEntitiesToAdd);
|
||||||
|
for (cEntityList::const_iterator itr = m_EntitiesToAdd.begin(), end = m_EntitiesToAdd.end(); itr != end; ++itr)
|
||||||
|
{
|
||||||
|
if ((*itr)->GetUniqueID() == a_UniqueID)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} // for itr - m_EntitiesToAdd[]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check if the entity is in the chunkmap:
|
||||||
return m_ChunkMap->HasEntity(a_UniqueID);
|
return m_ChunkMap->HasEntity(a_UniqueID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -301,7 +301,8 @@ public:
|
|||||||
|
|
||||||
void SendPlayerList(cPlayer * a_DestPlayer); // Sends playerlist to the player
|
void SendPlayerList(cPlayer * a_DestPlayer); // Sends playerlist to the player
|
||||||
|
|
||||||
/** Adds the entity into its appropriate chunk; takes ownership of the entity ptr */
|
/** Adds the entity into its appropriate chunk; takes ownership of the entity ptr.
|
||||||
|
The entity is added lazily - this function only puts it in a queue that is then processed by the Tick thread. */
|
||||||
void AddEntity(cEntity * a_Entity);
|
void AddEntity(cEntity * a_Entity);
|
||||||
|
|
||||||
bool HasEntity(int a_UniqueID);
|
bool HasEntity(int a_UniqueID);
|
||||||
@ -926,6 +927,12 @@ private:
|
|||||||
/** Clients that are scheduled for adding, waiting for TickClients to add them */
|
/** Clients that are scheduled for adding, waiting for TickClients to add them */
|
||||||
cClientHandleList m_ClientsToAdd;
|
cClientHandleList m_ClientsToAdd;
|
||||||
|
|
||||||
|
/** Guards m_EntitiesToAdd */
|
||||||
|
cCriticalSection m_CSEntitiesToAdd;
|
||||||
|
|
||||||
|
/** List of entities that are scheduled for adding, waiting for the Tick thread to add them. */
|
||||||
|
cEntityList m_EntitiesToAdd;
|
||||||
|
|
||||||
|
|
||||||
cWorld(const AString & a_WorldName);
|
cWorld(const AString & a_WorldName);
|
||||||
virtual ~cWorld();
|
virtual ~cWorld();
|
||||||
|
Loading…
Reference in New Issue
Block a user