--- a/net/minecraft/world/level/block/BlockBell.java
+++ b/net/minecraft/world/level/block/BlockBell.java
@@ -136,6 +136,11 @@
             if (enumdirection == null) {
                 enumdirection = (EnumDirection) world.getBlockState(blockposition).getValue(BlockBell.FACING);
             }
+            // CraftBukkit start
+            if (!org.bukkit.craftbukkit.event.CraftEventFactory.handleBellRingEvent(world, blockposition, enumdirection, entity)) {
+                return false;
+            }
+            // CraftBukkit end
 
             ((TileEntityBell) tileentity).onHit(enumdirection);
             world.playSound((EntityHuman) null, blockposition, SoundEffects.BELL_BLOCK, SoundCategory.BLOCKS, 2.0F, 1.0F);
@@ -262,4 +267,16 @@
     public boolean isPathfindable(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition, PathMode pathmode) {
         return false;
     }
+
+    // CraftBukkit start - fix MC-253819
+    @Override
+    public IBlockData rotate(IBlockData iblockdata, EnumBlockRotation enumblockrotation) {
+        return iblockdata.setValue(BlockBell.FACING, enumblockrotation.rotate(iblockdata.getValue(BlockBell.FACING)));
+    }
+
+    @Override
+    public IBlockData mirror(IBlockData iblockdata, EnumBlockMirror enumblockmirror) {
+        return iblockdata.rotate(enumblockmirror.getRotation(iblockdata.getValue(BlockBell.FACING)));
+    }
+    // CraftBukkit end
 }
