Possible fix for #1661

This commit is contained in:
Shoghi Cervantes 2014-10-05 16:32:15 +02:00
parent 5e03e157ad
commit 6b65b68ebc
7 changed files with 24 additions and 39 deletions

View File

@ -1706,10 +1706,6 @@ class Level implements ChunkManager, Metadatable{
$entity->kill(); $entity->kill();
} }
if(($chunk = $this->getChunk($entity->chunkX, $entity->chunkZ)) instanceof FullChunk){
$chunk->removeEntity($entity);
}
unset($this->entities[$entity->getID()]); unset($this->entities[$entity->getID()]);
} }
@ -1749,9 +1745,7 @@ class Level implements ChunkManager, Metadatable{
if($tile->getLevel() !== $this){ if($tile->getLevel() !== $this){
throw new \RuntimeException("Invalid Tile level"); throw new \RuntimeException("Invalid Tile level");
} }
if($this->isChunkLoaded($tile->chunk->getX(), $tile->chunk->getZ())){
$this->getChunk($tile->chunk->getX(), $tile->chunk->getZ(), true)->removeTile($tile);
}
unset($this->tiles[$tile->getID()]); unset($this->tiles[$tile->getID()]);
} }

View File

@ -267,17 +267,24 @@ abstract class BaseFullChunk implements FullChunk{
if($save === true){ if($save === true){
$level->saveChunk($this->getX(), $this->getZ()); $level->saveChunk($this->getX(), $this->getZ());
} }
if($this->getProvider()->unloadChunk($this->getX(), $this->getZ(), $safe)){ if($safe === true){
foreach($this->getEntities() as $entity){ foreach($this->getEntities() as $entity){
if($entity instanceof Player){ if($entity instanceof Player){
continue; return false;
} }
$entity->close();
}
foreach($this->getTiles() as $tile){
$tile->close();
} }
} }
foreach($this->getEntities() as $entity){
if($entity instanceof Player){
continue;
}
$entity->close();
}
foreach($this->getTiles() as $tile){
$tile->close();
}
return true;
} }
public function getBlockIdArray(){ public function getBlockIdArray(){

View File

@ -183,6 +183,7 @@ class McRegion extends BaseLevelProvider{
if($chunk instanceof FullChunk){ if($chunk instanceof FullChunk){
$this->chunks[$index] = $chunk; $this->chunks[$index] = $chunk;
return true;
}else{ }else{
return false; return false;
} }
@ -190,26 +191,7 @@ class McRegion extends BaseLevelProvider{
public function unloadChunk($x, $z, $safe = true){ public function unloadChunk($x, $z, $safe = true){
$chunk = $this->getChunk($x, $z, false); $chunk = $this->getChunk($x, $z, false);
if($chunk instanceof FullChunk){ if($chunk instanceof FullChunk and $chunk->unload(false, $safe)){
if($safe === true){
foreach($chunk->getEntities() as $entity){
if($entity instanceof Player){
return false;
}
}
}
foreach($chunk->getEntities() as $entity){
if($entity instanceof Player){
continue;
}
$entity->close();
}
foreach($chunk->getTiles() as $tile){
$tile->close();
}
$this->chunks[$index = Level::chunkHash($x, $z)] = null; $this->chunks[$index = Level::chunkHash($x, $z)] = null;
unset($this->chunks[$index]); unset($this->chunks[$index]);

View File

@ -43,7 +43,7 @@ class Chest extends Spawnable implements InventoryHolder, Container{
protected $doubleInventory = null; protected $doubleInventory = null;
public function __construct(FullChunk $chunk, Compound $nbt){ public function __construct(FullChunk $chunk, Compound $nbt){
$nbt["id"] = Tile::CHEST; $nbt->id = new String("id", Tile::CHEST);
parent::__construct($chunk, $nbt); parent::__construct($chunk, $nbt);
$this->inventory = new ChestInventory($this); $this->inventory = new ChestInventory($this);

View File

@ -32,6 +32,7 @@ use pocketmine\nbt\tag\Byte;
use pocketmine\nbt\tag\Compound; use pocketmine\nbt\tag\Compound;
use pocketmine\nbt\tag\Enum; use pocketmine\nbt\tag\Enum;
use pocketmine\nbt\tag\Short; use pocketmine\nbt\tag\Short;
use pocketmine\nbt\tag\String;
use pocketmine\network\protocol\ContainerSetDataPacket; use pocketmine\network\protocol\ContainerSetDataPacket;
class Furnace extends Tile implements InventoryHolder, Container{ class Furnace extends Tile implements InventoryHolder, Container{
@ -39,7 +40,7 @@ class Furnace extends Tile implements InventoryHolder, Container{
protected $inventory; protected $inventory;
public function __construct(FullChunk $chunk, Compound $nbt){ public function __construct(FullChunk $chunk, Compound $nbt){
$nbt["id"] = Tile::FURNACE; $nbt->id = new String("id", Tile::FURNACE);
parent::__construct($chunk, $nbt); parent::__construct($chunk, $nbt);
$this->inventory = new FurnaceInventory($this); $this->inventory = new FurnaceInventory($this);

View File

@ -29,7 +29,7 @@ use pocketmine\nbt\tag\String;
class Sign extends Spawnable{ class Sign extends Spawnable{
public function __construct(FullChunk $chunk, Compound $nbt){ public function __construct(FullChunk $chunk, Compound $nbt){
$nbt["id"] = Tile::SIGN; $nbt->id = new String("id", Tile::SIGN);
if(!isset($nbt->Text1)){ if(!isset($nbt->Text1)){
$nbt->Text1 = new String("Text1", ""); $nbt->Text1 = new String("Text1", "");
} }

View File

@ -31,6 +31,7 @@ use pocketmine\level\format\FullChunk;
use pocketmine\level\Level; use pocketmine\level\Level;
use pocketmine\level\Position; use pocketmine\level\Position;
use pocketmine\nbt\tag\Compound; use pocketmine\nbt\tag\Compound;
use pocketmine\nbt\tag\Int;
abstract class Tile extends Position{ abstract class Tile extends Position{
const SIGN = "Sign"; const SIGN = "Sign";
@ -88,9 +89,9 @@ abstract class Tile extends Position{
} }
public function saveNBT(){ public function saveNBT(){
$this->namedtag["x"] = $this->x; $this->namedtag->x = new Int("x", $this->x);
$this->namedtag["y"] = $this->y; $this->namedtag->y = new Int("y", $this->y);
$this->namedtag["z"] = $this->z; $this->namedtag->z = new Int("z", $this->z);
} }
public function onUpdate(){ public function onUpdate(){