From 15dda30050ab68fc3c3fd8eb2d83bf42642f2b4a Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 2 Oct 2025 07:37:54 -0500 Subject: [PATCH] add neo 1.21.9 support --- .../common/wrappers/DependencySetup.java | 6 +- .../common/wrappers/gui/ClassicConfigGUI.java | 9 +- .../common/wrappers/gui/MinecraftScreen.java | 4 + .../wrappers/gui/updater/ChangelogScreen.java | 37 ++++---- .../minecraft/MinecraftRenderWrapper.java | 72 ++++++++++++--- .../wrappers/misc/ServerPlayerWrapper.java | 20 ----- .../BatchGenerationEnvironment.java | 8 +- .../mimicObject/ChunkLoader.java | 41 +++++++-- coreSubProjects | 2 +- .../fabric/FabricClientProxy.java | 32 +++++-- .../mixins/client/MixinLightTexture.java | 8 +- gradle.properties | 2 +- .../neoforge/NeoforgeMain.java | 7 ++ .../neoforge/NeoforgeServerProxy.java | 4 + .../mixins/client/MixinLevelRenderer.java | 13 ++- .../mixins/client/MixinLightTexture.java | 15 +++- .../NeoforgeMinecraftRenderWrapper.java | 88 +++++++++++++++++++ versionProperties/1.21.8.properties | 2 +- versionProperties/1.21.9.properties | 58 ++++++++++++ 19 files changed, 338 insertions(+), 90 deletions(-) create mode 100644 neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/NeoforgeMinecraftRenderWrapper.java create mode 100644 versionProperties/1.21.9.properties diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetup.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetup.java index 23227b89d..c7b851f36 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetup.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetup.java @@ -59,13 +59,9 @@ public class DependencySetup DependencySetupDoneCheck.isDone = true; } - //@Environment(EnvType.SERVER) public static void createServerBindings() - { - SingletonInjector.INSTANCE.bind(IMinecraftSharedWrapper.class, MinecraftServerWrapper.INSTANCE); - } + { SingletonInjector.INSTANCE.bind(IMinecraftSharedWrapper.class, MinecraftServerWrapper.INSTANCE); } - //@Environment(EnvType.CLIENT) public static void createClientBindings() { SingletonInjector.INSTANCE.bind(IMinecraftClientWrapper.class, MinecraftClientWrapper.INSTANCE); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java index 67b29862c..7675b33ce 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/ClassicConfigGUI.java @@ -920,12 +920,19 @@ public class ClassicConfigGUI @Override #if MC_VER < MC_1_20_1 public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) - #else + #elif MC_VER < MC_1_21_9 public void render(GuiGraphics matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) + #else + public void renderContent(GuiGraphics matrices, int mouseX, int mouseY, boolean hovered, float tickDelta) #endif { try { + #if MC_VER < MC_1_21_9 + #else + int y = this.getY(); // TODO why is the Y value being set during render? + #endif + if (this.button != null) { SetY(this.button, y); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/MinecraftScreen.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/MinecraftScreen.java index ddc5bee6d..fc2f7cb44 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/MinecraftScreen.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/MinecraftScreen.java @@ -39,7 +39,11 @@ public class MinecraftScreen protected ConfigScreenRenderer(Screen parent, AbstractScreen screen, String translationName) { super(translate(translationName)); + #if MC_VER < MC_1_21_9 screen.minecraftWindow = Minecraft.getInstance().getWindow().getWindow(); + #else + screen.minecraftWindow = Minecraft.getInstance().getWindow().handle(); + #endif this.parent = parent; this.screen = screen; } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/ChangelogScreen.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/ChangelogScreen.java index 1704234eb..9d6bc5b51 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/ChangelogScreen.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/ChangelogScreen.java @@ -253,42 +253,35 @@ public class ChangelogScreen extends DhScreen private final Component text; private final List children = new ArrayList<>(); - private ButtonEntry(Component text) - { - this.text = text; - } + private ButtonEntry(Component text) { this.text = text; } public static ButtonEntry create(Component text) - { - return new ButtonEntry(text); - } + { return new ButtonEntry(text); } #if MC_VER < MC_1_20_1 @Override public void render(PoseStack matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) - { - GuiComponent.drawString(matrices, textRenderer, text, 12, y + 5, 0xFFFFFF); - } - #else + { GuiComponent.drawString(matrices, textRenderer, text, 12, y + 5, 0xFFFFFF); } + #elif MC_VER < MC_1_21_9 @Override public void render(GuiGraphics matrices, int index, int y, int x, int entryWidth, int entryHeight, int mouseX, int mouseY, boolean hovered, float tickDelta) - { - matrices.drawString(textRenderer, this.text, 12, y + 5, 0xFFFFFF); - } + { matrices.drawString(textRenderer, this.text, 12, y + 5, 0xFFFFFF); } + #else + @Override + public void renderContent(GuiGraphics matrices, int y, int x, boolean hovered, float tickDelta) + { matrices.drawString(textRenderer, this.text, 12, y + 5, 0xFFFFFF); } #endif @Override - public List children() - { - return this.children; - } + public List children() { return this.children; } + #if MC_VER >= MC_1_17_1 @Override - public List narratables() - { - return this.children; - } + public List narratables() { return this.children; } #endif + + + } } \ No newline at end of file diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java index 2f7fd0c55..254b51ccb 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftRenderWrapper.java @@ -23,8 +23,11 @@ import java.awt.Color; import java.lang.invoke.MethodHandles; import java.util.concurrent.ConcurrentHashMap; +import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.pipeline.RenderTarget; import com.mojang.blaze3d.platform.NativeImage; +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.textures.GpuTexture; import com.seibel.distanthorizons.common.wrappers.WrapperFactory; import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper; import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; @@ -72,25 +75,21 @@ import net.minecraft.world.phys.Vec3; import org.apache.logging.log4j.Logger; import org.joml.Vector4f; -#if MC_VER >= MC_1_21_5 +#if MC_VER >= MC_1_21_5 && MC_VER < MC_1_21_9 import com.mojang.blaze3d.opengl.GlTexture; +#else #endif /** * A singleton that contains everything * related to rendering in Minecraft. - * - * @author James Seibel - * @version 12-12-2021 */ -//@Environment(EnvType.CLIENT) public class MinecraftRenderWrapper implements IMinecraftRenderWrapper { public static final MinecraftRenderWrapper INSTANCE = new MinecraftRenderWrapper(); private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName()); private static final Minecraft MC = Minecraft.getInstance(); - private static final IWrapperFactory FACTORY = WrapperFactory.INSTANCE; private static final IOptifineAccessor OPTIFINE_ACCESSOR = ModAccessorInjector.INSTANCE.get(IOptifineAccessor.class); @@ -300,7 +299,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper return height; } - private RenderTarget getRenderTarget() { return MC.getMainRenderTarget(); } + protected RenderTarget getRenderTarget() { return MC.getMainRenderTarget(); } @Override public boolean mcRendersToFrameBuffer() @@ -348,19 +347,39 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper { #if MC_VER < MC_1_21_5 return this.getRenderTarget().getDepthTextureId(); - #else + #elif MC_VER < MC_1_21_9 try - { + { GlTexture glTexture = (GlTexture) this.getRenderTarget().getDepthTexture(); if (glTexture == null) { // shouldn't happen, but just in case return 0; } - + return glTexture.glId(); + } - catch (ClassCastException e) + catch (Exception e) + { + // only log this error once per session + if (!this.depthTextureCastFailLogged) + { + this.depthTextureCastFailLogged = true; + LOGGER.error("Unable to cast render Target depth texture to GlTexture. MC or a rendering mod may have changed the object type.", e); + } + return 0; + } + #else + try + { + throw new UnsupportedOperationException("Fabric get texture ID not implemented yet"); + + //GpuTexture depthTex = this.getRenderTarget().getDepthTexture(); + //int id = ((GlTexture)depthTex.getClass().getMethod("getRealTexture").invoke(depthTex)).glId(); + //return id; + } + catch (Exception e) { // only log this error once per session if (!this.depthTextureCastFailLogged) @@ -377,7 +396,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper { #if MC_VER < MC_1_21_5 return this.getRenderTarget().getColorTextureId(); - #else + #elif MC_VER < MC_1_21_9 try { GlTexture glTexture = (GlTexture) this.getRenderTarget().getColorTexture(); @@ -389,7 +408,26 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper return glTexture.glId(); } - catch (ClassCastException e) + catch (Exception e) + { + // only log this error once per session + if (!this.colorTextureCastFailLogged) + { + this.colorTextureCastFailLogged = true; + LOGGER.error("Unable to cast render Target color texture to GlTexture. MC or a rendering mod may have changed the object type.", e); + } + return 0; + } + #else + try + { + throw new UnsupportedOperationException("Fabric get texture ID not implemented yet"); + + //GpuTexture colorTex = this.getRenderTarget().getColorTexture(); + //int id = ((GlTexture)colorTex.getClass().getMethod("getRealTexture").invoke(colorTex)).glId(); + //return id; + } + catch (Exception e) { // only log this error once per session if (!this.colorTextureCastFailLogged) @@ -405,13 +443,21 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper @Override public int getTargetFrameBufferViewportWidth() { + #if MC_VER < MC_1_21_9 return this.getRenderTarget().viewWidth; + #else + return this.getRenderTarget().width; + #endif } @Override public int getTargetFrameBufferViewportHeight() { + #if MC_VER < MC_1_21_9 return this.getRenderTarget().viewHeight; + #else + return this.getRenderTarget().height; + #endif } @Override diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/ServerPlayerWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/ServerPlayerWrapper.java index 897a32a5d..8677000ad 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/ServerPlayerWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/ServerPlayerWrapper.java @@ -71,26 +71,6 @@ public class ServerPlayerWrapper implements IServerPlayerWrapper return new Vec3d(position.x, position.y, position.z); } - @Override - public int getViewDistance() - { - #if MC_VER < MC_1_21_6 - return this.getServerPlayer().server.getPlayerList().getViewDistance(); - #else - return this.getServerPlayer().getServer().getPlayerList().getViewDistance(); - #endif - } - - @Override - public SocketAddress getRemoteAddress() - { - #if MC_VER >= MC_1_19_4 - return this.getServerPlayer().connection.getRemoteAddress(); - #else // < 1.19.4 - return this.getServerPlayer().connection.connection.getRemoteAddress(); - #endif - } - //================// diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java index bac09fb78..832ec2770 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java @@ -116,8 +116,10 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv #if MC_VER < MC_1_21_5 private static final TicketType DH_SERVER_GEN_TICKET = TicketType.create("dh_server_gen_ticket", Comparator.comparingLong(ChunkPos::toLong)); - #else + #elif MC_VER < MC_1_21_9 private static final TicketType DH_SERVER_GEN_TICKET = new TicketType(/* timeout, 0 = disabled*/0L, /* persist */ false, TicketType.TicketUse.LOADING); + #else + private static final TicketType DH_SERVER_GEN_TICKET = new TicketType(/* timeout, 0 = disabled*/0L, /* flags */0); #endif private static final IModChecker MOD_CHECKER = SingletonInjector.INSTANCE.get(IModChecker.class); @@ -745,8 +747,10 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv return new ProtoChunk(chunkPos, UpgradeData.EMPTY, level, level.registryAccess().registryOrThrow(Registries.BIOME), null); #elif MC_VER < MC_1_21_3 return new ProtoChunk(chunkPos, UpgradeData.EMPTY, level, level.registryAccess().registryOrThrow(Registries.BIOME), null); - #else + #elif MC_VER < MC_1_21_9 return new ProtoChunk(chunkPos, UpgradeData.EMPTY, level, level.registryAccess().lookupOrThrow(Registries.BIOME), null); + #else + return new ProtoChunk(chunkPos, UpgradeData.EMPTY, level, null, null); #endif } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/ChunkLoader.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/ChunkLoader.java index aa3247483..51058e4b2 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/ChunkLoader.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/ChunkLoader.java @@ -35,6 +35,8 @@ import java.util.concurrent.atomic.AtomicBoolean; import it.unimi.dsi.fastutil.shorts.ShortList; +import net.minecraft.core.DefaultedMappedRegistry; +import net.minecraft.core.IdMapper; import net.minecraft.core.Registry; #if MC_VER >= MC_1_19_4 import net.minecraft.core.registries.BuiltInRegistries; @@ -45,6 +47,7 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.datafix.fixes.ChunkHeightAndBiomeFix; import net.minecraft.world.level.*; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biomes; @@ -94,11 +97,15 @@ public class ChunkLoader private static final AtomicBoolean ZERO_CHUNK_POS_ERROR_LOGGED_REF = new AtomicBoolean(false); - #if MC_VER >= MC_1_19_2 + #if MC_VER >= MC_1_21_9 + // BLOCK_STATE_CODEC can no longer be statically created since + // it needs a level reference + #elif MC_VER >= MC_1_19_2 private static final Codec> BLOCK_STATE_CODEC = PalettedContainer.codecRW(Block.BLOCK_STATE_REGISTRY, BlockState.CODEC, PalettedContainer.Strategy.SECTION_STATES, Blocks.AIR.defaultBlockState()); #elif MC_VER >= MC_1_18_2 private static final Codec> BLOCK_STATE_CODEC = PalettedContainer.codec(Block.BLOCK_STATE_REGISTRY, BlockState.CODEC, PalettedContainer.Strategy.SECTION_STATES, Blocks.AIR.defaultBlockState()); #endif + private static final String TAG_UPGRADE_DATA = "UpgradeData"; private static final String BLOCK_TICKS_TAG_18 = "block_ticks"; private static final String FLUID_TICKS_TAG_18 = "fluid_ticks"; @@ -259,6 +266,14 @@ public class ChunkLoader } private static LevelChunkSection[] readSections(LevelAccessor level, ChunkPos chunkPos, CompoundTag chunkData) { + #if MC_VER < MC_1_21_9 + // BLOCK_STATE_CODEC is created statically + // TODO clean up this code separation + #else + final Codec> BLOCK_STATE_CODEC = PalettedContainerFactory.create(level.registryAccess()).blockStatesContainerCodec(); + #endif + + #if MC_VER >= MC_1_18_2 #if MC_VER < MC_1_19_4 Registry biomes = level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY); @@ -276,9 +291,12 @@ public class ChunkLoader #elif MC_VER < MC_1_21_3 Codec>> biomeCodec = PalettedContainer.codecRW( biomes.asHolderIdMap(), biomes.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getHolderOrThrow(Biomes.PLAINS)); - #else + #elif MC_VER < MC_1_21_9 Codec>> biomeCodec = PalettedContainer.codecRW( biomes.asHolderIdMap(), biomes.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getOrThrow(Biomes.PLAINS)); + #else + Codec>> biomeCodec = PalettedContainer.codecRW( + biomes.holderByNameCodec(), PalettedContainerFactory.create(level.registryAccess()).biomeStrategy(), biomes.getOrThrow(Biomes.PLAINS)); #endif #endif @@ -348,7 +366,11 @@ public class ChunkLoader } else { + #if MC_VER < MC_1_21_9 blockStateContainer = new PalettedContainer(Block.BLOCK_STATE_REGISTRY, Blocks.AIR.defaultBlockState(), PalettedContainer.Strategy.SECTION_STATES); + #else + blockStateContainer = PalettedContainerFactory.create(level.registryAccess()).createForBlockStates(); + #endif } @@ -380,13 +402,18 @@ public class ChunkLoader } else { - biomeContainer = new PalettedContainer>(biomes.asHolderIdMap(), - #if MC_VER < MC_1_21_3 - biomes.getHolderOrThrow(Biomes.PLAINS), - #else + #if MC_VER < MC_1_21_3 + biomeContainer = new PalettedContainer>( + biomes.asHolderIdMap(), + biomes.getHolderOrThrow(Biomes.PLAINS), PalettedContainer.Strategy.SECTION_BIOMES); + #elif MC_VER < MC_1_21_9 + biomeContainer = new PalettedContainer>(biomes.asHolderIdMap(), biomes.getOrThrow(Biomes.PLAINS), - #endif PalettedContainer.Strategy.SECTION_BIOMES); + #else + biomeContainer = PalettedContainerFactory.create(level.registryAccess()).createForBiomes(); + #endif + } #endif diff --git a/coreSubProjects b/coreSubProjects index 12a885aa6..9690c898b 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 12a885aa6ea4d463d8fbc2428d568d6b7ef5932b +Subproject commit 9690c898b08d6c421f557be1a68a1d4aca9d6db0 diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java index 360160eb4..9aa8284c0 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java @@ -43,7 +43,6 @@ import net.fabricmc.api.Environment; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientChunkEvents; import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking; -import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; import net.fabricmc.fabric.api.event.player.AttackBlockCallback; import net.fabricmc.fabric.api.event.player.UseBlockCallback; import net.minecraft.client.Minecraft; @@ -63,6 +62,10 @@ import java.util.HashSet; import java.util.concurrent.AbstractExecutorService; import java.util.concurrent.ThreadPoolExecutor; +#if MC_VER < MC_1_21_9 +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; +#endif + import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.world.InteractionResult; import net.minecraft.world.level.chunk.ChunkAccess; @@ -103,6 +106,14 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy LOGGER.info("Registering Fabric Client Events"); + #if MC_VER < MC_1_21_9 + // old versions still run like normal + #else + if (true) + throw new UnsupportedOperationException("DH doesn't support 1.21.9 yet because the Fabric Rendering API is missing required events. Please wait for the Fabric team to update their API."); + #endif + + //========================// // register mod accessors // //========================// @@ -217,6 +228,8 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy // render event // //==============// + // TODO wait for fabric to re-add their rendering API + #if MC_VER < MC_1_21_9 WorldRenderEvents.AFTER_SETUP.register((renderContext) -> { Mat4f projectionMatrix = McObjectConverter.Convert(renderContext.projectionMatrix()); @@ -306,6 +319,7 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy ClientLevelWrapper.getWrapper(renderContext.world()) ); }); + #endif // Debug keyboard event @@ -355,18 +369,18 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy // Check all keys we need for (int keyCode = GLFW.GLFW_KEY_A; keyCode <= GLFW.GLFW_KEY_Z; keyCode++) { - if (InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), keyCode)) - { - currentKeyDown.add(keyCode); - } + //if (InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), keyCode)) + //{ + // currentKeyDown.add(keyCode); + //} } for (int keyCode : KEY_TO_CHECK_FOR) { - if (InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), keyCode)) - { - currentKeyDown.add(keyCode); - } + //if (InputConstants.isKeyDown(Minecraft.getInstance().getWindow().getWindow(), keyCode)) + //{ + // currentKeyDown.add(keyCode); + //} } // Diff and trigger events diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightTexture.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightTexture.java index a38b73ba8..577946fed 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightTexture.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightTexture.java @@ -22,6 +22,7 @@ package com.seibel.distanthorizons.fabric.mixins.client; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import net.minecraft.client.renderer.LightTexture; @@ -73,14 +74,15 @@ public class MixinLightTexture IClientLevelWrapper clientLevel = mc.getWrappedClientLevel(); + MinecraftRenderWrapper renderWrapper = (MinecraftRenderWrapper)SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class); #if MC_VER < MC_1_21_3 - MinecraftRenderWrapper.INSTANCE.updateLightmap(this.lightPixels, clientLevel); + renderWrapper.updateLightmap(this.lightPixels, clientLevel); #elif MC_VER < MC_1_21_5 - MinecraftRenderWrapper.INSTANCE.setLightmapId(this.target.getColorTextureId(), clientLevel); + renderWrapper.setLightmapId(this.target.getColorTextureId(), clientLevel); #else GlTexture glTexture = (GlTexture) this.texture; - MinecraftRenderWrapper.INSTANCE.setLightmapId(glTexture.glId(), clientLevel); + renderWrapper.setLightmapId(glTexture.glId(), clientLevel); #endif } diff --git a/gradle.properties b/gradle.properties index 197997bb9..08b2f5416 100644 --- a/gradle.properties +++ b/gradle.properties @@ -54,7 +54,7 @@ versionStr= # This defines what MC version Intellij will use for the preprocessor # and what version is used automatically by build and run commands -mcVer=1.21.8 +mcVer=1.21.9 # Defines the maximum amount of memory Minecraft is allowed when run in a development environment #minecraftMemoryJavaArg="-Xmx4G" diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeMain.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeMain.java index ce96ada26..c8c2aa448 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeMain.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeMain.java @@ -22,15 +22,18 @@ package com.seibel.distanthorizons.neoforge; import com.mojang.brigadier.CommandDispatcher; import com.seibel.distanthorizons.common.AbstractModInitializer; import com.seibel.distanthorizons.common.wrappers.gui.GetConfigScreen; +import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; import com.seibel.distanthorizons.core.api.internal.ClientApi; import com.seibel.distanthorizons.core.api.internal.ServerApi; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage; +import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSender; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IModChecker; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IOptifineAccessor; import com.seibel.distanthorizons.coreapi.ModInfo; +import com.seibel.distanthorizons.neoforge.wrappers.NeoforgeMinecraftRenderWrapper; import com.seibel.distanthorizons.neoforge.wrappers.modAccessor.ModChecker; import com.seibel.distanthorizons.neoforge.wrappers.modAccessor.OptifineAccessor; import net.minecraft.commands.CommandSourceStack; @@ -125,6 +128,10 @@ public class NeoforgeMain extends AbstractModInitializer { SingletonInjector.INSTANCE.bind(IModChecker.class, ModChecker.INSTANCE); SingletonInjector.INSTANCE.bind(IPluginPacketSender.class, new NeoforgePluginPacketSender()); + + // replace MC RenderWrapper with more specific neoforge version + SingletonInjector.INSTANCE.unbind(IMinecraftRenderWrapper.class, MinecraftRenderWrapper.INSTANCE); // TODO replace with a replaceOrBind for simplicity + SingletonInjector.INSTANCE.bind(IMinecraftRenderWrapper.class, NeoforgeMinecraftRenderWrapper.INSTANCE); } @Override diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeServerProxy.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeServerProxy.java index 2c58dd9f6..9bd630767 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeServerProxy.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeServerProxy.java @@ -152,8 +152,12 @@ public class NeoforgeServerProxy implements AbstractModInitializer.IEventProxy private static ServerLevelWrapper getServerLevelWrapper(ServerLevel level) { return ServerLevelWrapper.getWrapper(level); } private static ServerLevelWrapper getServerLevelWrapper(ResourceKey resourceKey, PlayerEvent event) { + #if MC_VER < MC_1_21_9 //noinspection DataFlowIssue (possible NPE after getServer()) return getServerLevelWrapper(event.getEntity().getServer().getLevel(resourceKey)); + #else + return getServerLevelWrapper(event.getEntity().level().getServer().getLevel(resourceKey)); + #endif } private static ServerPlayerWrapper getServerPlayerWrapper(PlayerEvent event) { return ServerPlayerWrapper.getWrapper((ServerPlayer) event.getEntity()); } diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java index c70d24140..d501bc024 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java @@ -92,9 +92,20 @@ public class MixinLevelRenderer #if MC_VER < MC_1_21_6 @Inject(at = @At("HEAD"), method = "renderSectionLayer", cancellable = true) private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f modelViewMatrix, Matrix4f projectionMatrix, CallbackInfo callback) + #elif MC_VER < MC_1_21_9 + @Inject(at = @At("HEAD"), method = "renderLevel", cancellable = true) + private void onRenderLevel( + GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, + boolean renderBlockOutline, Camera camera, + Matrix4f positionMatrix, Matrix4f projectionMatrix, GpuBufferSlice gpuBufferSlice, + Vector4f skyColor, boolean thinFog, CallbackInfo callback) #else @Inject(at = @At("HEAD"), method = "renderLevel", cancellable = true) - private void onRenderLevel(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderBlockOutline, Camera camera, Matrix4f positionMatrix, Matrix4f projectionMatrix, GpuBufferSlice gpuBufferSlice, Vector4f skyColor, boolean thinFog, CallbackInfo callback) + private void renderLevel( + GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, + boolean renderBlockOutline, Camera camera, + Matrix4f positionMatrix, Matrix4f projectionMatrix, Matrix4f idkMatrix, GpuBufferSlice gpuBufferSlice, + Vector4f skyColor, boolean thinFog, CallbackInfo callback) #endif { #if MC_VER < MC_1_21_6 diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java index 32ae446d9..32b012b88 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java @@ -22,9 +22,11 @@ package com.seibel.distanthorizons.neoforge.mixins.client; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import net.minecraft.client.renderer.LightTexture; +import net.neoforged.neoforge.client.blaze3d.validation.ValidationGpuTexture; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -70,14 +72,19 @@ public class MixinLightTexture IClientLevelWrapper clientLevel = mc.getWrappedClientLevel(); + MinecraftRenderWrapper renderWrapper = (MinecraftRenderWrapper)SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class); #if MC_VER < MC_1_21_3 - MinecraftRenderWrapper.INSTANCE.updateLightmap(this.lightPixels, clientLevel); + renderWrapper.updateLightmap(this.lightPixels, clientLevel); #elif MC_VER < MC_1_21_5 - MinecraftRenderWrapper.INSTANCE.setLightmapId(this.target.getColorTextureId(), clientLevel); - #else + renderWrapper.setLightmapId(this.target.getColorTextureId(), clientLevel); + #elif MC_VER < MC_1_21_9 GlTexture glTexture = (GlTexture) this.texture; - MinecraftRenderWrapper.INSTANCE.setLightmapId(glTexture.glId(), clientLevel); + renderWrapper.setLightmapId(glTexture.glId(), clientLevel); + #else + ValidationGpuTexture gpuTexture = (ValidationGpuTexture) this.texture; + int id = ((GlTexture)(gpuTexture.getRealTexture())).glId(); + renderWrapper.setLightmapId(id, clientLevel); #endif } diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/NeoforgeMinecraftRenderWrapper.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/NeoforgeMinecraftRenderWrapper.java new file mode 100644 index 000000000..325c6d9e1 --- /dev/null +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/wrappers/NeoforgeMinecraftRenderWrapper.java @@ -0,0 +1,88 @@ +package com.seibel.distanthorizons.neoforge.wrappers; + +import com.mojang.blaze3d.opengl.GlTexture; +import com.mojang.blaze3d.textures.GpuTexture; +import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; +import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import net.minecraft.client.Minecraft; +import org.apache.logging.log4j.Logger; + +#if MC_VER < MC_1_21_9 +#else +import net.neoforged.neoforge.client.blaze3d.validation.ValidationGpuTexture; +#endif + +import java.lang.invoke.MethodHandles; + +public class NeoforgeMinecraftRenderWrapper extends MinecraftRenderWrapper +{ + public static final MinecraftRenderWrapper INSTANCE = new MinecraftRenderWrapper(); + + private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName()); + private static final Minecraft MC = Minecraft.getInstance(); + + + + @Override + public int getDepthTextureId() + { + #if MC_VER < MC_1_21_9 + // no special handling required, + // both neo/fabric uses the same back end objects + return super.getDepthTextureId(); + #else + try + { + //GpuTexture depthTex = this.getRenderTarget().getDepthTexture(); + //int id = ((GlTexture)depthTex.getClass().getMethod("getRealTexture").invoke(depthTex)).glId(); + //return id; + + ValidationGpuTexture validationTexture = (ValidationGpuTexture) this.getRenderTarget().getDepthTexture(); + GlTexture glTexture = (GlTexture)validationTexture.getRealTexture(); + int id = glTexture.glId(); + return id; + } + catch (Exception e) + { + // only log this error once per session + if (!this.depthTextureCastFailLogged) + { + this.depthTextureCastFailLogged = true; + LOGGER.error("Unable to cast render Target depth texture to GlTexture. MC or a rendering mod may have changed the object type.", e); + } + return 0; + } + #endif + } + @Override + public int getColorTextureId() + { + #if MC_VER < MC_1_21_9 + // no special handling required, + // both neo/fabric uses the same back end objects + return super.getColorTextureId(); + #else + try + { + //GpuTexture colorTex = this.getRenderTarget().getColorTexture(); + //int id = ((GlTexture)colorTex.getClass().getMethod("getRealTexture").invoke(colorTex)).glId(); + //return id; + + ValidationGpuTexture validationTexture = (ValidationGpuTexture) this.getRenderTarget().getColorTexture(); + GlTexture glTexture = (GlTexture)validationTexture.getRealTexture(); + int id = glTexture.glId(); + return id; + } + catch (Exception e) + { + // only log this error once per session + if (!this.colorTextureCastFailLogged) + { + this.colorTextureCastFailLogged = true; + LOGGER.error("Unable to cast render Target color texture to ValidationGpuTexture or GlTexture. MC, Neoforge, or a rendering mod may have changed the object type.", e); + } + return 0; + } + #endif + } +} diff --git a/versionProperties/1.21.8.properties b/versionProperties/1.21.8.properties index 7c7e38e17..c00be8478 100644 --- a/versionProperties/1.21.8.properties +++ b/versionProperties/1.21.8.properties @@ -1,4 +1,4 @@ -# 1.21.7 version +# 1.21.8 version java_version=21 minecraft_version=1.21.8 parchment_version=1.21:2024.07.28 diff --git a/versionProperties/1.21.9.properties b/versionProperties/1.21.9.properties new file mode 100644 index 000000000..95d25bd22 --- /dev/null +++ b/versionProperties/1.21.9.properties @@ -0,0 +1,58 @@ +# 1.21.9 version +java_version=21 +minecraft_version=1.21.9 +parchment_version=1.21:2024.07.28 +compatible_minecraft_versions=["1.21.9"] +accessWidenerVersion=1_21_4 +builds_for=fabric,neoforge +# forge is broken due to gradle/build script issues + +# Netty +netty_version=4.1.97.Final + +# Fabric loader +fabric_loader_version=0.17.2 +fabric_api_version=0.133.14+1.21.9 + modmenu_version=15.0.0 + starlight_version_fabric= + phosphor_version_fabric= + lithium_version= + sodium_version=mc1.21.9-0.7.0-fabric + iris_version=1.9.3+1.21.9-fabric + bclib_version= + immersive_portals_version= + canvas_version= + + fabric_incompatibility_list={ } + fabric_recommend_list={} + + # Fabric mod run + # 0 = Don't enable and don't run + # 1 = Can be referenced in code but doesn't run + # 2 = Can be referenced in code and runs in client + enable_starlight=0 + enable_phosphor=0 + enable_sodium=1 + enable_lithium=0 + enable_iris=1 + enable_bclib=0 + enable_immersive_portals=0 + enable_canvas=0 + +# (Neo)Forge loader +forge_version= +neoforge_version=21.9.1-beta + # around 6.19 neo changed how their render API works, failing to meet this causes the game to crash + neoforge_version_range=[*,) + + # (Neo)Forge mod versions + starlight_version_forge= + terraforged_version= + + # (Neo)Forge mod run + # 0 = Don't enable and don't run + # 1 = Can be referenced in code but doesn't run + # 2 = Can be referenced in code and runs in client + enable_starlight_forge=0 + enable_terraforged=0 + enable_terrafirmacraft=0