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();
}
if(($chunk = $this->getChunk($entity->chunkX, $entity->chunkZ)) instanceof FullChunk){
$chunk->removeEntity($entity);
}
unset($this->entities[$entity->getID()]);
}
@ -1749,9 +1745,7 @@ class Level implements ChunkManager, Metadatable{
if($tile->getLevel() !== $this){
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()]);
}

View File

@ -267,17 +267,24 @@ abstract class BaseFullChunk implements FullChunk{
if($save === true){
$level->saveChunk($this->getX(), $this->getZ());
}
if($this->getProvider()->unloadChunk($this->getX(), $this->getZ(), $safe)){
if($safe === true){
foreach($this->getEntities() as $entity){
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(){

View File

@ -183,6 +183,7 @@ class McRegion extends BaseLevelProvider{
if($chunk instanceof FullChunk){
$this->chunks[$index] = $chunk;
return true;
}else{
return false;
}
@ -190,26 +191,7 @@ class McRegion extends BaseLevelProvider{
public function unloadChunk($x, $z, $safe = true){
$chunk = $this->getChunk($x, $z, false);
if($chunk instanceof FullChunk){
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();
}
if($chunk instanceof FullChunk and $chunk->unload(false, $safe)){
$this->chunks[$index = Level::chunkHash($x, $z)] = null;
unset($this->chunks[$index]);

View File

@ -43,7 +43,7 @@ class Chest extends Spawnable implements InventoryHolder, Container{
protected $doubleInventory = null;
public function __construct(FullChunk $chunk, Compound $nbt){
$nbt["id"] = Tile::CHEST;
$nbt->id = new String("id", Tile::CHEST);
parent::__construct($chunk, $nbt);
$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\Enum;
use pocketmine\nbt\tag\Short;
use pocketmine\nbt\tag\String;
use pocketmine\network\protocol\ContainerSetDataPacket;
class Furnace extends Tile implements InventoryHolder, Container{
@ -39,7 +40,7 @@ class Furnace extends Tile implements InventoryHolder, Container{
protected $inventory;
public function __construct(FullChunk $chunk, Compound $nbt){
$nbt["id"] = Tile::FURNACE;
$nbt->id = new String("id", Tile::FURNACE);
parent::__construct($chunk, $nbt);
$this->inventory = new FurnaceInventory($this);

View File

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

View File

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