From a304bce48d60ad6c944260df6fb115d8a6043172 Mon Sep 17 00:00:00 2001 From: froobynooby Date: Sun, 19 Nov 2023 16:57:01 +0930 Subject: [PATCH] Option for adjusting view distance in reactive mode --- .../viewdistancetweaks/TaskManager.java | 52 +---- .../viewdistancetweaks/config/VdtConfig.java | 15 +- .../limiter/ViewDistanceLimiter.java | 36 ++-- .../adjustmentmode/AdjustmentMode.java | 6 +- .../adjustmentmode/AdjustmentModes.java | 181 ++++++++++++++++++ .../adjustmentmode/BaseAdjustmentMode.java | 28 ++- .../adjustmentmode/MixedAdjustmentMode.java | 6 +- .../ProactiveAdjustmentMode.java | 8 +- .../ReactiveAdjustmentMode.java | 10 +- .../resources/config-patches/8.patch | 14 ++ src/main/resources/resources/config.yml | 13 +- 11 files changed, 275 insertions(+), 94 deletions(-) create mode 100644 src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/AdjustmentModes.java create mode 100644 src/main/resources/resources/config-patches/8.patch diff --git a/src/main/java/com/froobworld/viewdistancetweaks/TaskManager.java b/src/main/java/com/froobworld/viewdistancetweaks/TaskManager.java index e7fbfaa..4d93f45 100644 --- a/src/main/java/com/froobworld/viewdistancetweaks/TaskManager.java +++ b/src/main/java/com/froobworld/viewdistancetweaks/TaskManager.java @@ -25,6 +25,7 @@ public class TaskManager { private ViewDistanceLimiter noTickLimiterTask; private ViewDistanceClamper simulationDistanceClamper; private ViewDistanceClamper viewDistanceClamper; + private AdjustmentModes adjustmentModes; private Listener clamperListener; private ManualViewDistanceManager manualSimulationDistanceManager; private ManualViewDistanceManager manualViewDistanceManager; @@ -39,6 +40,8 @@ public void init() { initMsptTracker(); initViewDistanceClampers(); initManualViewDistanceManagers(); + adjustmentModes = new AdjustmentModes(viewDistanceTweaks); + adjustmentModes.init(); initLimiterTask(); initNoTickLimiterTask(); } @@ -87,45 +90,10 @@ private void initManualViewDistanceManagers() { } private void initLimiterTask() { - AdjustmentMode proactiveAdjustmentMode = null; - AdjustmentMode reactiveAdjustmentMode = null; - AdjustmentMode.Mode mode = viewDistanceTweaks.getVdtConfig().adjustmentMode.get(); - if (mode == AdjustmentMode.Mode.REACTIVE || mode == AdjustmentMode.Mode.MIXED) { - reactiveAdjustmentMode = new ReactiveAdjustmentMode( - msptTracker, - viewDistanceTweaks.getHookManager().getChunkCounter(), - viewDistanceTweaks.getVdtConfig().reactiveMode.increaseMsptThreshold.get(), - viewDistanceTweaks.getVdtConfig().reactiveMode.decreaseMsptThreshold.get(), - viewDistanceTweaks.getVdtConfig().reactiveMode.msptPrediction.historyLength.get(), - viewDistanceTweaks.getVdtConfig().reactiveMode.msptPrediction.enabled.get(), - viewDistanceTweaks.getHookManager().getSimulationDistanceHook(), - world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).simulationDistance.exclude.get(), - world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).simulationDistance.maximumSimulationDistance.get(), - world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).simulationDistance.minimumSimulationDistance.get(), - viewDistanceTweaks.getVdtConfig().passedChecksForIncrease.get(), - viewDistanceTweaks.getVdtConfig().passedChecksForDecrease.get() - ); - } - if (mode == AdjustmentMode.Mode.PROACTIVE || mode == AdjustmentMode.Mode.MIXED) { - proactiveAdjustmentMode = new ProactiveAdjustmentMode( - viewDistanceTweaks.getVdtConfig().proactiveMode.globalTickingChunkCountTarget.get(), - viewDistanceTweaks.getHookManager().getSimulationDistanceHook(), - viewDistanceTweaks.getHookManager().getChunkCounter(), - world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).simulationDistance.exclude.get(), - world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).simulationDistance.maximumSimulationDistance.get(), - world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).simulationDistance.minimumSimulationDistance.get(), - viewDistanceTweaks.getVdtConfig().passedChecksForIncrease.get(), - viewDistanceTweaks.getVdtConfig().passedChecksForDecrease.get() - ); - } - AdjustmentMode adjustmentMode = mode == AdjustmentMode.Mode.REACTIVE ? reactiveAdjustmentMode - : (mode == AdjustmentMode.Mode.PROACTIVE ? proactiveAdjustmentMode - : new MixedAdjustmentMode(proactiveAdjustmentMode, reactiveAdjustmentMode, AdjustmentMode.Adjustment::strongest)); - limiterTask = new ViewDistanceLimiter( viewDistanceTweaks, viewDistanceTweaks.getHookManager().getSimulationDistanceHook(), - adjustmentMode, + adjustmentModes.getSimulationDistanceAdjustmentMode(), manualSimulationDistanceManager, viewDistanceTweaks.getVdtConfig().logChanges.get(), "Changed simulation distance of {0} ({1} -> {2})" @@ -136,20 +104,10 @@ private void initLimiterTask() { private void initNoTickLimiterTask() { SimulationDistanceHook noTickViewDistanceHook = viewDistanceTweaks.getHookManager().getViewDistanceHook(); if (noTickViewDistanceHook != null) { - AdjustmentMode noTickAdjustmentMode = new ProactiveAdjustmentMode( - viewDistanceTweaks.getVdtConfig().proactiveMode.globalNonTickingChunkCountTarget.get(), - noTickViewDistanceHook, - viewDistanceTweaks.getHookManager().getNoTickChunkCounter(), - world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).viewDistance.exclude.get(), - world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).viewDistance.maximumViewDistance.get(), - world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).viewDistance.minimumViewDistance.get(), - viewDistanceTweaks.getVdtConfig().passedChecksForIncrease.get(), - viewDistanceTweaks.getVdtConfig().passedChecksForDecrease.get() - ); noTickLimiterTask = new ViewDistanceLimiter( viewDistanceTweaks, noTickViewDistanceHook, - noTickAdjustmentMode, + adjustmentModes.getViewDistanceAdjustmentMode(), manualViewDistanceManager, viewDistanceTweaks.getVdtConfig().logChanges.get(), "Changed view distance of {0} ({1} -> {2})" diff --git a/src/main/java/com/froobworld/viewdistancetweaks/config/VdtConfig.java b/src/main/java/com/froobworld/viewdistancetweaks/config/VdtConfig.java index d9dff9d..d3a2eb1 100644 --- a/src/main/java/com/froobworld/viewdistancetweaks/config/VdtConfig.java +++ b/src/main/java/com/froobworld/viewdistancetweaks/config/VdtConfig.java @@ -11,7 +11,7 @@ import java.io.File; public class VdtConfig extends NabConfiguration { - public static final int VERSION = 8; + public static final int VERSION = 9; public VdtConfig(ViewDistanceTweaks viewDistanceTweaks) { super( @@ -51,12 +51,25 @@ public static class ReactiveModeSettings extends ConfigSection { @Entry(key = "increase-mspt-threshold") public final ConfigEntry increaseMsptThreshold = ConfigEntries.doubleEntry(); + @Section(key = "reactive-view-distance") + public final ReactiveViewDistanceSettings reactiveViewDistance = new ReactiveModeSettings.ReactiveViewDistanceSettings(); + @Section(key = "mspt-prediction") public final ReactiveModeSettings.MsptPredictionSettings msptPrediction = new ReactiveModeSettings.MsptPredictionSettings(); @Section(key = "mspt-tracker-settings") public final ReactiveModeSettings.MsptTrackerSettings msptTracker = new ReactiveModeSettings.MsptTrackerSettings(); + public static class ReactiveViewDistanceSettings extends ConfigSection { + + @Entry(key = "use-reactive-view-distance") + public final ConfigEntry useReactiveViewDistance = new ConfigEntry<>(); + + @Entry(key = "target-view-distance-ratio") + public final ConfigEntry targetViewDistanceRatio = ConfigEntries.doubleEntry(); + + } + public static class MsptTrackerSettings extends ConfigSection { @Entry(key = "collection-period") diff --git a/src/main/java/com/froobworld/viewdistancetweaks/limiter/ViewDistanceLimiter.java b/src/main/java/com/froobworld/viewdistancetweaks/limiter/ViewDistanceLimiter.java index 0f1a142..c00e98d 100644 --- a/src/main/java/com/froobworld/viewdistancetweaks/limiter/ViewDistanceLimiter.java +++ b/src/main/java/com/froobworld/viewdistancetweaks/limiter/ViewDistanceLimiter.java @@ -15,7 +15,6 @@ public class ViewDistanceLimiter implements Runnable { private final SimulationDistanceHook simulationDistanceHook; private final AdjustmentMode adjustmentMode; private final ManualViewDistanceManager manualViewDistanceManager; - private final Set changeViewDistanceTasks = new HashSet<>(); private final boolean logChanges; private final String logFormat; private Integer taskId; @@ -32,30 +31,25 @@ public ViewDistanceLimiter(ViewDistanceTweaks viewDistanceTweaks, SimulationDist @Override public void run() { - if (changeViewDistanceTasks.isEmpty()) { - List nonEmptyWorlds = Bukkit.getWorlds().stream() - .filter(world -> !world.getPlayers().isEmpty()) - .filter(world -> !manualViewDistanceManager.hasManuallySetViewDistance(world)) - .collect(Collectors.toList()); - Map adjustments = nonEmptyWorlds.isEmpty() ? Collections.emptyMap() : adjustmentMode.getAdjustments(nonEmptyWorlds); + List nonEmptyWorlds = Bukkit.getWorlds().stream() + .filter(world -> !world.getPlayers().isEmpty()) + .filter(world -> !manualViewDistanceManager.hasManuallySetViewDistance(world)) + .collect(Collectors.toList()); + Map adjustments = nonEmptyWorlds.isEmpty() ? Collections.emptyMap() : adjustmentMode.getAdjustments(nonEmptyWorlds); - for (Map.Entry entry : adjustments.entrySet()) { - World world = entry.getKey(); - AdjustmentMode.Adjustment adjustment = entry.getValue(); - int oldViewDistance = simulationDistanceHook.getDistance(world); + for (Map.Entry entry : adjustments.entrySet()) { + World world = entry.getKey(); + AdjustmentMode.Adjustment adjustment = entry.getValue(); + int oldViewDistance = simulationDistanceHook.getDistance(world); - if (adjustment != AdjustmentMode.Adjustment.STAY) { - int newViewDistance = oldViewDistance + (adjustment == AdjustmentMode.Adjustment.INCREASE ? 1 : -1); - ViewDistanceChangeTask changeTask = new ViewDistanceChangeTask(viewDistanceTweaks, simulationDistanceHook, world, newViewDistance, 0); - changeTask.run(); - changeViewDistanceTasks.add(changeTask); - if (logChanges) { - viewDistanceTweaks.getLogger().info(MessageFormat.format(logFormat, world.getName(), oldViewDistance, newViewDistance)); - } + if (adjustment != AdjustmentMode.Adjustment.STAY) { + int newViewDistance = oldViewDistance + (adjustment == AdjustmentMode.Adjustment.INCREASE ? 1 : -1); + simulationDistanceHook.setDistance(world, newViewDistance); + if (logChanges) { + viewDistanceTweaks.getLogger().info(MessageFormat.format(logFormat, world.getName(), oldViewDistance, newViewDistance)); } } } - changeViewDistanceTasks.removeIf(ViewDistanceChangeTask::completed); } public void start(long period, long startUpDelay) { @@ -68,8 +62,6 @@ public void start(long period, long startUpDelay) { public void cancel() { if (taskId != null) { Bukkit.getScheduler().cancelTask(taskId); - changeViewDistanceTasks.forEach(ViewDistanceChangeTask::cancel); - changeViewDistanceTasks.clear(); taskId = null; } } diff --git a/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/AdjustmentMode.java b/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/AdjustmentMode.java index 59911f3..ed21771 100644 --- a/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/AdjustmentMode.java +++ b/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/AdjustmentMode.java @@ -7,7 +7,11 @@ public interface AdjustmentMode { - Map getAdjustments(Collection worlds); + Map getAdjustments(Collection worlds, boolean mutate); + + default Map getAdjustments(Collection worlds) { + return getAdjustments(worlds, true); + } enum Adjustment { INCREASE, diff --git a/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/AdjustmentModes.java b/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/AdjustmentModes.java new file mode 100644 index 0000000..574c6e5 --- /dev/null +++ b/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/AdjustmentModes.java @@ -0,0 +1,181 @@ +package com.froobworld.viewdistancetweaks.limiter.adjustmentmode; + +import com.froobworld.viewdistancetweaks.ViewDistanceTweaks; +import com.froobworld.viewdistancetweaks.hook.viewdistance.SimulationDistanceHook; +import com.froobworld.viewdistancetweaks.hook.viewdistance.ViewDistanceHook; +import org.bukkit.World; + +import java.util.Collection; +import java.util.Map; + +public class AdjustmentModes { + private final ViewDistanceTweaks viewDistanceTweaks; + private AdjustmentMode sdAdjustmentMode; + private AdjustmentMode vdAdjustmentMode; + + public AdjustmentModes(ViewDistanceTweaks viewDistanceTweaks) { + this.viewDistanceTweaks = viewDistanceTweaks; + } + + public AdjustmentMode getSimulationDistanceAdjustmentMode() { + return sdAdjustmentMode; + } + + public AdjustmentMode getViewDistanceAdjustmentMode() { + return vdAdjustmentMode; + } + + public void init() { + AdjustmentMode.Mode mode = viewDistanceTweaks.getVdtConfig().adjustmentMode.get(); + + AdjustmentMode sdProactiveAdjustmentMode = null; + AdjustmentMode sdReactiveAdjustmentMode = null; + if (mode == AdjustmentMode.Mode.REACTIVE || mode == AdjustmentMode.Mode.MIXED) { + sdReactiveAdjustmentMode = new ReactiveAdjustmentMode( + viewDistanceTweaks.getTaskManager().getMsptTracker(), + viewDistanceTweaks.getHookManager().getChunkCounter(), + viewDistanceTweaks.getVdtConfig().reactiveMode.increaseMsptThreshold.get(), + viewDistanceTweaks.getVdtConfig().reactiveMode.decreaseMsptThreshold.get(), + viewDistanceTweaks.getVdtConfig().reactiveMode.msptPrediction.historyLength.get(), + viewDistanceTweaks.getVdtConfig().reactiveMode.msptPrediction.enabled.get(), + viewDistanceTweaks.getHookManager().getSimulationDistanceHook(), + world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).simulationDistance.exclude.get(), + world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).simulationDistance.maximumSimulationDistance.get(), + world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).simulationDistance.minimumSimulationDistance.get(), + viewDistanceTweaks.getVdtConfig().passedChecksForIncrease.get(), + viewDistanceTweaks.getVdtConfig().passedChecksForDecrease.get() + ); + } + if (mode == AdjustmentMode.Mode.PROACTIVE || mode == AdjustmentMode.Mode.MIXED) { + sdProactiveAdjustmentMode = new ProactiveAdjustmentMode( + viewDistanceTweaks.getVdtConfig().proactiveMode.globalTickingChunkCountTarget.get(), + viewDistanceTweaks.getHookManager().getSimulationDistanceHook(), + viewDistanceTweaks.getHookManager().getChunkCounter(), + world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).simulationDistance.exclude.get(), + world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).simulationDistance.maximumSimulationDistance.get(), + world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).simulationDistance.minimumSimulationDistance.get(), + viewDistanceTweaks.getVdtConfig().passedChecksForIncrease.get(), + viewDistanceTweaks.getVdtConfig().passedChecksForDecrease.get() + ); + } + + AdjustmentMode vdProactiveAdjustmentMode = null; + AdjustmentMode vdReactiveAdjustmentMode = null; + if (viewDistanceTweaks.getHookManager().getViewDistanceHook() != null) { + if ((mode == AdjustmentMode.Mode.REACTIVE || mode == AdjustmentMode.Mode.MIXED) && viewDistanceTweaks.getVdtConfig().reactiveMode.reactiveViewDistance.useReactiveViewDistance.get()) { + vdReactiveAdjustmentMode = new ReactiveAdjustmentMode( + viewDistanceTweaks.getTaskManager().getMsptTracker(), + viewDistanceTweaks.getHookManager().getNoTickChunkCounter(), + viewDistanceTweaks.getVdtConfig().reactiveMode.increaseMsptThreshold.get(), + viewDistanceTweaks.getVdtConfig().reactiveMode.decreaseMsptThreshold.get(), + viewDistanceTweaks.getVdtConfig().reactiveMode.msptPrediction.historyLength.get(), + false, // no MSPT prediction for view distance + viewDistanceTweaks.getHookManager().getViewDistanceHook(), + world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).viewDistance.exclude.get(), + world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).viewDistance.maximumViewDistance.get(), + world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).viewDistance.minimumViewDistance.get(), + viewDistanceTweaks.getVdtConfig().passedChecksForIncrease.get(), + viewDistanceTweaks.getVdtConfig().passedChecksForDecrease.get() + ); + } + if (mode == AdjustmentMode.Mode.PROACTIVE || mode == AdjustmentMode.Mode.MIXED || !viewDistanceTweaks.getVdtConfig().reactiveMode.reactiveViewDistance.useReactiveViewDistance.get()) { + vdProactiveAdjustmentMode = new ProactiveAdjustmentMode( + viewDistanceTweaks.getVdtConfig().proactiveMode.globalNonTickingChunkCountTarget.get(), + viewDistanceTweaks.getHookManager().getViewDistanceHook(), + viewDistanceTweaks.getHookManager().getNoTickChunkCounter(), + world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).viewDistance.exclude.get(), + world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).viewDistance.maximumViewDistance.get(), + world -> viewDistanceTweaks.getVdtConfig().worldSettings.of(world).viewDistance.minimumViewDistance.get(), + viewDistanceTweaks.getVdtConfig().passedChecksForIncrease.get(), + viewDistanceTweaks.getVdtConfig().passedChecksForDecrease.get() + ); + } + } + if (sdReactiveAdjustmentMode != null && vdReactiveAdjustmentMode != null) { + double ratio = Math.max(1, viewDistanceTweaks.getVdtConfig().reactiveMode.reactiveViewDistance.targetViewDistanceRatio.get()); + AdjustmentMode newSdReactiveAdjustmentMode = new RatioPreservingAdjustmentMode( + ratio, + RatioPreservingAdjustmentMode.Type.SIMULATION_DISTANCE, + sdReactiveAdjustmentMode, + vdReactiveAdjustmentMode, + viewDistanceTweaks.getHookManager().getSimulationDistanceHook(), + viewDistanceTweaks.getHookManager().getViewDistanceHook() + ); + AdjustmentMode newVdReactiveAdjustmentMode = new RatioPreservingAdjustmentMode( + ratio, + RatioPreservingAdjustmentMode.Type.VIEW_DISTANCE, + sdReactiveAdjustmentMode, + vdReactiveAdjustmentMode, + viewDistanceTweaks.getHookManager().getSimulationDistanceHook(), + viewDistanceTweaks.getHookManager().getViewDistanceHook() + ); + sdReactiveAdjustmentMode = newSdReactiveAdjustmentMode; + vdReactiveAdjustmentMode = newVdReactiveAdjustmentMode; + } + this.sdAdjustmentMode = sdProactiveAdjustmentMode == null ? sdReactiveAdjustmentMode + : (sdReactiveAdjustmentMode == null ? sdProactiveAdjustmentMode + : new MixedAdjustmentMode(sdProactiveAdjustmentMode, sdReactiveAdjustmentMode, AdjustmentMode.Adjustment::strongest)); + + this.vdAdjustmentMode = vdProactiveAdjustmentMode == null ? vdReactiveAdjustmentMode + : (vdReactiveAdjustmentMode == null ? vdProactiveAdjustmentMode + : new MixedAdjustmentMode(vdProactiveAdjustmentMode, vdReactiveAdjustmentMode, AdjustmentMode.Adjustment::strongest)); + } + + + private static class RatioPreservingAdjustmentMode implements AdjustmentMode { + private final double targetRatio; + private final Type type; + private final AdjustmentMode simulationDistanceAdjustmentMode; + private final AdjustmentMode viewDistanceAdjustmentMode; + private final SimulationDistanceHook simulationDistanceHook; + private final ViewDistanceHook viewDistanceHook; + + private RatioPreservingAdjustmentMode(double targetRatio, Type type, AdjustmentMode simulationDistanceAdjustmentMode, AdjustmentMode viewDistanceAdjustmentMode,SimulationDistanceHook simulationDistanceHook, ViewDistanceHook viewDistanceHook) { + this.targetRatio = targetRatio; + this.type = type; + this.simulationDistanceAdjustmentMode = simulationDistanceAdjustmentMode; + this.viewDistanceAdjustmentMode = viewDistanceAdjustmentMode; + this.simulationDistanceHook = simulationDistanceHook; + this.viewDistanceHook = viewDistanceHook; + } + + @Override + public Map getAdjustments(Collection worlds, boolean mutate) { + if (type == Type.SIMULATION_DISTANCE) { + Map adjustmentMap = simulationDistanceAdjustmentMode.getAdjustments(worlds, true); + Map viewDistanceAdjustmentMap = viewDistanceAdjustmentMode.getAdjustments(worlds, false); + for (World world : worlds) { + if (adjustmentMap.get(world) == Adjustment.INCREASE) { + // cancel the increase if it would put us outside the ratio, unless the view distance is being held up + if ((simulationDistanceHook.getDistance(world) + 1) * targetRatio > viewDistanceHook.getDistance(world)) { + if (viewDistanceAdjustmentMap.get(world) == Adjustment.INCREASE) { + adjustmentMap.put(world, Adjustment.STAY); + } + } + } + } + return adjustmentMap; + } else { + Map adjustmentMap = viewDistanceAdjustmentMode.getAdjustments(worlds, true); + Map simulationDistanceAdjustmentMap = simulationDistanceAdjustmentMode.getAdjustments(worlds, false); + for (World world : worlds) { + if (adjustmentMap.get(world) == Adjustment.DECREASE) { + if (simulationDistanceHook.getDistance(world) * targetRatio > viewDistanceHook.getDistance(world) - 1) { + if (simulationDistanceAdjustmentMap.get(world) == Adjustment.DECREASE) { + adjustmentMap.put(world, Adjustment.STAY); + } + } + } + } + return adjustmentMap; + } + } + + enum Type { + VIEW_DISTANCE, + SIMULATION_DISTANCE + } + + } + +} diff --git a/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/BaseAdjustmentMode.java b/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/BaseAdjustmentMode.java index def512f..a07e82d 100644 --- a/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/BaseAdjustmentMode.java +++ b/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/BaseAdjustmentMode.java @@ -27,25 +27,24 @@ public BaseAdjustmentMode(SimulationDistanceHook simulationDistanceHook, Functio this.requiredDecrease = requiredDecrease; } - - public Adjustment tryIncrease(World world) { + protected Adjustment tryIncrease(World world, boolean mutate) { if (exclude.apply(world)) { return Adjustment.STAY; } - return getAdjustmentHistory(world).increase() < requiredIncrease ? Adjustment.STAY : + return getAdjustmentHistory(world).increase(mutate) < requiredIncrease ? Adjustment.STAY : simulationDistanceHook.getDistance(world) < maximumViewDistance.apply(world) ? Adjustment.INCREASE : Adjustment.STAY; } - public Adjustment tryDecrease(World world) { + protected Adjustment tryDecrease(World world, boolean mutate) { if (exclude.apply(world)) { return Adjustment.STAY; } - return getAdjustmentHistory(world).decrease() < requiredDecrease ? Adjustment.STAY : + return getAdjustmentHistory(world).decrease(mutate) < requiredDecrease ? Adjustment.STAY : simulationDistanceHook.getDistance(world) > minimumViewDistance.apply(world) ? Adjustment.DECREASE : Adjustment.STAY; } - public Adjustment tryStay(World world) { - getAdjustmentHistory(world).stay(); + protected Adjustment tryStay(World world, boolean mutate) { + getAdjustmentHistory(world).stay(mutate); return Adjustment.STAY; } @@ -57,19 +56,28 @@ private static class AdjustmentHistory { private int increaseCount; private int decreaseCount; - public int increase() { + public int increase(boolean mutate) { + if (!mutate) { + return increaseCount + 1; + } this.increaseCount++; this.decreaseCount = 0; return increaseCount; } - public int decrease() { + public int decrease(boolean mutate) { + if (!mutate) { + return increaseCount + 1; + } this.decreaseCount++; this.increaseCount = 0; return decreaseCount; } - public void stay() { + public void stay(boolean mutate) { + if (!mutate) { + return; + } this.increaseCount = 0; this.decreaseCount = 0; } diff --git a/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/MixedAdjustmentMode.java b/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/MixedAdjustmentMode.java index e0acbe9..97baa20 100644 --- a/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/MixedAdjustmentMode.java +++ b/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/MixedAdjustmentMode.java @@ -19,9 +19,9 @@ public MixedAdjustmentMode(AdjustmentMode adjustmentMode1, AdjustmentMode adjust } @Override - public Map getAdjustments(Collection worlds) { - Map adjustments1 = adjustmentMode1.getAdjustments(worlds); - Map adjustments2 = adjustmentMode2.getAdjustments(worlds); + public Map getAdjustments(Collection worlds, boolean mutate) { + Map adjustments1 = adjustmentMode1.getAdjustments(worlds, mutate); + Map adjustments2 = adjustmentMode2.getAdjustments(worlds, mutate); Map finalAdjustments = new HashMap<>(adjustments1); for (Map.Entry entry : adjustments2.entrySet()) { diff --git a/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/ProactiveAdjustmentMode.java b/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/ProactiveAdjustmentMode.java index fb7de51..1a09311 100644 --- a/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/ProactiveAdjustmentMode.java +++ b/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/ProactiveAdjustmentMode.java @@ -23,7 +23,7 @@ public ProactiveAdjustmentMode(int globalChunkCountTarget, SimulationDistanceHoo } @Override - public Map getAdjustments(Collection worlds) { + public Map getAdjustments(Collection worlds, boolean mutate) { Map chunkCounts = new HashMap<>(); int totalCount = 0; for (World world : worlds) { @@ -36,7 +36,7 @@ public Map getAdjustments(Collection worlds) { if (totalCount < globalChunkCountTarget) { int newChunkCount = (int) chunkCounter.countChunks(world, simulationDistanceHook.getDistance(world) + 1); int oldCount = chunkCounts.get(world); - Adjustment adjustment = tryIncrease(world); + Adjustment adjustment = tryIncrease(world, mutate); if (totalCount + newChunkCount - oldCount <= globalChunkCountTarget) { adjustments.put(world, adjustment); @@ -47,7 +47,7 @@ public Map getAdjustments(Collection worlds) { adjustments.put(world, Adjustment.STAY); } } else if (totalCount > globalChunkCountTarget) { - Adjustment adjustment = tryDecrease(world); + Adjustment adjustment = tryDecrease(world, mutate); adjustments.put(world, adjustment); if (adjustment == Adjustment.DECREASE) { int newChunkCount = (int) chunkCounter.countChunks(world, simulationDistanceHook.getDistance(world) - 1); @@ -55,7 +55,7 @@ public Map getAdjustments(Collection worlds) { chunkCountDiff = newChunkCount - oldCount; } } else { - Adjustment adjustment = tryStay(world); + Adjustment adjustment = tryStay(world, mutate); adjustments.put(world, adjustment); } totalCount += chunkCountDiff; diff --git a/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/ReactiveAdjustmentMode.java b/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/ReactiveAdjustmentMode.java index 3b77efc..542f311 100644 --- a/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/ReactiveAdjustmentMode.java +++ b/src/main/java/com/froobworld/viewdistancetweaks/limiter/adjustmentmode/ReactiveAdjustmentMode.java @@ -34,7 +34,7 @@ public ReactiveAdjustmentMode(MsptTracker msptTracker, ChunkCounter chunkCounter } @Override - public Map getAdjustments(Collection worlds) { + public Map getAdjustments(Collection worlds, boolean mutate) { Map chunkCounts = new HashMap<>(); int totalCount = 0; for (World world : worlds) { @@ -49,18 +49,18 @@ public Map getAdjustments(Collection worlds) { if (mspt <= increaseMsptThreshold) { int additionalChunks = (int) chunkCounter.countChunks(world, simulationDistanceHook.getDistance(world) + 1) - chunkCounts.get(world); if (useMsptChunkHistory && mspt + msptChunkHistory.getMaximumMsptPerChunk() * (totalAdditionalChunks + additionalChunks) >= decreaseMsptThreshold) { - adjustments.put(world, tryStay(world)); + adjustments.put(world, tryStay(world, mutate)); } else { - Adjustment adjustment = tryIncrease(world); + Adjustment adjustment = tryIncrease(world, mutate); adjustments.put(world, adjustment); if (adjustment == Adjustment.INCREASE) { totalAdditionalChunks += additionalChunks; } } } else if (mspt >= decreaseMsptThreshold) { - adjustments.put(world, tryDecrease(world)); + adjustments.put(world, tryDecrease(world, mutate)); } else { - adjustments.put(world, tryStay(world)); + adjustments.put(world, tryStay(world, mutate)); } } msptChunkHistory.purge(); diff --git a/src/main/resources/resources/config-patches/8.patch b/src/main/resources/resources/config-patches/8.patch new file mode 100644 index 0000000..05c9956 --- /dev/null +++ b/src/main/resources/resources/config-patches/8.patch @@ -0,0 +1,14 @@ +[add-section] +before=mspt-tracker-settings +key=reactive-mode-settings.reactive-view-distance +comment=# These settings concern how view distance should be handled by reactive mode. + +[add-field] +key = reactive-mode-settings.reactive-view-distance.use-reactive-view-distance +value = false +comment =# Should we adjust the view distance in reactive mode?\n# * Note: If set to false, view distance will be adjusted as though proactive mode is active. + +[add-field] +key=reactive-mode-settings.reactive-view-distance.target-view-distance-ratio +value=2.0 +comment=# What ratio should we try to maintain between the view distance and simulation distance?\n# * This prevents the simulation distance and view distance bunching up.\n# * As an example, setting this to 2 would target a view distance which is at least 2x the simulation distance. \ No newline at end of file diff --git a/src/main/resources/resources/config.yml b/src/main/resources/resources/config.yml index ea9d7e8..6a88a59 100644 --- a/src/main/resources/resources/config.yml +++ b/src/main/resources/resources/config.yml @@ -3,7 +3,7 @@ # Github: https://github.com/froobynooby/ViewDistanceTweaks # Please don't change this! -version: 8 +version: 9 # Set this to true to enable the plugin. The plugin is initially disabled so that you can make changes to the config # appropriate to your server. @@ -44,6 +44,17 @@ reactive-mode-settings: # Above what MSPT should we consider decreasing the simulation distance? decrease-mspt-threshold: 47.0 + # These settings concern how view distance should be handled by reactive mode. + reactive-view-distance: + # Should we adjust the view distance in reactive mode? + # * Note: If set to false, view distance will be adjusted as though proactive mode is active. + use-reactive-view-distance: true + + # What ratio should we try to maintain between the view distance and simulation distance? + # * This prevents the simulation distance and view distance bunching up. + # * As an example, setting this to 2 would target a view distance which is at least 2x the simulation distance. + target-view-distance-ratio: 2.0 + # These settings concern how we determine the server's MSPT. # * Only touch these settings if you know what you're doing. mspt-tracker-settings: