/
minecraftbackup
/
AnarchyExploitFixes
Обзор
Документация
Войти
/
minecraftbackup
/
AnarchyExploitFixes
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
AnarchyExploitFixesFolia/src/main/java/me/xginko/aef/modules/chunklimits/MinecartLimit.java
101 строка
4 KB
xGinko
improve 1.20.6+ support
21 июн 2024, 18:43
21 июн 2024, 18:43
f0de459
Код
Авторство
О чём код?
package me.xginko.aef.modules.chunklimits; import io.papermc.paper.threadedregions.scheduler.ScheduledTask; import me.xginko.aef.modules.AEFModule; import me.xginko.aef.utils.EntityUtil; import me.xginko.aef.utils.LocationUtil; import org.bukkit.Chunk; import org.bukkit.World; import org.bukkit.entity.Entity; import org.bukkit.entity.Vehicle; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.vehicle.VehicleCreateEvent; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; public class MinecartLimit extends AEFModule implements Consumer<ScheduledTask>, Listener { private ScheduledTask scheduledTask; private final long checkPeriod; private final int maxMinecartsPerChunk; private final boolean logIsEnabled; public MinecartLimit() { super("chunk-limits.minecart-limit"); config.addComment(configPath + ".enable", """ Limit the amount of minecarts to prevent lag caused by collisions."""); this.logIsEnabled = config.getBoolean(configPath + ".log-removals", false); this.maxMinecartsPerChunk = config.getInt(configPath + ".max-minecarts-per-chunk", 25); this.checkPeriod = Math.max(1, config.getInt(configPath + ".check-period-in-ticks", 400)); } @Override public void enable() { plugin.getServer().getPluginManager().registerEvents(this, plugin); this.scheduledTask = plugin.getServer().getGlobalRegionScheduler() .runAtFixedRate(plugin, this, checkPeriod, checkPeriod); } @Override public boolean shouldEnable() { return config.getBoolean(configPath + ".enable", false); } @Override public void disable() { if (scheduledTask != null) scheduledTask.cancel(); HandlerList.unregisterAll(this); } @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) private void onCreate(VehicleCreateEvent event) { Vehicle vehicle = event.getVehicle(); if (!EntityUtil.MINECARTS.contains(vehicle.getType())) return; int minecartCount = 0; for (Entity entity : vehicle.getChunk().getEntities()) { if (!EntityUtil.MINECARTS.contains(entity.getType())) continue; minecartCount++; if (minecartCount <= maxMinecartsPerChunk) continue; entity.getScheduler().execute(plugin, () -> { entity.remove(); if (logIsEnabled) info("Removed minecart " + entity.getType() + " at " + LocationUtil.toString(entity.getLocation()) + " because reached limit of " + maxMinecartsPerChunk); }, null, 1L); } } @Override public void accept(ScheduledTask task) { for (World world : plugin.getServer().getWorlds()) { for (Chunk chunk : world.getLoadedChunks()) { plugin.getServer().getRegionScheduler().execute(plugin, world, chunk.getX(), chunk.getZ(), () -> { if (!chunk.isEntitiesLoaded()) return; AtomicInteger minecartCount = new AtomicInteger(); for (Entity entity : chunk.getEntities()) { entity.getScheduler().execute(plugin, () -> { if ( !EntityUtil.MINECARTS.contains(entity.getType()) || minecartCount.incrementAndGet() <= maxMinecartsPerChunk ) return; entity.remove(); if (logIsEnabled) info("Removed minecart " + entity.getType() + " at " + LocationUtil.toString(entity.getLocation()) + " because reached limit of " + maxMinecartsPerChunk); }, null, 1L); } }); } } } }