Implement hanging signs

This commit is contained in:
Dylan K. Taylor 2025-08-24 20:07:59 +01:00
parent be90c6c399
commit 00d6171463
No known key found for this signature in database
GPG Key ID: 8927471A91CAFD3D
17 changed files with 543 additions and 4 deletions

View File

@ -103,10 +103,27 @@ abstract class BaseSign extends Transparent implements WoodMaterial{
return SupportType::NONE;
}
/**
* @deprecated
*/
abstract protected function getSupportingFace() : int;
/**
* @return int[]
*/
protected function getSupportingFaceOptions() : array{
return [$this->getSupportingFace()];
}
public function onNearbyBlockChange() : void{
if($this->getSide($this->getSupportingFace())->getTypeId() === BlockTypeIds::AIR){
$foundSupport = false;
foreach($this->getSupportingFaceOptions() as $face){
if($this->getSide($face)->getTypeId() !== BlockTypeIds::AIR){
$foundSupport = true;
break;
}
}
if(!$foundSupport){
$this->position->getWorld()->useBreakOn($this->position);
}
}

View File

@ -789,8 +789,41 @@ final class BlockTypeIds{
public const RESPAWN_ANCHOR = 10759;
public const OMINOUS_BANNER = 10760;
public const OMINOUS_WALL_BANNER = 10761;
public const ACACIA_CEILING_CENTER_HANGING_SIGN = 10762;
public const ACACIA_CEILING_EDGES_HANGING_SIGN = 10763;
public const ACACIA_WALL_HANGING_SIGN = 10764;
public const BIRCH_CEILING_CENTER_HANGING_SIGN = 10765;
public const BIRCH_CEILING_EDGES_HANGING_SIGN = 10766;
public const BIRCH_WALL_HANGING_SIGN = 10767;
public const CHERRY_CEILING_CENTER_HANGING_SIGN = 10768;
public const CHERRY_CEILING_EDGES_HANGING_SIGN = 10769;
public const CHERRY_WALL_HANGING_SIGN = 10770;
public const CRIMSON_CEILING_CENTER_HANGING_SIGN = 10771;
public const CRIMSON_CEILING_EDGES_HANGING_SIGN = 10772;
public const CRIMSON_WALL_HANGING_SIGN = 10773;
public const DARK_OAK_CEILING_CENTER_HANGING_SIGN = 10774;
public const DARK_OAK_CEILING_EDGES_HANGING_SIGN = 10775;
public const DARK_OAK_WALL_HANGING_SIGN = 10776;
public const JUNGLE_CEILING_CENTER_HANGING_SIGN = 10777;
public const JUNGLE_CEILING_EDGES_HANGING_SIGN = 10778;
public const JUNGLE_WALL_HANGING_SIGN = 10779;
public const MANGROVE_CEILING_CENTER_HANGING_SIGN = 10780;
public const MANGROVE_CEILING_EDGES_HANGING_SIGN = 10781;
public const MANGROVE_WALL_HANGING_SIGN = 10782;
public const OAK_CEILING_CENTER_HANGING_SIGN = 10783;
public const OAK_CEILING_EDGES_HANGING_SIGN = 10784;
public const OAK_WALL_HANGING_SIGN = 10785;
public const PALE_OAK_CEILING_CENTER_HANGING_SIGN = 10786;
public const PALE_OAK_CEILING_EDGES_HANGING_SIGN = 10787;
public const PALE_OAK_WALL_HANGING_SIGN = 10788;
public const SPRUCE_CEILING_CENTER_HANGING_SIGN = 10789;
public const SPRUCE_CEILING_EDGES_HANGING_SIGN = 10790;
public const SPRUCE_WALL_HANGING_SIGN = 10791;
public const WARPED_CEILING_CENTER_HANGING_SIGN = 10792;
public const WARPED_CEILING_EDGES_HANGING_SIGN = 10793;
public const WARPED_WALL_HANGING_SIGN = 10794;
public const FIRST_UNUSED_BLOCK_ID = 10762;
public const FIRST_UNUSED_BLOCK_ID = 10795;
private static int $nextDynamicId = self::FIRST_UNUSED_BLOCK_ID;

View File

@ -0,0 +1,52 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\SignLikeRotation;
use pocketmine\block\utils\SignLikeRotationTrait;
use pocketmine\item\Item;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
use pocketmine\world\BlockTransaction;
final class CeilingCenterHangingSign extends BaseSign implements SignLikeRotation{
use SignLikeRotationTrait;
protected function getSupportingFace() : int{
return Facing::UP;
}
//TODO: duplicated code :(
public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
if($face !== Facing::DOWN){
return false;
}
if($player !== null){
$this->rotation = self::getRotationFromYaw($player->getLocation()->getYaw());
}
return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player);
}
}

View File

@ -0,0 +1,51 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\HorizontalFacing;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\item\Item;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
use pocketmine\world\BlockTransaction;
final class CeilingEdgesHangingSign extends BaseSign implements HorizontalFacing{
use HorizontalFacingTrait;
protected function getSupportingFace() : int{
return Facing::UP;
}
public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
if($face !== Facing::DOWN){
return false;
}
if($player !== null){
$this->facing = Facing::opposite($player->getHorizontalFacing());
}
return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player);
}
}

View File

@ -45,6 +45,7 @@ use pocketmine\block\tile\EnchantTable as TileEnchantingTable;
use pocketmine\block\tile\EnderChest as TileEnderChest;
use pocketmine\block\tile\FlowerPot as TileFlowerPot;
use pocketmine\block\tile\GlowingItemFrame as TileGlowingItemFrame;
use pocketmine\block\tile\HangingSign as TileHangingSign;
use pocketmine\block\tile\Hopper as TileHopper;
use pocketmine\block\tile\ItemFrame as TileItemFrame;
use pocketmine\block\tile\Jukebox as TileJukebox;
@ -80,6 +81,8 @@ use function strtolower;
* @generate-registry-docblock
*
* @method static WoodenButton ACACIA_BUTTON()
* @method static CeilingCenterHangingSign ACACIA_CEILING_CENTER_HANGING_SIGN()
* @method static CeilingEdgesHangingSign ACACIA_CEILING_EDGES_HANGING_SIGN()
* @method static WoodenDoor ACACIA_DOOR()
* @method static WoodenFence ACACIA_FENCE()
* @method static FenceGate ACACIA_FENCE_GATE()
@ -92,6 +95,7 @@ use function strtolower;
* @method static WoodenSlab ACACIA_SLAB()
* @method static WoodenStairs ACACIA_STAIRS()
* @method static WoodenTrapdoor ACACIA_TRAPDOOR()
* @method static WallHangingSign ACACIA_WALL_HANGING_SIGN()
* @method static WallSign ACACIA_WALL_SIGN()
* @method static Wood ACACIA_WOOD()
* @method static ActivatorRail ACTIVATOR_RAIL()
@ -122,6 +126,8 @@ use function strtolower;
* @method static BigDripleafHead BIG_DRIPLEAF_HEAD()
* @method static BigDripleafStem BIG_DRIPLEAF_STEM()
* @method static WoodenButton BIRCH_BUTTON()
* @method static CeilingCenterHangingSign BIRCH_CEILING_CENTER_HANGING_SIGN()
* @method static CeilingEdgesHangingSign BIRCH_CEILING_EDGES_HANGING_SIGN()
* @method static WoodenDoor BIRCH_DOOR()
* @method static WoodenFence BIRCH_FENCE()
* @method static FenceGate BIRCH_FENCE_GATE()
@ -134,6 +140,7 @@ use function strtolower;
* @method static WoodenSlab BIRCH_SLAB()
* @method static WoodenStairs BIRCH_STAIRS()
* @method static WoodenTrapdoor BIRCH_TRAPDOOR()
* @method static WallHangingSign BIRCH_WALL_HANGING_SIGN()
* @method static WallSign BIRCH_WALL_SIGN()
* @method static Wood BIRCH_WOOD()
* @method static Opaque BLACKSTONE()
@ -170,6 +177,8 @@ use function strtolower;
* @method static Chain CHAIN()
* @method static ChemicalHeat CHEMICAL_HEAT()
* @method static WoodenButton CHERRY_BUTTON()
* @method static CeilingCenterHangingSign CHERRY_CEILING_CENTER_HANGING_SIGN()
* @method static CeilingEdgesHangingSign CHERRY_CEILING_EDGES_HANGING_SIGN()
* @method static WoodenDoor CHERRY_DOOR()
* @method static WoodenFence CHERRY_FENCE()
* @method static FenceGate CHERRY_FENCE_GATE()
@ -181,6 +190,7 @@ use function strtolower;
* @method static WoodenSlab CHERRY_SLAB()
* @method static WoodenStairs CHERRY_STAIRS()
* @method static WoodenTrapdoor CHERRY_TRAPDOOR()
* @method static WallHangingSign CHERRY_WALL_HANGING_SIGN()
* @method static WallSign CHERRY_WALL_SIGN()
* @method static Wood CHERRY_WOOD()
* @method static Chest CHEST()
@ -231,6 +241,8 @@ use function strtolower;
* @method static Opaque CRACKED_STONE_BRICKS()
* @method static CraftingTable CRAFTING_TABLE()
* @method static WoodenButton CRIMSON_BUTTON()
* @method static CeilingCenterHangingSign CRIMSON_CEILING_CENTER_HANGING_SIGN()
* @method static CeilingEdgesHangingSign CRIMSON_CEILING_EDGES_HANGING_SIGN()
* @method static WoodenDoor CRIMSON_DOOR()
* @method static WoodenFence CRIMSON_FENCE()
* @method static FenceGate CRIMSON_FENCE_GATE()
@ -243,6 +255,7 @@ use function strtolower;
* @method static WoodenStairs CRIMSON_STAIRS()
* @method static Wood CRIMSON_STEM()
* @method static WoodenTrapdoor CRIMSON_TRAPDOOR()
* @method static WallHangingSign CRIMSON_WALL_HANGING_SIGN()
* @method static WallSign CRIMSON_WALL_SIGN()
* @method static Opaque CRYING_OBSIDIAN()
* @method static Copper CUT_COPPER()
@ -254,6 +267,8 @@ use function strtolower;
* @method static Slab CUT_SANDSTONE_SLAB()
* @method static Flower DANDELION()
* @method static WoodenButton DARK_OAK_BUTTON()
* @method static CeilingCenterHangingSign DARK_OAK_CEILING_CENTER_HANGING_SIGN()
* @method static CeilingEdgesHangingSign DARK_OAK_CEILING_EDGES_HANGING_SIGN()
* @method static WoodenDoor DARK_OAK_DOOR()
* @method static WoodenFence DARK_OAK_FENCE()
* @method static FenceGate DARK_OAK_FENCE_GATE()
@ -266,6 +281,7 @@ use function strtolower;
* @method static WoodenSlab DARK_OAK_SLAB()
* @method static WoodenStairs DARK_OAK_STAIRS()
* @method static WoodenTrapdoor DARK_OAK_TRAPDOOR()
* @method static WallHangingSign DARK_OAK_WALL_HANGING_SIGN()
* @method static WallSign DARK_OAK_WALL_SIGN()
* @method static Wood DARK_OAK_WOOD()
* @method static Opaque DARK_PRISMARINE()
@ -488,6 +504,8 @@ use function strtolower;
* @method static ItemFrame ITEM_FRAME()
* @method static Jukebox JUKEBOX()
* @method static WoodenButton JUNGLE_BUTTON()
* @method static CeilingCenterHangingSign JUNGLE_CEILING_CENTER_HANGING_SIGN()
* @method static CeilingEdgesHangingSign JUNGLE_CEILING_EDGES_HANGING_SIGN()
* @method static WoodenDoor JUNGLE_DOOR()
* @method static WoodenFence JUNGLE_FENCE()
* @method static FenceGate JUNGLE_FENCE_GATE()
@ -500,6 +518,7 @@ use function strtolower;
* @method static WoodenSlab JUNGLE_SLAB()
* @method static WoodenStairs JUNGLE_STAIRS()
* @method static WoodenTrapdoor JUNGLE_TRAPDOOR()
* @method static WallHangingSign JUNGLE_WALL_HANGING_SIGN()
* @method static WallSign JUNGLE_WALL_SIGN()
* @method static Wood JUNGLE_WOOD()
* @method static ChemistryTable LAB_TABLE()
@ -522,6 +541,8 @@ use function strtolower;
* @method static Loom LOOM()
* @method static Magma MAGMA()
* @method static WoodenButton MANGROVE_BUTTON()
* @method static CeilingCenterHangingSign MANGROVE_CEILING_CENTER_HANGING_SIGN()
* @method static CeilingEdgesHangingSign MANGROVE_CEILING_EDGES_HANGING_SIGN()
* @method static WoodenDoor MANGROVE_DOOR()
* @method static WoodenFence MANGROVE_FENCE()
* @method static FenceGate MANGROVE_FENCE_GATE()
@ -534,6 +555,7 @@ use function strtolower;
* @method static WoodenSlab MANGROVE_SLAB()
* @method static WoodenStairs MANGROVE_STAIRS()
* @method static WoodenTrapdoor MANGROVE_TRAPDOOR()
* @method static WallHangingSign MANGROVE_WALL_HANGING_SIGN()
* @method static WallSign MANGROVE_WALL_SIGN()
* @method static Wood MANGROVE_WOOD()
* @method static ChemistryTable MATERIAL_REDUCER()
@ -572,6 +594,8 @@ use function strtolower;
* @method static Opaque NETHER_WART_BLOCK()
* @method static Note NOTE_BLOCK()
* @method static WoodenButton OAK_BUTTON()
* @method static CeilingCenterHangingSign OAK_CEILING_CENTER_HANGING_SIGN()
* @method static CeilingEdgesHangingSign OAK_CEILING_EDGES_HANGING_SIGN()
* @method static WoodenDoor OAK_DOOR()
* @method static WoodenFence OAK_FENCE()
* @method static FenceGate OAK_FENCE_GATE()
@ -584,6 +608,7 @@ use function strtolower;
* @method static WoodenSlab OAK_SLAB()
* @method static WoodenStairs OAK_STAIRS()
* @method static WoodenTrapdoor OAK_TRAPDOOR()
* @method static WallHangingSign OAK_WALL_HANGING_SIGN()
* @method static WallSign OAK_WALL_SIGN()
* @method static Wood OAK_WOOD()
* @method static Opaque OBSIDIAN()
@ -594,6 +619,8 @@ use function strtolower;
* @method static PackedIce PACKED_ICE()
* @method static Opaque PACKED_MUD()
* @method static WoodenButton PALE_OAK_BUTTON()
* @method static CeilingCenterHangingSign PALE_OAK_CEILING_CENTER_HANGING_SIGN()
* @method static CeilingEdgesHangingSign PALE_OAK_CEILING_EDGES_HANGING_SIGN()
* @method static WoodenDoor PALE_OAK_DOOR()
* @method static WoodenFence PALE_OAK_FENCE()
* @method static FenceGate PALE_OAK_FENCE_GATE()
@ -605,6 +632,7 @@ use function strtolower;
* @method static WoodenSlab PALE_OAK_SLAB()
* @method static WoodenStairs PALE_OAK_STAIRS()
* @method static WoodenTrapdoor PALE_OAK_TRAPDOOR()
* @method static WallHangingSign PALE_OAK_WALL_HANGING_SIGN()
* @method static WallSign PALE_OAK_WALL_SIGN()
* @method static Wood PALE_OAK_WOOD()
* @method static DoublePlant PEONY()
@ -735,6 +763,8 @@ use function strtolower;
* @method static Sponge SPONGE()
* @method static SporeBlossom SPORE_BLOSSOM()
* @method static WoodenButton SPRUCE_BUTTON()
* @method static CeilingCenterHangingSign SPRUCE_CEILING_CENTER_HANGING_SIGN()
* @method static CeilingEdgesHangingSign SPRUCE_CEILING_EDGES_HANGING_SIGN()
* @method static WoodenDoor SPRUCE_DOOR()
* @method static WoodenFence SPRUCE_FENCE()
* @method static FenceGate SPRUCE_FENCE_GATE()
@ -747,6 +777,7 @@ use function strtolower;
* @method static WoodenSlab SPRUCE_SLAB()
* @method static WoodenStairs SPRUCE_STAIRS()
* @method static WoodenTrapdoor SPRUCE_TRAPDOOR()
* @method static WallHangingSign SPRUCE_WALL_HANGING_SIGN()
* @method static WallSign SPRUCE_WALL_SIGN()
* @method static Wood SPRUCE_WOOD()
* @method static StainedHardenedClay STAINED_CLAY()
@ -790,6 +821,8 @@ use function strtolower;
* @method static WallBanner WALL_BANNER()
* @method static WallCoralFan WALL_CORAL_FAN()
* @method static WoodenButton WARPED_BUTTON()
* @method static CeilingCenterHangingSign WARPED_CEILING_CENTER_HANGING_SIGN()
* @method static CeilingEdgesHangingSign WARPED_CEILING_EDGES_HANGING_SIGN()
* @method static WoodenDoor WARPED_DOOR()
* @method static WoodenFence WARPED_FENCE()
* @method static FenceGate WARPED_FENCE_GATE()
@ -802,6 +835,7 @@ use function strtolower;
* @method static WoodenStairs WARPED_STAIRS()
* @method static Wood WARPED_STEM()
* @method static WoodenTrapdoor WARPED_TRAPDOOR()
* @method static WallHangingSign WARPED_WALL_HANGING_SIGN()
* @method static WallSign WARPED_WALL_SIGN()
* @method static Opaque WARPED_WART_BLOCK()
* @method static Water WATER()
@ -1396,6 +1430,23 @@ final class VanillaBlocks{
};
self::register($idName("sign"), fn(BID $id) => new FloorSign($id, $name . " Sign", $signBreakInfo, $woodType, $signAsItem), TileSign::class);
self::register($idName("wall_sign"), fn(BID $id) => new WallSign($id, $name . " Wall Sign", $signBreakInfo, $woodType, $signAsItem), TileSign::class);
$hangingSignAsItem = match($woodType){
WoodType::OAK => VanillaItems::OAK_HANGING_SIGN(...),
WoodType::SPRUCE => VanillaItems::SPRUCE_HANGING_SIGN(...),
WoodType::BIRCH => VanillaItems::BIRCH_HANGING_SIGN(...),
WoodType::JUNGLE => VanillaItems::JUNGLE_HANGING_SIGN(...),
WoodType::ACACIA => VanillaItems::ACACIA_HANGING_SIGN(...),
WoodType::DARK_OAK => VanillaItems::DARK_OAK_HANGING_SIGN(...),
WoodType::MANGROVE => VanillaItems::MANGROVE_HANGING_SIGN(...),
WoodType::CRIMSON => VanillaItems::CRIMSON_HANGING_SIGN(...),
WoodType::WARPED => VanillaItems::WARPED_HANGING_SIGN(...),
WoodType::CHERRY => VanillaItems::CHERRY_HANGING_SIGN(...),
WoodType::PALE_OAK => VanillaItems::PALE_OAK_HANGING_SIGN(...),
};
self::register($idName("ceiling_center_hanging_sign"), fn(BID $id) => new CeilingCenterHangingSign($id, $name . "Center Hanging Sign", $signBreakInfo, $woodType, $hangingSignAsItem), TileHangingSign::class);
self::register($idName("ceiling_edges_hanging_sign"), fn(BID $id) => new CeilingEdgesHangingSign($id, $name . "Edges Hanging Sign", $signBreakInfo, $woodType, $hangingSignAsItem), TileHangingSign::class);
self::register($idName("wall_hanging_sign"), fn(BID $id) => new WallHangingSign($id, $name . " Wall Hanging Sign", $signBreakInfo, $woodType, $hangingSignAsItem), TileHangingSign::class);
}
}

View File

@ -0,0 +1,63 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\block;
use pocketmine\block\utils\HorizontalFacing;
use pocketmine\block\utils\HorizontalFacingTrait;
use pocketmine\item\Item;
use pocketmine\math\Axis;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
use pocketmine\world\BlockTransaction;
final class WallHangingSign extends BaseSign implements HorizontalFacing{
use HorizontalFacingTrait;
protected function getSupportingFace() : int{
return Facing::rotateY($this->facing, clockwise: true);
}
protected function getSupportingFaceOptions() : array{
//wall hanging signs can be supported from either end of the post
return [
Facing::rotateY($this->facing, clockwise: true),
Facing::rotateY($this->facing, clockwise: false)
];
}
public function place(BlockTransaction $tx, Item $item, Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector, ?Player $player = null) : bool{
if(Facing::axis($face) === Axis::Y){
return false;
}
$this->facing = Facing::rotateY($face, clockwise: true);
//the front should always face the player if possible
if($player !== null && $this->facing === $player->getHorizontalFacing()){
$this->facing = Facing::opposite($this->facing);
}
return parent::place($tx, $item, $blockReplace, $blockClicked, $face, $clickVector, $player);
}
}

View File

@ -0,0 +1,33 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\block\tile;
use pocketmine\nbt\tag\CompoundTag;
/**
* @deprecated
*/
final class HangingSign extends Sign{
}

View File

@ -23,6 +23,7 @@ declare(strict_types=1);
namespace pocketmine\block\tile;
use pocketmine\block\HangingRoots;
use pocketmine\data\SavedDataLoadingException;
use pocketmine\math\Vector3;
use pocketmine\nbt\NbtException;
@ -79,6 +80,7 @@ final class TileFactory{
$this->register(SporeBlossom::class, ["SporeBlossom", "minecraft:spore_blossom"]);
$this->register(MobHead::class, ["Skull", "minecraft:skull"]);
$this->register(GlowingItemFrame::class, ["GlowItemFrame"]);
$this->register(HangingSign::class, ["HangingSign", "minecraft:hanging_sign"]);
//TODO: ChalkboardBlock
//TODO: ChemistryTable

View File

@ -1596,5 +1596,51 @@ final class VanillaBlockMappings{
//normal banner, therefore no deserializer is needed
self::mapAsymmetricSerializer($reg, Model::create(Blocks::OMINOUS_BANNER(), Ids::STANDING_BANNER)->properties([$commonProperties->floorSignLikeRotation]));
self::mapAsymmetricSerializer($reg, Model::create(Blocks::OMINOUS_WALL_BANNER(), Ids::WALL_BANNER)->properties([$commonProperties->horizontalFacingClassic]));
foreach([
Ids::ACACIA_HANGING_SIGN => [Blocks::ACACIA_CEILING_CENTER_HANGING_SIGN(), Blocks::ACACIA_CEILING_EDGES_HANGING_SIGN(), Blocks::ACACIA_WALL_HANGING_SIGN()],
Ids::BIRCH_HANGING_SIGN => [Blocks::BIRCH_CEILING_CENTER_HANGING_SIGN(), Blocks::BIRCH_CEILING_EDGES_HANGING_SIGN(), Blocks::BIRCH_WALL_HANGING_SIGN()],
Ids::CHERRY_HANGING_SIGN => [Blocks::CHERRY_CEILING_CENTER_HANGING_SIGN(), Blocks::CHERRY_CEILING_EDGES_HANGING_SIGN(), Blocks::CHERRY_WALL_HANGING_SIGN()],
Ids::CRIMSON_HANGING_SIGN => [Blocks::CRIMSON_CEILING_CENTER_HANGING_SIGN(), Blocks::CRIMSON_CEILING_EDGES_HANGING_SIGN(), Blocks::CRIMSON_WALL_HANGING_SIGN()],
Ids::DARK_OAK_HANGING_SIGN => [Blocks::DARK_OAK_CEILING_CENTER_HANGING_SIGN(), Blocks::DARK_OAK_CEILING_EDGES_HANGING_SIGN(), Blocks::DARK_OAK_WALL_HANGING_SIGN()],
Ids::JUNGLE_HANGING_SIGN => [Blocks::JUNGLE_CEILING_CENTER_HANGING_SIGN(), Blocks::JUNGLE_CEILING_EDGES_HANGING_SIGN(), Blocks::JUNGLE_WALL_HANGING_SIGN()],
Ids::MANGROVE_HANGING_SIGN => [Blocks::MANGROVE_CEILING_CENTER_HANGING_SIGN(), Blocks::MANGROVE_CEILING_EDGES_HANGING_SIGN(), Blocks::MANGROVE_WALL_HANGING_SIGN()],
Ids::OAK_HANGING_SIGN => [Blocks::OAK_CEILING_CENTER_HANGING_SIGN(), Blocks::OAK_CEILING_EDGES_HANGING_SIGN(), Blocks::OAK_WALL_HANGING_SIGN()],
Ids::PALE_OAK_HANGING_SIGN => [Blocks::PALE_OAK_CEILING_CENTER_HANGING_SIGN(), Blocks::PALE_OAK_CEILING_EDGES_HANGING_SIGN(), Blocks::PALE_OAK_WALL_HANGING_SIGN()],
Ids::SPRUCE_HANGING_SIGN => [Blocks::SPRUCE_CEILING_CENTER_HANGING_SIGN(), Blocks::SPRUCE_CEILING_EDGES_HANGING_SIGN(), Blocks::SPRUCE_WALL_HANGING_SIGN()],
Ids::WARPED_HANGING_SIGN => [Blocks::WARPED_CEILING_CENTER_HANGING_SIGN(), Blocks::WARPED_CEILING_EDGES_HANGING_SIGN(), Blocks::WARPED_WALL_HANGING_SIGN()],
] as $id => [$center, $edges, $wall]){
//attached_bit - true for ceiling center signs, false for ceiling edges signs and wall signs
//hanging - true for all ceiling signs, false for wall signs
//facing_direction - used for ceiling edges signs and wall signs
//ground_sign_direction - used by ceiling center signs only
$centerModel = Model::create($center, $id)->properties([
$commonProperties->floorSignLikeRotation,
new DummyProperty(StateNames::ATTACHED_BIT, true),
new DummyProperty(StateNames::HANGING, true),
new DummyProperty(StateNames::FACING_DIRECTION, 2)
]);
$edgesModel = Model::create($edges, $id)->properties([
new DummyProperty(StateNames::GROUND_SIGN_DIRECTION, 0),
new DummyProperty(StateNames::ATTACHED_BIT, false),
new DummyProperty(StateNames::HANGING, true),
$commonProperties->horizontalFacingClassic,
]);
$wallModel = Model::create($wall, $id)->properties([
new DummyProperty(StateNames::GROUND_SIGN_DIRECTION, 0),
new DummyProperty(StateNames::ATTACHED_BIT, false),
new DummyProperty(StateNames::HANGING, false),
$commonProperties->horizontalFacingClassic
]);
self::mapAsymmetricSerializer($reg, $centerModel);
self::mapAsymmetricSerializer($reg, $edgesModel);
self::mapAsymmetricSerializer($reg, $wallModel);
$reg->deserializer->map($id, fn(Reader $in) => $in->readBool(StateNames::HANGING) ?
($in->readBool(StateNames::ATTACHED_BIT) ?
self::deserializeAsymmetric($centerModel, $in) :
self::deserializeAsymmetric($edgesModel, $in)
) :
self::deserializeAsymmetric($wallModel, $in));
}
}
}

View File

@ -167,6 +167,7 @@ final class ItemSerializerDeserializerRegistrar{
*/
private function register1to1ItemMappings() : void{
$this->map1to1Item(Ids::ACACIA_BOAT, Items::ACACIA_BOAT());
$this->map1to1Item(Ids::ACACIA_HANGING_SIGN, Items::ACACIA_HANGING_SIGN());
$this->map1to1Item(Ids::ACACIA_SIGN, Items::ACACIA_SIGN());
$this->map1to1Item(Ids::AMETHYST_SHARD, Items::AMETHYST_SHARD());
$this->map1to1Item(Ids::APPLE, Items::APPLE());
@ -176,6 +177,7 @@ final class ItemSerializerDeserializerRegistrar{
$this->map1to1Item(Ids::BEETROOT_SEEDS, Items::BEETROOT_SEEDS());
$this->map1to1Item(Ids::BEETROOT_SOUP, Items::BEETROOT_SOUP());
$this->map1to1Item(Ids::BIRCH_BOAT, Items::BIRCH_BOAT());
$this->map1to1Item(Ids::BIRCH_HANGING_SIGN, Items::BIRCH_HANGING_SIGN());
$this->map1to1Item(Ids::BIRCH_SIGN, Items::BIRCH_SIGN());
$this->map1to1Item(Ids::BLAZE_POWDER, Items::BLAZE_POWDER());
$this->map1to1Item(Ids::BLAZE_ROD, Items::BLAZE_ROD());
@ -194,6 +196,7 @@ final class ItemSerializerDeserializerRegistrar{
$this->map1to1Item(Ids::CHAINMAIL_HELMET, Items::CHAINMAIL_HELMET());
$this->map1to1Item(Ids::CHAINMAIL_LEGGINGS, Items::CHAINMAIL_LEGGINGS());
$this->map1to1Item(Ids::CHARCOAL, Items::CHARCOAL());
$this->map1to1Item(Ids::CHERRY_HANGING_SIGN, Items::CHERRY_HANGING_SIGN());
$this->map1to1Item(Ids::CHERRY_SIGN, Items::CHERRY_SIGN());
$this->map1to1Item(Ids::CHICKEN, Items::RAW_CHICKEN());
$this->map1to1Item(Ids::CHORUS_FRUIT, Items::CHORUS_FRUIT());
@ -213,8 +216,10 @@ final class ItemSerializerDeserializerRegistrar{
$this->map1to1Item(Ids::COOKED_SALMON, Items::COOKED_SALMON());
$this->map1to1Item(Ids::COOKIE, Items::COOKIE());
$this->map1to1Item(Ids::COPPER_INGOT, Items::COPPER_INGOT());
$this->map1to1Item(Ids::CRIMSON_HANGING_SIGN, Items::CRIMSON_HANGING_SIGN());
$this->map1to1Item(Ids::CRIMSON_SIGN, Items::CRIMSON_SIGN());
$this->map1to1Item(Ids::DARK_OAK_BOAT, Items::DARK_OAK_BOAT());
$this->map1to1Item(Ids::DARK_OAK_HANGING_SIGN, Items::DARK_OAK_HANGING_SIGN());
$this->map1to1Item(Ids::DARK_OAK_SIGN, Items::DARK_OAK_SIGN());
$this->map1to1Item(Ids::DIAMOND, Items::DIAMOND());
$this->map1to1Item(Ids::DIAMOND_AXE, Items::DIAMOND_AXE());
@ -283,6 +288,7 @@ final class ItemSerializerDeserializerRegistrar{
$this->map1to1Item(Ids::IRON_SHOVEL, Items::IRON_SHOVEL());
$this->map1to1Item(Ids::IRON_SWORD, Items::IRON_SWORD());
$this->map1to1Item(Ids::JUNGLE_BOAT, Items::JUNGLE_BOAT());
$this->map1to1Item(Ids::JUNGLE_HANGING_SIGN, Items::JUNGLE_HANGING_SIGN());
$this->map1to1Item(Ids::JUNGLE_SIGN, Items::JUNGLE_SIGN());
$this->map1to1Item(Ids::LAPIS_LAZULI, Items::LAPIS_LAZULI());
$this->map1to1Item(Ids::LAVA_BUCKET, Items::LAVA_BUCKET());
@ -293,6 +299,7 @@ final class ItemSerializerDeserializerRegistrar{
$this->map1to1Item(Ids::LEATHER_LEGGINGS, Items::LEATHER_PANTS());
$this->map1to1Item(Ids::MAGMA_CREAM, Items::MAGMA_CREAM());
$this->map1to1Item(Ids::MANGROVE_BOAT, Items::MANGROVE_BOAT());
$this->map1to1Item(Ids::MANGROVE_HANGING_SIGN, Items::MANGROVE_HANGING_SIGN());
$this->map1to1Item(Ids::MANGROVE_SIGN, Items::MANGROVE_SIGN());
$this->map1to1Item(Ids::MELON_SEEDS, Items::MELON_SEEDS());
$this->map1to1Item(Ids::MELON_SLICE, Items::MELON());
@ -336,8 +343,10 @@ final class ItemSerializerDeserializerRegistrar{
$this->map1to1Item(Ids::NETHERITE_SWORD, Items::NETHERITE_SWORD());
$this->map1to1Item(Ids::NETHERITE_UPGRADE_SMITHING_TEMPLATE, Items::NETHERITE_UPGRADE_SMITHING_TEMPLATE());
$this->map1to1Item(Ids::OAK_BOAT, Items::OAK_BOAT());
$this->map1to1Item(Ids::OAK_HANGING_SIGN, Items::OAK_HANGING_SIGN());
$this->map1to1Item(Ids::OAK_SIGN, Items::OAK_SIGN());
$this->map1to1Item(Ids::PAINTING, Items::PAINTING());
$this->map1to1Item(Ids::PALE_OAK_HANGING_SIGN, Items::PALE_OAK_HANGING_SIGN());
$this->map1to1Item(Ids::PALE_OAK_SIGN, Items::PALE_OAK_SIGN());
$this->map1to1Item(Ids::PAPER, Items::PAPER());
$this->map1to1Item(Ids::PHANTOM_MEMBRANE, Items::PHANTOM_MEMBRANE());
@ -378,6 +387,7 @@ final class ItemSerializerDeserializerRegistrar{
$this->map1to1Item(Ids::SPIDER_EYE, Items::SPIDER_EYE());
$this->map1to1Item(Ids::SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE, Items::SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE());
$this->map1to1Item(Ids::SPRUCE_BOAT, Items::SPRUCE_BOAT());
$this->map1to1Item(Ids::SPRUCE_HANGING_SIGN, Items::SPRUCE_HANGING_SIGN());
$this->map1to1Item(Ids::SPRUCE_SIGN, Items::SPRUCE_SIGN());
$this->map1to1Item(Ids::SPYGLASS, Items::SPYGLASS());
$this->map1to1Item(Ids::SQUID_SPAWN_EGG, Items::SQUID_SPAWN_EGG());
@ -398,6 +408,7 @@ final class ItemSerializerDeserializerRegistrar{
$this->map1to1Item(Ids::VEX_ARMOR_TRIM_SMITHING_TEMPLATE, Items::VEX_ARMOR_TRIM_SMITHING_TEMPLATE());
$this->map1to1Item(Ids::VILLAGER_SPAWN_EGG, Items::VILLAGER_SPAWN_EGG());
$this->map1to1Item(Ids::WARD_ARMOR_TRIM_SMITHING_TEMPLATE, Items::WARD_ARMOR_TRIM_SMITHING_TEMPLATE());
$this->map1to1Item(Ids::WARPED_HANGING_SIGN, Items::WARPED_HANGING_SIGN());
$this->map1to1Item(Ids::WARPED_SIGN, Items::WARPED_SIGN());
$this->map1to1Item(Ids::WATER_BUCKET, Items::WATER_BUCKET());
$this->map1to1Item(Ids::WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE, Items::WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE());

66
src/item/HangingSign.php Normal file
View File

@ -0,0 +1,66 @@
<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\item;
use pocketmine\block\Block;
use pocketmine\block\utils\SupportType;
use pocketmine\math\Facing;
use pocketmine\math\Vector3;
use pocketmine\player\Player;
final class HangingSign extends Item{
public function __construct(
ItemIdentifier $identifier,
string $name,
private Block $centerPointCeilingVariant,
private Block $edgePointCeilingVariant,
private Block $wallVariant
){
parent::__construct($identifier, $name);
}
public function getPlacementBlock(Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : Block{
//we don't verify valid placement conditions here, only decide which block to return
$result = $face === Facing::DOWN ?
$blockReplace->getSide(Facing::UP)->getSupportType(Facing::DOWN) === SupportType::CENTER ?
$this->centerPointCeilingVariant :
$this->edgePointCeilingVariant
: $this->wallVariant;
return clone $result;
}
public function getBlock(?int $clickedFace = null) : Block{
//we don't have enough information here to decide which ceiling type to use
return $clickedFace === Facing::DOWN ? clone $this->centerPointCeilingVariant : clone $this->wallVariant;
}
public function getMaxStackSize() : int{
return 16;
}
public function getFuelTime() : int{
return 200;
}
}

View File

@ -485,6 +485,10 @@ class Item implements \JsonSerializable{
return $this->getBlock()->canBePlaced();
}
public function getPlacementBlock(Block $blockReplace, Block $blockClicked, int $face, Vector3 $clickVector) : Block{
return $this->getBlock($face);
}
/**
* Returns the block corresponding to this Item.
*/

View File

@ -335,8 +335,19 @@ final class ItemTypeIds{
public const RECORD_CREATOR_MUSIC_BOX = 20296;
public const RECORD_PRECIPICE = 20297;
public const OMINOUS_BANNER = 20298;
public const ACACIA_HANGING_SIGN = 20299;
public const BIRCH_HANGING_SIGN = 20300;
public const CHERRY_HANGING_SIGN = 20301;
public const CRIMSON_HANGING_SIGN = 20302;
public const DARK_OAK_HANGING_SIGN = 20303;
public const JUNGLE_HANGING_SIGN = 20304;
public const MANGROVE_HANGING_SIGN = 20305;
public const OAK_HANGING_SIGN = 20306;
public const PALE_OAK_HANGING_SIGN = 20307;
public const SPRUCE_HANGING_SIGN = 20308;
public const WARPED_HANGING_SIGN = 20309;
public const FIRST_UNUSED_ITEM_ID = 20299;
public const FIRST_UNUSED_ITEM_ID = 20310;
private static int $nextDynamicId = self::FIRST_UNUSED_ITEM_ID;

View File

@ -1232,6 +1232,7 @@ final class StringToItemParser extends StringToTParser{
private static function registerItems(self $result) : void{
$result->register("acacia_boat", fn() => Items::ACACIA_BOAT());
$result->register("acacia_hanging_sign", fn() => Items::ACACIA_HANGING_SIGN());
$result->register("amethyst_shard", fn() => Items::AMETHYST_SHARD());
$result->register("antidote", fn() => Items::MEDICINE()->setType(MedicineType::ANTIDOTE));
$result->register("apple", fn() => Items::APPLE());
@ -1246,6 +1247,7 @@ final class StringToItemParser extends StringToTParser{
$result->register("beetroot_seeds", fn() => Items::BEETROOT_SEEDS());
$result->register("beetroot_soup", fn() => Items::BEETROOT_SOUP());
$result->register("birch_boat", fn() => Items::BIRCH_BOAT());
$result->register("birch_hanging_sign", fn() => Items::BIRCH_HANGING_SIGN());
$result->register("blaze_powder", fn() => Items::BLAZE_POWDER());
$result->register("blaze_rod", fn() => Items::BLAZE_ROD());
$result->register("bleach", fn() => Items::BLEACH());
@ -1307,6 +1309,7 @@ final class StringToItemParser extends StringToTParser{
$result->register("chemical_sulphate", fn() => Items::CHEMICAL_SULPHATE());
$result->register("chemical_tungsten_chloride", fn() => Items::CHEMICAL_TUNGSTEN_CHLORIDE());
$result->register("chemical_water", fn() => Items::CHEMICAL_WATER());
$result->register("cherry_hanging_sign", fn() => Items::CHERRY_HANGING_SIGN());
$result->register("chicken", fn() => Items::RAW_CHICKEN());
$result->register("chorus_fruit", fn() => Items::CHORUS_FRUIT());
$result->register("chorus_fruit_popped", fn() => Items::POPPED_CHORUS_FRUIT());
@ -1331,7 +1334,9 @@ final class StringToItemParser extends StringToTParser{
$result->register("cooked_salmon", fn() => Items::COOKED_SALMON());
$result->register("cookie", fn() => Items::COOKIE());
$result->register("copper_ingot", fn() => Items::COPPER_INGOT());
$result->register("crimson_hanging_sign", fn() => Items::CRIMSON_HANGING_SIGN());
$result->register("dark_oak_boat", fn() => Items::DARK_OAK_BOAT());
$result->register("dark_oak_hanging_sign", fn() => Items::DARK_OAK_HANGING_SIGN());
$result->register("diamond", fn() => Items::DIAMOND());
$result->register("diamond_axe", fn() => Items::DIAMOND_AXE());
$result->register("diamond_boots", fn() => Items::DIAMOND_BOOTS());
@ -1416,6 +1421,7 @@ final class StringToItemParser extends StringToTParser{
$result->register("iron_shovel", fn() => Items::IRON_SHOVEL());
$result->register("iron_sword", fn() => Items::IRON_SWORD());
$result->register("jungle_boat", fn() => Items::JUNGLE_BOAT());
$result->register("jungle_hanging_sign", fn() => Items::JUNGLE_HANGING_SIGN());
$result->register("lapis_lazuli", fn() => Items::LAPIS_LAZULI());
$result->register("lava_bucket", fn() => Items::LAVA_BUCKET());
$result->register("leather", fn() => Items::LEATHER());
@ -1427,6 +1433,7 @@ final class StringToItemParser extends StringToTParser{
$result->register("leather_pants", fn() => Items::LEATHER_PANTS());
$result->register("leather_tunic", fn() => Items::LEATHER_TUNIC());
$result->register("magma_cream", fn() => Items::MAGMA_CREAM());
$result->register("mangrove_hanging_sign", fn() => Items::MANGROVE_HANGING_SIGN());
$result->register("melon", fn() => Items::MELON());
$result->register("melon_seeds", fn() => Items::MELON_SEEDS());
$result->register("melon_slice", fn() => Items::MELON());
@ -1458,7 +1465,9 @@ final class StringToItemParser extends StringToTParser{
$result->register("netherstar", fn() => Items::NETHER_STAR());
$result->register("netherite_upgrade_smithing_template", fn() => Items::NETHERITE_UPGRADE_SMITHING_TEMPLATE());
$result->register("oak_boat", fn() => Items::OAK_BOAT());
$result->register("oak_hanging_sign", fn() => Items::OAK_HANGING_SIGN());
$result->register("painting", fn() => Items::PAINTING());
$result->register("pale_oak_hanging_sign", fn() => Items::PALE_OAK_HANGING_SIGN());
$result->register("paper", fn() => Items::PAPER());
$result->register("phantom_membrane", fn() => Items::PHANTOM_MEMBRANE());
$result->register("pitcher_pod", fn() => Items::PITCHER_POD());
@ -1532,6 +1541,7 @@ final class StringToItemParser extends StringToTParser{
$result->register("spire_armor_trim_smithing_template", fn() => Items::SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE());
$result->register("splash_potion", fn() => Items::SPLASH_POTION());
$result->register("spruce_boat", fn() => Items::SPRUCE_BOAT());
$result->register("spruce_hanging_sign", fn() => Items::SPRUCE_HANGING_SIGN());
$result->register("spyglass", fn() => Items::SPYGLASS());
$result->register("squid_spawn_egg", fn() => Items::SQUID_SPAWN_EGG());
$result->register("steak", fn() => Items::STEAK());
@ -1555,6 +1565,7 @@ final class StringToItemParser extends StringToTParser{
$result->register("turtle_shell_piece", fn() => Items::SCUTE());
$result->register("villager_spawn_egg", fn() => Items::VILLAGER_SPAWN_EGG());
$result->register("ward_armor_trim_smithing_template", fn() => Items::WARD_ARMOR_TRIM_SMITHING_TEMPLATE());
$result->register("warped_hanging_sign", fn() => Items::WARPED_HANGING_SIGN());
$result->register("water_bucket", fn() => Items::WATER_BUCKET());
$result->register("wayfinder_armor_trim_smithing_template", fn() => Items::WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE());
$result->register("wheat", fn() => Items::WHEAT());

View File

@ -48,6 +48,7 @@ use function strtolower;
* @generate-registry-docblock
*
* @method static Boat ACACIA_BOAT()
* @method static HangingSign ACACIA_HANGING_SIGN()
* @method static ItemBlockWallOrFloor ACACIA_SIGN()
* @method static ItemBlock AIR()
* @method static Item AMETHYST_SHARD()
@ -60,6 +61,7 @@ use function strtolower;
* @method static BeetrootSeeds BEETROOT_SEEDS()
* @method static BeetrootSoup BEETROOT_SOUP()
* @method static Boat BIRCH_BOAT()
* @method static HangingSign BIRCH_HANGING_SIGN()
* @method static ItemBlockWallOrFloor BIRCH_SIGN()
* @method static Item BLAZE_POWDER()
* @method static BlazeRod BLAZE_ROD()
@ -116,6 +118,7 @@ use function strtolower;
* @method static Item CHEMICAL_SULPHATE()
* @method static Item CHEMICAL_TUNGSTEN_CHLORIDE()
* @method static Item CHEMICAL_WATER()
* @method static HangingSign CHERRY_HANGING_SIGN()
* @method static ItemBlockWallOrFloor CHERRY_SIGN()
* @method static ChorusFruit CHORUS_FRUIT()
* @method static Item CLAY()
@ -134,8 +137,10 @@ use function strtolower;
* @method static Cookie COOKIE()
* @method static Item COPPER_INGOT()
* @method static CoralFan CORAL_FAN()
* @method static HangingSign CRIMSON_HANGING_SIGN()
* @method static ItemBlockWallOrFloor CRIMSON_SIGN()
* @method static Boat DARK_OAK_BOAT()
* @method static HangingSign DARK_OAK_HANGING_SIGN()
* @method static ItemBlockWallOrFloor DARK_OAK_SIGN()
* @method static Item DIAMOND()
* @method static Axe DIAMOND_AXE()
@ -206,6 +211,7 @@ use function strtolower;
* @method static Shovel IRON_SHOVEL()
* @method static Sword IRON_SWORD()
* @method static Boat JUNGLE_BOAT()
* @method static HangingSign JUNGLE_HANGING_SIGN()
* @method static ItemBlockWallOrFloor JUNGLE_SIGN()
* @method static Item LAPIS_LAZULI()
* @method static LiquidBucket LAVA_BUCKET()
@ -216,6 +222,7 @@ use function strtolower;
* @method static Armor LEATHER_TUNIC()
* @method static Item MAGMA_CREAM()
* @method static Boat MANGROVE_BOAT()
* @method static HangingSign MANGROVE_HANGING_SIGN()
* @method static ItemBlockWallOrFloor MANGROVE_SIGN()
* @method static Medicine MEDICINE()
* @method static Melon MELON()
@ -241,9 +248,11 @@ use function strtolower;
* @method static Item NETHER_QUARTZ()
* @method static Item NETHER_STAR()
* @method static Boat OAK_BOAT()
* @method static HangingSign OAK_HANGING_SIGN()
* @method static ItemBlockWallOrFloor OAK_SIGN()
* @method static ItemBlockWallOrFloor OMINOUS_BANNER()
* @method static PaintingItem PAINTING()
* @method static HangingSign PALE_OAK_HANGING_SIGN()
* @method static ItemBlockWallOrFloor PALE_OAK_SIGN()
* @method static Item PAPER()
* @method static Item PHANTOM_MEMBRANE()
@ -308,6 +317,7 @@ use function strtolower;
* @method static Item SPIRE_ARMOR_TRIM_SMITHING_TEMPLATE()
* @method static SplashPotion SPLASH_POTION()
* @method static Boat SPRUCE_BOAT()
* @method static HangingSign SPRUCE_HANGING_SIGN()
* @method static ItemBlockWallOrFloor SPRUCE_SIGN()
* @method static Spyglass SPYGLASS()
* @method static SpawnEgg SQUID_SPAWN_EGG()
@ -329,6 +339,7 @@ use function strtolower;
* @method static Item VEX_ARMOR_TRIM_SMITHING_TEMPLATE()
* @method static SpawnEgg VILLAGER_SPAWN_EGG()
* @method static Item WARD_ARMOR_TRIM_SMITHING_TEMPLATE()
* @method static HangingSign WARPED_HANGING_SIGN()
* @method static ItemBlockWallOrFloor WARPED_SIGN()
* @method static LiquidBucket WATER_BUCKET()
* @method static Item WAYFINDER_ARMOR_TRIM_SMITHING_TEMPLATE()
@ -398,6 +409,7 @@ final class VanillaItems{
self::_registryRegister("air", Blocks::AIR()->asItem()->setCount(0));
self::register("acacia_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::ACACIA_SIGN(), Blocks::ACACIA_WALL_SIGN()));
self::register("acacia_hanging_sign", fn(IID $id) => new HangingSign($id, "Acacia Hanging Sign", Blocks::ACACIA_CEILING_CENTER_HANGING_SIGN(), Blocks::ACACIA_CEILING_EDGES_HANGING_SIGN(), Blocks::ACACIA_WALL_HANGING_SIGN()));
self::register("amethyst_shard", fn(IID $id) => new Item($id, "Amethyst Shard"));
self::register("apple", fn(IID $id) => new Apple($id, "Apple"));
self::register("arrow", fn(IID $id) => new Arrow($id, "Arrow"));
@ -408,6 +420,7 @@ final class VanillaItems{
self::register("beetroot_seeds", fn(IID $id) => new BeetrootSeeds($id, "Beetroot Seeds"));
self::register("beetroot_soup", fn(IID $id) => new BeetrootSoup($id, "Beetroot Soup"));
self::register("birch_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::BIRCH_SIGN(), Blocks::BIRCH_WALL_SIGN()));
self::register("birch_hanging_sign", fn(IID $id) => new HangingSign($id, "Birch Hanging Sign", Blocks::BIRCH_CEILING_CENTER_HANGING_SIGN(), Blocks::BIRCH_CEILING_EDGES_HANGING_SIGN(), Blocks::BIRCH_WALL_HANGING_SIGN()));
self::register("blaze_powder", fn(IID $id) => new Item($id, "Blaze Powder"));
self::register("blaze_rod", fn(IID $id) => new BlazeRod($id, "Blaze Rod"));
self::register("bleach", fn(IID $id) => new Item($id, "Bleach"));
@ -422,6 +435,7 @@ final class VanillaItems{
self::register("carrot", fn(IID $id) => new Carrot($id, "Carrot"));
self::register("charcoal", fn(IID $id) => new Coal($id, "Charcoal"));
self::register("cherry_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::CHERRY_SIGN(), Blocks::CHERRY_WALL_SIGN()));
self::register("cherry_hanging_sign", fn(IID $id) => new HangingSign($id, "Cherry Hanging Sign", Blocks::CHERRY_CEILING_CENTER_HANGING_SIGN(), Blocks::CHERRY_CEILING_EDGES_HANGING_SIGN(), Blocks::CHERRY_WALL_HANGING_SIGN()));
self::register("chemical_aluminium_oxide", fn(IID $id) => new Item($id, "Aluminium Oxide"));
self::register("chemical_ammonia", fn(IID $id) => new Item($id, "Ammonia"));
self::register("chemical_barium_sulphate", fn(IID $id) => new Item($id, "Barium Sulphate"));
@ -477,7 +491,9 @@ final class VanillaItems{
self::register("copper_ingot", fn(IID $id) => new Item($id, "Copper Ingot"));
self::register("coral_fan", fn(IID $id) => new CoralFan($id));
self::register("crimson_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::CRIMSON_SIGN(), Blocks::CRIMSON_WALL_SIGN()));
self::register("crimson_hanging_sign", fn(IID $id) => new HangingSign($id, "Crimson Hanging Sign", Blocks::CRIMSON_CEILING_CENTER_HANGING_SIGN(), Blocks::CRIMSON_CEILING_EDGES_HANGING_SIGN(), Blocks::CRIMSON_WALL_HANGING_SIGN()));
self::register("dark_oak_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::DARK_OAK_SIGN(), Blocks::DARK_OAK_WALL_SIGN()));
self::register("dark_oak_hanging_sign", fn(IID $id) => new HangingSign($id, "Dark Oak Hanging Sign", Blocks::DARK_OAK_CEILING_CENTER_HANGING_SIGN(), Blocks::DARK_OAK_CEILING_EDGES_HANGING_SIGN(), Blocks::DARK_OAK_WALL_HANGING_SIGN()));
self::register("diamond", fn(IID $id) => new Item($id, "Diamond"));
self::register("disc_fragment_5", fn(IID $id) => new Item($id, "Disc Fragment (5)"));
self::register("dragon_breath", fn(IID $id) => new Item($id, "Dragon's Breath"));
@ -518,11 +534,13 @@ final class VanillaItems{
self::register("iron_ingot", fn(IID $id) => new Item($id, "Iron Ingot"));
self::register("iron_nugget", fn(IID $id) => new Item($id, "Iron Nugget"));
self::register("jungle_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::JUNGLE_SIGN(), Blocks::JUNGLE_WALL_SIGN()));
self::register("jungle_hanging_sign", fn(IID $id) => new HangingSign($id, "Jungle Hanging Sign", Blocks::JUNGLE_CEILING_CENTER_HANGING_SIGN(), Blocks::JUNGLE_CEILING_EDGES_HANGING_SIGN(), Blocks::JUNGLE_WALL_HANGING_SIGN()));
self::register("lapis_lazuli", fn(IID $id) => new Item($id, "Lapis Lazuli"));
self::register("lava_bucket", fn(IID $id) => new LiquidBucket($id, "Lava Bucket", Blocks::LAVA()));
self::register("leather", fn(IID $id) => new Item($id, "Leather"));
self::register("magma_cream", fn(IID $id) => new Item($id, "Magma Cream"));
self::register("mangrove_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::MANGROVE_SIGN(), Blocks::MANGROVE_WALL_SIGN()));
self::register("mangrove_hanging_sign", fn(IID $id) => new HangingSign($id, "Mangrove Hanging Sign", Blocks::MANGROVE_CEILING_CENTER_HANGING_SIGN(), Blocks::MANGROVE_CEILING_EDGES_HANGING_SIGN(), Blocks::MANGROVE_WALL_HANGING_SIGN()));
self::register("medicine", fn(IID $id) => new Medicine($id, "Medicine"));
self::register("melon", fn(IID $id) => new Melon($id, "Melon"));
self::register("melon_seeds", fn(IID $id) => new MelonSeeds($id, "Melon Seeds"));
@ -541,9 +559,11 @@ final class VanillaItems{
public function isFireProof() : bool{ return true; }
});
self::register("oak_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::OAK_SIGN(), Blocks::OAK_WALL_SIGN()));
self::register("oak_hanging_sign", fn(IID $id) => new HangingSign($id, "Oak Hanging Sign", Blocks::OAK_CEILING_CENTER_HANGING_SIGN(), Blocks::OAK_CEILING_EDGES_HANGING_SIGN(), Blocks::OAK_WALL_HANGING_SIGN()));
self::register("ominous_banner", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::OMINOUS_BANNER(), Blocks::OMINOUS_WALL_BANNER()));
self::register("painting", fn(IID $id) => new PaintingItem($id, "Painting"));
self::register("pale_oak_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::PALE_OAK_SIGN(), Blocks::PALE_OAK_WALL_SIGN()));
self::register("pale_oak_hanging_sign", fn(IID $id) => new HangingSign($id, "Pale Oak Hanging Sign", Blocks::PALE_OAK_CEILING_CENTER_HANGING_SIGN(), Blocks::PALE_OAK_CEILING_EDGES_HANGING_SIGN(), Blocks::PALE_OAK_WALL_HANGING_SIGN()));
self::register("paper", fn(IID $id) => new Item($id, "Paper"));
self::register("phantom_membrane", fn(IID $id) => new Item($id, "Phantom Membrane"));
self::register("pitcher_pod", fn(IID $id) => new PitcherPod($id, "Pitcher Pod"));
@ -600,6 +620,7 @@ final class VanillaItems{
self::register("spider_eye", fn(IID $id) => new SpiderEye($id, "Spider Eye"));
self::register("splash_potion", fn(IID $id) => new SplashPotion($id, "Splash Potion"));
self::register("spruce_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::SPRUCE_SIGN(), Blocks::SPRUCE_WALL_SIGN()));
self::register("spruce_hanging_sign", fn(IID $id) => new HangingSign($id, "Spruce Hanging Sign", Blocks::SPRUCE_CEILING_CENTER_HANGING_SIGN(), Blocks::SPRUCE_CEILING_EDGES_HANGING_SIGN(), Blocks::SPRUCE_WALL_HANGING_SIGN()));
self::register("spyglass", fn(IID $id) => new Spyglass($id, "Spyglass"));
self::register("steak", fn(IID $id) => new Steak($id, "Steak"));
self::register("stick", fn(IID $id) => new Stick($id, "Stick"));
@ -610,6 +631,7 @@ final class VanillaItems{
self::register("torchflower_seeds", fn(IID $id) => new TorchflowerSeeds($id, "Torchflower Seeds"));
self::register("totem", fn(IID $id) => new Totem($id, "Totem of Undying"));
self::register("warped_sign", fn(IID $id) => new ItemBlockWallOrFloor($id, Blocks::WARPED_SIGN(), Blocks::WARPED_WALL_SIGN()));
self::register("warped_hanging_sign", fn(IID $id) => new HangingSign($id, "Warped Hanging Sign", Blocks::WARPED_CEILING_CENTER_HANGING_SIGN(), Blocks::WARPED_CEILING_EDGES_HANGING_SIGN(), Blocks::WARPED_WALL_HANGING_SIGN()));
self::register("water_bucket", fn(IID $id) => new LiquidBucket($id, "Water Bucket", Blocks::WATER()));
self::register("wheat", fn(IID $id) => new Item($id, "Wheat"));
self::register("wheat_seeds", fn(IID $id) => new WheatSeeds($id, "Wheat Seeds"));

View File

@ -2298,7 +2298,7 @@ class World implements ChunkManager{
if($item->isNull() || !$item->canBePlaced()){
return false;
}
$hand = $item->getBlock($face);
$hand = $item->getPlacementBlock($blockReplace, $blockClicked, $face, $clickVector);
$hand->position($this, $blockReplace->getPosition()->x, $blockReplace->getPosition()->y, $blockReplace->getPosition()->z);
if($hand->canBePlacedAt($blockClicked, $clickVector, $face, true)){

View File

@ -1,6 +1,8 @@
{
"stateCounts": {
"ACACIA_BUTTON": 12,
"ACACIA_CEILING_CENTER_HANGING_SIGN": 16,
"ACACIA_CEILING_EDGES_HANGING_SIGN": 4,
"ACACIA_DOOR": 32,
"ACACIA_FENCE": 1,
"ACACIA_FENCE_GATE": 16,
@ -13,6 +15,7 @@
"ACACIA_SLAB": 3,
"ACACIA_STAIRS": 8,
"ACACIA_TRAPDOOR": 16,
"ACACIA_WALL_HANGING_SIGN": 4,
"ACACIA_WALL_SIGN": 4,
"ACACIA_WOOD": 6,
"ACTIVATOR_RAIL": 12,
@ -43,6 +46,8 @@
"BIG_DRIPLEAF_HEAD": 16,
"BIG_DRIPLEAF_STEM": 4,
"BIRCH_BUTTON": 12,
"BIRCH_CEILING_CENTER_HANGING_SIGN": 16,
"BIRCH_CEILING_EDGES_HANGING_SIGN": 4,
"BIRCH_DOOR": 32,
"BIRCH_FENCE": 1,
"BIRCH_FENCE_GATE": 16,
@ -55,6 +60,7 @@
"BIRCH_SLAB": 3,
"BIRCH_STAIRS": 8,
"BIRCH_TRAPDOOR": 16,
"BIRCH_WALL_HANGING_SIGN": 4,
"BIRCH_WALL_SIGN": 4,
"BIRCH_WOOD": 6,
"BLACKSTONE": 1,
@ -91,6 +97,8 @@
"CHAIN": 3,
"CHEMICAL_HEAT": 1,
"CHERRY_BUTTON": 12,
"CHERRY_CEILING_CENTER_HANGING_SIGN": 16,
"CHERRY_CEILING_EDGES_HANGING_SIGN": 4,
"CHERRY_DOOR": 32,
"CHERRY_FENCE": 1,
"CHERRY_FENCE_GATE": 16,
@ -102,6 +110,7 @@
"CHERRY_SLAB": 3,
"CHERRY_STAIRS": 8,
"CHERRY_TRAPDOOR": 16,
"CHERRY_WALL_HANGING_SIGN": 4,
"CHERRY_WALL_SIGN": 4,
"CHERRY_WOOD": 6,
"CHEST": 4,
@ -152,6 +161,8 @@
"CRACKED_STONE_BRICKS": 1,
"CRAFTING_TABLE": 1,
"CRIMSON_BUTTON": 12,
"CRIMSON_CEILING_CENTER_HANGING_SIGN": 16,
"CRIMSON_CEILING_EDGES_HANGING_SIGN": 4,
"CRIMSON_DOOR": 32,
"CRIMSON_FENCE": 1,
"CRIMSON_FENCE_GATE": 16,
@ -164,6 +175,7 @@
"CRIMSON_STAIRS": 8,
"CRIMSON_STEM": 6,
"CRIMSON_TRAPDOOR": 16,
"CRIMSON_WALL_HANGING_SIGN": 4,
"CRIMSON_WALL_SIGN": 4,
"CRYING_OBSIDIAN": 1,
"CUT_COPPER": 8,
@ -175,6 +187,8 @@
"CUT_SANDSTONE_SLAB": 3,
"DANDELION": 1,
"DARK_OAK_BUTTON": 12,
"DARK_OAK_CEILING_CENTER_HANGING_SIGN": 16,
"DARK_OAK_CEILING_EDGES_HANGING_SIGN": 4,
"DARK_OAK_DOOR": 32,
"DARK_OAK_FENCE": 1,
"DARK_OAK_FENCE_GATE": 16,
@ -187,6 +201,7 @@
"DARK_OAK_SLAB": 3,
"DARK_OAK_STAIRS": 8,
"DARK_OAK_TRAPDOOR": 16,
"DARK_OAK_WALL_HANGING_SIGN": 4,
"DARK_OAK_WALL_SIGN": 4,
"DARK_OAK_WOOD": 6,
"DARK_PRISMARINE": 1,
@ -409,6 +424,8 @@
"ITEM_FRAME": 12,
"JUKEBOX": 1,
"JUNGLE_BUTTON": 12,
"JUNGLE_CEILING_CENTER_HANGING_SIGN": 16,
"JUNGLE_CEILING_EDGES_HANGING_SIGN": 4,
"JUNGLE_DOOR": 32,
"JUNGLE_FENCE": 1,
"JUNGLE_FENCE_GATE": 16,
@ -421,6 +438,7 @@
"JUNGLE_SLAB": 3,
"JUNGLE_STAIRS": 8,
"JUNGLE_TRAPDOOR": 16,
"JUNGLE_WALL_HANGING_SIGN": 4,
"JUNGLE_WALL_SIGN": 4,
"JUNGLE_WOOD": 6,
"LAB_TABLE": 4,
@ -443,6 +461,8 @@
"LOOM": 4,
"MAGMA": 1,
"MANGROVE_BUTTON": 12,
"MANGROVE_CEILING_CENTER_HANGING_SIGN": 16,
"MANGROVE_CEILING_EDGES_HANGING_SIGN": 4,
"MANGROVE_DOOR": 32,
"MANGROVE_FENCE": 1,
"MANGROVE_FENCE_GATE": 16,
@ -455,6 +475,7 @@
"MANGROVE_SLAB": 3,
"MANGROVE_STAIRS": 8,
"MANGROVE_TRAPDOOR": 16,
"MANGROVE_WALL_HANGING_SIGN": 4,
"MANGROVE_WALL_SIGN": 4,
"MANGROVE_WOOD": 6,
"MATERIAL_REDUCER": 4,
@ -493,6 +514,8 @@
"NETHER_WART_BLOCK": 1,
"NOTE_BLOCK": 1,
"OAK_BUTTON": 12,
"OAK_CEILING_CENTER_HANGING_SIGN": 16,
"OAK_CEILING_EDGES_HANGING_SIGN": 4,
"OAK_DOOR": 32,
"OAK_FENCE": 1,
"OAK_FENCE_GATE": 16,
@ -505,6 +528,7 @@
"OAK_SLAB": 3,
"OAK_STAIRS": 8,
"OAK_TRAPDOOR": 16,
"OAK_WALL_HANGING_SIGN": 4,
"OAK_WALL_SIGN": 4,
"OAK_WOOD": 6,
"OBSIDIAN": 1,
@ -515,6 +539,8 @@
"PACKED_ICE": 1,
"PACKED_MUD": 1,
"PALE_OAK_BUTTON": 12,
"PALE_OAK_CEILING_CENTER_HANGING_SIGN": 16,
"PALE_OAK_CEILING_EDGES_HANGING_SIGN": 4,
"PALE_OAK_DOOR": 32,
"PALE_OAK_FENCE": 1,
"PALE_OAK_FENCE_GATE": 16,
@ -526,6 +552,7 @@
"PALE_OAK_SLAB": 3,
"PALE_OAK_STAIRS": 8,
"PALE_OAK_TRAPDOOR": 16,
"PALE_OAK_WALL_HANGING_SIGN": 4,
"PALE_OAK_WALL_SIGN": 4,
"PALE_OAK_WOOD": 6,
"PEONY": 2,
@ -656,6 +683,8 @@
"SPONGE": 2,
"SPORE_BLOSSOM": 1,
"SPRUCE_BUTTON": 12,
"SPRUCE_CEILING_CENTER_HANGING_SIGN": 16,
"SPRUCE_CEILING_EDGES_HANGING_SIGN": 4,
"SPRUCE_DOOR": 32,
"SPRUCE_FENCE": 1,
"SPRUCE_FENCE_GATE": 16,
@ -668,6 +697,7 @@
"SPRUCE_SLAB": 3,
"SPRUCE_STAIRS": 8,
"SPRUCE_TRAPDOOR": 16,
"SPRUCE_WALL_HANGING_SIGN": 4,
"SPRUCE_WALL_SIGN": 4,
"SPRUCE_WOOD": 6,
"STAINED_CLAY": 16,
@ -711,6 +741,8 @@
"WALL_BANNER": 64,
"WALL_CORAL_FAN": 40,
"WARPED_BUTTON": 12,
"WARPED_CEILING_CENTER_HANGING_SIGN": 16,
"WARPED_CEILING_EDGES_HANGING_SIGN": 4,
"WARPED_DOOR": 32,
"WARPED_FENCE": 1,
"WARPED_FENCE_GATE": 16,
@ -723,6 +755,7 @@
"WARPED_STAIRS": 8,
"WARPED_STEM": 6,
"WARPED_TRAPDOOR": 16,
"WARPED_WALL_HANGING_SIGN": 4,
"WARPED_WALL_SIGN": 4,
"WARPED_WART_BLOCK": 1,
"WATER": 32,
@ -736,26 +769,41 @@
"WOOL": 16
},
"tiles": {
"ACACIA_CEILING_CENTER_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"ACACIA_CEILING_EDGES_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"ACACIA_SIGN": "pocketmine\\block\\tile\\Sign",
"ACACIA_WALL_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"ACACIA_WALL_SIGN": "pocketmine\\block\\tile\\Sign",
"BANNER": "pocketmine\\block\\tile\\Banner",
"BARREL": "pocketmine\\block\\tile\\Barrel",
"BEACON": "pocketmine\\block\\tile\\Beacon",
"BED": "pocketmine\\block\\tile\\Bed",
"BELL": "pocketmine\\block\\tile\\Bell",
"BIRCH_CEILING_CENTER_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"BIRCH_CEILING_EDGES_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"BIRCH_SIGN": "pocketmine\\block\\tile\\Sign",
"BIRCH_WALL_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"BIRCH_WALL_SIGN": "pocketmine\\block\\tile\\Sign",
"BLAST_FURNACE": "pocketmine\\block\\tile\\BlastFurnace",
"BREWING_STAND": "pocketmine\\block\\tile\\BrewingStand",
"CAMPFIRE": "pocketmine\\block\\tile\\Campfire",
"CAULDRON": "pocketmine\\block\\tile\\Cauldron",
"CHERRY_CEILING_CENTER_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"CHERRY_CEILING_EDGES_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"CHERRY_SIGN": "pocketmine\\block\\tile\\Sign",
"CHERRY_WALL_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"CHERRY_WALL_SIGN": "pocketmine\\block\\tile\\Sign",
"CHEST": "pocketmine\\block\\tile\\Chest",
"CHISELED_BOOKSHELF": "pocketmine\\block\\tile\\ChiseledBookshelf",
"CRIMSON_CEILING_CENTER_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"CRIMSON_CEILING_EDGES_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"CRIMSON_SIGN": "pocketmine\\block\\tile\\Sign",
"CRIMSON_WALL_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"CRIMSON_WALL_SIGN": "pocketmine\\block\\tile\\Sign",
"DARK_OAK_CEILING_CENTER_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"DARK_OAK_CEILING_EDGES_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"DARK_OAK_SIGN": "pocketmine\\block\\tile\\Sign",
"DARK_OAK_WALL_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"DARK_OAK_WALL_SIGN": "pocketmine\\block\\tile\\Sign",
"DAYLIGHT_SENSOR": "pocketmine\\block\\tile\\DaylightSensor",
"DYED_SHULKER_BOX": "pocketmine\\block\\tile\\ShulkerBox",
@ -767,31 +815,49 @@
"HOPPER": "pocketmine\\block\\tile\\Hopper",
"ITEM_FRAME": "pocketmine\\block\\tile\\ItemFrame",
"JUKEBOX": "pocketmine\\block\\tile\\Jukebox",
"JUNGLE_CEILING_CENTER_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"JUNGLE_CEILING_EDGES_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"JUNGLE_SIGN": "pocketmine\\block\\tile\\Sign",
"JUNGLE_WALL_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"JUNGLE_WALL_SIGN": "pocketmine\\block\\tile\\Sign",
"LAVA_CAULDRON": "pocketmine\\block\\tile\\Cauldron",
"LECTERN": "pocketmine\\block\\tile\\Lectern",
"MANGROVE_CEILING_CENTER_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"MANGROVE_CEILING_EDGES_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"MANGROVE_SIGN": "pocketmine\\block\\tile\\Sign",
"MANGROVE_WALL_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"MANGROVE_WALL_SIGN": "pocketmine\\block\\tile\\Sign",
"MOB_HEAD": "pocketmine\\block\\tile\\MobHead",
"MONSTER_SPAWNER": "pocketmine\\block\\tile\\MonsterSpawner",
"NOTE_BLOCK": "pocketmine\\block\\tile\\Note",
"OAK_CEILING_CENTER_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"OAK_CEILING_EDGES_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"OAK_SIGN": "pocketmine\\block\\tile\\Sign",
"OAK_WALL_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"OAK_WALL_SIGN": "pocketmine\\block\\tile\\Sign",
"OMINOUS_BANNER": "pocketmine\\block\\tile\\Banner",
"OMINOUS_WALL_BANNER": "pocketmine\\block\\tile\\Banner",
"PALE_OAK_CEILING_CENTER_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"PALE_OAK_CEILING_EDGES_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"PALE_OAK_SIGN": "pocketmine\\block\\tile\\Sign",
"PALE_OAK_WALL_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"PALE_OAK_WALL_SIGN": "pocketmine\\block\\tile\\Sign",
"POTION_CAULDRON": "pocketmine\\block\\tile\\Cauldron",
"REDSTONE_COMPARATOR": "pocketmine\\block\\tile\\Comparator",
"SHULKER_BOX": "pocketmine\\block\\tile\\ShulkerBox",
"SMOKER": "pocketmine\\block\\tile\\Smoker",
"SOUL_CAMPFIRE": "pocketmine\\block\\tile\\Campfire",
"SPRUCE_CEILING_CENTER_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"SPRUCE_CEILING_EDGES_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"SPRUCE_SIGN": "pocketmine\\block\\tile\\Sign",
"SPRUCE_WALL_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"SPRUCE_WALL_SIGN": "pocketmine\\block\\tile\\Sign",
"TRAPPED_CHEST": "pocketmine\\block\\tile\\Chest",
"WALL_BANNER": "pocketmine\\block\\tile\\Banner",
"WARPED_CEILING_CENTER_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"WARPED_CEILING_EDGES_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"WARPED_SIGN": "pocketmine\\block\\tile\\Sign",
"WARPED_WALL_HANGING_SIGN": "pocketmine\\block\\tile\\HangingSign",
"WARPED_WALL_SIGN": "pocketmine\\block\\tile\\Sign",
"WATER_CAULDRON": "pocketmine\\block\\tile\\Cauldron"
}