Skip to content

Commit

Permalink
expand carpet-dupe to blockentitydupe and make configurable
Browse files Browse the repository at this point in the history
  • Loading branch information
xGinko committed Jan 9, 2025
1 parent 1885f4b commit a3aaaf9
Show file tree
Hide file tree
Showing 5 changed files with 214 additions and 145 deletions.
Original file line number Diff line number Diff line change
@@ -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<Material, Boolean> materials = new EnumMap<>(Material.class);

private Set<Block> 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<Block> 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);
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -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<Material, Boolean> materials = new EnumMap<>(Material.class);

private Set<Block> 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<Block> 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);
}
}

This file was deleted.

5 changes: 5 additions & 0 deletions shared/src/main/java/me/xginko/aef/utils/MaterialUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ public final class MaterialUtil {
.map(XMaterial::get)
.collect(Collectors.toCollection(() -> EnumSet.noneOf(Material.class)));

public static final Set<Material> RAILS = XTag.RAILS.getValues().stream()
.filter(XMaterial::isSupported)
.map(XMaterial::get)
.collect(Collectors.toCollection(() -> EnumSet.noneOf(Material.class)));

public static final Set<Material> SIGNS = XTag.SIGNS.getValues().stream()
.filter(XMaterial::isSupported)
.map(XMaterial::get)
Expand Down

0 comments on commit a3aaaf9

Please sign in to comment.