Skip to content
24 changes: 21 additions & 3 deletions src/main/java/ch/njol/skript/aliases/ItemType.java
Original file line number Diff line number Diff line change
Expand Up @@ -408,19 +408,37 @@ public boolean setBlock(Block block, boolean applyPhysics) {
return false;
}

private static final boolean ITEMMETA_CUSTOMNAME_EXISTS = Skript.methodExists(ItemMeta.class, "customName");

/**
* Copies the container state from the item meta to the block state
* @param block The block to copy the state to
* @param itemMeta The item meta to copy the state from
*/
private void copyContainerState(@NotNull Block block, @NotNull ItemMeta itemMeta) {
// only copy container state if block is container
if (!(block.getState() instanceof org.bukkit.block.Container blockContainer))
return;

//copy name from itemmeta to block container
if (ITEMMETA_CUSTOMNAME_EXISTS) {
if (itemMeta.hasCustomName()) {
blockContainer.customName(itemMeta.customName());
blockContainer.update();
}
} else {
if (itemMeta.hasDisplayName()) {
blockContainer.customName(itemMeta.displayName());
blockContainer.update();
}
}

// ensure the item has a block state
if (!(itemMeta instanceof BlockStateMeta blockStateMeta) || !blockStateMeta.hasBlockState())
return;

// only care about container -> container copying
if (!(blockStateMeta.getBlockState() instanceof org.bukkit.block.Container itemContainer)
|| !(block.getState() instanceof org.bukkit.block.Container blockContainer))
// only copy inventory if itemmeta block state is a container
if (!(blockStateMeta.getBlockState() instanceof org.bukkit.block.Container itemContainer))
return;

// copy inventory from item to block
Expand Down
11 changes: 11 additions & 0 deletions src/test/skript/tests/syntaxes/expressions/ExprBlock.sk
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
test "block chest":
set {_loc} to location(10, 10, 10)
set {_item} to a chest
set name of {_item} to "&6Chest"
add 5 diamonds to inventory of {_item}
set block at {_loc} to {_item}
assert block at {_loc} is a chest with "chest was not placed"
assert name of block at {_loc} is "&6Chest" with "chest name was not copied from item"
assert inventory of block at {_loc} contains 5 diamonds with "chest inventory was not copied from item"
clear block at {_loc}