summaryrefslogtreecommitdiffstats
path: root/src/Chunk.cpp
diff options
context:
space:
mode:
authorLogicParrot <LogicParrot@users.noreply.github.com>2016-02-03 19:19:11 +0100
committerLogicParrot <LogicParrot@users.noreply.github.com>2016-02-03 19:19:11 +0100
commita5403c897658c0cb837c9167d74e7302a09659c2 (patch)
tree85013e81fad7154733fa52e58138b4c854a597ed /src/Chunk.cpp
parentMerge pull request #2903 from marvinkopf/FixTabAutoComplete (diff)
parentFixed cChunk::m_Entities corruption upon world travel (diff)
downloadcuberite-a5403c897658c0cb837c9167d74e7302a09659c2.tar
cuberite-a5403c897658c0cb837c9167d74e7302a09659c2.tar.gz
cuberite-a5403c897658c0cb837c9167d74e7302a09659c2.tar.bz2
cuberite-a5403c897658c0cb837c9167d74e7302a09659c2.tar.lz
cuberite-a5403c897658c0cb837c9167d74e7302a09659c2.tar.xz
cuberite-a5403c897658c0cb837c9167d74e7302a09659c2.tar.zst
cuberite-a5403c897658c0cb837c9167d74e7302a09659c2.zip
Diffstat (limited to 'src/Chunk.cpp')
-rw-r--r--src/Chunk.cpp29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/Chunk.cpp b/src/Chunk.cpp
index da13e3b10..1e3e749fd 100644
--- a/src/Chunk.cpp
+++ b/src/Chunk.cpp
@@ -603,6 +603,7 @@ void cChunk::SpawnMobs(cMobSpawner & a_MobSpawner)
void cChunk::Tick(std::chrono::milliseconds a_Dt)
{
+ m_IsInTick = true;
BroadcastPendingBlockChanges();
CheckBlocks();
@@ -637,7 +638,7 @@ void cChunk::Tick(std::chrono::milliseconds a_Dt)
else if ((*itr)->IsWorldTravellingFrom(m_World))
{
// Remove all entities that are travelling to another world
- LOGD("Removing entity from [%d, %d] that's travelling between worlds.", m_PosX, m_PosZ);
+ LOGD("Removing entity from [%d, %d] that's travelling between worlds. (Scheduled)", m_PosX, m_PosZ);
MarkDirty();
(*itr)->SetWorldTravellingFrom(nullptr);
itr = m_Entities.erase(itr);
@@ -659,6 +660,7 @@ void cChunk::Tick(std::chrono::milliseconds a_Dt)
} // for itr - m_Entitites[]
ApplyWeatherToTop();
+ m_IsInTick = false;
}
@@ -1910,6 +1912,31 @@ void cChunk::RemoveEntity(cEntity * a_Entity)
+void cChunk::SafeRemoveEntity(cEntity * a_Entity)
+{
+ if (!m_IsInTick)
+ {
+ LOGD("Removing entity from [%d, %d] that's travelling between worlds. (immediate)", m_PosX, m_PosZ);
+ // If we're not in a tick, just remove it.
+ m_Entities.remove(a_Entity);
+ }
+ else
+ {
+ // If we are in a tick, we don't want to invalidate the iterator, so we schedule the removal. Removal will be done in cChunk::tick()
+ a_Entity->SetWorldTravellingFrom(GetWorld());
+ }
+
+ // Mark as dirty if it was a server-generated entity:
+ if (!a_Entity->IsPlayer())
+ {
+ MarkDirty();
+ }
+}
+
+
+
+
+
bool cChunk::HasEntity(UInt32 a_EntityID)
{
for (cEntityList::const_iterator itr = m_Entities.begin(), end = m_Entities.end(); itr != end; ++itr)