isTransparent() and $face > 1 and !$blockReplace->isSolid()){ /** @var PaintingMotive[] $motives */ $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 = []; } $motives[] = $motive; } } if(empty($motives)){ //No space available return false; } /** @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 ]; $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()); $entity = Entity::createEntity("Painting", $blockReplace->getLevel(), $nbt); 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; } } return false; } }