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