diff --git a/src/pocketmine/item/PaintingItem.php b/src/pocketmine/item/PaintingItem.php index c342502a3..b044f249f 100644 --- a/src/pocketmine/item/PaintingItem.php +++ b/src/pocketmine/item/PaintingItem.php @@ -37,67 +37,68 @@ class PaintingItem extends Item{ } public function onActivate(Player $player, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : bool{ - if(!$blockClicked->isTransparent() and $face > 1 and !$blockReplace->isSolid()){ - /** @var PaintingMotive[] $motives */ - $motives = []; + if($face === Vector3::SIDE_DOWN or $face === Vector3::SIDE_UP){ + return false; + } - $totalDimension = 0; - foreach(PaintingMotive::getAll() as $motive){ - $currentTotalDimension = $motive->getHeight() + $motive->getWidth(); - if($currentTotalDimension < $totalDimension){ - continue; + $motives = []; + + $totalDimension = 0; + foreach(PaintingMotive::getAll() as $motive){ + $currentTotalDimension = $motive->getHeight() + $motive->getWidth(); + if($currentTotalDimension < $totalDimension){ + continue; + } + + if(Painting::canFit($player->level, $blockReplace, $face, true, $motive)){ + if($currentTotalDimension > $totalDimension){ + $totalDimension = $currentTotalDimension; + /* + * This drops all motive possibilities smaller than this + * We use the total of height + width to allow equal chance of horizontal/vertical paintings + * when there is an L-shape of space available. + */ + $motives = []; } - if(Painting::canFit($player->level, $blockReplace, $face, true, $motive)){ - if($currentTotalDimension > $totalDimension){ - $totalDimension = $currentTotalDimension; - /* - * This drops all motive possibilities smaller than this - * We use the total of height + width to allow equal chance of horizontal/vertical paintings - * when there is an L-shape of space available. - */ - $motives = []; - } - - $motives[] = $motive; - } + $motives[] = $motive; } + } - if(empty($motives)){ //No space available - return false; - } + if(empty($motives)){ //No space available + return false; + } - /** @var PaintingMotive $motive */ - $motive = $motives[array_rand($motives)]; + /** @var PaintingMotive $motive */ + $motive = $motives[array_rand($motives)]; - static $directions = [ - Vector3::SIDE_SOUTH => 0, - Vector3::SIDE_WEST => 1, - Vector3::SIDE_NORTH => 2, - Vector3::SIDE_EAST => 3 - ]; + static $directions = [ + Vector3::SIDE_SOUTH => 0, + Vector3::SIDE_WEST => 1, + Vector3::SIDE_NORTH => 2, + Vector3::SIDE_EAST => 3 + ]; - $direction = $directions[$face] ?? -1; - if($direction === -1){ - return false; - } + $direction = $directions[$face] ?? -1; + if($direction === -1){ + return false; + } - $nbt = Entity::createBaseNBT($blockReplace, null, $direction * 90, 0); - $nbt->setByte("Direction", $direction); - $nbt->setString("Motive", $motive->getName()); - $nbt->setInt("TileX", $blockClicked->getFloorX()); - $nbt->setInt("TileY", $blockClicked->getFloorY()); - $nbt->setInt("TileZ", $blockClicked->getFloorZ()); + $nbt = Entity::createBaseNBT($blockReplace, null, $direction * 90, 0); + $nbt->setByte("Direction", $direction); + $nbt->setString("Motive", $motive->getName()); + $nbt->setInt("TileX", $blockClicked->getFloorX()); + $nbt->setInt("TileY", $blockClicked->getFloorY()); + $nbt->setInt("TileZ", $blockClicked->getFloorZ()); - $entity = Entity::createEntity("Painting", $blockReplace->getLevel(), $nbt); + $entity = Entity::createEntity("Painting", $blockReplace->getLevel(), $nbt); - if($entity instanceof Entity){ - --$this->count; - $entity->spawnToAll(); + if($entity instanceof Entity){ + --$this->count; + $entity->spawnToAll(); - $player->getLevel()->broadcastLevelEvent($blockReplace->add(0.5, 0.5, 0.5), LevelEventPacket::EVENT_SOUND_ITEMFRAME_PLACE); //item frame and painting have the same sound - return true; - } + $player->getLevel()->broadcastLevelEvent($blockReplace->add(0.5, 0.5, 0.5), LevelEventPacket::EVENT_SOUND_ITEMFRAME_PLACE); //item frame and painting have the same sound + return true; } return false;