Skip to content

Commit e619930

Browse files
authored
feat: add permission check to view distance notifications (#5) (#6)
* feat: add permission check to view distance notifications * feat: split notification permission into increase and decrease * feat: add config option "ViewRadius.RequireNotifyPermission" and only limit view distance notifications based on permission filter if it's true
1 parent cf98603 commit e619930

File tree

4 files changed

+72
-21
lines changed

4 files changed

+72
-21
lines changed

README.md

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,16 @@ Controls the server's TPS limiting behavior.
6262
#### View Radius (`ViewRadius`)
6363
Controls dynamic view radius adjustment based on resource pressure.
6464

65-
| Option | Type | Default | Description |
66-
|---------------------------|---------|---------|--------------------------------------------------------|
67-
| `Enabled` | boolean | `true` | Enable/disable dynamic view radius adjustment |
68-
| `MinViewRadius` | integer | `2` | Minimum allowed view radius |
69-
| `DecreaseFactor` | double | `0.75` | Factor to multiply current view radius when decreasing |
70-
| `IncreaseValue` | integer | `1` | Amount to increase view radius when recovering |
71-
| `InitialDelaySeconds` | integer | `30` | Delay before view radius adjustment starts |
72-
| `CheckIntervalSeconds` | integer | `5` | How often to check resource pressure |
73-
| `RecoveryWaitTimeSeconds` | integer | `60` | Time to wait before attempting to increase view radius |
65+
| Option | Type | Default | Description |
66+
|---------------------------|---------|---------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
67+
| `Enabled` | boolean | `true` | Enable/disable dynamic view radius adjustment |
68+
| `MinViewRadius` | integer | `2` | Minimum allowed view radius |
69+
| `DecreaseFactor` | double | `0.75` | Factor to multiply current view radius when decreasing |
70+
| `IncreaseValue` | integer | `1` | Amount to increase view radius when recovering |
71+
| `InitialDelaySeconds` | integer | `30` | Delay before view radius adjustment starts |
72+
| `CheckIntervalSeconds` | integer | `5` | How often to check resource pressure |
73+
| `RecoveryWaitTimeSeconds` | integer | `60` | Time to wait before attempting to increase view radius |
74+
| `RequireNotifyPermission` | boolean | `false` | Only send view distance update notifications to players with the permissions `nitrado.performance_saver.notify.increase` or `nitrado.performance_saver.notify.decrease` |
7475

7576
##### GC Monitor (`ViewRadius.GcMonitor`)
7677
Monitors JVM garbage collection to detect memory pressure.

src/main/java/net/nitrado/hytale/plugins/performance_saver/PerformanceSaverPlugin.java

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@
22

33
import com.hypixel.hytale.server.core.HytaleServer;
44
import com.hypixel.hytale.server.core.Message;
5+
import com.hypixel.hytale.server.core.permissions.PermissionsModule;
56
import com.hypixel.hytale.server.core.plugin.JavaPlugin;
67
import com.hypixel.hytale.server.core.plugin.JavaPluginInit;
8+
import com.hypixel.hytale.server.core.universe.PlayerRef;
79
import com.hypixel.hytale.server.core.universe.Universe;
810
import com.hypixel.hytale.server.core.util.Config;
911
import net.nitrado.hytale.plugins.performance_saver.chunks.ChunkGarbageCollector;
@@ -103,37 +105,61 @@ protected void adjustViewRadius() {
103105
gcViewRadiusResult = this.gcMonitor.getViewRadiusChange(lastAdjustmentDeltaNanos);
104106
}
105107

106-
if (this.config.getViewRadiusConfig().getTpsMonitorConfig().isEnabled()) {
108+
if (this.config.getViewRadiusConfig().getTpsMonitorConfig().isEnabled()) {
107109
tpsViewRadiusResult = this.tpsMonitor.getViewRadiusChange(lastAdjustmentDeltaNanos);
108110
}
109111

110-
if (gcViewRadiusResult == ViewRadiusResult.DECREASE) {
112+
if (gcViewRadiusResult == ViewRadiusResult.DECREASE) {
111113
var newViewRadius = this.reduceViewRadius(currentViewRadius);
112114

113115
if (newViewRadius != currentViewRadius) {
114-
Universe.get().sendMessage(Message.raw("Memory critical. Reducing view radius to " + newViewRadius + " chunks."));
116+
if (this.config.getViewRadiusConfig().isRequireNotifyPermission()) {
117+
Universe.get().getPlayers().stream()
118+
.filter(playerRef -> PermissionsModule.get().hasPermission(playerRef.getUuid(), Permissions.NOTIFY_DECREASE))
119+
.forEach(playerRef -> playerRef.sendMessage(Message.raw("Memory critical. Reducing view radius to " + newViewRadius + " chunks.")));
120+
} else {
121+
Universe.get().getPlayers().forEach(playerRef -> playerRef.sendMessage(Message.raw("Memory critical. Reducing view radius to " + newViewRadius + " chunks.")));
122+
}
115123
if (currentViewRadius == this.initialViewRadius) {
116-
Universe.get().sendMessage(Message.raw("Memory pressure can be caused by fast exploration and similar activities. View radius will recover over time if memory usage allows."));
124+
if (this.config.getViewRadiusConfig().isRequireNotifyPermission()) {
125+
Universe.get().getPlayers().stream()
126+
.filter(playerRef -> PermissionsModule.get().hasPermission(playerRef.getUuid(), Permissions.NOTIFY_DECREASE))
127+
.forEach(playerRef -> playerRef.sendMessage(Message.raw("Memory pressure can be caused by fast exploration and similar activities. View radius will recover over time if memory usage allows.")));
128+
} else {
129+
Universe.get().getPlayers().forEach(playerRef -> playerRef.sendMessage(Message.raw("Memory pressure can be caused by fast exploration and similar activities. View radius will recover over time if memory usage allows.")));
130+
}
117131
}
118132
getLogger().atWarning().log("Memory critical. Reducing view radius to " + newViewRadius + " chunks.");
119133
}
120134
}
121135

122-
if (tpsViewRadiusResult == ViewRadiusResult.DECREASE) {
136+
if (tpsViewRadiusResult == ViewRadiusResult.DECREASE) {
123137
var newViewRadius = this.reduceViewRadius(currentViewRadius);
124138

125139
if (newViewRadius != currentViewRadius) {
126-
Universe.get().sendMessage(Message.raw("TPS low. Reducing view radius to " + newViewRadius + " chunks."));
140+
if (this.config.getViewRadiusConfig().isRequireNotifyPermission()) {
141+
Universe.get().getPlayers().stream()
142+
.filter(playerRef -> PermissionsModule.get().hasPermission(playerRef.getUuid(), Permissions.NOTIFY_DECREASE))
143+
.forEach(playerRef -> playerRef.sendMessage(Message.raw("TPS low. Reducing view radius to " + newViewRadius + " chunks.")));
144+
} else {
145+
Universe.get().getPlayers().forEach(playerRef -> playerRef.sendMessage(Message.raw("TPS low. Reducing view radius to " + newViewRadius + " chunks.")));
146+
}
127147
if (currentViewRadius == this.initialViewRadius) {
128-
Universe.get().sendMessage(Message.raw("Low TPS can be caused by chunk generation and large amounts of active NPCs. View radius will recover when load decreases."));
148+
if (this.config.getViewRadiusConfig().isRequireNotifyPermission()) {
149+
Universe.get().getPlayers().stream()
150+
.filter(playerRef -> PermissionsModule.get().hasPermission(playerRef.getUuid(), Permissions.NOTIFY_DECREASE))
151+
.forEach(playerRef -> playerRef.sendMessage(Message.raw("Low TPS can be caused by chunk generation and large amounts of active NPCs. View radius will recover when load decreases.")));
152+
} else {
153+
Universe.get().getPlayers().forEach(playerRef -> playerRef.sendMessage(Message.raw("Low TPS can be caused by chunk generation and large amounts of active NPCs. View radius will recover when load decreases.")));
154+
}
129155
}
130-
getLogger().atWarning().log("TPS low. Reducing view radius to " + newViewRadius + " chunks.");
156+
getLogger().atWarning().log("TPS low. Reducing view radius to " + newViewRadius + " chunks.");
131157
}
132158
}
133159

134160
if (lastAdjustmentDeltaNanos > this.config.getViewRadiusConfig().getRecoveryWaitTime().toNanos()
135-
&& gcViewRadiusResult == ViewRadiusResult.INCREASE
136-
&& tpsViewRadiusResult == ViewRadiusResult.INCREASE) {
161+
&& gcViewRadiusResult == ViewRadiusResult.INCREASE
162+
&& tpsViewRadiusResult == ViewRadiusResult.INCREASE) {
137163
this.increaseViewRadius(currentViewRadius);
138164
}
139165
}
@@ -176,7 +202,13 @@ protected int increaseViewRadius(int currentViewRadius) {
176202
var newViewRadius = Math.min(currentViewRadius + this.config.getViewRadiusConfig().getIncreaseValue(), this.initialViewRadius);
177203

178204
if (newViewRadius > currentViewRadius) {
179-
Universe.get().sendMessage(Message.raw("Increasing view radius back to " + newViewRadius + " chunks."));
205+
if (this.config.getViewRadiusConfig().isRequireNotifyPermission()) {
206+
Universe.get().getPlayers().stream()
207+
.filter(playerRef -> PermissionsModule.get().hasPermission(playerRef.getUuid(), Permissions.NOTIFY_INCREASE))
208+
.forEach(playerRef -> playerRef.sendMessage(Message.raw("Increasing view radius back to " + newViewRadius + " chunks.")));
209+
} else {
210+
Universe.get().getPlayers().forEach(playerRef -> playerRef.sendMessage(Message.raw("Increasing view radius back to " + newViewRadius + " chunks.")));
211+
}
180212
getLogger().atInfo().log("Increasing view radius back to " + newViewRadius + " chunks.");
181213
this.lastAdjustmentNanos = System.nanoTime();
182214
HytaleServer.get().getConfig().setMaxViewRadius(newViewRadius);
@@ -211,4 +243,4 @@ protected void shutdown() {
211243
this.tpsTask.cancel(false);
212244
}
213245
}
214-
}
246+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package net.nitrado.hytale.plugins.performance_saver;
2+
3+
public final class Permissions {
4+
public static final String NOTIFY_INCREASE = "nitrado.performance_saver.notify.increase";
5+
public static final String NOTIFY_DECREASE = "nitrado.performance_saver.notify.decrease";
6+
7+
private Permissions() {} // Prevent instantiation
8+
}

src/main/java/net/nitrado/hytale/plugins/performance_saver/config/ViewRadiusConfig.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ public class ViewRadiusConfig {
4343
(config, value) -> config.recoveryWaitTime = value,
4444
config -> config.recoveryWaitTime
4545
).add()
46+
.append(
47+
new KeyedCodec<>("RequireNotifyPermission", Codec.BOOLEAN),
48+
(config, value) -> config.requireNotifyPermission = value,
49+
config -> config.requireNotifyPermission
50+
).add()
4651
.append(
4752
new KeyedCodec<>("GcMonitor", GcMonitorConfig.CODEC),
4853
(config, value) -> config.gcMonitorConfig = value,
@@ -69,6 +74,7 @@ public class ViewRadiusConfig {
6974
private Duration initialDelay = Duration.ofSeconds(30);
7075
private Duration checkInterval = Duration.ofSeconds(5);
7176
private Duration recoveryWaitTime = Duration.ofSeconds(60);
77+
private boolean requireNotifyPermission = false;
7278
private GcMonitorConfig gcMonitorConfig = new GcMonitorConfig();
7379
private TpsMonitorConfig tpsMonitorConfig = new TpsMonitorConfig();
7480

@@ -100,6 +106,10 @@ public Duration getRecoveryWaitTime() {
100106
return recoveryWaitTime.compareTo(Duration.ZERO) <= 0 ? MIN_DURATION : recoveryWaitTime;
101107
}
102108

109+
public boolean isRequireNotifyPermission() {
110+
return requireNotifyPermission;
111+
}
112+
103113
public GcMonitorConfig getGcMonitorConfig() {
104114
return gcMonitorConfig;
105115
}

0 commit comments

Comments
 (0)