PowerNukkit / Java2Nukkit-World-Converter

Converts worlds from Minecraft 1.15.2+ Java Edition to the newest Nukkit MCA file format
MIT License
23 stars 6 forks source link

Item's CanDestroy and CanPlaceOn don't migrate properly #18

Closed joserobjr closed 5 years ago

joserobjr commented 5 years ago

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

joserobjr commented 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] =>
)
joserobjr commented 5 years ago

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

joserobjr commented 5 years ago

I fixed it in Nukkit, waiting the pull request to be accepted. https://github.com/NukkitX/Nukkit/pull/719