Implemented end and nether portals
This commit is contained in:
@@ -638,30 +638,22 @@ void cChunk::Tick(float a_Dt)
|
||||
for (cEntityList::iterator itr = m_Entities.begin(); itr != m_Entities.end(); ++itr)
|
||||
{
|
||||
// Mobs are tickes inside MobTick (as we don't have to tick them if they are far away from players)
|
||||
if (!((*itr)->IsMob()))
|
||||
// Don't tick things queued to be removed
|
||||
if (!((*itr)->IsMob()) && (std::find(m_EntitiesToRemove.begin(), m_EntitiesToRemove.end(), (*itr)->GetUniqueID()) == m_EntitiesToRemove.end()))
|
||||
{
|
||||
(*itr)->Tick(a_Dt, *this);
|
||||
}
|
||||
} // for itr - m_Entitites[]
|
||||
|
||||
// Remove all entities that were scheduled for removal:
|
||||
for (cEntityList::iterator itr = m_Entities.begin(); itr != m_Entities.end();)
|
||||
{
|
||||
if ((*itr)->IsDestroyed())
|
||||
{
|
||||
LOGD("Destroying entity #%i (%s)", (*itr)->GetUniqueID(), (*itr)->GetClass());
|
||||
cEntity * ToDelete = *itr;
|
||||
itr = m_Entities.erase(itr);
|
||||
delete ToDelete;
|
||||
continue;
|
||||
}
|
||||
++itr;
|
||||
} // for itr - m_Entitites[]
|
||||
|
||||
// If any entity moved out of the chunk, move it to the neighbor:
|
||||
for (cEntityList::iterator itr = m_Entities.begin(); itr != m_Entities.end();)
|
||||
{
|
||||
if (
|
||||
auto itr2 = std::find(m_EntitiesToRemove.begin(), m_EntitiesToRemove.end(), (*itr)->GetUniqueID());
|
||||
if (itr2 != m_EntitiesToRemove.end())
|
||||
{
|
||||
itr = m_Entities.erase(itr);
|
||||
m_EntitiesToRemove.erase(itr2);
|
||||
}
|
||||
else if ( // If any entity moved out of the chunk, move it to the neighbor:
|
||||
((*itr)->GetChunkX() != m_PosX) ||
|
||||
((*itr)->GetChunkZ() != m_PosZ)
|
||||
)
|
||||
@@ -671,9 +663,19 @@ void cChunk::Tick(float a_Dt)
|
||||
}
|
||||
else
|
||||
{
|
||||
++itr;
|
||||
if ((*itr)->IsDestroyed()) // Remove all entities that were scheduled for removal:
|
||||
{
|
||||
LOGD("Destroying entity #%i (%s)", (*itr)->GetUniqueID(), (*itr)->GetClass());
|
||||
cEntity * ToDelete = *itr;
|
||||
itr = m_Entities.erase(itr);
|
||||
delete ToDelete;
|
||||
}
|
||||
else
|
||||
{
|
||||
++itr;
|
||||
}
|
||||
}
|
||||
}
|
||||
} // for itr - m_Entitites[]
|
||||
|
||||
ApplyWeatherToTop();
|
||||
}
|
||||
@@ -1847,7 +1849,7 @@ void cChunk::RemoveBlockEntity( cBlockEntity* a_BlockEntity )
|
||||
|
||||
|
||||
|
||||
bool cChunk::AddClient(cClientHandle* a_Client)
|
||||
bool cChunk::AddClient(cClientHandle * a_Client)
|
||||
{
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
@@ -1878,7 +1880,7 @@ bool cChunk::AddClient(cClientHandle* a_Client)
|
||||
|
||||
|
||||
|
||||
void cChunk::RemoveClient( cClientHandle* a_Client )
|
||||
void cChunk::RemoveClient(cClientHandle * a_Client)
|
||||
{
|
||||
for (cClientHandleList::iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
@@ -1886,12 +1888,12 @@ void cChunk::RemoveClient( cClientHandle* a_Client )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
m_LoadedByClient.erase(itr);
|
||||
|
||||
if (!a_Client->IsDestroyed())
|
||||
{
|
||||
for (cEntityList::iterator itr = m_Entities.begin(); itr != m_Entities.end(); ++itr )
|
||||
for (cEntityList::iterator itr = m_Entities.begin(); itr != m_Entities.end(); ++itr)
|
||||
{
|
||||
/*
|
||||
// DEBUG:
|
||||
@@ -1911,7 +1913,7 @@ void cChunk::RemoveClient( cClientHandle* a_Client )
|
||||
|
||||
|
||||
|
||||
bool cChunk::HasClient( cClientHandle* a_Client )
|
||||
bool cChunk::HasClient(cClientHandle* a_Client)
|
||||
{
|
||||
for (cClientHandleList::const_iterator itr = m_LoadedByClient.begin(); itr != m_LoadedByClient.end(); ++itr)
|
||||
{
|
||||
@@ -1942,9 +1944,9 @@ void cChunk::AddEntity(cEntity * a_Entity)
|
||||
{
|
||||
MarkDirty();
|
||||
}
|
||||
|
||||
|
||||
ASSERT(std::find(m_Entities.begin(), m_Entities.end(), a_Entity) == m_Entities.end()); // Not there already
|
||||
|
||||
|
||||
m_Entities.push_back(a_Entity);
|
||||
}
|
||||
|
||||
@@ -1954,17 +1956,12 @@ void cChunk::AddEntity(cEntity * a_Entity)
|
||||
|
||||
void cChunk::RemoveEntity(cEntity * a_Entity)
|
||||
{
|
||||
size_t SizeBefore = m_Entities.size();
|
||||
m_Entities.remove(a_Entity);
|
||||
size_t SizeAfter = m_Entities.size();
|
||||
|
||||
if (SizeBefore != SizeAfter)
|
||||
m_EntitiesToRemove.push_back(a_Entity->GetUniqueID());
|
||||
|
||||
// Mark as dirty if it was a server-generated entity:
|
||||
if (!a_Entity->IsPlayer())
|
||||
{
|
||||
// Mark as dirty if it was a server-generated entity:
|
||||
if (!a_Entity->IsPlayer())
|
||||
{
|
||||
MarkDirty();
|
||||
}
|
||||
MarkDirty();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1974,6 +1971,11 @@ void cChunk::RemoveEntity(cEntity * a_Entity)
|
||||
|
||||
bool cChunk::HasEntity(int a_EntityID)
|
||||
{
|
||||
if (std::find(m_EntitiesToRemove.begin(), m_EntitiesToRemove.end(), a_EntityID) != m_EntitiesToRemove.end())
|
||||
{
|
||||
return false; // If EntitiesToRemove contains our ID, this chunk doesn't have it, as it should be removed soon
|
||||
}
|
||||
|
||||
for (cEntityList::const_iterator itr = m_Entities.begin(), end = m_Entities.end(); itr != end; ++itr)
|
||||
{
|
||||
if ((*itr)->GetUniqueID() == a_EntityID)
|
||||
|
||||
Reference in New Issue
Block a user