From 1885f4b7528245334583d0e70c56eb367de7a212 Mon Sep 17 00:00:00 2001 From: xGinko Date: Thu, 9 Jan 2025 16:05:13 +0100 Subject: [PATCH] add carpet dupe prevention --- .../modules/dupepreventions/CarpetDupe.java | 72 ++++++++++++++++++ .../modules/dupepreventions/CarpetDupe.java | 73 +++++++++++++++++++ .../me/xginko/aef/utils/MaterialUtil.java | 5 ++ 3 files changed, 150 insertions(+) create mode 100755 AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/dupepreventions/CarpetDupe.java create mode 100755 AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/dupepreventions/CarpetDupe.java diff --git a/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/dupepreventions/CarpetDupe.java b/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/dupepreventions/CarpetDupe.java new file mode 100755 index 00000000..cad78cd4 --- /dev/null +++ b/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/dupepreventions/CarpetDupe.java @@ -0,0 +1,72 @@ +package me.xginko.aef.modules.dupepreventions; + +import com.cryptomorin.xseries.XMaterial; +import me.xginko.aef.modules.AEFModule; +import me.xginko.aef.utils.MaterialUtil; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockPistonEvent; +import org.bukkit.event.block.BlockPistonExtendEvent; +import org.bukkit.event.block.BlockPistonRetractEvent; + +import java.util.ArrayList; +import java.util.List; + +public class CarpetDupe extends AEFModule implements Listener { + + private final boolean deleteCarpet; + + public CarpetDupe() { + super("dupe-preventions.carpet-dupe", false, + "Will prevent Pistons that are pusing carpets from working."); + this.deleteCarpet = config.getBoolean(configPath + ".delete-carpet", true); + } + + @Override + public void enable() { + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @Override + public void disable() { + HandlerList.unregisterAll(this); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + private void onPistonExtend(BlockPistonExtendEvent event) { + onPistonEvent(event, event.getBlocks()); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + private void onPistonRetract(BlockPistonRetractEvent event) { + onPistonEvent(event, event.getBlocks()); + } + + private void onPistonEvent(BlockPistonEvent event, List affectedBlocks) { + if (affectedBlocks.isEmpty()) return; + + List carpets = new ArrayList<>(8); + + for (Block block : affectedBlocks) { + if (MaterialUtil.CARPETS.contains(block.getType())) { + carpets.add(block); + } + } + + if (carpets.isEmpty()) { + return; + } + + event.setCancelled(true); + + if (deleteCarpet) { + for (Block block : carpets) { + plugin.getServer().getGlobalRegionScheduler() + .execute(plugin, () -> block.setType(XMaterial.AIR.get(), false)); + } + } + } +} diff --git a/AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/dupepreventions/CarpetDupe.java b/AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/dupepreventions/CarpetDupe.java new file mode 100755 index 00000000..497380e3 --- /dev/null +++ b/AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/dupepreventions/CarpetDupe.java @@ -0,0 +1,73 @@ +package me.xginko.aef.modules.dupepreventions; + +import com.cryptomorin.xseries.XMaterial; +import me.xginko.aef.modules.AEFModule; +import me.xginko.aef.utils.MaterialUtil; +import org.bukkit.block.Block; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockPistonEvent; +import org.bukkit.event.block.BlockPistonExtendEvent; +import org.bukkit.event.block.BlockPistonRetractEvent; + +import java.util.ArrayList; +import java.util.List; + +public class CarpetDupe extends AEFModule implements Listener { + + private final boolean deleteCarpet; + + public CarpetDupe() { + super("dupe-preventions.carpet-dupe", false, + "Will prevent Pistons that are pusing carpets from working."); + this.deleteCarpet = config.getBoolean(configPath + ".delete-carpet", true); + } + + @Override + public void enable() { + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @Override + public void disable() { + HandlerList.unregisterAll(this); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + private void onPistonExtend(BlockPistonExtendEvent event) { + onPistonEvent(event, event.getBlocks()); + } + + @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) + private void onPistonRetract(BlockPistonRetractEvent event) { + onPistonEvent(event, event.getBlocks()); + } + + private void onPistonEvent(BlockPistonEvent event, List affectedBlocks) { + if (affectedBlocks.isEmpty()) return; + + List carpets = new ArrayList<>(8); + + for (Block block : affectedBlocks) { + if (MaterialUtil.CARPETS.contains(block.getType())) { + carpets.add(block); + } + } + + if (carpets.isEmpty()) { + return; + } + + event.setCancelled(true); + + if (deleteCarpet) { + plugin.getServer().getScheduler().runTaskLater(plugin, () -> { + for (Block block : carpets) { + block.setType(XMaterial.AIR.get(), false); + } + }, 1L); + } + } +} diff --git a/shared/src/main/java/me/xginko/aef/utils/MaterialUtil.java b/shared/src/main/java/me/xginko/aef/utils/MaterialUtil.java index 3f59bea5..f3d05ca0 100755 --- a/shared/src/main/java/me/xginko/aef/utils/MaterialUtil.java +++ b/shared/src/main/java/me/xginko/aef/utils/MaterialUtil.java @@ -35,6 +35,11 @@ public final class MaterialUtil { .map(XMaterial::get) .collect(Collectors.toCollection(() -> EnumSet.noneOf(Material.class))); + public static final Set CARPETS = XTag.CARPETS.getValues().stream() + .filter(XMaterial::isSupported) + .map(XMaterial::get) + .collect(Collectors.toCollection(() -> EnumSet.noneOf(Material.class))); + public static final Set SIGNS = XTag.SIGNS.getValues().stream() .filter(XMaterial::isSupported) .map(XMaterial::get)