From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: violetc <58360096+s-yh-china@users.noreply.github.com> Date: Sun, 11 Dec 2022 18:43:35 +0800 Subject: [PATCH] Player operation limiter This patch is Powered by plusls-carpet-addition(https://github.com/plusls/plusls-carpet-addition) diff --git a/net/minecraft/server/level/ServerPlayer.java b/net/minecraft/server/level/ServerPlayer.java index 04ea4e33504703c4074aef6e74ec06dc772b1bb9..0110db0b1002b2007892e5c57b74de567d901d7b 100644 --- a/net/minecraft/server/level/ServerPlayer.java +++ b/net/minecraft/server/level/ServerPlayer.java @@ -443,6 +443,10 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc public boolean isRealPlayer; // Paper public @Nullable com.destroystokyo.paper.event.entity.PlayerNaturallySpawnCreaturesEvent playerNaturallySpawnedEvent; // Paper - PlayerNaturallySpawnCreaturesEvent public @Nullable org.bukkit.event.player.PlayerQuitEvent.QuitReason quitReason = null; // Paper - Add API for quit reason; there are a lot of changes to do if we change all methods leading to the event + // Leaves start - player operation limiter + private int instaBreakCountPerTick = 0; + private int placeBlockCountPerTick = 0; + // Leaves end - player operation limiter // Paper start - rewrite chunk system private ca.spottedleaf.moonrise.patches.chunk_system.player.RegionizedPlayerChunkLoader.PlayerChunkLoaderData chunkLoader; @@ -723,6 +727,7 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc } // CraftBukkit end this.tickClientLoadTimeout(); + this.resetOperationCountPerTick(); // Leaves - player operation limiter this.gameMode.tick(); this.wardenSpawnTracker.tick(); if (this.invulnerableTime > 0) { @@ -3103,4 +3108,31 @@ public class ServerPlayer extends Player implements ca.spottedleaf.moonrise.patc return (org.bukkit.craftbukkit.entity.CraftPlayer) super.getBukkitEntity(); } // CraftBukkit end + + // Leaves start - player operation limiter + protected void resetOperationCountPerTick() { + instaBreakCountPerTick = 0; + placeBlockCountPerTick = 0; + } + + public int getInstaBreakCountPerTick() { + return instaBreakCountPerTick; + } + + public int getPlaceBlockCountPerTick() { + return placeBlockCountPerTick; + } + + public void addInstaBreakCountPerTick() { + ++instaBreakCountPerTick; + } + + public void addPlaceBlockCountPerTick() { + ++placeBlockCountPerTick; + } + + public boolean allowOperation() { + return (instaBreakCountPerTick == 0 || placeBlockCountPerTick == 0) && (instaBreakCountPerTick <= 1 && placeBlockCountPerTick <= 2); + } + // Leaves end - player operation limiter } diff --git a/net/minecraft/server/level/ServerPlayerGameMode.java b/net/minecraft/server/level/ServerPlayerGameMode.java index 7166889bce8065508030ecd5b1400ee9be031bf3..65e2edf39857b2e03c5a32dfb3b822b5cb4ce93c 100644 --- a/net/minecraft/server/level/ServerPlayerGameMode.java +++ b/net/minecraft/server/level/ServerPlayerGameMode.java @@ -320,6 +320,19 @@ public class ServerPlayerGameMode { } public void destroyAndAck(BlockPos pos, int sequence, String message) { + // Leaves start - player operation limiter + if (org.leavesmc.leaves.LeavesConfig.modify.playerOperationLimiter) { + if (message.equals("insta mine")) { + player.addInstaBreakCountPerTick(); + if (!player.allowOperation()) { + this.level.getCraftServer().getPluginManager().callEvent(new org.leavesmc.leaves.event.player.PlayerOperationLimitEvent(player.getBukkitEntity(), org.leavesmc.leaves.event.player.PlayerOperationLimitEvent.Operation.MINE, org.bukkit.craftbukkit.block.CraftBlock.at(level, pos))); + this.player.connection.send(new ClientboundBlockUpdatePacket(pos, this.level.getBlockState(pos))); + this.debugLogging(pos, false, sequence, message); + return; + } + } + } + // Leaves end - player operation limiter if (this.destroyBlock(pos)) { this.debugLogging(pos, true, sequence, message); } else { diff --git a/net/minecraft/world/item/BlockItem.java b/net/minecraft/world/item/BlockItem.java index 7bca36dd26afb02524022df74147f628edf51460..58ec8a43265ebf50fdd71f2cbb7dedf4762bc5b4 100644 --- a/net/minecraft/world/item/BlockItem.java +++ b/net/minecraft/world/item/BlockItem.java @@ -64,6 +64,21 @@ public class BlockItem extends Item { final org.bukkit.block.BlockState oldBukkitState = bukkitState != null ? bukkitState : org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(blockPlaceContext.getLevel(), blockPlaceContext.getClickedPos()); // Paper - Reset placed block on exception // CraftBukkit end + // Leaves start - player operation limiter + if (org.leavesmc.leaves.LeavesConfig.modify.playerOperationLimiter && !context.getLevel().isClientSide()) { + ServerPlayer player = (ServerPlayer) context.getPlayer(); + if (player != null && placementState != null) { + player.addPlaceBlockCountPerTick(); + if (!player.allowOperation()) { + if (bukkitState != null) { + context.getLevel().getCraftServer().getPluginManager().callEvent(new org.leavesmc.leaves.event.player.PlayerOperationLimitEvent(player.getBukkitEntity(), org.leavesmc.leaves.event.player.PlayerOperationLimitEvent.Operation.PLACE, bukkitState.getBlock())); + } + return InteractionResult.FAIL; + } + } + } + // Leaves end - player operation limiter + if (placementState == null) { return InteractionResult.FAIL; } else if (!this.placeBlock(blockPlaceContext, placementState)) {