|
4 | 4 | import com.moulberry.axiom.event.AxiomModifyWorldEvent; |
5 | 5 | import io.netty.buffer.Unpooled; |
6 | 6 | import net.minecraft.core.BlockPos; |
| 7 | +import net.minecraft.core.Direction; |
7 | 8 | import net.minecraft.core.SectionPos; |
8 | 9 | import net.minecraft.network.FriendlyByteBuf; |
| 10 | +import net.minecraft.network.protocol.game.ClientboundBlockUpdatePacket; |
9 | 11 | import net.minecraft.server.level.ServerLevel; |
10 | 12 | import net.minecraft.server.level.ServerPlayer; |
11 | 13 | import net.minecraft.world.level.block.Block; |
|
17 | 19 | import net.minecraft.world.level.levelgen.Heightmap; |
18 | 20 | import net.minecraft.world.level.lighting.LightEngine; |
19 | 21 | import org.bukkit.Bukkit; |
| 22 | +import org.bukkit.Material; |
20 | 23 | import org.bukkit.craftbukkit.v1_20_R1.entity.CraftPlayer; |
| 24 | +import org.bukkit.craftbukkit.v1_20_R1.event.CraftEventFactory; |
21 | 25 | import org.bukkit.entity.Player; |
| 26 | +import org.bukkit.event.block.Action; |
| 27 | +import org.bukkit.event.block.BlockBreakEvent; |
22 | 28 | import org.bukkit.plugin.messaging.PluginMessageListener; |
23 | 29 | import org.jetbrains.annotations.NotNull; |
24 | 30 | import xyz.jpenilla.reflectionremapper.ReflectionRemapper; |
25 | 31 |
|
26 | 32 | import java.lang.reflect.InvocationTargetException; |
27 | 33 | import java.lang.reflect.Method; |
28 | 34 | import java.util.Map; |
29 | | -import java.util.logging.Level; |
30 | 35 |
|
31 | 36 | public class SetBlockPacketListener implements PluginMessageListener { |
32 | 37 |
|
@@ -68,7 +73,35 @@ public void onPluginMessageReceived(@NotNull String channel, @NotNull Player buk |
68 | 73 |
|
69 | 74 | ServerPlayer player = ((CraftPlayer)bukkitPlayer).getHandle(); |
70 | 75 |
|
71 | | - // Update blocks |
| 76 | + Material blockMaterial = blockState.getBukkitMaterial(); |
| 77 | + Action interactAction = blockMaterial == Material.AIR ? Action.LEFT_CLICK_BLOCK : Action.RIGHT_CLICK_BLOCK; |
| 78 | + BlockState oldBlockState = player.level().getBlockState(blockPos); |
| 79 | + |
| 80 | + if (CraftEventFactory.callPlayerInteractEvent(player, interactAction, blockPos.below(), Direction.UP, player.getInventory().getSelected(), player.getUsedItemHand()).isCancelled()) { |
| 81 | + player.connection.send(new ClientboundBlockUpdatePacket(blockPos, oldBlockState)); |
| 82 | + } else { |
| 83 | + updateBlock(player, updateNeighbors, blockPos, blockState); |
| 84 | + |
| 85 | + org.bukkit.block.Block bukkitBlock = bukkitPlayer.getWorld().getBlockAt(blockPos.getX(), blockPos.getY(), blockPos.getZ()); |
| 86 | + |
| 87 | + boolean cancelled; |
| 88 | + if (interactAction.isLeftClick()) { |
| 89 | + cancelled = !new BlockBreakEvent(bukkitBlock, bukkitPlayer).callEvent(); |
| 90 | + } else { |
| 91 | + cancelled = CraftEventFactory.callBlockPlaceEvent(player.serverLevel(), player, player.getUsedItemHand(), bukkitBlock.getState(), blockPos.getX(), blockPos.getY(), blockPos.getZ()).isCancelled(); |
| 92 | + } |
| 93 | + |
| 94 | + if (cancelled) { |
| 95 | + updateBlock(player, updateNeighbors, blockPos, oldBlockState); |
| 96 | + } |
| 97 | + } |
| 98 | + |
| 99 | + if (sequenceId >= 0) { |
| 100 | + player.connection.ackBlockChangesUpTo(sequenceId); |
| 101 | + } |
| 102 | + } |
| 103 | + |
| 104 | + private void updateBlock(ServerPlayer player, boolean updateNeighbors, BlockPos blockPos, BlockState blockState) { |
72 | 105 | if (updateNeighbors) { |
73 | 106 | player.level().setBlock(blockPos, blockState, 3); |
74 | 107 | } else { |
@@ -154,10 +187,6 @@ public void onPluginMessageReceived(@NotNull String channel, @NotNull Player buk |
154 | 187 | level.getChunkSource().getLightEngine().updateSectionStatus(SectionPos.of(cx, cy, cz), nowHasOnlyAir); |
155 | 188 | } |
156 | 189 | } |
157 | | - |
158 | | - if (sequenceId >= 0) { |
159 | | - player.connection.ackBlockChangesUpTo(sequenceId); |
160 | | - } |
161 | 190 | } |
162 | 191 |
|
163 | 192 | } |
0 commit comments