|
13 | 13 | BlockState blockState = state.setValue(EXTENDED, true);
|
14 | 14 | if (!level.isClientSide) {
|
15 | 15 | 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 @@ |
17 | 26 | .defaultBlockState()
|
18 | 27 | .setValue(MovingPistonBlock.FACING, direction)
|
19 | 28 | .setValue(MovingPistonBlock.TYPE, this.isSticky ? PistonType.STICKY : PistonType.DEFAULT);
|
20 | 29 | + // Paper start - Fix sticky pistons and BlockPistonRetractEvent; Move empty piston retract call to fix multiple event fires
|
21 | 30 | + 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()) { |
23 | 32 | + return false;
|
24 | 33 | + }
|
25 | 34 | + }
|
|
32 | 41 | )
|
33 | 42 | );
|
34 | 43 | 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) |
36 | 66 | || blockState2.getPistonPushReaction() != PushReaction.NORMAL
|
37 | 67 | && !blockState2.is(Blocks.PISTON)
|
38 | 68 | && !blockState2.is(Blocks.STICKY_PISTON)) {
|
39 | 69 | + // 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); |
42 | 74 | + return false;
|
43 | 75 | + }
|
44 | 76 | + }
|
| 77 | ++ blockState1.updateNeighbourShapes(level, pos, 2); // move this from right after creating the moving piston block entity to after the event call |
45 | 78 | + // Paper end - Fix sticky pistons and BlockPistonRetractEvent
|
46 | 79 | level.removeBlock(pos.relative(direction), false);
|
47 | 80 | } 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 |
49 | 88 | }
|
50 | 89 | }
|
51 | 90 | } else {
|
|
70 | 109 | return false;
|
71 | 110 | } else if (state.isAir()) {
|
72 | 111 | 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(); |
74 | 150 | 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 |
76 | 153 | int i = 0;
|
77 | 154 | + // CraftBukkit start
|
78 | 155 | + final org.bukkit.block.Block bukkitBlock = org.bukkit.craftbukkit.block.CraftBlock.at(level, pos);
|
|
105 | 182 | + event = new org.bukkit.event.block.BlockPistonRetractEvent(bukkitBlock, blocks, org.bukkit.craftbukkit.block.CraftBlock.notchToBlockFace(direction));
|
106 | 183 | + }
|
107 | 184 | + 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 |
108 | 192 | + for (BlockPos brokenPos : broken) {
|
109 | 193 | + level.sendBlockUpdated(brokenPos, Blocks.AIR.defaultBlockState(), level.getBlockState(brokenPos), Block.UPDATE_ALL);
|
110 | 194 | + }
|
|
113 | 197 | + movedPos = movedPos.relative(direction);
|
114 | 198 | + level.sendBlockUpdated(movedPos, Blocks.AIR.defaultBlockState(), level.getBlockState(movedPos), Block.UPDATE_ALL);
|
115 | 199 | + }
|
116 |
| -+ return false; |
| 200 | ++ return MoveBlocksResult.CANCEL; // Paper |
117 | 201 | + }
|
118 | 202 | + // CraftBukkit end
|
119 | 203 |
|
|
156 | 240 | blockStates[i++] = blockState1;
|
157 | 241 | }
|
158 | 242 |
|
| 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