From a3aaaf90e61cad91d381089838328e66f290dcad Mon Sep 17 00:00:00 2001 From: xGinko Date: Thu, 9 Jan 2025 18:05:40 +0100 Subject: [PATCH] expand carpet-dupe to blockentitydupe and make configurable --- .../dupepreventions/BlockEntityDupe.java | 104 +++++++++++++++++ .../modules/dupepreventions/CarpetDupe.java | 72 ------------ .../dupepreventions/BlockEntityDupe.java | 105 ++++++++++++++++++ .../modules/dupepreventions/CarpetDupe.java | 73 ------------ .../me/xginko/aef/utils/MaterialUtil.java | 5 + 5 files changed, 214 insertions(+), 145 deletions(-) create mode 100755 AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/dupepreventions/BlockEntityDupe.java delete 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/BlockEntityDupe.java delete 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/BlockEntityDupe.java b/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/dupepreventions/BlockEntityDupe.java new file mode 100755 index 00000000..ddf02d72 --- /dev/null +++ b/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/dupepreventions/BlockEntityDupe.java @@ -0,0 +1,104 @@ +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.Material; +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.Collections; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +public class BlockEntityDupe extends AEFModule implements Listener { + + private final Map materials = new EnumMap<>(Material.class); + + private Set removalList; + + public BlockEntityDupe() { + super("dupe-preventions.block-entity-dupe", false, """ + Will prevent Pistons that are pusing carpets/rails/tnt from working. + This isn't recommended to be used for turning everything off. + Use papers settings for that. + This is intended for admins that want to allow specific dupes only."""); + + if (config.getBoolean(configPath + ".carpets.prevent", true)) { + boolean remove = config.getBoolean(configPath + ".carpets.delete", true); + for (Material material : MaterialUtil.CARPETS) { + materials.put(material, remove); + } + } + + if (config.getBoolean(configPath + ".rails.prevent", true)) { + boolean remove = config.getBoolean(configPath + ".rails.delete", true); + for (Material material : MaterialUtil.RAILS) { + materials.put(material, remove); + } + } + + if (config.getBoolean(configPath + ".tnt.prevent", false)) { + materials.put(XMaterial.TNT.get(), config.getBoolean(configPath + ".tnt.delete", true)); + } + } + + @Override + public void enable() { + removalList = Collections.newSetFromMap(new ConcurrentHashMap<>()); + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @Override + public void disable() { + HandlerList.unregisterAll(this); + if (removalList != null) { + setBlocksToAir(); + removalList.clear(); + } + } + + @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; + + for (Block block : affectedBlocks) { + if (materials.containsKey(block.getType())) { + event.setCancelled(true); + if (materials.get(block.getType())) { + removalList.add(block); + } + } + } + + setBlocksToAir(); + } + + private void setBlocksToAir() { + if (removalList.isEmpty()) return; + + for (Block block : removalList) { + plugin.getServer().getRegionScheduler() + .execute(plugin, block.getLocation(), () -> block.setType(XMaterial.AIR.get(), false)); + removalList.remove(block); + } + } +} 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 deleted file mode 100755 index cad78cd4..00000000 --- a/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/dupepreventions/CarpetDupe.java +++ /dev/null @@ -1,72 +0,0 @@ -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/BlockEntityDupe.java b/AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/dupepreventions/BlockEntityDupe.java new file mode 100755 index 00000000..a32cddc8 --- /dev/null +++ b/AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/dupepreventions/BlockEntityDupe.java @@ -0,0 +1,105 @@ +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.Material; +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.Collections; +import java.util.EnumMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +public class BlockEntityDupe extends AEFModule implements Listener { + + private final Map materials = new EnumMap<>(Material.class); + + private Set removalList; + + public BlockEntityDupe() { + super("dupe-preventions.block-entity-dupe", false, + "Will prevent Pistons that are pusing carpets/rails/tnt from working.\n" + + "This isn't recommended to be used for turning everything off.\n" + + "Use papers settings for that.\n" + + "This is intended for admins that want to allow specific dupes only."); + + if (config.getBoolean(configPath + ".carpets.prevent", true)) { + boolean remove = config.getBoolean(configPath + ".carpets.delete", true); + for (Material material : MaterialUtil.CARPETS) { + materials.put(material, remove); + } + } + + if (config.getBoolean(configPath + ".rails.prevent", true)) { + boolean remove = config.getBoolean(configPath + ".rails.delete", true); + for (Material material : MaterialUtil.RAILS) { + materials.put(material, remove); + } + } + + if (config.getBoolean(configPath + ".tnt.prevent", false)) { + materials.put(XMaterial.TNT.get(), config.getBoolean(configPath + ".tnt.delete", true)); + } + } + + @Override + public void enable() { + removalList = Collections.newSetFromMap(new ConcurrentHashMap<>()); + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @Override + public void disable() { + HandlerList.unregisterAll(this); + if (removalList != null) { + setBlocksToAir(); + removalList.clear(); + } + } + + @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; + + for (Block block : affectedBlocks) { + if (materials.containsKey(block.getType())) { + event.setCancelled(true); + if (materials.get(block.getType())) { + removalList.add(block); + } + } + } + + setBlocksToAir(); + } + + private void setBlocksToAir() { + if (removalList.isEmpty()) return; + + plugin.getServer().getScheduler().runTaskLater(plugin, () -> { + for (Block block : removalList) { + block.setType(XMaterial.AIR.get(), false); + removalList.remove(block); + } + }, 1L); + } +} 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 deleted file mode 100755 index 497380e3..00000000 --- a/AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/dupepreventions/CarpetDupe.java +++ /dev/null @@ -1,73 +0,0 @@ -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 f3d05ca0..7f533857 100755 --- a/shared/src/main/java/me/xginko/aef/utils/MaterialUtil.java +++ b/shared/src/main/java/me/xginko/aef/utils/MaterialUtil.java @@ -40,6 +40,11 @@ public final class MaterialUtil { .map(XMaterial::get) .collect(Collectors.toCollection(() -> EnumSet.noneOf(Material.class))); + public static final Set RAILS = XTag.RAILS.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)