From 9f9daa62416620f0aef36e083ee4b994aa2d7d0e Mon Sep 17 00:00:00 2001 From: quiquelhappy Date: Mon, 8 Jan 2024 11:41:20 +0100 Subject: [PATCH 1/2] disable or enabled stacking based on TPS --- .../rosestacker/manager/StackManager.java | 39 +++++++++++++++---- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/Plugin/src/main/java/dev/rosewood/rosestacker/manager/StackManager.java b/Plugin/src/main/java/dev/rosewood/rosestacker/manager/StackManager.java index 9ea439a00..7840f2417 100644 --- a/Plugin/src/main/java/dev/rosewood/rosestacker/manager/StackManager.java +++ b/Plugin/src/main/java/dev/rosewood/rosestacker/manager/StackManager.java @@ -15,13 +15,10 @@ import dev.rosewood.rosestacker.stack.settings.EntityStackSettings; import dev.rosewood.rosestacker.stack.settings.SpawnerStackSettings; import dev.rosewood.rosestacker.utils.DataUtils; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; + +import java.util.*; import java.util.concurrent.ConcurrentHashMap; + import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.Location; @@ -46,6 +43,8 @@ public class StackManager extends Manager implements StackingLogic { private boolean isEntityStackingTemporarilyDisabled; private boolean isEntityUnstackingTemporarilyDisabled; + private boolean isEntityStackingEnabledForPerformance; + private boolean stackingBasedOnPerformance; private StackedEntityDataStorageType entityDataStorageType; @@ -55,6 +54,8 @@ public StackManager(RosePlugin rosePlugin) { this.stackingThreads = new ConcurrentHashMap<>(); this.isEntityStackingTemporarilyDisabled = false; + this.isEntityStackingEnabledForPerformance = false; + this.stackingBasedOnPerformance = false; } @Override @@ -70,6 +71,30 @@ public void reload() { long interval = autosaveFrequency * 20 * 60; this.autosaveTask = Bukkit.getScheduler().runTaskTimer(this.rosePlugin, () -> this.saveAllData(false), interval, interval); } + + this.stackingBasedOnPerformance = ConfigurationManager.Setting.PERFORMANCE_TPS_TOGGLE.getBoolean(); + if(this.stackingBasedOnPerformance){ + Bukkit.getServer().getScheduler().runTaskAsynchronously(rosePlugin, new Runnable() { + @Override + public void run() { + if(ConfigurationManager.Setting.PERFORMANCE_TPS_TOGGLE.getBoolean()){ + Bukkit.getScheduler().runTaskTimerAsynchronously(rosePlugin, () -> { + double[] tps = Bukkit.getServer().getTPS(); + if(tps.length == 0) return; + double lastTPS = tps[0]; + // hysteresis + if(isEntityStackingEnabledForPerformance && lastTPS >= Setting.PERFORMANCE_TPS_DISABLE_ABOVE.getDouble()){ + // stacking was enabled due to performance, the TPS increased, we can turn it off again + isEntityStackingEnabledForPerformance=false; + } else if(!isEntityStackingEnabledForPerformance && lastTPS <= Setting.PERFORMANCE_TPS_ENABLE_BELOW.getDouble()) { + // stacking was disabled because the performance was above the low bound, but they have decreased past that + isEntityStackingEnabledForPerformance=true; + } + }, 0L, 20L*30L); + } + } + }); + } } @Override @@ -533,7 +558,7 @@ public void setEntityUnstackingTemporarilyDisabled(boolean disabled) { * @return true if instant entity stacking is temporarily disabled, otherwise false */ public boolean isEntityStackingTemporarilyDisabled() { - return this.isEntityStackingTemporarilyDisabled; + return this.isEntityStackingTemporarilyDisabled || (this.stackingBasedOnPerformance && !this.isEntityStackingEnabledForPerformance); } /** From fdc2123301f5fc439109c79bb14465276d5138b2 Mon Sep 17 00:00:00 2001 From: quiquelhappy Date: Mon, 8 Jan 2024 11:41:29 +0100 Subject: [PATCH 2/2] performance settings, tps toggle --- .../rosewood/rosestacker/manager/ConfigurationManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Plugin/src/main/java/dev/rosewood/rosestacker/manager/ConfigurationManager.java b/Plugin/src/main/java/dev/rosewood/rosestacker/manager/ConfigurationManager.java index fca706f23..c890f3c19 100644 --- a/Plugin/src/main/java/dev/rosewood/rosestacker/manager/ConfigurationManager.java +++ b/Plugin/src/main/java/dev/rosewood/rosestacker/manager/ConfigurationManager.java @@ -220,6 +220,10 @@ public enum Setting implements RoseSetting { MISC_MYTHICMOBS_ALLOW_STACKING("misc-settings.mythicmobs-allow-stacking", false, "Should mobs owned by MythicMobs be allowed to stack?", "This is recommended to keep set to false unless you specifically only change mob attributes"), MISC_SPAWNER_PERSISTENT_COMPATIBILITY("misc-settings.spawner-persistent-compatibility", true, "Some plugins like Jobs, mcMMO, and RoseLoot store special data for spawner mobs.", "Disabling this will cause the functionality within those plugins to break."), MISC_STACK_STATISTICS("misc-settings.stack-statistics", true, "Should statistics be accurately tracked for stacked entities?", "This can cause issues if you expect players to kill multiple billion mobs"), + PERFORMANCE_SETTINGS("performance-settings", null, "Plugin behavior based on server performance, and other performance tweaks"), + PERFORMANCE_TPS_TOGGLE("performance-settings.tps-toggle.enabled", false, "Should stacking be automatically disabled or enabled based on server TPS?", "Stacks created during periods of low TPS will remain stacked"), + PERFORMANCE_TPS_ENABLE_BELOW("performance-settings.tps-toggle.enable-below", 16D, "When should we enable the stacking?", "Should be lower than re-enable-above. Stacking will remain enabled until disable-above is reached"), + PERFORMANCE_TPS_DISABLE_ABOVE("performance-settings.tps-toggle.disable-above", 18D, "When should we disable the stacking?"), ; private final String key;