Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion gradle.properties
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ loader_version=0.18.4
loom_version=1.15-SNAPSHOT

# Mod Properties
mod_version = 2.4.3+26.1
mod_version = 2.4.4+26.1
maven_group = net.treset
archives_base_name = adaptiveview

Expand Down
166 changes: 85 additions & 81 deletions src/main/java/net/treset/adaptiveview/AdaptiveViewMod.java
Original file line number Diff line number Diff line change
@@ -1,81 +1,85 @@
package net.treset.adaptiveview;

import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.server.MinecraftServer;
import net.treset.adaptiveview.commands.ConfigCommandHandler;
import net.treset.adaptiveview.commands.LockCommandHandler;
import net.treset.adaptiveview.commands.NotificationCommandHandler;
import net.treset.adaptiveview.config.Config;
import net.treset.adaptiveview.distance.ServerHandler;
import net.treset.adaptiveview.distance.ViewDistanceHandler;
import net.treset.adaptiveview.tools.TextTools;
import net.treset.adaptiveview.unlocking.LockManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class AdaptiveViewMod implements ModInitializer {
public static final Logger LOGGER = LoggerFactory.getLogger("adaptiveview");

private static final Config config = Config.loadOrDefault();
private static final NotificationCommandHandler notificationCommandHandler = new NotificationCommandHandler(config);
private static final ConfigCommandHandler configCommandHandler = new ConfigCommandHandler(config);
private static final ViewDistanceHandler viewDistanceHandler = new ViewDistanceHandler(config);
private static final LockManager lockManager = new LockManager(config, viewDistanceHandler);
private static final LockCommandHandler lockCommandHandler = new LockCommandHandler(config, lockManager);
private static final ServerHandler serverHandler = new ServerHandler(config, lockManager, viewDistanceHandler);
private static MinecraftServer server;

private static boolean client = false;

public static Config getConfig() {
return config;
}

public static MinecraftServer getServer() {
return server;
}

public static boolean isClient() {
return client;
}

public static void setClient(boolean client) {
AdaptiveViewMod.client = client;
}

@Override
public void onInitialize() {
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> this.registerCommands(dispatcher, environment));

ServerLifecycleEvents.SERVER_STARTED.register((s) -> server = s);
ServerTickEvents.END_SERVER_TICK.register(serverHandler::onTick);
}

private void registerCommands(CommandDispatcher<CommandSourceStack> dispatcher, Commands.CommandSelection selection) {
if(!selection.includeDedicated && !config.isAllowOnClient()) return;
LiteralArgumentBuilder<CommandSourceStack> builder = Commands.literal("adaptiveview")
.executes(this::status)
.then(Commands.literal("status")
.executes(this::status)
);
notificationCommandHandler.registerCommands(builder);
configCommandHandler.registerCommands(builder);
lockCommandHandler.registerCommands(builder);

dispatcher.register(builder);
}

private int status(CommandContext<CommandSourceStack> ctx) {
TextTools.replyFormatted(ctx, "View Distance: $b%s chunks", ViewDistanceHandler.getViewDistance());
TextTools.replyFormatted(ctx, "Simulation Distance: $b%s chunks", ViewDistanceHandler.getSimDistance());
return 1;
}
}
package net.treset.adaptiveview;

import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerTickEvents;
import net.minecraft.commands.CommandSourceStack;
import net.minecraft.commands.Commands;
import net.minecraft.server.MinecraftServer;
import net.treset.adaptiveview.commands.ConfigCommandHandler;
import net.treset.adaptiveview.commands.LockCommandHandler;
import net.treset.adaptiveview.commands.NotificationCommandHandler;
import net.treset.adaptiveview.config.Config;
import net.treset.adaptiveview.distance.ServerHandler;
import net.treset.adaptiveview.distance.ViewDistanceHandler;
import net.treset.adaptiveview.tools.TextTools;
import net.treset.adaptiveview.unlocking.LockManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class AdaptiveViewMod implements ModInitializer {
public static final Logger LOGGER = LoggerFactory.getLogger("adaptiveview");

private static final Config config = Config.loadOrDefault();
private static final NotificationCommandHandler notificationCommandHandler = new NotificationCommandHandler(config);
private static final ConfigCommandHandler configCommandHandler = new ConfigCommandHandler(config);
private static final ViewDistanceHandler viewDistanceHandler = new ViewDistanceHandler(config);
private static final LockManager lockManager = new LockManager(config, viewDistanceHandler);
private static final LockCommandHandler lockCommandHandler = new LockCommandHandler(config, lockManager);
private static final ServerHandler serverHandler = new ServerHandler(config, lockManager, viewDistanceHandler);
private static MinecraftServer server;

private static boolean client = false;

public static Config getConfig() {
return config;
}

public static MinecraftServer getServer() {
return server;
}

public static ServerHandler getServerHandler() {
return serverHandler;
}

public static boolean isClient() {
return client;
}

public static void setClient(boolean client) {
AdaptiveViewMod.client = client;
}

@Override
public void onInitialize() {
CommandRegistrationCallback.EVENT.register((dispatcher, registryAccess, environment) -> this.registerCommands(dispatcher, environment));

ServerLifecycleEvents.SERVER_STARTED.register((s) -> server = s);
ServerTickEvents.END_SERVER_TICK.register(serverHandler::onTick);
}

private void registerCommands(CommandDispatcher<CommandSourceStack> dispatcher, Commands.CommandSelection selection) {
if(!selection.includeDedicated && !config.isAllowOnClient()) return;
LiteralArgumentBuilder<CommandSourceStack> builder = Commands.literal("adaptiveview")
.executes(this::status)
.then(Commands.literal("status")
.executes(this::status)
);
notificationCommandHandler.registerCommands(builder);
configCommandHandler.registerCommands(builder);
lockCommandHandler.registerCommands(builder);

dispatcher.register(builder);
}

private int status(CommandContext<CommandSourceStack> ctx) {
TextTools.replyFormatted(ctx, "View Distance: $b%s chunks", ViewDistanceHandler.getViewDistance());
TextTools.replyFormatted(ctx, "Simulation Distance: $b%s chunks", ViewDistanceHandler.getSimDistance());
return 1;
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
package net.treset.adaptiveview.distance;

import net.treset.adaptiveview.config.Rule;
import net.treset.adaptiveview.tools.MathTools;

import java.util.List;

record DistanceData(int maxDistance, int minDistance, int updateRate, int step) {
public int getTargetDistance(int currentDistance) {
return MathTools.clamp(currentDistance + step, minDistance, maxDistance);
return Math.clamp(currentDistance + step, minDistance, maxDistance);
}

public static DistanceData extract(List<Rule> rules, int defaultMax, int defaultMin) {
Expand Down
136 changes: 68 additions & 68 deletions src/main/java/net/treset/adaptiveview/distance/ServerHandler.java
Original file line number Diff line number Diff line change
@@ -1,68 +1,68 @@
package net.treset.adaptiveview.distance;

import net.minecraft.server.MinecraftServer;
import net.treset.adaptiveview.AdaptiveViewMod;
import net.treset.adaptiveview.config.Config;
import net.treset.adaptiveview.config.ServerState;
import net.treset.adaptiveview.tools.MathTools;
import net.treset.adaptiveview.unlocking.LockManager;

import java.util.*;

public class ServerHandler {
private static final ArrayList<Long> tickLengths = new ArrayList<>();

public static ArrayList<Long> getTickLengths() {
return tickLengths;
}

private final Config config;
private final LockManager lockManager;
private final ViewDistanceHandler viewDistanceHandler;

private int tickCounter = 0;

private int nextUpdate;

public ServerHandler(Config config, LockManager lockManager, ViewDistanceHandler viewDistanceHandler) {
this.config = config;
this.lockManager = lockManager;
this.viewDistanceHandler = viewDistanceHandler;
this.nextUpdate = config.getUpdateRate();
}


public void onTick(MinecraftServer server) {
if(AdaptiveViewMod.isClient() && !config.isAllowOnClient()) {
return;
}
lockManager.onTick();

tickCounter++;

if(tickCounter == nextUpdate) {
ServerState state = new ServerState(
ViewDistanceHandler.getViewDistance(),
ViewDistanceHandler.getSimDistance(),
(double)MathTools.longArrayAverage(tickLengths.toArray(new Long[0])) / 1000000d,
getMemory(),
getPlayers()
);

tickCounter = 0;
nextUpdate = viewDistanceHandler.updateViewDistance(state);
tickLengths.clear();
}
}

public static double getMemory() {
long allocatedMemory = Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
long maxMemory = Runtime.getRuntime().maxMemory();
return allocatedMemory/(double)maxMemory*100;
}

public static List<String> getPlayers() {
MinecraftServer server = AdaptiveViewMod.getServer();
return Arrays.stream(server.getPlayerNames()).toList();
}
}
package net.treset.adaptiveview.distance;
import net.minecraft.server.MinecraftServer;
import net.treset.adaptiveview.AdaptiveViewMod;
import net.treset.adaptiveview.config.Config;
import net.treset.adaptiveview.config.ServerState;
import net.treset.adaptiveview.unlocking.LockManager;
import java.util.*;
public class ServerHandler {
private TickLengthBuffer tickLengths;
public TickLengthBuffer getTickLengths() {
return tickLengths;
}
private final Config config;
private final LockManager lockManager;
private final ViewDistanceHandler viewDistanceHandler;
private int tickCounter = 0;
private int nextUpdate;
public ServerHandler(Config config, LockManager lockManager, ViewDistanceHandler viewDistanceHandler) {
this.config = config;
this.lockManager = lockManager;
this.viewDistanceHandler = viewDistanceHandler;
this.nextUpdate = config.getUpdateRate();
this.tickLengths = new TickLengthBuffer(config.getUpdateRate());
}
public void onTick(MinecraftServer server) {
if(AdaptiveViewMod.isClient() && !config.isAllowOnClient()) {
return;
}
lockManager.onTick();
tickCounter++;
if(tickCounter == nextUpdate) {
ServerState state = new ServerState(
ViewDistanceHandler.getViewDistance(),
ViewDistanceHandler.getSimDistance(),
tickLengths.averageMillis(),
getMemory(),
getPlayers()
);
tickCounter = 0;
nextUpdate = viewDistanceHandler.updateViewDistance(state);
tickLengths.reset();
}
}
public static double getMemory() {
long allocatedMemory = Runtime.getRuntime().totalMemory()-Runtime.getRuntime().freeMemory();
long maxMemory = Runtime.getRuntime().maxMemory();
return allocatedMemory/(double)maxMemory*100;
}
public static List<String> getPlayers() {
MinecraftServer server = AdaptiveViewMod.getServer();
return Arrays.stream(server.getPlayerNames()).toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package net.treset.adaptiveview.distance;

public class TickLengthBuffer {
private final long[] buffer;
private int index = 0;
private int count = 0;

public TickLengthBuffer(int capacity) {
this.buffer = new long[capacity];
}

public void add(long value) {
buffer[index] = value;
index = (index + 1) % buffer.length;
if (count < buffer.length) count++;
}

public double averageMillis() {
if (count == 0) return 0d;
long sum = 0;
for (int i = 0; i < count; i++) {
sum += buffer[i];
}
return (sum / (double) count) / 1_000_000d;
}

public void reset() {
index = 0;
count = 0;
}
}
Loading