Skip to content

Commit 3332cf3

Browse files
committed
2.7.6 hotfix
1 parent 3d33f70 commit 3332cf3

8 files changed

Lines changed: 228 additions & 39 deletions

File tree

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package me.xginko.aef.modules.dupepreventions;
2+
3+
import com.cryptomorin.xseries.XMaterial;
4+
import me.xginko.aef.modules.AEFModule;
5+
import me.xginko.aef.utils.MaterialUtil;
6+
import org.bukkit.Material;
7+
import org.bukkit.block.Block;
8+
import org.bukkit.event.EventHandler;
9+
import org.bukkit.event.EventPriority;
10+
import org.bukkit.event.HandlerList;
11+
import org.bukkit.event.Listener;
12+
import org.bukkit.event.block.BlockPistonEvent;
13+
import org.bukkit.event.block.BlockPistonExtendEvent;
14+
import org.bukkit.event.block.BlockPistonRetractEvent;
15+
16+
import java.util.Collections;
17+
import java.util.EnumMap;
18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.Set;
21+
import java.util.concurrent.ConcurrentHashMap;
22+
23+
public class BlockEntityDupe extends AEFModule implements Listener {
24+
25+
private final Map<Material, Boolean> materials = new EnumMap<>(Material.class);
26+
27+
private Set<Block> removalList;
28+
29+
public BlockEntityDupe() {
30+
super("dupe-preventions.block-entity-dupe", false, """
31+
Will prevent Pistons that are pushing carpets/rails/tnt from working.
32+
This isn't recommended to be used for turning everything off.
33+
Use papers settings for that.
34+
This is intended for admins that want to allow specific dupes only.""");
35+
36+
if (config.getBoolean(configPath + ".carpets.prevent", true)) {
37+
boolean remove = config.getBoolean(configPath + ".carpets.delete", true);
38+
for (Material material : MaterialUtil.CARPETS) {
39+
materials.put(material, remove);
40+
}
41+
}
42+
43+
if (config.getBoolean(configPath + ".rails.prevent", true)) {
44+
boolean remove = config.getBoolean(configPath + ".rails.delete", true);
45+
for (Material material : MaterialUtil.RAILS) {
46+
materials.put(material, remove);
47+
}
48+
}
49+
50+
if (config.getBoolean(configPath + ".tnt.prevent", false)) {
51+
materials.put(XMaterial.TNT.get(), config.getBoolean(configPath + ".tnt.delete", true));
52+
}
53+
}
54+
55+
@Override
56+
public void enable() {
57+
removalList = Collections.newSetFromMap(new ConcurrentHashMap<>());
58+
plugin.getServer().getPluginManager().registerEvents(this, plugin);
59+
}
60+
61+
@Override
62+
public void disable() {
63+
HandlerList.unregisterAll(this);
64+
if (removalList != null) {
65+
setBlocksToAir();
66+
removalList = null;
67+
}
68+
}
69+
70+
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
71+
private void onPistonExtend(BlockPistonExtendEvent event) {
72+
onPistonEvent(event, event.getBlocks());
73+
}
74+
75+
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
76+
private void onPistonRetract(BlockPistonRetractEvent event) {
77+
onPistonEvent(event, event.getBlocks());
78+
}
79+
80+
private void onPistonEvent(BlockPistonEvent event, List<Block> affectedBlocks) {
81+
if (affectedBlocks.isEmpty()) return;
82+
83+
for (Block block : affectedBlocks) {
84+
if (materials.containsKey(block.getType())) {
85+
event.setCancelled(true);
86+
if (materials.get(block.getType())) {
87+
removalList.add(block);
88+
}
89+
}
90+
}
91+
92+
setBlocksToAir();
93+
}
94+
95+
private void setBlocksToAir() {
96+
if (removalList.isEmpty()) return;
97+
98+
for (Block block : removalList) {
99+
plugin.getServer().getRegionScheduler()
100+
.execute(plugin, block.getLocation(), () -> block.setType(XMaterial.AIR.get(), false));
101+
removalList.remove(block);
102+
}
103+
}
104+
}

AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/combat/auras/AnchorAuraDelay.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,9 @@ private void onPlayerInteract(PlayerInteractEvent event) {
2222
if (event.getItem() == null || event.getItem().getType() != XMaterial.GLOWSTONE.get()) return;
2323
if (WorldUtil.isRespawnAnchorWorks(event.getPlayer().getWorld())) return;
2424

25-
if (
26-
breakCooldowns.containsKey(event.getPlayer().getUniqueId())
27-
&& breakCooldowns.get(event.getPlayer().getUniqueId()) > System.nanoTime()
28-
) {
25+
if (isOnCooldown(event.getPlayer().getUniqueId(), breakCooldowns, breakDelayNanos)) {
2926
event.setCancelled(true);
3027
if (updateInventory) event.getPlayer().updateInventory();
31-
} else {
32-
breakCooldowns.put(event.getPlayer().getUniqueId(), System.nanoTime() + breakDelayNanos);
3328
}
3429
}
3530

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

42-
if (
43-
placeCooldowns.containsKey(event.getPlayer().getUniqueId())
44-
&& placeCooldowns.get(event.getPlayer().getUniqueId()) > System.nanoTime()
45-
) {
37+
if (isOnCooldown(event.getPlayer().getUniqueId(), placeCooldowns, placeDelayNanos)) {
4638
event.setCancelled(true);
4739
if (updateInventory) event.getPlayer().updateInventory();
48-
} else {
49-
placeCooldowns.put(event.getPlayer().getUniqueId(), System.nanoTime() + placeDelayNanos);
5040
}
5141
}
5242
}

AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/combat/auras/AuraDelayModule.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@ public AuraDelayModule(String configPath, boolean defEnabled, long defPlaceDelay
2929
this.updateInventory = config.getBoolean(configPath + ".update-inventory-on-cancel", false,
3030
"Can help with desync but recommended to leave off unless you have issues.");
3131
placeDelayNanos = TimeUnit.MILLISECONDS.toNanos(
32-
config.getLong(".place-delay-millis", defPlaceDelayMillis, "1 tick = 50 ms"));
32+
config.getLong(configPath + ".place-delay-millis", defPlaceDelayMillis, "1 tick = 50 ms"));
3333
breakDelayNanos = TimeUnit.MILLISECONDS.toNanos(
34-
config.getLong(".break-delay-millis", defBreakDelayMillis));
34+
config.getLong(configPath + ".break-delay-millis", defBreakDelayMillis));
3535
}
3636

3737
@Override

AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/combat/auras/BedAuraDelay.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,9 @@ private void onPlayerInteract(PlayerInteractEvent event) {
2121
if (!MaterialUtil.BEDS.contains(event.getClickedBlock().getType())) return;
2222
if (WorldUtil.isBedWorks(event.getClickedBlock().getWorld())) return;
2323

24-
if (
25-
breakCooldowns.containsKey(event.getPlayer().getUniqueId())
26-
&& breakCooldowns.get(event.getPlayer().getUniqueId()) > System.nanoTime()
27-
) {
24+
if (isOnCooldown(event.getPlayer().getUniqueId(), breakCooldowns, breakDelayNanos)) {
2825
event.setCancelled(true);
2926
if (updateInventory) event.getPlayer().updateInventory();
30-
} else {
31-
breakCooldowns.put(event.getPlayer().getUniqueId(), System.nanoTime() + breakDelayNanos);
3227
}
3328
}
3429

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

41-
if (
42-
placeCooldowns.containsKey(event.getPlayer().getUniqueId())
43-
&& placeCooldowns.get(event.getPlayer().getUniqueId()) > System.nanoTime()
44-
) {
36+
if (isOnCooldown(event.getPlayer().getUniqueId(), placeCooldowns, placeDelayNanos)) {
4537
event.setCancelled(true);
4638
if (updateInventory) event.getPlayer().updateInventory();
47-
} else {
48-
placeCooldowns.put(event.getPlayer().getUniqueId(), System.nanoTime() + placeDelayNanos);
4939
}
5040
}
5141
}

AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/combat/auras/CrystalAuraDelay.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,9 @@ private void onEntityDamageByEntity(EntityDamageByEntityEvent event) {
2121
if (event.getEntityType() != XEntityType.END_CRYSTAL.get()) return;
2222
if (event.getDamager().getType() != XEntityType.PLAYER.get()) return;
2323

24-
if (
25-
breakCooldowns.containsKey(event.getDamager().getUniqueId())
26-
&& breakCooldowns.get(event.getDamager().getUniqueId()) > System.nanoTime()
27-
) {
24+
if (isOnCooldown(event.getDamager().getUniqueId(), breakCooldowns, placeDelayNanos)) {
2825
event.setCancelled(true);
2926
if (updateInventory) ((Player) event.getDamager()).updateInventory();
30-
} else {
31-
breakCooldowns.put(event.getDamager().getUniqueId(), System.nanoTime() + breakDelayNanos);
3227
}
3328
}
3429

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

41-
if (
42-
placeCooldowns.containsKey(event.getPlayer().getUniqueId())
43-
&& placeCooldowns.get(event.getPlayer().getUniqueId()) > System.nanoTime()
44-
) {
36+
if (isOnCooldown(event.getPlayer().getUniqueId(), placeCooldowns, placeDelayNanos)) {
4537
event.setCancelled(true);
4638
if (updateInventory) event.getPlayer().updateInventory();
47-
} else {
48-
placeCooldowns.put(event.getPlayer().getUniqueId(), System.nanoTime() + placeDelayNanos);
4939
}
5040
}
5141
}
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package me.xginko.aef.modules.dupepreventions;
2+
3+
import com.cryptomorin.xseries.XMaterial;
4+
import me.xginko.aef.modules.AEFModule;
5+
import me.xginko.aef.utils.MaterialUtil;
6+
import org.bukkit.Material;
7+
import org.bukkit.block.Block;
8+
import org.bukkit.event.EventHandler;
9+
import org.bukkit.event.EventPriority;
10+
import org.bukkit.event.HandlerList;
11+
import org.bukkit.event.Listener;
12+
import org.bukkit.event.block.BlockPistonEvent;
13+
import org.bukkit.event.block.BlockPistonExtendEvent;
14+
import org.bukkit.event.block.BlockPistonRetractEvent;
15+
16+
import java.util.Collections;
17+
import java.util.EnumMap;
18+
import java.util.List;
19+
import java.util.Map;
20+
import java.util.Set;
21+
import java.util.concurrent.ConcurrentHashMap;
22+
23+
public class BlockEntityDupe extends AEFModule implements Listener {
24+
25+
private final Map<Material, Boolean> materials = new EnumMap<>(Material.class);
26+
27+
private Set<Block> removalList;
28+
29+
public BlockEntityDupe() {
30+
super("dupe-preventions.block-entity-dupe", false,
31+
"Will prevent Pistons that are pushing carpets/rails/tnt from working.\n" +
32+
"This isn't recommended to be used for turning everything off.\n" +
33+
"Use papers settings for that.\n" +
34+
"This is intended for admins that want to allow specific dupes only.");
35+
36+
if (config.getBoolean(configPath + ".carpets.prevent", true)) {
37+
boolean remove = config.getBoolean(configPath + ".carpets.delete", true);
38+
for (Material material : MaterialUtil.CARPETS) {
39+
materials.put(material, remove);
40+
}
41+
}
42+
43+
if (config.getBoolean(configPath + ".rails.prevent", true)) {
44+
boolean remove = config.getBoolean(configPath + ".rails.delete", true);
45+
for (Material material : MaterialUtil.RAILS) {
46+
materials.put(material, remove);
47+
}
48+
}
49+
50+
if (config.getBoolean(configPath + ".tnt.prevent", false)) {
51+
materials.put(XMaterial.TNT.get(), config.getBoolean(configPath + ".tnt.delete", true));
52+
}
53+
}
54+
55+
@Override
56+
public void enable() {
57+
removalList = Collections.newSetFromMap(new ConcurrentHashMap<>());
58+
plugin.getServer().getPluginManager().registerEvents(this, plugin);
59+
}
60+
61+
@Override
62+
public void disable() {
63+
HandlerList.unregisterAll(this);
64+
if (removalList != null) {
65+
setBlocksToAir();
66+
removalList = null;
67+
}
68+
}
69+
70+
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
71+
private void onPistonExtend(BlockPistonExtendEvent event) {
72+
onPistonEvent(event, event.getBlocks());
73+
}
74+
75+
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
76+
private void onPistonRetract(BlockPistonRetractEvent event) {
77+
onPistonEvent(event, event.getBlocks());
78+
}
79+
80+
private void onPistonEvent(BlockPistonEvent event, List<Block> affectedBlocks) {
81+
if (affectedBlocks.isEmpty()) return;
82+
83+
for (Block block : affectedBlocks) {
84+
if (materials.containsKey(block.getType())) {
85+
event.setCancelled(true);
86+
if (materials.get(block.getType())) {
87+
removalList.add(block);
88+
}
89+
}
90+
}
91+
92+
setBlocksToAir();
93+
}
94+
95+
private void setBlocksToAir() {
96+
if (removalList.isEmpty()) return;
97+
98+
plugin.getServer().getScheduler().runTaskLater(plugin, () -> {
99+
for (Block block : removalList) {
100+
block.setType(XMaterial.AIR.get(), false);
101+
removalList.remove(block);
102+
}
103+
}, 1L);
104+
}
105+
}

build-logic/src/main/kotlin/me.xginko.aef.wrapper.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ plugins {
44
}
55

66
group = "me.xginko"
7-
version = "2.7.5"
7+
version = "2.7.6"
88
description = "Prevent many exploits that affect anarchy servers."
99
var url: String? = "github.com/xGinko/AnarchyExploitFixes"
1010

shared/src/main/java/me/xginko/aef/utils/MaterialUtil.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,16 @@ public final class MaterialUtil {
3535
.map(XMaterial::get)
3636
.collect(Collectors.toCollection(() -> EnumSet.noneOf(Material.class)));
3737

38+
public static final Set<Material> CARPETS = XTag.CARPETS.getValues().stream()
39+
.filter(XMaterial::isSupported)
40+
.map(XMaterial::get)
41+
.collect(Collectors.toCollection(() -> EnumSet.noneOf(Material.class)));
42+
43+
public static final Set<Material> RAILS = XTag.RAILS.getValues().stream()
44+
.filter(XMaterial::isSupported)
45+
.map(XMaterial::get)
46+
.collect(Collectors.toCollection(() -> EnumSet.noneOf(Material.class)));
47+
3848
public static final Set<Material> SIGNS = XTag.SIGNS.getValues().stream()
3949
.filter(XMaterial::isSupported)
4050
.map(XMaterial::get)

0 commit comments

Comments
 (0)