Skip to content

Commit 6f28da7

Browse files
committed
Call BlockRedstoneEvent for more interactions
1 parent 8de7e35 commit 6f28da7

31 files changed

+282
-280
lines changed
Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,70 @@
11
package org.bukkit.event.block;
22

3+
import com.google.common.base.Preconditions;
34
import org.bukkit.block.Block;
45
import org.bukkit.event.HandlerList;
5-
import org.jetbrains.annotations.NotNull;
6+
import org.checkerframework.common.value.qual.IntRange;
7+
import org.jetbrains.annotations.ApiStatus;
8+
import org.jspecify.annotations.NullMarked;
69

710
/**
8-
* Called when a redstone current changes
11+
* Called when a redstone current changes.
12+
* <p>
13+
* It includes the relevant mutation of the {@code powered} and {@code power}
14+
* properties even if the source block is not able to produce
15+
* power. For the {@code powered} property, a high state will be considered as
16+
* a current of 15 and a low state as 0. Setting the new current to a different
17+
* value will cancel most action in this case.
918
*/
19+
@NullMarked
1020
public class BlockRedstoneEvent extends BlockEvent {
11-
private static final HandlerList handlers = new HandlerList();
21+
22+
private static final HandlerList HANDLER_LIST = new HandlerList();
23+
1224
private final int oldCurrent;
1325
private int newCurrent;
1426

15-
public BlockRedstoneEvent(@NotNull final Block block, final int oldCurrent, final int newCurrent) {
27+
@ApiStatus.Internal
28+
public BlockRedstoneEvent(final Block block, final int oldCurrent, final int newCurrent) {
1629
super(block);
1730
this.oldCurrent = oldCurrent;
1831
this.newCurrent = newCurrent;
1932
}
2033

2134
/**
22-
* Gets the old current of this block
35+
* Gets the old current of this block.
2336
*
24-
* @return The previous current
37+
* @return the previous current
2538
*/
26-
public int getOldCurrent() {
27-
return oldCurrent;
39+
public @IntRange(from = 0, to = 15) int getOldCurrent() {
40+
return this.oldCurrent;
2841
}
2942

3043
/**
31-
* Gets the new current of this block
44+
* Gets the new current of this block.
3245
*
33-
* @return The new current
46+
* @return the new current
3447
*/
35-
public int getNewCurrent() {
36-
return newCurrent;
48+
public @IntRange(from = 0, to = 15) int getNewCurrent() {
49+
return this.newCurrent;
3750
}
3851

3952
/**
40-
* Sets the new current of this block
53+
* Sets the new current of this block.
4154
*
42-
* @param newCurrent The new current to set
55+
* @param newCurrent the new current to set
4356
*/
44-
public void setNewCurrent(int newCurrent) {
57+
public void setNewCurrent(@IntRange(from = 0, to = 15) int newCurrent) {
58+
Preconditions.checkArgument(newCurrent >= 0 && newCurrent <= 15, "New current must be a redstone signal between 0 and 15 (was %s)", newCurrent);
4559
this.newCurrent = newCurrent;
4660
}
4761

48-
@NotNull
4962
@Override
5063
public HandlerList getHandlers() {
51-
return handlers;
64+
return HANDLER_LIST;
5265
}
5366

54-
@NotNull
5567
public static HandlerList getHandlerList() {
56-
return handlers;
68+
return HANDLER_LIST;
5769
}
5870
}

paper-server/patches/features/0018-Eigencraft-redstone-implementation.patch

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ Co-authored-by: egg82 <[email protected]>
1919

2020
diff --git a/io/papermc/paper/redstone/RedstoneWireTurbo.java b/io/papermc/paper/redstone/RedstoneWireTurbo.java
2121
new file mode 100644
22-
index 0000000000000000000000000000000000000000..ff747a1ecdf3c888bca0d69de4f85dcd810b6139
22+
index 0000000000000000000000000000000000000000..759211f717ad117b4d4ab00445a811eccba30915
2323
--- /dev/null
2424
+++ b/io/papermc/paper/redstone/RedstoneWireTurbo.java
25-
@@ -0,0 +1,954 @@
25+
@@ -0,0 +1,951 @@
2626
+package io.papermc.paper.redstone;
2727
+
2828
+import java.util.List;
@@ -36,8 +36,7 @@ index 0000000000000000000000000000000000000000..ff747a1ecdf3c888bca0d69de4f85dcd
3636
+import net.minecraft.world.level.block.Block;
3737
+import net.minecraft.world.level.block.RedStoneWireBlock;
3838
+import net.minecraft.world.level.block.state.BlockState;
39-
+import org.bukkit.craftbukkit.block.CraftBlock;
40-
+import org.bukkit.event.block.BlockRedstoneEvent;
39+
+import org.bukkit.craftbukkit.event.CraftEventFactory;
4140
+
4241
+import com.google.common.collect.Lists;
4342
+import com.google.common.collect.Maps;
@@ -917,9 +916,7 @@ index 0000000000000000000000000000000000000000..ff747a1ecdf3c888bca0d69de4f85dcd
917916
+ // egg82's amendment
918917
+ // Adding Bukkit's BlockRedstoneEvent - er.. event.
919918
+ if (i != j) {
920-
+ BlockRedstoneEvent event = new BlockRedstoneEvent(CraftBlock.at(worldIn, upd.self), i, j);
921-
+ worldIn.getCraftServer().getPluginManager().callEvent(event);
922-
+ j = event.getNewCurrent();
919+
+ j = CraftEventFactory.callRedstoneChange(worldIn, upd.self, i, j).getNewCurrent();
923920
+ }
924921
+
925922
+ if (i != j) {
@@ -978,10 +975,10 @@ index 0000000000000000000000000000000000000000..ff747a1ecdf3c888bca0d69de4f85dcd
978975
+ }
979976
+}
980977
diff --git a/net/minecraft/world/level/block/RedStoneWireBlock.java b/net/minecraft/world/level/block/RedStoneWireBlock.java
981-
index 84e6c986917128d4488afa23d29c689cadb4f55d..f02232ce97779db0d12a5d5da1d767326d78ea4c 100644
978+
index 84e6c986917128d4488afa23d29c689cadb4f55d..ebabc60f1be221536ba082d606fac3dd20a069da 100644
982979
--- a/net/minecraft/world/level/block/RedStoneWireBlock.java
983980
+++ b/net/minecraft/world/level/block/RedStoneWireBlock.java
984-
@@ -290,6 +290,60 @@ public class RedStoneWireBlock extends Block {
981+
@@ -290,6 +290,57 @@ public class RedStoneWireBlock extends Block {
985982
return state.isFaceSturdy(level, pos, Direction.UP) || state.is(Blocks.HOPPER);
986983
}
987984

@@ -1021,10 +1018,7 @@ index 84e6c986917128d4488afa23d29c689cadb4f55d..f02232ce97779db0d12a5d5da1d76732
10211018
+ int oldPower = state.getValue(POWER);
10221019
+ int newPower = ((DefaultRedstoneWireEvaluator) evaluator).calculateTargetStrength(level, pos);
10231020
+ if (oldPower != newPower) {
1024-
+ org.bukkit.event.block.BlockRedstoneEvent event = new org.bukkit.event.block.BlockRedstoneEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), oldPower, newPower);
1025-
+ level.getCraftServer().getPluginManager().callEvent(event);
1026-
+
1027-
+ newPower = event.getNewCurrent();
1021+
+ newPower = org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(level, pos, oldPower, newPower).getNewCurrent();
10281022
+
10291023
+ if (level.getBlockState(pos) == state) {
10301024
+ state = state.setValue(POWER, newPower);
@@ -1042,7 +1036,7 @@ index 84e6c986917128d4488afa23d29c689cadb4f55d..f02232ce97779db0d12a5d5da1d76732
10421036
private void updatePowerStrength(Level level, BlockPos pos, BlockState state, @Nullable Orientation orientation, boolean updateShape) {
10431037
if (useExperimentalEvaluator(level)) {
10441038
new ExperimentalRedstoneWireEvaluator(this).updatePowerStrength(level, pos, state, orientation, updateShape);
1045-
@@ -318,7 +372,7 @@ public class RedStoneWireBlock extends Block {
1039+
@@ -318,7 +369,7 @@ public class RedStoneWireBlock extends Block {
10461040
@Override
10471041
protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) {
10481042
if (!oldState.is(state.getBlock()) && !level.isClientSide) {
@@ -1051,7 +1045,7 @@ index 84e6c986917128d4488afa23d29c689cadb4f55d..f02232ce97779db0d12a5d5da1d76732
10511045

10521046
for (Direction direction : Direction.Plane.VERTICAL) {
10531047
level.updateNeighborsAt(pos.relative(direction), this);
1054-
@@ -337,7 +391,7 @@ public class RedStoneWireBlock extends Block {
1048+
@@ -337,7 +388,7 @@ public class RedStoneWireBlock extends Block {
10551049
level.updateNeighborsAt(pos.relative(direction), this);
10561050
}
10571051

@@ -1060,7 +1054,7 @@ index 84e6c986917128d4488afa23d29c689cadb4f55d..f02232ce97779db0d12a5d5da1d76732
10601054
this.updateNeighborsOfNeighboringWires(level, pos);
10611055
}
10621056
}
1063-
@@ -363,7 +417,7 @@ public class RedStoneWireBlock extends Block {
1057+
@@ -363,7 +414,7 @@ public class RedStoneWireBlock extends Block {
10641058
if (!level.isClientSide) {
10651059
if (neighborBlock != this || !useExperimentalEvaluator(level)) {
10661060
if (state.canSurvive(level, pos)) {
@@ -1070,10 +1064,10 @@ index 84e6c986917128d4488afa23d29c689cadb4f55d..f02232ce97779db0d12a5d5da1d76732
10701064
dropResources(state, level, pos);
10711065
level.removeBlock(pos, false);
10721066
diff --git a/net/minecraft/world/level/redstone/DefaultRedstoneWireEvaluator.java b/net/minecraft/world/level/redstone/DefaultRedstoneWireEvaluator.java
1073-
index 380fc51a252022195e178daccd8aa53dd1d71a2e..2d77780b6727f82ffc3cb216ca5f2d6483496cfd 100644
1067+
index d5e8e5fbcd6f3429ff081da6cd08acfc40091765..71ec6c89f1254ed625ddf7da96c32fcd2a0f6ea3 100644
10741068
--- a/net/minecraft/world/level/redstone/DefaultRedstoneWireEvaluator.java
10751069
+++ b/net/minecraft/world/level/redstone/DefaultRedstoneWireEvaluator.java
1076-
@@ -44,7 +44,7 @@ public class DefaultRedstoneWireEvaluator extends RedstoneWireEvaluator {
1070+
@@ -41,7 +41,7 @@ public class DefaultRedstoneWireEvaluator extends RedstoneWireEvaluator {
10771071
}
10781072
}
10791073

paper-server/patches/features/0019-Add-Alternate-Current-redstone-implementation.patch

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,12 @@ Alternate Current's wire handler.
2222

2323
diff --git a/alternate/current/wire/LevelHelper.java b/alternate/current/wire/LevelHelper.java
2424
new file mode 100644
25-
index 0000000000000000000000000000000000000000..ff663d3089627e75221aa128aff4bf5cc459addb
25+
index 0000000000000000000000000000000000000000..1f25361857a31afcb4df33123a9ef9e0a7038dbb
2626
--- /dev/null
2727
+++ b/alternate/current/wire/LevelHelper.java
28-
@@ -0,0 +1,66 @@
28+
@@ -0,0 +1,60 @@
2929
+package alternate.current.wire;
3030
+
31-
+import org.bukkit.craftbukkit.block.CraftBlock;
32-
+import org.bukkit.event.block.BlockRedstoneEvent;
33-
+
3431
+import net.minecraft.core.BlockPos;
3532
+import net.minecraft.server.level.ServerLevel;
3633
+import net.minecraft.world.level.block.Block;
@@ -42,10 +39,7 @@ index 0000000000000000000000000000000000000000..ff663d3089627e75221aa128aff4bf5c
4239
+class LevelHelper {
4340
+
4441
+ static int doRedstoneEvent(ServerLevel level, BlockPos pos, int prevPower, int newPower) {
45-
+ BlockRedstoneEvent event = new BlockRedstoneEvent(CraftBlock.at(level, pos), prevPower, newPower);
46-
+ level.getCraftServer().getPluginManager().callEvent(event);
47-
+
48-
+ return event.getNewCurrent();
42+
+ return org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(level, pos, prevPower, newPower).getNewCurrent();
4943
+ }
5044
+
5145
+ /**
@@ -2326,7 +2320,7 @@ index 0000000000000000000000000000000000000000..298076a0db4e6ee6e4775ac43bf749d9
23262320
+ }
23272321
+}
23282322
diff --git a/net/minecraft/server/level/ServerLevel.java b/net/minecraft/server/level/ServerLevel.java
2329-
index a293d1481b5f4a1d18addc3e518486c639223f09..5bf38ab129451e867b638cfbd2d7be59cbf7f38d 100644
2323+
index a275b17d0852d9d9bc850614713244e580ae81f1..cb48a68ad6ba722276e0e5d5ab9b0da3301caac2 100644
23302324
--- a/net/minecraft/server/level/ServerLevel.java
23312325
+++ b/net/minecraft/server/level/ServerLevel.java
23322326
@@ -214,6 +214,7 @@ public class ServerLevel extends Level implements ServerEntityGetter, WorldGenLe
@@ -2374,7 +2368,7 @@ index a768f041fd16d253ec4ab5eb75288b1771d5cb00..1dbe7c7c1051c3972105534a07ce50d4
23742368
NONE("none"),
23752369
BLOCK("block"),
23762370
diff --git a/net/minecraft/world/level/block/RedStoneWireBlock.java b/net/minecraft/world/level/block/RedStoneWireBlock.java
2377-
index f02232ce97779db0d12a5d5da1d767326d78ea4c..12c9d60314c99fb65e640d255a2d0c6b7790ad4d 100644
2371+
index ebabc60f1be221536ba082d606fac3dd20a069da..2d2169caa5e8ba47f69e8b0f4138a0caa32f1f1a 100644
23782372
--- a/net/minecraft/world/level/block/RedStoneWireBlock.java
23792373
+++ b/net/minecraft/world/level/block/RedStoneWireBlock.java
23802374
@@ -290,7 +290,7 @@ public class RedStoneWireBlock extends Block {
@@ -2386,7 +2380,7 @@ index f02232ce97779db0d12a5d5da1d767326d78ea4c..12c9d60314c99fb65e640d255a2d0c6b
23862380
// The bulk of the new functionality is found in RedstoneWireTurbo.java
23872381
io.papermc.paper.redstone.RedstoneWireTurbo turbo = new io.papermc.paper.redstone.RedstoneWireTurbo(this);
23882382

2389-
@@ -372,7 +372,13 @@ public class RedStoneWireBlock extends Block {
2383+
@@ -369,7 +369,13 @@ public class RedStoneWireBlock extends Block {
23902384
@Override
23912385
protected void onPlace(BlockState state, Level level, BlockPos pos, BlockState oldState, boolean isMoving) {
23922386
if (!oldState.is(state.getBlock()) && !level.isClientSide) {
@@ -2401,7 +2395,7 @@ index f02232ce97779db0d12a5d5da1d767326d78ea4c..12c9d60314c99fb65e640d255a2d0c6b
24012395

24022396
for (Direction direction : Direction.Plane.VERTICAL) {
24032397
level.updateNeighborsAt(pos.relative(direction), this);
2404-
@@ -391,7 +397,13 @@ public class RedStoneWireBlock extends Block {
2398+
@@ -388,7 +394,13 @@ public class RedStoneWireBlock extends Block {
24052399
level.updateNeighborsAt(pos.relative(direction), this);
24062400
}
24072401

@@ -2416,7 +2410,7 @@ index f02232ce97779db0d12a5d5da1d767326d78ea4c..12c9d60314c99fb65e640d255a2d0c6b
24162410
this.updateNeighborsOfNeighboringWires(level, pos);
24172411
}
24182412
}
2419-
@@ -415,9 +427,15 @@ public class RedStoneWireBlock extends Block {
2413+
@@ -412,9 +424,15 @@ public class RedStoneWireBlock extends Block {
24202414
@Override
24212415
protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) {
24222416
if (!level.isClientSide) {
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
--- a/net/minecraft/world/level/block/AbstractSkullBlock.java
2+
+++ b/net/minecraft/world/level/block/AbstractSkullBlock.java
3+
@@ -75,6 +_,11 @@
4+
if (!level.isClientSide) {
5+
boolean hasNeighborSignal = level.hasNeighborSignal(pos);
6+
if (hasNeighborSignal != state.getValue(POWERED)) {
7+
+ // Paper start - Call BlockRedstoneEvent
8+
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBinaryRedstoneChange(level, pos, hasNeighborSignal)) {
9+
+ return;
10+
+ }
11+
+ // Paper end - Call BlockRedstoneEvent
12+
level.setBlock(pos, state.setValue(POWERED, Boolean.valueOf(hasNeighborSignal)), 2);
13+
}
14+
}

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

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,21 @@
88
if (!level.isClientSide) {
99
int signalForState = this.getSignalForState(state);
1010
if (signalForState == 0) {
11-
@@ -93,6 +_,19 @@
11+
@@ -93,7 +_,14 @@
1212
int signalStrength = this.getSignalStrength(level, pos);
1313
boolean flag = currentSignal > 0;
1414
boolean flag1 = signalStrength > 0;
15-
+
16-
+ // CraftBukkit start - Interact Pressure Plate
17-
+ org.bukkit.World bworld = level.getWorld();
18-
+ org.bukkit.plugin.PluginManager manager = level.getCraftServer().getPluginManager();
1915
+
20-
+ if (flag != flag1) {
21-
+ org.bukkit.event.block.BlockRedstoneEvent eventRedstone = new org.bukkit.event.block.BlockRedstoneEvent(bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ()), currentSignal, signalStrength);
22-
+ manager.callEvent(eventRedstone);
23-
+
24-
+ flag1 = eventRedstone.getNewCurrent() > 0;
25-
+ signalStrength = eventRedstone.getNewCurrent();
26-
+ }
27-
+ // CraftBukkit end
2816
if (currentSignal != signalStrength) {
17+
+ // CraftBukkit start
18+
+ org.bukkit.event.block.BlockRedstoneEvent event = org.bukkit.craftbukkit.event.CraftEventFactory.callRedstoneChange(level, pos, currentSignal, signalStrength);
19+
+
20+
+ signalStrength = event.getNewCurrent();
21+
+ flag1 = signalStrength > 0;
22+
+ // CraftBukkit end
2923
BlockState blockState = this.setSignalForState(state, signalStrength);
3024
level.setBlock(pos, blockState, 2);
25+
this.updateNeighbours(level, pos);
3126
@@ -145,7 +_,13 @@
3227
}
3328

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
--- a/net/minecraft/world/level/block/BellBlock.java
22
+++ b/net/minecraft/world/level/block/BellBlock.java
3+
@@ -75,6 +_,11 @@
4+
protected void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, @Nullable Orientation orientation, boolean movedByPiston) {
5+
boolean hasNeighborSignal = level.hasNeighborSignal(pos);
6+
if (hasNeighborSignal != state.getValue(POWERED)) {
7+
+ // Paper start - Call BlockRedstoneEvent
8+
+ if (!org.bukkit.craftbukkit.event.CraftEventFactory.callBinaryRedstoneChange(level, pos, hasNeighborSignal)) {
9+
+ return;
10+
+ }
11+
+ // Paper end - Call BlockRedstoneEvent
12+
if (hasNeighborSignal) {
13+
this.attemptToRing(level, pos, null);
14+
}
315
@@ -142,6 +_,11 @@
416
direction = level.getBlockState(pos).getValue(FACING);
517
}

0 commit comments

Comments
 (0)