PaperMC / Paper

The most widely used, high performance Minecraft server that aims to fix gameplay and mechanics inconsistencies
https://papermc.io/
Other
10.05k stars 2.34k forks source link

BlockState#copy() does not infer block entity #11700

Open YouHaveTrouble opened 10 hours ago

YouHaveTrouble commented 10 hours ago

Expected behavior

BlockState copy = blockState.copy(location);
copy.update(true, true)

This should set the block type and copy over all block entity data like inventories, bee data, etc.

Observed/Actual behavior

Snippet above only properly sets the block type and does not copy over the block entity data. Throws following warning Skipping BlockEntity with id.

Steps/models to reproduce

Run this snippet with any valid input as blockState and location

BlockState copy = blockState.copy(location);
copy.update(true, true)

Plugin and Datapack List

Issue occurs with only the plugin I'm testing with

Server Plugins (1): Paper Plugins: BlockEdit

Datapacks: There are 3 data pack(s) enabled: [vanilla (built-in)], [file/bukkit (world)], [paper (built-in)] There are no more data packs available

Paper version

This server is running Paper version 1.21.3-77-master@1e035f3 (2024-12-01T15:52:35Z) (Implementing API version 1.21.3-R0.1-SNAPSHOT)

Other

No response

lynxplay commented 10 hours ago

TLDR rundown for anyone tackling this, the argument provider uses CraftBlockStates#getBlockState, which internally uses BlockEntity.loadStatic. That method is wrong, as the passed compound tag needs to have the BE id, which the arguments do not have to specify.

Instead, we should create the block entity if a tag is present from the blockdata/blockstate and then load from the tag.