diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/NoClipCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/NoClipCommand.java index 91a79f5e..9994e3d4 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/NoClipCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/NoClipCommand.java @@ -22,123 +22,71 @@ package de.steamwar.bausystem.features.util; import com.comphenix.tinyprotocol.TinyProtocol; import com.mojang.authlib.GameProfile; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.features.tpslimit.TPSUtils; import de.steamwar.bausystem.utils.BauMemberUpdateEvent; import de.steamwar.command.SWCommand; import de.steamwar.core.ProtocolWrapper; import de.steamwar.core.SWPlayer; import de.steamwar.linkage.Linked; -import net.minecraft.network.protocol.game.*; -import net.minecraft.world.entity.player.Abilities; -import net.minecraft.world.level.GameType; -import org.bukkit.Bukkit; +import io.papermc.paper.event.player.PlayerFailMoveEvent; +import net.minecraft.network.protocol.game.ClientboundGameEventPacket; import org.bukkit.GameMode; -import org.bukkit.craftbukkit.entity.CraftPlayer; -import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockCanBuildEvent; import org.bukkit.event.player.PlayerGameModeChangeEvent; -import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerToggleFlightEvent; -import java.util.function.BiFunction; - @Linked public class NoClipCommand extends SWCommand implements Listener { public static class NoClipData implements SWPlayer.Component { - private long lastTick = -1; - @Override - public void onUnmount(SWPlayer player) { - player.getPlayer().setGameMode(GameMode.CREATIVE); + public void onUnmount(SWPlayer swPlayer) { + Player player = swPlayer.getPlayer(); + showClientGameMode(player, GameMode.CREATIVE, GameMode.CREATIVE); } } public NoClipCommand() { super("noclip", "nc"); - - BiFunction first = (player, o) -> { - NoClipData noClipData = SWPlayer.of(player).getComponent(NoClipData.class).orElse(null); - if (noClipData == null) return o; - if (noClipData.lastTick == TPSUtils.currentTick.get()) return o; - setInternalGameMode(player, GameMode.SPECTATOR); - noClipData.lastTick = TPSUtils.currentTick.get(); - return o; - }; - TinyProtocol.instance.addFilter(ServerboundMovePlayerPacket.Pos.class, first); - TinyProtocol.instance.addFilter(ServerboundMovePlayerPacket.PosRot.class, first); - - BiFunction second = (player, o) -> { - NoClipData noClipData = SWPlayer.of(player).getComponent(NoClipData.class).orElse(null); - if (noClipData == null) return o; - setInternalGameMode(player, GameMode.CREATIVE); - noClipData.lastTick = TPSUtils.currentTick.get(); - return o; - }; - TinyProtocol.instance.addFilter(ServerboundUseItemOnPacket.class, second); - TinyProtocol.instance.addFilter(ServerboundPlayerActionPacket.class, second); - TinyProtocol.instance.addFilter(ServerboundContainerClickPacket.class, second); - - BiFunction third = (player, o) -> { - if (SWPlayer.of(player).hasComponent(NoClipData.class)) { - int index = o.slotNum(); - if (index >= 36 && index <= 44) { - index -= 36; - } else if (index > 44) { - index -= 5; - } else if (index <= 8) { - index = index - 8 + 36; - } - player.getInventory().setItem(index, CraftItemStack.asBukkitCopy(o.itemStack())); - if (index < 9) player.getInventory().setHeldItemSlot(index); - player.updateInventory(); - } - return o; - }; - TinyProtocol.instance.addFilter(ServerboundSetCreativeModeSlotPacket.class, third); } - private void setInternalGameMode(Player player, GameMode gameMode) { - ((CraftPlayer) player).getHandle().gameMode.gameModeForPlayer = GameType.byId(gameMode.getValue()); - } - - @Register(help = true) + @Register public void genericCommand(@Validator Player player) { SWPlayer swPlayer = SWPlayer.of(player); if (swPlayer.hasComponent(NoClipData.class)) { swPlayer.removeComponent(NoClipData.class); } else { - player.setGameMode(GameMode.SPECTATOR); - Abilities abilities = (((CraftPlayer) player).getHandle()).getAbilities(); - abilities.mayBuild = true; - abilities.mayfly = true; - abilities.instabuild = true; - + player.setGameMode(GameMode.CREATIVE); + player.setAllowFlight(true); + player.setFlying(true); swPlayer.setComponent(new NoClipData()); BauSystem.MESSAGE.send("OTHER_NOCLIP_SLOT_INFO", player); - TinyProtocol.instance.sendPacket(player, new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, 1F)); - pseudoGameMode(player, GameMode.SPECTATOR); + showClientGameMode(player, GameMode.CREATIVE, GameMode.SPECTATOR); } } @EventHandler - public void onBauMemberUpdate(BauMemberUpdateEvent event) { - event.getNewSpectator().forEach(player -> { - SWPlayer.of(player).removeComponent(NoClipData.class); - }); + public void onPlayerFailMove(PlayerFailMoveEvent event) { + if (event.getFailReason() != PlayerFailMoveEvent.FailReason.CLIPPED_INTO_BLOCK) return; + if (!SWPlayer.of(event.getPlayer()).hasComponent(NoClipData.class)) return; + event.setAllowed(true); } - @EventHandler(ignoreCancelled = true) + @EventHandler + public void onBauMemberUpdate(BauMemberUpdateEvent event) { + event.getNewSpectator().forEach(player -> SWPlayer.of(player).removeComponent(NoClipData.class)); + } + + @EventHandler public void onPlayerGameModeChange(PlayerGameModeChangeEvent event) { if (SWPlayer.of(event.getPlayer()).hasComponent(NoClipData.class)) { event.setCancelled(true); } } - @EventHandler(ignoreCancelled = true) + @EventHandler public void onBlock(BlockCanBuildEvent event) { if (event.getPlayer() == null) return; if (SWPlayer.of(event.getPlayer()).hasComponent(NoClipData.class)) { @@ -146,7 +94,7 @@ public class NoClipCommand extends SWCommand implements Listener { } } - @EventHandler(ignoreCancelled = true) + @EventHandler public void onPlayerToggleFlight(PlayerToggleFlightEvent event) { if (SWPlayer.of(event.getPlayer()).hasComponent(NoClipData.class)) { event.setCancelled(true); @@ -154,20 +102,13 @@ public class NoClipCommand extends SWCommand implements Listener { } } - @EventHandler(ignoreCancelled = true) - public void onPlayerTeleport(PlayerTeleportEvent event) { - if (event.getCause() != PlayerTeleportEvent.TeleportCause.SPECTATE) { - return; - } - if (SWPlayer.of(event.getPlayer()).hasComponent(NoClipData.class)) { - event.setCancelled(true); - Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { - event.getPlayer().setSpectatorTarget(null); - }, 1L); - } + /** + * @param player player + * @param localMode GameMode for breaking and placing + * @param listedMode GameMode for noPhysics + */ + private static void showClientGameMode(Player player, GameMode localMode, GameMode listedMode) { + TinyProtocol.instance.sendPacket(player, new ClientboundGameEventPacket(ClientboundGameEventPacket.CHANGE_GAME_MODE, localMode.getValue())); + TinyProtocol.instance.sendPacket(player, ProtocolWrapper.playerInfoPacketConstructor(ProtocolWrapper.PlayerInfoAction.GAMEMODE, new GameProfile(player.getUniqueId(), player.getName()), listedMode)); } - - private static void pseudoGameMode(Player player, GameMode gameMode) { - TinyProtocol.instance.sendPacket(player, ProtocolWrapper.playerInfoPacketConstructor(ProtocolWrapper.PlayerInfoAction.GAMEMODE, new GameProfile(player.getUniqueId(), player.getName()), gameMode)); - } -} \ No newline at end of file +}