Skip to content

Commit

Permalink
Call BlockRedstoneEvent for more interactions
Browse files Browse the repository at this point in the history
  • Loading branch information
Lulu13022002 committed Feb 28, 2025
1 parent 0a6e743 commit e27f578
Show file tree
Hide file tree
Showing 17 changed files with 210 additions and 104 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
--- a/net/minecraft/world/level/block/AbstractSkullBlock.java
+++ b/net/minecraft/world/level/block/AbstractSkullBlock.java
@@ -75,6 +_,14 @@
if (!level.isClientSide) {
boolean hasNeighborSignal = level.hasNeighborSignal(pos);
if (hasNeighborSignal != state.getValue(POWERED)) {
+ // Paper start - Call BlockRedstoneEvent
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(block, state.getValue(POWERED) ? 15 : 0, hasNeighborSignal ? 15 : 0);
+ event.callEvent();
+ if (hasNeighborSignal == (event.getNewCurrent() <= 0)) {
+ return;
+ }
+ // Paper end - Call BlockRedstoneEvent
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(hasNeighborSignal)), 2);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,18 @@
if (!level.isClientSide) {
int signalForState = this.getSignalForState(state);
if (signalForState == 0) {
@@ -93,6 +_,19 @@
@@ -93,6 +_,16 @@
int signalStrength = this.getSignalStrength(level, pos);
boolean flag = currentSignal > 0;
boolean flag1 = signalStrength > 0;
+
+ // CraftBukkit start - Interact Pressure Plate
+ org.bukkit.World bworld = level.getWorld();
+ org.bukkit.plugin.PluginManager manager = level.getCraftServer().getPluginManager();
+
+ if (flag != flag1) {
+ org.bukkit.event.block.BlockRedstoneEvent eventRedstone = new org.bukkit.event.block.BlockRedstoneEvent(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()), currentSignal, signalStrength);
+ manager.callEvent(eventRedstone);
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), currentSignal, signalStrength);
+ event.callEvent();
+
+ flag1 = eventRedstone.getNewCurrent() > 0;
+ signalStrength = eventRedstone.getNewCurrent();
+ flag1 = event.getNewCurrent() > 0;
+ signalStrength = event.getNewCurrent();
+ }
+ // CraftBukkit end
if (currentSignal != signalStrength) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
--- a/net/minecraft/world/level/block/BellBlock.java
+++ b/net/minecraft/world/level/block/BellBlock.java
@@ -75,6 +_,14 @@
protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) {
boolean hasNeighborSignal = level.hasNeighborSignal(pos);
if (hasNeighborSignal != state.getValue(POWERED)) {
+ // Paper start - Call BlockRedstoneEvent
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(block, state.getValue(POWERED) ? 15 : 0, hasNeighborSignal ? 15 : 0);
+ event.callEvent();
+ if (hasNeighborSignal == (event.getNewCurrent() <= 0)) {
+ return;
+ }
+ // Paper end - Call BlockRedstoneEvent
if (hasNeighborSignal) {
this.attemptToRing(level, pos, null);
}
@@ -142,6 +_,11 @@
direction = level.getBlockState(pos).getValue(FACING);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,35 @@
--- a/net/minecraft/world/level/block/ButtonBlock.java
+++ b/net/minecraft/world/level/block/ButtonBlock.java
@@ -114,6 +_,19 @@
@@ -114,6 +_,14 @@
if (state.getValue(POWERED)) {
return InteractionResult.CONSUME;
} else {
+ // CraftBukkit start
+ boolean powered = state.getValue(ButtonBlock.POWERED);
+ org.bukkit.block.Block block = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ int old = (powered) ? 15 : 0;
+ int current = (!powered) ? 15 : 0;
+
+ org.bukkit.event.block.BlockRedstoneEvent eventRedstone = new org.bukkit.event.block.BlockRedstoneEvent(block, old, current);
+ level.getCraftServer().getPluginManager().callEvent(eventRedstone);
+
+ if ((eventRedstone.getNewCurrent() > 0) != (!powered)) {
+ // Paper start - Call BlockRedstoneEvent
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(block, 0, 15);
+ event.callEvent();
+ if (event.getNewCurrent() <= 0) {
+ return InteractionResult.SUCCESS;
+ }
+ // CraftBukkit end
+ // Paper end - Call BlockRedstoneEvent
this.press(state, level, pos, player);
return InteractionResult.SUCCESS;
}
@@ -122,7 +_,14 @@
@Override
protected void onExplosionHit(BlockState state, ServerLevel level, BlockPos pos, Explosion explosion, BiConsumer<ItemStack, BlockPos> dropConsumer) {
if (explosion.canTriggerBlocks() && !state.getValue(POWERED)) {
+ // Paper start - Call BlockRedstoneEvent
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(block, 0, 15);
+ event.callEvent();
+ if (event.getNewCurrent() > 0) {
+ // Paper end - Call BlockRedstoneEvent
this.press(state, level, pos, null);
+ } // Paper - Call BlockRedstoneEvent
}

super.onExplosionHit(state, level, pos, explosion, dropConsumer);
@@ -179,6 +_,7 @@

@Override
Expand All @@ -28,35 +38,32 @@
if (!level.isClientSide && this.type.canButtonBeActivatedByArrows() && !state.getValue(POWERED)) {
this.checkPressed(state, level, pos);
}
@@ -190,7 +_,31 @@
@@ -190,7 +_,28 @@
: null;
boolean flag = abstractArrow != null;
boolean poweredValue = state.getValue(POWERED);
+ // CraftBukkit start - Call interact event when arrows turn on wooden buttons
+ if (poweredValue != flag && flag) {
+ org.bukkit.block.Block block = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ org.bukkit.event.entity.EntityInteractEvent event = new org.bukkit.event.entity.EntityInteractEvent(abstractArrow.getBukkitEntity(), block);
+ level.getCraftServer().getPluginManager().callEvent(event);
+
+ if (event.isCancelled()) {
+ if (!event.callEvent()) {
+ return;
+ }
+ }
+ // CraftBukkit end
if (flag != poweredValue) {
+ // CraftBukkit start
+ boolean powered = poweredValue;
+ org.bukkit.block.Block block = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ int old = (powered) ? 15 : 0;
+ int current = (!powered) ? 15 : 0;
+ // Paper start - Call BlockRedstoneEvent
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ int oldCurrent = poweredValue ? 15 : 0;
+ int newCurrent = !poweredValue ? 15 : 0;
+
+ org.bukkit.event.block.BlockRedstoneEvent eventRedstone = new org.bukkit.event.block.BlockRedstoneEvent(block, old, current);
+ level.getCraftServer().getPluginManager().callEvent(eventRedstone);
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(block, oldCurrent, newCurrent);
+ event.callEvent();
+
+ if ((flag && eventRedstone.getNewCurrent() <= 0) || (!flag && eventRedstone.getNewCurrent() > 0)) {
+ if (flag == (event.getNewCurrent() <= 0)) {
+ return;
+ }
+ // CraftBukkit end
+ // Paper end - Call BlockRedstoneEvent
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(flag)), 3);
this.updateNeighbours(state, level, pos);
this.playSound(null, level, pos, flag);
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
private void setPoweredAndUpdate(Level level, BlockPos pos, CommandBlockEntity blockEntity, boolean powered) {
boolean isPowered = blockEntity.isPowered();
+ // CraftBukkit start
+ org.bukkit.block.Block bukkitBlock = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ int old = isPowered ? 15 : 0;
+ int current = powered ? 15 : 0;
+ org.bukkit.block.Block bukkitBlock = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ int oldCurrent = isPowered ? 15 : 0;
+ int newCurrent = powered ? 15 : 0;
+
+ org.bukkit.event.block.BlockRedstoneEvent eventRedstone = new org.bukkit.event.block.BlockRedstoneEvent(bukkitBlock, old, current);
+ level.getCraftServer().getPluginManager().callEvent(eventRedstone);
+ org.bukkit.event.block.BlockRedstoneEvent eventRedstone = new org.bukkit.event.block.BlockRedstoneEvent(bukkitBlock, oldCurrent, newCurrent);
+ eventRedstone.callEvent();
+ powered = eventRedstone.getNewCurrent() > 0;
+ // CraftBukkit end
if (powered != isPowered) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
--- a/net/minecraft/world/level/block/CopperBulbBlock.java
+++ b/net/minecraft/world/level/block/CopperBulbBlock.java
@@ -47,6 +_,14 @@
boolean hasNeighborSignal = level.hasNeighborSignal(pos);
if (hasNeighborSignal != state.getValue(POWERED)) {
BlockState blockState = state;
+ // Paper start - Call BlockRedstoneEvent
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(block, state.getValue(POWERED) ? 15 : 0, hasNeighborSignal ? 15 : 0);
+ event.callEvent();
+ if (hasNeighborSignal == (event.getNewCurrent() <= 0)) {
+ return;
+ }
+ // Paper end - Call BlockRedstoneEvent
if (!state.getValue(POWERED)) {
blockState = state.cycle(LIT);
level.playSound(null, pos, blockState.getValue(LIT) ? SoundEvents.COPPER_BULB_TURN_ON : SoundEvents.COPPER_BULB_TURN_OFF, SoundSource.BLOCKS);
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
+ int oldPower = oldPowered ? 15 : 0;
+ org.bukkit.block.Block bukkitBlock = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ org.bukkit.event.block.BlockRedstoneEvent eventRedstone = new org.bukkit.event.block.BlockRedstoneEvent(bukkitBlock, oldPower, newPower);
+ level.getCraftServer().getPluginManager().callEvent(eventRedstone);
+ eventRedstone.callEvent();
+ hasNeighborSignal = eventRedstone.getNewCurrent() > 0;
+ }
+ // CraftBukkit end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,39 @@
makeParticle(blockState, level, pos, 1.0F);
}
} else {
+ // CraftBukkit start - Interact Lever
+ boolean powered = state.getValue(LeverBlock.POWERED); // Old powered state
+ org.bukkit.block.Block block = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ int old = (powered) ? 15 : 0;
+ int current = (!powered) ? 15 : 0;
+ // Paper start - Call BlockRedstoneEvent
+ boolean wasPowered = state.getValue(LeverBlock.POWERED);
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ int oldCurrent = wasPowered ? 15 : 0;
+ int newCurrent = !wasPowered ? 15 : 0;
+
+ org.bukkit.event.block.BlockRedstoneEvent eventRedstone = new org.bukkit.event.block.BlockRedstoneEvent(block, old, current);
+ level.getCraftServer().getPluginManager().callEvent(eventRedstone);
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(block, oldCurrent, newCurrent);
+ event.callEvent();
+
+ if ((eventRedstone.getNewCurrent() > 0) != (!powered)) {
+ if ((event.getNewCurrent() > 0) == wasPowered) {
+ return InteractionResult.SUCCESS;
+ }
+ // CraftBukkit end
+ // Paper end - Call BlockRedstoneEvent
this.pull(state, level, pos, null);
}

@@ -109,7 +_,19 @@
@Override
protected void onExplosionHit(BlockState state, ServerLevel level, BlockPos pos, Explosion explosion, BiConsumer<ItemStack, BlockPos> dropConsumer) {
if (explosion.canTriggerBlocks()) {
+ // Paper start - Call BlockRedstoneEvent
+ boolean wasPowered = state.getValue(LeverBlock.POWERED);
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ int oldCurrent = wasPowered ? 15 : 0;
+ int newCurrent = !wasPowered ? 15 : 0;
+
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(block, oldCurrent, newCurrent);
+ event.callEvent();
+
+ if ((event.getNewCurrent() <= 0) == wasPowered) {
+ // Paper end - Call BlockRedstoneEvent
this.pull(state, level, pos, null);
+ } // Paper - Call BlockRedstoneEvent
}

super.onExplosionHit(state, level, pos, explosion, dropConsumer);
Original file line number Diff line number Diff line change
@@ -1,21 +1,36 @@
--- a/net/minecraft/world/level/block/LightningRodBlock.java
+++ b/net/minecraft/world/level/block/LightningRodBlock.java
@@ -84,6 +_,18 @@
@@ -84,6 +_,16 @@
}

public void onLightningStrike(BlockState state, Level level, BlockPos pos) {
+ // CraftBukkit start
+ boolean powered = state.getValue(LightningRodBlock.POWERED);
+ int old = (powered) ? 15 : 0;
+ int current = (!powered) ? 15 : 0;
+ // Paper start - Call BlockRedstoneEvent
+ if (!state.getValue(POWERED)) {
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), 0, 15);
+ event.callEvent();
+
+ org.bukkit.event.block.BlockRedstoneEvent eventRedstone = new org.bukkit.event.block.BlockRedstoneEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), old, current);
+ level.getCraftServer().getPluginManager().callEvent(eventRedstone);
+
+ if (eventRedstone.getNewCurrent() <= 0) {
+ return;
+ if (event.getNewCurrent() <= 0) {
+ return;
+ }
+ }
+ // CraftBukkit end
+ // Paper end - Call BlockRedstoneEvent
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(true)), 3);
this.updateNeighbours(state, level, pos);
level.scheduleTick(pos, this, 8);
@@ -97,6 +_,16 @@

@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
+ // Paper start - Call BlockRedstoneEvent
+ if (state.getValue(POWERED)) {
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), 15, 0);
+ event.callEvent();
+
+ if (event.getNewCurrent() > 0) {
+ return;
+ }
+ }
+ // Paper end - Call BlockRedstoneEvent
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(false)), 3);
this.updateNeighbours(state, level, pos);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,21 @@
boolean flag = direction.getAxis() == Direction.Axis.Y;
return flag
? this.setInstrument(level, pos, state)
@@ -92,10 +_,12 @@
@@ -92,10 +_,20 @@

@Override
protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) {
+ if (io.papermc.paper.configuration.GlobalConfiguration.get().blockUpdates.disableNoteblockUpdates) return; // Paper - prevent noteblock powered-state from updating
boolean hasNeighborSignal = level.hasNeighborSignal(pos);
if (hasNeighborSignal != state.getValue(POWERED)) {
+ // Paper start - Call BlockRedstoneEvent
+ org.bukkit.block.Block block = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(block, state.getValue(POWERED) ? 15 : 0, hasNeighborSignal ? 15 : 0);
+ event.callEvent();
+ if (hasNeighborSignal == (event.getNewCurrent() <= 0)) {
+ return;
+ }
+ // Paper end - Call BlockRedstoneEvent
if (hasNeighborSignal) {
this.playNote(null, state, level, pos);
+ state = level.getBlockState(pos); // CraftBukkit - SPIGOT-5617: update in case changed in event
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
public static final int RECENT_TOGGLE_TIMER = 60;
public static final int MAX_RECENT_TOGGLES = 8;
public static final int RESTART_DELAY = 160;
@@ -72,14 +_,34 @@
@@ -72,14 +_,23 @@
@Override
protected void tick(BlockState state, ServerLevel level, BlockPos pos, RandomSource random) {
boolean hasNeighborSignal = this.hasNeighborSignal(level, pos, state);
Expand All @@ -25,41 +25,25 @@
+ redstoneUpdateInfos.poll();
+ }
}
-
+ // Paper end - Faster redstone torch rapid clock removal
+
+ // CraftBukkit start
+ org.bukkit.plugin.PluginManager manager = level.getCraftServer().getPluginManager();
+ org.bukkit.block.Block block = level.getWorld().getBlockAt(pos.getX(), pos.getY(), pos.getZ());
+ int oldCurrent = ((Boolean) state.getValue(RedstoneTorchBlock.LIT)).booleanValue() ? 15 : 0;
+
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(block, oldCurrent, oldCurrent);
+ // CraftBukkit end

if (state.getValue(LIT)) {
if (hasNeighborSignal) {
+ // CraftBukkit start
+ if (oldCurrent != 0) {
+ event.setNewCurrent(0);
+ manager.callEvent(event);
+ if (event.getNewCurrent() != 0) {
+ return;
+ }
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(level, pos, 15, 0).getNewCurrent() != 0) {
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(LIT, Boolean.valueOf(false)), 3);
if (isToggledTooFrequently(level, pos, true)) {
level.levelEvent(1502, pos, 0);
@@ -87,6 +_,15 @@
@@ -87,6 +_,11 @@
}
}
} else if (!hasNeighborSignal && !isToggledTooFrequently(level, pos, false)) {
+ // CraftBukkit start
+ if (oldCurrent != 15) {
+ event.setNewCurrent(15);
+ manager.callEvent(event);
+ if (event.getNewCurrent() != 15) {
+ return;
+ }
+ if (org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(level, pos, 0, 15).getNewCurrent() != 15) {
+ return;
+ }
+ // CraftBukkit end
level.setBlock(pos, state.setValue(LIT, Boolean.valueOf(true)), 3);
Expand Down
Loading

0 comments on commit e27f578

Please sign in to comment.