Possible fix for #1661

This commit is contained in:
Shoghi Cervantes 2014-09-24 16:47:53 +02:00
parent 6cb7e36f8a
commit ef3674a296
5 changed files with 29 additions and 46 deletions

View File

@ -1519,14 +1519,19 @@ class Level implements ChunkManager, Metadatable{
} }
} }
public function setChunk($x, $z, FullChunk $chunk){ public function setChunk($x, $z, FullChunk $chunk, $unload = true){
$index = Level::chunkHash($x, $z); $index = Level::chunkHash($x, $z);
if($unload){
foreach($this->getUsingChunk($x, $z) as $player){ foreach($this->getUsingChunk($x, $z) as $player){
$player->unloadChunk($x, $z); $player->unloadChunk($x, $z);
} }
unset($this->chunks[$index]); unset($this->chunks[$index]);
$this->provider->setChunk($x, $z, $chunk); $this->provider->setChunk($x, $z, $chunk);
$this->loadChunk($x, $z); $this->loadChunk($x, $z);
}else{
$this->provider->setChunk($x, $z, $chunk);
$this->chunks[$index] = $chunk;
}
} }
/** /**
@ -1800,10 +1805,8 @@ class Level implements ChunkManager, Metadatable{
$this->timings->doChunkUnload->startTiming(); $this->timings->doChunkUnload->startTiming();
if($this->getAutoSave()){ if($chunk instanceof FullChunk and $this->getAutoSave()){
if(isset($this->chunks[$index])){ $this->provider->setChunk($x, $z, $chunk);
$this->provider->setChunk($x, $z, $this->chunks[$index]);
}
$this->provider->saveChunk($x, $z); $this->provider->saveChunk($x, $z);
} }

View File

@ -98,20 +98,12 @@ class Anvil extends McRegion{
$chunk->setProvider($this); $chunk->setProvider($this);
if($chunk->isPopulated() === false){
$this->unloadChunk($chunkX, $chunkZ, false);
$regionX = $regionZ = null;
self::getRegionIndex($chunkX, $chunkZ, $regionX, $regionZ); self::getRegionIndex($chunkX, $chunkZ, $regionX, $regionZ);
$this->loadRegion($regionX, $regionZ); $this->loadRegion($regionX, $regionZ);
$region = $this->getRegion($regionX, $regionZ);
$region->removeChunk($chunkX - $region->getX() * 32, $chunkZ - $region->getZ() * 32);
$this->loadChunk($chunkX, $chunkZ);
}else{
$chunk->setX($chunkX); $chunk->setX($chunkX);
$chunk->setZ($chunkZ); $chunk->setZ($chunkZ);
$this->chunks[Level::chunkHash($chunkX, $chunkZ)] = $chunk; $this->chunks[Level::chunkHash($chunkX, $chunkZ)] = $chunk;
//$this->saveChunk($chunkX, $chunkZ);
}
} }
public static function createChunkSection($Y){ public static function createChunkSection($Y){

View File

@ -182,11 +182,9 @@ class Chunk extends BaseChunk{
$tiles = []; $tiles = [];
foreach($this->getTiles() as $tile){ foreach($this->getTiles() as $tile){
if($tile->closed !== true){
$tile->saveNBT(); $tile->saveNBT();
$tiles[] = $tile->namedtag; $tiles[] = $tile->namedtag;
} }
}
$nbt->Entities = new Enum("TileEntities", $tiles); $nbt->Entities = new Enum("TileEntities", $tiles);
$nbt->Entities->setTagType(NBT::TAG_Compound); $nbt->Entities->setTagType(NBT::TAG_Compound);

View File

@ -288,11 +288,9 @@ class Chunk extends BaseFullChunk{
$tiles = []; $tiles = [];
foreach($this->getTiles() as $tile){ foreach($this->getTiles() as $tile){
if($tile->closed !== true){
$tile->saveNBT(); $tile->saveNBT();
$tiles[] = $tile->namedtag; $tiles[] = $tile->namedtag;
} }
}
$nbt->Entities = new Enum("TileEntities", $tiles); $nbt->Entities = new Enum("TileEntities", $tiles);
$nbt->Entities->setTagType(NBT::TAG_Compound); $nbt->Entities->setTagType(NBT::TAG_Compound);

View File

@ -262,20 +262,12 @@ class McRegion extends BaseLevelProvider{
$chunk->setProvider($this); $chunk->setProvider($this);
if($chunk->isPopulated() === false){
$this->unloadChunk($chunkX, $chunkZ, false);
$regionX = $regionZ = null;
self::getRegionIndex($chunkX, $chunkZ, $regionX, $regionZ); self::getRegionIndex($chunkX, $chunkZ, $regionX, $regionZ);
$this->loadRegion($regionX, $regionZ); $this->loadRegion($regionX, $regionZ);
$region = $this->getRegion($regionX, $regionZ);
$region->removeChunk($chunkX - $region->getX() * 32, $chunkZ - $region->getZ() * 32);
$this->loadChunk($chunkX, $chunkZ);
}else{
$chunk->setX($chunkX); $chunk->setX($chunkX);
$chunk->setZ($chunkZ); $chunk->setZ($chunkZ);
$this->chunks[Level::chunkHash($chunkX, $chunkZ)] = $chunk; $this->chunks[Level::chunkHash($chunkX, $chunkZ)] = $chunk;
//$this->saveChunk($chunkX, $chunkZ);
}
} }
public static function createChunkSection($Y){ public static function createChunkSection($Y){