diff --git a/src/API/LevelAPI.php b/src/API/LevelAPI.php index 9fab37ff3..0a46e2266 100644 --- a/src/API/LevelAPI.php +++ b/src/API/LevelAPI.php @@ -52,7 +52,7 @@ class LevelAPI{ if($block[0] === 0){ break; } - $this->setBlock($data["x"], $data["y"], $data["z"], 0, 0); + $this->setBlock($data["x"], $data["y"], $data["z"], 0, 0, true, true); break; } } @@ -84,12 +84,10 @@ class LevelAPI{ return $this->heightMap[$z][$x]; } - public function setBlock($x, $y, $z, $block, $meta = 0, $update = true){ + public function setBlock($x, $y, $z, $block, $meta = 0, $update = true, $tiles = false){ if($x < 0 or $y < 0 or $z < 0){ return false; } - $this->map->setBlock($x, $y, $z, $block, $meta); - $this->heightMap[$z][$x] = $this->map->getFloor($x, $z); if($this->server->api->dhandle("block.change", array( "x" => $x, "y" => $y, @@ -97,10 +95,17 @@ class LevelAPI{ "block" => $block, "meta" => $meta, )) !== false){ + $this->map->setBlock($x, $y, $z, $block, $meta); + $this->heightMap[$z][$x] = $this->map->getFloor($x, $z); if($update === true){ $this->server->api->block->updateBlock($x, $y, $z, BLOCK_UPDATE_NORMAL); $this->server->api->block->updateBlocksAround($x, $y, $z, BLOCK_UPDATE_NORMAL); } + if($tiles === true){ + if(($t = $this->server->api->tileentity->get($x, $y, $z)) !== false){ + $t[0]->close(); + } + } } return true; } diff --git a/src/API/TileEntityAPI.php b/src/API/TileEntityAPI.php index 51d82d998..4e851300d 100644 --- a/src/API/TileEntityAPI.php +++ b/src/API/TileEntityAPI.php @@ -30,10 +30,31 @@ class TileEntityAPI{ function __construct(PocketMinecraftServer $server){ $this->server = $server; } + + public function get($x, $y, $z){ + $x = (int) $x; + $y = (int) $y; + $z = (int) $z; + $tiles = $this->server->query("SELECT * FROM tileentities WHERE x = $x AND y = $y AND z = $z;"); + $ret = array(); + if($tiles !== false and $tiles !== true){ + while(($t = $tiles->fetchArray(SQLITE3_ASSOC)) !== false){ + if(($tile = $this->getByID($t["ID"])) !== false){ + if($tile->normal === true){ + $ret[] = $tile; + } + } + } + } + if(count($ret) === 0){ + return false; + } + return $ret; + } - public function get($eid){ - if(isset($this->server->tileEntities[$eid])){ - return $this->server->tileEntities[$eid]; + public function getByID($id){ + if(isset($this->server->tileEntities[$id])){ + return $this->server->tileEntities[$id]; } return false; } @@ -53,7 +74,7 @@ class TileEntityAPI{ } public function spawnTo($id, $player){ - $t = $this->get($id); + $t = $this->getByID($id); if($t === false){ return false; } @@ -61,7 +82,7 @@ class TileEntityAPI{ } public function spawnToAll($id){ - $t = $this->get($id); + $t = $this->getByID($id); if($t === false){ return false; } diff --git a/src/classes/Player.php b/src/classes/Player.php index 1bf416094..1e2967bc5 100644 --- a/src/classes/Player.php +++ b/src/classes/Player.php @@ -551,10 +551,14 @@ class Player{ $this->server->api->dhandle("entity.animate", array("eid" => $this->eid, "action" => $data["action"])); break; case MC_RESPAWN: - //$this->entity->invincible = true; + if($this->entity->dead === false){ + break; + } + $this->entity->fire = 0; + $this->entity->air = 300; $this->entity->setPosition($data["x"], $data["y"], $data["z"], 0, 0); - $this->entity->setHealth(20, "respawn"); - //$this->entity->invincible = false; + $this->entity->setHealth(20, "respawn"); + $this->entity->updateMetadata(); break; case MC_SET_HEALTH: if($this->server->gamemode === 1){ diff --git a/src/classes/world/TileEntity.php b/src/classes/world/TileEntity.php index 681211342..36025de4f 100644 --- a/src/classes/world/TileEntity.php +++ b/src/classes/world/TileEntity.php @@ -30,6 +30,7 @@ define("TILE_SIGN", 0); class TileEntity extends stdClass{ public $name; + public $normal; public $id; public $x; public $y; @@ -42,6 +43,7 @@ class TileEntity extends stdClass{ private $server; function __construct(PocketMinecraftServer $server, $id, $class, $x, $y, $z, $data = array()){ $this->server = $server; + $this->normal = true; $this->class = (int) $class; $this->data = $data; $this->closed = false; @@ -54,15 +56,13 @@ class TileEntity extends stdClass{ $this->y = (int) $y; $this->z = (int) $z; $this->server->query("INSERT OR REPLACE INTO tileentities (ID, class, x, y, z) VALUES (".$this->id.", ".$this->class.", ".$this->x.", ".$this->y.", ".$this->z.");"); - $update = false; switch($this->class){ case TILE_SIGN: $this->server->query("UPDATE tileentities SET spawnable = 1 WHERE ID = ".$this->id.";"); + break; } - if($update === true){ - $this->server->schedule(40, array($this, "update"), array(), true); - } + //$this->server->schedule(40, array($this, "update"), array(), true); } public function update(){