--- a/net/minecraft/world/level/block/ConcretePowderBlock.java
+++ b/net/minecraft/world/level/block/ConcretePowderBlock.java
@@ -13,17 +13,24 @@
 import net.minecraft.world.level.LevelAccessor;
 import net.minecraft.world.level.block.state.BlockBehaviour;
 import net.minecraft.world.level.block.state.BlockState;
+// CraftBukkit start
+import org.bukkit.craftbukkit.block.CraftBlockState;
+import org.bukkit.craftbukkit.block.CraftBlockStates;
+import org.bukkit.event.block.BlockFormEvent;
+// CraftBukkit end
 
 public class ConcretePowderBlock extends FallingBlock {
-    public static final MapCodec<ConcretePowderBlock> CODEC = RecordCodecBuilder.mapCodec(
-        instance -> instance.group(BuiltInRegistries.BLOCK.byNameCodec().fieldOf("concrete").forGetter(block -> block.concrete), propertiesCodec())
-                .apply(instance, ConcretePowderBlock::new)
-    );
+
+    public static final MapCodec<ConcretePowderBlock> CODEC = RecordCodecBuilder.mapCodec((instance) -> {
+        return instance.group(BuiltInRegistries.BLOCK.byNameCodec().fieldOf("concrete").forGetter((blockconcretepowder) -> {
+            return blockconcretepowder.concrete;
+        }), propertiesCodec()).apply(instance, ConcretePowderBlock::new);
+    });
     private final Block concrete;
 
     @Override
     public MapCodec<ConcretePowderBlock> codec() {
-        return CODEC;
+        return ConcretePowderBlock.CODEC;
     }
 
     public ConcretePowderBlock(Block hardened, BlockBehaviour.Properties settings) {
@@ -33,40 +40,63 @@
 
     @Override
     public void onLand(Level world, BlockPos pos, BlockState fallingBlockState, BlockState currentStateInPos, FallingBlockEntity fallingBlockEntity) {
-        if (shouldSolidify(world, pos, currentStateInPos)) {
-            world.setBlock(pos, this.concrete.defaultBlockState(), 3);
+        if (ConcretePowderBlock.shouldSolidify(world, pos, currentStateInPos)) {
+            org.bukkit.craftbukkit.event.CraftEventFactory.handleBlockFormEvent(world, pos, this.concrete.defaultBlockState(), 3); // CraftBukkit
         }
+
     }
 
     @Override
     public BlockState getStateForPlacement(BlockPlaceContext ctx) {
-        BlockGetter blockGetter = ctx.getLevel();
-        BlockPos blockPos = ctx.getClickedPos();
-        BlockState blockState = blockGetter.getBlockState(blockPos);
-        return shouldSolidify(blockGetter, blockPos, blockState) ? this.concrete.defaultBlockState() : super.getStateForPlacement(ctx);
+        Level world = ctx.getLevel();
+        BlockPos blockposition = ctx.getClickedPos();
+        BlockState iblockdata = world.getBlockState(blockposition);
+
+        // CraftBukkit start
+        if (!ConcretePowderBlock.shouldSolidify(world, blockposition, iblockdata)) {
+            return super.getStateForPlacement(ctx);
+        }
+
+        // TODO: An event factory call for methods like this
+        CraftBlockState blockState = CraftBlockStates.getBlockState(world, blockposition);
+        blockState.setData(this.concrete.defaultBlockState());
+
+        BlockFormEvent event = new BlockFormEvent(blockState.getBlock(), blockState);
+        world.getServer().server.getPluginManager().callEvent(event);
+
+        if (!event.isCancelled()) {
+            return blockState.getHandle();
+        }
+
+        return super.getStateForPlacement(ctx);
+        // CraftBukkit end
     }
 
     private static boolean shouldSolidify(BlockGetter world, BlockPos pos, BlockState state) {
-        return canSolidify(state) || touchesLiquid(world, pos);
+        return ConcretePowderBlock.canSolidify(state) || ConcretePowderBlock.touchesLiquid(world, pos);
     }
 
     private static boolean touchesLiquid(BlockGetter world, BlockPos pos) {
-        boolean bl = false;
-        BlockPos.MutableBlockPos mutableBlockPos = pos.mutable();
+        boolean flag = false;
+        BlockPos.MutableBlockPos blockposition_mutableblockposition = pos.mutable();
+        Direction[] aenumdirection = Direction.values();
+        int i = aenumdirection.length;
 
-        for (Direction direction : Direction.values()) {
-            BlockState blockState = world.getBlockState(mutableBlockPos);
-            if (direction != Direction.DOWN || canSolidify(blockState)) {
-                mutableBlockPos.setWithOffset(pos, direction);
-                blockState = world.getBlockState(mutableBlockPos);
-                if (canSolidify(blockState) && !blockState.isFaceSturdy(world, pos, direction.getOpposite())) {
-                    bl = true;
+        for (int j = 0; j < i; ++j) {
+            Direction enumdirection = aenumdirection[j];
+            BlockState iblockdata = world.getBlockState(blockposition_mutableblockposition);
+
+            if (enumdirection != Direction.DOWN || ConcretePowderBlock.canSolidify(iblockdata)) {
+                blockposition_mutableblockposition.setWithOffset(pos, enumdirection);
+                iblockdata = world.getBlockState(blockposition_mutableblockposition);
+                if (ConcretePowderBlock.canSolidify(iblockdata) && !iblockdata.isFaceSturdy(world, pos, enumdirection.getOpposite())) {
+                    flag = true;
                     break;
                 }
             }
         }
 
-        return bl;
+        return flag;
     }
 
     private static boolean canSolidify(BlockState state) {
@@ -75,7 +105,25 @@
 
     @Override
     protected BlockState updateShape(BlockState state, Direction direction, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) {
-        return touchesLiquid(world, pos) ? this.concrete.defaultBlockState() : super.updateShape(state, direction, neighborState, world, pos, neighborPos);
+        // CraftBukkit start
+        if (ConcretePowderBlock.touchesLiquid(world, pos)) {
+            // Suppress during worldgen
+            if (!(world instanceof Level)) {
+                return this.concrete.defaultBlockState();
+            }
+            CraftBlockState blockState = CraftBlockStates.getBlockState(world, pos);
+            blockState.setData(this.concrete.defaultBlockState());
+
+            BlockFormEvent event = new BlockFormEvent(blockState.getBlock(), blockState);
+            ((Level) world).getCraftServer().getPluginManager().callEvent(event);
+
+            if (!event.isCancelled()) {
+                return blockState.getHandle();
+            }
+        }
+
+        return super.updateShape(state, direction, neighborState, world, pos, neighborPos);
+        // CraftBukkit end
     }
 
     @Override
