From b737adc3da3252b92bf0b4eb77de1e410ccc95ed Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 30 Jun 2024 16:36:49 -0500 Subject: [PATCH 01/52] Up API version 2.1.0 -> 3.0.0 --- .../common/wrappers/McObjectConverter.java | 2 +- .../wrappers/minecraft/MinecraftRenderWrapper.java | 10 +++------- coreSubProjects | 2 +- .../distanthorizons/fabric/FabricClientProxy.java | 5 +---- .../fabric/mixins/client/MixinLevelRenderer.java | 8 +------- .../fabric/wrappers/modAccessor/SodiumAccessor.java | 2 +- .../forge/mixins/client/MixinLevelRenderer.java | 7 +------ gradle.properties | 2 +- 8 files changed, 10 insertions(+), 28 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/McObjectConverter.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/McObjectConverter.java index ebcab8af8..e475dbc69 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/McObjectConverter.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/McObjectConverter.java @@ -26,7 +26,7 @@ import java.util.function.Consumer; import com.seibel.distanthorizons.core.enums.EDhDirection; import com.seibel.distanthorizons.core.pos.DhBlockPos; import com.seibel.distanthorizons.core.pos.DhChunkPos; -import com.seibel.distanthorizons.coreapi.util.math.Mat4f; +import com.seibel.distanthorizons.core.util.math.Mat4f; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; 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 e0ffe856e..47dc0eb11 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 @@ -21,9 +21,7 @@ package com.seibel.distanthorizons.common.wrappers.minecraft; import java.awt.Color; import java.lang.invoke.MethodHandles; -import java.nio.FloatBuffer; import java.util.Collection; -import java.util.HashMap; import java.util.HashSet; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; @@ -38,7 +36,6 @@ 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 MC_VER < MC_1_19_4 @@ -55,9 +52,9 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOpt import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IDimensionTypeWrapper; 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; +import com.seibel.distanthorizons.core.util.math.Mat4f; +import com.seibel.distanthorizons.core.util.math.Vec3d; +import com.seibel.distanthorizons.core.util.math.Vec3f; import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IOptifineAccessor; @@ -81,7 +78,6 @@ import net.minecraft.world.level.material.FogType; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import org.apache.logging.log4j.Logger; -import org.joml.Matrix4f; /** diff --git a/coreSubProjects b/coreSubProjects index 321afa2a9..6c8060fa8 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 321afa2a9ee8cdaa8da8ff8b21d5120d7ab5e08d +Subproject commit 6c8060fa87268ba04011c6a6703d694e8b6722f9 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 71e35cd76..4dba8bc4f 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java @@ -29,16 +29,13 @@ import com.mojang.blaze3d.platform.InputConstants; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; 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; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; -import com.seibel.distanthorizons.core.pos.DhBlockPos; -import com.seibel.distanthorizons.core.pos.DhChunkPos; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ISodiumAccessor; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; -import com.seibel.distanthorizons.coreapi.util.math.Mat4f; +import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.fabric.wrappers.modAccessor.SodiumAccessor; //import io.netty.buffer.ByteBuf; import net.fabricmc.api.EnvType; 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 12bbb0421..97a3d8dc4 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 @@ -29,23 +29,17 @@ import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.core.api.internal.ClientApi; -import com.seibel.distanthorizons.coreapi.util.math.Mat4f; +import com.seibel.distanthorizons.core.util.math.Mat4f; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LightTexture; import com.seibel.distanthorizons.core.config.Config; -import net.minecraft.client.Camera; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.RenderType; -import net.minecraft.world.level.lighting.LevelLightEngine; -import org.lwjgl.opengl.GL15; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/wrappers/modAccessor/SodiumAccessor.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/wrappers/modAccessor/SodiumAccessor.java index 7145d673a..bb4764c25 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/wrappers/modAccessor/SodiumAccessor.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/wrappers/modAccessor/SodiumAccessor.java @@ -24,7 +24,7 @@ import java.util.stream.Collectors; import com.seibel.distanthorizons.core.pos.DhChunkPos; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; -import com.seibel.distanthorizons.coreapi.util.math.Mat4f; +import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.wrapperInterfaces.IWrapperFactory; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ISodiumAccessor; 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 9eb2d9394..95708fd3b 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 @@ -34,13 +34,9 @@ import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.api.internal.ClientApi; -import com.seibel.distanthorizons.coreapi.util.math.Mat4f; -import net.minecraft.client.Camera; -import net.minecraft.client.Minecraft; +import com.seibel.distanthorizons.core.util.math.Mat4f; import net.minecraft.client.multiplayer.ClientLevel; -import net.minecraft.client.renderer.GameRenderer; import net.minecraft.client.renderer.LevelRenderer; -import net.minecraft.client.renderer.LightTexture; import net.minecraft.client.renderer.RenderType; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -50,7 +46,6 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import javax.annotation.Nullable; -import java.nio.FloatBuffer; #if MC_VER < MC_1_17_1 import org.lwjgl.opengl.GL15; diff --git a/gradle.properties b/gradle.properties index ece9015a4..cc28ca70f 100644 --- a/gradle.properties +++ b/gradle.properties @@ -6,7 +6,7 @@ org.gradle.caching=true # Mod Info mod_name=DistantHorizons mod_version=2.1.3-a-dev -api_version=2.1.0 +api_version=3.0.0 maven_group=com.seibel.distanthorizons mod_readable_name=Distant Horizons mod_description=This mod generates and renders simplified terrain beyond the normal view distance at a low performance cost. Allowing you to see much farther without turning your game into a slideshow. From 5516603a0cb636d1c38e6f952def44e395a9e85d Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 30 Jun 2024 18:08:55 -0500 Subject: [PATCH 02/52] Add temporary proof-of-concept beacon rendering --- coreSubProjects | 2 +- .../seibel/distanthorizons/neoforge/NeoforgeClientProxy.java | 3 +-- .../neoforge/mixins/client/MixinLevelRenderer.java | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/coreSubProjects b/coreSubProjects index 6c8060fa8..51de347bd 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 6c8060fa87268ba04011c6a6703d694e8b6722f9 +Subproject commit 51de347bdd4b23c6ca14e801f27daa0de8755217 diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java index cc53ba527..de73b4031 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java @@ -28,14 +28,13 @@ 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.util.math.Mat4f; 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 com.seibel.distanthorizons.coreapi.util.math.Mat4f; import net.minecraft.world.level.LevelAccessor; import net.minecraft.client.multiplayer.ClientLevel; diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java index 8c3c0506c..93e1a06a7 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLevelRenderer.java @@ -24,6 +24,7 @@ import com.mojang.blaze3d.vertex.PoseStack; #if MC_VER < MC_1_19_4 import com.mojang.math.Matrix4f; #else +import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.neoforge.NeoforgeClientProxy; import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; @@ -36,7 +37,6 @@ import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.api.internal.ClientApi; -import com.seibel.distanthorizons.coreapi.util.math.Mat4f; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.RenderType; From 469d2bdcb71c91229e2570fffe0d40d1984643db Mon Sep 17 00:00:00 2001 From: James Seibel Date: Tue, 2 Jul 2024 17:51:26 -0500 Subject: [PATCH 03/52] Add improved beacon logic --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 51de347bd..e90c7cd8a 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 51de347bdd4b23c6ca14e801f27daa0de8755217 +Subproject commit e90c7cd8a01d9687abb854cec7066119aefd4b79 From d26327a93033e6823f456eeae807a2c7632edc33 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Wed, 3 Jul 2024 19:14:47 -0500 Subject: [PATCH 04/52] fix max chunk Y position for empty chunks --- .../distanthorizons/common/wrappers/chunk/ChunkWrapper.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java index 407da88f4..098d46ec2 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java @@ -223,6 +223,9 @@ public class ChunkWrapper implements IChunkWrapper LevelChunkSection[] sections = this.chunk.getSections(); for (int index = sections.length-1; index >= 0; index--) { + // update at each position to fix using the max height if the chunk is empty + this.maxNonEmptyHeight = this.getChunkSectionMinHeight(index) + 16; + if (sections[index] == null) { continue; @@ -230,7 +233,7 @@ public class ChunkWrapper implements IChunkWrapper if (!isChunkSectionEmpty(sections[index])) { - this.maxNonEmptyHeight = this.getChunkSectionMinHeight(index) + 16; + // non-empty section found break; } } From 87b22ea1cca64359ef7f9f8df870d97ad315080f Mon Sep 17 00:00:00 2001 From: James Seibel Date: Wed, 3 Jul 2024 20:30:56 -0500 Subject: [PATCH 05/52] Add a config to use pre-existing lighting --- .../BatchGenerationEnvironment.java | 17 ++++++++--------- coreSubProjects | 2 +- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java index b7a46b875..dcfab46f6 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java @@ -416,12 +416,15 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv CompoundTag chunkData = this.getChunkNbtData(chunkPos); newChunk = this.loadOrMakeChunk(chunkPos, chunkData); - // get chunk lighting - ChunkLoader.CombinedChunkLightStorage combinedLights = ChunkLoader.readLight(newChunk, chunkData); - if (combinedLights != null) + if (Config.Client.Advanced.LodBuilding.pullLightingForPregeneratedChunks.get()) { - chunkSkyLightingByDhPos.put(dhChunkPos, combinedLights.skyLightStorage); - chunkBlockLightingByDhPos.put(dhChunkPos, combinedLights.blockLightStorage); + // attempt to get chunk lighting + ChunkLoader.CombinedChunkLightStorage combinedLights = ChunkLoader.readLight(newChunk, chunkData); + if (combinedLights != null) + { + chunkSkyLightingByDhPos.put(dhChunkPos, combinedLights.skyLightStorage); + chunkBlockLightingByDhPos.put(dhChunkPos, combinedLights.blockLightStorage); + } } } catch (RuntimeException loadChunkError) @@ -479,10 +482,6 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv chunkWrapper.setUseDhLighting(true); chunkWrapper.setIsDhLightCorrect(true); } - else - { - int k = 0; - } } }); diff --git a/coreSubProjects b/coreSubProjects index e90c7cd8a..ae72e627c 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit e90c7cd8a01d9687abb854cec7066119aefd4b79 +Subproject commit ae72e627c598ca11f5f588f1ffc8aaa2be88f9e7 From 02203466ede6e6e73b8fc9bf66d7b05d7c3758cc Mon Sep 17 00:00:00 2001 From: James Seibel Date: Wed, 3 Jul 2024 22:38:14 -0500 Subject: [PATCH 06/52] Move generic rendering to the level API --- .../wrappers/world/ClientLevelWrapper.java | 49 ++++++++++++++++++- .../wrappers/world/ServerLevelWrapper.java | 15 +++++- coreSubProjects | 2 +- 3 files changed, 61 insertions(+), 5 deletions(-) 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 29522508d..49886cc55 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 @@ -1,7 +1,7 @@ package com.seibel.distanthorizons.common.wrappers.world; import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiLevelType; -import com.seibel.distanthorizons.api.interfaces.world.IDhApiDimensionTypeWrapper; +import com.seibel.distanthorizons.api.interfaces.render.IDhApiCustomRenderRegister; import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper; import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper; @@ -9,6 +9,8 @@ import com.seibel.distanthorizons.common.wrappers.block.cache.ClientBlockDetailM import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftClientWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; +import com.seibel.distanthorizons.core.level.ClientLevelModule; +import com.seibel.distanthorizons.core.level.DhClientLevel; import com.seibel.distanthorizons.core.level.IKeyedClientLevelManager; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.DhBlockPos; @@ -49,6 +51,7 @@ public class ClientLevelWrapper implements IClientLevelWrapper private BlockStateWrapper dirtBlockWrapper; private BiomeWrapper plainsBiomeWrapper; + private DhClientLevel parentClientLevel; @@ -229,7 +232,49 @@ public class ClientLevelWrapper implements IClientLevelWrapper public ClientLevel getWrappedMcObject() { return this.level; } @Override - public void onUnload() { LEVEL_WRAPPER_BY_CLIENT_LEVEL.remove(this.level); } + public void onUnload() + { + LEVEL_WRAPPER_BY_CLIENT_LEVEL.remove(this.level); + this.parentClientLevel = null; + } + + + + //===================// + // generic rendering // + //===================// + + @Override + public void setParentClientLevel(DhClientLevel parentClientLevel) { this.parentClientLevel = parentClientLevel; } + + @Override + public IDhApiCustomRenderRegister getRenderRegister() + { + if (this.parentClientLevel == null) + { + return null; + } + + ClientLevelModule clientLevelModule = this.parentClientLevel.clientside; + if (clientLevelModule == null) + { + return null; + } + + ClientLevelModule.ClientRenderState renderState = clientLevelModule.ClientRenderStateRef.get(); + if (renderState == null) + { + return null; + } + + return renderState.genericRenderer; + } + + + + //================// + // base overrides // + //================// @Override public String toString() 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 29eadb18e..3a9f13f5d 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 @@ -23,6 +23,7 @@ import java.io.File; import java.util.concurrent.ConcurrentHashMap; import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiLevelType; +import com.seibel.distanthorizons.api.interfaces.render.IDhApiCustomRenderRegister; import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper; import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper; @@ -141,6 +142,7 @@ public class ServerLevelWrapper implements IServerLevelWrapper return level.getMinBuildHeight(); #endif } + @Override public IChunkWrapper tryGetChunk(DhChunkPos pos) { @@ -180,9 +182,18 @@ public class ServerLevelWrapper implements IServerLevelWrapper public void onUnload() { LEVEL_WRAPPER_BY_SERVER_LEVEL.remove(this.level); } @Override - public String toString() + public IDhApiCustomRenderRegister getRenderRegister() { - return "Wrapped{" + level.toString() + "@" + getDimensionType().getDimensionName() + "}"; + // custom rendering isn't supported on the server-side + return null; } + + //================// + // base overrides // + //================// + + @Override + public String toString() { return "Wrapped{" + this.level.toString() + "@" + this.getDimensionType().getDimensionName() + "}"; } + } diff --git a/coreSubProjects b/coreSubProjects index ae72e627c..88db5c959 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit ae72e627c598ca11f5f588f1ffc8aaa2be88f9e7 +Subproject commit 88db5c95947593d21187ea98a3a7cf88884c9c64 From 46c9e0103aef49e7f8e67042e771d21992b8065a Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 4 Jul 2024 16:01:33 -0500 Subject: [PATCH 07/52] Improve world gen timeout warning message --- .../worldGeneration/BatchGenerationEnvironment.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java index dcfab46f6..e493cb43e 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java @@ -346,8 +346,11 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv } else if (event.hasTimeout(Config.Client.Advanced.WorldGenerator.worldGenerationTimeoutLengthInSeconds.get(), TimeUnit.SECONDS)) { - EVENT_LOGGER.error("Batching World Generator: " + event + " timed out and terminated! Please lower your CPU load."); - EVENT_LOGGER.info("Dump PrefEvent: " + event.timer); + EVENT_LOGGER.warn( + "Batching World Generator: [" + event + "] timed out and terminated after ["+Config.Client.Advanced.WorldGenerator.worldGenerationTimeoutLengthInSeconds.get()+"] seconds. " + + "\nYour computer might be overloaded or your world gen mods might be causing world gen to take longer than expected. " + + "\nEither increase DH's world gen timeout or reduce your computer's CPU load."); + EVENT_LOGGER.debug("Dump PrefEvent: " + event.timer); try { if (!event.terminate()) From 8974323406dad8e35d1ba98c0c80b6f7ab68bb08 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 4 Jul 2024 16:15:51 -0500 Subject: [PATCH 08/52] Fix Api client level not containing the generic renderer --- .../wrappers/world/ClientLevelWrapper.java | 31 +++++-------------- .../wrappers/world/ServerLevelWrapper.java | 24 +++++++++----- coreSubProjects | 2 +- 3 files changed, 25 insertions(+), 32 deletions(-) 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 49886cc55..872cc09e8 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 @@ -9,9 +9,7 @@ import com.seibel.distanthorizons.common.wrappers.block.cache.ClientBlockDetailM import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftClientWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; -import com.seibel.distanthorizons.core.level.ClientLevelModule; -import com.seibel.distanthorizons.core.level.DhClientLevel; -import com.seibel.distanthorizons.core.level.IKeyedClientLevelManager; +import com.seibel.distanthorizons.core.level.*; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.DhBlockPos; import com.seibel.distanthorizons.core.pos.DhChunkPos; @@ -22,9 +20,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapp 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; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkSource; import org.apache.logging.log4j.Logger; @@ -43,7 +39,7 @@ import net.minecraft.world.level.chunk.status.ChunkStatus; public class ClientLevelWrapper implements IClientLevelWrapper { private static final Logger LOGGER = DhLoggerBuilder.getLogger(ClientLevelWrapper.class.getSimpleName()); - private static final ConcurrentHashMap LEVEL_WRAPPER_BY_CLIENT_LEVEL = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap LEVEL_WRAPPER_BY_CLIENT_LEVEL = new ConcurrentHashMap<>(); // TODO can leak private static final IKeyedClientLevelManager KEYED_CLIENT_LEVEL_MANAGER = SingletonInjector.INSTANCE.get(IKeyedClientLevelManager.class); private final ClientLevel level; @@ -51,7 +47,8 @@ public class ClientLevelWrapper implements IClientLevelWrapper private BlockStateWrapper dirtBlockWrapper; private BiomeWrapper plainsBiomeWrapper; - private DhClientLevel parentClientLevel; + @Deprecated // TODO circular references are bad + private IDhLevel parentDhLevel; @@ -235,7 +232,7 @@ public class ClientLevelWrapper implements IClientLevelWrapper public void onUnload() { LEVEL_WRAPPER_BY_CLIENT_LEVEL.remove(this.level); - this.parentClientLevel = null; + this.parentDhLevel = null; } @@ -245,29 +242,17 @@ public class ClientLevelWrapper implements IClientLevelWrapper //===================// @Override - public void setParentClientLevel(DhClientLevel parentClientLevel) { this.parentClientLevel = parentClientLevel; } + public void setParentLevel(IDhLevel parentLevel) { this.parentDhLevel = parentLevel; } @Override public IDhApiCustomRenderRegister getRenderRegister() { - if (this.parentClientLevel == null) + if (this.parentDhLevel == null) { return null; } - ClientLevelModule clientLevelModule = this.parentClientLevel.clientside; - if (clientLevelModule == null) - { - return null; - } - - ClientLevelModule.ClientRenderState renderState = clientLevelModule.ClientRenderStateRef.get(); - if (renderState == null) - { - return null; - } - - return renderState.genericRenderer; + return this.parentDhLevel.getGenericRenderer(); } 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 3a9f13f5d..c8fa4d3f5 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 @@ -30,6 +30,7 @@ import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper; import com.seibel.distanthorizons.common.wrappers.block.cache.ServerBlockDetailMap; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftClientWrapper; +import com.seibel.distanthorizons.core.level.IDhLevel; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.DhBlockPos; import com.seibel.distanthorizons.core.pos.DhChunkPos; @@ -60,8 +61,9 @@ public class ServerLevelWrapper implements IServerLevelWrapper private static final Logger LOGGER = DhLoggerBuilder.getLogger(); private static final ConcurrentHashMap LEVEL_WRAPPER_BY_SERVER_LEVEL = new ConcurrentHashMap<>(); - final ServerLevel level; - ServerBlockDetailMap blockMap = new ServerBlockDetailMap(this); + private final ServerLevel level; + @Deprecated // TODO circular references are bad + private IDhLevel parentDhLevel; @@ -173,22 +175,28 @@ public class ServerLevelWrapper implements IServerLevelWrapper } @Override - public ServerLevel getWrappedMcObject() - { - return level; - } + public ServerLevel getWrappedMcObject() { return this.level; } @Override public void onUnload() { LEVEL_WRAPPER_BY_SERVER_LEVEL.remove(this.level); } + + @Override + public void setParentLevel(IDhLevel parentLevel) { this.parentDhLevel = parentLevel; } + @Override public IDhApiCustomRenderRegister getRenderRegister() { - // custom rendering isn't supported on the server-side - return null; + if (this.parentDhLevel == null) + { + return null; + } + + return this.parentDhLevel.getGenericRenderer(); } + //================// // base overrides // //================// diff --git a/coreSubProjects b/coreSubProjects index 88db5c959..120dddf84 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 88db5c95947593d21187ea98a3a7cf88884c9c64 +Subproject commit 120dddf84420f656934802ee4c7e1f4cc7d9c837 From 864a19b79f46d2c3bc6604e84fc9e279989289d9 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 4 Jul 2024 16:31:04 -0500 Subject: [PATCH 09/52] Remove useless IServerLevelWrapper.tryGetClientLevelWrapper() --- .../common/wrappers/world/ServerLevelWrapper.java | 13 ------------- coreSubProjects | 2 +- 2 files changed, 1 insertion(+), 14 deletions(-) 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 c8fa4d3f5..5713edb76 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 @@ -84,19 +84,6 @@ public class ServerLevelWrapper implements IServerLevelWrapper // methods // //=========// - @Nullable - @Override - public IClientLevelWrapper tryGetClientLevelWrapper() - { - MinecraftClientWrapper client = MinecraftClientWrapper.INSTANCE; - if (client.mc.level == null) - { - return null; - } - - return ClientLevelWrapper.getWrapper(client.mc.level); - } - @Override public File getSaveFolder() { diff --git a/coreSubProjects b/coreSubProjects index 120dddf84..e98f17f63 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 120dddf84420f656934802ee4c7e1f4cc7d9c837 +Subproject commit e98f17f63bddcc4c6ea3bcb4bf1a5cb3fe933129 From 06b5b2c5149622b1036df3332dfc395cfc5dccda Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 4 Jul 2024 17:37:30 -0500 Subject: [PATCH 10/52] Fix potential null pointer in auto updater --- .../common/wrappers/gui/updater/ChangelogScreen.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) 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 76adb6d58..25ac35ea3 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 @@ -101,11 +101,17 @@ public class ChangelogScreen extends DhScreen this.changelog.add(""); this.changelog.add(""); + String changelog = ModrinthGetter.changeLogs.get(versionID); + if (changelog == null) + { + // in case something goes wrong this will prevent null pointers + changelog = ""; + } + // Get the release changelog and split it by the new lines String[] unwrappedChangelog = // Arrays.asList could be used if a list object is desired here vs List.of which is only available for Java 9+ - new MarkdownFormatter.MinecraftFormat().convertTo( // This formats markdown to minecraft's "§" characters - ModrinthGetter.changeLogs.get(versionID) - ).split("\\n"); + // This formats markdown to minecraft's "§" charactersnew MarkdownFormatter.MinecraftFormat().convertTo( + new MarkdownFormatter.MinecraftFormat().convertTo(changelog).split("\\n"); // Makes the words wrap around to not go off the screen for (String str : unwrappedChangelog) { From a899d988fc774cce195a7158b817ee5093e0ad19 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 4 Jul 2024 21:43:15 -0500 Subject: [PATCH 11/52] Fix concurrent modification for GenericObjectRenderer --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index e98f17f63..fce703579 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit e98f17f63bddcc4c6ea3bcb4bf1a5cb3fe933129 +Subproject commit fce703579fd1a004e22cfd32b53e4b02b9ca5540 From be1dcaf43cbb80a56da37ac32e7099838ece83db Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 7 Jul 2024 18:03:11 -0500 Subject: [PATCH 12/52] Add cloud rendering --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index fce703579..f4a8bfeb0 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit fce703579fd1a004e22cfd32b53e4b02b9ca5540 +Subproject commit f4a8bfeb0a380a6b6e0369a353ef5ec928c8db9e From f1053251b4af1e00e838e7f62e7367f818b6335a Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 7 Jul 2024 18:13:58 -0500 Subject: [PATCH 13/52] Add missing generic rendering config options --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index f4a8bfeb0..c73c3f849 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit f4a8bfeb0a380a6b6e0369a353ef5ec928c8db9e +Subproject commit c73c3f849018a3bc2af25edd2efb33adb122e94f From e2943fdcaff3c12b6a745ce891048cb79403c034 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 7 Jul 2024 19:45:47 -0500 Subject: [PATCH 14/52] Fix beacons un-rendering when unloading LODs --- .../common/wrappers/world/ClientLevelWrapper.java | 2 +- .../common/wrappers/world/ServerLevelWrapper.java | 2 +- coreSubProjects | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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 872cc09e8..5ea9dfce4 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 @@ -180,7 +180,7 @@ public class ClientLevelWrapper implements IClientLevelWrapper public boolean hasSkyLight() { return this.level.dimensionType().hasSkyLight(); } @Override - public int getHeight() { return this.level.getHeight(); } + public int getMaxHeight() { return this.level.getHeight(); } @Override public int getMinHeight() 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 5713edb76..f289673a7 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 @@ -117,7 +117,7 @@ public class ServerLevelWrapper implements IServerLevelWrapper } @Override - public int getHeight() + public int getMaxHeight() { return level.getHeight(); } diff --git a/coreSubProjects b/coreSubProjects index c73c3f849..3c173685e 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit c73c3f849018a3bc2af25edd2efb33adb122e94f +Subproject commit 3c173685ead0d003db5b4e498c127a8dc3a768a4 From 26a4223ecf0b2c4383fa093bdac808f3b278a7cc Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 7 Jul 2024 19:54:25 -0500 Subject: [PATCH 15/52] Fix double unloading beacons --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 3c173685e..9e13b2719 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 3c173685ead0d003db5b4e498c127a8dc3a768a4 +Subproject commit 9e13b2719718b5946072fc5117a46a628705a987 From 09d133b994a9a14b62207ff4ea2c06b6517deb85 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Mon, 8 Jul 2024 07:45:03 -0500 Subject: [PATCH 16/52] Add generic rendering localization --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 9e13b2719..bd5054e76 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 9e13b2719718b5946072fc5117a46a628705a987 +Subproject commit bd5054e7621f420fcf93b1f6b69f4c6dabff43ce From 2a3c544fba25884d7351d35b19cf03088d43ddbe Mon Sep 17 00:00:00 2001 From: James Seibel Date: Mon, 8 Jul 2024 19:56:29 -0500 Subject: [PATCH 17/52] Increase cloud rendering performance --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index bd5054e76..29ef95387 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit bd5054e7621f420fcf93b1f6b69f4c6dabff43ce +Subproject commit 29ef95387c4183b927e5f9b70a591044a397c843 From 2f985d09269e0f1676980614ed2ff73cce2af309 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Tue, 9 Jul 2024 07:33:30 -0500 Subject: [PATCH 18/52] Add beacon colors --- .../wrappers/block/BlockStateWrapper.java | 48 +++++++++++++++++++ coreSubProjects | 2 +- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java index 52b30b922..5acba76ea 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java @@ -20,6 +20,7 @@ package com.seibel.distanthorizons.common.wrappers.block; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.util.ColorUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; @@ -31,8 +32,10 @@ import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; import org.apache.logging.log4j.Logger; +import java.awt.*; import java.io.IOException; import java.util.*; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; #if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 @@ -95,6 +98,11 @@ public class BlockStateWrapper implements IBlockStateWrapper /** used by the Iris shader mod to determine how each LOD should be rendered */ private byte irisBlockMaterialId = 0; + private final boolean isBeaconBlock; + private final boolean isBeaconBaseBlock; + private final boolean isGlassBlock; + private final Color mapColor; + //==============// @@ -128,6 +136,36 @@ public class BlockStateWrapper implements IBlockStateWrapper this.hashCode = Objects.hash(this.serialString); this.irisBlockMaterialId = this.calculateIrisBlockMaterialId(); + String lowercaseSerial = this.serialString.toLowerCase(); + boolean isBeaconBaseBlock = false; + for (int i = 0; i < IBlockStateWrapper.BEACON_BASE_BLOCK_NAME_LIST.size(); i++) + { + String baseBlockName = IBlockStateWrapper.BEACON_BASE_BLOCK_NAME_LIST.get(i); + if (lowercaseSerial.contains(baseBlockName)) + { + isBeaconBaseBlock = true; + break; + } + } + this.isBeaconBaseBlock = isBeaconBaseBlock; + this.isBeaconBlock = lowercaseSerial.contains("minecraft:beacon"); + this.isGlassBlock = lowercaseSerial.contains("glass"); + + int mcColor = 0; + if (this.blockState != null) + { + #if MC_VER < MC_1_20_1 + mcColor = this.blockState.getMaterial().getColor(); + #else + mcColor = this.blockState.getMapColor(EmptyBlockGetter.INSTANCE, BlockPos.ZERO).col; + #endif + this.mapColor = ColorUtil.toColorObjRGB(mcColor); + } + else + { + this.mapColor = new Color(0,0,0,0); + } + //LOGGER.trace("Created BlockStateWrapper ["+this.serialString+"] for ["+blockState+"] with material ID ["+this.irisBlockMaterialId+"]"); } @@ -286,6 +324,16 @@ public class BlockStateWrapper implements IBlockStateWrapper #endif } + @Override + public boolean isBeaconBlock() { return this.isBeaconBlock; } + @Override + public boolean isBeaconBaseBlock() { return this.isBeaconBaseBlock; } + @Override + public boolean isGlassBlock() { return this.isGlassBlock; } + + @Override + public Color getMapColor() { return this.mapColor; } + @Override public byte getIrisBlockMaterialId() { return this.irisBlockMaterialId; } diff --git a/coreSubProjects b/coreSubProjects index 29ef95387..b762c0561 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 29ef95387c4183b927e5f9b70a591044a397c843 +Subproject commit b762c0561d5e67e78e723f9b19b3692954e7ede3 From f7a0fff869c15a4c492e0fd1dd4648ccf21f982d Mon Sep 17 00:00:00 2001 From: James Seibel Date: Tue, 9 Jul 2024 16:39:04 -0500 Subject: [PATCH 19/52] Move IBlockStateWrapper constants into LodUtil --- .../common/wrappers/block/BlockStateWrapper.java | 15 ++++++++------- coreSubProjects | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java index 5acba76ea..5f8323866 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java @@ -21,6 +21,7 @@ package com.seibel.distanthorizons.common.wrappers.block; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.util.ColorUtil; +import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; @@ -92,7 +93,7 @@ public class BlockStateWrapper implements IBlockStateWrapper private final int hashCode; /** * Cached opacity value, -1 if not populated.
- * Should be between {@link IBlockStateWrapper#FULLY_OPAQUE} and {@link IBlockStateWrapper#FULLY_OPAQUE} + * Should be between {@link LodUtil#BLOCK_FULLY_OPAQUE} and {@link LodUtil#BLOCK_FULLY_OPAQUE} */ private int opacity = -1; /** used by the Iris shader mod to determine how each LOD should be rendered */ @@ -138,9 +139,9 @@ public class BlockStateWrapper implements IBlockStateWrapper String lowercaseSerial = this.serialString.toLowerCase(); boolean isBeaconBaseBlock = false; - for (int i = 0; i < IBlockStateWrapper.BEACON_BASE_BLOCK_NAME_LIST.size(); i++) + for (int i = 0; i < LodUtil.BEACON_BASE_BLOCK_NAME_LIST.size(); i++) { - String baseBlockName = IBlockStateWrapper.BEACON_BASE_BLOCK_NAME_LIST.get(i); + String baseBlockName = LodUtil.BEACON_BASE_BLOCK_NAME_LIST.get(i); if (lowercaseSerial.contains(baseBlockName)) { isBeaconBaseBlock = true; @@ -240,23 +241,23 @@ public class BlockStateWrapper implements IBlockStateWrapper int opacity; if (this.isAir()) { - opacity = FULLY_TRANSPARENT; + opacity = LodUtil.BLOCK_FULLY_TRANSPARENT; } else if (this.isLiquid() && !this.blockState.canOcclude()) { // probably not a waterlogged block (which should block light entirely) // +1 to indicate that the block is translucent (in between transparent and opaque) - opacity = FULLY_TRANSPARENT + 1; + opacity = LodUtil.BLOCK_FULLY_TRANSPARENT + 1; } else if (this.blockState.propagatesSkylightDown(EmptyBlockGetter.INSTANCE, BlockPos.ZERO)) { - opacity = FULLY_TRANSPARENT; + opacity = LodUtil.BLOCK_FULLY_TRANSPARENT; } else { // default for all other blocks - opacity = FULLY_OPAQUE; + opacity = LodUtil.BLOCK_FULLY_OPAQUE; } diff --git a/coreSubProjects b/coreSubProjects index b762c0561..1f74f19cd 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit b762c0561d5e67e78e723f9b19b3692954e7ede3 +Subproject commit 1f74f19cd940abba4dd980ea32c028775c9a115d From 1c189e162afb68a40747244a36830766660535a2 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Tue, 9 Jul 2024 16:39:29 -0500 Subject: [PATCH 20/52] fix sub MC 1.20.1 compiling --- .../common/wrappers/block/BlockStateWrapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java index 5f8323866..ed4200c75 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java @@ -156,7 +156,7 @@ public class BlockStateWrapper implements IBlockStateWrapper if (this.blockState != null) { #if MC_VER < MC_1_20_1 - mcColor = this.blockState.getMaterial().getColor(); + mcColor = this.blockState.getMaterial().getColor().col; #else mcColor = this.blockState.getMapColor(EmptyBlockGetter.INSTANCE, BlockPos.ZERO).col; #endif From 97dacf2429c60cb848d61a4d52577d694693b9c7 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Tue, 9 Jul 2024 17:40:27 -0500 Subject: [PATCH 21/52] Add toggleable logging for GL Buffer garbage collection Will need to be tested by someone who is experiencing issue #718, so far I've been unable to reproduce anything meaningful. --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 1f74f19cd..066b23c78 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 1f74f19cd940abba4dd980ea32c028775c9a115d +Subproject commit 066b23c7856b3f1a72792c8d8c65b8ca073b4dba From 9dd76db3fc16560dadf9ea2f11b74025fc10da53 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Wed, 10 Jul 2024 07:37:18 -0500 Subject: [PATCH 22/52] Fix generic rendering at extreme distances --- .../distanthorizons/common/wrappers/gui/ClassicConfigGUI.java | 2 ++ coreSubProjects | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) 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 ffb8d9412..f3543fba2 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 @@ -443,7 +443,9 @@ public class ClassicConfigGUI String key = translationPrefix + (newInfo.category.isEmpty() ? "" : newInfo.category + ".") + newInfo.getName() + ".@tooltip"; if (((EntryInfo) newInfo.guiValue).error != null && text.equals(name)) + { DhRenderTooltip(matrices, font, ((EntryInfo) newInfo.guiValue).error.getValue(), mouseX, mouseY); + } else if (I18n.exists(key) && (text != null && text.equals(name))) { List list = new ArrayList<>(); diff --git a/coreSubProjects b/coreSubProjects index 066b23c78..4b27f39a0 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 066b23c7856b3f1a72792c8d8c65b8ca073b4dba +Subproject commit 4b27f39a04578977b27576126e7ca4c8bcaaa9d4 From 2adba02a38ec25059d2b1be65a27514bebc41c8e Mon Sep 17 00:00:00 2001 From: James Seibel Date: Wed, 10 Jul 2024 07:45:12 -0500 Subject: [PATCH 23/52] Add "IP Only" to multiplayer tooltip --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 4b27f39a0..ef3cd4b43 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 4b27f39a04578977b27576126e7ca4c8bcaaa9d4 +Subproject commit ef3cd4b43d0906b0b3f098bfc2be56068b154a35 From 07a0779ca4971cb169653fba85d14bd1d41a1aaf Mon Sep 17 00:00:00 2001 From: James Seibel Date: Wed, 10 Jul 2024 18:57:09 -0500 Subject: [PATCH 24/52] Fix potential light map crashing and memory leak --- .../minecraft/MinecraftRenderWrapper.java | 2 +- .../common/wrappers/misc/LightMapWrapper.java | 21 +++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) 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 47dc0eb11..a89d74b50 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 @@ -411,7 +411,7 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper // so this will have to do for now IDimensionTypeWrapper dimensionType = level.getDimensionType(); - LightMapWrapper wrapper = this.lightmapByDimensionType.compute(dimensionType, (dimType, oldWrapper) -> new LightMapWrapper()); + LightMapWrapper wrapper = this.lightmapByDimensionType.computeIfAbsent(dimensionType, (dimType) -> new LightMapWrapper()); wrapper.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 b6ed1265c..4754ba04c 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 @@ -36,14 +36,6 @@ public class LightMapWrapper implements ILightMapWrapper public LightMapWrapper() { } - private void createLightmap(NativeImage image) - { - this.textureId = GL32.glGenTextures(); - GL32.glBindTexture(GL32.GL_TEXTURE_2D, this.textureId); - GL32.glTexImage2D(GL32.GL_TEXTURE_2D, 0, image.format().glFormat(), image.getWidth(), image.getHeight(), - 0, image.format().glFormat(), GL32.GL_UNSIGNED_BYTE, (ByteBuffer) null); - } - //=========// @@ -53,14 +45,25 @@ public class LightMapWrapper implements ILightMapWrapper public void uploadLightmap(NativeImage image) { int currentBind = GL32.glGetInteger(GL32.GL_TEXTURE_BINDING_2D); - GL32.glBindTexture(GL32.GL_TEXTURE_2D, this.textureId); if (this.textureId == 0) { this.createLightmap(image); } + else + { + GL32.glBindTexture(GL32.GL_TEXTURE_2D, this.textureId); + } image.upload(0, 0, 0, false); GL32.glBindTexture(GL32.GL_TEXTURE_2D, currentBind); } + private void createLightmap(NativeImage image) + { + this.textureId = GL32.glGenTextures(); + GL32.glBindTexture(GL32.GL_TEXTURE_2D, this.textureId); + GL32.glTexImage2D(GL32.GL_TEXTURE_2D, 0, image.format().glFormat(), image.getWidth(), image.getHeight(), + 0, image.format().glFormat(), GL32.GL_UNSIGNED_BYTE, (ByteBuffer) null); + } + @Override public void bind() From 82eb27af4c5f1ae55cff5b1908b984798dcdd83e Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 11 Jul 2024 17:32:26 -0500 Subject: [PATCH 25/52] Add DhApiBeforeGenericObjectRenderEvent --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index ef3cd4b43..31c089f82 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit ef3cd4b43d0906b0b3f098bfc2be56068b154a35 +Subproject commit 31c089f82f4de9edf7f7aa29c7c6840a9e597157 From 39e4c70754ee93a761ec42ae3a73b0cf406388fc Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 11 Jul 2024 17:39:01 -0500 Subject: [PATCH 26/52] Add api for generic rendering config --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 31c089f82..691d5cade 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 31c089f82f4de9edf7f7aa29c7c6840a9e597157 +Subproject commit 691d5cadedbecd1a5954cddf726f1234b62e0228 From 1f16a7c808b269719e610dbaa1cac6253f72c674 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 11 Jul 2024 17:58:05 -0500 Subject: [PATCH 27/52] Fix generic rendering and add EDhApiBlockMaterial --- .../wrappers/block/BlockStateWrapper.java | 43 ++++++++++--------- coreSubProjects | 2 +- 2 files changed, 23 insertions(+), 22 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java index ed4200c75..a77b33b87 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java @@ -19,6 +19,7 @@ package com.seibel.distanthorizons.common.wrappers.block; +import com.seibel.distanthorizons.api.enums.rendering.EDhApiBlockMaterial; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.util.ColorUtil; import com.seibel.distanthorizons.core.util.LodUtil; @@ -97,7 +98,7 @@ public class BlockStateWrapper implements IBlockStateWrapper */ private int opacity = -1; /** used by the Iris shader mod to determine how each LOD should be rendered */ - private byte irisBlockMaterialId = 0; + private byte blockMaterialId = 0; private final boolean isBeaconBlock; private final boolean isBeaconBaseBlock; @@ -135,7 +136,7 @@ public class BlockStateWrapper implements IBlockStateWrapper this.blockState = blockState; this.serialString = this.serialize(levelWrapper); this.hashCode = Objects.hash(this.serialString); - this.irisBlockMaterialId = this.calculateIrisBlockMaterialId(); + this.blockMaterialId = this.calculateEDhApiBlockMaterialId().index; String lowercaseSerial = this.serialString.toLowerCase(); boolean isBeaconBaseBlock = false; @@ -167,7 +168,7 @@ public class BlockStateWrapper implements IBlockStateWrapper this.mapColor = new Color(0,0,0,0); } - //LOGGER.trace("Created BlockStateWrapper ["+this.serialString+"] for ["+blockState+"] with material ID ["+this.irisBlockMaterialId+"]"); + //LOGGER.trace("Created BlockStateWrapper ["+this.serialString+"] for ["+blockState+"] with material ID ["+this.EDhApiBlockMaterialId+"]"); } @@ -336,7 +337,7 @@ public class BlockStateWrapper implements IBlockStateWrapper public Color getMapColor() { return this.mapColor; } @Override - public byte getIrisBlockMaterialId() { return this.irisBlockMaterialId; } + public byte getMaterialId() { return this.blockMaterialId; } @Override public String toString() { return this.getSerialString(); } @@ -561,11 +562,11 @@ public class BlockStateWrapper implements IBlockStateWrapper // Iris methods // //==============// - private byte calculateIrisBlockMaterialId() + private EDhApiBlockMaterial calculateEDhApiBlockMaterialId() { if (this.blockState == null) { - return IrisBlockMaterial.AIR; + return EDhApiBlockMaterial.AIR; } @@ -578,15 +579,15 @@ public class BlockStateWrapper implements IBlockStateWrapper || serialString.contains("mushroom") ) { - return IrisBlockMaterial.LEAVES; + return EDhApiBlockMaterial.LEAVES; } else if (this.blockState.is(Blocks.LAVA)) { - return IrisBlockMaterial.LAVA; + return EDhApiBlockMaterial.LAVA; } else if (this.isLiquid() || this.blockState.is(Blocks.WATER)) { - return IrisBlockMaterial.WATER; + return EDhApiBlockMaterial.WATER; } else if (this.blockState.getSoundType() == SoundType.WOOD || serialString.contains("root") @@ -595,7 +596,7 @@ public class BlockStateWrapper implements IBlockStateWrapper #endif ) { - return IrisBlockMaterial.WOOD; + return EDhApiBlockMaterial.WOOD; } else if (this.blockState.getSoundType() == SoundType.METAL #if MC_VER >= MC_1_19_2 @@ -607,11 +608,11 @@ public class BlockStateWrapper implements IBlockStateWrapper #endif ) { - return IrisBlockMaterial.METAL; + return EDhApiBlockMaterial.METAL; } else if (serialString.contains("grass_block")) { - return IrisBlockMaterial.GRASS; + return EDhApiBlockMaterial.GRASS; } else if ( serialString.contains("dirt") @@ -621,7 +622,7 @@ public class BlockStateWrapper implements IBlockStateWrapper || serialString.contains("mycelium") ) { - return IrisBlockMaterial.DIRT; + return EDhApiBlockMaterial.DIRT; } #if MC_VER >= MC_1_17_1 else if (this.blockState.getSoundType() == SoundType.DEEPSLATE @@ -630,37 +631,37 @@ public class BlockStateWrapper implements IBlockStateWrapper || this.blockState.getSoundType() == SoundType.POLISHED_DEEPSLATE || serialString.contains("deepslate") ) { - return IrisBlockMaterial.DEEPSLATE; + return EDhApiBlockMaterial.DEEPSLATE; } #endif else if (this.serialString.contains("snow")) { - return IrisBlockMaterial.SNOW; + return EDhApiBlockMaterial.SNOW; } else if (serialString.contains("sand")) { - return IrisBlockMaterial.SAND; + return EDhApiBlockMaterial.SAND; } else if (serialString.contains("terracotta")) { - return IrisBlockMaterial.TERRACOTTA; + return EDhApiBlockMaterial.TERRACOTTA; } else if (this.blockState.is(BlockTags.BASE_STONE_NETHER)) { - return IrisBlockMaterial.NETHER_STONE; + return EDhApiBlockMaterial.NETHER_STONE; } else if (serialString.contains("stone") || serialString.contains("ore")) { - return IrisBlockMaterial.STONE; + return EDhApiBlockMaterial.STONE; } else if (this.blockState.getLightEmission() > 0) { - return IrisBlockMaterial.ILLUMINATED; + return EDhApiBlockMaterial.ILLUMINATED; } else { - return IrisBlockMaterial.UNKOWN; + return EDhApiBlockMaterial.UNKOWN; } } diff --git a/coreSubProjects b/coreSubProjects index 691d5cade..17aa85ad2 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 691d5cadedbecd1a5954cddf726f1234b62e0228 +Subproject commit 17aa85ad24bc3d3574f396c4a6cca00222f1b1b9 From ac43cd5496ab9ace48fefa947c5fa51ae0e1b450 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 11 Jul 2024 18:13:07 -0500 Subject: [PATCH 28/52] Add generic object materials --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 17aa85ad2..e9d254f8c 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 17aa85ad24bc3d3574f396c4a6cca00222f1b1b9 +Subproject commit e9d254f8c457e0e7a6205ab99faedd55e5083f4c From eed5fd60c6894ee0a99b253ea7ddb8fe1050cb61 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 11 Jul 2024 22:07:15 -0500 Subject: [PATCH 29/52] Fix material typo --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index e9d254f8c..122ef4dce 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit e9d254f8c457e0e7a6205ab99faedd55e5083f4c +Subproject commit 122ef4dce04462a5ef4fabebbe29d9d8d008696f From 98464889cadbb6609d524ff86b7b5e75387296a9 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Thu, 11 Jul 2024 22:51:47 -0500 Subject: [PATCH 30/52] Fix material typo 2 --- .../common/wrappers/block/BlockStateWrapper.java | 2 +- coreSubProjects | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java index a77b33b87..0fd7de2e5 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java @@ -661,7 +661,7 @@ public class BlockStateWrapper implements IBlockStateWrapper } else { - return EDhApiBlockMaterial.UNKOWN; + return EDhApiBlockMaterial.UNKNOWN; } } diff --git a/coreSubProjects b/coreSubProjects index 122ef4dce..0483edd2f 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 122ef4dce04462a5ef4fabebbe29d9d8d008696f +Subproject commit 0483edd2f3ec1cabadd31b0fc5577e5ad9df24f7 From a9e0fd5d9b75ba9ede518e308c0440ea1d96745e Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 12 Jul 2024 07:16:06 -0500 Subject: [PATCH 31/52] Add generic object setup/cleanup events --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 0483edd2f..e7dda9590 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 0483edd2f3ec1cabadd31b0fc5577e5ad9df24f7 +Subproject commit e7dda9590ae513b7557750834c7d621de591a7cf From ee9441c52143d38537bd8eb7de38510ff5aeff97 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 12 Jul 2024 07:41:18 -0500 Subject: [PATCH 32/52] Fix world gen not skipping already complete stages --- .../wrappers/worldGeneration/step/StepBiomes.java | 7 ++++++- .../wrappers/worldGeneration/step/StepFeatures.java | 8 ++++++-- .../step/StepStructureReference.java | 7 ++++++- .../worldGeneration/step/StepStructureStart.java | 13 +++++++++---- .../wrappers/worldGeneration/step/StepSurface.java | 7 ++++++- 5 files changed, 33 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepBiomes.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepBiomes.java index 7fdce78f0..f3cf3302f 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepBiomes.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepBiomes.java @@ -61,7 +61,12 @@ public final class StepBiomes for (ChunkWrapper chunkWrapper : chunkWrappers) { ChunkAccess chunk = chunkWrapper.getChunk(); - if (!chunkWrapper.getStatus().isOrAfter(STATUS)) + if (chunkWrapper.getStatus().isOrAfter(STATUS)) + { + // this chunk has already generated this step + continue; + } + else if (chunk instanceof ProtoChunk) { #if MC_VER < MC_1_21 ((ProtoChunk) chunk).setStatus(STATUS); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepFeatures.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepFeatures.java index 5ae538825..8d8bfb182 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepFeatures.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepFeatures.java @@ -59,8 +59,12 @@ public final class StepFeatures for (ChunkWrapper chunkWrapper : chunkWrappers) { ChunkAccess chunk = chunkWrapper.getChunk(); - if (!chunkWrapper.getStatus().isOrAfter(STATUS) - && chunk instanceof ProtoChunk) + if (chunkWrapper.getStatus().isOrAfter(STATUS)) + { + // this chunk has already generated this step + continue; + } + else if (chunk instanceof ProtoChunk) { #if MC_VER < MC_1_21 ((ProtoChunk) chunk).setStatus(STATUS); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepStructureReference.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepStructureReference.java index e90819967..c5dc640e8 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepStructureReference.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepStructureReference.java @@ -59,7 +59,12 @@ public final class StepStructureReference for (ChunkWrapper chunkWrapper : chunkWrappers) { ChunkAccess chunk = chunkWrapper.getChunk(); - if (!chunkWrapper.getStatus().isOrAfter(STATUS)) + if (chunkWrapper.getStatus().isOrAfter(STATUS)) + { + // this chunk has already generated this step + continue; + } + else if (chunk instanceof ProtoChunk) { #if MC_VER < MC_1_21 ((ProtoChunk) chunk).setStatus(STATUS); diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepStructureStart.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepStructureStart.java index 8c53a0c12..5dcb57468 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepStructureStart.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepStructureStart.java @@ -76,7 +76,12 @@ public final class StepStructureStart for (ChunkWrapper chunkWrapper : chunkWrappers) { ChunkAccess chunk = chunkWrapper.getChunk(); - if (!chunkWrapper.getStatus().isOrAfter(STATUS)) + if (chunkWrapper.getStatus().isOrAfter(STATUS)) + { + // this chunk has already generated this step + continue; + } + else if (chunk instanceof ProtoChunk) { #if MC_VER < MC_1_21 ((ProtoChunk) chunk).setStatus(STATUS); @@ -88,12 +93,12 @@ public final class StepStructureStart } #if MC_VER < MC_1_19_2 - if (environment.params.worldGenSettings.generateFeatures()) + if (this.environment.params.worldGenSettings.generateFeatures()) { #elif MC_VER < MC_1_19_4 - if (environment.params.worldGenSettings.generateStructures()) { + if (this.environment.params.worldGenSettings.generateStructures()) { #else - if (environment.params.worldOptions.generateStructures()) + if (this.environment.params.worldOptions.generateStructures()) { #endif for (ChunkAccess chunk : chunksToDo) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepSurface.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepSurface.java index 0e61d70a2..56b247783 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepSurface.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepSurface.java @@ -58,7 +58,12 @@ public final class StepSurface for (ChunkWrapper chunkWrapper : chunkWrappers) { ChunkAccess chunk = chunkWrapper.getChunk(); - if (!chunkWrapper.getStatus().isOrAfter(STATUS)) + if (chunkWrapper.getStatus().isOrAfter(STATUS)) + { + // this chunk has already generated this step + continue; + } + else if (chunk instanceof ProtoChunk) { #if MC_VER < MC_1_21 ((ProtoChunk) chunk).setStatus(STATUS); From fbbdab73c6442893c95668194c85360e12bcc9b2 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 12 Jul 2024 17:24:45 -0500 Subject: [PATCH 33/52] Attempt to fix lag spikes when right clicking blocks --- .../fabric/FabricClientProxy.java | 69 ++++++++++++------- .../neoforge/NeoforgeClientProxy.java | 43 ++++++++---- 2 files changed, 76 insertions(+), 36 deletions(-) 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 4dba8bc4f..5e9845cee 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java @@ -32,6 +32,7 @@ import com.seibel.distanthorizons.core.api.internal.SharedApi; import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ISodiumAccessor; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; @@ -120,6 +121,7 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy }); // (kinda) block break event + // Since fabric doesn't have a client-side break-block API event, this is the next best thing AttackBlockCallback.EVENT.register((player, level, interactionHand, blockPos, direction) -> { // if we have access to the server, use the chunk save event instead @@ -127,18 +129,27 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy { if (SharedApi.isChunkAtBlockPosAlreadyUpdating(blockPos.getX(), blockPos.getZ())) { - // Since fabric doesn't have a client-side break-block API event, this is the next best thing - ChunkAccess chunk = level.getChunk(blockPos); - if (chunk != null) + // executor to prevent locking up the render/event thread + // if the getChunk() takes longer than expected + // (which can be caused by certain mods) + var executor = ThreadPoolUtil.getFileHandlerExecutor(); + if (executor != null) { - //LOGGER.trace("attack block at blockPos: " + blockPos); - - IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) level); - SharedApi.INSTANCE.chunkBlockChangedEvent( - new ChunkWrapper(chunk, level, wrappedLevel), - wrappedLevel - ); - } + executor.execute(() -> + { + ChunkAccess chunk = level.getChunk(blockPos); + if (chunk != null) + { + //LOGGER.trace("attack block at blockPos: " + blockPos); + + IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) level); + SharedApi.INSTANCE.chunkBlockChangedEvent( + new ChunkWrapper(chunk, level, wrappedLevel), + wrappedLevel + ); + } + }); + } } } @@ -147,27 +158,37 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy }); // (kinda) block place event + // Since fabric doesn't have a client-side place-block API event, this is the next best thing UseBlockCallback.EVENT.register((player, level, hand, hitResult) -> { // if we have access to the server, use the chunk save event instead if (MC.clientConnectedToDedicatedServer()) { - if (SharedApi.isChunkAtBlockPosAlreadyUpdating(hitResult.getBlockPos().getX(), hitResult.getBlockPos().getZ())) + if (hitResult.getType() == HitResult.Type.BLOCK + && !hitResult.isInside()) { - // Since fabric doesn't have a client-side place-block API event, this is the next best thing - if (hitResult.getType() == HitResult.Type.BLOCK - && !hitResult.isInside()) + if (SharedApi.isChunkAtBlockPosAlreadyUpdating(hitResult.getBlockPos().getX(), hitResult.getBlockPos().getZ())) { - ChunkAccess chunk = level.getChunk(hitResult.getBlockPos()); - if (chunk != null) + // executor to prevent locking up the render/event thread + // if the getChunk() takes longer than expected + // (which can be caused by certain mods) + var executor = ThreadPoolUtil.getFileHandlerExecutor(); + if (executor != null) { - //LOGGER.trace("use block at blockPos: " + hitResult.getBlockPos()); - - IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) level); - SharedApi.INSTANCE.chunkBlockChangedEvent( - new ChunkWrapper(chunk, level, wrappedLevel), - wrappedLevel - ); + executor.execute(() -> + { + ChunkAccess chunk = level.getChunk(hitResult.getBlockPos()); + if (chunk != null) + { + //LOGGER.trace("use block at blockPos: " + hitResult.getBlockPos()); + + IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) level); + SharedApi.INSTANCE.chunkBlockChangedEvent( + new ChunkWrapper(chunk, level, wrappedLevel), + wrappedLevel + ); + } + }); } } } diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java index de73b4031..e5dc92b42 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeClientProxy.java @@ -29,6 +29,7 @@ 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.util.math.Mat4f; +import com.seibel.distanthorizons.core.util.threading.ThreadPoolUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; @@ -168,12 +169,21 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy return; } - //LOGGER.trace("interact or block place event at blockPos: " + event.getPos()); - - LevelAccessor level = event.getLevel(); - - ChunkAccess chunk = level.getChunk(event.getPos()); - this.onBlockChangeEvent(level, chunk); + // executor to prevent locking up the render/event thread + // if the getChunk() takes longer than expected + // (which can be caused by certain mods) + var executor = ThreadPoolUtil.getFileHandlerExecutor(); + if (executor != null) + { + executor.execute(() -> + { + //LOGGER.trace("interact or block place event at blockPos: " + event.getPos()); + + LevelAccessor level = event.getLevel(); + ChunkAccess chunk = level.getChunk(event.getPos()); + this.onBlockChangeEvent(level, chunk); + }); + } } @SubscribeEvent public void leftClickBlockEvent(PlayerInteractEvent.LeftClickBlock event) @@ -183,12 +193,21 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy return; } - //LOGGER.trace("break or block attack at blockPos: " + event.getPos()); - - LevelAccessor level = event.getLevel(); - - ChunkAccess chunk = level.getChunk(event.getPos()); - this.onBlockChangeEvent(level, chunk); + // executor to prevent locking up the render/event thread + // if the getChunk() takes longer than expected + // (which can be caused by certain mods) + var executor = ThreadPoolUtil.getFileHandlerExecutor(); + if (executor != null) + { + executor.execute(() -> + { + //LOGGER.trace("break or block attack at blockPos: " + event.getPos()); + + LevelAccessor level = event.getLevel(); + ChunkAccess chunk = level.getChunk(event.getPos()); + this.onBlockChangeEvent(level, chunk); + }); + } } private void onBlockChangeEvent(LevelAccessor level, ChunkAccess chunk) { From 9f3124fa56e5811f97a4854dafeab0f4f1df84ed Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 12 Jul 2024 17:27:32 -0500 Subject: [PATCH 34/52] Add renderEventParam to generic rendering shader binding by IMS request --- .../wrappers/worldGeneration/BatchGenerationEnvironment.java | 2 +- coreSubProjects | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java index e493cb43e..bd01cc0b4 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java @@ -477,7 +477,7 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv ChunkWrapper chunkWrapper = new ChunkWrapper(chunk, region, this.serverlevel.getLevelWrapper()); chunkWrapperList.set(x, z, chunkWrapper); - // try getting the chunk lighting + // try setting the wrapper's lighting if (chunkBlockLightingByDhPos.containsKey(chunkWrapper.getChunkPos())) { chunkWrapper.setBlockLightStorage(chunkBlockLightingByDhPos.get(chunkWrapper.getChunkPos())); diff --git a/coreSubProjects b/coreSubProjects index e7dda9590..6bb832a48 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit e7dda9590ae513b7557750834c7d621de591a7cf +Subproject commit 6bb832a48833f9fbbb90cb9765b223a9f15159da From 0428fa091299e19de4181e0600a612a41ed09bbb Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 12 Jul 2024 19:22:25 -0500 Subject: [PATCH 35/52] Clone API event parameters to reduce listener contamination --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 6bb832a48..cab9f7c83 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 6bb832a48833f9fbbb90cb9765b223a9f15159da +Subproject commit cab9f7c83036cd543fad17c4401f4da88822d022 From b69ef5835db7375b92f2517eba809be975f1a484 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 12 Jul 2024 20:22:02 -0500 Subject: [PATCH 36/52] Fix repo connections not getting closed --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index cab9f7c83..a153ca1fe 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit cab9f7c83036cd543fad17c4401f4da88822d022 +Subproject commit a153ca1fe16e9a69e955edc9d6cd63ffe89efaea From 408460b0ae74bb29a953ff60c71ff202efe4058e Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 12 Jul 2024 20:31:36 -0500 Subject: [PATCH 37/52] Fix missing imports for MC 1.19 and below --- .../minecraft/MinecraftRenderWrapper.java | 1 + .../fabric/FabricClientProxy.java | 5 ++-- .../mixins/client/MixinLevelRenderer.java | 3 ++- .../forge/ForgeClientProxy.java | 25 ++++++++++++++++--- .../mixins/client/MixinLevelRenderer.java | 4 +++ 5 files changed, 31 insertions(+), 7 deletions(-) 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 a89d74b50..b75e203d5 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 @@ -39,6 +39,7 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper; #if MC_VER < MC_1_19_4 +import org.joml.Matrix4f; import org.joml.Vector3f; #else import org.joml.Matrix4f; 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 5e9845cee..3b3b0d8a9 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java @@ -53,6 +53,7 @@ import net.minecraft.client.gui.screens.TitleScreen; import java.nio.FloatBuffer; #endif import java.util.HashSet; +import java.util.concurrent.ThreadPoolExecutor; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.world.InteractionResult; @@ -132,7 +133,7 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy // executor to prevent locking up the render/event thread // if the getChunk() takes longer than expected // (which can be caused by certain mods) - var executor = ThreadPoolUtil.getFileHandlerExecutor(); + ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor(); if (executor != null) { executor.execute(() -> @@ -172,7 +173,7 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy // executor to prevent locking up the render/event thread // if the getChunk() takes longer than expected // (which can be caused by certain mods) - var executor = ThreadPoolUtil.getFileHandlerExecutor(); + ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor(); if (executor != null) { executor.execute(() -> 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 97a3d8dc4..b20d309b6 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 @@ -22,6 +22,7 @@ package com.seibel.distanthorizons.fabric.mixins.client; import com.mojang.blaze3d.vertex.PoseStack; #if MC_VER < MC_1_19_4 import com.mojang.math.Matrix4f; +import org.lwjgl.opengl.GL32; #else import org.joml.Matrix4f; #endif @@ -93,7 +94,7 @@ public class MixinLevelRenderer #if MC_VER == MC_1_16_5 // get the matrices from the OpenGL fixed pipeline float[] mcProjMatrixRaw = new float[16]; - GL15.glGetFloatv(GL15.GL_PROJECTION_MATRIX, mcProjMatrixRaw); + GL32.glGetFloatv(GL32.GL_PROJECTION_MATRIX, mcProjMatrixRaw); Mat4f mcProjectionMatrix = new Mat4f(mcProjMatrixRaw); mcProjectionMatrix.transpose(); 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 036bc979b..6784ad8e6 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java @@ -27,6 +27,7 @@ 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.util.threading.ThreadPoolUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; @@ -65,6 +66,8 @@ import net.minecraftforge.event.TickEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import org.lwjgl.opengl.GL32; +import java.util.concurrent.ThreadPoolExecutor; + /** * This handles all events sent to the client, * and is the starting point for most of the mod. @@ -186,8 +189,15 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy LevelAccessor level = event.getLevel(); #endif - ChunkAccess chunk = level.getChunk(event.getPos()); - this.onBlockChangeEvent(level, chunk); + ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor(); + if (executor != null) + { + executor.execute(() -> + { + ChunkAccess chunk = level.getChunk(event.getPos()); + this.onBlockChangeEvent(level, chunk); + }); + } } @SubscribeEvent public void leftClickBlockEvent(PlayerInteractEvent.LeftClickBlock event) @@ -205,8 +215,15 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy LevelAccessor level = event.getLevel(); #endif - ChunkAccess chunk = level.getChunk(event.getPos()); - this.onBlockChangeEvent(level, chunk); + ThreadPoolExecutor executor = ThreadPoolUtil.getFileHandlerExecutor(); + if (executor != null) + { + executor.execute(() -> + { + ChunkAccess chunk = level.getChunk(event.getPos()); + this.onBlockChangeEvent(level, chunk); + }); + } } private void onBlockChangeEvent(LevelAccessor level, ChunkAccess chunk) { 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 95708fd3b..2b95ac702 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 @@ -22,6 +22,10 @@ package com.seibel.distanthorizons.forge.mixins.client; import com.mojang.blaze3d.vertex.PoseStack; #if MC_VER < MC_1_19_4 import com.mojang.math.Matrix4f; +import net.minecraft.client.Camera; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.renderer.LightTexture; #else import net.minecraft.client.Camera; import net.minecraft.client.Minecraft; From 7f98e4b1eb7a82bed1913fa9955348f09c36c7ec Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 12 Jul 2024 21:31:12 -0500 Subject: [PATCH 38/52] Fix potential chunkWrapper null pointer --- .../common/wrappers/chunk/ChunkWrapper.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java index 098d46ec2..05a94f172 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java @@ -250,15 +250,7 @@ public class ChunkWrapper implements IChunkWrapper return section.hasOnlyAir(); #endif } - private int getChunkSectionMinHeight(int index) - { - // convert from an index to a block coordinate - #if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1 - return this.chunk.getSections()[index].bottomBlockY(); - #else - return this.chunk.getSectionYFromSectionIndex(index) * 16; - #endif - } + private int getChunkSectionMinHeight(int index) { return (index * 16) + this.getMinBuildHeight(); } @Override From 13363ff3638c8e1ae95f5308d1a7bf518adf9cfe Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 12 Jul 2024 21:47:16 -0500 Subject: [PATCH 39/52] make clouds smaller and thinner --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index a153ca1fe..8eabc6ad4 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit a153ca1fe16e9a69e955edc9d6cd63ffe89efaea +Subproject commit 8eabc6ad4c45aec808e587a7c59b2aa58a14d286 From e6d36474903a0a07e93376824350e362a74099ce Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 13 Jul 2024 08:14:33 -0500 Subject: [PATCH 40/52] Increase default fog start distance --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 8eabc6ad4..1695c41ef 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 8eabc6ad4c45aec808e587a7c59b2aa58a14d286 +Subproject commit 1695c41ef2d398f83441456211922040a7a5b7c1 From fbffdc0c9fa514cde886a7a7a83083d2adcadb91 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 13 Jul 2024 12:17:30 -0500 Subject: [PATCH 41/52] Fix fog for Mac and remove near fog limitation --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 1695c41ef..32861e757 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 1695c41ef2d398f83441456211922040a7a5b7c1 +Subproject commit 32861e757d3574555738de1317e9145d7ccf9299 From afddf4168e7b5e2586aa98b29b30b63de78a0514 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 13 Jul 2024 12:59:43 -0500 Subject: [PATCH 42/52] Change some chunk deserialization errors to warnings --- .../worldGeneration/mimicObject/ChunkLoader.java | 16 ++++++++++------ coreSubProjects | 2 +- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/ChunkLoader.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/ChunkLoader.java index 5699051cb..2b4cf1052 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/ChunkLoader.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/ChunkLoader.java @@ -252,8 +252,8 @@ public class ChunkLoader biomes.asHolderIdMap(), biomes.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getHolderOrThrow(Biomes.PLAINS)); #endif #endif - int i = #if MC_VER < MC_1_17_1 16; #else level.getSectionsCount(); #endif - LevelChunkSection[] chunkSections = new LevelChunkSection[i]; + int sectionYIndex = #if MC_VER < MC_1_17_1 16; #else level.getSectionsCount(); #endif + LevelChunkSection[] chunkSections = new LevelChunkSection[sectionYIndex]; boolean isLightOn = chunkData.getBoolean("isLightOn"); boolean hasSkyLight = level.dimensionType().hasSkyLight(); @@ -288,7 +288,7 @@ public class ChunkLoader #endif blockStateContainer = tagSection.contains("block_states", 10) - ? BLOCK_STATE_CODEC.parse(NbtOps.INSTANCE, tagSection.getCompound("block_states")).promotePartial(string -> logErrors(chunkPos, sectionYPos, string)) + ? BLOCK_STATE_CODEC.parse(NbtOps.INSTANCE, tagSection.getCompound("block_states")).promotePartial(string -> logBlockDeserializationWarning(chunkPos, sectionYPos, string)) #if MC_VER < MC_1_20_6 .getOrThrow(false, LOGGER::error) #else @@ -303,7 +303,7 @@ public class ChunkLoader #else biomeContainer = tagSection.contains("biomes", 10) - ? biomeCodec.parse(NbtOps.INSTANCE, tagSection.getCompound("biomes")).promotePartial(string -> logErrors(chunkPos, i, (String) string)) + ? biomeCodec.parse(NbtOps.INSTANCE, tagSection.getCompound("biomes")).promotePartial(string -> logBiomeDeserializationWarning(chunkPos, sectionYIndex, (String) string)) #if MC_VER < MC_1_20_6 .getOrThrow(false, LOGGER::error) #else @@ -495,9 +495,13 @@ public class ChunkLoader } } - private static void logErrors(ChunkPos chunkPos, int i, String string) + private static void logBlockDeserializationWarning(ChunkPos chunkPos, int sectionYIndex, String message) { - LOGGER.error("Distant Horizons: Recoverable errors when loading section [" + chunkPos.x + ", " + i + ", " + chunkPos.z + "]: " + string); + LOGGER.warn("Unable to deserialize blocks for chunk section [" + chunkPos.x + ", " + sectionYIndex + ", " + chunkPos.z + "], error: ["+message+"]. This can probably be ignored, although if your world looks wrong, optimizing it via the single player menu then deleting your DH database(s) should fix the problem."); + } + private static void logBiomeDeserializationWarning(ChunkPos chunkPos, int sectionYIndex, String message) + { + LOGGER.warn("Unable to deserialize biomes for chunk section [" + chunkPos.x + ", " + sectionYIndex + ", " + chunkPos.z + "], error: ["+message+"]. This can probably be ignored, although if your world looks wrong, optimizing it via the single player menu then deleting your DH database(s) should fix the problem."); } diff --git a/coreSubProjects b/coreSubProjects index 32861e757..1d0cb048c 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 32861e757d3574555738de1317e9145d7ccf9299 +Subproject commit 1d0cb048cd03543dafcb4ef32d95d1efd83abce6 From 99e8f57bac87a206afcbe0c1f85fa7c5eb6b22c3 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 14 Jul 2024 07:25:49 -0500 Subject: [PATCH 43/52] add missing genericRendering to IDhApiGraphicsConfig --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 1d0cb048c..9c0f5865f 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 1d0cb048cd03543dafcb4ef32d95d1efd83abce6 +Subproject commit 9c0f5865f6250212913ddd0ad85368871988fda4 From 7005202384e0c28028a81b20003aea5cae2a6c1d Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 14 Jul 2024 08:41:22 -0500 Subject: [PATCH 44/52] Add a optional memory cache to the IDhApiTerrainDataRepo --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 9c0f5865f..fa22a4f27 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 9c0f5865f6250212913ddd0ad85368871988fda4 +Subproject commit fa22a4f27b59c87351264484f36a3f2b89e4152b From 377f7d23e3ef1d3191865daed264480e57d56199 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 14 Jul 2024 09:31:03 -0500 Subject: [PATCH 45/52] Remove render param from DhApiAfterRenderEvent --- coreSubProjects | 2 +- .../fabric/mixins/client/MixinLevelRenderer.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/coreSubProjects b/coreSubProjects index fa22a4f27..7165c086e 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit fa22a4f27b59c87351264484f36a3f2b89e4152b +Subproject commit 7165c086e4c87436b6ab79d87f914009d2e284b1 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 b20d309b6..8b729e082 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 @@ -105,13 +105,14 @@ public class MixinLevelRenderer Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); #else - // get the matrices directly from MC + // MC combined the model view and projection matricies Mat4f mcModelViewMatrix = McObjectConverter.Convert(projectionMatrix); Mat4f mcProjectionMatrix = new Mat4f(); mcProjectionMatrix.setIdentity(); #endif - if (renderType.equals(RenderType.translucent())) { + if (renderType.equals(RenderType.translucent())) + { ClientApi.INSTANCE.renderDeferredLods(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, From 97756a5196a8a6abe23aa0aded9168279bff10f7 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 20 Jul 2024 10:45:55 -0500 Subject: [PATCH 46/52] Add AbstractDhApiChunkWorldGenerator.generateApiChunk() --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 7165c086e..99dc644ad 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 7165c086e4c87436b6ab79d87f914009d2e284b1 +Subproject commit 99dc644adfd9725ac2e4d1091545d19806f579bd From c33a5bf814f46e101959c1076dd205bfe75b6554 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 20 Jul 2024 11:21:01 -0500 Subject: [PATCH 47/52] Add IDhApiWrapperFactory resourceLocation string methods for block/biomes --- .../common/wrappers/WrapperFactory.java | 28 +++++++++++++++---- coreSubProjects | 2 +- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java index 115243c1d..ad4ead178 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java @@ -55,9 +55,6 @@ import java.util.HashSet; /** * This handles creating abstract wrapper objects. - * - * @author James Seibel - * @version 2022-12-5 */ public class WrapperFactory implements IWrapperFactory { @@ -82,6 +79,27 @@ public class WrapperFactory implements IWrapperFactory } } + @Override + public IDhApiBiomeWrapper getBiomeWrapper(String resourceLocationString, IDhApiLevelWrapper levelWrapper) throws IOException, ClassCastException + { + if (!(levelWrapper instanceof ILevelWrapper)) + { + throw new ClassCastException("levelWrapper must be returned by DH and of type ["+ILevelWrapper.class.getName()+"]."); + } + + return BiomeWrapper.deserialize(resourceLocationString, (ILevelWrapper)levelWrapper); + } + @Override + public IDhApiBlockStateWrapper getDefaultBlockStateWrapper(String resourceLocationString, IDhApiLevelWrapper levelWrapper) throws IOException, ClassCastException + { + if (!(levelWrapper instanceof ILevelWrapper)) + { + throw new ClassCastException("Invalid ["+IDhApiLevelWrapper.class.getSimpleName()+"] value given. Level wrapper object must be one given by the DH API (it can't be a custom implementation), specifically of type ["+ILevelWrapper.class.getName()+"]."); + } + + return BlockStateWrapper.deserialize(resourceLocationString, (ILevelWrapper)levelWrapper); + } + @Override public IBiomeWrapper deserializeBiomeWrapper(String str, ILevelWrapper levelWrapper) throws IOException { return BiomeWrapper.deserialize(str, levelWrapper); } @Override @@ -222,7 +240,7 @@ public class WrapperFactory implements IWrapperFactory // confirm the API level wrapper is also a Core wrapper if (!(levelWrapper instanceof ILevelWrapper)) { - throw new ClassCastException("Unable to cast... only DH provided IDhApiLevelWrapper's can be used."); // TODO + throw new ClassCastException("Invalid ["+IDhApiLevelWrapper.class.getSimpleName()+"] value given. Level wrapper object must be one given by the DH API (it can't be a custom implementation), specifically of type ["+ILevelWrapper.class.getName()+"]."); } ILevelWrapper coreLevelWrapper = (ILevelWrapper) levelWrapper; @@ -281,7 +299,7 @@ public class WrapperFactory implements IWrapperFactory // confirm the API level wrapper is also a Core wrapper if (!(levelWrapper instanceof ILevelWrapper)) { - throw new ClassCastException("Unable to cast... only DH provided IDhApiLevelWrapper's can be used."); // TODO + throw new ClassCastException("Invalid ["+IDhApiLevelWrapper.class.getSimpleName()+"] value given. Level wrapper object must be one given by the DH API (it can't be a custom implementation), specifically of type ["+ILevelWrapper.class.getName()+"]."); } ILevelWrapper coreLevelWrapper = (ILevelWrapper) levelWrapper; diff --git a/coreSubProjects b/coreSubProjects index 99dc644ad..4d4eeacbd 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 99dc644adfd9725ac2e4d1091545d19806f579bd +Subproject commit 4d4eeacbddd58b22c8e69da9f81f34e4a3ec3342 From 7216b193e874c161b8c1bf40ba6104665ea74a83 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 20 Jul 2024 17:58:39 -0500 Subject: [PATCH 48/52] Fix API chunk world gen --- coreSubProjects | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/coreSubProjects b/coreSubProjects index 4d4eeacbd..568ff40df 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 4d4eeacbddd58b22c8e69da9f81f34e4a3ec3342 +Subproject commit 568ff40df6d346c4d5418c7d11217ff94aed1072 From 4e9d0f4861e9c67792aa6c86e2893bde48667b5b Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 21 Jul 2024 16:13:55 -0500 Subject: [PATCH 49/52] Fix ConfigEntry String value saving --- .../common/wrappers/gui/ClassicConfigGUI.java | 17 ++++++++++------- coreSubProjects | 2 +- 2 files changed, 11 insertions(+), 8 deletions(-) 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 f3543fba2..2ca6c27a0 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 @@ -158,19 +158,22 @@ public class ClassicConfigGUI // button.active = entries.stream().allMatch(e -> e.inLimits); - if (((ConfigEntry) info).isValid(value) == 0 && info.getType() != List.class) + if (info.getType() == String.class + || info.getType() == List.class) + { + ((ConfigEntry) info).uiSetWithoutSaving(stringValue); + } + else if (((ConfigEntry) info).isValid(value) == 0) { if (!cast) + { ((ConfigEntry) info).uiSetWithoutSaving(value); + } else + { ((ConfigEntry) info).uiSetWithoutSaving(value.intValue()); + } } -// else if (((ConfigEntry) info).isValidMemoryAddress() == 0) -// { -// if (((List) info.get()).size() == ((EntryInfo) info.guiValue).index) -// info.uiSet(((List) info.get()).add("")); -// info.uiSet(((List) info.get()).set(((EntryInfo) info.guiValue).index, Arrays.stream(((EntryInfo) info.guiValue).tempValue.replace("[", "").replace("]", "").split(", ")).collect(Collectors.toList()).get(0))); -// } return true; }; diff --git a/coreSubProjects b/coreSubProjects index 568ff40df..44fe1eafb 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 568ff40df6d346c4d5418c7d11217ff94aed1072 +Subproject commit 44fe1eafb148191f0e5737f59dae7507cc6ed496 From 2e565aa83a18bd32570d4a5520de67d160552187 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 21 Jul 2024 17:27:26 -0500 Subject: [PATCH 50/52] Improve cave culling and add config for ignored/cave blocks --- .../common/wrappers/WrapperFactory.java | 7 ++ .../wrappers/block/BlockStateWrapper.java | 104 +++++++++++++++--- coreSubProjects | 2 +- 3 files changed, 94 insertions(+), 19 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java index ad4ead178..293a53037 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/WrapperFactory.java @@ -122,6 +122,13 @@ public class WrapperFactory implements IWrapperFactory @Override public HashSet getRendererIgnoredBlocks(ILevelWrapper levelWrapper) { return BlockStateWrapper.getRendererIgnoredBlocks(levelWrapper); } + @Override + public HashSet getRendererIgnoredCaveBlocks(ILevelWrapper levelWrapper) { return BlockStateWrapper.getRendererIgnoredCaveBlocks(levelWrapper); } + + @Override + public void resetRendererIgnoredCaveBlocks() { BlockStateWrapper.clearRendererIgnoredCaveBlocks(); } + @Override + public void resetRendererIgnoredBlocksSet() { BlockStateWrapper.clearRendererIgnoredBlocks(); } /** diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java index 0fd7de2e5..a72505ee9 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BlockStateWrapper.java @@ -20,6 +20,8 @@ package com.seibel.distanthorizons.common.wrappers.block; import com.seibel.distanthorizons.api.enums.rendering.EDhApiBlockMaterial; +import com.seibel.distanthorizons.core.config.Config; +import com.seibel.distanthorizons.core.config.types.ConfigEntry; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.util.ColorUtil; import com.seibel.distanthorizons.core.util.LodUtil; @@ -77,9 +79,8 @@ public class BlockStateWrapper implements IBlockStateWrapper public static final String DIRT_RESOURCE_LOCATION_STRING = "minecraft:dirt"; - // TODO: Make this changeable through the config - public static final String[] RENDERER_IGNORED_BLOCKS_RESOURCE_LOCATIONS = { AIR_STRING, "minecraft:barrier", "minecraft:structure_void", "minecraft:light", "minecraft:tripwire" }; public static HashSet rendererIgnoredBlocks = null; + public static HashSet rendererIgnoredCaveBlocks = null; /** keep track of broken blocks so we don't log every time */ private static final HashSet BrokenResourceLocations = new HashSet<>(); @@ -173,9 +174,9 @@ public class BlockStateWrapper implements IBlockStateWrapper - //================// - // helper methods // - //================// + //====================// + // LodBuilder methods // + //====================// /** * Requires a {@link ILevelWrapper} since {@link BlockStateWrapper#deserialize(String,ILevelWrapper)} also requires one. @@ -189,37 +190,104 @@ public class BlockStateWrapper implements IBlockStateWrapper return rendererIgnoredBlocks; } + HashSet baseIgnoredBlock = new HashSet<>(); + baseIgnoredBlock.add(AIR_STRING); + rendererIgnoredBlocks = getBlockWrappers(Config.Client.Advanced.LodBuilding.ignoredRenderBlockCsv, baseIgnoredBlock, levelWrapper); + return rendererIgnoredBlocks; + } + /** + * Requires a {@link ILevelWrapper} since {@link BlockStateWrapper#deserialize(String,ILevelWrapper)} also requires one. + * This way the method won't accidentally be called before the deserialization can be completed. + */ + public static HashSet getRendererIgnoredCaveBlocks(ILevelWrapper levelWrapper) + { + // use the cached version if possible + if (rendererIgnoredCaveBlocks != null) + { + return rendererIgnoredCaveBlocks; + } + HashSet baseIgnoredBlock = new HashSet<>(); + baseIgnoredBlock.add(AIR_STRING); + rendererIgnoredCaveBlocks = getBlockWrappers(Config.Client.Advanced.LodBuilding.ignoredRenderCaveBlockCsv, baseIgnoredBlock, levelWrapper); + return rendererIgnoredCaveBlocks; + } + + public static void clearRendererIgnoredBlocks() { rendererIgnoredBlocks = null; } + public static void clearRendererIgnoredCaveBlocks() { rendererIgnoredCaveBlocks = null; } + + + + // lod builder helpers // + + private static HashSet getBlockWrappers(ConfigEntry config, HashSet baseResourceLocations, ILevelWrapper levelWrapper) + { + // get the base blocks + HashSet blockStringList = new HashSet<>(); + if (baseResourceLocations != null) + { + blockStringList.addAll(baseResourceLocations); + } + + // get the config blocks + String ignoreBlockCsv = config.get(); + if (ignoreBlockCsv != null) + { + blockStringList.addAll(List.of(ignoreBlockCsv.split(","))); + } + + return getBlockWrappers(blockStringList, levelWrapper); + } + private static HashSet getBlockWrappers(HashSet blockResourceLocationSet, ILevelWrapper levelWrapper) + { // deserialize each of the given resource locations HashSet blockStateWrappers = new HashSet<>(); - for (String blockResourceLocation : RENDERER_IGNORED_BLOCKS_RESOURCE_LOCATIONS) + for (String blockResourceLocation : blockResourceLocationSet) { try { - BlockStateWrapper DefaultBlockStateToIgnore = (BlockStateWrapper) deserialize(blockResourceLocation, levelWrapper); - blockStateWrappers.add(DefaultBlockStateToIgnore); - - if (DefaultBlockStateToIgnore == AIR) + if (blockResourceLocation == null) + { + // shouldn't happen, but just in case + continue; + } + String cleanedResourceLocation = blockResourceLocation.trim(); + if (cleanedResourceLocation.length() == 0) { continue; } - // add all possible blockstates (to account for light blocks with different light values and such) - List blockStatesToIgnore = DefaultBlockStateToIgnore.blockState.getBlock().getStateDefinition().getPossibleStates(); - for (BlockState blockState : blockStatesToIgnore) + + BlockStateWrapper defaultBlockStateToIgnore = (BlockStateWrapper) deserialize(cleanedResourceLocation, levelWrapper); + blockStateWrappers.add(defaultBlockStateToIgnore); + + if (defaultBlockStateToIgnore != AIR) { - BlockStateWrapper newBlockToIgnore = BlockStateWrapper.fromBlockState(blockState, levelWrapper); - blockStateWrappers.add(newBlockToIgnore); + // add all possible blockstates (to account for light blocks with different light values and such) + List blockStatesToIgnore = defaultBlockStateToIgnore.blockState.getBlock().getStateDefinition().getPossibleStates(); + for (BlockState blockState : blockStatesToIgnore) + { + BlockStateWrapper newBlockToIgnore = BlockStateWrapper.fromBlockState(blockState, levelWrapper); + blockStateWrappers.add(newBlockToIgnore); + } + } + else + { + // air is a special case so it must be handled separately + blockStateWrappers.add(AIR); } } catch (IOException e) { - LOGGER.warn("Unable to deserialize rendererIgnoredBlock with the resource location: ["+blockResourceLocation+"]. Error: "+e.getMessage(), e); + LOGGER.warn("Unable to deserialize block with the resource location: ["+blockResourceLocation+"]. Error: "+e.getMessage(), e); + } + catch (Exception e) + { + LOGGER.warn("Unexpected error deserializing block with the resource location: ["+blockResourceLocation+"]. Error: "+e.getMessage(), e); } } - rendererIgnoredBlocks = blockStateWrappers; - return rendererIgnoredBlocks; + return blockStateWrappers; } diff --git a/coreSubProjects b/coreSubProjects index 44fe1eafb..3cef8b9a4 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 44fe1eafb148191f0e5737f59dae7507cc6ed496 +Subproject commit 3cef8b9a4f266ad8ab07d9dd548f3289f7c91826 From 2bac5f933aa22cf502682373f1487077fa763159 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 21 Jul 2024 19:29:01 -0500 Subject: [PATCH 51/52] remove unused clientLevelWrapper.getGameDirectory() --- .../wrappers/minecraft/MinecraftClientWrapper.java | 11 ----------- coreSubProjects | 2 +- 2 files changed, 1 insertion(+), 12 deletions(-) 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 e7df9f1bc..13f7805d6 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 @@ -205,11 +205,6 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra return new DhChunkPos(playerPos.x, playerPos.z); } - public ModelManager getModelManager() - { - return mc.getModelManager(); - } - @Nullable @Override public IClientLevelWrapper getWrappedClientLevel() @@ -222,12 +217,6 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra return ClientLevelWrapper.getWrapperIgnoringOverride(this.mc.level); } - /** Please move over to getInstallationDirectory() */ - @Deprecated - @Override - public File getGameDirectory() - { - return getInstallationDirectory(); } @Override diff --git a/coreSubProjects b/coreSubProjects index 3cef8b9a4..c9b650fb7 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 3cef8b9a4f266ad8ab07d9dd548f3289f7c91826 +Subproject commit c9b650fb7fc9a2805736852e3423953fbcc87702 From 132251341fe12b6cb1d414e34658bb7a0297bc81 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 21 Jul 2024 20:06:40 -0500 Subject: [PATCH 52/52] Fix replay mod not showing LODs --- .../minecraft/MinecraftClientWrapper.java | 120 ++++++++++-------- .../wrappers/world/ClientLevelWrapper.java | 5 +- coreSubProjects | 2 +- 3 files changed, 69 insertions(+), 58 deletions(-) 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 13f7805d6..684240b85 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.file.structure.ClientOnlySaveStructure; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; @@ -43,6 +44,7 @@ import com.seibel.distanthorizons.core.pos.DhChunkPos; import net.minecraft.CrashReport; import net.minecraft.client.Minecraft; +import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.player.LocalPlayer; import net.minecraft.client.resources.model.ModelManager; import net.minecraft.core.BlockPos; @@ -59,16 +61,15 @@ import org.jetbrains.annotations.Nullable; * A singleton that wraps the Minecraft object. * * @author James Seibel - * @version 3-5-2022 */ -//@Environment(EnvType.CLIENT) public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecraftSharedWrapper { private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName()); + private static final Minecraft MINECRAFT = Minecraft.getInstance(); public static final MinecraftClientWrapper INSTANCE = new MinecraftClientWrapper(); - public final Minecraft mc = Minecraft.getInstance(); + /** * The lightmap for the current: @@ -99,10 +100,7 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra * This doesn't affect OpenGL objects in any way. */ @Override - public void clearFrameObjectCache() - { - lightMap = null; - } + public void clearFrameObjectCache() { this.lightMap = null; } @@ -118,10 +116,10 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra { default: case AUTO: - if (this.mc.level != null) + if (MINECRAFT.level != null) { Direction mcDir = McObjectConverter.Convert(lodDirection); - return this.mc.level.getShade(mcDir, true); + return MINECRAFT.level.getShade(mcDir, true); } else { @@ -150,47 +148,63 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra } @Override - public boolean hasSinglePlayerServer() { return mc.hasSingleplayerServer(); } + public boolean hasSinglePlayerServer() { return MINECRAFT.hasSingleplayerServer(); } @Override - public boolean clientConnectedToDedicatedServer() { return mc.getCurrentServer() != null && !this.hasSinglePlayerServer(); } + public boolean clientConnectedToDedicatedServer() { return MINECRAFT.getCurrentServer() != null && !this.hasSinglePlayerServer(); } + @Override + public boolean connectedToReplay() { return !MINECRAFT.hasSingleplayerServer() && MINECRAFT.getCurrentServer() == null; } @Override - public String getCurrentServerName() { return mc.getCurrentServer().name; } + public String getCurrentServerName() + { + if (this.connectedToReplay()) + { + return ClientOnlySaveStructure.REPLAY_SERVER_FOLDER_NAME; + } + else + { + ServerData server = MINECRAFT.getCurrentServer(); + return (server != null) ? server.name : "NULL"; + } + } @Override - public String getCurrentServerIp() { return mc.getCurrentServer().ip; } + public String getCurrentServerIp() + { + if (this.connectedToReplay()) + { + return ""; + } + else + { + ServerData server = MINECRAFT.getCurrentServer(); + return (server != null) ? server.ip : "NA"; + } + } @Override public String getCurrentServerVersion() { - return mc.getCurrentServer().version.getString(); + ServerData server = MINECRAFT.getCurrentServer(); + return (server != null) ? server.version.getString() : "UNKOWN"; } //=============// // Simple gets // //=============// - public LocalPlayer getPlayer() - { - return mc.player; - } + public LocalPlayer getPlayer() { return MINECRAFT.player; } @Override - public boolean playerExists() - { - return mc.player != null; - } + public boolean playerExists() { return MINECRAFT.player != null; } @Override - public UUID getPlayerUUID() - { - return getPlayer().getUUID(); - } + public UUID getPlayerUUID() { return this.getPlayer().getUUID(); } @Override public DhBlockPos getPlayerBlockPos() { - BlockPos playerPos = getPlayer().blockPosition(); + BlockPos playerPos = this.getPlayer().blockPosition(); return new DhBlockPos(playerPos.getX(), playerPos.getY(), playerPos.getZ()); } @@ -198,9 +212,9 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra public DhChunkPos getPlayerChunkPos() { #if MC_VER < MC_1_17_1 - ChunkPos playerPos = new ChunkPos(getPlayer().blockPosition()); + ChunkPos playerPos = new ChunkPos(this.getPlayer().blockPosition()); #else - ChunkPos playerPos = getPlayer().chunkPosition(); + ChunkPos playerPos = this.getPlayer().chunkPosition(); #endif return new DhChunkPos(playerPos.x, playerPos.z); } @@ -209,24 +223,27 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra @Override public IClientLevelWrapper getWrappedClientLevel() { - if (this.mc.level == null) + if (MINECRAFT.level == null) { return null; } - return ClientLevelWrapper.getWrapperIgnoringOverride(this.mc.level); - } - + return ClientLevelWrapper.getWrapperIgnoringOverride(MINECRAFT.level); } @Override public IProfilerWrapper getProfiler() { - if (profilerWrapper == null) - profilerWrapper = new ProfilerWrapper(mc.getProfiler()); - else if (mc.getProfiler() != profilerWrapper.profiler) - profilerWrapper.profiler = mc.getProfiler(); - return profilerWrapper; + if (this.profilerWrapper == null) + { + this.profilerWrapper = new ProfilerWrapper(MINECRAFT.getProfiler()); + } + else if (MINECRAFT.getProfiler() != this.profilerWrapper.profiler) + { + this.profilerWrapper.profiler = MINECRAFT.getProfiler(); + } + + return this.profilerWrapper; } /** Returns all worlds available to the server */ @@ -235,7 +252,7 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra { ArrayList worlds = new ArrayList(); - Iterable serverWorlds = mc.getSingleplayerServer().getAllLevels(); + Iterable serverWorlds = MINECRAFT.getSingleplayerServer().getAllLevels(); for (ServerLevel world : serverWorlds) { worlds.add(ServerLevelWrapper.getWrapper(world)); @@ -249,12 +266,12 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra @Override public void sendChatMessage(String string) { - LocalPlayer p = getPlayer(); - if (p == null) return; + LocalPlayer player = this.getPlayer(); + if (player == null) return; #if MC_VER < MC_1_19_2 - p.sendMessage(new TextComponent(string), getPlayer().getUUID()); + player.sendMessage(new TextComponent(string), getPlayer().getUUID()); #else - p.sendSystemMessage(net.minecraft.network.chat.Component.translatable(string)); + player.sendSystemMessage(net.minecraft.network.chat.Component.translatable(string)); #endif } @@ -279,24 +296,15 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra } @Override - public Object getOptionsObject() - { - return mc.options; - } + public Object getOptionsObject() { return MINECRAFT.options; } @Override - public boolean isDedicatedServer() - { - return false; - } + public boolean isDedicatedServer() { return false; } @Override - public File getInstallationDirectory() - { - return mc.gameDirectory; - } + public File getInstallationDirectory() { return MINECRAFT.gameDirectory; } @Override - public void executeOnRenderThread(Runnable runnable) { this.mc.execute(runnable); } + public void executeOnRenderThread(Runnable runnable) { MINECRAFT.execute(runnable); } } 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 5ea9dfce4..c2fb642a6 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 @@ -19,6 +19,7 @@ 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.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.chunk.ChunkAccess; @@ -42,6 +43,8 @@ public class ClientLevelWrapper implements IClientLevelWrapper private static final ConcurrentHashMap LEVEL_WRAPPER_BY_CLIENT_LEVEL = new ConcurrentHashMap<>(); // TODO can leak private static final IKeyedClientLevelManager KEYED_CLIENT_LEVEL_MANAGER = SingletonInjector.INSTANCE.get(IKeyedClientLevelManager.class); + private static final Minecraft MINECRAFT = Minecraft.getInstance(); + private final ClientLevel level; private final ClientBlockDetailMap blockMap = new ClientBlockDetailMap(this); @@ -88,7 +91,7 @@ public class ClientLevelWrapper implements IClientLevelWrapper { try { - Iterable serverLevels = MinecraftClientWrapper.INSTANCE.mc.getSingleplayerServer().getAllLevels(); + Iterable serverLevels = MINECRAFT.getSingleplayerServer().getAllLevels(); // attempt to find the server level with the same dimension type // TODO this assumes only one level per dimension type, the SubDimensionLevelMatcher will need to be added for supporting multiple levels per dimension diff --git a/coreSubProjects b/coreSubProjects index c9b650fb7..d38711ca4 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit c9b650fb7fc9a2805736852e3423953fbcc87702 +Subproject commit d38711ca4bee9ec8bb1f9a6067993a851a66f41f