Skip to content

Commit a713c0e

Browse files
author
Ross
committed
Fix some issues with the retract event & sticky pistons
1 parent f0c1f85 commit a713c0e

File tree

1 file changed

+102
-9
lines changed

1 file changed

+102
-9
lines changed

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

Lines changed: 102 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,22 @@
1313
BlockState blockState = state.setValue(EXTENDED, true);
1414
if (!level.isClientSide) {
1515
boolean neighborSignal = this.getNeighborSignal(level, pos, direction);
16-
@@ -182,10 +_,17 @@
16+
@@ -165,7 +_,7 @@
17+
}
18+
19+
if (id == 0) {
20+
- if (!this.moveBlocks(level, pos, direction, true)) {
21+
+ if (this.moveBlocks(level, state, pos, direction, true) != MoveBlocksResult.SUCCESS) { // Paper - tristate return value
22+
return false;
23+
}
24+
25+
@@ -182,40 +_,70 @@
1726
.defaultBlockState()
1827
.setValue(MovingPistonBlock.FACING, direction)
1928
.setValue(MovingPistonBlock.TYPE, this.isSticky ? PistonType.STICKY : PistonType.DEFAULT);
2029
+ // Paper start - Fix sticky pistons and BlockPistonRetractEvent; Move empty piston retract call to fix multiple event fires
2130
+ if (!this.isSticky) {
22-
+ if (!new org.bukkit.event.block.BlockPistonRetractEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), java.util.Collections.emptyList(), org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(direction)).callEvent()) {
31+
+ if (!new org.bukkit.event.block.BlockPistonRetractEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), java.util.Collections.emptyList(), org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(direction.getOpposite())).callEvent()) {
2332
+ return false;
2433
+ }
2534
+ }
@@ -32,20 +41,50 @@
3241
)
3342
);
3443
level.updateNeighborsAt(pos, blockState1.getBlock());
35-
@@ -209,13 +_,27 @@
44+
- blockState1.updateNeighbourShapes(level, pos, 2);
45+
+ if (!this.isSticky) blockState1.updateNeighbourShapes(level, pos, 2); // Paper - move sticky update down until after piston event
46+
if (this.isSticky) {
47+
BlockPos blockPos = pos.offset(direction.getStepX() * 2, direction.getStepY() * 2, direction.getStepZ() * 2);
48+
BlockState blockState2 = level.getBlockState(blockPos);
49+
- boolean flag = false;
50+
+ boolean isWorkingMovingPiston = false; // Paper - OBFHELPER
51+
if (blockState2.is(Blocks.MOVING_PISTON)
52+
&& level.getBlockEntity(blockPos) instanceof PistonMovingBlockEntity pistonMovingBlockEntity
53+
&& pistonMovingBlockEntity.getDirection() == direction
54+
&& pistonMovingBlockEntity.isExtending()) {
55+
pistonMovingBlockEntity.finalTick();
56+
- flag = true;
57+
+ isWorkingMovingPiston = true; // Paper - OBFHELPER;
58+
}
59+
60+
- if (!flag) {
61+
+ if (isWorkingMovingPiston) blockState1.updateNeighbourShapes(level, pos, 2); // Paper - move this from right after creating the moving piston block entity to after the event call
62+
+ if (!isWorkingMovingPiston) { // Paper - OBFHELPER
63+
if (id != 1
64+
|| blockState2.isAir()
65+
|| !isPushable(blockState2, level, blockPos, direction.getOpposite(), false, direction)
3666
|| blockState2.getPistonPushReaction() != PushReaction.NORMAL
3767
&& !blockState2.is(Blocks.PISTON)
3868
&& !blockState2.is(Blocks.STICKY_PISTON)) {
3969
+ // Paper start - Fix sticky pistons and BlockPistonRetractEvent; fire BlockPistonRetractEvent for sticky pistons retracting nothing (air)
40-
+ if (id == TRIGGER_CONTRACT && blockState1.isAir()) {
41-
+ if (!new org.bukkit.event.block.BlockPistonRetractEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), java.util.Collections.emptyList(), org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(direction)).callEvent()) {
70+
+ if (id == TRIGGER_CONTRACT) {
71+
+ if (!new org.bukkit.event.block.BlockPistonRetractEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), java.util.Collections.emptyList(), org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(direction.getOpposite())).callEvent()) {
72+
+ level.removeBlockEntity(pos);
73+
+ level.setBlock(pos, state, Block.UPDATE_KNOWN_SHAPE | Block.UPDATE_SKIP_ON_PLACE);
4274
+ return false;
4375
+ }
4476
+ }
77+
+ blockState1.updateNeighbourShapes(level, pos, 2); // move this from right after creating the moving piston block entity to after the event call
4578
+ // Paper end - Fix sticky pistons and BlockPistonRetractEvent
4679
level.removeBlock(pos.relative(direction), false);
4780
} else {
48-
this.moveBlocks(level, pos, direction, false);
81+
- this.moveBlocks(level, pos, direction, false);
82+
+ // Paper start - check return value
83+
+ if (this.moveBlocks(level, state, pos, direction, false) == MoveBlocksResult.CANCEL) {
84+
+ return false;
85+
+ }
86+
+ blockState1.updateNeighbourShapes(level, pos, 2); // move this from right after creating the moving piston block entity to after the event call
87+
+ // Paper end
4988
}
5089
}
5190
} else {
@@ -70,9 +109,47 @@
70109
return false;
71110
} else if (state.isAir()) {
72111
return true;
73-
@@ -282,12 +_,54 @@
112+
@@ -258,15 +_,31 @@
113+
}
114+
}
115+
116+
- private boolean moveBlocks(Level level, BlockPos pos, Direction facing, boolean extending) {
117+
+ private enum MoveBlocksResult { FAIL, CANCEL, SUCCESS } // Paper
118+
+
119+
+ private MoveBlocksResult moveBlocks(Level level, BlockState oldState, BlockPos pos, Direction facing, boolean extending) { // Paper
120+
BlockPos blockPos = pos.relative(facing);
121+
- if (!extending && level.getBlockState(blockPos).is(Blocks.PISTON_HEAD)) {
122+
+ // Paper start
123+
+ final BlockState pistonHead = level.getBlockState(blockPos);
124+
+ if (!extending && pistonHead.is(Blocks.PISTON_HEAD)) {
125+
+ // Paper end
126+
level.setBlock(blockPos, Blocks.AIR.defaultBlockState(), 276);
127+
}
128+
129+
PistonStructureResolver pistonStructureResolver = new PistonStructureResolver(level, pos, facing, extending);
130+
+ Direction direction = extending ? facing : facing.getOpposite(); // Paper - moved from below
131+
if (!pistonStructureResolver.resolve()) {
132+
- return false;
133+
+ // Paper start - fire event if piston retracts without moving blocks
134+
+ if (!extending) {
135+
+ if (!new org.bukkit.event.block.BlockPistonRetractEvent(org.bukkit.craftbukkit.block.CraftBlock.at(level, pos), java.util.Collections.emptyList(), org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(direction)).callEvent()) {
136+
+ level.removeBlockEntity(pos);
137+
+ level.setBlock(pos, oldState, Block.UPDATE_KNOWN_SHAPE | Block.UPDATE_SKIP_ON_PLACE);
138+
+ level.setBlock(blockPos, pistonHead, Block.UPDATE_KNOWN_SHAPE | Block.UPDATE_SKIP_ON_PLACE);
139+
+ return MoveBlocksResult.CANCEL;
140+
+ }
141+
+ }
142+
+ return MoveBlocksResult.FAIL;
143+
+ // Paper end
144+
} else {
145+
Map<BlockPos, BlockState> map = Maps.newHashMap();
146+
List<BlockPos> toPush = pistonStructureResolver.getToPush();
147+
@@ -280,14 +_,63 @@
148+
149+
List<BlockPos> toDestroy = pistonStructureResolver.getToDestroy();
74150
BlockState[] blockStates = new BlockState[toPush.size() + toDestroy.size()];
75-
Direction direction = extending ? facing : facing.getOpposite();
151+
- Direction direction = extending ? facing : facing.getOpposite();
152+
+ // Paper - moved up
76153
int i = 0;
77154
+ // CraftBukkit start
78155
+ final org.bukkit.block.Block bukkitBlock = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
@@ -105,6 +182,13 @@
105182
+ event = new org.bukkit.event.block.BlockPistonRetractEvent(bukkitBlock, blocks, org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(direction));
106183
+ }
107184
+ if (!event.callEvent()) {
185+
+ // Paper start
186+
+ if(!extending) {
187+
+ level.removeBlockEntity(pos);
188+
+ level.setBlock(pos, oldState, Block.UPDATE_KNOWN_SHAPE | Block.UPDATE_SKIP_ON_PLACE);
189+
+ level.setBlock(blockPos, pistonHead, Block.UPDATE_KNOWN_SHAPE | Block.UPDATE_SKIP_ON_PLACE);
190+
+ }
191+
+ // Paper end
108192
+ for (BlockPos brokenPos : broken) {
109193
+ level.sendBlockUpdated(brokenPos, Blocks.AIR.defaultBlockState(), level.getBlockState(brokenPos), Block.UPDATE_ALL);
110194
+ }
@@ -113,7 +197,7 @@
113197
+ movedPos = movedPos.relative(direction);
114198
+ level.sendBlockUpdated(movedPos, Blocks.AIR.defaultBlockState(), level.getBlockState(movedPos), Block.UPDATE_ALL);
115199
+ }
116-
+ return false;
200+
+ return MoveBlocksResult.CANCEL; // Paper
117201
+ }
118202
+ // CraftBukkit end
119203

@@ -156,3 +240,12 @@
156240
blockStates[i++] = blockState1;
157241
}
158242

243+
@@ -359,7 +_,7 @@
244+
level.updateNeighborsAt(blockPos, Blocks.PISTON_HEAD, orientation);
245+
}
246+
247+
- return true;
248+
+ return MoveBlocksResult.SUCCESS; // Paper
249+
}
250+
}
251+

0 commit comments

Comments
 (0)