--- a/net/minecraft/world/level/redstone/DefaultRedstoneWireEvaluator.java
+++ b/net/minecraft/world/level/redstone/DefaultRedstoneWireEvaluator.java
@@ -17,7 +_,16 @@
     @Override
     public void updatePowerStrength(Level level, BlockPos pos, BlockState state, @Nullable Orientation orientation, boolean updateShape) {
         int i = this.calculateTargetStrength(level, pos);
-        if (state.getValue(RedStoneWireBlock.POWER) != i) {
+        // CraftBukkit start
+        int oldPower = state.getValue(RedStoneWireBlock.POWER);
+        if (oldPower != i) {
+            org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), oldPower, i);
+            level.getCraftServer().getPluginManager().callEvent(event);
+
+            i = event.getNewCurrent();
+        }
+        if (oldPower != i) {
+            // CraftBukkit end
             if (level.getBlockState(pos) == state) {
                 level.setBlock(pos, state.setValue(RedStoneWireBlock.POWER, Integer.valueOf(i)), 2);
             }
@@ -35,7 +_,7 @@
         }
     }
 
-    private int calculateTargetStrength(Level level, BlockPos pos) {
+    public int calculateTargetStrength(Level level, BlockPos pos) { // Paper - Optimize redstone
         int blockSignal = this.getBlockSignal(level, pos);
         return blockSignal == 15 ? blockSignal : Math.max(blockSignal, this.getIncomingWireSignal(level, pos));
     }
