diff --git a/src/main/java/dev/zprestige/prestige/client/Prestige.java b/src/main/java/dev/zprestige/prestige/client/Prestige.java index b90d100..9408198 100644 --- a/src/main/java/dev/zprestige/prestige/client/Prestige.java +++ b/src/main/java/dev/zprestige/prestige/client/Prestige.java @@ -34,11 +34,10 @@ import dev.zprestige.prestige.util.SimulatedClickManager; import dev.zprestige.prestige.util.FrameDeltaTimer; import dev.zprestige.prestige.util.NotificationManager; import java.util.concurrent.atomic.AtomicBoolean; -import net.fabricmc.api.ModInitializer; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ChatScreen; -public class Prestige implements ModInitializer { +public class Prestige { private static final AtomicBoolean initialized = new AtomicBoolean(false); private static final java.util.concurrent.atomic.AtomicInteger renderErrorCount = new java.util.concurrent.atomic.AtomicInteger(); public static EventBus eventBus; @@ -160,8 +159,4 @@ public class Prestige implements ModInitializer { } } - @Override - public void onInitialize() { - this.init(); - } } diff --git a/src/main/java/dev/zprestige/prestige/fabric/FabricEntrypoints.java b/src/main/java/dev/zprestige/prestige/fabric/FabricEntrypoints.java new file mode 100644 index 0000000..ca9c8e1 --- /dev/null +++ b/src/main/java/dev/zprestige/prestige/fabric/FabricEntrypoints.java @@ -0,0 +1,21 @@ +package dev.zprestige.prestige.fabric; + +import dev.zprestige.prestige.client.Prestige; +import dev.zprestige.prestige.ui.mc.Entry; +import net.fabricmc.api.ClientModInitializer; +import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; + +public final class FabricEntrypoints implements ModInitializer, ClientModInitializer { + @Override + public void onInitialize() { + new Prestige().init(); + } + + @Override + public void onInitializeClient() { + Entry entry = new Entry(); + entry.initialize(); + ClientTickEvents.END_CLIENT_TICK.register(entry::tick); + } +} diff --git a/src/main/java/dev/zprestige/prestige/inject/Bootstrap.java b/src/main/java/dev/zprestige/prestige/inject/Bootstrap.java index b542e0f..cb8a031 100644 --- a/src/main/java/dev/zprestige/prestige/inject/Bootstrap.java +++ b/src/main/java/dev/zprestige/prestige/inject/Bootstrap.java @@ -1,10 +1,9 @@ package dev.zprestige.prestige.inject; -import dev.zprestige.prestige.client.Prestige; import dev.zprestige.prestige.engine.EnginePlugin; import dev.zprestige.prestige.engine.EngineState; +import dev.zprestige.prestige.fabric.FabricEntrypoints; import dev.zprestige.prestige.hooks.Definer; -import dev.zprestige.prestige.ui.mc.Entry; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashSet; @@ -297,8 +296,9 @@ public final class Bootstrap { private static void initClient() { try { - new Prestige().onInitialize(); - new Entry().onInitializeClient(); + FabricEntrypoints entrypoints = new FabricEntrypoints(); + entrypoints.onInitialize(); + entrypoints.onInitializeClient(); log("client initialised"); } catch (Throwable t) { log("client init failed: " + t); diff --git a/src/main/java/dev/zprestige/prestige/render/RenderCore.java b/src/main/java/dev/zprestige/prestige/render/RenderCore.java index fe95dc4..836a220 100644 --- a/src/main/java/dev/zprestige/prestige/render/RenderCore.java +++ b/src/main/java/dev/zprestige/prestige/render/RenderCore.java @@ -89,7 +89,7 @@ public class RenderCore { Render2D.currentBuffers = BUFFER_SOURCE; worldContext = context; try { - ((RenderCallback)RenderEvents.WORLD_RENDER.invoker()).onRender(BUFFER_SOURCE, context); + RenderEvents.WORLD_RENDER.invoker().onRender(BUFFER_SOURCE, context); BUFFER_SOURCE.flush(context); } catch (Throwable throwable) { LOGGER.error("World render failed", throwable); @@ -102,9 +102,9 @@ public class RenderCore { Render2D.currentContext = context; Render2D.currentBuffers = BUFFER_SOURCE; try { - ((RenderCallback)RenderEvents.HUD_RENDER.invoker()).onRender(BUFFER_SOURCE, context); + RenderEvents.HUD_RENDER.invoker().onRender(BUFFER_SOURCE, context); BUFFER_SOURCE.flush(context); - ((RenderCallback)RenderEvents.AFTER_HUD_RENDER.invoker()).onRender(BUFFER_SOURCE, context); + RenderEvents.AFTER_HUD_RENDER.invoker().onRender(BUFFER_SOURCE, context); BUFFER_SOURCE.flush(context); } catch (Throwable throwable) { LOGGER.error("HUD render failed", throwable); diff --git a/src/main/java/dev/zprestige/prestige/render/RenderEvents.java b/src/main/java/dev/zprestige/prestige/render/RenderEvents.java index d7efcf3..6117e35 100644 --- a/src/main/java/dev/zprestige/prestige/render/RenderEvents.java +++ b/src/main/java/dev/zprestige/prestige/render/RenderEvents.java @@ -1,27 +1,34 @@ package dev.zprestige.prestige.render; -import net.fabricmc.fabric.api.event.Event; -import net.fabricmc.fabric.api.event.EventFactory; -import org.jetbrains.annotations.NotNull; +import java.util.Objects; +import java.util.concurrent.CopyOnWriteArrayList; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public interface RenderEvents { Logger LOGGER = LoggerFactory.getLogger(RenderEvents.class); - Event HUD_RENDER = createEvent(); - Event WORLD_RENDER = createEvent(); - Event AFTER_HUD_RENDER = createEvent(); + RenderEvent HUD_RENDER = new RenderEvent(); + RenderEvent WORLD_RENDER = new RenderEvent(); + RenderEvent AFTER_HUD_RENDER = new RenderEvent(); - @NotNull - private static Event createEvent() { - return EventFactory.createArrayBacked(RenderCallback.class, listeners -> (buffers, context) -> { - for (RenderCallback listener : (listeners)) { + final class RenderEvent { + private final CopyOnWriteArrayList listeners = new CopyOnWriteArrayList<>(); + private final RenderCallback invoker = (buffers, context) -> { + for (RenderCallback listener : listeners) { try { listener.onRender(buffers, context); } catch (Throwable throwable) { LOGGER.error("Render listener failed", throwable); } } - }); + }; + + public void register(RenderCallback listener) { + listeners.add(Objects.requireNonNull(listener)); + } + + public RenderCallback invoker() { + return invoker; + } } } diff --git a/src/main/java/dev/zprestige/prestige/ui/mc/Entry.java b/src/main/java/dev/zprestige/prestige/ui/mc/Entry.java index f8cf15a..9b5007d 100644 --- a/src/main/java/dev/zprestige/prestige/ui/mc/Entry.java +++ b/src/main/java/dev/zprestige/prestige/ui/mc/Entry.java @@ -1,19 +1,16 @@ package dev.zprestige.prestige.ui.mc; import dev.zprestige.prestige.ui.Input; -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.minecraft.client.MinecraftClient; import org.lwjgl.glfw.GLFW; /** Opens the ported ClickGUI with the configured menu key (Input.menuKey, default RIGHT SHIFT); closing is handled by Input via the key mixin. */ -public final class Entry implements ClientModInitializer { +public final class Entry { static boolean prev; private static int cachedVk = -1, cachedGlfw; - @Override public void onInitializeClient() { + public void initialize() { try { Skid.run(); } catch (Throwable t) { System.out.println("[prestige-ui] splash " + t); } - ClientTickEvents.END_CLIENT_TICK.register(this::tick); System.out.println("[prestige-ui] loaded (menu key opens the menu)"); } @@ -30,7 +27,7 @@ public final class Entry implements ClientModInitializer { static boolean bridgeTried; - void tick(MinecraftClient mc) { + public void tick(MinecraftClient mc) { if (dev.zprestige.prestige.client.Prestige.selfDestructed) return; if (!bridgeTried) { bridgeTried = true; dev.zprestige.prestige.ui.bridge.Bridge.bind(); } try { diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index afe03d4..4b54701 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -6,8 +6,8 @@ "description": "Prestige client with the imgui-java ClickGUI.", "environment": "client", "entrypoints": { - "main": ["dev.zprestige.prestige.client.Prestige"], - "client": ["dev.zprestige.prestige.ui.mc.Entry", "dev.zprestige.prestige.engine.EngineDev"] + "main": ["dev.zprestige.prestige.fabric.FabricEntrypoints"], + "client": ["dev.zprestige.prestige.fabric.FabricEntrypoints", "dev.zprestige.prestige.engine.EngineDev"] }, "mixins": ["prestige-engine.mixins.json", "prestige.mixins.json"], "accessWidener": "prestige-client.accesswidener",