diff --git a/.gitignore b/.gitignore index 0fa2bd272..16bdd9507 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,6 @@ buildAllJars/ # file genearated via MC version switching using preprocessor build.properties + +# Sqlite databases +*.sqlite diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 357292dae..e4b9db183 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -30,7 +30,7 @@ build: stage: build parallel: matrix: - - MC_VER: ["1.16.5", "1.17.1", "1.18.2", "1.19.2", "1.19.4", "1.20.1"] + - MC_VER: ["1.16.5", "1.17.1", "1.18.2", "1.19.2", "1.19.4", "1.20.1", "1.20.2"] script: # this both runs the unit tests and assembles the code - ./gradlew clean -PmcVer="${MC_VER}" -PgitMainBranch="${CI_COMMIT_BRANCH}" -PgitMainCommit="${CI_COMMIT_SHA}" -PgitCoreCommit="Unavailable (built by Gitlab CI)" --gradle-user-home cache/; diff --git a/Readme.md b/Readme.md index 48e52f592..7aaf778fc 100644 --- a/Readme.md +++ b/Readme.md @@ -20,6 +20,13 @@ If you want to see a quick demo, check out a video covering the mod here: ### This branch supports the following versions of Minecraft: +#### 1.20.2 +Fabric: 0.14.22\ +Fabric API: 0.89.2+1.20.2\ +Forge: 48.0.13\ +Parchment: 1.19.3:2023.03.25\ +Modmenu: 8.0.0 + #### 1.20.1, 1.20 (Default) Fabric: 0.14.21\ Fabric API: 0.85.0+1.20.1\ diff --git a/build.gradle b/build.gradle index 4cf29581d..56c009c1b 100644 --- a/build.gradle +++ b/build.gradle @@ -219,6 +219,9 @@ subprojects { p -> // Compression forgeShadowMe("org.lz4:lz4-java:${rootProject.lz4_version}") + // Sqlite Database + forgeShadowMe("org.xerial:sqlite-jdbc:${rootProject.sqlite_jdbc_version}") + // NightConfig (includes Toml & Json) forgeShadowMe("com.electronwill.night-config:toml:${rootProject.nightconfig_version}") forgeShadowMe("com.electronwill.night-config:json:${rootProject.nightconfig_version}") @@ -300,6 +303,10 @@ subprojects { p -> // Compression (LZ4) relocate "net.jpountz", "${librariesLocation}.jpountz" + + // Sqlite Database + //At the moment, there is a bug in this library which doesnt allow it to be relocated +// relocate "org.sqlite", "${librariesLocation}.sqlite" // NightConfig (includes Toml & Json) relocate "com.electronwill.nightconfig", "${librariesLocation}.electronwill.nightconfig" diff --git a/common/src/main/java/com/seibel/distanthorizons/common/util/ProxyUtil.java b/common/src/main/java/com/seibel/distanthorizons/common/util/ProxyUtil.java new file mode 100644 index 000000000..ee805387b --- /dev/null +++ b/common/src/main/java/com/seibel/distanthorizons/common/util/ProxyUtil.java @@ -0,0 +1,47 @@ +/* + * This file is part of the Distant Horizons mod + * licensed under the GNU LGPL v3 License. + * + * Copyright (C) 2020-2023 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.seibel.distanthorizons.common.util; + +import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; +import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; +import net.minecraft.client.multiplayer.ClientLevel; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.LevelAccessor; + +public class ProxyUtil +{ + + public static ILevelWrapper getLevelWrapper(LevelAccessor level) + { + ILevelWrapper levelWrapper; + if (level instanceof ServerLevel) + { + levelWrapper = ServerLevelWrapper.getWrapper((ServerLevel) level); + } + else + { + levelWrapper = ClientLevelWrapper.getWrapper((ClientLevel) level); + } + + return levelWrapper; + } + +} 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 cfb82ae09..b3411c7e4 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 @@ -387,12 +387,16 @@ public class ClassicConfigGUI public void render(GuiGraphics matrices, int mouseX, int mouseY, float delta) #endif { + #if PRE_MC_1_20_2 // 1.20.2 now enables this by default in the `this.list.render` function this.renderBackground(matrices); // Renders background + #else + super.render(matrices, mouseX, mouseY, delta); + #endif this.list.render(matrices, mouseX, mouseY, delta); // Render buttons DhDrawCenteredString(matrices, font, title, width / 2, 15, 0xFFFFFF); // Render title - if (this.configBase.modID == "distanthorizons") + if (this.configBase.modID.equals("distanthorizons")) { // Display version DhDrawString(matrices, font, TextOrLiteral(ModInfo.VERSION), 2, height - 10, 0xAAAAAA); @@ -439,7 +443,9 @@ public class ClassicConfigGUI } } } + #if PRE_MC_1_20_2 super.render(matrices, mouseX, mouseY, delta); + #endif } } 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 cf42dd9db..716c98775 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 @@ -72,7 +72,11 @@ public class MinecraftScreen public void render(GuiGraphics matrices, int mouseX, int mouseY, float delta) #endif { + #if MC_1_20_2 + this.renderBackground(matrices, mouseX, mouseY, delta); // Render background + #else this.renderBackground(matrices); // Render background + #endif this.list.render(matrices, mouseX, mouseY, delta); // Renders the items in the render list (currently only used to tint background darker) screen.mouseX = mouseX; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java index 950a68e50..866ef61c7 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java @@ -19,67 +19,159 @@ package com.seibel.distanthorizons.common.wrappers.gui; +/** + * Creates a button with a texture on it (and a background) that works with all mc versions + * + * @author coolGi + * @version 2023-10-03 + */ + + import com.mojang.blaze3d.systems.RenderSystem; -import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.components.AbstractButton; +import net.minecraft.client.gui.components.Button; import net.minecraft.client.gui.components.ImageButton; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -#if PRE_MC_1_17_1 -import net.minecraft.client.Minecraft; -#else +#if POST_MC_1_17_1 import net.minecraft.client.renderer.GameRenderer; #endif +#if PRE_MC_1_20_1 +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +#else +import net.minecraft.client.gui.GuiGraphics; +#endif - -/** - * Creates a button with a texture on it - */ -// TODO: Is this still needed? Can we switch to vanilla's ImageButton? +#if PRE_MC_1_20_2 public class TexturedButtonWidget extends ImageButton +#else +public class TexturedButtonWidget extends Button +#endif { - #if POST_MC_1_17_1 - public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, ResourceLocation texture, OnPress pressAction) - { - super(x, y, width, height, u, v, texture, pressAction); - } - #endif + public final boolean renderBackground; - public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, ResourceLocation texture, int textureWidth, int textureHeight, OnPress pressAction) - { - super(x, y, width, height, u, v, hoveredVOffset, texture, textureWidth, textureHeight, pressAction); - } + #if POST_MC_1_20_2 + private final int u; + private final int v; + private final int hoveredVOffset; - public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, ResourceLocation texture, int textureWidth, int textureHeight, OnPress pressAction, Component text) + private final ResourceLocation texture; + + private final int textureWidth; + private final int textureHeight; + #endif + + + public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, ResourceLocation texture, int textureWidth, int textureHeight, OnPress pressAction, Component text) { + this(x, y, width, height, u, v, hoveredVOffset, texture, textureWidth, textureHeight, pressAction, text, true); + } + public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, ResourceLocation texture, int textureWidth, int textureHeight, OnPress pressAction, Component text, boolean renderBackground) { + #if PRE_MC_1_20_2 super(x, y, width, height, u, v, hoveredVOffset, texture, textureWidth, textureHeight, pressAction, text); - } - - #if PRE_MC_1_19_2 - public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, ResourceLocation texture, int textureWidth, int textureHeight, OnPress pressAction, OnTooltip tooltipSupplier, Component text) - { - super(x, y, width, height, u, v, hoveredVOffset, texture, textureWidth, textureHeight, pressAction, tooltipSupplier, text); - } - - @Override - public void renderButton(PoseStack matrices, int mouseX, int mouseY, float delta) - { - #if PRE_MC_1_17_1 - Minecraft.getInstance().getTextureManager().bind(WIDGETS_LOCATION); - RenderSystem.color4f(1.0F, 1.0F, 1.0F, this.alpha); - #else - RenderSystem.setShader(GameRenderer::getPositionTexShader); - RenderSystem.setShaderTexture(0, WIDGETS_LOCATION); - RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, this.alpha); - #endif - int i = this.getYImage(this.isHovered); - RenderSystem.enableBlend(); - RenderSystem.defaultBlendFunc(); - RenderSystem.enableDepthTest(); - this.blit(matrices, this.x, this.y, 0, 46 + i * 20, this.width / 2, this.height); - this.blit(matrices, this.x + this.width / 2, this.y, 200 - this.width / 2, 46 + i * 20, this.width / 2, this.height); + #else + // We don't pass on the text option as otherwise it will render (we normally pass it for narration) + // TODO: Find a fix for it + super(x, y, width, height, Component.empty(), pressAction, DEFAULT_NARRATION); + this.u = u; + this.v = v; + this.hoveredVOffset = hoveredVOffset; + + this.texture = texture; + + this.textureWidth = textureWidth; + this.textureHeight = textureHeight; + #endif + + this.renderBackground = renderBackground; + } + + #if PRE_MC_1_20_2 + #if PRE_MC_1_19_4 + @Override + public void renderButton(PoseStack matrices, int mouseX, int mouseY, float delta) { + if (this.renderBackground) // Renders the background of the button + { + #if PRE_MC_1_17_1 + Minecraft.getInstance().getTextureManager().bind(WIDGETS_LOCATION); + RenderSystem.color4f(1.0F, 1.0F, 1.0F, this.alpha); + #else + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderTexture(0, WIDGETS_LOCATION); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, this.alpha); + #endif + + int i = this.getYImage(this.isHovered); + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.enableDepthTest(); + #if PRE_MC_1_19_4 + this.blit(matrices, this.x, this.y, 0, 46 + i * 20, this.width / 2, this.height); + this.blit(matrices, this.x + this.width / 2, this.y, 200 - this.width / 2, 46 + i * 20, this.width / 2, this.height); + #else + this.blit(matrices, this.getX(), this.getY(), 0, 46 + i * 20, this.getWidth() / 2, this.getHeight()); + this.blit(matrices, this.getX() + this.getWidth() / 2, this.getY(), 200 - this.width / 2, 46 + i * 20, this.getWidth() / 2, this.getHeight()); + #endif + } + super.renderButton(matrices, mouseX, mouseY, delta); } + #else + #if PRE_MC_1_20_1 + @Override + public void renderWidget(PoseStack matrices, int mouseX, int mouseY, float delta) + { + RenderSystem.setShader(GameRenderer::getPositionTexShader); + RenderSystem.setShaderTexture(0, WIDGETS_LOCATION); + RenderSystem.setShaderColor(1.0F, 1.0F, 1.0F, this.alpha); + #else + @Override + public void renderWidget(GuiGraphics matrices, int mouseX, int mouseY, float delta) + { #endif + if (this.renderBackground) // Renders the background of the button + { + int i = 1; + if (!this.active) i = 0; + else if (this.isHovered) i = 2; + + #if PRE_MC_1_20_1 + RenderSystem.enableBlend(); + RenderSystem.defaultBlendFunc(); + RenderSystem.enableDepthTest(); + + this.blit(matrices, this.getX(), this.getY(), 0, 46 + i * 20, this.getWidth() / 2, this.getHeight()); + this.blit(matrices, this.getX() + this.getWidth() / 2, this.getY(), 200 - this.width / 2, 46 + i * 20, this.getWidth() / 2, this.getHeight()); + #else + matrices.blit(WIDGETS_LOCATION, this.getX(), this.getY(), 0, 46 + i * 20, this.getWidth() / 2, this.getHeight()); + matrices.blit(WIDGETS_LOCATION, this.getX() + this.getWidth() / 2, this.getY(), 200 - this.width / 2, 46 + i * 20, this.getWidth() / 2, this.getHeight()); + #endif + } + + super.renderWidget(matrices, mouseX, mouseY, delta); + } + #endif + #else + @Override + public void renderWidget(GuiGraphics matrices, int mouseX, int mouseY, float delta) + { + if (this.renderBackground) + { + //RenderSystem.enableBlend(); + //RenderSystem.enableDepthTest(); + matrices.blitSprite(SPRITES.get(this.active, this.isHoveredOrFocused()), this.getX(), this.getY(), this.getWidth(), this.getHeight()); + } + + + // Renders the sprite + int i = 0; + if (!this.active) i = 2; + else if (this.isHovered) i = 1; + + matrices.blit(this.texture, this.getX(), this.getY(), this.u, this.v + (this.hoveredVOffset * i), this.width, this.height, this.textureWidth, this.textureHeight); + } + #endif } 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 6d9c37cdb..5b1f6ba39 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 @@ -150,7 +150,11 @@ public class ChangelogScreen extends DhScreen public void render(GuiGraphics matrices, int mouseX, int mouseY, float delta) #endif { + #if MC_1_20_2 + this.renderBackground(matrices, mouseX, mouseY, delta); // Render background + #else this.renderBackground(matrices); // Render background + #endif if (!usable) return; diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/UpdateModScreen.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/UpdateModScreen.java index 8c126027d..608592901 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/UpdateModScreen.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/updater/UpdateModScreen.java @@ -77,7 +77,7 @@ public class UpdateModScreen extends DhScreen // Logo image - this.addBtn(new ImageButton( + this.addBtn(new TexturedButtonWidget( // Where the button is on the screen this.width / 2 - 65, this.height / 2 - 110, // Width and height of the button @@ -90,7 +90,9 @@ public class UpdateModScreen extends DhScreen // For now it goes to the client option by default (buttonWidget) -> System.out.println("Nice, you found an easter egg :)"), // TODO: Add a proper easter egg to pressing the logo (maybe with confetti) // Add a title to the button - Translatable(ModInfo.ID + ".updater.title") + Translatable(ModInfo.ID + ".updater.title"), + // Dont render the background of the button + false )); } catch (Exception e) @@ -151,7 +153,11 @@ public class UpdateModScreen extends DhScreen public void render(GuiGraphics matrices, int mouseX, int mouseY, float delta) #endif { + #if MC_1_20_2 + this.renderBackground(matrices, mouseX, mouseY, delta); // Render background + #else this.renderBackground(matrices); // Render background + #endif // Render the text's diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java index 66f901834..611172844 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java @@ -31,6 +31,7 @@ import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.enums.EDhDirection; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; @@ -211,9 +212,9 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra @Nullable @Override - public ILevelWrapper getWrappedClientWorld() + public IClientLevelWrapper getWrappedClientLevel() { - if (mc.level == null) + if (this.mc.level == null) { return null; } 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 6d433402f..2a91bc4e7 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 @@ -22,6 +22,7 @@ package com.seibel.distanthorizons.common.wrappers.minecraft; import java.awt.Color; import java.lang.invoke.MethodHandles; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; import java.util.stream.Collectors; @@ -35,14 +36,22 @@ import com.seibel.distanthorizons.core.pos.DhChunkPos; import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.render.DhApiRenderProxy; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper; #if PRE_MC_1_19_4 import com.mojang.math.Vector3f; #else +import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import org.joml.Vector3f; #endif +#if MC_1_20_2 +import net.minecraft.client.renderer.chunk.SectionRenderDispatcher; +#endif +import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import com.seibel.distanthorizons.coreapi.util.math.Mat4f; import com.seibel.distanthorizons.coreapi.util.math.Vec3d; import com.seibel.distanthorizons.coreapi.util.math.Vec3f; @@ -90,7 +99,11 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper private static final IOptifineAccessor OPTIFINE_ACCESSOR = ModAccessorInjector.INSTANCE.get(IOptifineAccessor.class); - public LightMapWrapper lightmap = null; + /** + * In the case of immersive portals multiple levels may be active at once, causing conflicting lightmaps.
+ * Requiring the use of multiple {@link LightMapWrapper}. + */ + public HashMap lightmapByLevelWrapper = new HashMap<>(); @@ -111,6 +124,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper } @Override + /** Unless you really need to know if the player is blind, use {@link MinecraftRenderWrapper#isFogStateSpecial()}/{@link IMinecraftRenderWrapper#isFogStateSpecial()} instead */ public boolean playerHasBlindingEffect() { return MC.player.getActiveEffectsMap().get(MobEffects.BLINDNESS) != null @@ -237,23 +251,17 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper return height; } - private RenderTarget getRenderTarget() - { - RenderTarget r = null; //MC.levelRenderer.getCloudsTarget(); - return r != null ? r : MC.getMainRenderTarget(); - } + private RenderTarget getRenderTarget() { return MC.getMainRenderTarget(); } @Override public int getTargetFrameBuffer() { - return getRenderTarget().frameBufferId; + int frameBufferOverrideId = DhApiRenderProxy.INSTANCE.targetFrameBufferOverride; + return (frameBufferOverrideId == -1) ? this.getRenderTarget().frameBufferId : frameBufferOverrideId; } @Override - public int getDepthTextureId() - { - return getRenderTarget().getDepthTextureId(); - } + public int getDepthTextureId() { return this.getRenderTarget().getDepthTextureId(); } @Override public int getTargetFrameBufferViewportWidth() @@ -294,6 +302,16 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper { try { + #if MC_1_20_2 + LevelRenderer levelRenderer = MC.levelRenderer; + Collection chunks = levelRenderer.visibleSections; + + return (chunks.stream().map((chunk) -> { + AABB chunkBoundingBox = chunk.getBoundingBox(); + return new DhChunkPos(Math.floorDiv((int) chunkBoundingBox.minX, 16), + Math.floorDiv((int) chunkBoundingBox.minZ, 16)); + }).collect(Collectors.toCollection(HashSet::new))); + #else LevelRenderer levelRenderer = MC.levelRenderer; Collection chunks = #if PRE_MC_1_18_2 levelRenderer.renderChunks; @@ -306,6 +324,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper return new DhChunkPos(Math.floorDiv((int) chunkBoundingBox.minX, 16), Math.floorDiv((int) chunkBoundingBox.minZ, 16)); }).collect(Collectors.toCollection(HashSet::new))); + #endif } catch (LinkageError e) { @@ -328,10 +347,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper } @Override - public ILightMapWrapper getLightmapWrapper() - { - return lightmap; - } + public ILightMapWrapper getLightmapWrapper(ILevelWrapper level) { return this.lightmapByLevelWrapper.get(level); } @Override public boolean isFogStateSpecial() @@ -340,24 +356,23 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper Camera camera = Minecraft.getInstance().gameRenderer.getMainCamera(); FluidState fluidState = camera.getFluidInCamera(); Entity entity = camera.getEntity(); - boolean isUnderWater = (entity instanceof LivingEntity) && ((LivingEntity)entity).hasEffect(MobEffects.BLINDNESS); - isUnderWater |= fluidState.is(FluidTags.WATER); - isUnderWater |= fluidState.is(FluidTags.LAVA); - return isUnderWater; + boolean isBlind = this.playerHasBlindingEffect(); + isBlind |= fluidState.is(FluidTags.WATER); + isBlind |= fluidState.is(FluidTags.LAVA); + return isBlind; #else - Entity entity = MC.gameRenderer.getMainCamera().getEntity(); - boolean isBlind = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS); + boolean isBlind = this.playerHasBlindingEffect(); return MC.gameRenderer.getMainCamera().getFluidInCamera() != FogType.NONE || isBlind; #endif } - public void updateLightmap(NativeImage lightPixels) + public void updateLightmap(NativeImage lightPixels, IClientLevelWrapper level) { - if (lightmap == null) + if (!this.lightmapByLevelWrapper.containsKey(level)) { - lightmap = new LightMapWrapper(); + this.lightmapByLevelWrapper.put(level, new LightMapWrapper()); } - lightmap.uploadLightmap(lightPixels); + this.lightmapByLevelWrapper.get(level).uploadLightmap(lightPixels); } } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/LightMapWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/LightMapWrapper.java index 568b87188..39d1f3e4a 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/LightMapWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/misc/LightMapWrapper.java @@ -61,7 +61,8 @@ public class LightMapWrapper implements ILightMapWrapper @Override public void bind() { - GL32.glBindTexture(GL32.GL_TEXTURE_2D, textureId); + GL32.glActiveTexture(GL32.GL_TEXTURE0); + GL32.glBindTexture(GL32.GL_TEXTURE_2D, this.textureId); } @Override diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java index 0cd35bbda..0c88bf752 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java @@ -17,6 +17,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrappe import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.IDimensionTypeWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; @@ -112,7 +113,7 @@ public class ClientLevelWrapper implements IClientLevelWrapper } @Override - public IDhApiDimensionTypeWrapper getDimensionType() { return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType()); } + public IDimensionTypeWrapper getDimensionType() { return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType()); } @Override public EDhApiLevelType getLevelType() { return EDhApiLevelType.CLIENT_LEVEL; } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java index 5d354a21c..b6fea22b8 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java @@ -140,7 +140,7 @@ public class ServerLevelWrapper implements IServerLevelWrapper public IChunkWrapper tryGetChunk(DhChunkPos pos) { if (!level.hasChunk(pos.x, pos.z)) return null; - ChunkAccess chunk = level.getChunk(pos.x, pos.z, ChunkStatus.EMPTY, false); + ChunkAccess chunk = level.getChunk(pos.x, pos.z, ChunkStatus.FULL, false); if (chunk == null) return null; return new ChunkWrapper(chunk, level, this); } diff --git a/common/src/main/resources/1_20_2.distanthorizons.accesswidener b/common/src/main/resources/1_20_2.distanthorizons.accesswidener new file mode 100644 index 000000000..c793fab68 --- /dev/null +++ b/common/src/main/resources/1_20_2.distanthorizons.accesswidener @@ -0,0 +1,39 @@ +accessWidener v1 named + +# used when determining where to save files to +accessible field net/minecraft/world/level/storage/DimensionDataStorage dataFolder Ljava/io/File; + +# used when rendering +accessible method net/minecraft/client/renderer/GameRenderer getFov (Lnet/minecraft/client/Camera;FZ)D + +# used for grabbing vanilla rendered chunks +accessible field net/minecraft/client/renderer/LevelRenderer visibleSections Lit/unimi/dsi/fastutil/objects/ObjectArrayList; + +#accessible method net/minecraft/client/renderer/LevelRenderer renderSectionLayer (Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V + +# world generation +# accessible method net/minecraft/world/level/lighting/LayerLightEngine queueSectionData (JLnet/minecraft/world/level/chunk/DataLayer;Z)V +accessible field net/minecraft/world/level/chunk/LevelChunk loaded Z +accessible field net/minecraft/world/level/lighting/LightEngine storage Lnet/minecraft/world/level/lighting/LayerLightSectionStorage; +accessible method net/minecraft/world/level/lighting/LayerLightSectionStorage lightOnInSection (J)Z + +# lod generation from save file +accessible field net/minecraft/world/level/chunk/storage/ChunkStorage worker Lnet/minecraft/world/level/chunk/storage/IOWorker; +accessible field net/minecraft/world/level/chunk/storage/IOWorker storage Lnet/minecraft/world/level/chunk/storage/RegionFileStorage; +accessible field net/minecraft/world/level/chunk/storage/RegionFileStorage regionCache Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap; +accessible field net/minecraft/world/level/chunk/storage/RegionFileStorage folder Ljava/nio/file/Path; + +# grabbing textures +accessible class net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture +accessible method net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture getFrameX (I)I +accessible method net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture getFrameY (I)I +accessible field net/minecraft/client/renderer/texture/SpriteContents animatedTexture Lnet/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture; +accessible field net/minecraft/client/renderer/texture/SpriteContents originalImage Lcom/mojang/blaze3d/platform/NativeImage; + +# UI stuff +accessible field net/minecraft/client/gui/components/AbstractButton SPRITES Lnet/minecraft/client/gui/components/WidgetSprites; + +# hacky stuff +accessible field net/minecraft/util/ThreadingDetector lock Ljava/util/concurrent/Semaphore; +mutable field net/minecraft/util/ThreadingDetector lock Ljava/util/concurrent/Semaphore; +accessible field net/minecraft/client/gui/components/AbstractSelectionList scrollAmount D # Hack to bypass vanilla's setScrollAmount's clamp diff --git a/coreSubProjects b/coreSubProjects index e9e7ac48b..596b822a5 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit e9e7ac48b198ba01e95a2f509ca2f463243879b6 +Subproject commit 596b822a5d54163ae1b2b51ce192d358c26b3b25 diff --git a/fabric/build.gradle b/fabric/build.gradle index c1fa69ff5..59c2f3036 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -14,13 +14,13 @@ loom { client() setConfigName("Fabric Client") ideConfigGenerated(true) - runDir("run/client") + runDir("../run/client") } server { server() setConfigName("Fabric Server") ideConfigGenerated(true) - runDir("run/server") + runDir("../run/server") } } } @@ -131,7 +131,7 @@ processResources { runClient { dependsOn(copyCoreResources) dependsOn(copyCommonLoaderResources) - jvmArgs("-XX:-OmitStackTraceInFastThrow") + jvmArgs([ "-XX:-OmitStackTraceInFastThrow", minecraftMemoryJavaArg ]) finalizedBy(deleteResources) } 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 924c8fefd..e404060d5 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java @@ -25,6 +25,7 @@ import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.core.api.internal.ClientApi; +import com.seibel.distanthorizons.core.api.internal.SharedApi; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; @@ -89,13 +90,11 @@ public class FabricClientProxy LOGGER.info("Registering Fabric Client Events"); - //========================// // register mod accessors // //========================// SodiumAccessor sodiumAccessor = (SodiumAccessor) ModAccessorInjector.INSTANCE.get(ISodiumAccessor.class); - //ImmersivePortalsAccessor immersivePortalsAccessor = (ImmersivePortalsAccessor) ModAccessorInjector.INSTANCE.get(IImmersivePortalsAccessor.class); @@ -115,7 +114,7 @@ public class FabricClientProxy ClientChunkEvents.CHUNK_LOAD.register((level, chunk) -> { IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper(level); - ClientApi.INSTANCE.clientChunkLoadEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel); + SharedApi.INSTANCE.chunkLoadEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel); }); // (kinda) block break event @@ -131,7 +130,7 @@ public class FabricClientProxy LOGGER.trace("attack block at blockPos: " + blockPos); IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) level); - ClientApi.INSTANCE.clientChunkBlockChangedEvent( + SharedApi.INSTANCE.chunkBlockChangedEvent( new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel ); @@ -158,7 +157,7 @@ public class FabricClientProxy LOGGER.trace("use block at blockPos: " + hitResult.getBlockPos()); IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) level); - ClientApi.INSTANCE.clientChunkBlockChangedEvent( + SharedApi.INSTANCE.chunkBlockChangedEvent( new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel ); @@ -175,7 +174,7 @@ public class FabricClientProxy ClientChunkEvents.CHUNK_UNLOAD.register((level, chunk) -> { IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper(level); - ClientApi.INSTANCE.clientChunkSaveEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel); + SharedApi.INSTANCE.chunkSaveEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel); }); @@ -183,8 +182,9 @@ public class FabricClientProxy //==============// // render event // //==============// - - + + //Define this in the MixinLevelRenderer so that it works with sodium without any changes to the code + // TODO: If all else is fine, can we remove these commented code // Client Render Level WorldRenderEvents.AFTER_SETUP.register((renderContext) -> { @@ -207,13 +207,8 @@ public class FabricClientProxy renderContext.projectionMatrix().set(matrixFloatArray); #endif } - - //if (immersivePortalsAccessor != null) - //{ - // immersivePortalsAccessor.partialTicks = renderContext.tickDelta(); - //} }); - + // Debug keyboard event // FIXME: Use better hooks so it doesn't trigger key press events in text boxes ClientTickEvents.END_CLIENT_TICK.register(client -> diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientLevel.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientLevel.java index 7f7836bd1..4343c34a7 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientLevel.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientLevel.java @@ -22,6 +22,7 @@ package com.seibel.distanthorizons.fabric.mixins.client; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.core.api.internal.ClientApi; +import com.seibel.distanthorizons.core.api.internal.SharedApi; import net.minecraft.client.multiplayer.ClientLevel; #if POST_MC_1_18_2 #endif @@ -59,7 +60,7 @@ public class MixinClientLevel if (chunk != null && !chunk.isClientLightReady()) { - ClientApi.INSTANCE.clientChunkLoadEvent(new ChunkWrapper(chunk, clientLevel, ClientLevelWrapper.getWrapper(clientLevel)), ClientLevelWrapper.getWrapper(clientLevel)); + SharedApi.INSTANCE.chunkLoadEvent(new ChunkWrapper(chunk, clientLevel, ClientLevelWrapper.getWrapper(clientLevel)), ClientLevelWrapper.getWrapper(clientLevel)); } } #endif diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientPacketListener.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientPacketListener.java index bb18f3744..a38e84d1f 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientPacketListener.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientPacketListener.java @@ -2,6 +2,7 @@ package com.seibel.distanthorizons.fabric.mixins.client; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.core.api.internal.ClientApi; +import com.seibel.distanthorizons.core.api.internal.SharedApi; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientPacketListener; import org.spongepowered.asm.mixin.Mixin; @@ -57,7 +58,7 @@ public class MixinClientPacketListener void onEnableChunkLight(LevelChunk chunk, int x, int z, CallbackInfo ci) { IClientLevelWrapper clientLevel = ClientLevelWrapper.getWrapper((ClientLevel) chunk.getLevel()); - ClientApi.INSTANCE.clientChunkLoadEvent(new ChunkWrapper(chunk, chunk.getLevel(), clientLevel), clientLevel); + SharedApi.INSTANCE.chunkLoadEvent(new ChunkWrapper(chunk, chunk.getLevel(), clientLevel), clientLevel); } #endif diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinFogRenderer.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinFogRenderer.java index b498e5785..ead892c02 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinFogRenderer.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinFogRenderer.java @@ -68,7 +68,7 @@ public class MixinFogRenderer Entity entity = camera.getEntity(); boolean isSpecialFog = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS); if (!isSpecialFog && cameraNotInFluid && fogMode == FogMode.FOG_TERRAIN - && !SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class).playerHasBlindingEffect() + && !SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class).isFogStateSpecial() && Config.Client.Advanced.Graphics.Fog.disableVanillaFog.get()) { #if PRE_MC_1_17_1 diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java index 12bc8d7b6..5c687cd4e 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLevelRenderer.java @@ -94,11 +94,16 @@ public class MixinLevelRenderer 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) - #else + #elif PRE_MC_1_20_2 @Inject(at = @At("HEAD"), method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V", cancellable = true) private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback) + #else + @Inject(at = @At("HEAD"), + method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V", + cancellable = true) + private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo callback) #endif { // FIXME completely disables rendering when sodium is installed diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightmap.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightmap.java index 5d37d1d86..e6d886dee 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightmap.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightmap.java @@ -3,6 +3,10 @@ package com.seibel.distanthorizons.fabric.mixins.client; import com.mojang.blaze3d.platform.NativeImage; 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.world.IClientLevelWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import net.minecraft.client.renderer.LightTexture; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -16,15 +20,19 @@ public class MixinLightmap { @Shadow @Final - public NativeImage lightPixels; + private NativeImage lightPixels; @Inject(method = "updateLightTexture", at = @At( value = "INVOKE", target = "Lnet/minecraft/client/renderer/texture/DynamicTexture;upload()V")) public void updateLightTexture(float f, CallbackInfo ci) { + // since the light map is always updated on the client render thread we should be able to access the client level at the same time + IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); + IClientLevelWrapper clientLevel = mc.getWrappedClientLevel(); + //ApiShared.LOGGER.info("Lightmap update"); - MinecraftRenderWrapper.INSTANCE.updateLightmap(lightPixels); + MinecraftRenderWrapper.INSTANCE.updateLightmap(this.lightPixels, clientLevel); } } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinMinecraft.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinMinecraft.java index 72e46737d..92d79850a 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinMinecraft.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinMinecraft.java @@ -25,16 +25,17 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Minecraft.class) public class MixinMinecraft { - #if PRE_MC_1_20_1 + #if PRE_MC_1_20_2 + #if MC_1_20_1 @Redirect( - method = "(Lnet/minecraft/client/main/GameConfig;)V", + method = "Lnet/minecraft/client/Minecraft;setInitialScreen(Lcom/mojang/realmsclient/client/RealmsClient;Lnet/minecraft/server/packs/resources/ReloadInstance;Lnet/minecraft/client/main/GameConfig$QuickPlayData;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V") ) public void onOpenScreen(Minecraft instance, Screen guiScreen) { #else @Redirect( - method = "Lnet/minecraft/client/Minecraft;setInitialScreen(Lcom/mojang/realmsclient/client/RealmsClient;Lnet/minecraft/server/packs/resources/ReloadInstance;Lnet/minecraft/client/main/GameConfig$QuickPlayData;)V", + method = "(Lnet/minecraft/client/main/GameConfig;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V") ) public void onOpenScreen(Minecraft instance, Screen guiScreen) @@ -58,6 +59,32 @@ public class MixinMinecraft instance.setScreen(guiScreen); // Sets the screen back to the vanilla screen as if nothing ever happened } } + #endif + + #if POST_MC_1_20_2 + @Redirect( + method = "Lnet/minecraft/client/Minecraft;onGameLoadFinished(Lnet/minecraft/client/Minecraft$GameLoadCookie;)V", + at = @At(value = "INVOKE", target = "Ljava/lang/Runnable;run()V") + ) + private void buildInitialScreens(Runnable runnable) + { + if ( + Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get() // Don't do anything if the user doesn't want it + && SelfUpdater.onStart() + ) + { + runnable = () -> { + Minecraft.getInstance().setScreen(new UpdateModScreen( + // TODO: Change to runnable, instead of tittle screen + new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons + (Config.Client.Advanced.AutoUpdater.updateBranch.get() == EUpdateBranch.STABLE ? ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()) : GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha")) + )); + }; + } + + runnable.run(); + } + #endif @Inject(at = @At("HEAD"), method = "close()V") public void close(CallbackInfo ci) { SelfUpdater.onClose(); } diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index 7110f74ca..2ffe2d3cc 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -2,6 +2,9 @@ "schemaVersion": 1, "id": "distanthorizons", "version": "${version}", + + "provides": [ "lod" ], + "name": "${mod_name}", "description": "${description}", diff --git a/forge/build.gradle b/forge/build.gradle index bc3dc25c3..2a2753f91 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -35,14 +35,14 @@ loom { client() setConfigName("Forge Client") ideConfigGenerated(true) - runDir("run") + runDir("../run") vmArgs("-XX:-OmitStackTraceInFastThrow", minecraftMemoryJavaArg) } server { server() setConfigName("Forge Server") ideConfigGenerated(true) - runDir("run") + runDir("../run") } } } diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java index c13e7a704..3bce0aa40 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java @@ -19,44 +19,36 @@ package com.seibel.distanthorizons.forge; +import com.seibel.distanthorizons.common.util.ProxyUtil; +import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.core.api.internal.ClientApi; +import com.seibel.distanthorizons.core.api.internal.SharedApi; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; - import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import com.seibel.distanthorizons.coreapi.ModInfo; import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.LevelAccessor; - -import net.minecraft.client.multiplayer.ClientLevel; -#if PRE_MC_1_19_2 -import net.minecraftforge.event.world.ChunkEvent; -import net.minecraftforge.event.world.WorldEvent; -#else +import net.minecraft.world.level.chunk.ChunkAccess; +import net.minecraftforge.client.event.InputEvent; +import net.minecraftforge.event.TickEvent; +import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.level.ChunkEvent; import net.minecraftforge.event.level.LevelEvent; -#endif - -import net.minecraftforge.event.entity.player.PlayerInteractEvent; -import net.minecraft.world.level.chunk.ChunkAccess; - +import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.network.NetworkRegistry; import net.minecraftforge.network.simple.SimpleChannel; import org.apache.logging.log4j.Logger; import org.lwjgl.glfw.GLFW; -import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; - -import net.minecraft.client.Minecraft; -import net.minecraftforge.client.event.InputEvent; -import net.minecraftforge.event.TickEvent; -import net.minecraftforge.eventbus.api.SubscribeEvent; - /** * This handles all events sent to the client, * and is the starting point for most of the mod. @@ -73,9 +65,9 @@ public class ForgeClientProxy #if PRE_MC_1_19_2 - private static LevelAccessor GetLevel(WorldEvent e) { return e.getWorld(); } + private static LevelAccessor GetEventLevel(WorldEvent e) { return e.getWorld(); } #else - private static LevelAccessor GetLevel(LevelEvent e) { return e.getLevel(); } + private static LevelAccessor GetEventLevel(LevelEvent e) { return e.getLevel(); } #endif @@ -165,7 +157,7 @@ public class ForgeClientProxy #endif ChunkAccess chunk = level.getChunk(event.getPos()); - this.onClientBlockChangeEvent(level, chunk); + this.onBlockChangeEvent(level, chunk); } @SubscribeEvent public void leftClickBlockEvent(PlayerInteractEvent.LeftClickBlock event) @@ -179,43 +171,28 @@ public class ForgeClientProxy #endif ChunkAccess chunk = level.getChunk(event.getPos()); - this.onClientBlockChangeEvent(level, chunk); + this.onBlockChangeEvent(level, chunk); } - private void onClientBlockChangeEvent(LevelAccessor level, ChunkAccess chunk) + private void onBlockChangeEvent(LevelAccessor level, ChunkAccess chunk) { - // TODO rate limit this event per blockPos to prevent spam - - // if we have access to the server, use the chunk save event instead - if (MC.clientConnectedToDedicatedServer()) - { - if (chunk != null) - { - IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) level); - ClientApi.INSTANCE.clientChunkBlockChangedEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel); - } - } + ILevelWrapper wrappedLevel = ProxyUtil.getLevelWrapper(level); + SharedApi.INSTANCE.chunkBlockChangedEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel); } @SubscribeEvent public void clientChunkLoadEvent(ChunkEvent.Load event) { - if (GetLevel(event) instanceof ClientLevel) - { - IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) GetLevel(event)); - IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetLevel(event), wrappedLevel); - ClientApi.INSTANCE.clientChunkLoadEvent(chunk, ClientLevelWrapper.getWrapper((ClientLevel) GetLevel(event))); - } + ILevelWrapper wrappedLevel = ProxyUtil.getLevelWrapper(GetEventLevel(event)); + IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), wrappedLevel); + SharedApi.INSTANCE.chunkLoadEvent(chunk, wrappedLevel); } @SubscribeEvent public void clientChunkUnloadEvent(ChunkEvent.Unload event) { - if (GetLevel(event) instanceof ClientLevel) - { - IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) GetLevel(event)); - IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetLevel(event), wrappedLevel); - ClientApi.INSTANCE.clientChunkSaveEvent(chunk, ClientLevelWrapper.getWrapper((ClientLevel) GetLevel(event))); - } + ILevelWrapper wrappedLevel = ProxyUtil.getLevelWrapper(GetEventLevel(event)); + IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), wrappedLevel); + SharedApi.INSTANCE.chunkSaveEvent(chunk, wrappedLevel); } diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java index ec2bb59f8..46d2f5c6a 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java @@ -1,14 +1,17 @@ package com.seibel.distanthorizons.forge; +import com.seibel.distanthorizons.common.util.ProxyUtil; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; +import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper; import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment; import com.seibel.distanthorizons.core.api.internal.ServerApi; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.TitleScreen; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraftforge.event.TickEvent; #if PRE_MC_1_19_2 @@ -39,9 +42,9 @@ import java.util.function.Supplier; public class ForgeServerProxy { #if PRE_MC_1_19_2 - private static LevelAccessor GetLevel(WorldEvent e) { return e.getWorld(); } + private static LevelAccessor GetEventLevel(WorldEvent e) { return e.getWorld(); } #else - private static LevelAccessor GetLevel(LevelEvent e) { return e.getLevel(); } + private static LevelAccessor GetEventLevel(LevelEvent e) { return e.getLevel(); } #endif private final ServerApi serverApi = ServerApi.INSTANCE; @@ -49,34 +52,30 @@ public class ForgeServerProxy private final boolean isDedicated; public static Supplier isGenerationThreadChecker = null; + + //=============// + // constructor // + //=============// + public ForgeServerProxy(boolean isDedicated) { this.isDedicated = isDedicated; isGenerationThreadChecker = BatchGenerationEnvironment::isCurrentThreadDistantGeneratorThread; } - private boolean isValidTime() - { - if (this.isDedicated) - { - return true; - } - - //FIXME: This may cause init issue... - return !(Minecraft.getInstance().screen instanceof TitleScreen); - } - private ServerLevelWrapper getLevelWrapper(ServerLevel level) { return ServerLevelWrapper.getWrapper(level); } + + //========// + // events // + //========// + // ServerTickEvent (at end) @SubscribeEvent public void serverTickEvent(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.END) { - if (this.isValidTime()) - { - this.serverApi.serverTickEvent(); - } + this.serverApi.serverTickEvent(); } } @@ -84,20 +83,14 @@ public class ForgeServerProxy @SubscribeEvent public void dedicatedWorldLoadEvent(#if MC_1_16_5 || MC_1_17_1 FMLServerAboutToStartEvent #else ServerAboutToStartEvent #endif event) { - if (this.isValidTime()) - { - this.serverApi.serverLoadEvent(this.isDedicated); - } + this.serverApi.serverLoadEvent(this.isDedicated); } // ServerWorldUnloadEvent @SubscribeEvent public void serverWorldUnloadEvent(#if MC_1_16_5 || MC_1_17_1 FMLServerStoppingEvent #else ServerStoppingEvent #endif event) { - if (this.isValidTime()) - { - this.serverApi.serverUnloadEvent(); - } + this.serverApi.serverUnloadEvent(); } // ServerLevelLoadEvent @@ -108,12 +101,9 @@ public class ForgeServerProxy public void serverLevelLoadEvent(LevelEvent.Load event) #endif { - if (isValidTime()) + if (GetEventLevel(event) instanceof ServerLevel) { - if (GetLevel(event) instanceof ServerLevel) - { - serverApi.serverLevelLoadEvent(getLevelWrapper((ServerLevel) GetLevel(event))); - } + this.serverApi.serverLevelLoadEvent(this.getServerLevelWrapper((ServerLevel) GetEventLevel(event))); } } @@ -125,40 +115,36 @@ public class ForgeServerProxy public void serverLevelUnloadEvent(LevelEvent.Unload event) #endif { - if (isValidTime()) + if (GetEventLevel(event) instanceof ServerLevel) { - if (GetLevel(event) instanceof ServerLevel) - { - serverApi.serverLevelUnloadEvent(getLevelWrapper((ServerLevel) GetLevel(event))); - } + this.serverApi.serverLevelUnloadEvent(this.getServerLevelWrapper((ServerLevel) GetEventLevel(event))); } } @SubscribeEvent public void serverChunkLoadEvent(ChunkEvent.Load event) { - if (this.isValidTime()) - { - if (GetLevel(event) instanceof ServerLevel) - { - ServerLevelWrapper wrappedLevel = ServerLevelWrapper.getWrapper((ServerLevel) GetLevel(event)); - IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetLevel(event), wrappedLevel); - this.serverApi.serverChunkLoadEvent(chunk, this.getLevelWrapper((ServerLevel) GetLevel(event))); - } - } + ILevelWrapper levelWrapper = ProxyUtil.getLevelWrapper(GetEventLevel(event)); + + IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), levelWrapper); + this.serverApi.serverChunkLoadEvent(chunk, levelWrapper); } @SubscribeEvent public void serverChunkSaveEvent(ChunkEvent.Unload event) { - if (this.isValidTime()) - { - if (GetLevel(event) instanceof ServerLevel) - { - ServerLevelWrapper wrappedLevel = ServerLevelWrapper.getWrapper((ServerLevel) GetLevel(event)); - IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetLevel(event), wrappedLevel); - this.serverApi.serverChunkSaveEvent(chunk, this.getLevelWrapper((ServerLevel) GetLevel(event))); - } - } + ILevelWrapper levelWrapper = ProxyUtil.getLevelWrapper(GetEventLevel(event)); + + IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), levelWrapper); + this.serverApi.serverChunkSaveEvent(chunk, levelWrapper); } + + + //================// + // helper methods // + //================// + + private static ServerLevelWrapper getServerLevelWrapper(ServerLevel level) { return ServerLevelWrapper.getWrapper(level); } + + } diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinFogRenderer.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinFogRenderer.java index 5e1d20f92..597a9850b 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinFogRenderer.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinFogRenderer.java @@ -68,7 +68,7 @@ public class MixinFogRenderer Entity entity = camera.getEntity(); boolean isSpecialFog = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS); if (!isSpecialFog && cameraNotInFluid && fogMode == FogMode.FOG_TERRAIN - && !SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class).playerHasBlindingEffect() + && !SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class).isFogStateSpecial() && Config.Client.Advanced.Graphics.Fog.disableVanillaFog.get()) { #if PRE_MC_1_17_1 diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLevelRenderer.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLevelRenderer.java index 41b02909c..2239adb4f 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLevelRenderer.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLevelRenderer.java @@ -109,11 +109,16 @@ public class MixinLevelRenderer 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) - #else + #elif PRE_MC_1_20_2 @Inject(at = @At("HEAD"), method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V", cancellable = true) private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback) + #else + @Inject(at = @At("HEAD"), + method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V", + cancellable = true) + private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo callback) #endif { // get MC's model view and projection matrices diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLightmap.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLightmap.java index ba7955ef5..c2b2bb9d4 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLightmap.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinLightmap.java @@ -3,6 +3,10 @@ package com.seibel.distanthorizons.forge.mixins.client; import com.mojang.blaze3d.platform.NativeImage; 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.world.IClientLevelWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import net.minecraft.client.renderer.LightTexture; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -16,15 +20,19 @@ public class MixinLightmap { @Shadow @Final - public NativeImage lightPixels; + private NativeImage lightPixels; @Inject(method = "updateLightTexture", at = @At( value = "INVOKE", target = "Lnet/minecraft/client/renderer/texture/DynamicTexture;upload()V")) public void updateLightTexture(float f, CallbackInfo ci) { + // since the light map is always updated on the client render thread we should be able to access the client level at the same time + IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); + IClientLevelWrapper clientLevel = mc.getWrappedClientLevel(); + //ApiShared.LOGGER.info("Lightmap update"); - MinecraftRenderWrapper.INSTANCE.updateLightmap(lightPixels); + MinecraftRenderWrapper.INSTANCE.updateLightmap(this.lightPixels, clientLevel); } } diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinMinecraft.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinMinecraft.java index 40c17ce04..1aaa81bf7 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinMinecraft.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinMinecraft.java @@ -25,16 +25,17 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(Minecraft.class) public class MixinMinecraft { - #if PRE_MC_1_20 + #if PRE_MC_1_20_2 + #if MC_1_20_1 @Redirect( - method = "(Lnet/minecraft/client/main/GameConfig;)V", + method = "Lnet/minecraft/client/Minecraft;setInitialScreen(Lcom/mojang/realmsclient/client/RealmsClient;Lnet/minecraft/server/packs/resources/ReloadInstance;Lnet/minecraft/client/main/GameConfig$QuickPlayData;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V") ) public void onOpenScreen(Minecraft instance, Screen guiScreen) { #else @Redirect( - method = "Lnet/minecraft/client/Minecraft;setInitialScreen(Lcom/mojang/realmsclient/client/RealmsClient;Lnet/minecraft/server/packs/resources/ReloadInstance;Lnet/minecraft/client/main/GameConfig$QuickPlayData;)V", + method = "(Lnet/minecraft/client/main/GameConfig;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Minecraft;setScreen(Lnet/minecraft/client/gui/screens/Screen;)V") ) public void onOpenScreen(Minecraft instance, Screen guiScreen) @@ -58,6 +59,32 @@ public class MixinMinecraft instance.setScreen(guiScreen); // Sets the screen back to the vanilla screen as if nothing ever happened } } + #endif + + #if POST_MC_1_20_2 + @Redirect( + method = "Lnet/minecraft/client/Minecraft;onGameLoadFinished(Lnet/minecraft/client/Minecraft$GameLoadCookie;)V", + at = @At(value = "INVOKE", target = "Ljava/lang/Runnable;run()V") + ) + private void buildInitialScreens(Runnable runnable) + { + if ( + Config.Client.Advanced.AutoUpdater.enableAutoUpdater.get() // Don't do anything if the user doesn't want it + && SelfUpdater.onStart() + ) + { + runnable = () -> { + Minecraft.getInstance().setScreen(new UpdateModScreen( + // TODO: Change to runnable, instead of tittle screen + new TitleScreen(false), // We don't want to use the vanilla title screen as it would fade the buttons + (Config.Client.Advanced.AutoUpdater.updateBranch.get() == EUpdateBranch.STABLE ? ModrinthGetter.getLatestIDForVersion(SingletonInjector.INSTANCE.get(IVersionConstants.class).getMinecraftVersion()) : GitlabGetter.INSTANCE.projectPipelines.get(0).get("sha")) + )); + }; + } + + runnable.run(); + } + #endif @Inject(at = @At("HEAD"), method = "close()V", remap = false) public void close(CallbackInfo ci) diff --git a/gradle.properties b/gradle.properties index 26d5f0d2e..b0ac53b24 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,12 +18,12 @@ mod_issues=https://gitlab.com/jeseibel/minecraft-lod-mod/-/issues mod_discord=https://discord.gg/xAB8G4cENx # Global Plugin Versions -manifold_version=2023.1.26 +manifold_version=2023.1.28 toml_version=3.6.4 lz4_version=1.8.0 nightconfig_version=3.6.6 -flatlaf_version=3.0 -svgSalamander_version=1.1.3 +sqlite_jdbc_version=3.43.0.0 +#svgSalamander_version=1.1.3 log4j_version=2.20.0 netty_version=4.1.94.Final diff --git a/versionProperties/1.20.2.properties b/versionProperties/1.20.2.properties new file mode 100644 index 000000000..553df7436 --- /dev/null +++ b/versionProperties/1.20.2.properties @@ -0,0 +1,51 @@ +# 1.20.2 version +java_version=17 +minecraft_version=1.20.2 +parchment_version=1.19.3:2023.06.25 +compatible_minecraft_versions=["1.20.2"] +accessWidenerVersion=1_20_2 +builds_for=fabric,forge + +# Fabric loader +fabric_loader_version=0.14.22 +fabric_api_version=0.89.2+1.20.2 + # Fabric mod versions + modmenu_version=8.0.0 + starlight_version_fabric= + phosphor_version_fabric= + lithium_version= + sodium_version=mc1.20.2-0.5.3 + iris_version=1.6.9+1.20.2 + bclib_version=3.0.13 + immersive_portals_version= + canvas_version= + + fabric_incompatibility_list={ } + fabric_recommend_list={ "indium": "*" } + + # 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=1 + enable_immersive_portals=0 + enable_canvas=0 + +# Forge loader +forge_version=48.0.13 + # Forge mod versions + starlight_version_forge= + terraforged_version= + + # 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