Skip to content

Commit

Permalink
2.7.6 hotfix
Browse files Browse the repository at this point in the history
  • Loading branch information
xGinko committed Jan 9, 2025
1 parent 3d33f70 commit 3332cf3
Show file tree
Hide file tree
Showing 8 changed files with 228 additions and 39 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 pushing 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 = null;
}
}

@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);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,9 @@ private void onPlayerInteract(PlayerInteractEvent event) {
if (event.getItem() == null || event.getItem().getType() != XMaterial.GLOWSTONE.get()) return;
if (WorldUtil.isRespawnAnchorWorks(event.getPlayer().getWorld())) return;

if (
breakCooldowns.containsKey(event.getPlayer().getUniqueId())
&& breakCooldowns.get(event.getPlayer().getUniqueId()) > System.nanoTime()
) {
if (isOnCooldown(event.getPlayer().getUniqueId(), breakCooldowns, breakDelayNanos)) {
event.setCancelled(true);
if (updateInventory) event.getPlayer().updateInventory();
} else {
breakCooldowns.put(event.getPlayer().getUniqueId(), System.nanoTime() + breakDelayNanos);
}
}

Expand All @@ -39,14 +34,9 @@ private void onBlockPlace(BlockPlaceEvent event) {
if (event.getBlock().getType() != XMaterial.RESPAWN_ANCHOR.get()) return;
if (WorldUtil.isRespawnAnchorWorks(event.getPlayer().getWorld())) return;

if (
placeCooldowns.containsKey(event.getPlayer().getUniqueId())
&& placeCooldowns.get(event.getPlayer().getUniqueId()) > System.nanoTime()
) {
if (isOnCooldown(event.getPlayer().getUniqueId(), placeCooldowns, placeDelayNanos)) {
event.setCancelled(true);
if (updateInventory) event.getPlayer().updateInventory();
} else {
placeCooldowns.put(event.getPlayer().getUniqueId(), System.nanoTime() + placeDelayNanos);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ public AuraDelayModule(String configPath, boolean defEnabled, long defPlaceDelay
this.updateInventory = config.getBoolean(configPath + ".update-inventory-on-cancel", false,
"Can help with desync but recommended to leave off unless you have issues.");
placeDelayNanos = TimeUnit.MILLISECONDS.toNanos(
config.getLong(".place-delay-millis", defPlaceDelayMillis, "1 tick = 50 ms"));
config.getLong(configPath + ".place-delay-millis", defPlaceDelayMillis, "1 tick = 50 ms"));
breakDelayNanos = TimeUnit.MILLISECONDS.toNanos(
config.getLong(".break-delay-millis", defBreakDelayMillis));
config.getLong(configPath + ".break-delay-millis", defBreakDelayMillis));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,9 @@ private void onPlayerInteract(PlayerInteractEvent event) {
if (!MaterialUtil.BEDS.contains(event.getClickedBlock().getType())) return;
if (WorldUtil.isBedWorks(event.getClickedBlock().getWorld())) return;

if (
breakCooldowns.containsKey(event.getPlayer().getUniqueId())
&& breakCooldowns.get(event.getPlayer().getUniqueId()) > System.nanoTime()
) {
if (isOnCooldown(event.getPlayer().getUniqueId(), breakCooldowns, breakDelayNanos)) {
event.setCancelled(true);
if (updateInventory) event.getPlayer().updateInventory();
} else {
breakCooldowns.put(event.getPlayer().getUniqueId(), System.nanoTime() + breakDelayNanos);
}
}

Expand All @@ -38,14 +33,9 @@ private void onBlockPlace(BlockPlaceEvent event) {
if (!MaterialUtil.BEDS.contains(event.getBlockPlaced().getType())) return;
if (WorldUtil.isBedWorks(event.getBlockPlaced().getWorld())) return;

if (
placeCooldowns.containsKey(event.getPlayer().getUniqueId())
&& placeCooldowns.get(event.getPlayer().getUniqueId()) > System.nanoTime()
) {
if (isOnCooldown(event.getPlayer().getUniqueId(), placeCooldowns, placeDelayNanos)) {
event.setCancelled(true);
if (updateInventory) event.getPlayer().updateInventory();
} else {
placeCooldowns.put(event.getPlayer().getUniqueId(), System.nanoTime() + placeDelayNanos);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,9 @@ private void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
if (event.getEntityType() != XEntityType.END_CRYSTAL.get()) return;
if (event.getDamager().getType() != XEntityType.PLAYER.get()) return;

if (
breakCooldowns.containsKey(event.getDamager().getUniqueId())
&& breakCooldowns.get(event.getDamager().getUniqueId()) > System.nanoTime()
) {
if (isOnCooldown(event.getDamager().getUniqueId(), breakCooldowns, placeDelayNanos)) {
event.setCancelled(true);
if (updateInventory) ((Player) event.getDamager()).updateInventory();
} else {
breakCooldowns.put(event.getDamager().getUniqueId(), System.nanoTime() + breakDelayNanos);
}
}

Expand All @@ -38,14 +33,9 @@ private void onPlayerInteract(PlayerInteractEvent event) {
if (event.getAction() != Action.RIGHT_CLICK_BLOCK) return; // Need to right-click a block to place a crystal
if (event.getItem() == null || event.getItem().getType() != XMaterial.END_CRYSTAL.get()) return;

if (
placeCooldowns.containsKey(event.getPlayer().getUniqueId())
&& placeCooldowns.get(event.getPlayer().getUniqueId()) > System.nanoTime()
) {
if (isOnCooldown(event.getPlayer().getUniqueId(), placeCooldowns, placeDelayNanos)) {
event.setCancelled(true);
if (updateInventory) event.getPlayer().updateInventory();
} else {
placeCooldowns.put(event.getPlayer().getUniqueId(), System.nanoTime() + placeDelayNanos);
}
}
}
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 pushing 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 = null;
}
}

@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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ plugins {
}

group = "me.xginko"
version = "2.7.5"
version = "2.7.6"
description = "Prevent many exploits that affect anarchy servers."
var url: String? = "github.com/xGinko/AnarchyExploitFixes"

Expand Down
10 changes: 10 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 @@ -35,6 +35,16 @@ public final class MaterialUtil {
.map(XMaterial::get)
.collect(Collectors.toCollection(() -> EnumSet.noneOf(Material.class)));

public static final Set<Material> CARPETS = XTag.CARPETS.getValues().stream()
.filter(XMaterial::isSupported)
.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 3332cf3

Please sign in to comment.