diff --git a/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/lagpreventions/agelimits/ProjectileAgeLimit.java b/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/lagpreventions/agelimits/ProjectileAgeLimit.java index 02ce86ef..3de1142c 100755 --- a/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/lagpreventions/agelimits/ProjectileAgeLimit.java +++ b/AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/lagpreventions/agelimits/ProjectileAgeLimit.java @@ -1,5 +1,6 @@ package me.xginko.aef.modules.lagpreventions.agelimits; +import com.cryptomorin.xseries.XEntityType; import io.papermc.paper.threadedregions.scheduler.ScheduledTask; import me.xginko.aef.modules.AEFModule; import me.xginko.aef.utils.ChunkUtil; @@ -7,16 +8,24 @@ import org.bukkit.Chunk; import org.bukkit.World; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.world.ChunkLoadEvent; +import java.util.EnumSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class ProjectileAgeLimit extends AEFModule implements Consumer, Listener { + private final Set ignoredTypes; private final long check_period_in_ticks; private final int max_alive_time; @@ -33,6 +42,27 @@ public ProjectileAgeLimit() { "(20 ticks = 1 second) Will not touch Ender Pearls"); this.check_period_in_ticks = config.getInt(configPath + ".check-period-seconds", 20, "How frequently we should check all projectiles for their alive time") * 20L; + List defaults = Stream.of( + XEntityType.FISHING_BOBBER, + XEntityType.ENDER_PEARL, + XEntityType.WITHER_SKULL, + XEntityType.EYE_OF_ENDER) + .filter(XEntityType::isSupported) + .map(XEntityType::get) + .map(Enum::name) + .collect(Collectors.toList()); + this.ignoredTypes = config.getList(configPath + ".ignored-types", defaults) + .stream() + .map(configuredType -> { + try { + return EntityType.valueOf(configuredType); + } catch (IllegalArgumentException e) { + notRecognized(EntityType.class, configuredType); + return null; + } + }) + .filter(Objects::nonNull) + .collect(Collectors.toCollection(() -> EnumSet.noneOf(EntityType.class))); } @Override @@ -60,15 +90,12 @@ public void accept(ScheduledTask task) { plugin.getServer().getRegionScheduler().execute(plugin, world, chunk.getX(), chunk.getZ(), () -> { for (Entity entity : chunk.getEntities()) { entity.getScheduler().execute(plugin, () -> { - if (EntityUtil.isProjectile(entity)) { - switch (entity.getType()) { - case ENDER_PEARL, WITHER_SKULL, FISHING_HOOK, ENDER_SIGNAL -> { - return; - } - } - if (entity.getTicksLived() > max_alive_time) { - entity.remove(); - } + if (ignoredTypes.contains(entity.getType())) { + return; + } + + if (EntityUtil.isProjectile(entity) && entity.getTicksLived() > max_alive_time) { + entity.remove(); } }, null, 1L); } @@ -84,15 +111,12 @@ private void onChunkLoad(ChunkLoadEvent event) { for (Entity entity : event.getChunk().getEntities()) { entity.getScheduler().execute(plugin, () -> { - if (EntityUtil.isProjectile(entity)) { - switch (entity.getType()) { - case ENDER_PEARL, WITHER_SKULL, FISHING_HOOK, ENDER_SIGNAL -> { - return; - } - } - if (entity.getTicksLived() > max_alive_time) { - entity.remove(); - } + if (ignoredTypes.contains(entity.getType())) { + return; + } + + if (EntityUtil.isProjectile(entity) && entity.getTicksLived() > max_alive_time) { + entity.remove(); } }, null, 1L); } diff --git a/AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/lagpreventions/agelimits/ProjectileAgeLimit.java b/AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/lagpreventions/agelimits/ProjectileAgeLimit.java index 065b6fad..08e39e05 100755 --- a/AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/lagpreventions/agelimits/ProjectileAgeLimit.java +++ b/AnarchyExploitFixesLegacy/src/main/java/me/xginko/aef/modules/lagpreventions/agelimits/ProjectileAgeLimit.java @@ -1,9 +1,11 @@ package me.xginko.aef.modules.lagpreventions.agelimits; +import com.cryptomorin.xseries.XEntityType; import me.xginko.aef.modules.AEFModule; import me.xginko.aef.utils.EntityUtil; import org.bukkit.World; import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; @@ -11,8 +13,16 @@ import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.scheduler.BukkitTask; +import java.util.EnumSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + public class ProjectileAgeLimit extends AEFModule implements Runnable, Listener { + private final Set ignoredTypes; private final long checkPeriod; private final int max_alive_time; @@ -29,6 +39,27 @@ public ProjectileAgeLimit() { "(20 ticks = 1 second) Will not touch Ender Pearls"); this.checkPeriod = config.getInt(configPath + ".check-period-seconds", 20, "How frequently we should check all projectiles for their alive time") * 20L; + List defaults = Stream.of( + XEntityType.FISHING_BOBBER, + XEntityType.ENDER_PEARL, + XEntityType.WITHER_SKULL, + XEntityType.EYE_OF_ENDER) + .filter(XEntityType::isSupported) + .map(XEntityType::get) + .map(Enum::name) + .collect(Collectors.toList()); + this.ignoredTypes = config.getList(configPath + ".ignored-types", defaults) + .stream() + .map(configuredType -> { + try { + return EntityType.valueOf(configuredType); + } catch (IllegalArgumentException e) { + notRecognized(EntityType.class, configuredType); + return null; + } + }) + .filter(Objects::nonNull) + .collect(Collectors.toCollection(() -> EnumSet.noneOf(EntityType.class))); } @Override @@ -50,18 +81,12 @@ public void disable() { public void run() { for (World world : plugin.getServer().getWorlds()) { for (Entity entity : world.getEntities()) { - if (EntityUtil.isProjectile(entity)) { - switch (entity.getType()) { - case ENDER_PEARL: - case WITHER_SKULL: - case FISHING_HOOK: - case ENDER_SIGNAL: - continue; - } + if (ignoredTypes.contains(entity.getType())) { + continue; + } - if (entity.getTicksLived() > max_alive_time) { - entity.remove(); - } + if (EntityUtil.isProjectile(entity) && entity.getTicksLived() > max_alive_time) { + entity.remove(); } } } @@ -72,18 +97,12 @@ private void onChunkLoad(ChunkLoadEvent event) { if (event.isNewChunk()) return; for (Entity entity : event.getChunk().getEntities()) { - if (EntityUtil.isProjectile(entity)) { - switch (entity.getType()) { - case ENDER_PEARL: - case WITHER_SKULL: - case FISHING_HOOK: - case ENDER_SIGNAL: - continue; - } + if (ignoredTypes.contains(entity.getType())) { + continue; + } - if (entity.getTicksLived() > max_alive_time) { - entity.remove(); - } + if (EntityUtil.isProjectile(entity) && entity.getTicksLived() > max_alive_time) { + entity.remove(); } } } diff --git a/build-logic/src/main/kotlin/me.xginko.aef.wrapper.gradle.kts b/build-logic/src/main/kotlin/me.xginko.aef.wrapper.gradle.kts index 7455a4aa..41f5266f 100755 --- a/build-logic/src/main/kotlin/me.xginko.aef.wrapper.gradle.kts +++ b/build-logic/src/main/kotlin/me.xginko.aef.wrapper.gradle.kts @@ -4,7 +4,7 @@ plugins { } group = "me.xginko" -version = "2.7.4" +version = "2.7.5-SNAPSHOT" description = "Prevent many exploits that affect anarchy servers." var url: String? = "github.com/xGinko/AnarchyExploitFixes"