Skip to content

Commit 17e063a

Browse files
committed
cleanup block data
This also fixes the STRING_DATA_CACHE map being totally unused initially since the cached string included the prefixed data as Block{key}[properties] instead of the expected key[properties].
1 parent fd22888 commit 17e063a

File tree

55 files changed

+542
-719
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+542
-719
lines changed

paper-api/src/main/java/org/bukkit/block/Block.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -232,18 +232,16 @@ public static int getBlockKeyZ(long packed) {
232232
}
233233
// Paper end
234234

235-
// Paper start - add isValidTool
236235
/**
237236
* Checks if the itemstack is a valid tool to
238237
* break the block with
239238
*
240-
* @param itemStack The (tool) itemstack
239+
* @param tool The tool
241240
* @return whether the block will drop items
242241
* @deprecated partially replaced by {@link Block#isPreferredTool(ItemStack)}
243242
*/
244243
@Deprecated(since = "1.21", forRemoval = true) // Paper
245-
boolean isValidTool(@NotNull ItemStack itemStack);
246-
// Paper end - add isValidTool
244+
boolean isValidTool(@NotNull ItemStack tool);
247245

248246
/**
249247
* Gets the Location of the block
@@ -438,11 +436,16 @@ public static int getBlockKeyZ(long packed) {
438436
int getBlockPower(@NotNull BlockFace face);
439437

440438
/**
441-
* Returns the redstone power being provided to this block
439+
* Returns the redstone power being provided to this block.
440+
* <p>
441+
* Equivalent to:
442+
* {@snippet lang=java : getBlockPower(BlockFace.SELF); }
442443
*
443444
* @return The power level.
444445
*/
445-
int getBlockPower();
446+
default int getBlockPower() {
447+
return this.getBlockPower(BlockFace.SELF);
448+
}
446449

447450
/**
448451
* Checks if this block is empty.

paper-api/src/main/java/org/bukkit/event/block/BlockMultiPlaceEvent.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@
1818
*/
1919
public class BlockMultiPlaceEvent extends BlockPlaceEvent {
2020

21-
private final List<BlockState> states;
21+
private final List<BlockState> replacedStates;
2222

2323
@ApiStatus.Internal
2424
@Deprecated(forRemoval = true)
25-
public BlockMultiPlaceEvent(@NotNull List<BlockState> states, @NotNull Block clicked, @NotNull ItemStack itemInHand, @NotNull Player thePlayer, boolean canBuild) {
26-
this(states, clicked, itemInHand, thePlayer, canBuild, org.bukkit.inventory.EquipmentSlot.HAND);
25+
public BlockMultiPlaceEvent(@NotNull List<BlockState> replacedStates, @NotNull Block clicked, @NotNull ItemStack itemInHand, @NotNull Player thePlayer, boolean canBuild) {
26+
this(replacedStates, clicked, itemInHand, thePlayer, canBuild, org.bukkit.inventory.EquipmentSlot.HAND);
2727
}
2828

2929
@ApiStatus.Internal
30-
public BlockMultiPlaceEvent(@NotNull List<BlockState> states, @NotNull Block clicked, @NotNull ItemStack itemInHand, @NotNull Player thePlayer, boolean canBuild, @NotNull org.bukkit.inventory.EquipmentSlot hand) {
31-
super(states.get(0).getBlock(), states.get(0), clicked, itemInHand, thePlayer, canBuild, hand);
32-
this.states = ImmutableList.copyOf(states);
30+
public BlockMultiPlaceEvent(@NotNull List<BlockState> replacedStates, @NotNull Block clicked, @NotNull ItemStack itemInHand, @NotNull Player thePlayer, boolean canBuild, @NotNull org.bukkit.inventory.EquipmentSlot hand) {
31+
super(replacedStates.getFirst().getBlock(), replacedStates.getFirst(), clicked, itemInHand, thePlayer, canBuild, hand);
32+
this.replacedStates = ImmutableList.copyOf(replacedStates);
3333
}
3434

3535
/**
@@ -41,6 +41,6 @@ public BlockMultiPlaceEvent(@NotNull List<BlockState> states, @NotNull Block cli
4141
*/
4242
@NotNull
4343
public List<BlockState> getReplacedBlockStates() {
44-
return this.states;
44+
return this.replacedStates;
4545
}
4646
}

paper-api/src/main/java/org/bukkit/event/block/BlockPlaceEvent.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,25 @@ public class BlockPlaceEvent extends BlockEvent implements Cancellable {
2222
protected Block placedAgainst;
2323
protected ItemStack itemInHand;
2424
protected Player player;
25-
protected BlockState replacedBlockState;
25+
protected BlockState replacedState;
2626
protected boolean canBuild;
2727
protected EquipmentSlot hand;
2828

2929
protected boolean cancelled;
3030

3131
@ApiStatus.Internal
3232
@Deprecated(since = "1.9", forRemoval = true)
33-
public BlockPlaceEvent(@NotNull final Block placedBlock, @NotNull final BlockState replacedBlockState, @NotNull final Block placedAgainst, @NotNull final ItemStack itemInHand, @NotNull final Player thePlayer, final boolean canBuild) {
34-
this(placedBlock, replacedBlockState, placedAgainst, itemInHand, thePlayer, canBuild, EquipmentSlot.HAND);
33+
public BlockPlaceEvent(@NotNull final Block placedBlock, @NotNull final BlockState replacedState, @NotNull final Block placedAgainst, @NotNull final ItemStack itemInHand, @NotNull final Player thePlayer, final boolean canBuild) {
34+
this(placedBlock, replacedState, placedAgainst, itemInHand, thePlayer, canBuild, EquipmentSlot.HAND);
3535
}
3636

3737
@ApiStatus.Internal
38-
public BlockPlaceEvent(@NotNull final Block placedBlock, @NotNull final BlockState replacedBlockState, @NotNull final Block placedAgainst, @NotNull final ItemStack itemInHand, @NotNull final Player thePlayer, final boolean canBuild, @NotNull final EquipmentSlot hand) {
38+
public BlockPlaceEvent(@NotNull final Block placedBlock, @NotNull final BlockState replacedState, @NotNull final Block placedAgainst, @NotNull final ItemStack itemInHand, @NotNull final Player thePlayer, final boolean canBuild, @NotNull final EquipmentSlot hand) {
3939
super(placedBlock);
4040
this.placedAgainst = placedAgainst;
4141
this.itemInHand = itemInHand;
4242
this.player = thePlayer;
43-
this.replacedBlockState = replacedBlockState;
43+
this.replacedState = replacedState;
4444
this.canBuild = canBuild;
4545
this.hand = hand;
4646
}
@@ -95,7 +95,7 @@ public Block getBlockPlaced() {
9595
*/
9696
@NotNull
9797
public BlockState getBlockReplacedState() {
98-
return this.replacedBlockState;
98+
return this.replacedState;
9999
}
100100

101101
/**

paper-generator/src/main/java/io/papermc/generator/Rewriters.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ protected String rewriteFieldType(Holder.Reference<net.minecraft.world.level.gam
240240

241241
private static void bootstrapServer(PatternSourceSetRewriter sourceSet) {
242242
sourceSet
243-
.register("CraftBlockData#MAP", Types.CRAFT_BLOCK_DATA, new CraftBlockDataMapping())
243+
.register("CraftBlockData#INSTANCE_CREATOR", Types.CRAFT_BLOCK_DATA, new CraftBlockDataMapping())
244244
.register("CraftBlockEntityStates", Types.CRAFT_BLOCK_STATES, new CraftBlockEntityStateMapping())
245245
.register(Types.CRAFT_STATISTIC, composite(
246246
holder("CraftStatisticCustom", new StatisticRewriter.CraftCustom()),

paper-server/patches/sources/net/minecraft/world/entity/boss/enderdragon/EnderDragon.java.patch

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@
9292
} else {
9393
hitWall = true;
9494
}
95-
@@ -445,6 +_,58 @@
95+
@@ -445,6 +_,59 @@
9696
}
9797
}
9898

@@ -113,35 +113,36 @@
113113
+ this.level().removeBlock(new BlockPos(block.getX(), block.getY(), block.getZ()), false);
114114
+ }
115115
+ } else {
116-
+ for (org.bukkit.block.Block block : event.blockList()) {
117-
+ org.bukkit.Material blockType = block.getType();
116+
+ for (org.bukkit.block.Block b : event.blockList()) {
117+
+ org.bukkit.Material blockType = b.getType();
118118
+ if (blockType.isAir()) {
119119
+ continue;
120120
+ }
121121
+
122-
+ org.bukkit.craftbukkit.block.CraftBlock craftBlock = ((org.bukkit.craftbukkit.block.CraftBlock) block);
122+
+ org.bukkit.craftbukkit.block.CraftBlock craftBlock = ((org.bukkit.craftbukkit.block.CraftBlock) b);
123123
+ BlockPos pos = craftBlock.getPosition();
124+
+ net.minecraft.world.level.block.state.BlockState state = craftBlock.getBlockState();
125+
+ net.minecraft.world.level.block.Block block = state.getBlock();
124126
+
125-
+ net.minecraft.world.level.block.Block nmsBlock = craftBlock.getNMS().getBlock();
126-
+ if (nmsBlock.dropFromExplosion(this.explosionSource)) {
127-
+ net.minecraft.world.level.block.entity.BlockEntity blockEntity = craftBlock.getNMS().hasBlockEntity() ? this.level().getBlockEntity(pos) : null;
127+
+ if (block.dropFromExplosion(this.explosionSource)) {
128+
+ net.minecraft.world.level.block.entity.BlockEntity blockEntity = state.hasBlockEntity() ? this.level().getBlockEntity(pos) : null;
128129
+ net.minecraft.world.level.storage.loot.LootParams.Builder builder = new net.minecraft.world.level.storage.loot.LootParams.Builder((ServerLevel) this.level())
129130
+ .withParameter(net.minecraft.world.level.storage.loot.parameters.LootContextParams.ORIGIN, Vec3.atCenterOf(pos))
130131
+ .withParameter(net.minecraft.world.level.storage.loot.parameters.LootContextParams.TOOL, net.minecraft.world.item.ItemStack.EMPTY)
131132
+ .withParameter(net.minecraft.world.level.storage.loot.parameters.LootContextParams.EXPLOSION_RADIUS, 1.0F / event.getYield())
132133
+ .withOptionalParameter(net.minecraft.world.level.storage.loot.parameters.LootContextParams.BLOCK_ENTITY, blockEntity);
133134
+
134-
+ craftBlock.getNMS().getDrops(builder).forEach((stack) -> {
135-
+ net.minecraft.world.level.block.Block.popResource(this.level(), pos, stack);
135+
+ state.getDrops(builder).forEach((item) -> {
136+
+ net.minecraft.world.level.block.Block.popResource(this.level(), pos, item);
136137
+ });
137-
+ craftBlock.getNMS().spawnAfterBreak((ServerLevel) this.level(), pos, net.minecraft.world.item.ItemStack.EMPTY, false);
138+
+ state.spawnAfterBreak((ServerLevel) this.level(), pos, net.minecraft.world.item.ItemStack.EMPTY, false);
138139
+ }
139140
+ // Paper start - TNTPrimeEvent
140141
+ org.bukkit.block.Block tntBlock = org.bukkit.craftbukkit.block.CraftBlock.at(this.level(), pos);
141142
+ if (!new com.destroystokyo.paper.event.block.TNTPrimeEvent(tntBlock, com.destroystokyo.paper.event.block.TNTPrimeEvent.PrimeReason.EXPLOSION, explosionSource.getIndirectSourceEntity().getBukkitEntity()).callEvent())
142143
+ continue;
143144
+ // Paper end - TNTPrimeEvent
144-
+ nmsBlock.wasExploded((ServerLevel) this.level(), pos, this.explosionSource);
145+
+ block.wasExploded((ServerLevel) this.level(), pos, this.explosionSource);
145146
+
146147
+ this.level().removeBlock(pos, false);
147148
+ }

paper-server/patches/sources/net/minecraft/world/inventory/AnvilMenu.java.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
if (!player.hasInfiniteMaterials() && state.is(BlockTags.ANVIL) && player.getRandom().nextFloat() < 0.12F) {
3737
BlockState newBlockState = AnvilBlock.damage(state);
3838
+ // Paper start - AnvilDamageEvent
39-
+ com.destroystokyo.paper.event.block.AnvilDamagedEvent event = new com.destroystokyo.paper.event.block.AnvilDamagedEvent(getBukkitView(), newBlockState != null ? org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(newBlockState) : null);
39+
+ com.destroystokyo.paper.event.block.AnvilDamagedEvent event = new com.destroystokyo.paper.event.block.AnvilDamagedEvent(getBukkitView(), newBlockState != null ? newBlockState.asBlockData() : null);
4040
+ if (!event.callEvent()) {
4141
+ return;
4242
+ } else if (event.getDamageState() == com.destroystokyo.paper.event.block.AnvilDamagedEvent.DamageState.BROKEN) {

paper-server/patches/sources/net/minecraft/world/item/BlockItem.java.patch

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
11
--- a/net/minecraft/world/item/BlockItem.java
22
+++ b/net/minecraft/world/item/BlockItem.java
3-
@@ -56,6 +_,13 @@
3+
@@ -56,6 +_,7 @@
44
return InteractionResult.FAIL;
55
} else {
66
BlockState placementState = this.getPlacementState(updatedPlaceContext);
7-
+ // CraftBukkit start - special case for handling block placement with water lilies and snow buckets
8-
+ org.bukkit.block.BlockState bukkitState = null;
9-
+ if (this instanceof PlaceOnWaterBlockItem || this instanceof SolidBucketItem) {
10-
+ bukkitState = org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(updatedPlaceContext.getLevel(), updatedPlaceContext.getClickedPos());
11-
+ }
12-
+ final org.bukkit.block.BlockState oldBukkitState = bukkitState != null ? bukkitState : org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(updatedPlaceContext.getLevel(), updatedPlaceContext.getClickedPos()); // Paper - Reset placed block on exception
13-
+ // CraftBukkit end
7+
+ final org.bukkit.block.BlockState previousState = org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(updatedPlaceContext.getLevel(), updatedPlaceContext.getClickedPos()); // Paper - Reset placed block on exception
148
if (placementState == null) {
159
return InteractionResult.FAIL;
1610
} else if (!this.placeBlock(updatedPlaceContext, placementState)) {
@@ -23,21 +17,21 @@
2317
this.updateCustomBlockEntityTag(pos, level, player, itemStack, placedState);
2418
updateBlockEntityComponents(level, pos, itemStack);
2519
+ } catch (Exception ex) {
26-
+ ((org.bukkit.craftbukkit.block.CraftBlockState) oldBukkitState).revertPlace();
20+
+ ((org.bukkit.craftbukkit.block.CraftBlockState) previousState).revertPlace();
2721
+ if (player instanceof ServerPlayer serverPlayer) {
28-
+ org.apache.logging.log4j.LogManager.getLogger().error("Player {} tried placing invalid block", player.getScoreboardName(), ex);
29-
+ serverPlayer.getBukkitEntity().kickPlayer("Packet processing error");
22+
+ net.minecraft.server.MinecraftServer.LOGGER.warn("Player {} tried placing invalid block", player.getScoreboardName(), ex);
23+
+ serverPlayer.connection.disconnect(net.minecraft.network.chat.Component.literal("Packet processing error"));
3024
+ return InteractionResult.FAIL;
3125
+ }
3226
+ throw ex; // Rethrow exception if not placed by a player
3327
+ }
3428
+ // Paper end - Reset placed block on exception
3529
placedState.getBlock().setPlacedBy(level, pos, placedState, player, itemStack);
36-
+ // CraftBukkit start
37-
+ if (bukkitState != null) {
38-
+ org.bukkit.event.block.BlockPlaceEvent placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent((net.minecraft.server.level.ServerLevel) level, player, updatedPlaceContext.getHand(), bukkitState, pos);
39-
+ if (placeEvent != null && (placeEvent.isCancelled() || !placeEvent.canBuild())) {
40-
+ ((org.bukkit.craftbukkit.block.CraftBlockState) bukkitState).revertPlace();
30+
+ // CraftBukkit start - special case for handling block placement with water lilies, frog spawn and snow buckets
31+
+ if (player != null && (this instanceof PlaceOnWaterBlockItem || this instanceof SolidBucketItem)) {
32+
+ org.bukkit.event.block.BlockPlaceEvent placeEvent = org.bukkit.craftbukkit.event.CraftEventFactory.callBlockPlaceEvent((net.minecraft.server.level.ServerLevel) level, player, updatedPlaceContext.getHand(), previousState, pos);
33+
+ if (placeEvent.isCancelled() || !placeEvent.canBuild()) {
34+
+ ((org.bukkit.craftbukkit.block.CraftBlockState) previousState).revertPlace();
4135
+
4236
+ player.containerMenu.forceHeldSlot(updatedPlaceContext.getHand());
4337
+ return InteractionResult.FAIL;
@@ -75,7 +69,7 @@
7569
+
7670
+ org.bukkit.event.block.BlockCanBuildEvent event = new org.bukkit.event.block.BlockCanBuildEvent(
7771
+ org.bukkit.craftbukkit.block.CraftBlock.at(world, context.getClickedPos()), bukkitPlayer,
78-
+ org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(stateForPlacement), canBuild, org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(context.getHand())
72+
+ stateForPlacement.asBlockData(), canBuild, org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(context.getHand())
7973
+ );
8074
+ world.getCraftServer().getPluginManager().callEvent(event);
8175
+

paper-server/patches/sources/net/minecraft/world/item/StandingAndWallBlockItem.java.patch

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
+ boolean defaultReturn = level.isUnobstructed(stateForPlacement, pos, CollisionContext.empty());
1212
+ org.bukkit.entity.Player player = (context.getPlayer() instanceof net.minecraft.server.level.ServerPlayer serverPlayer) ? serverPlayer.getBukkitEntity() : null;
1313
+
14-
+ org.bukkit.event.block.BlockCanBuildEvent event = new org.bukkit.event.block.BlockCanBuildEvent(org.bukkit.craftbukkit.block.CraftBlock.at(context.getLevel(), pos), player, org.bukkit.craftbukkit.block.data.CraftBlockData.fromData(stateForPlacement), defaultReturn, org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(context.getHand())); // Paper - Expose hand in BlockCanBuildEvent
14+
+ org.bukkit.event.block.BlockCanBuildEvent event = new org.bukkit.event.block.BlockCanBuildEvent(org.bukkit.craftbukkit.block.CraftBlock.at(context.getLevel(), pos), player, stateForPlacement.asBlockData(), defaultReturn, org.bukkit.craftbukkit.CraftEquipmentSlot.getHand(context.getHand())); // Paper - Expose hand in BlockCanBuildEvent
1515
+ context.getLevel().getCraftServer().getPluginManager().callEvent(event);
1616
+
1717
+ return (event.isBuildable()) ? stateForPlacement : null;

paper-server/patches/sources/net/minecraft/world/level/Level.java.patch

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@
266266
+ blockstate = org.bukkit.craftbukkit.block.CapturedBlockState.getTreeBlockState(this, pos, updateFlags);
267267
+ this.capturedBlockStates.put(pos.immutable(), blockstate);
268268
+ }
269-
+ blockstate.setData(blockState);
269+
+ blockstate.setBlock(blockState);
270270
+ blockstate.setFlags(updateFlags);
271271
+ return true;
272272
+ }
@@ -358,7 +358,7 @@
358358
+ blockState.updateIndirectNeighbourShapes(this, pos, i, recursionLeft - 1); // Don't call an event for the old block to limit event spam
359359
+ boolean cancelledUpdates = false; // Paper - Fix block place logic
360360
+ if (((ServerLevel)this).hasPhysicsEvent) { // Paper - BlockPhysicsEvent
361-
+ org.bukkit.event.block.BlockPhysicsEvent event = new org.bukkit.event.block.BlockPhysicsEvent(org.bukkit.craftbukkit.block.CraftBlock.at(this, pos), CraftBlockData.fromData(state));
361+
+ org.bukkit.event.block.BlockPhysicsEvent event = new org.bukkit.event.block.BlockPhysicsEvent(org.bukkit.craftbukkit.block.CraftBlock.at(this, pos), state.asBlockData());
362362
+ cancelledUpdates = !event.callEvent(); // Paper - Fix block place logic
363363
+ }
364364
+ // CraftBukkit end
@@ -396,7 +396,7 @@
396396
+ BlockState effectType = blockState;
397397
+ int xp = blockState.getBlock().getExpDrop(blockState, (ServerLevel) this, pos, ItemStack.EMPTY, true);
398398
+ if (com.destroystokyo.paper.event.block.BlockDestroyEvent.getHandlerList().getRegisteredListeners().length > 0) {
399-
+ com.destroystokyo.paper.event.block.BlockDestroyEvent event = new com.destroystokyo.paper.event.block.BlockDestroyEvent(org.bukkit.craftbukkit.block.CraftBlock.at(this, pos), fluidState.createLegacyBlock().createCraftBlockData(), effectType.createCraftBlockData(), xp, dropResources);
399+
+ com.destroystokyo.paper.event.block.BlockDestroyEvent event = new com.destroystokyo.paper.event.block.BlockDestroyEvent(org.bukkit.craftbukkit.block.CraftBlock.at(this, pos), fluidState.createLegacyBlock().asBlockData(), effectType.asBlockData(), xp, dropResources);
400400
+ if (!event.callEvent()) {
401401
+ return false;
402402
+ }

0 commit comments

Comments
 (0)