From de0c28beab524aff8d3a2626f3303fc0b509f35a Mon Sep 17 00:00:00 2001 From: AoElite <20812471+AoElite@users.noreply.github.com> Date: Thu, 10 Oct 2024 08:00:33 -0400 Subject: [PATCH] reloading rework, allows you to have per player configurations & other things, doesn't cover every option yet --- build.gradle.kts | 9 +- src/main/java/ac/grim/grimac/GrimAPI.java | 4 +- .../java/ac/grim/grimac/GrimExternalAPI.java | 117 ++++++++++++++---- .../java/ac/grim/grimac/checks/Check.java | 33 +++-- .../grim/grimac/checks/impl/combat/Reach.java | 8 +- .../impl/misc/GhostBlockMitigation.java | 8 +- .../impl/movement/NegativeTimerCheck.java | 6 +- .../grimac/checks/impl/movement/NoSlowA.java | 6 +- .../checks/impl/movement/TimerCheck.java | 8 +- .../checks/impl/prediction/OffsetHandler.java | 15 ++- .../impl/scaffolding/AirLiquidPlace.java | 6 +- .../impl/velocity/ExplosionHandler.java | 12 +- .../impl/velocity/KnockbackHandler.java | 16 +-- .../grimac/checks/type/BlockPlaceCheck.java | 6 +- .../ac/grim/grimac/commands/GrimReload.java | 21 ++-- ...figManager.java => ConfigManagerImpl.java} | 68 ++++++++-- .../ac/grim/grimac/manager/InitManager.java | 16 ++- .../grimac/manager/PunishmentManager.java | 11 +- .../ac/grim/grimac/player/GrimPlayer.java | 27 ++-- .../utils/common/ConfigReloadObserver.java | 10 ++ 20 files changed, 273 insertions(+), 134 deletions(-) rename src/main/java/ac/grim/grimac/manager/{ConfigManager.java => ConfigManagerImpl.java} (89%) create mode 100644 src/main/java/ac/grim/grimac/utils/common/ConfigReloadObserver.java diff --git a/build.gradle.kts b/build.gradle.kts index e9b722928d..19a9fa07a9 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,8 +11,8 @@ plugins { group = "ac.grim.grimac" version = "2.3.68" description = "Libre simulation anticheat designed for 1.21 with 1.8-1.21 support, powered by PacketEvents 2.0." -java.sourceCompatibility = JavaVersion.VERSION_1_8 -java.targetCompatibility = JavaVersion.VERSION_1_8 +java.sourceCompatibility = JavaVersion.VERSION_17 +java.targetCompatibility = JavaVersion.VERSION_17 // Set to false for debug builds // You cannot live reload classes if the jar relocates dependencies @@ -44,8 +44,9 @@ dependencies { implementation("it.unimi.dsi:fastutil:8.5.13") implementation("github.scarsz:configuralize:1.4.0") - implementation("com.github.grimanticheat:grimapi:1193c4fa41") - // Used for local testing: implementation("ac.grim.grimac:grimapi:1.0") + //implementation("com.github.grimanticheat:grimapi:1193c4fa41") + // Used for local testing: implementation("ac.grim.grimac:GRIMAPI:1.0") + implementation("com.github.grimanticheat:grimapi:fc5634e444") implementation("org.jetbrains:annotations:24.1.0") compileOnly("org.geysermc.floodgate:api:2.0-SNAPSHOT") diff --git a/src/main/java/ac/grim/grimac/GrimAPI.java b/src/main/java/ac/grim/grimac/GrimAPI.java index da65c244f6..cc3aa03c70 100644 --- a/src/main/java/ac/grim/grimac/GrimAPI.java +++ b/src/main/java/ac/grim/grimac/GrimAPI.java @@ -19,12 +19,12 @@ public enum GrimAPI { private final TickManager tickManager = new TickManager(); private final GrimExternalAPI externalAPI = new GrimExternalAPI(this); private InitManager initManager; - private ConfigManager configManager; + private ConfigManagerImpl configManager; private JavaPlugin plugin; public void load(final JavaPlugin plugin) { this.plugin = plugin; - this.configManager = new ConfigManager(); + this.configManager = new ConfigManagerImpl(); initManager = new InitManager(); initManager.load(); } diff --git a/src/main/java/ac/grim/grimac/GrimExternalAPI.java b/src/main/java/ac/grim/grimac/GrimExternalAPI.java index 5fcb8df5f1..1d2e7afc30 100644 --- a/src/main/java/ac/grim/grimac/GrimExternalAPI.java +++ b/src/main/java/ac/grim/grimac/GrimExternalAPI.java @@ -4,22 +4,29 @@ import ac.grim.grimac.api.GrimAbstractAPI; import ac.grim.grimac.api.GrimUser; import ac.grim.grimac.api.alerts.AlertManager; +import ac.grim.grimac.api.config.ConfigManager; +import ac.grim.grimac.api.events.GrimReloadEvent; import ac.grim.grimac.manager.init.Initable; import ac.grim.grimac.player.GrimPlayer; +import ac.grim.grimac.utils.common.ConfigReloadObserver; import com.github.retrooper.packetevents.netty.channel.ChannelHelper; import io.github.retrooper.packetevents.util.SpigotReflectionUtil; +import io.github.retrooper.packetevents.util.folia.FoliaScheduler; import lombok.Getter; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; import org.bukkit.plugin.PluginDescriptionFile; import org.jetbrains.annotations.Nullable; import java.util.Map; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; //This is used for grim's external API. It has its own class just for organization. -public class GrimExternalAPI implements GrimAbstractAPI, Initable { + +public class GrimExternalAPI implements GrimAbstractAPI, ConfigReloadObserver, Initable { private final GrimAPI api; @@ -41,7 +48,8 @@ public void setServerName(String name) { @Getter private final Map> variableReplacements = new ConcurrentHashMap<>(); - @Getter private final Map staticReplacements = new ConcurrentHashMap<>(); + @Getter + private final Map staticReplacements = new ConcurrentHashMap<>(); public String replaceVariables(GrimUser user, String content, boolean colors) { if (colors) content = ChatColor.translateAlternateColorCodes('&', content); @@ -56,12 +64,20 @@ public String replaceVariables(GrimUser user, String content, boolean colors) { @Override public void registerVariable(String string, Function replacement) { - variableReplacements.put(string, replacement); + if (replacement == null) { + variableReplacements.remove(string); + } else { + variableReplacements.put(string, replacement); + } } @Override public void registerVariable(String variable, String replacement) { - staticReplacements.put(variable, replacement); + if (replacement == null) { + staticReplacements.remove(variable); + } else { + staticReplacements.put(variable, replacement); + } } @Override @@ -70,43 +86,37 @@ public String getGrimVersion() { return description.getVersion(); } + private final Map> functions = new ConcurrentHashMap<>(); + @Override public void registerFunction(String key, Function function) { - + if (function == null) { + functions.remove(key); + } else { + functions.put(key, function); + } } @Override public Function getFunction(String key) { - return null; + return functions.get(key); } @Override - public void reload() { - GrimAPI.INSTANCE.getConfigManager().reload(); - //Reload checks for all players - for (GrimPlayer grimPlayer : GrimAPI.INSTANCE.getPlayerDataManager().getEntries()) { - ChannelHelper.runInEventLoop(grimPlayer.user.getChannel(), () -> { - grimPlayer.onReload(); - grimPlayer.updatePermissions(); - grimPlayer.punishmentManager.reload(); - for (AbstractCheck value : grimPlayer.checkManager.allChecks.values()) { - value.reload(); - } - }); - } - //Restart - GrimAPI.INSTANCE.getDiscordManager().start(); - GrimAPI.INSTANCE.getSpectateManager().start(); - GrimAPI.INSTANCE.getExternalAPI().start(); + public AlertManager getAlertManager() { + return GrimAPI.INSTANCE.getAlertManager(); } @Override - public AlertManager getAlertManager() { - return GrimAPI.INSTANCE.getAlertManager(); + public ConfigManager getConfigManager() { + return configManager; } + private ConfigManager configManager = null; + @Override public void start() { + if (configManager == null) configManager = GrimAPI.INSTANCE.getConfigManager(); variableReplacements.put("%player%", GrimUser::getName); variableReplacements.put("%uuid%", user -> user.getUniqueId().toString()); variableReplacements.put("%ping%", user -> user.getTransactionPing() + ""); @@ -118,4 +128,61 @@ public void start() { variableReplacements.put("%version%", GrimUser::getVersionName); variableReplacements.put("%prefix%", user -> ChatColor.translateAlternateColorCodes('&', GrimAPI.INSTANCE.getConfigManager().getConfig().getStringElse("prefix", "&bGrim &8ยป"))); } + + @Override + public void reload(ConfigManager config) { + if (config.isLoadedAsync()) { + FoliaScheduler.getAsyncScheduler().runNow(GrimAPI.INSTANCE.getPlugin(), + o -> successfulReload(config)); + } else { + successfulReload(config); + } + } + + @Override + public CompletableFuture reloadAsync(ConfigManager config) { + if (config.isLoadedAsync()) { + CompletableFuture future = new CompletableFuture<>(); + FoliaScheduler.getAsyncScheduler().runNow(GrimAPI.INSTANCE.getPlugin(), + o -> future.complete(successfulReload(config))); + return future; + } + return CompletableFuture.completedFuture(successfulReload(config)); + } + + private boolean successfulReload(ConfigManager config) { + try { + config.reload(); + onReload(config); + FoliaScheduler.getAsyncScheduler().runNow(GrimAPI.INSTANCE.getPlugin(), + o -> Bukkit.getPluginManager().callEvent(new GrimReloadEvent(true))); + return true; + } catch (Exception e) { + e.printStackTrace(); + } + FoliaScheduler.getAsyncScheduler().runNow(GrimAPI.INSTANCE.getPlugin(), + o -> Bukkit.getPluginManager().callEvent(new GrimReloadEvent(false))); + return false; + } + + @Override + public void onReload(ConfigManager newConfig) { + configManager = newConfig != null ? newConfig : configManager; + //Reload checks for all players + for (GrimPlayer grimPlayer : GrimAPI.INSTANCE.getPlayerDataManager().getEntries()) { + ChannelHelper.runInEventLoop(grimPlayer.user.getChannel(), () -> { + grimPlayer.reload(configManager); + grimPlayer.updatePermissions(); + grimPlayer.punishmentManager.reload(configManager); + for (AbstractCheck value : grimPlayer.checkManager.allChecks.values()) { + value.reload(configManager); + } + }); + } + //Restart + GrimAPI.INSTANCE.getDiscordManager().start(); + GrimAPI.INSTANCE.getSpectateManager().start(); + GrimAPI.INSTANCE.getExternalAPI().start(); + } + } diff --git a/src/main/java/ac/grim/grimac/checks/Check.java b/src/main/java/ac/grim/grimac/checks/Check.java index 8adc776957..a4c9453be3 100644 --- a/src/main/java/ac/grim/grimac/checks/Check.java +++ b/src/main/java/ac/grim/grimac/checks/Check.java @@ -2,11 +2,12 @@ import ac.grim.grimac.GrimAPI; import ac.grim.grimac.api.AbstractCheck; +import ac.grim.grimac.api.config.ConfigManager; import ac.grim.grimac.api.events.FlagEvent; import ac.grim.grimac.player.GrimPlayer; +import ac.grim.grimac.utils.common.ConfigReloadObserver; import com.github.retrooper.packetevents.protocol.packettype.PacketType; import com.github.retrooper.packetevents.protocol.packettype.PacketTypeCommon; -import github.scarsz.configuralize.DynamicConfig; import io.github.retrooper.packetevents.util.folia.FoliaScheduler; import lombok.Getter; import lombok.Setter; @@ -14,7 +15,7 @@ // Class from https://github.com/Tecnio/AntiCheatBase/blob/master/src/main/java/me/tecnio/anticheat/check/Check.java @Getter -public class Check implements AbstractCheck { +public class Check implements AbstractCheck, ConfigReloadObserver { protected final GrimPlayer player; public double violations; @@ -53,8 +54,8 @@ public Check(final GrimPlayer player) { this.experimental = checkData.experimental(); this.description = checkData.description(); } - - reload(); + // + reload(GrimAPI.INSTANCE.getConfigManager().getConfig()); } public boolean shouldModifyPackets() { @@ -107,21 +108,22 @@ public final void reward() { violations = Math.max(0, violations - decay); } - public void reload() { - decay = getConfig().getDoubleElse(configName + ".decay", decay); - setbackVL = getConfig().getDoubleElse(configName + ".setbackvl", setbackVL); - + @Override + public void reload(ConfigManager configuration) { + decay = configuration.getDoubleElse(configName + ".decay", decay); + setbackVL = configuration.getDoubleElse(configName + ".setbackvl", setbackVL); if (setbackVL == -1) setbackVL = Double.MAX_VALUE; - updateExempted(); + onReload(configuration); } - public boolean alert(String verbose) { - return player.punishmentManager.handleAlert(player, verbose, this); + @Override + public void onReload(ConfigManager config) { + } - public DynamicConfig getConfig() { - return GrimAPI.INSTANCE.getConfigManager().getConfig(); + public boolean alert(String verbose) { + return player.punishmentManager.handleAlert(player, verbose, this); } public boolean setbackIfAboveSetbackVL() { @@ -144,5 +146,10 @@ public boolean isTransaction(PacketTypeCommon packetType) { packetType == PacketType.Play.Client.WINDOW_CONFIRMATION; } + @Override + public void reload() { + reload(GrimAPI.INSTANCE.getConfigManager().getConfig()); + } + } diff --git a/src/main/java/ac/grim/grimac/checks/impl/combat/Reach.java b/src/main/java/ac/grim/grimac/checks/impl/combat/Reach.java index 2876d3664d..06e598ec4f 100644 --- a/src/main/java/ac/grim/grimac/checks/impl/combat/Reach.java +++ b/src/main/java/ac/grim/grimac/checks/impl/combat/Reach.java @@ -15,6 +15,7 @@ // along with this program. If not, see . package ac.grim.grimac.checks.impl.combat; +import ac.grim.grimac.api.config.ConfigManager; import ac.grim.grimac.checks.Check; import ac.grim.grimac.checks.CheckData; import ac.grim.grimac.checks.type.PacketCheck; @@ -236,9 +237,8 @@ private String checkReach(PacketEntity reachEntity, Vector3d from, boolean isPre } @Override - public void reload() { - super.reload(); - this.cancelImpossibleHits = getConfig().getBooleanElse("Reach.block-impossible-hits", true); - this.threshold = getConfig().getDoubleElse("Reach.threshold", 0.0005); + public void onReload(ConfigManager config) { + this.cancelImpossibleHits = config.getBooleanElse("Reach.block-impossible-hits", true); + this.threshold = config.getDoubleElse("Reach.threshold", 0.0005); } } diff --git a/src/main/java/ac/grim/grimac/checks/impl/misc/GhostBlockMitigation.java b/src/main/java/ac/grim/grimac/checks/impl/misc/GhostBlockMitigation.java index b0ac731114..928a3c8921 100644 --- a/src/main/java/ac/grim/grimac/checks/impl/misc/GhostBlockMitigation.java +++ b/src/main/java/ac/grim/grimac/checks/impl/misc/GhostBlockMitigation.java @@ -1,5 +1,6 @@ package ac.grim.grimac.checks.impl.misc; +import ac.grim.grimac.api.config.ConfigManager; import ac.grim.grimac.checks.type.BlockPlaceCheck; import ac.grim.grimac.player.GrimPlayer; import ac.grim.grimac.utils.anticheat.update.BlockPlace; @@ -63,10 +64,9 @@ public void onBlockPlace(final BlockPlace place) { } @Override - public void reload() { - super.reload(); - allow = getConfig().getBooleanElse("exploit.allow-building-on-ghostblocks", true); - distance = getConfig().getIntElse("exploit.distance-to-check-for-ghostblocks", 2); + public void onReload(ConfigManager config) { + allow = config.getBooleanElse("exploit.allow-building-on-ghostblocks", true); + distance = config.getIntElse("exploit.distance-to-check-for-ghostblocks", 2); if (distance < 2 || distance > 4) distance = 2; } diff --git a/src/main/java/ac/grim/grimac/checks/impl/movement/NegativeTimerCheck.java b/src/main/java/ac/grim/grimac/checks/impl/movement/NegativeTimerCheck.java index 3e21c6c18f..74ce5279ce 100644 --- a/src/main/java/ac/grim/grimac/checks/impl/movement/NegativeTimerCheck.java +++ b/src/main/java/ac/grim/grimac/checks/impl/movement/NegativeTimerCheck.java @@ -1,5 +1,6 @@ package ac.grim.grimac.checks.impl.movement; +import ac.grim.grimac.api.config.ConfigManager; import ac.grim.grimac.checks.CheckData; import ac.grim.grimac.checks.type.PostPredictionCheck; import ac.grim.grimac.player.GrimPlayer; @@ -35,8 +36,7 @@ public void doCheck(final PacketReceiveEvent event) { } @Override - public void reload() { - super.reload(); - clockDrift = (long) (getConfig().getDoubleElse(getConfigName() + ".drift", 1200.0) * 1e6); + public void onReload(ConfigManager config) { + clockDrift = (long) (config.getDoubleElse(getConfigName() + ".drift", 1200.0) * 1e6); } } diff --git a/src/main/java/ac/grim/grimac/checks/impl/movement/NoSlowA.java b/src/main/java/ac/grim/grimac/checks/impl/movement/NoSlowA.java index 75e38259f2..2bc6dc8248 100644 --- a/src/main/java/ac/grim/grimac/checks/impl/movement/NoSlowA.java +++ b/src/main/java/ac/grim/grimac/checks/impl/movement/NoSlowA.java @@ -1,5 +1,6 @@ package ac.grim.grimac.checks.impl.movement; +import ac.grim.grimac.api.config.ConfigManager; import ac.grim.grimac.checks.Check; import ac.grim.grimac.checks.CheckData; import ac.grim.grimac.checks.type.PostPredictionCheck; @@ -51,8 +52,7 @@ public void handlePredictionAnalysis(double offset) { } @Override - public void reload() { - super.reload(); - offsetToFlag = getConfig().getDoubleElse("NoSlowA.threshold", 0.001); + public void onReload(ConfigManager config) { + offsetToFlag = config.getDoubleElse("NoSlowA.threshold", 0.001); } } diff --git a/src/main/java/ac/grim/grimac/checks/impl/movement/TimerCheck.java b/src/main/java/ac/grim/grimac/checks/impl/movement/TimerCheck.java index c87e51a9a6..9fbe456ef2 100644 --- a/src/main/java/ac/grim/grimac/checks/impl/movement/TimerCheck.java +++ b/src/main/java/ac/grim/grimac/checks/impl/movement/TimerCheck.java @@ -1,5 +1,6 @@ package ac.grim.grimac.checks.impl.movement; +import ac.grim.grimac.api.config.ConfigManager; import ac.grim.grimac.checks.Check; import ac.grim.grimac.checks.CheckData; import ac.grim.grimac.checks.type.PacketCheck; @@ -115,9 +116,8 @@ public boolean shouldCountPacketForTimer(PacketTypeCommon packetType) { } @Override - public void reload() { - super.reload(); - clockDrift = (long) (getConfig().getDoubleElse(getConfigName() + ".drift", 120.0) * 1e6); - limitAbuseOverPing = (long) (getConfig().getDoubleElse(getConfigName() + ".ping-abuse-limit-threshold", 1000)); + public void onReload(ConfigManager config) { + clockDrift = (long) (config.getDoubleElse(getConfigName() + ".drift", 120.0) * 1e6); + limitAbuseOverPing = (long) (config.getDoubleElse(getConfigName() + ".ping-abuse-limit-threshold", 1000)); } } diff --git a/src/main/java/ac/grim/grimac/checks/impl/prediction/OffsetHandler.java b/src/main/java/ac/grim/grimac/checks/impl/prediction/OffsetHandler.java index 970a6a9806..c1012078bc 100644 --- a/src/main/java/ac/grim/grimac/checks/impl/prediction/OffsetHandler.java +++ b/src/main/java/ac/grim/grimac/checks/impl/prediction/OffsetHandler.java @@ -1,5 +1,6 @@ package ac.grim.grimac.checks.impl.prediction; +import ac.grim.grimac.api.config.ConfigManager; import ac.grim.grimac.api.events.CompletePredictionEvent; import ac.grim.grimac.checks.Check; import ac.grim.grimac.checks.CheckData; @@ -99,14 +100,12 @@ private void removeOffsetLenience() { } @Override - public void reload() { - super.reload(); - setbackDecayMultiplier = getConfig().getDoubleElse("Simulation.setback-decay-multiplier", 0.999); - threshold = getConfig().getDoubleElse("Simulation.threshold", 0.001); - immediateSetbackThreshold = getConfig().getDoubleElse("Simulation.immediate-setback-threshold", 0.1); - maxAdvantage = getConfig().getDoubleElse("Simulation.max-advantage", 1); - maxCeiling = getConfig().getDoubleElse("Simulation.max-ceiling", 4); - + public void onReload(ConfigManager config) { + setbackDecayMultiplier = config.getDoubleElse("Simulation.setback-decay-multiplier", 0.999); + threshold = config.getDoubleElse("Simulation.threshold", 0.001); + immediateSetbackThreshold = config.getDoubleElse("Simulation.immediate-setback-threshold", 0.1); + maxAdvantage = config.getDoubleElse("Simulation.max-advantage", 1); + maxCeiling = config.getDoubleElse("Simulation.max-ceiling", 4); if (maxAdvantage == -1) maxAdvantage = Double.MAX_VALUE; if (immediateSetbackThreshold == -1) immediateSetbackThreshold = Double.MAX_VALUE; } diff --git a/src/main/java/ac/grim/grimac/checks/impl/scaffolding/AirLiquidPlace.java b/src/main/java/ac/grim/grimac/checks/impl/scaffolding/AirLiquidPlace.java index 3704b92f1a..ae6de61ae3 100644 --- a/src/main/java/ac/grim/grimac/checks/impl/scaffolding/AirLiquidPlace.java +++ b/src/main/java/ac/grim/grimac/checks/impl/scaffolding/AirLiquidPlace.java @@ -1,5 +1,6 @@ package ac.grim.grimac.checks.impl.scaffolding; +import ac.grim.grimac.api.config.ConfigManager; import ac.grim.grimac.checks.CheckData; import ac.grim.grimac.checks.type.BlockPlaceCheck; import ac.grim.grimac.player.GrimPlayer; @@ -29,8 +30,7 @@ public void onBlockPlace(final BlockPlace place) { } @Override - public void reload() { - super.reload(); - this.cancelVL = getConfig().getIntElse(getConfigName() + ".cancelVL", 0); + public void onReload(ConfigManager config) { + this.cancelVL = config.getIntElse(getConfigName() + ".cancelVL", 0); } } diff --git a/src/main/java/ac/grim/grimac/checks/impl/velocity/ExplosionHandler.java b/src/main/java/ac/grim/grimac/checks/impl/velocity/ExplosionHandler.java index 6916194afb..36fc9a57d5 100644 --- a/src/main/java/ac/grim/grimac/checks/impl/velocity/ExplosionHandler.java +++ b/src/main/java/ac/grim/grimac/checks/impl/velocity/ExplosionHandler.java @@ -1,5 +1,6 @@ package ac.grim.grimac.checks.impl.velocity; +import ac.grim.grimac.api.config.ConfigManager; import ac.grim.grimac.checks.Check; import ac.grim.grimac.checks.CheckData; import ac.grim.grimac.checks.type.PostPredictionCheck; @@ -18,7 +19,6 @@ import com.github.retrooper.packetevents.util.Vector3i; import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerExplosion; import lombok.Getter; -import org.bukkit.Bukkit; import org.bukkit.util.Vector; import org.jetbrains.annotations.Nullable; @@ -256,12 +256,10 @@ public VelocityData getFirstBreadAddedExplosion(int lastTransaction) { } @Override - public void reload() { - super.reload(); - - offsetToFlag = getConfig().getDoubleElse("Explosion.threshold", 0.00001); - setbackVL = getConfig().getDoubleElse("Explosion.setbackvl", 10); - + public void onReload(ConfigManager config) { + offsetToFlag = config.getDoubleElse("Explosion.threshold", 0.00001); + setbackVL = config.getDoubleElse("Explosion.setbackvl", 10); if (setbackVL == -1) setbackVL = Double.MAX_VALUE; } + } diff --git a/src/main/java/ac/grim/grimac/checks/impl/velocity/KnockbackHandler.java b/src/main/java/ac/grim/grimac/checks/impl/velocity/KnockbackHandler.java index 5fa101b1e3..15afa3a127 100644 --- a/src/main/java/ac/grim/grimac/checks/impl/velocity/KnockbackHandler.java +++ b/src/main/java/ac/grim/grimac/checks/impl/velocity/KnockbackHandler.java @@ -1,6 +1,7 @@ package ac.grim.grimac.checks.impl.velocity; import ac.grim.grimac.GrimAPI; +import ac.grim.grimac.api.config.ConfigManager; import ac.grim.grimac.checks.Check; import ac.grim.grimac.checks.CheckData; import ac.grim.grimac.checks.type.PostPredictionCheck; @@ -240,15 +241,14 @@ public VelocityData calculateFirstBreadKnockback(int entityID, int transaction) } @Override - public void reload() { - super.reload(); - offsetToFlag = getConfig().getDoubleElse("Knockback.threshold", 0.001); - maxAdv = getConfig().getDoubleElse("Knockback.max-advantage", 1); - immediate = getConfig().getDoubleElse("Knockback.immediate-setback-threshold", 0.1); - multiplier = getConfig().getDoubleElse("Knockback.setback-decay-multiplier", 0.999); - ceiling = getConfig().getDoubleElse("Knockback.max-ceiling", 4); - + public void onReload(ConfigManager config) { + offsetToFlag = config.getDoubleElse("Knockback.threshold", 0.001); + maxAdv = config.getDoubleElse("Knockback.max-advantage", 1); + immediate = config.getDoubleElse("Knockback.immediate-setback-threshold", 0.1); + multiplier = config.getDoubleElse("Knockback.setback-decay-multiplier", 0.999); + ceiling = config.getDoubleElse("Knockback.max-ceiling", 4); if (maxAdv < 0) maxAdv = Double.MAX_VALUE; if (immediate < 0) immediate = Double.MAX_VALUE; } + } diff --git a/src/main/java/ac/grim/grimac/checks/type/BlockPlaceCheck.java b/src/main/java/ac/grim/grimac/checks/type/BlockPlaceCheck.java index 9791634419..e07e16a381 100644 --- a/src/main/java/ac/grim/grimac/checks/type/BlockPlaceCheck.java +++ b/src/main/java/ac/grim/grimac/checks/type/BlockPlaceCheck.java @@ -1,5 +1,6 @@ package ac.grim.grimac.checks.type; +import ac.grim.grimac.api.config.ConfigManager; import ac.grim.grimac.checks.Check; import ac.grim.grimac.player.GrimPlayer; import ac.grim.grimac.utils.anticheat.update.BlockPlace; @@ -33,9 +34,8 @@ public void onPostFlyingBlockPlace(BlockPlace place) { } @Override - public void reload() { - super.reload(); - this.cancelVL = getConfig().getIntElse(getConfigName() + ".cancelVL", 5); + public void onReload(ConfigManager config) { + this.cancelVL = config.getIntElse(getConfigName() + ".cancelVL", 5); } protected boolean shouldCancel() { diff --git a/src/main/java/ac/grim/grimac/commands/GrimReload.java b/src/main/java/ac/grim/grimac/commands/GrimReload.java index b9b6cf969b..bd1025f5a6 100644 --- a/src/main/java/ac/grim/grimac/commands/GrimReload.java +++ b/src/main/java/ac/grim/grimac/commands/GrimReload.java @@ -1,15 +1,11 @@ package ac.grim.grimac.commands; import ac.grim.grimac.GrimAPI; -import ac.grim.grimac.checks.Check; -import ac.grim.grimac.player.GrimPlayer; import ac.grim.grimac.utils.anticheat.MessageUtil; import co.aikar.commands.BaseCommand; import co.aikar.commands.annotation.CommandAlias; import co.aikar.commands.annotation.CommandPermission; import co.aikar.commands.annotation.Subcommand; -import com.github.retrooper.packetevents.netty.channel.ChannelHelper; -import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; @CommandAlias("grim|grimac") @@ -18,14 +14,15 @@ public class GrimReload extends BaseCommand { @CommandPermission("grim.reload") public void onReload(CommandSender sender) { //reload config - try { - GrimAPI.INSTANCE.getExternalAPI().reload(); - } catch (RuntimeException e) { - sender.sendMessage(ChatColor.RED + e.getMessage()); - return; - } - - sender.sendMessage(MessageUtil.format("%prefix% &fConfig has been reloaded.")); + sender.sendMessage(MessageUtil.format("%prefix% &7Reloading config...")); + GrimAPI.INSTANCE.getExternalAPI().reloadAsync().exceptionally(throwable -> false) + .thenAccept(bool -> { + if (bool) { + sender.sendMessage(MessageUtil.format("%prefix% &fConfig has been reloaded.")); + } else { + sender.sendMessage(MessageUtil.format("%prefix% &cFailed to reload config.")); + } + }); } } diff --git a/src/main/java/ac/grim/grimac/manager/ConfigManager.java b/src/main/java/ac/grim/grimac/manager/ConfigManagerImpl.java similarity index 89% rename from src/main/java/ac/grim/grimac/manager/ConfigManager.java rename to src/main/java/ac/grim/grimac/manager/ConfigManagerImpl.java index 9c9bd124cc..c1eb51cc96 100644 --- a/src/main/java/ac/grim/grimac/manager/ConfigManager.java +++ b/src/main/java/ac/grim/grimac/manager/ConfigManagerImpl.java @@ -2,8 +2,9 @@ import ac.grim.grimac.GrimAC; import ac.grim.grimac.GrimAPI; +import ac.grim.grimac.api.common.BasicReloadable; +import ac.grim.grimac.api.config.ConfigManager; import ac.grim.grimac.utils.anticheat.LogUtil; -import ac.grim.grimac.utils.math.GrimMath; import github.scarsz.configuralize.DynamicConfig; import github.scarsz.configuralize.Language; import lombok.Getter; @@ -16,8 +17,13 @@ import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; -public class ConfigManager { - @Getter +public class ConfigManagerImpl implements ConfigManager, BasicReloadable { + + public ConfigManager getConfig() { + if (GrimAPI.INSTANCE.getInitManager().isStarted()) return GrimAPI.INSTANCE.getExternalAPI().getConfigManager(); + return this; + } + private final DynamicConfig config; @Getter private final File configFile = new File(GrimAPI.INSTANCE.getPlugin().getDataFolder(), "config.yml"); @@ -28,8 +34,6 @@ public class ConfigManager { @Getter private final File punishFile = new File(GrimAPI.INSTANCE.getPlugin().getDataFolder(), "punishments.yml"); @Getter - private int maxPingTransaction = 60; // This is just a really hot variable so cache it. - @Getter private boolean ignoreDuplicatePacketRotation = false; @Getter @@ -37,9 +41,8 @@ public class ConfigManager { private final List ignoredClientPatterns = new ArrayList<>(); - public ConfigManager() { + public ConfigManagerImpl() { upgrade(); - // load config GrimAPI.INSTANCE.getPlugin().getDataFolder().mkdirs(); config = new DynamicConfig(); @@ -51,6 +54,7 @@ public ConfigManager() { reload(); } + @Override public void reload() { String languageCode = System.getProperty("user.language").toUpperCase(); @@ -79,12 +83,9 @@ public void reload() { throw new RuntimeException("Failed to load config", e); } - final int configuredMaxTransactionTime = config.getIntElse("max-transaction-time", 60); - maxPingTransaction = (int) GrimMath.clamp(configuredMaxTransactionTime, 1, 180); - if (maxPingTransaction != configuredMaxTransactionTime) { - LogUtil.warn("Detected invalid max-transaction-time! This setting is clamped between 1 and 180 to prevent issues. " + - "Changed: " + configuredMaxTransactionTime + " -> " + maxPingTransaction); - LogUtil.warn("Attempting to disable or set this too high can result in memory usage issues."); + int configuredMaxTransactionTime = config.getIntElse("max-transaction-time", 60); + if (configuredMaxTransactionTime > 180 || configuredMaxTransactionTime < 1) { + LogUtil.warn("Detected invalid max-transaction-time! This setting is clamped between 1 and 180 to prevent issues. Attempting to disable or set this too high can result in memory usage issues."); } ignoredClientPatterns.clear(); @@ -326,4 +327,45 @@ private void newOffsetHandlingAntiKB(File config, String configString) throws IO ); Files.write(config.toPath(), configString.getBytes()); } + + @Override + public String getStringElse(String key, String otherwise) { + return config.getStringElse(key, otherwise); + } + + @Override + public List getStringList(String key) { + return config.getStringList(key); + } + + @Override + public List getStringListElse(String key, List otherwise) { + return config.getStringListElse(key, otherwise); + } + + @Override + public int getIntElse(String key, int other) { + return config.getIntElse(key, other); + } + + @Override + public long getLongElse(String key, long otherwise) { + return config.getLongElse(key, otherwise); + } + + @Override + public double getDoubleElse(String key, double otherwise) { + return config.getDoubleElse(key, otherwise); + } + + @Override + public boolean getBooleanElse(String key, boolean otherwise) { + return config.getBooleanElse(key, otherwise); + } + + @Override + public T get(String key) { + return config.get(key); + } + } diff --git a/src/main/java/ac/grim/grimac/manager/InitManager.java b/src/main/java/ac/grim/grimac/manager/InitManager.java index 49216c58da..ed1b667e26 100644 --- a/src/main/java/ac/grim/grimac/manager/InitManager.java +++ b/src/main/java/ac/grim/grimac/manager/InitManager.java @@ -8,11 +8,16 @@ import ac.grim.grimac.manager.init.stop.TerminatePacketEvents; import com.google.common.collect.ClassToInstanceMap; import com.google.common.collect.ImmutableClassToInstanceMap; +import lombok.Getter; public class InitManager { - ClassToInstanceMap initializersOnLoad; - ClassToInstanceMap initializersOnStart; - ClassToInstanceMap initializersOnStop; + private final ClassToInstanceMap initializersOnLoad; + private final ClassToInstanceMap initializersOnStart; + private final ClassToInstanceMap initializersOnStop; + + @Getter private boolean loaded = false; + @Getter private boolean started = false; + @Getter private boolean stopped = false; public InitManager() { initializersOnLoad = new ImmutableClassToInstanceMap.Builder() @@ -20,6 +25,7 @@ public InitManager() { .build(); initializersOnStart = new ImmutableClassToInstanceMap.Builder() + .put(GrimExternalAPI.class, GrimAPI.INSTANCE.getExternalAPI()) .put(ExemptOnlinePlayers.class, new ExemptOnlinePlayers()) .put(EventManager.class, new EventManager()) .put(PacketManager.class, new PacketManager()) @@ -31,7 +37,6 @@ public InitManager() { .put(PacketLimiter.class, new PacketLimiter()) .put(DiscordManager.class, GrimAPI.INSTANCE.getDiscordManager()) .put(SpectateManager.class, GrimAPI.INSTANCE.getSpectateManager()) - .put(GrimExternalAPI.class, GrimAPI.INSTANCE.getExternalAPI()) .put(JavaVersion.class, new JavaVersion()) .build(); @@ -44,17 +49,20 @@ public void load() { for (Initable initable : initializersOnLoad.values()) { initable.start(); } + loaded = true; } public void start() { for (Initable initable : initializersOnStart.values()) { initable.start(); } + started = true; } public void stop() { for (Initable initable : initializersOnStop.values()) { initable.start(); } + stopped = true; } } \ No newline at end of file diff --git a/src/main/java/ac/grim/grimac/manager/PunishmentManager.java b/src/main/java/ac/grim/grimac/manager/PunishmentManager.java index 7022bd7f1c..1d3a105d09 100644 --- a/src/main/java/ac/grim/grimac/manager/PunishmentManager.java +++ b/src/main/java/ac/grim/grimac/manager/PunishmentManager.java @@ -2,13 +2,14 @@ import ac.grim.grimac.GrimAPI; import ac.grim.grimac.api.AbstractCheck; +import ac.grim.grimac.api.config.ConfigManager; +import ac.grim.grimac.api.config.ConfigReloadable; import ac.grim.grimac.api.events.CommandExecuteEvent; import ac.grim.grimac.checks.Check; import ac.grim.grimac.events.packets.ProxyAlertMessenger; import ac.grim.grimac.player.GrimPlayer; import ac.grim.grimac.utils.anticheat.LogUtil; import ac.grim.grimac.utils.anticheat.MessageUtil; -import github.scarsz.configuralize.DynamicConfig; import io.github.retrooper.packetevents.util.folia.FoliaScheduler; import lombok.Getter; import lombok.Setter; @@ -17,18 +18,18 @@ import java.util.*; -public class PunishmentManager { +public class PunishmentManager implements ConfigReloadable { GrimPlayer player; List groups = new ArrayList<>(); String experimentalSymbol = "*"; public PunishmentManager(GrimPlayer player) { this.player = player; - reload(); + reload(GrimAPI.INSTANCE.getConfigManager().getConfig()); } - public void reload() { - DynamicConfig config = GrimAPI.INSTANCE.getConfigManager().getConfig(); + @Override + public void reload(ConfigManager config) { List punish = config.getStringListElse("Punishments", new ArrayList<>()); experimentalSymbol = config.getStringElse("experimental-symbol", "*"); diff --git a/src/main/java/ac/grim/grimac/player/GrimPlayer.java b/src/main/java/ac/grim/grimac/player/GrimPlayer.java index 331c4f348e..d55074e57e 100644 --- a/src/main/java/ac/grim/grimac/player/GrimPlayer.java +++ b/src/main/java/ac/grim/grimac/player/GrimPlayer.java @@ -3,6 +3,7 @@ import ac.grim.grimac.GrimAPI; import ac.grim.grimac.api.AbstractCheck; import ac.grim.grimac.api.GrimUser; +import ac.grim.grimac.api.config.ConfigManager; import ac.grim.grimac.checks.Check; import ac.grim.grimac.checks.impl.aim.processor.AimProcessor; import ac.grim.grimac.checks.impl.misc.ClientBrand; @@ -217,7 +218,7 @@ public void onPacketCancel() { public GrimPlayer(User user) { this.user = user; this.playerUUID = user.getUUID(); - onReload(); + reload(GrimAPI.INSTANCE.getConfigManager().getConfig()); boundingBox = GetBoundingBox.getBoundingBoxFromPosAndSizeRaw(x, y, z, 0.6f, 1.8f); @@ -316,7 +317,8 @@ public boolean addTransactionResponse(short id) { // Transactions that we send don't count towards total limit if (packetTracker != null) packetTracker.setIntervalPackets(packetTracker.getIntervalPackets() - 1); - if (skipped > 0 && System.currentTimeMillis() - joinTime > 5000) checkManager.getPacketCheck(TransactionOrder.class).flagAndAlert("skipped: " + skipped); + if (skipped > 0 && System.currentTimeMillis() - joinTime > 5000) + checkManager.getPacketCheck(TransactionOrder.class).flagAndAlert("skipped: " + skipped); do { data = transactionsSent.poll(); @@ -450,7 +452,7 @@ public void pollData() { if (lastTransSent != 0 && lastTransSent + 80 < System.currentTimeMillis()) { sendTransaction(true); // send on netty thread } - if ((System.nanoTime() - getPlayerClockAtLeast()) > GrimAPI.INSTANCE.getConfigManager().getMaxPingTransaction() * 1e9) { + if ((System.nanoTime() - getPlayerClockAtLeast()) > maxTransactionTime * 1e9) { timedOut(); } @@ -515,10 +517,6 @@ public void updatePermissions() { private int spamThreshold = 100; - public void onReload() { - spamThreshold = GrimAPI.INSTANCE.getConfigManager().getConfig().getIntElse("packet-spam-threshold", 100); - } - public boolean isPointThree() { return getClientVersion().isOlderThan(ClientVersion.V_1_18_2); } @@ -548,7 +546,7 @@ public ClientVersion getClientVersion() { // - 3 ticks is a magic value, but it should buffer out incorrect predictions somewhat. // 2. The player is in a vehicle public boolean isTickingReliablyFor(int ticks) { - return (getClientVersion().isOlderThan(ClientVersion.V_1_9) + return (getClientVersion().isOlderThan(ClientVersion.V_1_9) || !uncertaintyHandler.lastPointThree.hasOccurredSince(ticks)) || compensatedEntities.getSelf().inVehicle(); } @@ -716,10 +714,21 @@ public Collection getChecks() { return checkManager.allChecks.values(); } - public void runNettyTaskInMs(Runnable runnable, int ms) { Channel channel = (Channel) user.getChannel(); channel.eventLoop().schedule(runnable, ms, TimeUnit.MILLISECONDS); } + private int maxTransactionTime = 60; + + @Override + public void reload(ConfigManager config) { + spamThreshold = config.getIntElse("packet-spam-threshold", 100); + maxTransactionTime = (int) GrimMath.clamp(config.getIntElse("max-transaction-time", 60), 1, 180); + } + + @Override + public void reload() { + reload(GrimAPI.INSTANCE.getConfigManager().getConfig()); + } } diff --git a/src/main/java/ac/grim/grimac/utils/common/ConfigReloadObserver.java b/src/main/java/ac/grim/grimac/utils/common/ConfigReloadObserver.java new file mode 100644 index 0000000000..6f28aa78a0 --- /dev/null +++ b/src/main/java/ac/grim/grimac/utils/common/ConfigReloadObserver.java @@ -0,0 +1,10 @@ +package ac.grim.grimac.utils.common; + + +import ac.grim.grimac.api.config.ConfigManager; + +public interface ConfigReloadObserver { + + void onReload(ConfigManager config); + +}