diff --git a/src/pocketmine/block/ItemFrame.php b/src/pocketmine/block/ItemFrame.php index ebc517dad..7ff976a2c 100644 --- a/src/pocketmine/block/ItemFrame.php +++ b/src/pocketmine/block/ItemFrame.php @@ -75,7 +75,7 @@ class ItemFrame extends Flowable{ } public function place(Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, Player $player = null) : bool{ - if($face === Vector3::SIDE_DOWN or $face === Vector3::SIDE_UP){ + if($face === Vector3::SIDE_DOWN or $face === Vector3::SIDE_UP or !$blockClicked->isSolid()){ return false; } diff --git a/src/pocketmine/level/Level.php b/src/pocketmine/level/Level.php index b62e143ec..2f171ec73 100644 --- a/src/pocketmine/level/Level.php +++ b/src/pocketmine/level/Level.php @@ -1456,8 +1456,13 @@ class Level implements ChunkManager, Metadatable{ $index = Level::blockHash($x, $y, $z); if($cached and isset($this->blockCache[$index])){ return $this->blockCache[$index]; - }elseif(isset($this->chunks[$chunkIndex = Level::chunkHash($x >> 4, $z >> 4)])){ - $fullState = $this->chunks[$chunkIndex]->getFullBlock($x & 0x0f, $y, $z & 0x0f); + } + + $chunk = $this->chunks[$chunkIndex = Level::chunkHash($x >> 4, $z >> 4)] ?? null; + if($chunk !== null){ + $fullState = $chunk->getFullBlock($x & 0x0f, $y, $z & 0x0f); + }else{ + $addToCache = false; } } @@ -1607,7 +1612,7 @@ class Level implements ChunkManager, Metadatable{ $block->position($pos); $block->clearCaches(); - unset($this->blockCache[Level::blockHash($pos->x, $pos->y, $pos->z)]); + unset($this->blockCache[$blockHash = Level::blockHash($pos->x, $pos->y, $pos->z)]); $index = Level::chunkHash($pos->x >> 4, $pos->z >> 4); @@ -1619,7 +1624,7 @@ class Level implements ChunkManager, Metadatable{ $this->changedBlocks[$index] = []; } - $this->changedBlocks[$index][Level::blockHash($block->x, $block->y, $block->z)] = clone $block; + $this->changedBlocks[$index][$blockHash] = clone $block; } foreach($this->getChunkLoaders($pos->x >> 4, $pos->z >> 4) as $loader){ @@ -2141,13 +2146,13 @@ class Level implements ChunkManager, Metadatable{ * @param int $id 0-255 */ public function setBlockIdAt(int $x, int $y, int $z, int $id){ - unset($this->blockCache[Level::blockHash($x, $y, $z)]); + unset($this->blockCache[$blockHash = Level::blockHash($x, $y, $z)]); $this->getChunk($x >> 4, $z >> 4, true)->setBlockId($x & 0x0f, $y, $z & 0x0f, $id & 0xff); if(!isset($this->changedBlocks[$index = Level::chunkHash($x >> 4, $z >> 4)])){ $this->changedBlocks[$index] = []; } - $this->changedBlocks[$index][Level::blockHash($x, $y, $z)] = $v = new Vector3($x, $y, $z); + $this->changedBlocks[$index][$blockHash] = $v = new Vector3($x, $y, $z); foreach($this->getChunkLoaders($x >> 4, $z >> 4) as $loader){ $loader->onBlockChanged($v); } @@ -2203,13 +2208,13 @@ class Level implements ChunkManager, Metadatable{ * @param int $data 0-15 */ public function setBlockDataAt(int $x, int $y, int $z, int $data){ - unset($this->blockCache[Level::blockHash($x, $y, $z)]); + unset($this->blockCache[$blockHash = Level::blockHash($x, $y, $z)]); $this->getChunk($x >> 4, $z >> 4, true)->setBlockData($x & 0x0f, $y, $z & 0x0f, $data & 0x0f); if(!isset($this->changedBlocks[$index = Level::chunkHash($x >> 4, $z >> 4)])){ $this->changedBlocks[$index] = []; } - $this->changedBlocks[$index][Level::blockHash($x, $y, $z)] = $v = new Vector3($x, $y, $z); + $this->changedBlocks[$index][$blockHash] = $v = new Vector3($x, $y, $z); foreach($this->getChunkLoaders($x >> 4, $z >> 4) as $loader){ $loader->onBlockChanged($v); }