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 ab836a1f4f..fe8c8ebcaa 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 @@ -19,6 +19,8 @@ public class OffsetHandler extends Check implements PostPredictionCheck { double immediateSetbackThreshold; double maxAdvantage; double maxCeiling; + double vlScale; + double maxVlsPerFlag; // Current advantage gained double advantageGained = 0; @@ -50,7 +52,7 @@ public void onPredictionComplete(final PredictionComplete predictionComplete) { player.getSetbackTeleportUtil().executeViolationSetback(); } - violations++; + violations += Math.min(maxVlsPerFlag, Math.ceil(offset * vlScale) - 1.0); synchronized (flags) { int flagId = (flags.get() & 255) + 1; // 1-256 as possible values @@ -106,8 +108,11 @@ public void onReload(ConfigManager config) { immediateSetbackThreshold = config.getDoubleElse("Simulation.immediate-setback-threshold", 0.1); maxAdvantage = config.getDoubleElse("Simulation.max-advantage", 1); maxCeiling = config.getDoubleElse("Simulation.max-ceiling", 4); + vlScale = Math.max(1.0, config.getDoubleElse("Simulation.vl-scale", 10)); + maxVlsPerFlag = config.getDoubleElse("Simulation.max-vls-per-flag", 5); if (maxAdvantage == -1) maxAdvantage = Double.MAX_VALUE; if (immediateSetbackThreshold == -1) immediateSetbackThreshold = Double.MAX_VALUE; + if (maxVlsPerFlag == -1) maxVlsPerFlag = Double.MAX_VALUE; } public boolean doesOffsetFlag(double offset) { diff --git a/src/main/java/ac/grim/grimac/manager/PunishmentManager.java b/src/main/java/ac/grim/grimac/manager/PunishmentManager.java index 2faedbb90e..f2946a4ff2 100644 --- a/src/main/java/ac/grim/grimac/manager/PunishmentManager.java +++ b/src/main/java/ac/grim/grimac/manager/PunishmentManager.java @@ -134,36 +134,33 @@ public boolean handleAlert(GrimPlayer player, String verbose, Check check) { } } - if (violationCount >= command.threshold) { - // 0 means execute once - // Any other number means execute every X interval - boolean inInterval = command.interval == 0 ? (command.executeCount == 0) : (violationCount % command.interval == 0); - if (inInterval) { - CommandExecuteEvent executeEvent = new CommandExecuteEvent(player, check, verbose, cmd); - Bukkit.getPluginManager().callEvent(executeEvent); - if (executeEvent.isCancelled()) continue; - - if (command.command.equals("[webhook]")) { - GrimAPI.INSTANCE.getDiscordManager().sendAlert(player, verbose, check.getDisplayName(), vl); - } else if (command.command.equals("[proxy]")) { - ProxyAlertMessenger.sendPluginMessage(replaceAlertPlaceholders(command.command, vl, group, check, proxyAlertString, verbose)); - } else { - if (command.command.equals("[alert]")) { - sentDebug = true; - if (testMode) { // secret test mode - player.user.sendMessage(MessageUtil.miniMessage(cmd)); - continue; - } - cmd = "grim sendalert " + cmd; // Not test mode, we can add the command prefix + // 0 means execute once + // Any other number means execute every X interval + for (; vl >= (command.threshold + (command.interval * command.executeCount)); command.executeCount++) { + if (command.interval == 0 && command.executeCount > 0) break; + + CommandExecuteEvent executeEvent = new CommandExecuteEvent(player, check, verbose, cmd); + Bukkit.getPluginManager().callEvent(executeEvent); + if (executeEvent.isCancelled()) continue; + + if (command.command.equals("[webhook]")) { + GrimAPI.INSTANCE.getDiscordManager().sendAlert(player, verbose, check.getDisplayName(), vl); + } else if (command.command.equals("[proxy]")) { + ProxyAlertMessenger.sendPluginMessage(replaceAlertPlaceholders(command.command, vl, group, check, proxyAlertString, verbose)); + } else { + if (command.command.equals("[alert]")) { + sentDebug = true; + if (testMode) { // secret test mode + player.user.sendMessage(MessageUtil.miniMessage(cmd)); + continue; } - - String finalCmd = cmd; - FoliaScheduler.getGlobalRegionScheduler().run(GrimAPI.INSTANCE.getPlugin(), (dummy) -> - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), finalCmd)); + cmd = "grim sendalert " + cmd; // Not test mode, we can add the command prefix } - } - command.executeCount++; + String finalCmd = cmd; + FoliaScheduler.getGlobalRegionScheduler().run(GrimAPI.INSTANCE.getPlugin(), (dummy) -> + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), finalCmd)); + } } } } @@ -186,7 +183,9 @@ public void handleViolation(Check check) { private int getViolations(PunishGroup group, Check check) { int vl = 0; for (Check value : group.violations.values()) { - if (value == check) vl++; + if (value == check) { + vl = Math.max(vl, (int)Math.ceil(value.getViolations())); + } } return vl; } diff --git a/src/main/resources/config/de.yml b/src/main/resources/config/de.yml index 22707ef586..b880d354b6 100644 --- a/src/main/resources/config/de.yml +++ b/src/main/resources/config/de.yml @@ -64,6 +64,9 @@ Simulation: # Standard-Vorteilsgrenze (x-Achse = Sekunden, y-Achse = 1/1000 Block): https://www.desmos.com/calculator/4lovswdarj max-ceiling: 4 + vl-scale: 10 + max-vls-per-flag: 5 + # Überprüft, ob ein Spieler während einer Bewegung einen Block betreten hat. Phase: setbackvl: 1 # Glitching in Blöcken kann das Klettern an der Wand ermöglichen, außerdem ist dieser Check relativ stabil. diff --git a/src/main/resources/config/en.yml b/src/main/resources/config/en.yml index 1cc6bd002d..6cbe6ca564 100644 --- a/src/main/resources/config/en.yml +++ b/src/main/resources/config/en.yml @@ -63,6 +63,13 @@ Simulation: # This is to stop the player from gathering too many violations and never being able to clear them all # Default advantage ceiling (x axis = seconds, y axis = 1/1000 block): https://www.desmos.com/calculator/4lovswdarj max-ceiling: 4 + # How much should we scale VL gain from a flag by the player's advantage? + # ≤1 for no scaling (old behavior) + vl-scale: 10 + # Limits the amount of VLs the player could gain from each flag + # This is to prevent high latency players from getting large amount of VLs because of lag spikes + # -1 to disable + max-vls-per-flag: 5 # Checks to see if a player entered a block during a movement Phase: diff --git a/src/main/resources/config/es.yml b/src/main/resources/config/es.yml index beeaafc659..c079af6c21 100644 --- a/src/main/resources/config/es.yml +++ b/src/main/resources/config/es.yml @@ -65,6 +65,9 @@ Simulation: # Tope de ventaja por defecto (eje x = segundos, eje y = bloque 1/1000): https://www.desmos.com/calculator/4lovswdarj max-ceiling: 4 + vl-scale: 10 + max-vls-per-flag: 5 + # Comprobaciones para ver si un jugador entro a un bloque durante un movimiento Phase: setbackvl: 1 # Entrar a un bloque mediante bugs puede permitir subir paredes, además esta comprobación es relativamente estable. diff --git a/src/main/resources/config/fr.yml b/src/main/resources/config/fr.yml index 8c84837e18..0a6a753f98 100644 --- a/src/main/resources/config/fr.yml +++ b/src/main/resources/config/fr.yml @@ -64,6 +64,9 @@ Simulation: # Plafond d'avantage par défaut (l"axe x = secondes, l'axe y = 1/1000 de bloc)) : https://www.desmos.com/calculator/4lovswdarj max-ceiling: 4 + vl-scale: 10 + max-vls-per-flag: 5 + # Vérifications pour voir si un joueur est entré dans un bloc pendant un mouvement. Phase: setbackvl: 1 # Rentrer dans des blocs peut permettre de grimper sur les murs, et cette vérification est relativement stable. diff --git a/src/main/resources/config/it.yml b/src/main/resources/config/it.yml index 08be7de308..54d1dcab42 100644 --- a/src/main/resources/config/it.yml +++ b/src/main/resources/config/it.yml @@ -56,6 +56,9 @@ Simulation: # Limite massimo di vantaggio accumulabile prima di arretrare il giocatore max-ceiling: 4 + vl-scale: 10 + max-vls-per-flag: 5 + Phase: # Livello di violazione per il glitch nel blocco setbackvl: 1 diff --git a/src/main/resources/config/ja.yml b/src/main/resources/config/ja.yml index aa1ff1f4cb..4ec934c77f 100644 --- a/src/main/resources/config/ja.yml +++ b/src/main/resources/config/ja.yml @@ -66,6 +66,9 @@ Simulation: # デフォルトのアドバンテージの上限 (x軸 = 秒, y軸 = 1/1000ブロック): https://www.desmos.com/calculator/4lovswdarj max-ceiling: 4 + vl-scale: 10 + max-vls-per-flag: 5 + # プレイヤーが移動中にブロックに入ったかどうかをチェックします。 Phase: setbackvl: 1 # 1ブロック以上のズレがある場合に違反と判断します。 diff --git a/src/main/resources/config/nl.yml b/src/main/resources/config/nl.yml index 9c9a6c907a..a64b9742c0 100644 --- a/src/main/resources/config/nl.yml +++ b/src/main/resources/config/nl.yml @@ -64,6 +64,9 @@ Simulation: # Standaard voordelenplatform (x-as = seconden, y-as = 1/1000 blok): https://www.desmos.com/calculator/4lovswdarj max-ceiling: 4 + vl-scale: 10 + max-vls-per-flag: 5 + # Controleert of een speler een blok is binnengegaan tijdens een beweging Phase: setbackvl: 1 # Glitching in blokken kan muurklimmen mogelijk maken, plus deze controle is relatief stabiel diff --git a/src/main/resources/config/pt.yml b/src/main/resources/config/pt.yml index 071e14b890..4afea93297 100644 --- a/src/main/resources/config/pt.yml +++ b/src/main/resources/config/pt.yml @@ -65,6 +65,9 @@ Simulation: # Cela de vantagens padrão (eixo X = segundos, eixo Y = 1/1000 blocos): https://www.desmos.com/calculator/4lovswdarj max-ceiling: 4 + vl-scale: 10 + max-vls-per-flag: 5 + # Verifica se um jogador entrou em um bloco ao se mover. Phase: setbackvl: 1 # Entrar em blocos possibilita escalar paredes, além disso, essa verificação é relativamente estável. diff --git a/src/main/resources/config/ru.yml b/src/main/resources/config/ru.yml index ba349a9f1e..3c023d632d 100644 --- a/src/main/resources/config/ru.yml +++ b/src/main/resources/config/ru.yml @@ -64,6 +64,9 @@ Simulation: # Потолок преимущества по умолчанию (ось x = секунды, ось y = 1/1000 блока): https://www.desmos.com/calculator/4lovswdarj max-ceiling: 4 + vl-scale: 10 + max-vls-per-flag: 5 + # Проверяет, вошел ли игрок в блок во время движения. Phase: setbackvl: 1 # Глитч с блоками может позволить забраться на стену, к тому же эта проверка относительно стабильна diff --git a/src/main/resources/config/tr.yml b/src/main/resources/config/tr.yml index f55018f0b3..38bc5ae25e 100644 --- a/src/main/resources/config/tr.yml +++ b/src/main/resources/config/tr.yml @@ -64,6 +64,9 @@ Simulation: # Varsayılan avantaj tavanı (x ekseni = saniye, y ekseni = 1/1000 blok): https://www.desmos.com/calculator/4lovswdarj max-ceiling: 4 + vl-scale: 10 + max-vls-per-flag: 5 + # Bir oyuncunun bir hareket sırasında bir bloğa girip girmediğini kontrol eder Phase: setbackvl: 1 # Blokların içinde glitch yapmak duvara tırmanmaya izin verebilir, ayrıca bu kontrol nispeten stabildir diff --git a/src/main/resources/config/zh.yml b/src/main/resources/config/zh.yml index 1a70d14674..cd89d6e729 100644 --- a/src/main/resources/config/zh.yml +++ b/src/main/resources/config/zh.yml @@ -65,6 +65,9 @@ Simulation: # 这是默认配置的样子(x 轴 = seconds ,y 轴 = 1/1000 方块): https://www.desmos.com/calculator/4lovswdarj max-ceiling: 4 + vl-scale: 10 + max-vls-per-flag: 5 + # 检查玩家是否穿墙 Phase: setbackvl: 1 # 错误的方块可以允许爬墙,加上这个检查是相对稳定的