From 97440d7a71b9dee9df2696a51d99513b562120ba Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 16 Feb 2023 10:11:27 -0600 Subject: [PATCH] Server/Client/Shared Api refactoring --- .../lod/core/api/internal/ClientApi.java | 55 +++++++---- .../lod/core/api/internal/ServerApi.java | 93 ++++++++++++------- .../lod/core/api/internal/SharedApi.java | 9 +- 3 files changed, 108 insertions(+), 49 deletions(-) diff --git a/core/src/main/java/com/seibel/lod/core/api/internal/ClientApi.java b/core/src/main/java/com/seibel/lod/core/api/internal/ClientApi.java index b2c5070f6..ce1d6c7df 100644 --- a/core/src/main/java/com/seibel/lod/core/api/internal/ClientApi.java +++ b/core/src/main/java/com/seibel/lod/core/api/internal/ClientApi.java @@ -61,7 +61,7 @@ import java.util.concurrent.TimeUnit; */ public class ClientApi { - private static final Logger LOGGER = LogManager.getLogger(ClientApi.class.getSimpleName()); + private static final Logger LOGGER = LogManager.getLogger(); public static final boolean ENABLE_EVENT_LOGGING = true; public static boolean prefLoggerEnabled = false; @@ -70,15 +70,12 @@ public class ClientApi private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); private static final IMinecraftRenderWrapper MC_RENDER = SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class); - public static final boolean ENABLE_LAG_SPIKE_LOGGING = false; - public static final long LAG_SPIKE_THRESHOLD_NS = TimeUnit.NANOSECONDS.convert(16, TimeUnit.MILLISECONDS); - public static final long SPAM_LOGGER_FLUSH_NS = TimeUnit.NANOSECONDS.convert(1, TimeUnit.SECONDS); private boolean configOverrideReminderPrinted = false; public boolean rendererDisabledBecauseOfExceptions = false; - private long lastFlush = 0; + private long lastFlushNanoTime = 0; @@ -100,14 +97,20 @@ public class ClientApi public void onClientOnlyConnected() { if (ENABLE_EVENT_LOGGING) + { LOGGER.info("Client on ClientOnly mode connecting."); + } + SharedApi.currentWorld = new DhClientWorld(); } public void onClientOnlyDisconnected() { if (ENABLE_EVENT_LOGGING) + { LOGGER.info("Client on ClientOnly mode disconnecting."); + } + SharedApi.currentWorld.close(); SharedApi.currentWorld = null; } @@ -138,7 +141,10 @@ public class ClientApi public void clientLevelUnloadEvent(IClientLevelWrapper level) { if (ENABLE_EVENT_LOGGING) - LOGGER.info("Client level {} unloading.", level); + { + LOGGER.info("Client level "+level+" unloading."); + } + if (SharedApi.currentWorld != null) { SharedApi.currentWorld.unloadLevel(level); @@ -149,7 +155,10 @@ public class ClientApi public void clientLevelLoadEvent(IClientLevelWrapper level) { if (ENABLE_EVENT_LOGGING) - LOGGER.info("Client level {} loading.", level); + { + LOGGER.info("Client level "+level+" loading."); + } + if (SharedApi.currentWorld != null) { SharedApi.currentWorld.getOrLoadLevel(level); @@ -160,7 +169,10 @@ public class ClientApi public void rendererShutdownEvent() { if (ENABLE_EVENT_LOGGING) + { LOGGER.info("Renderer shutting down."); + } + IProfilerWrapper profiler = MC.getProfiler(); profiler.push("DH-RendererShutdown"); @@ -170,9 +182,13 @@ public class ClientApi public void rendererStartupEvent() { if (ENABLE_EVENT_LOGGING) + { LOGGER.info("Renderer starting up."); + } + IProfilerWrapper profiler = MC.getProfiler(); profiler.push("DH-RendererStartup"); + // make sure the GLProxy is created before the LodBufferBuilder needs it GLProxy.getInstance(); profiler.pop(); @@ -183,10 +199,10 @@ public class ClientApi IProfilerWrapper profiler = MC.getProfiler(); profiler.push("DH-ClientTick"); - boolean doFlush = System.nanoTime() - lastFlush >= SPAM_LOGGER_FLUSH_NS; + boolean doFlush = System.nanoTime() - this.lastFlushNanoTime >= SPAM_LOGGER_FLUSH_NS; if (doFlush) { - lastFlush = System.nanoTime(); + this.lastFlushNanoTime = System.nanoTime(); SpamReducedLogger.flushAll(); } ConfigBasedLogger.updateAll(); @@ -207,13 +223,13 @@ public class ClientApi public void renderLods(IClientLevelWrapper levelWrapper, Mat4f mcModelViewMatrix, Mat4f mcProjectionMatrix, float partialTicks) { - if (ModInfo.IS_DEV_BUILD && !configOverrideReminderPrinted && MC.playerExists()) + if (ModInfo.IS_DEV_BUILD && !this.configOverrideReminderPrinted && MC.playerExists()) { // remind the user that this is a development build MC.sendChatMessage(ModInfo.READABLE_NAME + " experimental build " + ModInfo.VERSION); MC.sendChatMessage("You are running an unsupported version of Distant Horizons!"); MC.sendChatMessage("Here be dragons!"); - configOverrideReminderPrinted = true; + this.configOverrideReminderPrinted = true; } @@ -223,7 +239,10 @@ public class ClientApi try { if (!RenderUtil.shouldLodsRender(levelWrapper)) + { return; + } + //FIXME: Improve class hierarchy of DhWorld, IClientWorld, IServerWorld to fix all this hard casting // (also in RenderUtil) @@ -237,7 +256,7 @@ public class ClientApi - profiler.push("Render" + ( Config.Client.Advanced.Debugging.rendererMode.get() == ERendererMode.DEFAULT ? "-lods" : "-debug")); + profiler.push("Render" + (Config.Client.Advanced.Debugging.rendererMode.get() == ERendererMode.DEFAULT ? "-lods" : "-debug")); try { if (Config.Client.Advanced.Debugging.rendererMode.get() == ERendererMode.DEFAULT) @@ -248,7 +267,7 @@ public class ClientApi RenderUtil.createLodModelViewMatrix(mcModelViewMatrix), partialTicks); boolean renderingCanceled = ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeRenderEvent.class, new DhApiBeforeRenderEvent.EventParam(renderEventParam)); - if (!rendererDisabledBecauseOfExceptions && !renderingCanceled) + if (!this.rendererDisabledBecauseOfExceptions && !renderingCanceled) { level.render(mcModelViewMatrix, mcProjectionMatrix, partialTicks, profiler); ApiEventInjector.INSTANCE.fireAllEvents(DhApiAfterRenderEvent.class, new DhApiAfterRenderEvent.EventParam(renderEventParam)); @@ -262,7 +281,7 @@ public class ClientApi } catch (RuntimeException e) { - rendererDisabledBecauseOfExceptions = true; + this.rendererDisabledBecauseOfExceptions = true; LOGGER.error("Renderer thrown an uncaught exception: ", e); MC.sendChatMessage("\u00A74\u00A7l\u00A7uERROR: Distant Horizons" @@ -293,19 +312,23 @@ public class ClientApi public void keyPressedEvent(int glfwKey) { if (!Config.Client.Advanced.Debugging.enableDebugKeybindings.get()) + { + // keybindings are disabled return; + } + if (glfwKey == GLFW.GLFW_KEY_F8) { Config.Client.Advanced.Debugging.debugMode.set(EDebugMode.next(Config.Client.Advanced.Debugging.debugMode.get())); MC.sendChatMessage("F8: Set debug mode to " + Config.Client.Advanced.Debugging.debugMode.get()); } - if (glfwKey == GLFW.GLFW_KEY_F6) + else if (glfwKey == GLFW.GLFW_KEY_F6) { Config.Client.Advanced.Debugging.rendererMode.set(ERendererMode.next(Config.Client.Advanced.Debugging.rendererMode.get())); MC.sendChatMessage("F6: Set rendering to " + Config.Client.Advanced.Debugging.rendererMode.get()); } - if (glfwKey == GLFW.GLFW_KEY_P) + else if (glfwKey == GLFW.GLFW_KEY_P) { prefLoggerEnabled = !prefLoggerEnabled; MC.sendChatMessage("P: Debug Pref Logger is " + (prefLoggerEnabled ? "enabled" : "disabled")); diff --git a/core/src/main/java/com/seibel/lod/core/api/internal/ServerApi.java b/core/src/main/java/com/seibel/lod/core/api/internal/ServerApi.java index b48b9c30e..1b8624922 100644 --- a/core/src/main/java/com/seibel/lod/core/api/internal/ServerApi.java +++ b/core/src/main/java/com/seibel/lod/core/api/internal/ServerApi.java @@ -46,67 +46,90 @@ import java.lang.invoke.MethodHandles; */ public class ServerApi { - public static final boolean ENABLE_STACK_DUMP_LOGGING = false; public static final ServerApi INSTANCE = new ServerApi(); public static final boolean ENABLE_EVENT_LOGGING = true; - private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName()); - private static final IVersionConstants VERSION_CONSTANTS = SingletonInjector.INSTANCE.get(IVersionConstants.class); + private static final Logger LOGGER = DhLoggerBuilder.getLogger(); + + private int lastWorldGenTickDelta = 0; - private ServerApi() - { - } + private ServerApi() { } + + // =============// // tick events // // =============// - - private int lastWorldGenTickDelta = 0; + public void serverTickEvent() { - if (SharedApi.currentWorld instanceof IDhServerWorld) { + if (SharedApi.currentWorld instanceof IDhServerWorld) + { IDhServerWorld serverWorld = (IDhServerWorld) SharedApi.currentWorld; serverWorld.serverTick(); - lastWorldGenTickDelta--; - if (lastWorldGenTickDelta <= 0) { + this.lastWorldGenTickDelta--; + if (this.lastWorldGenTickDelta <= 0) + { serverWorld.doWorldGen(); - lastWorldGenTickDelta = 20; + this.lastWorldGenTickDelta = 20; } } } - public void serverLevelTickEvent(IServerLevelWrapper level) { + public void serverLevelTickEvent(IServerLevelWrapper level) + { //TODO } - //TODO: rename to serverLoadEvent - public void serverWorldLoadEvent(boolean isDedicatedEnvironment) { - if (ENABLE_EVENT_LOGGING) LOGGER.info("Server World loading with (dedicated?:{})", isDedicatedEnvironment); - if (isDedicatedEnvironment) { + public void serverLoadEvent(boolean isDedicatedEnvironment) + { + if (ENABLE_EVENT_LOGGING) + { + LOGGER.info("Server World loading with (dedicated?:{})", isDedicatedEnvironment); + } + + if (isDedicatedEnvironment) + { SharedApi.currentWorld = new DhServerWorld(); - } else { + } + else + { SharedApi.currentWorld = new DhClientServerWorld(); } } - - //TODO: rename to serverUnloadEvent - public void serverWorldUnloadEvent() { - if (ENABLE_EVENT_LOGGING) LOGGER.info("Server World {} unloading", SharedApi.currentWorld); + + public void serverUnloadEvent() + { + if (ENABLE_EVENT_LOGGING) + { + LOGGER.info("Server World "+SharedApi.currentWorld+" unloading"); + } + SharedApi.currentWorld.close(); SharedApi.currentWorld = null; } - - public void serverLevelLoadEvent(IServerLevelWrapper level) { - if (ENABLE_EVENT_LOGGING) LOGGER.info("Server Level {} loading", level); + + public void serverLevelLoadEvent(IServerLevelWrapper level) + { + if (ENABLE_EVENT_LOGGING) + { + LOGGER.info("Server Level {} loading", level); + } + if (SharedApi.currentWorld != null) { SharedApi.currentWorld.getOrLoadLevel(level); ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelLoadEvent.class, new DhApiLevelLoadEvent.EventParam(level)); } } - public void serverLevelUnloadEvent(IServerLevelWrapper level) { - if (ENABLE_EVENT_LOGGING) LOGGER.info("Server Level {} unloading", level); + public void serverLevelUnloadEvent(IServerLevelWrapper level) + { + if (ENABLE_EVENT_LOGGING) + { + LOGGER.info("Server Level {} unloading", level); + } + if (SharedApi.currentWorld != null) { SharedApi.currentWorld.unloadLevel(level); @@ -115,8 +138,13 @@ public class ServerApi } @Deprecated - public void serverSaveEvent() { - if (ENABLE_EVENT_LOGGING) LOGGER.info("Server world {} saving", SharedApi.currentWorld); + public void serverSaveEvent() + { + if (ENABLE_EVENT_LOGGING) + { + LOGGER.info("Server world {} saving", SharedApi.currentWorld); + } + if (SharedApi.currentWorld instanceof IDhServerWorld) { SharedApi.currentWorld.saveAndFlush(); @@ -128,18 +156,21 @@ public class ServerApi } } - public void serverChunkLoadEvent(IChunkWrapper chunk, ILevelWrapper level) { + public void serverChunkLoadEvent(IChunkWrapper chunk, ILevelWrapper level) + { IDhLevel dhLevel = SharedApi.currentWorld.getLevel(level); if (dhLevel != null) { dhLevel.updateChunk(chunk); } } - public void serverChunkSaveEvent(IChunkWrapper chunk, ILevelWrapper level) { + public void serverChunkSaveEvent(IChunkWrapper chunk, ILevelWrapper level) + { IDhLevel dhLevel = SharedApi.currentWorld.getLevel(level); if (dhLevel != null) { dhLevel.updateChunk(chunk); } } + } diff --git a/core/src/main/java/com/seibel/lod/core/api/internal/SharedApi.java b/core/src/main/java/com/seibel/lod/core/api/internal/SharedApi.java index daaf53a5c..9f00707f2 100644 --- a/core/src/main/java/com/seibel/lod/core/api/internal/SharedApi.java +++ b/core/src/main/java/com/seibel/lod/core/api/internal/SharedApi.java @@ -9,8 +9,13 @@ public class SharedApi { public static IMinecraftSharedWrapper MC; public static AbstractDhWorld currentWorld; - public static EWorldEnvironment getEnvironment() { return currentWorld==null ? null : currentWorld.environment; } - + + + public static void init() { Initializer.init(); } + + + public static EWorldEnvironment getEnvironment() { return (currentWorld == null) ? null : currentWorld.environment; } + }