diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/DependencySetup.java b/common/src/main/java/com/seibel/lod/common/wrappers/DependencySetup.java index a6bdb9809..251873a36 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/DependencySetup.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/DependencySetup.java @@ -57,12 +57,12 @@ public class DependencySetup { DependencySetupDoneCheck.isDone = true; } - @Environment(EnvType.SERVER) + //@Environment(EnvType.SERVER) public static void createServerBindings() { SingletonInjector.INSTANCE.bind(IMinecraftSharedWrapper.class, MinecraftDedicatedServerWrapper.INSTANCE); } - @Environment(EnvType.CLIENT) + //@Environment(EnvType.CLIENT) public static void createClientBindings() { SingletonInjector.INSTANCE.bind(IMinecraftClientWrapper.class, MinecraftClientWrapper.INSTANCE); SingletonInjector.INSTANCE.bind(IMinecraftSharedWrapper.class, MinecraftClientWrapper.INSTANCE); diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftClientWrapper.java b/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftClientWrapper.java index 9443c3058..bbad24be1 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftClientWrapper.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftClientWrapper.java @@ -72,7 +72,7 @@ import org.jetbrains.annotations.Nullable; * @author James Seibel * @version 3-5-2022 */ -@Environment(EnvType.CLIENT) +//@Environment(EnvType.CLIENT) public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecraftSharedWrapper { private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName()); diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftDedicatedServerWrapper.java b/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftDedicatedServerWrapper.java index d19efbd7c..9fe5372cf 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftDedicatedServerWrapper.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftDedicatedServerWrapper.java @@ -8,7 +8,7 @@ import net.minecraft.server.dedicated.DedicatedServer; import java.io.File; -@Environment(EnvType.SERVER) +//@Environment(EnvType.SERVER) public class MinecraftDedicatedServerWrapper implements IMinecraftSharedWrapper { public static final MinecraftDedicatedServerWrapper INSTANCE = new MinecraftDedicatedServerWrapper(); private MinecraftDedicatedServerWrapper() {} diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftRenderWrapper.java b/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftRenderWrapper.java index 79b3bbc47..f9fa54076 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftRenderWrapper.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/minecraft/MinecraftRenderWrapper.java @@ -76,7 +76,7 @@ import org.apache.logging.log4j.Logger; * @author James Seibel * @version 12-12-2021 */ -@Environment(EnvType.CLIENT) +//@Environment(EnvType.CLIENT) public class MinecraftRenderWrapper implements IMinecraftRenderWrapper { public static final MinecraftRenderWrapper INSTANCE = new MinecraftRenderWrapper(); diff --git a/common/src/main/java/com/seibel/lod/common/wrappers/world/LevelWrapper.java b/common/src/main/java/com/seibel/lod/common/wrappers/world/LevelWrapper.java index fdb7784e3..27821ad6d 100644 --- a/common/src/main/java/com/seibel/lod/common/wrappers/world/LevelWrapper.java +++ b/common/src/main/java/com/seibel/lod/common/wrappers/world/LevelWrapper.java @@ -73,7 +73,7 @@ public class LevelWrapper implements ILevelWrapper levelType = ELevelType.UNKNOWN; } - @Environment(EnvType.CLIENT) + //@Environment(EnvType.CLIENT) private static LevelAccessor getSinglePlayerServerLevel() { MinecraftClientWrapper client = MinecraftClientWrapper.INSTANCE; return client.mc.getSingleplayerServer().getPlayerList() diff --git a/core b/core index 973be4032..ff2763df9 160000 --- a/core +++ b/core @@ -1 +1 @@ -Subproject commit 973be40324bdc6699ecada4fb3451eee93007b10 +Subproject commit ff2763df9ea3ae99272f53480caef5d5f7909c23 diff --git a/fabric/src/main/java/com/seibel/lod/fabric/FabricServerProxy.java b/fabric/src/main/java/com/seibel/lod/fabric/FabricServerProxy.java index 28f625d9c..339ff8cbb 100644 --- a/fabric/src/main/java/com/seibel/lod/fabric/FabricServerProxy.java +++ b/fabric/src/main/java/com/seibel/lod/fabric/FabricServerProxy.java @@ -5,7 +5,6 @@ import com.seibel.lod.common.wrappers.chunk.ChunkWrapper; import com.seibel.lod.common.wrappers.world.LevelWrapper; import com.seibel.lod.common.wrappers.worldGeneration.BatchGenerationEnvironment; import com.seibel.lod.core.api.internal.a7.ServerApi; -import com.seibel.lod.core.api.internal.a7.SharedApi; import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerChunkEvents; @@ -27,6 +26,7 @@ import java.util.function.Supplier; * and is the starting point for most of the mod. * * @author Ran + * @author Tomlee * @version 5-11-2022 */ diff --git a/fabric/src/main/java/com/seibel/lod/fabric/mixins/client/MixinGameRenderer.java b/fabric/src/main/java/com/seibel/lod/fabric/mixins/client/MixinGameRenderer.java index 186c251e9..e1c8f9659 100644 --- a/fabric/src/main/java/com/seibel/lod/fabric/mixins/client/MixinGameRenderer.java +++ b/fabric/src/main/java/com/seibel/lod/fabric/mixins/client/MixinGameRenderer.java @@ -17,7 +17,7 @@ public class MixinGameRenderer { ClientApi.INSTANCE.rendererShutdownEvent(); } - //FIXME: This I think will dup multiple renderStartupEvent calls... + // FIXME: This I think will dup multiple renderStartupEvent calls... @Inject(method = {"reloadShaders", "preloadUiShader", "preloadShader"}, at = @At("TAIL")) public void onStartupShaders(CallbackInfo ci) { SharedApi.LOGGER.info("Starting up renderer"); @@ -32,7 +32,7 @@ public class MixinGameRenderer { ClientApi.INSTANCE.rendererShutdownEvent(); } - //FIXME: This I think will dup multiple renderStartupEvent calls... + // FIXME: This I think will dup multiple renderStartupEvent calls... @Inject(method = {"reloadShaders", "preloadUiShader", "preloadShader"}, at = @At("TAIL")) public void onStartupShaders(CallbackInfo ci) { SharedApi.LOGGER.info("Starting up renderer"); diff --git a/fabric/src/main/java/com/seibel/lod/fabric/mixins/client/MixinLevelRenderer.java b/fabric/src/main/java/com/seibel/lod/fabric/mixins/client/MixinLevelRenderer.java new file mode 100644 index 000000000..eae3c5fd0 --- /dev/null +++ b/fabric/src/main/java/com/seibel/lod/fabric/mixins/client/MixinLevelRenderer.java @@ -0,0 +1,120 @@ +/* + * This file is part of the Distant Horizons mod (formerly the LOD Mod), + * licensed under the GNU GPL v3 License. + * + * Copyright (C) 2020-2022 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package com.seibel.lod.fabric.mixins.client; + +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.math.Matrix4f; +import com.seibel.lod.common.wrappers.world.LevelWrapper; +import com.seibel.lod.core.config.Config; +import com.seibel.lod.common.wrappers.McObjectConverter; +import com.seibel.lod.core.api.internal.a7.ClientApi; +import com.seibel.lod.core.objects.math.Mat4f; +import net.minecraft.client.Camera; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.client.renderer.LevelRenderer; +import net.minecraft.client.renderer.RenderType; +import org.lwjgl.opengl.GL15; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +/** + * This class is used to mix in my rendering code + * before Minecraft starts rendering blocks. + * If this wasn't done, and we used Forge's + * render last event, the LODs would render on top + * of the normal terrain. + * + * This is also the mixin for rendering the clouds + * + * @author coolGi + * @author James Seibel + * @version 12-31-2021 + */ +@Mixin(LevelRenderer.class) +public class MixinLevelRenderer +{ + @Shadow + private ClientLevel level; + @Unique + private static float previousPartialTicks = 0; + + // Inject rendering at first call to renderChunkLayer + // HEAD or RETURN + #if PRE_MC_1_17_1 + @Inject(at = @At("RETURN"), method = "renderSky(Lcom/mojang/blaze3d/vertex/PoseStack;F)V") + private void renderSky(PoseStack matrixStackIn, float partialTicks, CallbackInfo callback) + { + // get the partial ticks since renderBlockLayer doesn't + // have access to them + previousPartialTicks = partialTicks; + } + + @Inject(at = @At("HEAD"), + method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDD)V", + cancellable = true) + private void renderChunkLayer(RenderType renderType, PoseStack matrixStackIn, double xIn, double yIn, double zIn, CallbackInfo callback) + { + // only render before solid blocks + if (renderType.equals(RenderType.solid())) + { + // get MC's current projection matrix + float[] mcProjMatrixRaw = new float[16]; + GL15.glGetFloatv(GL15.GL_PROJECTION_MATRIX, mcProjMatrixRaw); + Mat4f mcProjectionMatrix = new Mat4f(mcProjMatrixRaw); + mcProjectionMatrix.transpose(); + Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose()); + + ClientApi.INSTANCE.renderLods(LevelWrapper.getWorldWrapper(level), mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks); + } + if (Config.Client.Advanced.lodOnlyMode.get()) { + callback.cancel(); + } + } + #else + @Inject(method = "renderClouds", at = @At("HEAD"), cancellable = true) + public void renderClouds(PoseStack poseStack, Matrix4f projectionMatrix, float tickDelta, double cameraX, double cameraY, double cameraZ, CallbackInfo ci) { + // get the partial ticks since renderChunkLayer doesn't + // have access to them + previousPartialTicks = tickDelta; + } + + @Inject(at = @At("HEAD"), + method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLcom/mojang/math/Matrix4f;)V", + cancellable = true) + private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback) + { + // only render before solid blocks + if (renderType.equals(RenderType.solid())) + { + Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); + Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); + + ClientApi.INSTANCE.renderLods(LevelWrapper.getWorldWrapper(level), mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks); + } + if (Config.Client.Advanced.lodOnlyMode.get()) { + callback.cancel(); + } + } + #endif +} diff --git a/fabric/src/main/java/com/seibel/lod/fabric/mixins/server/MixinUtilBackgroudThread.java b/fabric/src/main/java/com/seibel/lod/fabric/mixins/server/MixinUtilBackgroundThread.java similarity index 95% rename from fabric/src/main/java/com/seibel/lod/fabric/mixins/server/MixinUtilBackgroudThread.java rename to fabric/src/main/java/com/seibel/lod/fabric/mixins/server/MixinUtilBackgroundThread.java index a4ae2a0d7..4acf22284 100644 --- a/fabric/src/main/java/com/seibel/lod/fabric/mixins/server/MixinUtilBackgroudThread.java +++ b/fabric/src/main/java/com/seibel/lod/fabric/mixins/server/MixinUtilBackgroundThread.java @@ -22,8 +22,6 @@ package com.seibel.lod.fabric.mixins.server; import java.util.concurrent.ExecutorService; import java.util.function.Supplier; -import com.seibel.lod.fabric.FabricClientProxy; -import com.seibel.lod.fabric.FabricDedicatedServerMain; import com.seibel.lod.fabric.FabricServerProxy; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -35,7 +33,7 @@ import com.seibel.lod.core.util.DummyRunExecutorService; import net.minecraft.Util; @Mixin(Util.class) -public class MixinUtilBackgroudThread +public class MixinUtilBackgroundThread { @Inject(method = "backgroundExecutor", at = @At("HEAD"), cancellable = true) private static void overrideUtil$backgroundExecutor(CallbackInfoReturnable ci) diff --git a/fabric/src/main/java/com/seibel/lod/fabric/mixins/server/unsafe/MixinThreadingDectector.java b/fabric/src/main/java/com/seibel/lod/fabric/mixins/server/unsafe/MixinThreadingDetector.java similarity index 95% rename from fabric/src/main/java/com/seibel/lod/fabric/mixins/server/unsafe/MixinThreadingDectector.java rename to fabric/src/main/java/com/seibel/lod/fabric/mixins/server/unsafe/MixinThreadingDetector.java index 899e1a0bf..8496c6b50 100644 --- a/fabric/src/main/java/com/seibel/lod/fabric/mixins/server/unsafe/MixinThreadingDectector.java +++ b/fabric/src/main/java/com/seibel/lod/fabric/mixins/server/unsafe/MixinThreadingDetector.java @@ -19,7 +19,6 @@ package com.seibel.lod.fabric.mixins.server.unsafe; -import net.minecraft.server.level.ServerLevel; import org.spongepowered.asm.mixin.Mixin; //FIXME: Is this still needed? @@ -38,7 +37,7 @@ import java.util.concurrent.Semaphore; * Why does this exist? But okay! (Will be probably removed when the experimental generator is done) */ @Mixin(ThreadingDetector.class) -public class MixinThreadingDectector { +public class MixinThreadingDetector { @Mutable @Shadow private Semaphore lock; diff --git a/fabric/src/main/resources/fabric.lod.mixins.json b/fabric/src/main/resources/fabric.lod.mixins.json index c323c1025..7e31e1218 100644 --- a/fabric/src/main/resources/fabric.lod.mixins.json +++ b/fabric/src/main/resources/fabric.lod.mixins.json @@ -3,10 +3,10 @@ "minVersion": "0.8", "package": "com.seibel.lod.fabric.mixins", "mixins": [ - "server.unsafe.MixinThreadingDectector", + "server.unsafe.MixinThreadingDetector", "server.MixinChunkGenerator", "server.MixinChunkMap", - "server.MixinUtilBackgroudThread" + "server.MixinUtilBackgroundThread" ], "client": [ "client.MixinClientLevel", @@ -14,6 +14,7 @@ "client.MixinDebugScreenOverlay", "client.MixinFogRenderer", "client.MixinGameRenderer", + "client.MixinLevelRenderer", "client.MixinLightmap", "client.MixinOptionsScreen" ], diff --git a/forge/src/main/java/com/seibel/lod/forge/ForgeClientProxy.java b/forge/src/main/java/com/seibel/lod/forge/ForgeClientProxy.java index bc766a094..2d9bb3b9f 100644 --- a/forge/src/main/java/com/seibel/lod/forge/ForgeClientProxy.java +++ b/forge/src/main/java/com/seibel/lod/forge/ForgeClientProxy.java @@ -20,21 +20,20 @@ package com.seibel.lod.forge; import com.seibel.lod.common.wrappers.world.LevelWrapper; -import com.seibel.lod.core.api.internal.ClientApi; -import com.seibel.lod.core.api.internal.EventApi; +import com.seibel.lod.core.api.internal.a7.ClientApi; +import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; -import net.minecraft.client.gui.screens.TitleScreen; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraftforge.event.world.ChunkDataEvent; +import org.apache.logging.log4j.Logger; import org.lwjgl.glfw.GLFW; import com.seibel.lod.common.wrappers.chunk.ChunkWrapper; -import com.seibel.lod.common.wrappers.world.DimensionTypeWrapper; import net.minecraft.client.Minecraft; import net.minecraftforge.client.event.InputEvent; import net.minecraftforge.event.TickEvent; -import net.minecraftforge.event.world.BlockEvent; -import net.minecraftforge.event.world.ChunkEvent; import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; @@ -47,72 +46,132 @@ import net.minecraftforge.eventbus.api.SubscribeEvent; */ public class ForgeClientProxy { - private final EventApi eventApi = EventApi.INSTANCE; - private final ClientApi clientApi = ClientApi.INSTANCE; - - - + private static final Logger LOGGER = DhLoggerBuilder.getLogger(); + @SubscribeEvent - public void serverTickEvent(TickEvent.ServerTickEvent event) + public void clientTickEvent(TickEvent.ClientTickEvent event) { - if (event.phase != TickEvent.Phase.START) return; - eventApi.serverTickEvent(); - } - - @SubscribeEvent - public void chunkLoadEvent(ChunkEvent.Load event) - { - clientApi.clientChunkLoadEvent(new ChunkWrapper(event.getChunk(), event.getWorld()), LevelWrapper.getWorldWrapper(event.getWorld())); - } - - @SubscribeEvent - public void worldSaveEvent(WorldEvent.Save event) - { - eventApi.worldSaveEvent(); - } - - /** This is also called when a new dimension loads */ - @SubscribeEvent - public void worldLoadEvent(WorldEvent.Load event) - { - if (Minecraft.getInstance().screen instanceof TitleScreen) return; - if (event.getWorld() != null) { - eventApi.worldLoadEvent(LevelWrapper.getWorldWrapper(event.getWorld())); - } - } - - @SubscribeEvent - public void worldUnloadEvent(WorldEvent.Unload event) - { - eventApi.worldUnloadEvent(LevelWrapper.getWorldWrapper(event.getWorld())); - } - - @SubscribeEvent - public void blockChangeEvent(BlockEvent event) - { - // we only care about certain block events - if (event.getClass() == BlockEvent.BreakEvent.class || - event.getClass() == BlockEvent.EntityPlaceEvent.class || - event.getClass() == BlockEvent.EntityMultiPlaceEvent.class || - event.getClass() == BlockEvent.FluidPlaceBlockEvent.class || - event.getClass() == BlockEvent.PortalSpawnEvent.class) + if (event.phase == TickEvent.Phase.START) { - IChunkWrapper chunk = new ChunkWrapper(event.getWorld().getChunk(event.getPos()), event.getWorld()); - DimensionTypeWrapper dimType = DimensionTypeWrapper.getDimensionTypeWrapper(event.getWorld().dimensionType()); - - // recreate the LOD where the blocks were changed - eventApi.blockChangeEvent(chunk, dimType); + ClientApi.INSTANCE.clientTickEvent(); } } - + @SubscribeEvent - public void onKeyInput(InputEvent.KeyInputEvent event) + public void clientLevelLoadEvent(WorldEvent.Load event) + { + if (event.getWorld() instanceof ClientLevel) + { + LevelWrapper level = new LevelWrapper(event.getWorld()); + ClientApi.INSTANCE.clientLevelLoadEvent(level); + } + } + @SubscribeEvent + public void clientLevelUnloadEvent(WorldEvent.Unload event) + { + if (event.getWorld() instanceof ClientLevel) + { + LevelWrapper level = new LevelWrapper(event.getWorld()); + ClientApi.INSTANCE.clientLevelUnloadEvent(level); + } + } + + @SubscribeEvent + public void clientChunkLoadEvent(ChunkDataEvent.Load event) + { + if (event.getWorld() instanceof ClientLevel) + { + IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), event.getWorld()); + LevelWrapper level = new LevelWrapper(event.getWorld()); + ClientApi.INSTANCE.clientChunkLoadEvent(chunk, level); + } + } + @SubscribeEvent + public void clientChunkSaveEvent(ChunkDataEvent.Save event) + { + if (event.getWorld() instanceof ClientLevel) + { + IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), event.getWorld()); + LevelWrapper level = new LevelWrapper(event.getWorld()); + ClientApi.INSTANCE.clientChunkSaveEvent(chunk, level); + } + } + + // RendererStartupEvent - Done in MixinGameRenderer + // RendererShutdownEvent - Done in MixinGameRenderer + // ClientRenderLevelTerrainEvent - Done in MixinGameRenderer + + // Register KeyBindings + @SubscribeEvent + public void registerKeyBindings(InputEvent.KeyInputEvent event) { if (Minecraft.getInstance().player == null) return; if (event.getAction() != GLFW.GLFW_PRESS) return; - clientApi.keyPressedEvent(event.getKey()); + ClientApi.INSTANCE.keyPressedEvent(event.getKey()); } - + +// @SubscribeEvent +// public void serverTickEvent(TickEvent.ServerTickEvent event) +// { +// if (event.phase != TickEvent.Phase.START) return; +// eventApi.serverTickEvent(); +// } +//// +// +// @SubscribeEvent +// public void chunkLoadEvent(ChunkEvent.Load event) +// { +// clientApi.clientChunkLoadEvent(new ChunkWrapper(event.getChunk(), event.getWorld()), LevelWrapper.getWorldWrapper(event.getWorld())); +// } +// +// @SubscribeEvent +// public void worldSaveEvent(WorldEvent.Save event) +// { +// eventApi.worldSaveEvent(); +// } +// +// /** This is also called when a new dimension loads */ +// @SubscribeEvent +// public void worldLoadEvent(WorldEvent.Load event) +// { +// if (Minecraft.getInstance().screen instanceof TitleScreen) return; +// if (event.getWorld() != null) { +// eventApi.worldLoadEvent(LevelWrapper.getWorldWrapper(event.getWorld())); +// } +// } +// +// @SubscribeEvent +// public void worldUnloadEvent(WorldEvent.Unload event) +// { +// eventApi.worldUnloadEvent(LevelWrapper.getWorldWrapper(event.getWorld())); +// } +// +// @SubscribeEvent +// public void blockChangeEvent(BlockEvent event) +// { +// // we only care about certain block events +// if (event.getClass() == BlockEvent.BreakEvent.class || +// event.getClass() == BlockEvent.EntityPlaceEvent.class || +// event.getClass() == BlockEvent.EntityMultiPlaceEvent.class || +// event.getClass() == BlockEvent.FluidPlaceBlockEvent.class || +// event.getClass() == BlockEvent.PortalSpawnEvent.class) +// { +// IChunkWrapper chunk = new ChunkWrapper(event.getWorld().getChunk(event.getPos()), event.getWorld()); +// DimensionTypeWrapper dimType = DimensionTypeWrapper.getDimensionTypeWrapper(event.getWorld().dimensionType()); +// +// // recreate the LOD where the blocks were changed +// eventApi.blockChangeEvent(chunk, dimType); +// } +// } +// +// @SubscribeEvent +// public void onKeyInput(InputEvent.KeyInputEvent event) +// { +// if (Minecraft.getInstance().player == null) return; +// if (event.getAction() != GLFW.GLFW_PRESS) return; +// clientApi.keyPressedEvent(event.getKey()); +// } +// } diff --git a/forge/src/main/java/com/seibel/lod/forge/ForgeMain.java b/forge/src/main/java/com/seibel/lod/forge/ForgeMain.java index 75c45dd6f..e3531c12f 100644 --- a/forge/src/main/java/com/seibel/lod/forge/ForgeMain.java +++ b/forge/src/main/java/com/seibel/lod/forge/ForgeMain.java @@ -21,12 +21,13 @@ package com.seibel.lod.forge; import com.seibel.lod.common.LodCommonMain; import com.seibel.lod.common.forge.LodForgeMethodCaller; +import com.seibel.lod.common.wrappers.DependencySetup; import com.seibel.lod.common.wrappers.config.GetConfigScreen; import com.seibel.lod.common.wrappers.minecraft.MinecraftClientWrapper; import com.seibel.lod.core.ModInfo; -import com.seibel.lod.core.api.internal.InternalApiShared; import com.seibel.lod.core.handlers.ReflectionHandler; import com.seibel.lod.core.handlers.dependencyInjection.ModAccessorInjector; +import com.seibel.lod.core.handlers.dependencyInjection.SingletonInjector; import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.wrapperInterfaces.modAccessor.IOptifineAccessor; import com.seibel.lod.forge.wrappers.ForgeDependencySetup; @@ -46,8 +47,7 @@ import net.minecraftforge.client.model.data.ModelDataMap; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.event.lifecycle.*; import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; #if PRE_MC_1_17_1 import net.minecraftforge.fml.ExtensionPoint; @@ -74,33 +74,48 @@ import java.util.Random; public class ForgeMain implements LodForgeMethodCaller { private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName()); - - public static ForgeClientProxy forgeClientProxy; - - - private void init(final FMLCommonSetupEvent event) - { - // make sure the dependencies are set up before the mod needs them -// LodCommonMain.startup(this, !FMLLoader.getDist().isClient()); - LodCommonMain.startup(this); - ForgeDependencySetup.createInitialBindings(); - LodCommonMain.initConfig(); - LOGGER.info(ModInfo.READABLE_NAME + " initializing..."); - } - + public static ForgeClientProxy client_proxy = null; + public static ForgeServerProxy server_proxy = null; + public ForgeMain() { - // Register the methods for server and other game events we are interested in - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::init); - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::onClientStart); + // Register the mod initializer (Actual event registration is done in the different proxies) + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::initClient); + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::initDedicated); } - private void onClientStart(final FMLClientSetupEvent event) + private void initClient(final FMLClientSetupEvent event) { + DependencySetup.createClientBindings(); + initCommon(); + + client_proxy = new ForgeClientProxy(); + MinecraftForge.EVENT_BUS.register(client_proxy); + server_proxy = new ForgeServerProxy(false); + MinecraftForge.EVENT_BUS.register(server_proxy); + + postInitCommon(); + } + + private void initDedicated(final FMLDedicatedServerSetupEvent event) + { + DependencySetup.createServerBindings(); + initCommon(); + + server_proxy = new ForgeServerProxy(true); + MinecraftForge.EVENT_BUS.register(server_proxy); + + postInitCommon(); + } + + private void initCommon() { + LodCommonMain.startup(this); + ForgeDependencySetup.createInitialBindings(); + LOGGER.info(ModInfo.READABLE_NAME + ", Version: " + ModInfo.VERSION); + if (ReflectionHandler.instance.optifinePresent()) { - ModAccessorInjector.bind(IOptifineAccessor.class, new OptifineAccessor()); + ModAccessorInjector.INSTANCE.bind(IOptifineAccessor.class, new OptifineAccessor()); } - #if PRE_MC_1_17_1 ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY, () -> (client, parent) -> GetConfigScreen.getScreen(parent)); @@ -108,8 +123,13 @@ public class ForgeMain implements LodForgeMethodCaller ModLoadingContext.get().registerExtensionPoint(ConfigGuiHandler.ConfigGuiFactory.class, () -> new ConfigGuiHandler.ConfigGuiFactory((client, parent) -> GetConfigScreen.getScreen(parent))); #endif - forgeClientProxy = new ForgeClientProxy(); - MinecraftForge.EVENT_BUS.register(forgeClientProxy); + } + + private void postInitCommon() { + LOGGER.info("Post-Initializing Mod"); + SingletonInjector.INSTANCE.runDelayedSetup(); + LodCommonMain.initConfig(); + LOGGER.info("Mod Post-Initialized"); } private final ModelDataMap dataMap = new ModelDataMap.Builder().build(); @@ -124,7 +144,7 @@ public class ForgeMain implements LodForgeMethodCaller } #endif - @Override + @Override //TODO: Check this if its still needed public int colorResolverGetColor(ColorResolver resolver, Biome biome, double x, double z) { #if MC_1_17_1______Still_needed return resolver.m_130045_(biome, x, z); diff --git a/forge/src/main/java/com/seibel/lod/forge/ForgeServerProxy.java b/forge/src/main/java/com/seibel/lod/forge/ForgeServerProxy.java new file mode 100644 index 000000000..cc43dee6a --- /dev/null +++ b/forge/src/main/java/com/seibel/lod/forge/ForgeServerProxy.java @@ -0,0 +1,121 @@ +package com.seibel.lod.forge; + +import com.seibel.lod.common.networking.Networking; +import com.seibel.lod.common.wrappers.chunk.ChunkWrapper; +import com.seibel.lod.common.wrappers.world.LevelWrapper; +import com.seibel.lod.common.wrappers.worldGeneration.BatchGenerationEnvironment; +import com.seibel.lod.core.api.internal.a7.ClientApi; +import com.seibel.lod.core.api.internal.a7.ServerApi; +import com.seibel.lod.core.logging.DhLoggerBuilder; +import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.TitleScreen; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.server.level.ServerPlayer; +import net.minecraft.world.level.Level; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.server.ServerStartedEvent; +import net.minecraftforge.event.server.ServerStoppingEvent; +import net.minecraftforge.event.world.ChunkDataEvent; +import net.minecraftforge.event.world.WorldEvent; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import org.apache.logging.log4j.Logger; + +import java.util.function.Supplier; + +public class ForgeServerProxy { + private final ServerApi serverApi = ServerApi.INSTANCE; + private static final Logger LOGGER = DhLoggerBuilder.getLogger(); + private final boolean isDedicated; + public static Supplier isGenerationThreadChecker = null; + + public ForgeServerProxy(boolean isDedicated) { + this.isDedicated = isDedicated; + isGenerationThreadChecker = BatchGenerationEnvironment::isCurrentThreadDistantGeneratorThread; + } + private boolean isValidTime() { + if (isDedicated) return true; + + //FIXME: This may cause init issue... + return !(Minecraft.getInstance().screen instanceof TitleScreen); + } + private LevelWrapper getLevelWrapper(Level level) { + return LevelWrapper.getWorldWrapper(level); + } + + + // ServerTickEvent (at end) + @SubscribeEvent + private void serverTickEvent(TickEvent.ServerTickEvent event) { + if (event.phase == TickEvent.Phase.END) { + if (isValidTime()) serverApi.serverTickEvent(); + } + } + + // ServerWorldLoadEvent + @SubscribeEvent + private void dedicatedWorldLoadEvent(ServerStartedEvent event) { + if (isValidTime()) serverApi.serverWorldLoadEvent(isDedicated); + } + + // ServerWorldUnloadEvent + @SubscribeEvent + private void serverWorldUnloadEvent(ServerStoppingEvent event) { + if (isValidTime()) serverApi.serverWorldUnloadEvent(); + } + + // ServerLevelLoadEvent + @SubscribeEvent + private void serverLevelLoadEvent(WorldEvent.Load event) { + if (isValidTime()) { + if (event.getWorld() instanceof ServerLevel) { + serverApi.serverLevelLoadEvent(getLevelWrapper((Level) event.getWorld())); + } + } + } + + // ServerLevelUnloadEvent + @SubscribeEvent + private void serverLevelUnloadEvent(WorldEvent.Unload event) { + if (isValidTime()) { + if (event.getWorld() instanceof ServerLevel) { + serverApi.serverLevelUnloadEvent(getLevelWrapper((Level) event.getWorld())); + } + } + } + + @SubscribeEvent + public void serverChunkLoadEvent(ChunkDataEvent.Load event) + { + if (isValidTime()) { + if (event.getWorld() instanceof ServerLevel) { + IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), event.getWorld()); + LevelWrapper level = new LevelWrapper(event.getWorld()); + ClientApi.INSTANCE.clientChunkLoadEvent(chunk, level); + } + } + } + @SubscribeEvent + public void serverChunkSaveEvent(ChunkDataEvent.Save event) + { + if (isValidTime()) { + if (event.getWorld() instanceof ServerLevel) { + IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), event.getWorld()); + LevelWrapper level = new LevelWrapper(event.getWorld()); + ClientApi.INSTANCE.clientChunkSaveEvent(chunk, level); + } + } + } + + // This just exists here for testing purposes, it'll be removed in the future + public void tester(MinecraftServer server) { + for (ServerPlayer player : server.getPlayerList().getPlayers()) { + FriendlyByteBuf payload = Networking.createNew(); + payload.writeInt(1); + System.out.println("Sending int 1"); + Networking.send(player, payload); + } + } +} diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinDebugScreenOverlay.java b/forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinDebugScreenOverlay.java similarity index 94% rename from forge/src/main/java/com/seibel/lod/forge/mixins/MixinDebugScreenOverlay.java rename to forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinDebugScreenOverlay.java index 8f88926aa..9ecbb3c73 100644 --- a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinDebugScreenOverlay.java +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinDebugScreenOverlay.java @@ -1,4 +1,4 @@ -package com.seibel.lod.forge.mixins; +package com.seibel.lod.forge.mixins.client; import com.seibel.lod.core.render.F3Screen; import net.minecraft.client.gui.components.DebugScreenOverlay; diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinFogRenderer.java b/forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinFogRenderer.java similarity index 98% rename from forge/src/main/java/com/seibel/lod/forge/mixins/MixinFogRenderer.java rename to forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinFogRenderer.java index f657387cb..fb7647618 100644 --- a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinFogRenderer.java +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinFogRenderer.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package com.seibel.lod.forge.mixins; +package com.seibel.lod.forge.mixins.client; import com.seibel.lod.core.config.Config; import org.spongepowered.asm.mixin.Mixin; diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinGameRenderer.java b/forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinGameRenderer.java new file mode 100644 index 000000000..76d5eedc0 --- /dev/null +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinGameRenderer.java @@ -0,0 +1,44 @@ +package com.seibel.lod.forge.mixins.client; + +import com.seibel.lod.core.api.internal.a7.ClientApi; +import com.seibel.lod.core.api.internal.a7.SharedApi; +import net.minecraft.client.renderer.GameRenderer; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +// TODO: Check if this port from fabric works +@Mixin(GameRenderer.class) +public class MixinGameRenderer { + #if POST_MC_1_17_1 + @Inject(method = "shutdownShaders", at = @At("HEAD")) + public void onShutdownShaders(CallbackInfo ci) { + SharedApi.LOGGER.info("Shutting down renderer"); + ClientApi.INSTANCE.rendererShutdownEvent(); + } + + // FIXME: This I think will dup multiple renderStartupEvent calls... + @Inject(method = {"reloadShaders", "preloadUiShader", "preloadShader"}, at = @At("TAIL")) + public void onStartupShaders(CallbackInfo ci) { + SharedApi.LOGGER.info("Starting up renderer"); + ClientApi.INSTANCE.rendererStartupEvent(); + } + #else + // FIXME: on 1.16 we dont have stuff for reloading/shutting down shaders + + @Inject(method = "shutdownShaders", at = @At("HEAD")) + public void onShutdownShaders(CallbackInfo ci) { + SharedApi.LOGGER.info("Shutting down renderer"); + ClientApi.INSTANCE.rendererShutdownEvent(); + } + + // FIXME: This I think will dup multiple renderStartupEvent calls... + @Inject(method = {"reloadShaders", "preloadUiShader", "preloadShader"}, at = @At("TAIL")) + public void onStartupShaders(CallbackInfo ci) { + SharedApi.LOGGER.info("Starting up renderer"); + ClientApi.INSTANCE.rendererStartupEvent(); + } + #endif + +} diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinWorldRenderer.java b/forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinLevelRenderer.java similarity index 85% rename from forge/src/main/java/com/seibel/lod/forge/mixins/MixinWorldRenderer.java rename to forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinLevelRenderer.java index dbf4f1e7a..ba133fffc 100644 --- a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinWorldRenderer.java +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinLevelRenderer.java @@ -17,22 +17,27 @@ * along with this program. If not, see . */ -package com.seibel.lod.forge.mixins; +package com.seibel.lod.forge.mixins.client; import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.math.Matrix4f; import com.seibel.lod.common.wrappers.McObjectConverter; +import com.seibel.lod.common.wrappers.world.LevelWrapper; import com.seibel.lod.core.config.Config; -import com.seibel.lod.core.api.internal.ClientApi; +import com.seibel.lod.core.api.internal.a7.ClientApi; import com.seibel.lod.core.objects.math.Mat4f; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderType; -import org.lwjgl.opengl.GL15; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.logging.Level; + /** * This class is used to mix in my rendering code * before Minecraft starts rendering blocks. @@ -47,11 +52,15 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; * @version 12-31-2021 */ @Mixin(LevelRenderer.class) -public class MixinWorldRenderer +public class MixinLevelRenderer { + @Shadow + private ClientLevel level; + + @Unique private static float previousPartialTicks = 0; - public MixinWorldRenderer() { + public MixinLevelRenderer() { throw new NullPointerException("Null cannot be cast to non-null type."); } @@ -79,7 +88,7 @@ public class MixinWorldRenderer mcProjectionMatrix.transpose(); Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose()); - ClientApi.INSTANCE.renderLods(mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks); + ClientApi.INSTANCE.renderLods(LevelWrapper.getWorldWrapper(level), mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks); } if (Config.Client.Advanced.lodOnlyMode.get()) { callback.cancel(); @@ -104,7 +113,7 @@ public class MixinWorldRenderer Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); - ClientApi.INSTANCE.renderLods(mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks); + ClientApi.INSTANCE.renderLods(LevelWrapper.getWorldWrapper(level), mcModelViewMatrix, mcProjectionMatrix, previousPartialTicks); } if (Config.Client.Advanced.lodOnlyMode.get()) { callback.cancel(); diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinLightmap.java b/forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinLightmap.java similarity index 95% rename from forge/src/main/java/com/seibel/lod/forge/mixins/MixinLightmap.java rename to forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinLightmap.java index d2ffc3e3b..ba6963ad6 100644 --- a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinLightmap.java +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinLightmap.java @@ -1,4 +1,4 @@ -package com.seibel.lod.forge.mixins; +package com.seibel.lod.forge.mixins.client; import com.mojang.blaze3d.platform.NativeImage; diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinOptionsScreen.java b/forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinOptionsScreen.java similarity index 98% rename from forge/src/main/java/com/seibel/lod/forge/mixins/MixinOptionsScreen.java rename to forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinOptionsScreen.java index 8d4f28d06..cf485f9ba 100644 --- a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinOptionsScreen.java +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/client/MixinOptionsScreen.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package com.seibel.lod.forge.mixins; +package com.seibel.lod.forge.mixins.client; import com.seibel.lod.common.wrappers.config.GetConfigScreen; import com.seibel.lod.common.wrappers.config.TexturedButtonWidget; diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinChunkGenerator.java b/forge/src/main/java/com/seibel/lod/forge/mixins/server/MixinChunkGenerator.java similarity index 98% rename from forge/src/main/java/com/seibel/lod/forge/mixins/MixinChunkGenerator.java rename to forge/src/main/java/com/seibel/lod/forge/mixins/server/MixinChunkGenerator.java index f9cf36a28..0697f7ddd 100644 --- a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinChunkGenerator.java +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/server/MixinChunkGenerator.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package com.seibel.lod.forge.mixins; +package com.seibel.lod.forge.mixins.server; import org.spongepowered.asm.mixin.Mixin; import net.minecraft.world.level.chunk.ChunkGenerator; diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinTFChunkGenerator.java b/forge/src/main/java/com/seibel/lod/forge/mixins/server/MixinTFChunkGenerator.java similarity index 97% rename from forge/src/main/java/com/seibel/lod/forge/mixins/MixinTFChunkGenerator.java rename to forge/src/main/java/com/seibel/lod/forge/mixins/server/MixinTFChunkGenerator.java index 9011faa27..225df7129 100644 --- a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinTFChunkGenerator.java +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/server/MixinTFChunkGenerator.java @@ -1,4 +1,4 @@ -package com.seibel.lod.forge.mixins; +package com.seibel.lod.forge.mixins.server; import net.minecraft.world.level.chunk.ChunkGenerator; import org.spongepowered.asm.mixin.Mixin; diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinUtilBackgroudThread.java b/forge/src/main/java/com/seibel/lod/forge/mixins/server/MixinUtilBackgroundThread.java similarity index 97% rename from forge/src/main/java/com/seibel/lod/forge/mixins/MixinUtilBackgroudThread.java rename to forge/src/main/java/com/seibel/lod/forge/mixins/server/MixinUtilBackgroundThread.java index fe6bcbe85..8f2e89c71 100644 --- a/forge/src/main/java/com/seibel/lod/forge/mixins/MixinUtilBackgroudThread.java +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/server/MixinUtilBackgroundThread.java @@ -17,7 +17,7 @@ * along with this program. If not, see . */ -package com.seibel.lod.forge.mixins; +package com.seibel.lod.forge.mixins.server; import java.util.concurrent.ExecutorService; import java.util.function.Supplier; @@ -33,7 +33,7 @@ import com.seibel.lod.core.util.DummyRunExecutorService; import net.minecraft.Util; @Mixin(Util.class) -public class MixinUtilBackgroudThread +public class MixinUtilBackgroundThread { private static boolean shouldApplyOverride() { diff --git a/forge/src/main/java/com/seibel/lod/forge/mixins/unsafe/MixinThreadingDectector.java b/forge/src/main/java/com/seibel/lod/forge/mixins/server/unsafe/MixinThreadingDetector.java similarity index 92% rename from forge/src/main/java/com/seibel/lod/forge/mixins/unsafe/MixinThreadingDectector.java rename to forge/src/main/java/com/seibel/lod/forge/mixins/server/unsafe/MixinThreadingDetector.java index 7939ff705..2e9090546 100644 --- a/forge/src/main/java/com/seibel/lod/forge/mixins/unsafe/MixinThreadingDectector.java +++ b/forge/src/main/java/com/seibel/lod/forge/mixins/server/unsafe/MixinThreadingDetector.java @@ -17,9 +17,8 @@ * along with this program. If not, see . */ -package com.seibel.lod.forge.mixins.unsafe; +package com.seibel.lod.forge.mixins.server.unsafe; import org.spongepowered.asm.mixin.Mixin; -import net.minecraft.world.level.chunk.ChunkGenerator; #if POST_MC_1_18_1 import net.minecraft.util.ThreadingDetector; @@ -36,7 +35,7 @@ import java.util.concurrent.Semaphore; * FIXME: Recheck this */ @Mixin(ThreadingDetector.class) -public class MixinThreadingDectector { +public class MixinThreadingDetector { @Mutable @Shadow private Semaphore lock; diff --git a/forge/src/main/resources/lod.mixins.json b/forge/src/main/resources/lod.mixins.json index 56fb0e53c..ea6bd9ea7 100644 --- a/forge/src/main/resources/lod.mixins.json +++ b/forge/src/main/resources/lod.mixins.json @@ -3,16 +3,18 @@ "minVersion": "0.8", "package": "com.seibel.lod.forge.mixins", "mixins": [ - "MixinUtilBackgroudThread" + "server.unsafe.MixinThreadingDetector", + "server.MixinUtilBackgroundThread", + "server.MixinChunkGenerator", + "server.MixinTFChunkGenerator" ], "client": [ - "MixinOptionsScreen", - "MixinWorldRenderer", - "MixinFogRenderer", - "MixinChunkGenerator", - "MixinLightmap", - "MixinTFChunkGenerator", - "MixinDebugScreenOverlay" + "client.MixinDebugScreenOverlay", + "client.MixinFogRenderer", + "client.MixinGameRenderer", + "client.MixinLevelRenderer", + "client.MixinLightmap", + "client.MixinOptionsScreen" ], "server": [] }