|
3 | 3 | import com.moulberry.axiom.AxiomPaper; |
4 | 4 | import io.netty.buffer.Unpooled; |
5 | 5 | import net.minecraft.core.BlockPos; |
| 6 | +import net.minecraft.core.Direction; |
6 | 7 | import net.minecraft.core.SectionPos; |
7 | 8 | import net.minecraft.network.FriendlyByteBuf; |
| 9 | +import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; |
8 | 10 | import net.minecraft.server.level.ServerLevel; |
9 | 11 | import net.minecraft.server.level.ServerPlayer; |
10 | 12 | import net.minecraft.world.level.block.Block; |
|
15 | 17 | import net.minecraft.world.level.chunk.LevelChunkSection; |
16 | 18 | import net.minecraft.world.level.levelgen.Heightmap; |
17 | 19 | import net.minecraft.world.level.lighting.LightEngine; |
| 20 | +import org.bukkit.Material; |
18 | 21 | import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; |
| 22 | +import org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory; |
19 | 23 | import org.bukkit.entity.Player; |
| 24 | +import org.bukkit.event.block.Action; |
| 25 | +import org.bukkit.event.block.BlockBreakEvent; |
20 | 26 | import org.bukkit.plugin.messaging.PluginMessageListener; |
21 | 27 | import org.jetbrains.annotations.NotNull; |
22 | 28 | import xyz.jpenilla.reflectionremapper.ReflectionRemapper; |
23 | 29 |
|
24 | 30 | import java.lang.reflect.InvocationTargetException; |
25 | 31 | import java.lang.reflect.Method; |
26 | 32 | import java.util.Map; |
27 | | -import java.util.logging.Level; |
28 | 33 |
|
29 | 34 | public class SetBlockPacketListener implements PluginMessageListener { |
30 | 35 |
|
@@ -60,6 +65,35 @@ public void onPluginMessageReceived(@NotNull String channel, @NotNull Player buk |
60 | 65 |
|
61 | 66 | ServerPlayer player = ((CraftPlayer)bukkitPlayer).getHandle(); |
62 | 67 |
|
| 68 | + Material blockMaterial = blockState.getBukkitMaterial(); |
| 69 | + Action interactAction = blockMaterial == Material.AIR ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; |
| 70 | + BlockState oldBlockState = player.level().getBlockState(blockPos); |
| 71 | + |
| 72 | + if (CraftEventFactory.callPlayerInteractEvent(player, interactAction, blockPos.below(), Direction.UP, player.getInventory().getSelected(), player.getUsedItemHand()).isCancelled()) { |
| 73 | + player.connection.send(new ClientboundBlockUpdatePacket(blockPos, oldBlockState)); |
| 74 | + } else { |
| 75 | + setBlock(player, updateNeighbors, blockPos, blockState); |
| 76 | + |
| 77 | + org.bukkit.block.Block bukkitBlock = bukkitPlayer.getWorld().getBlockAt(blockPos.getX(), blockPos.getY(), blockPos.getZ()); |
| 78 | + |
| 79 | + boolean cancelled; |
| 80 | + if (interactAction.isLeftClick()) { |
| 81 | + cancelled = !new BlockBreakEvent(bukkitBlock, bukkitPlayer).callEvent(); |
| 82 | + } else { |
| 83 | + cancelled = CraftEventFactory.callBlockPlaceEvent(player.serverLevel(), player, player.getUsedItemHand(), bukkitBlock.getState(), blockPos.getX(), blockPos.getY(), blockPos.getZ()).isCancelled(); |
| 84 | + } |
| 85 | + |
| 86 | + if (cancelled) { |
| 87 | + setBlock(player, updateNeighbors, blockPos, oldBlockState); |
| 88 | + } |
| 89 | + } |
| 90 | + |
| 91 | + if (sequenceId >= 0) { |
| 92 | + player.connection.ackBlockChangesUpTo(sequenceId); |
| 93 | + } |
| 94 | + } |
| 95 | + |
| 96 | + private void setBlock(ServerPlayer player, boolean updateNeighbors, BlockPos blockPos, BlockState blockState) { |
63 | 97 | if (updateNeighbors) { |
64 | 98 | player.level().setBlock(blockPos, blockState, 3); |
65 | 99 | } else { |
@@ -147,10 +181,6 @@ public void onPluginMessageReceived(@NotNull String channel, @NotNull Player buk |
147 | 181 | level.getChunkSource().getLightEngine().updateSectionStatus(SectionPos.of(cx, cy, cz), nowHasOnlyAir); |
148 | 182 | } |
149 | 183 | } |
150 | | - |
151 | | - if (sequenceId >= 0) { |
152 | | - player.connection.ackBlockChangesUpTo(sequenceId); |
153 | | - } |
154 | 184 | } |
155 | 185 |
|
156 | 186 | } |
0 commit comments