NBT tags storing block positions or entity UUIDs are not written and read correctly in structures
The bug
NBT tags of entities and tile entities which refer to block positions or entity UUIDs are not treated specially. This causes entities to spawn at the old position where they were saved or entities to refer to other entities which do not exist anymore because new UUIDs were assigned.
NBT tag detecting
The problem is that currently not every NBT tag has its own data parameter and the data parameter does not contain information about what it actually stores. Because of that these tags need to be hardcoded.
If at some point every tag has its own data parameter, it could contain information like:
- UUID of self
- UUID of other
- Position of self
- ...
and then there could be a single method which removes tags with "Position of self" and save "Position of other" as relative coordinates.
Possible structure file representation
Affected tags (last updated for 16w39c)
Entities
- Entity (class)
- Pos
- EntityLiving (class)
- Leash
- X, Y, Z
- UUIDMost
- UUIDLeast
- Leash
- horse
- OwnerUUID
- llama
- OwnerUUID
- EntityTameable (class)
- OwnerUUID
- zombie_pigman
- HurtBy
- shulker
- APX, APY, APZ
- vex
- BoundX, BoundY, BoundZ
- EntityThrowable (class), EntityArrow (class), EntityFireball (class), (EntityFishHook (class))
- xTile, yTile, zTile
- area_effect_cloud
- OwnerUUIDMost, OwnerUUIDLeast
- ender_crystal
- BeamTarget
- X, Y, Z
- BeamTarget
- item_frame, painting
- TileX, TileY, TileZ
- shulker_bullet
- Owner
- L, M
- X, Y, Z
- Target
- L, M
- X, Y, Z
- Owner
Tile Entities
- TileEntity (class)
- x, y, z
- end_gateway
- ExitPortal
- X, Y, Z
- ExitPortal
Nested data
Entities
- Entity (class)
- Passengers
- spawner_minecart
- SpawnData
- SpawnPotentials
- Entity
- falling_block
- TileEntityData
- item
- Item
- potion
- Potion
- donkey, llama, mule
- Items
- Horse types
- SaddleItem
- llama
- DecorItem
- horse
- ArmorItem
- item_frame
- Item
- chest_minecart, hopper_minecart
- Items
- fireworks_rocket
- FireworksItem
- EntityLiving (class), armor_stand
- ArmorItems
- HandItems
- villager
- Inventory
- Recipes
- List entry:
- buy
- buyB
- sell
- List entry:
Tile entities
- mob_spawner
- SpawnData
- SpawnPotentials
- Entity
- brewing_stand, furnace, shulker_box, hopper, dropper, chest
- Items
- jukebox
- RecordItem
- beacon
- PaymentItem
Items
- Block item creating tile entity
- BlockEntityTag
- Items spawning entities
- EntityTag
Commands (?)
Entities
- commandblock_minecart
- Command
Tile entities
- command_block
- Command
- sign
- Text1, Text2, Text3, Text4
Items
- written_book
- pages