From 92a2be024a0dd4bddf6d05f4dba579259bb38545 Mon Sep 17 00:00:00 2001 From: Shoghi Cervantes Date: Tue, 19 May 2015 20:49:03 +0200 Subject: [PATCH] Improved saving of modified properties --- src/pocketmine/level/Level.php | 2 - .../level/format/generic/BaseFullChunk.php | 81 ++++++++++--------- 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index b39392e6b..60c6cb091 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -2299,8 +2299,6 @@ class Level implements ChunkManager, Metadatable{ return false; } - $chunk->setChanged(false); - if($this->isChunkInUse($x, $z)){ foreach($this->getChunkLoaders($x, $z) as $loader){ $loader->onChunkLoaded($chunk); diff --git a/src/pocketmine/level/format/generic/BaseFullChunk.php b/src/pocketmine/level/format/generic/BaseFullChunk.php index ab9287078..79c7af11d 100644 --- a/src/pocketmine/level/format/generic/BaseFullChunk.php +++ b/src/pocketmine/level/format/generic/BaseFullChunk.php @@ -108,55 +108,60 @@ abstract class BaseFullChunk implements FullChunk{ } public function initChunk(){ - if($this->getProvider() instanceof LevelProvider and !$this->isInit and $this->NBTentities !== null){ - $this->getProvider()->getLevel()->timings->syncChunkLoadEntitiesTimer->startTiming(); - foreach($this->NBTentities as $nbt){ - if($nbt instanceof Compound){ - if(!isset($nbt->id)){ - $this->setChanged(); - continue; - } + if($this->getProvider() instanceof LevelProvider and !$this->isInit){ + $changed = false; + if($this->NBTentities !== null){ + $this->getProvider()->getLevel()->timings->syncChunkLoadEntitiesTimer->startTiming(); + foreach($this->NBTentities as $nbt){ + if($nbt instanceof Compound){ + if(!isset($nbt->id)){ + $this->setChanged(); + continue; + } - if(($nbt["Pos"][0] >> 4) !== $this->x or ($nbt["Pos"][2] >> 4) !== $this->z){ - $this->setChanged(); - continue; //Fixes entities allocated in wrong chunks. - } + if(($nbt["Pos"][0] >> 4) !== $this->x or ($nbt["Pos"][2] >> 4) !== $this->z){ + $changed = true; + continue; //Fixes entities allocated in wrong chunks. + } - if(($entity = Entity::createEntity($nbt["id"], $this, $nbt)) instanceof Entity){ - $entity->spawnToAll(); - }else{ - $this->setChanged(); - continue; + if(($entity = Entity::createEntity($nbt["id"], $this, $nbt)) instanceof Entity){ + $entity->spawnToAll(); + }else{ + $changed = true; + continue; + } } } - } - $this->getProvider()->getLevel()->timings->syncChunkLoadEntitiesTimer->stopTiming(); + $this->getProvider()->getLevel()->timings->syncChunkLoadEntitiesTimer->stopTiming(); - $this->getProvider()->getLevel()->timings->syncChunkLoadTileEntitiesTimer->startTiming(); - foreach($this->NBTtiles as $nbt){ - if($nbt instanceof Compound){ - if(!isset($nbt->id)){ - $this->setChanged(); - continue; - } + $this->getProvider()->getLevel()->timings->syncChunkLoadTileEntitiesTimer->startTiming(); + foreach($this->NBTtiles as $nbt){ + if($nbt instanceof Compound){ + if(!isset($nbt->id)){ + $changed = true; + continue; + } - if(($nbt["x"] >> 4) !== $this->x or ($nbt["z"] >> 4) !== $this->z){ - $this->setChanged(); - continue; //Fixes tiles allocated in wrong chunks. - } + if(($nbt["x"] >> 4) !== $this->x or ($nbt["z"] >> 4) !== $this->z){ + $changed = true; + continue; //Fixes tiles allocated in wrong chunks. + } - if(Tile::createTile($nbt["id"], $this, $nbt) === null){ - $this->setChanged(); - continue; + if(Tile::createTile($nbt["id"], $this, $nbt) === null){ + $changed = true; + continue; + } } } + + $this->getProvider()->getLevel()->timings->syncChunkLoadTileEntitiesTimer->stopTiming(); + + $this->NBTentities = null; + $this->NBTtiles = null; + + $this->setChanged($changed); } - $this->getProvider()->getLevel()->timings->syncChunkLoadTileEntitiesTimer->stopTiming(); - - $this->NBTentities = null; - $this->NBTtiles = null; - $this->isInit = true; }