Closed joserobjr closed 5 years ago
Using a "hacked" PocketMine-MP to read a real save from Windows 10 Edition, I was able to extract a Chest tile entity which contains item stacks with valid CanDestroy and CanPlaceOn tags.
pocketmine\nbt\tag\CompoundTag Object
(
[value:pocketmine\nbt\tag\CompoundTag:private] => Array
(
[Findable] => pocketmine\nbt\tag\ByteTag Object
(
[value:pocketmine\nbt\tag\ByteTag:private] => 0
[__name:protected] => Findable
[cloning:protected] =>
)
[Items] => pocketmine\nbt\tag\ListTag Object
(
[tagType:pocketmine\nbt\tag\ListTag:private] => 10
[value:pocketmine\nbt\tag\ListTag:private] => SplDoublyLinkedList Object
(
[flags:SplDoublyLinkedList:private] => 0
[dllist:SplDoublyLinkedList:private] => Array
(
[0] => pocketmine\nbt\tag\CompoundTag Object
(
[value:pocketmine\nbt\tag\CompoundTag:private] => Array
(
[CanDestroy] => pocketmine\nbt\tag\ListTag Object
(
[tagType:pocketmine\nbt\tag\ListTag:private] => 8
[value:pocketmine\nbt\tag\ListTag:private] => SplDoublyLinkedList Object
(
[flags:SplDoublyLinkedList:private] => 0
[dllist:SplDoublyLinkedList:private] => Array
(
[0] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => stone
[__name:protected] =>
[cloning:protected] =>
)
)
)
[__name:protected] => CanDestroy
[cloning:protected] =>
)
[Count] => pocketmine\nbt\tag\ByteTag Object
(
[value:pocketmine\nbt\tag\ByteTag:private] => 1
[__name:protected] => Count
[cloning:protected] =>
)
[Damage] => pocketmine\nbt\tag\ShortTag Object
(
[value:pocketmine\nbt\tag\ShortTag:private] => 0
[__name:protected] => Damage
[cloning:protected] =>
)
[Name] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => minecraft:diamond_pickaxe
[__name:protected] => Name
[cloning:protected] =>
)
[Slot] => pocketmine\nbt\tag\ByteTag Object
(
[value:pocketmine\nbt\tag\ByteTag:private] => 0
[__name:protected] => Slot
[cloning:protected] =>
)
)
[__name:protected] =>
[cloning:protected] =>
)
[1] => pocketmine\nbt\tag\CompoundTag Object
(
[value:pocketmine\nbt\tag\CompoundTag:private] => Array
(
[Block] => pocketmine\nbt\tag\CompoundTag Object
(
[value:pocketmine\nbt\tag\CompoundTag:private] => Array
(
[name] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => minecraft:stone
[__name:protected] => name
[cloning:protected] =>
)
[states] => pocketmine\nbt\tag\CompoundTag Object
(
[value:pocketmine\nbt\tag\CompoundTag:private] => Array
(
[stone_type] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => stone
[__name:protected] => stone_type
[cloning:protected] =>
)
)
[__name:protected] => states
[cloning:protected] =>
)
[version] => pocketmine\nbt\tag\IntTag Object
(
[value:pocketmine\nbt\tag\IntTag:private] => 17432626
[__name:protected] => version
[cloning:protected] =>
)
)
[__name:protected] => Block
[cloning:protected] =>
)
[CanPlaceOn] => pocketmine\nbt\tag\ListTag Object
(
[tagType:pocketmine\nbt\tag\ListTag:private] => 8
[value:pocketmine\nbt\tag\ListTag:private] => SplDoublyLinkedList Object
(
[flags:SplDoublyLinkedList:private] => 0
[dllist:SplDoublyLinkedList:private] => Array
(
[0] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => dirt
[__name:protected] =>
[cloning:protected] =>
)
[1] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => grass
[__name:protected] =>
[cloning:protected] =>
)
)
)
[__name:protected] => CanPlaceOn
[cloning:protected] =>
)
[Count] => pocketmine\nbt\tag\ByteTag Object
(
[value:pocketmine\nbt\tag\ByteTag:private] => 1
[__name:protected] => Count
[cloning:protected] =>
)
[Damage] => pocketmine\nbt\tag\ShortTag Object
(
[value:pocketmine\nbt\tag\ShortTag:private] => 0
[__name:protected] => Damage
[cloning:protected] =>
)
[Name] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => minecraft:stone
[__name:protected] => Name
[cloning:protected] =>
)
[Slot] => pocketmine\nbt\tag\ByteTag Object
(
[value:pocketmine\nbt\tag\ByteTag:private] => 1
[__name:protected] => Slot
[cloning:protected] =>
)
)
[__name:protected] =>
[cloning:protected] =>
)
[2] => pocketmine\nbt\tag\CompoundTag Object
(
[value:pocketmine\nbt\tag\CompoundTag:private] => Array
(
[CanDestroy] => pocketmine\nbt\tag\ListTag Object
(
[tagType:pocketmine\nbt\tag\ListTag:private] => 8
[value:pocketmine\nbt\tag\ListTag:private] => SplDoublyLinkedList Object
(
[flags:SplDoublyLinkedList:private] => 0
[dllist:SplDoublyLinkedList:private] => Array
(
[0] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => dirt
[__name:protected] =>
[cloning:protected] =>
)
[1] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => grass
[__name:protected] =>
[cloning:protected] =>
)
)
)
[__name:protected] => CanDestroy
[cloning:protected] =>
)
[Count] => pocketmine\nbt\tag\ByteTag Object
(
[value:pocketmine\nbt\tag\ByteTag:private] => 1
[__name:protected] => Count
[cloning:protected] =>
)
[Damage] => pocketmine\nbt\tag\ShortTag Object
(
[value:pocketmine\nbt\tag\ShortTag:private] => 0
[__name:protected] => Damage
[cloning:protected] =>
)
[Name] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => minecraft:iron_shovel
[__name:protected] => Name
[cloning:protected] =>
)
[Slot] => pocketmine\nbt\tag\ByteTag Object
(
[value:pocketmine\nbt\tag\ByteTag:private] => 2
[__name:protected] => Slot
[cloning:protected] =>
)
)
[__name:protected] =>
[cloning:protected] =>
)
[3] => pocketmine\nbt\tag\CompoundTag Object
(
[value:pocketmine\nbt\tag\CompoundTag:private] => Array
(
[Block] => pocketmine\nbt\tag\CompoundTag Object
(
[value:pocketmine\nbt\tag\CompoundTag:private] => Array
(
[name] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => minecraft:stone
[__name:protected] => name
[cloning:protected] =>
)
[states] => pocketmine\nbt\tag\CompoundTag Object
(
[value:pocketmine\nbt\tag\CompoundTag:private] => Array
(
[stone_type] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => stone
[__name:protected] => stone_type
[cloning:protected] =>
)
)
[__name:protected] => states
[cloning:protected] =>
)
[version] => pocketmine\nbt\tag\IntTag Object
(
[value:pocketmine\nbt\tag\IntTag:private] => 17432626
[__name:protected] => version
[cloning:protected] =>
)
)
[__name:protected] => Block
[cloning:protected] =>
)
[CanPlaceOn] => pocketmine\nbt\tag\ListTag Object
(
[tagType:pocketmine\nbt\tag\ListTag:private] => 8
[value:pocketmine\nbt\tag\ListTag:private] => SplDoublyLinkedList Object
(
[flags:SplDoublyLinkedList:private] => 0
[dllist:SplDoublyLinkedList:private] => Array
(
[0] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => stone
[__name:protected] =>
[cloning:protected] =>
)
)
)
[__name:protected] => CanPlaceOn
[cloning:protected] =>
)
[Count] => pocketmine\nbt\tag\ByteTag Object
(
[value:pocketmine\nbt\tag\ByteTag:private] => 1
[__name:protected] => Count
[cloning:protected] =>
)
[Damage] => pocketmine\nbt\tag\ShortTag Object
(
[value:pocketmine\nbt\tag\ShortTag:private] => 0
[__name:protected] => Damage
[cloning:protected] =>
)
[Name] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => minecraft:stone
[__name:protected] => Name
[cloning:protected] =>
)
[Slot] => pocketmine\nbt\tag\ByteTag Object
(
[value:pocketmine\nbt\tag\ByteTag:private] => 3
[__name:protected] => Slot
[cloning:protected] =>
)
)
[__name:protected] =>
[cloning:protected] =>
)
)
)
[__name:protected] => Items
[cloning:protected] =>
)
[id] => pocketmine\nbt\tag\StringTag Object
(
[value:pocketmine\nbt\tag\StringTag:private] => Chest
[__name:protected] => id
[cloning:protected] =>
)
[isMovable] => pocketmine\nbt\tag\ByteTag Object
(
[value:pocketmine\nbt\tag\ByteTag:private] => 1
[__name:protected] => isMovable
[cloning:protected] =>
)
[x] => pocketmine\nbt\tag\IntTag Object
(
[value:pocketmine\nbt\tag\IntTag:private] => 0
[__name:protected] => x
[cloning:protected] =>
)
[y] => pocketmine\nbt\tag\IntTag Object
(
[value:pocketmine\nbt\tag\IntTag:private] => 1
[__name:protected] => y
[cloning:protected] =>
)
[z] => pocketmine\nbt\tag\IntTag Object
(
[value:pocketmine\nbt\tag\IntTag:private] => 0
[__name:protected] => z
[cloning:protected] =>
)
)
[__name:protected] =>
[cloning:protected] =>
)
Unfortunately no fix will work because the tags are unsupported by Nukkit. https://github.com/NukkitX/Nukkit/blob/831348181341a38509f9740b2b219ec52a05714f/src/main/java/cn/nukkit/utils/BinaryStream.java#L340-L341
I fixed it in Nukkit, waiting the pull request to be accepted. https://github.com/NukkitX/Nukkit/pull/719
The remapped NBT tag is possibly incorrect. Nukkit's source also uses it incorrectly.
Some useful information: How to set the tags in vanilla Minecraft Bedrock Edition: https://gaming.stackexchange.com/questions/334102/how-do-you-add-nbt-tags-to-commands-in-minecraft-pocket-bedrock-edition https://minecraftbedrock.fandom.com/wiki/Thread:217291
How Nukkit is checking if the item have the tags: https://github.com/NukkitX/Nukkit/blob/5df39c2d694e403e81d59360ae09eb3fa576b61a/src/main/java/cn/nukkit/level/Level.java#L2067 https://github.com/NukkitX/Nukkit/blob/5df39c2d694e403e81d59360ae09eb3fa576b61a/src/main/java/cn/nukkit/level/Level.java#L1869