From 8be161b381043158df9cca144482e3c040eea11e Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 2 Nov 2024 11:21:03 -0500 Subject: [PATCH] Add MC 1.21.3 support for Neoforge (no fabric) --- build.gradle | 3 +- .../wrappers/DependencySetupDoneCheck.java | 7 +- .../common/wrappers/block/BiomeWrapper.java | 21 +- .../wrappers/block/BlockStateWrapper.java | 21 +- .../block/TextureAtlasSpriteWrapper.java | 35 +++- .../block/TintGetterOverrideFast.java | 189 +++++++----------- .../block/TintGetterOverrideSmooth.java | 38 +++- .../block/TintWithoutLevelOverrider.java | 24 ++- .../TintWithoutLevelSmoothOverrider.java | 58 +++--- .../common/wrappers/chunk/ChunkWrapper.java | 36 ++-- .../wrappers/gui/TexturedButtonWidget.java | 79 +++++--- .../minecraft/MinecraftClientWrapper.java | 23 ++- .../minecraft/MinecraftRenderWrapper.java | 57 +++++- .../wrappers/minecraft/ProfilerWrapper.java | 20 +- .../common/wrappers/misc/LightMapWrapper.java | 20 +- .../wrappers/world/ClientLevelWrapper.java | 10 +- .../wrappers/world/ServerLevelWrapper.java | 18 +- .../BatchGenerationEnvironment.java | 62 ++++-- .../worldGeneration/GlobalParameters.java | 60 +++--- .../mimicObject/ChunkLoader.java | 78 +++++--- .../mimicObject/DhGenerationChunkHolder.java | 13 +- .../mimicObject/DhLitWorldGenRegion.java | 21 +- .../worldGeneration/step/StepBiomes.java | 40 +++- .../worldGeneration/step/StepNoise.java | 33 ++- .../1_21_3.distanthorizons.accesswidener | 46 +++++ coreSubProjects | 2 +- fabric/build.gradle | 2 +- .../mixins/client/MixinFogRenderer.java | 50 +++-- .../mixins/client/MixinGameRenderer.java | 58 ------ .../mixins/client/MixinLevelRenderer.java | 16 +- .../mixins/client/MixinLightTexture.java | 24 ++- .../mixins/server/MixinServerPlayer.java | 27 ++- .../mixins/server/MixinTracingExecutor.java | 75 +++++++ .../server/MixinUtilBackgroundThread.java | 55 +++-- .../testing/TestChunkWorldGenerator.java | 4 +- .../wrappers/modAccessor/IrisAccessor.java | 26 ++- .../DistantHorizons.fabric.mixins.json | 54 ++--- .../mixins/client/MixinGameRenderer.java | 58 ------ .../server/MixinUtilBackgroundThread.java | 4 +- .../DistantHorizons.forge.mixins.json | 1 - gradle.properties | 2 +- .../mixins/client/MixinFogRenderer.java | 55 +++-- .../mixins/client/MixinGameRenderer.java | 58 ------ .../mixins/client/MixinLevelRenderer.java | 4 +- .../mixins/client/MixinLightTexture.java | 20 ++ .../mixins/server/MixinServerPlayer.java | 33 ++- .../mixins/server/MixinTracingExecutor.java | 78 ++++++++ .../server/MixinUtilBackgroundThread.java | 42 ++-- .../DistantHorizons.neoforge.mixins.json | 44 ++-- versionProperties/1.21.3.properties | 62 ++++++ 50 files changed, 1195 insertions(+), 671 deletions(-) create mode 100644 common/src/main/resources/1_21_3.distanthorizons.accesswidener delete mode 100644 fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinGameRenderer.java create mode 100644 fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinTracingExecutor.java delete mode 100644 forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinGameRenderer.java delete mode 100644 neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinGameRenderer.java create mode 100644 neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinTracingExecutor.java create mode 100644 versionProperties/1.21.3.properties diff --git a/build.gradle b/build.gradle index c6433d2e3..bd7301de9 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ plugins { id "systems.manifold.manifold-gradle-plugin" version "0.0.2-alpha" // Architectury is used here only as a replacement for forge's own loom - id "dev.architectury.loom" version "1.6-SNAPSHOT" apply false + id "dev.architectury.loom" version "1.7-SNAPSHOT" apply false } @@ -532,6 +532,7 @@ allprojects { p -> maven { url "https://repo.enonic.com/public/" } // For parchment mappings + // versions can be found here: https://ldtteam.jfrog.io/ui/native/parchmentmc-public/org/parchmentmc/data/ maven { url "https://maven.parchmentmc.org" } // For Architectury API diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetupDoneCheck.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetupDoneCheck.java index cf1835753..5bdc31b40 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetupDoneCheck.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/DependencySetupDoneCheck.java @@ -25,7 +25,12 @@ public class DependencySetupDoneCheck { // TODO move to DependencySetup public static boolean isDone = false; - // TODO why is this here and what is its purpose? + /** + * This is used so we can override some MC logic when running + * in DH's world generator. + * Specifically so we can redirect threads to run on DH threads instead + * of MC threads. + */ public static Supplier getIsCurrentThreadDistantGeneratorThread = (() -> { return false; }); } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java index a6ce51072..d3224f326 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/BiomeWrapper.java @@ -22,6 +22,7 @@ package com.seibel.distanthorizons.common.wrappers.block; import java.io.IOException; import java.util.HashSet; import java.util.Objects; +import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; @@ -226,8 +227,10 @@ public class BiomeWrapper implements IBiomeWrapper resourceLocation = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).getKey(this.biome); #elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2 resourceLocation = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).getKey(this.biome.value()); - #else + #elif MC_VER < MC_1_21_3 resourceLocation = registryAccess.registryOrThrow(Registries.BIOME).getKey(this.biome.value()); + #else + resourceLocation = registryAccess.lookupOrThrow(Registries.BIOME).getKey(this.biome.value()); #endif if (resourceLocation == null) @@ -318,10 +321,24 @@ public class BiomeWrapper implements IBiomeWrapper Biome unwrappedBiome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation); success = (unwrappedBiome != null); Holder biome = new Holder.Direct<>(unwrappedBiome); - #else + #elif MC_VER < MC_1_21_3 Biome unwrappedBiome = registryAccess.registryOrThrow(Registries.BIOME).get(resourceLocation); success = (unwrappedBiome != null); Holder biome = new Holder.Direct<>(unwrappedBiome); + #else + Holder biome; + Optional> optionalBiomeHolder = registryAccess.lookupOrThrow(Registries.BIOME).get(resourceLocation); + if (optionalBiomeHolder.isPresent()) + { + Biome unwrappedBiome = optionalBiomeHolder.get().value(); + success = (unwrappedBiome != null); + biome = new Holder.Direct<>(unwrappedBiome); + } + else + { + success = false; + biome = null; + } #endif 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 e2ea43d98..67c004c20 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 @@ -58,6 +58,7 @@ import net.minecraft.world.level.Level; import net.minecraft.core.BlockPos; import net.minecraft.core.registries.Registries; import net.minecraft.world.level.EmptyBlockGetter; +import net.minecraft.core.Holder; #endif public class BlockStateWrapper implements IBlockStateWrapper @@ -142,10 +143,10 @@ public class BlockStateWrapper implements IBlockStateWrapper BlockState guessBlockState = (guess == null || guess.isAir()) ? null : (BlockState) guess.getWrappedMcObject(); BlockState inputBlockState = (blockState == null || blockState.isAir()) ? null : blockState; - if (guess instanceof BlockStateWrapper guessWrapper - && guessBlockState == inputBlockState) + if (guess instanceof BlockStateWrapper + && guessBlockState == inputBlockState) { - return guessWrapper; + return (BlockStateWrapper) guess; } else { @@ -362,7 +363,11 @@ public class BlockStateWrapper implements IBlockStateWrapper // +1 to indicate that the block is translucent (in between transparent and opaque) opacity = LodUtil.BLOCK_FULLY_TRANSPARENT + 1; } + #if MC_VER < MC_1_21_3 else if (this.blockState.propagatesSkylightDown(EmptyBlockGetter.INSTANCE, BlockPos.ZERO)) + #else + else if (this.blockState.propagatesSkylightDown()) + #endif { opacity = LodUtil.BLOCK_FULLY_TRANSPARENT; } @@ -481,8 +486,10 @@ public class BlockStateWrapper implements IBlockStateWrapper resourceLocation = Registry.BLOCK.getKey(this.blockState.getBlock()); #elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2 resourceLocation = registryAccess.registryOrThrow(Registry.BLOCK_REGISTRY).getKey(this.blockState.getBlock()); - #else + #elif MC_VER < MC_1_21_3 resourceLocation = registryAccess.registryOrThrow(Registries.BLOCK).getKey(this.blockState.getBlock()); + #else + resourceLocation = registryAccess.lookupOrThrow(Registries.BLOCK).getKey(this.blockState.getBlock()); #endif @@ -571,9 +578,13 @@ public class BlockStateWrapper implements IBlockStateWrapper #elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2 net.minecraft.core.RegistryAccess registryAccess = level.registryAccess(); block = registryAccess.registryOrThrow(Registry.BLOCK_REGISTRY).get(resourceLocation); - #else + #elif MC_VER < MC_1_21_3 net.minecraft.core.RegistryAccess registryAccess = level.registryAccess(); block = registryAccess.registryOrThrow(Registries.BLOCK).get(resourceLocation); + #else + net.minecraft.core.RegistryAccess registryAccess = level.registryAccess(); + Optional> optionalBlockHolder = registryAccess.lookupOrThrow(Registries.BLOCK).get(resourceLocation); + block = optionalBlockHolder.isPresent() ? optionalBlockHolder.get().value() : null; #endif diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TextureAtlasSpriteWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TextureAtlasSpriteWrapper.java index 3b777e533..1bd9888d1 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TextureAtlasSpriteWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TextureAtlasSpriteWrapper.java @@ -19,9 +19,15 @@ package com.seibel.distanthorizons.common.wrappers.block; - import net.minecraft.client.renderer.texture.TextureAtlasSprite; +#if MC_VER < MC_1_17_1 +#elif MC_VER < MC_1_21_3 +#else +import com.seibel.distanthorizons.core.util.ColorUtil; +import net.minecraft.client.renderer.texture.SpriteContents; +#endif + /** * For wrapping/utilizing around TextureAtlasSprite * @@ -29,15 +35,6 @@ import net.minecraft.client.renderer.texture.TextureAtlasSprite; */ public class TextureAtlasSpriteWrapper { - - /** - * This code is from Minecraft Forge - * Which is licensed under the terms of GNU Lesser General Public License - * as published by the Free Software Foundation version 2.1 - * of the License. - * - * The code has been modified to use TextureAtlasSprite - */ public static int getPixelRGBA(TextureAtlasSprite sprite, int frameIndex, int x, int y) { #if MC_VER < MC_1_17_1 @@ -51,13 +48,29 @@ public class TextureAtlasSpriteWrapper y += sprite.animatedTexture.getFrameY(frameIndex) * sprite.height; } return sprite.mainImage[0].getPixelRGBA(x, y); - #else + #elif MC_VER < MC_1_21_3 if (sprite.contents().animatedTexture != null) { x += sprite.contents().animatedTexture.getFrameX(frameIndex) * sprite.contents().width(); y += sprite.contents().animatedTexture.getFrameY(frameIndex) * sprite.contents().width(); } return sprite.contents().originalImage.getPixelRGBA(x, y); + #else + + SpriteContents content = sprite.contents(); // don't close, otherwise MC will be corrupted and you won't be able to re-access the texture + if (content.animatedTexture != null) + { + x += content.animatedTexture.getFrameX(frameIndex) * content.width(); + y += content.animatedTexture.getFrameY(frameIndex) * content.width(); + } + + int abgr = content.originalImage.getPixel(x, y); + // re-pack the color so we can access it normally + int a = (abgr & 0xFF000000) >>> 24; + int b = (abgr & 0x00FF0000) >>> 16; + int g = (abgr & 0x0000FF00) >>> 8; + int r = (abgr & 0x000000FF); + return ColorUtil.argbToInt(a, r, g, b); #endif } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideFast.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideFast.java index f71095818..d6e2caaf8 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideFast.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideFast.java @@ -42,15 +42,24 @@ public class TintGetterOverrideFast implements BlockAndTintGetter { LevelReader parent; - public TintGetterOverrideFast(LevelReader parent) - { - this.parent = parent; - } + + + //=============// + // constructor // + //=============// + + public TintGetterOverrideFast(LevelReader parent) { this.parent = parent; } + + + + //=========// + // methods // + //=========// private Biome _getBiome(BlockPos pos) { #if MC_VER >= MC_1_18_2 - return parent.getBiome(pos).value(); + return this.parent.getBiome(pos).value(); #else return parent.getBiome(pos); #endif @@ -63,169 +72,123 @@ public class TintGetterOverrideFast implements BlockAndTintGetter public float getShade(Direction direction, boolean bl) { return this.parent.getShade(direction, bl); } @Override - public LevelLightEngine getLightEngine() - { - return parent.getLightEngine(); - } + public LevelLightEngine getLightEngine() { return this.parent.getLightEngine(); } @Override - public int getBrightness(LightLayer lightLayer, BlockPos blockPos) - { - return parent.getBrightness(lightLayer, blockPos); - } + public int getBrightness(LightLayer lightLayer, BlockPos blockPos) { return this.parent.getBrightness(lightLayer, blockPos); } @Override - public int getRawBrightness(BlockPos blockPos, int i) - { - return parent.getRawBrightness(blockPos, i); - } + public int getRawBrightness(BlockPos blockPos, int i) { return this.parent.getRawBrightness(blockPos, i); } @Override - public boolean canSeeSky(BlockPos blockPos) - { - return parent.canSeeSky(blockPos); - } + public boolean canSeeSky(BlockPos blockPos) { return this.parent.canSeeSky(blockPos); } @Override @Nullable - public BlockEntity getBlockEntity(BlockPos blockPos) - { - return parent.getBlockEntity(blockPos); - } + public BlockEntity getBlockEntity(BlockPos blockPos) { return this.parent.getBlockEntity(blockPos); } @Override - public BlockState getBlockState(BlockPos blockPos) - { - return parent.getBlockState(blockPos); - } + public BlockState getBlockState(BlockPos blockPos) { return this.parent.getBlockState(blockPos); } @Override - public FluidState getFluidState(BlockPos blockPos) - { - return parent.getFluidState(blockPos); - } + public FluidState getFluidState(BlockPos blockPos) { return this.parent.getFluidState(blockPos); } @Override - public int getLightEmission(BlockPos blockPos) - { - return parent.getLightEmission(blockPos); - } + public int getLightEmission(BlockPos blockPos) { return this.parent.getLightEmission(blockPos); } + #if MC_VER < MC_1_21_3 @Override - public int getMaxLightLevel() - { - return parent.getMaxLightLevel(); - } + public int getMaxLightLevel() { return parent.getMaxLightLevel(); } + #else + #endif @Override public Stream getBlockStates(AABB aABB) - { - return parent.getBlockStates(aABB); - } + { return this.parent.getBlockStates(aABB); } @Override public BlockHitResult clip(ClipContext clipContext) - { - return parent.clip(clipContext); - } + { return this.parent.clip(clipContext); } @Override @Nullable public BlockHitResult clipWithInteractionOverride(Vec3 vec3, Vec3 vec32, BlockPos blockPos, VoxelShape voxelShape, BlockState blockState) - { - return parent.clipWithInteractionOverride(vec3, vec32, blockPos, voxelShape, blockState); - } + { return this.parent.clipWithInteractionOverride(vec3, vec32, blockPos, voxelShape, blockState); } @Override public double getBlockFloorHeight(VoxelShape voxelShape, Supplier supplier) - { - return parent.getBlockFloorHeight(voxelShape, supplier); - } + { return this.parent.getBlockFloorHeight(voxelShape, supplier); } @Override - public double getBlockFloorHeight(BlockPos blockPos) - { - return parent.getBlockFloorHeight(blockPos); - } + public double getBlockFloorHeight(BlockPos blockPos) { return this.parent.getBlockFloorHeight(blockPos); } + #if MC_VER < MC_1_21_3 @Override - public int getMaxBuildHeight() - { - return parent.getMaxBuildHeight(); - } + public int getMaxBuildHeight() { return this.parent.getMaxBuildHeight(); } + #else + @Override + public int getMaxY() { return this.parent.getMaxY(); } + #endif + + + + //==============// + // post MC 1.17 // + //==============// #if MC_VER >= MC_1_17_1 @Override public Optional getBlockEntity(BlockPos blockPos, BlockEntityType blockEntityType) - { - return parent.getBlockEntity(blockPos, blockEntityType); - } + { return this.parent.getBlockEntity(blockPos, blockEntityType); } @Override public BlockHitResult isBlockInLine(ClipBlockStateContext clipBlockStateContext) - { - return parent.isBlockInLine(clipBlockStateContext); - } + { return this.parent.isBlockInLine(clipBlockStateContext); } @Override - public int getHeight() - { - return parent.getHeight(); - } + public int getHeight() { return this.parent.getHeight(); } + + #if MC_VER < MC_1_21_3 + @Override + public int getMinBuildHeight() { return this.parent.getMinBuildHeight(); } + #else + @Override + public int getMinY() { return this.parent.getMinY(); } + #endif @Override - public int getMinBuildHeight() - { - return parent.getMinBuildHeight(); - } + public int getSectionsCount() { return this.parent.getSectionsCount(); } + + #if MC_VER < MC_1_21_3 + @Override + public int getMinSection() { return this.parent.getMinSection(); } + #else + @Override + public int getMinSectionY() { return BlockAndTintGetter.super.getMinSectionY(); } + #endif + + #if MC_VER < MC_1_21_3 + @Override + public int getMaxSection() { return this.parent.getMaxSection(); } + #else + @Override + public int getMaxSectionY() { return this.parent.getMaxSectionY(); } + #endif @Override - public int getSectionsCount() - { - return parent.getSectionsCount(); - } + public boolean isOutsideBuildHeight(BlockPos blockPos) { return this.parent.isOutsideBuildHeight(blockPos); } @Override - public int getMinSection() - { - return parent.getMinSection(); - } + public boolean isOutsideBuildHeight(int i) { return this.parent.isOutsideBuildHeight(i); } @Override - public int getMaxSection() - { - return parent.getMaxSection(); - } + public int getSectionIndex(int i) { return this.parent.getSectionIndex(i); } @Override - public boolean isOutsideBuildHeight(BlockPos blockPos) - { - return parent.isOutsideBuildHeight(blockPos); - } + public int getSectionIndexFromSectionY(int i) { return this.parent.getSectionIndexFromSectionY(i); } @Override - public boolean isOutsideBuildHeight(int i) - { - return parent.isOutsideBuildHeight(i); - } - - @Override - public int getSectionIndex(int i) - { - return parent.getSectionIndex(i); - } - - @Override - public int getSectionIndexFromSectionY(int i) - { - return parent.getSectionIndexFromSectionY(i); - } - - @Override - public int getSectionYFromSectionIndex(int i) - { - return parent.getSectionYFromSectionIndex(i); - } + public int getSectionYFromSectionIndex(int i) { return this.parent.getSectionYFromSectionIndex(i); } #endif } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideSmooth.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideSmooth.java index a840f3868..d99049868 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideSmooth.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintGetterOverrideSmooth.java @@ -19,6 +19,7 @@ package com.seibel.distanthorizons.common.wrappers.block; +import com.seibel.distanthorizons.core.util.LodUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Cursor3D; import net.minecraft.core.Direction; @@ -44,16 +45,28 @@ public class TintGetterOverrideSmooth implements BlockAndTintGetter LevelReader parent; public int smoothingRange; + + + //=============// + // constructor // + //=============// + public TintGetterOverrideSmooth(LevelReader parent, int smoothingRange) { this.parent = parent; this.smoothingRange = smoothingRange; } + + + //=========// + // methods // + //=========// + private Biome _getBiome(BlockPos pos) { #if MC_VER >= MC_1_18_2 - return parent.getBiome(pos).value(); + return this.parent.getBiome(pos).value(); #else return parent.getBiome(pos); #endif @@ -113,8 +126,11 @@ public class TintGetterOverrideSmooth implements BlockAndTintGetter @Override public int getLightEmission(BlockPos blockPos) { return this.parent.getLightEmission(blockPos); } + #if MC_VER < MC_1_21_3 @Override public int getMaxLightLevel() { return this.parent.getMaxLightLevel(); } + #else + #endif @Override public Stream getBlockStates(AABB aABB) { return this.parent.getBlockStates(aABB); } @@ -135,8 +151,13 @@ public class TintGetterOverrideSmooth implements BlockAndTintGetter @Override public double getBlockFloorHeight(BlockPos blockPos) { return this.parent.getBlockFloorHeight(blockPos); } + #if MC_VER < MC_1_21_3 @Override public int getMaxBuildHeight() { return this.parent.getMaxBuildHeight(); } + #else + @Override + public int getMaxY() { return this.parent.getMaxY(); } + #endif #if MC_VER >= MC_1_17_1 @Override @@ -148,17 +169,32 @@ public class TintGetterOverrideSmooth implements BlockAndTintGetter @Override public int getHeight() { return this.parent.getHeight(); } + #if MC_VER < MC_1_21_3 @Override public int getMinBuildHeight() { return this.parent.getMinBuildHeight(); } + #else + @Override + public int getMinY() { return this.parent.getMinY(); } + #endif @Override public int getSectionsCount() { return this.parent.getSectionsCount(); } + #if MC_VER < MC_1_21_3 @Override public int getMinSection() { return this.parent.getMinSection(); } + #else + @Override + public int getMinSectionY() { return BlockAndTintGetter.super.getMinSectionY(); } + #endif + #if MC_VER < MC_1_21_3 @Override public int getMaxSection() { return this.parent.getMaxSection(); } + #else + @Override + public int getMaxSectionY() { return this.parent.getMaxSectionY(); } + #endif @Override public boolean isOutsideBuildHeight(BlockPos blockPos) { return this.parent.isOutsideBuildHeight(blockPos); } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelOverrider.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelOverrider.java index 4c27070fc..870f1531c 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelOverrider.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelOverrider.java @@ -132,17 +132,27 @@ public class TintWithoutLevelOverrider implements BlockAndTintGetter } + + //==============// + // post MC 1.17 // + //==============// + #if MC_VER >= MC_1_17_1 + @Override public int getHeight() - { - throw new UnsupportedOperationException("ERROR: getHeight() called on TintWithoutLevelOverrider. Object is for tinting only."); - } + { throw new UnsupportedOperationException("ERROR: getHeight() called on TintWithoutLevelOverrider. Object is for tinting only."); } + + #if MC_VER < MC_1_21_3 @Override - public int getMinBuildHeight() - { - throw new UnsupportedOperationException("ERROR: getMinBuildHeight() called on TintWithoutLevelOverrider. Object is for tinting only."); - } + public int getMinBuildHeight() + { throw new UnsupportedOperationException("ERROR: getMinBuildHeight() called on TintWithoutLevelOverrider. Object is for tinting only."); } + #else + @Override + public int getMinY() + { throw new UnsupportedOperationException("ERROR: getMinY() called on TintWithoutLevelOverrider. Object is for tinting only."); } + #endif + #endif } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelSmoothOverrider.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelSmoothOverrider.java index 04a9b41b1..bc8fef2f4 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelSmoothOverrider.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/block/TintWithoutLevelSmoothOverrider.java @@ -39,11 +39,24 @@ public class TintWithoutLevelSmoothOverrider implements BlockAndTintGetter final BiomeWrapper biome; public int smoothingRange; + + + //=============// + // constructor // + //=============// + public TintWithoutLevelSmoothOverrider(BiomeWrapper biome, int smoothingRange) { this.biome = biome; this.smoothingRange = smoothingRange; } + + + + //=========// + // methods // + //=========// + @Override public int getBlockTint(BlockPos blockPos, ColorResolver colorResolver) { @@ -57,7 +70,7 @@ public class TintWithoutLevelSmoothOverrider implements BlockAndTintGetter return biome; #endif } -// + // public int calculateBlockTint(BlockPos blockPos, ColorResolver colorResolver) // { // int i = smoothingRange; @@ -89,44 +102,43 @@ public class TintWithoutLevelSmoothOverrider implements BlockAndTintGetter @Override public float getShade(Direction direction, boolean shade) - { - throw new UnsupportedOperationException("ERROR: getShade() called on TintWithoutLevelOverrider. Object is for tinting only."); - } + { throw new UnsupportedOperationException("ERROR: getShade() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); } @Override public LevelLightEngine getLightEngine() - { - throw new UnsupportedOperationException("ERROR: getLightEngine() called on TintWithoutLevelOverrider. Object is for tinting only."); - } + { throw new UnsupportedOperationException("ERROR: getLightEngine() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); } @Nullable @Override public BlockEntity getBlockEntity(BlockPos pos) - { - throw new UnsupportedOperationException("ERROR: getBlockEntity() called on TintWithoutLevelOverrider. Object is for tinting only."); - } + { throw new UnsupportedOperationException("ERROR: getBlockEntity() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); } @Override public BlockState getBlockState(BlockPos pos) - { - throw new UnsupportedOperationException("ERROR: getBlockState() called on TintWithoutLevelOverrider. Object is for tinting only."); - } + { throw new UnsupportedOperationException("ERROR: getBlockState() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); } @Override public FluidState getFluidState(BlockPos pos) - { - throw new UnsupportedOperationException("ERROR: getFluidState() called on TintWithoutLevelOverrider. Object is for tinting only."); - } + { throw new UnsupportedOperationException("ERROR: getFluidState() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); } + //==============// + // post MC 1.17 // + //==============// + #if MC_VER >= MC_1_17_1 + @Override public int getHeight() - { - throw new UnsupportedOperationException("ERROR: getHeight() called on TintWithoutLevelOverrider. Object is for tinting only."); - } + { throw new UnsupportedOperationException("ERROR: getHeight() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); } + + #if MC_VER < MC_1_21_3 @Override - public int getMinBuildHeight() - { - throw new UnsupportedOperationException("ERROR: getMinBuildHeight() called on TintWithoutLevelOverrider. Object is for tinting only."); - } + public int getMinBuildHeight() + { throw new UnsupportedOperationException("ERROR: getMinBuildHeight() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); } + #else + @Override + public int getMinY() + { throw new UnsupportedOperationException("ERROR: getMinY() called on TintWithoutLevelSmoothOverrider. Object is for tinting only."); } + #endif + #endif } 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 55aec2a7e..36cd6b145 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 @@ -23,12 +23,9 @@ import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper; import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper; import com.seibel.distanthorizons.common.wrappers.misc.MutableBlockPosWrapper; import com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject.DhLitWorldGenRegion; -import com.seibel.distanthorizons.core.api.internal.SharedApi; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos; import com.seibel.distanthorizons.core.pos.DhChunkPos; -import com.seibel.distanthorizons.core.util.LodUtil; -import com.seibel.distanthorizons.core.world.EWorldEnvironment; import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.ChunkLightStorage; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; @@ -36,19 +33,14 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IMutableBlockPosWr import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; -import net.minecraft.client.multiplayer.ClientChunkCache; -import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; -import net.minecraft.world.level.LightLayer; import net.minecraft.world.level.chunk.ChunkAccess; -import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.levelgen.Heightmap; import org.apache.logging.log4j.Logger; import java.util.*; -import java.util.concurrent.ConcurrentLinkedQueue; #if MC_VER >= MC_1_17_1 import net.minecraft.core.QuartPos; @@ -72,8 +64,6 @@ import net.minecraft.world.level.chunk.LevelChunkSection; #if MC_VER >= MC_1_20_1 import net.minecraft.world.level.chunk.LevelChunkSection; -import net.minecraft.world.level.lighting.LevelLightEngine; -import net.minecraft.core.SectionPos; #endif #if MC_VER <= MC_1_20_4 @@ -143,19 +133,29 @@ public class ChunkWrapper implements IChunkWrapper } @Override - public int getMinBuildHeight() { return getMinBuildHeight(this.chunk); } - public static int getMinBuildHeight(ChunkAccess chunk) + public int getInclusiveMinBuildHeight() { return getInclusiveMinBuildHeight(this.chunk); } + public static int getInclusiveMinBuildHeight(ChunkAccess chunk) { #if MC_VER < MC_1_17_1 return 0; - #else + #elif MC_VER < MC_1_21_3 return chunk.getMinBuildHeight(); + #else + return chunk.getMinY(); #endif } @Override - public int getMaxBuildHeight() { return getMaxBuildHeight(this.chunk); } - public static int getMaxBuildHeight(ChunkAccess chunk) { return chunk.getMaxBuildHeight(); } + public int getExclusiveMaxBuildHeight() { return getExclusiveMaxBuildHeight(this.chunk); } + public static int getExclusiveMaxBuildHeight(ChunkAccess chunk) + { + #if MC_VER < MC_1_21_3 + return chunk.getMaxBuildHeight(); + #else + // +1 since Minecraft made the max value inclusive + return chunk.getMaxY() + 1; + #endif + } @Override public int getMinNonEmptyHeight() @@ -167,7 +167,7 @@ public class ChunkWrapper implements IChunkWrapper // default if every section is empty or missing - this.minNonEmptyHeight = this.getMinBuildHeight(); + this.minNonEmptyHeight = this.getInclusiveMinBuildHeight(); // determine the lowest empty section (bottom up) LevelChunkSection[] sections = this.chunk.getSections(); @@ -199,7 +199,7 @@ public class ChunkWrapper implements IChunkWrapper // default if every section is empty or missing - this.maxNonEmptyHeight = this.getMaxBuildHeight(); + this.maxNonEmptyHeight = this.getExclusiveMaxBuildHeight(); // determine the highest empty section (top down) LevelChunkSection[] sections = this.chunk.getSections(); @@ -232,7 +232,7 @@ public class ChunkWrapper implements IChunkWrapper return section.hasOnlyAir(); #endif } - private int getChunkSectionMinHeight(int index) { return (index * 16) + this.getMinBuildHeight(); } + private int getChunkSectionMinHeight(int index) { return (index * 16) + this.getInclusiveMinBuildHeight(); } @Override diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java index c69a9ad49..c95098e40 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/gui/TexturedButtonWidget.java @@ -19,31 +19,36 @@ package com.seibel.distanthorizons.common.wrappers.gui; -/** - * Creates a button with a texture on it (and a background) that works with all mc versions - * - * @author coolGi - * @version 2023-10-03 - */ - - -import com.mojang.blaze3d.systems.RenderSystem; -import net.minecraft.client.gui.components.AbstractButton; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.ImageButton; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; #if MC_VER >= MC_1_17_1 -import net.minecraft.client.renderer.GameRenderer; +import net.minecraft.client.gui.components.Button; #endif -#if MC_VER < MC_1_20_1 + +#if MC_VER < MC_1_17_1 +import net.minecraft.client.gui.components.ImageButton; +import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.Minecraft; +#elif MC_VER < MC_1_20_1 +import net.minecraft.client.gui.components.ImageButton; +import com.mojang.blaze3d.vertex.PoseStack; +import com.mojang.blaze3d.systems.RenderSystem; +import net.minecraft.client.renderer.GameRenderer; +#elif MC_VER < MC_1_20_2 +import net.minecraft.client.gui.components.ImageButton; +import net.minecraft.client.gui.GuiGraphics; #else import net.minecraft.client.gui.GuiGraphics; #endif +/** + * Creates a button with a texture on it (and a background) that works with all mc versions + * + * @author coolGi + * @version 2023-10-03 + */ #if MC_VER < MC_1_20_2 public class TexturedButtonWidget extends ImageButton #else @@ -57,20 +62,21 @@ public class TexturedButtonWidget extends Button private final int v; private final int hoveredVOffset; - private final ResourceLocation texture; + private final ResourceLocation textureResourceLocation; private final int textureWidth; private final int textureHeight; #endif - public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, ResourceLocation texture, int textureWidth, int textureHeight, OnPress pressAction, Component text) { - this(x, y, width, height, u, v, hoveredVOffset, texture, textureWidth, textureHeight, pressAction, text, true); + public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, ResourceLocation textureResourceLocation, int textureWidth, int textureHeight, OnPress pressAction, Component text) + { + this(x, y, width, height, u, v, hoveredVOffset, textureResourceLocation, textureWidth, textureHeight, pressAction, text, true); } - public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, ResourceLocation texture, int textureWidth, int textureHeight, OnPress pressAction, Component text, boolean renderBackground) + public TexturedButtonWidget(int x, int y, int width, int height, int u, int v, int hoveredVOffset, ResourceLocation textureResourceLocation, int textureWidth, int textureHeight, OnPress pressAction, Component text, boolean renderBackground) { #if MC_VER < MC_1_20_2 - super(x, y, width, height, u, v, hoveredVOffset, texture, textureWidth, textureHeight, pressAction, text); + super(x, y, width, height, u, v, hoveredVOffset, textureResourceLocation, textureWidth, textureHeight, pressAction, text); #else // We don't pass on the text option as otherwise it will render (we normally pass it for narration) // TODO: Find a fix for it @@ -80,7 +86,7 @@ public class TexturedButtonWidget extends Button this.v = v; this.hoveredVOffset = hoveredVOffset; - this.texture = texture; + this.textureResourceLocation = textureResourceLocation; this.textureWidth = textureWidth; this.textureHeight = textureHeight; @@ -92,7 +98,8 @@ public class TexturedButtonWidget extends Button #if MC_VER < MC_1_20_2 #if MC_VER < MC_1_19_4 @Override - public void renderButton(PoseStack matrices, int mouseX, int mouseY, float delta) { + public void renderButton(PoseStack matrices, int mouseX, int mouseY, float delta) + { if (this.renderBackground) // Renders the background of the button { #if MC_VER < MC_1_17_1 @@ -119,6 +126,7 @@ public class TexturedButtonWidget extends Button super.renderButton(matrices, mouseX, mouseY, delta); } + #else #if MC_VER < MC_1_20_1 @Override @@ -154,24 +162,43 @@ public class TexturedButtonWidget extends Button super.renderWidget(matrices, mouseX, mouseY, delta); } #endif + #else @Override public void renderWidget(GuiGraphics matrices, int mouseX, int mouseY, float delta) { if (this.renderBackground) { - //RenderSystem.enableBlend(); - //RenderSystem.enableDepthTest(); + #if MC_VER < MC_1_21_3 matrices.blitSprite(SPRITES.get(this.active, this.isHoveredOrFocused()), this.getX(), this.getY(), this.getWidth(), this.getHeight()); + #else + // TODO + //matrices.blitSprite( + // (resourceLocation) -> RenderType.solid(), + // this.textureResourceLocation, this.getX(), this.getY(), this.getWidth(), this.getHeight()); + #endif } // Renders the sprite int i = 0; - if (!this.active) i = 2; - else if (this.isHovered) i = 1; + if (!this.active) + { + i = 2; + } + else if (this.isHovered) + { + i = 1; + } - matrices.blit(this.texture, this.getX(), this.getY(), this.u, this.v + (this.hoveredVOffset * i), this.width, this.height, this.textureWidth, this.textureHeight); + #if MC_VER < MC_1_21_3 + matrices.blit(this.textureResourceLocation, this.getX(), this.getY(), this.u, this.v + (this.hoveredVOffset * i), this.width, this.height, this.textureWidth, this.textureHeight); + #else + // TODO + //matrices.blit( + // (resourceLocation) -> RenderType.solid(), + // this.textureResourceLocation, this.getX(), this.getY(), this.u, this.v + (this.hoveredVOffset * i), this.width, this.height, this.textureWidth, this.textureHeight); + #endif } #endif } 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 7b8b27df0..1b2771322 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 @@ -54,10 +54,16 @@ import net.minecraft.core.Direction; import net.minecraft.network.chat.TextComponent; #endif import net.minecraft.server.level.ServerLevel; +import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.world.level.ChunkPos; import org.apache.logging.log4j.Logger; import org.jetbrains.annotations.Nullable; +#if MC_VER < MC_1_21_3 +#else +import net.minecraft.util.profiling.Profiler; +#endif + /** * A singleton that wraps the Minecraft object. * @@ -243,13 +249,20 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra @Override public IProfilerWrapper getProfiler() { + ProfilerFiller profiler; + #if MC_VER < MC_1_21_3 + profiler = MINECRAFT.getProfiler(); + #else + profiler = Profiler.get(); + #endif + if (this.profilerWrapper == null) { - this.profilerWrapper = new ProfilerWrapper(MINECRAFT.getProfiler()); + this.profilerWrapper = new ProfilerWrapper(profiler); } - else if (MINECRAFT.getProfiler() != this.profilerWrapper.profiler) + else if (profiler != this.profilerWrapper.profiler) { - this.profilerWrapper.profiler = MINECRAFT.getProfiler(); + this.profilerWrapper.profiler = profiler; } return this.profilerWrapper; @@ -282,8 +295,10 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra } #if MC_VER < MC_1_19_2 player.sendMessage(new TextComponent(string), getPlayer().getUUID()); - #else + #elif MC_VER < MC_1_21_3 player.sendSystemMessage(net.minecraft.network.chat.Component.translatable(string)); + #else + player.displayClientMessage(net.minecraft.network.chat.Component.translatable(string), /*isOverlay*/false); #endif } 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 02b05a675..1f3b9a09f 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 @@ -30,6 +30,7 @@ import com.seibel.distanthorizons.common.wrappers.misc.LightMapWrapper; import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.util.ColorUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper; #if MC_VER >= MC_1_17_1 @@ -43,7 +44,6 @@ import org.joml.Vector3f; #else #endif #if MC_VER >= MC_1_20_2 -import net.minecraft.client.renderer.chunk.SectionRenderDispatcher; #endif import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOptifineAccessor; @@ -69,6 +69,7 @@ import net.minecraft.world.level.material.FogType; #endif import net.minecraft.world.phys.Vec3; import org.apache.logging.log4j.Logger; +import org.joml.Vector4f; /** @@ -136,16 +137,30 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper #if MC_VER < MC_1_17_1 float[] colorValues = new float[4]; GL15.glGetFloatv(GL15.GL_FOG_COLOR, colorValues); - #else + return new Color( + Math.max(0f, Math.min(colorValues[0], 1f)), // r + Math.max(0f, Math.min(colorValues[1], 1f)), // g + Math.max(0f, Math.min(colorValues[2], 1f)), // b + Math.max(0f, Math.min(colorValues[3], 1f)) // a + ); + #elif MC_VER < MC_1_21_3 FogRenderer.setupColor(MC.gameRenderer.getMainCamera(), partialTicks, MC.level, 1, MC.gameRenderer.getDarkenWorldAmount(partialTicks)); float[] colorValues = RenderSystem.getShaderFogColor(); - #endif return new Color( - Math.max(0f, Math.min(colorValues[0], 1f)), - Math.max(0f, Math.min(colorValues[1], 1f)), - Math.max(0f, Math.min(colorValues[2], 1f)), - Math.max(0f, Math.min(colorValues[3], 1f)) + Math.max(0f, Math.min(colorValues[0], 1f)), // r + Math.max(0f, Math.min(colorValues[1], 1f)), // g + Math.max(0f, Math.min(colorValues[2], 1f)), // b + Math.max(0f, Math.min(colorValues[3], 1f)) // a ); + #else + Vector4f colorValues = FogRenderer.computeFogColor(MC.gameRenderer.getMainCamera(), partialTicks, MC.level, 1, MC.gameRenderer.getDarkenWorldAmount(partialTicks)); + return new Color( + Math.max(0f, Math.min(colorValues.x, 1f)), // r + Math.max(0f, Math.min(colorValues.y, 1f)), // g + Math.max(0f, Math.min(colorValues.z, 1f)), // b + Math.max(0f, Math.min(colorValues.w, 1f)) // a + ); + #endif } // getSpecialFogColor() is the same as getFogColor() @@ -157,16 +172,22 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper float frameTime; #if MC_VER < MC_1_21_1 frameTime = MC.getFrameTime(); - #else + #elif MC_VER < MC_1_21_3 frameTime = MC.getTimer().getRealtimeDeltaTicks(); + #else + frameTime = MC.deltaTracker.getGameTimeDeltaTicks(); #endif #if MC_VER < MC_1_17_1 Vec3 colorValues = MC.level.getSkyColor(MC.gameRenderer.getMainCamera().getBlockPosition(), frameTime); - #else - Vec3 colorValues = MC.level.getSkyColor(MC.gameRenderer.getMainCamera().getPosition(), frameTime); - #endif return new Color((float) colorValues.x, (float) colorValues.y, (float) colorValues.z); + #elif MC_VER < MC_1_21_3 + Vec3 colorValues = MC.level.getSkyColor(MC.gameRenderer.getMainCamera().getPosition(), frameTime); + return new Color((float) colorValues.x, (float) colorValues.y, (float) colorValues.z); + #else + int argbColorInt = MC.level.getSkyColor(MC.gameRenderer.getMainCamera().getPosition(), frameTime);; + return ColorUtil.toColorObjARGB(argbColorInt); // TODO MC changed color formats + #endif } else { @@ -281,6 +302,10 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper #endif } + /** + * It's better to use {@link MinecraftRenderWrapper#setLightmapId(int, IClientLevelWrapper)} if possible, + * however old MC versions don't support it. + */ public void updateLightmap(NativeImage lightPixels, IClientLevelWrapper level) { // Using ClientLevelWrapper as the key would be better, but we don't have a consistent way to create the same @@ -291,5 +316,15 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper LightMapWrapper wrapper = this.lightmapByDimensionType.computeIfAbsent(dimensionType, (dimType) -> new LightMapWrapper()); wrapper.uploadLightmap(lightPixels); } + public void setLightmapId(int tetxureId, IClientLevelWrapper level) + { + // Using ClientLevelWrapper as the key would be better, but we don't have a consistent way to create the same + // object for the same MC level and/or the same hash, + // so this will have to do for now + IDimensionTypeWrapper dimensionType = level.getDimensionType(); + + LightMapWrapper wrapper = this.lightmapByDimensionType.computeIfAbsent(dimensionType, (dimType) -> new LightMapWrapper()); + wrapper.setLightmapId(tetxureId); + } } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/ProfilerWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/ProfilerWrapper.java index 66f236fd3..3ece6c42e 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/ProfilerWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/ProfilerWrapper.java @@ -31,31 +31,19 @@ public class ProfilerWrapper implements IProfilerWrapper { public ProfilerFiller profiler; - public ProfilerWrapper(ProfilerFiller newProfiler) - { - profiler = newProfiler; - } + public ProfilerWrapper(ProfilerFiller newProfiler) { this.profiler = newProfiler; } /** starts a new section inside the currently running section */ @Override - public void push(String newSection) - { - profiler.push(newSection); - } + public void push(String newSection) { this.profiler.push(newSection); } /** ends the currently running section and starts a new one */ @Override - public void popPush(String newSection) - { - profiler.popPush(newSection); - } + public void popPush(String newSection) { this.profiler.popPush(newSection); } /** ends the currently running section */ @Override - public void pop() - { - profiler.pop(); - } + public void pop() { this.profiler.pop(); } } 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 4754ba04c..ac0db1873 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 @@ -20,6 +20,7 @@ package com.seibel.distanthorizons.common.wrappers.misc; import com.mojang.blaze3d.platform.NativeImage; +import com.seibel.distanthorizons.core.render.glObject.GLState; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper; import org.lwjgl.opengl.GL32; @@ -30,6 +31,7 @@ public class LightMapWrapper implements ILightMapWrapper private int textureId = 0; + //==============// // constructors // //==============// @@ -38,9 +40,9 @@ public class LightMapWrapper implements ILightMapWrapper - //=========// - // methods // - //=========// + //==================// + // lightmap syncing // + //==================// public void uploadLightmap(NativeImage image) { @@ -64,6 +66,17 @@ public class LightMapWrapper implements ILightMapWrapper 0, image.format().glFormat(), GL32.GL_UNSIGNED_BYTE, (ByteBuffer) null); } + public void setLightmapId(int minecraftLightmapTetxureId) + { + // just use the MC texture ID + this.textureId = minecraftLightmapTetxureId; + } + + + + //==============// + // lightmap use // + //==============// @Override public void bind() @@ -76,3 +89,4 @@ public class LightMapWrapper implements ILightMapWrapper public void unbind() { GL32.glBindTexture(GL32.GL_TEXTURE_2D, 0); } } + 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 2b8276731..a98ffd646 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 @@ -13,6 +13,7 @@ import com.seibel.distanthorizons.core.level.IServerKeyedClientLevel; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos; import com.seibel.distanthorizons.core.pos.DhChunkPos; +import com.seibel.distanthorizons.core.util.ColorUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper; @@ -210,8 +211,10 @@ public class ClientLevelWrapper implements IClientLevelWrapper { #if MC_VER < MC_1_17_1 return 0; - #else + #elif MC_VER < MC_1_21_3 return this.level.getMinBuildHeight(); + #else + return this.level.getMinY(); #endif } @@ -291,8 +294,13 @@ public class ClientLevelWrapper implements IClientLevelWrapper @Override public Color getCloudColor(float tickDelta) { + #if MC_VER < MC_1_21_3 Vec3 colorVec3 = this.level.getCloudColor(tickDelta); return new Color((float)colorVec3.x, (float)colorVec3.y, (float)colorVec3.z); + #else + int argbColor = this.level.getCloudColor(tickDelta); + return ColorUtil.toColorObjARGB(argbColor); + #endif } 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 0c6e82f13..aa85b1742 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 @@ -47,6 +47,11 @@ import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.status.ChunkStatus; #endif +#if MC_VER < MC_1_21_3 +#else +import java.nio.file.Path; +#endif + import org.apache.logging.log4j.Logger; public class ServerLevelWrapper implements IServerLevelWrapper @@ -76,7 +81,14 @@ public class ServerLevelWrapper implements IServerLevelWrapper //=========// @Override - public File getMcSaveFolder() { return this.level.getChunkSource().getDataStorage().dataFolder; } + public File getMcSaveFolder() + { + #if MC_VER < MC_1_21_3 + return this.level.getChunkSource().getDataStorage().dataFolder; + #else + return this.level.getChunkSource().getDataStorage().dataFolder.toFile(); + #endif + } @Override public DimensionTypeWrapper getDimensionType() { return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType()); } @@ -103,8 +115,10 @@ public class ServerLevelWrapper implements IServerLevelWrapper { #if MC_VER < MC_1_17_1 return 0; - #else + #elif MC_VER < MC_1_21_3 return this.level.getMinBuildHeight(); + #else + return this.level.getMinY(); #endif } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/BatchGenerationEnvironment.java index 30d62dd77..cad00a565 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 @@ -56,12 +56,6 @@ import com.seibel.distanthorizons.common.wrappers.worldGeneration.step.StepStruc import com.seibel.distanthorizons.common.wrappers.worldGeneration.step.StepStructureStart; import com.seibel.distanthorizons.common.wrappers.worldGeneration.step.StepSurface; -#if MC_VER >= MC_1_19_4 -import net.minecraft.core.registries.Registries; -#else -import net.minecraft.core.Registry; -#endif - import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.chunk.ChunkAccess; @@ -78,6 +72,12 @@ import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; import net.minecraft.nbt.CompoundTag; import org.apache.logging.log4j.LogManager; +#if MC_VER >= MC_1_19_4 +import net.minecraft.core.registries.Registries; +#else +import net.minecraft.core.Registry; +#endif + #if MC_VER <= MC_1_20_4 import net.minecraft.world.level.chunk.ChunkStatus; #else @@ -301,15 +301,31 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv // synchronization // //=================// - public T joinSync(CompletableFuture future) + /** + * This method checks to make sure that all world gen is being + * run on DH threads instead of leaking out to other MC threads. + * This is done to prevent putting undue stress on MC threads + * and prevent potential issues with concurrent processing. + */ + public T confirmFutureWasRunSynchronously(CompletableFuture future) { - if (!unsafeThreadingRecorded && !future.isDone()) + // this operation should be done since DH wants the + // operation to be done synchronously + if (!this.unsafeThreadingRecorded && !future.isDone()) { - EVENT_LOGGER.error("Unsafe MultiThreading in Chunk Generator: ", new RuntimeException("Concurrent future")); - EVENT_LOGGER.error("To increase stability, it is recommended to set world generation threads count to 1."); - unsafeThreadingRecorded = true; + EVENT_LOGGER.warn( + "Unsafe MultiThreading in Distant Horizons Chunk Generator. \n" + + "This can happen if world generation is run on one of Minecraft's thread pools " + + "instead of the thread DH provided. \n" + + "This can likely be ignored, however if world generator crashes occur" + + "to increase stability, set DH's world generation thread count to 1.", + new RuntimeException("Incorrect thread pool use")); + this.unsafeThreadingRecorded = true; } + // if the future wasn't done synchronously, + // wait for it to finish so we can continue the world gen + // lifecycle like normal return future.join(); } @@ -681,21 +697,23 @@ public final class BatchGenerationEnvironment extends AbstractBatchGenerationEnv } private static ProtoChunk CreateEmptyChunk(ServerLevel level, ChunkPos chunkPos) { - return new ProtoChunk(chunkPos, UpgradeData.EMPTY - #if MC_VER >= MC_1_17_1 , level #endif - #if MC_VER >= MC_1_18_2 , level.registryAccess().registryOrThrow( - #if MC_VER < MC_1_19_4 - Registry.BIOME_REGISTRY - #else - Registries.BIOME - #endif - ), null #endif - ); + #if MC_VER <= MC_1_16_5 + return new ProtoChunk(chunkPos, UpgradeData.EMPTY); + #elif MC_VER <= MC_1_17_1 + return new ProtoChunk(chunkPos, UpgradeData.EMPTY, level); + #elif MC_VER <= MC_1_19_2 + return new ProtoChunk(chunkPos, UpgradeData.EMPTY, level, level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY), null); + #elif MC_VER <= MC_1_19_4 + return new ProtoChunk(chunkPos, UpgradeData.EMPTY, level, level.registryAccess().registryOrThrow(Registries.BIOME), null); + #elif MC_VER < MC_1_21_3 + return new ProtoChunk(chunkPos, UpgradeData.EMPTY, level, level.registryAccess().registryOrThrow(Registries.BIOME), null); + #else + return new ProtoChunk(chunkPos, UpgradeData.EMPTY, level, level.registryAccess().lookupOrThrow(Registries.BIOME), null); + #endif } - public void generateDirect( GenerationEvent genEvent, ArrayGridList chunksToGenerate, int border, EDhApiWorldGenerationStep step, DhLitWorldGenRegion region) throws InterruptedException diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/GlobalParameters.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/GlobalParameters.java index ac7e1c639..6d07ccfb3 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/GlobalParameters.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/GlobalParameters.java @@ -50,23 +50,26 @@ import net.minecraft.world.level.storage.WorldData; public final class GlobalParameters { public final ChunkGenerator generator; - #if MC_VER < MC_1_19_2 - public final StructureManager structures; - #else - public final StructureTemplateManager structures; - public final RandomState randomState; - #endif - #if MC_VER < MC_1_19_4 - public final WorldGenSettings worldGenSettings; - #else - public final WorldOptions worldOptions; - #endif public final IDhServerLevel lodLevel; public final ServerLevel level; public final Registry biomes; public final RegistryAccess registry; public final long worldSeed; public final DataFixer fixerUpper; + + #if MC_VER < MC_1_19_2 + public final StructureManager structures; + #else + public final StructureTemplateManager structures; + public final RandomState randomState; + #endif + + #if MC_VER < MC_1_19_4 + public final WorldGenSettings worldGenSettings; + #else + public final WorldOptions worldOptions; + #endif + #if MC_VER >= MC_1_18_2 public final BiomeManager biomeManager; public final ChunkScanAccess chunkScanner; // FIXME: Figure out if this is actually needed @@ -76,29 +79,34 @@ public final class GlobalParameters { this.lodLevel = lodLevel; - level = ((ServerLevelWrapper) lodLevel.getServerLevelWrapper()).getWrappedMcObject(); - MinecraftServer server = level.getServer(); + this.level = ((ServerLevelWrapper) lodLevel.getServerLevelWrapper()).getWrappedMcObject(); + MinecraftServer server = this.level.getServer(); WorldData worldData = server.getWorldData(); - registry = server.registryAccess(); + this.registry = server.registryAccess(); #if MC_VER < MC_1_19_4 - worldGenSettings = worldData.worldGenSettings(); - biomes = registry.registryOrThrow(Registry.BIOME_REGISTRY); - worldSeed = worldGenSettings.seed(); + this.worldGenSettings = worldData.worldGenSettings(); + this.biomes = registry.registryOrThrow(Registry.BIOME_REGISTRY); + this.worldSeed = worldGenSettings.seed(); + #elif MC_VER < MC_1_21_3 + this.worldOptions = worldData.worldGenOptions(); + this.biomes = registry.registryOrThrow(Registries.BIOME); + this.worldSeed = worldOptions.seed(); #else - worldOptions = worldData.worldGenOptions(); - biomes = registry.registryOrThrow(Registries.BIOME); - worldSeed = worldOptions.seed(); + this.worldOptions = worldData.worldGenOptions(); + this.biomes = this.registry.lookupOrThrow(Registries.BIOME); + this.worldSeed = this.worldOptions.seed(); #endif + #if MC_VER >= MC_1_18_2 - biomeManager = new BiomeManager(level, BiomeManager.obfuscateSeed(worldSeed)); - chunkScanner = level.getChunkSource().chunkScanner(); + this.biomeManager = new BiomeManager(this.level, BiomeManager.obfuscateSeed(this.worldSeed)); + this.chunkScanner = this.level.getChunkSource().chunkScanner(); #endif - structures = server.getStructureManager(); - generator = level.getChunkSource().getGenerator(); - fixerUpper = server.getFixerUpper(); + this.structures = server.getStructureManager(); + this.generator = this.level.getChunkSource().getGenerator(); + this.fixerUpper = server.getFixerUpper(); #if MC_VER >= MC_1_19_2 - randomState = level.getChunkSource().randomState(); + this.randomState = this.level.getChunkSource().randomState(); #endif } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/ChunkLoader.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/ChunkLoader.java index 1a23cc903..7253a4fd6 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 @@ -19,7 +19,6 @@ package com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject; -import com.google.common.collect.Maps; import com.mojang.serialization.Codec; import com.mojang.serialization.Dynamic; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; @@ -27,21 +26,13 @@ import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGeneratio import com.seibel.distanthorizons.core.logging.ConfigBasedLogger; import com.seibel.distanthorizons.core.util.LodUtil; -import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.ChunkLightStorage; -import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; -import it.unimi.dsi.fastutil.longs.LongOpenHashSet; -import it.unimi.dsi.fastutil.longs.LongSet; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; import java.util.Objects; +import it.unimi.dsi.fastutil.shorts.ShortList; import net.minecraft.core.Registry; -import net.minecraft.core.SectionPos; #if MC_VER >= MC_1_19_4 import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.core.registries.Registries; @@ -50,7 +41,6 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtOps; import net.minecraft.nbt.Tag; -import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.*; import net.minecraft.world.level.biome.Biome; @@ -59,20 +49,22 @@ import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.*; + +#if MC_VER < MC_1_21_3 import net.minecraft.world.level.chunk.storage.ChunkSerializer; +#else +#endif + import net.minecraft.world.level.levelgen.Heightmap; #if MC_VER >= MC_1_18_2 import net.minecraft.world.level.levelgen.blending.BlendingData; #if MC_VER < MC_1_19_2 import net.minecraft.world.level.levelgen.feature.StructureFeature; #endif -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; import net.minecraft.world.ticks.LevelChunkTicks; #endif #if MC_VER >= MC_1_18_2 import net.minecraft.core.Holder; -import net.minecraft.core.RegistryAccess; #if MC_VER < MC_1_19_2 import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; #endif @@ -238,18 +230,23 @@ public class ChunkLoader #if MC_VER >= MC_1_18_2 #if MC_VER < MC_1_19_4 Registry biomes = level.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY); - #else + #elif MC_VER < MC_1_21_3 Registry biomes = level.registryAccess().registryOrThrow(Registries.BIOME); + #else + Registry biomes = level.registryAccess().lookupOrThrow(Registries.BIOME); #endif #if MC_VER < MC_1_18_2 Codec> biomeCodec = PalettedContainer.codec( biomes, biomes.byNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getOrThrow(Biomes.PLAINS)); #elif MC_VER < MC_1_19_2 - Codec>> biomeCodec = PalettedContainer.codec( + Codec>> biomeCodec = PalettedContainer.codec( + biomes.asHolderIdMap(), biomes.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getHolderOrThrow(Biomes.PLAINS)); + #elif MC_VER < MC_1_21_3 + Codec>> biomeCodec = PalettedContainer.codecRW( biomes.asHolderIdMap(), biomes.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getHolderOrThrow(Biomes.PLAINS)); #else - Codec>> biomeCodec = PalettedContainer.codecRW( - biomes.asHolderIdMap(), biomes.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getHolderOrThrow(Biomes.PLAINS)); + Codec>> biomeCodec = PalettedContainer.codecRW( + biomes.asHolderIdMap(), biomes.holderByNameCodec(), PalettedContainer.Strategy.SECTION_BIOMES, biomes.getOrThrow(Biomes.PLAINS)); #endif #endif int sectionYIndex = #if MC_VER < MC_1_17_1 16; #else level.getSectionsCount(); #endif @@ -302,14 +299,28 @@ public class ChunkLoader : new PalettedContainer(biomes, biomes.getOrThrow(Biomes.PLAINS), PalettedContainer.Strategy.SECTION_BIOMES); #else - biomeContainer = tagSection.contains("biomes", 10) - ? biomeCodec.parse(NbtOps.INSTANCE, tagSection.getCompound("biomes")).promotePartial(string -> logBiomeDeserializationWarning(chunkPos, sectionYIndex, (String) string)) + + if (tagSection.contains("biomes", 10)) + { + biomeContainer = + 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) + .getOrThrow(false, LOGGER::error); #else - .getOrThrow((message) -> (RuntimeException) LOGGER.errorAndThrow(message, null)) + .getOrThrow((message) -> (RuntimeException) LOGGER.errorAndThrow(message, null)); #endif - : new PalettedContainer>(biomes.asHolderIdMap(), biomes.getHolderOrThrow(Biomes.PLAINS), PalettedContainer.Strategy.SECTION_BIOMES); + } + else + { + biomeContainer = new PalettedContainer>(biomes.asHolderIdMap(), + #if MC_VER < MC_1_21_3 + biomes.getHolderOrThrow(Biomes.PLAINS), + #else + biomes.getOrThrow(Biomes.PLAINS), + #endif + PalettedContainer.Strategy.SECTION_BIOMES); + } + #endif #if MC_VER < MC_1_20_1 @@ -353,12 +364,16 @@ public class ChunkLoader private static void readPostPocessings(LevelChunk chunk, CompoundTag chunkData) { ListTag tagPostProcessings = chunkData.getList("PostProcessing", 9); - for (int n = 0; n < tagPostProcessings.size(); ++n) + for (int i = 0; i < tagPostProcessings.size(); ++i) { - ListTag listTag3 = tagPostProcessings.getList(n); - for (int o = 0; o < listTag3.size(); ++o) + ListTag listTag3 = tagPostProcessings.getList(i); + for (int j = 0; j < listTag3.size(); ++j) { - chunk.addPackedPostProcess(listTag3.getShort(o), n); + #if MC_VER < MC_1_21_3 + chunk.addPackedPostProcess(listTag3.getShort(j), i); + #else + chunk.addPackedPostProcess(ShortList.of(listTag3.getShort(j)), i); + #endif } } } @@ -370,7 +385,12 @@ public class ChunkLoader { @SuppressWarnings({"unchecked", "rawtypes"}) Dynamic blendingDataTag = new Dynamic(NbtOps.INSTANCE, chunkData.getCompound("blending_data")); + + #if MC_VER < MC_1_21_3 blendingData = BlendingData.CODEC.parse(blendingDataTag).resultOrPartial(LOGGER::error).orElse(null); + #else + blendingData = BlendingData.unpack(BlendingData.Packed.CODEC.parse(blendingDataTag).resultOrPartial(LOGGER::error).orElse(null)); + #endif } return blendingData; } @@ -392,7 +412,7 @@ public class ChunkLoader return null; #else - CombinedChunkLightStorage combinedStorage = new CombinedChunkLightStorage(ChunkWrapper.getMinBuildHeight(chunk), ChunkWrapper.getMaxBuildHeight(chunk)); + CombinedChunkLightStorage combinedStorage = new CombinedChunkLightStorage(ChunkWrapper.getInclusiveMinBuildHeight(chunk), ChunkWrapper.getExclusiveMaxBuildHeight(chunk)); ChunkLightStorage blockLightStorage = combinedStorage.blockLightStorage; ChunkLightStorage skyLightStorage = combinedStorage.skyLightStorage; @@ -471,7 +491,7 @@ public class ChunkLoader skyLight = LodUtil.MAX_MC_LIGHT; } - int y = relY + (sectionIndex * LodUtil.CHUNK_WIDTH) + ChunkWrapper.getMinBuildHeight(chunk); + int y = relY + (sectionIndex * LodUtil.CHUNK_WIDTH) + ChunkWrapper.getInclusiveMinBuildHeight(chunk); blockLightStorage.set(relX, y, relZ, blockLight); skyLightStorage.set(relX, y, relZ, skyLight); } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhGenerationChunkHolder.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhGenerationChunkHolder.java index 62e3bec7d..89fe43cd6 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhGenerationChunkHolder.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhGenerationChunkHolder.java @@ -5,19 +5,24 @@ package com.seibel.distanthorizons.common.wrappers.worldGeneration.mimicObject; import net.minecraft.server.level.GenerationChunkHolder; import net.minecraft.world.level.ChunkPos; +import java.util.concurrent.CompletableFuture; + public class DhGenerationChunkHolder extends GenerationChunkHolder { - public DhGenerationChunkHolder(ChunkPos pos) - { - super(pos); - } + public DhGenerationChunkHolder(ChunkPos pos) { super(pos); } @Override public int getTicketLevel() { return 0; } @Override public int getQueueLevel() { return 0; } + #if MC_VER < MC_1_21_3 + #else + @Override + protected void addSaveDependency(CompletableFuture completableFuture) { } + #endif + } #endif \ No newline at end of file diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhLitWorldGenRegion.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhLitWorldGenRegion.java index 4c2641aa4..c1746bbdd 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhLitWorldGenRegion.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/mimicObject/DhLitWorldGenRegion.java @@ -170,7 +170,18 @@ public class DhLitWorldGenRegion extends WorldGenRegion if (center.isUpgrading()) { LevelHeightAccessor levelHeightAccessor = center.getHeightAccessorForGeneration(); - if (blockPos.getY() < levelHeightAccessor.getMinBuildHeight() || blockPos.getY() >= levelHeightAccessor.getMaxBuildHeight()) + + int minY; + int maxY; + #if MC_VER < MC_1_21_3 + minY = levelHeightAccessor.getMinBuildHeight(); + maxY = levelHeightAccessor.getMaxBuildHeight(); + #else + minY = levelHeightAccessor.getMinY(); + maxY = levelHeightAccessor.getMaxY(); + #endif + + if (blockPos.getY() < minY || blockPos.getY() >= maxY) { return false; } @@ -390,14 +401,10 @@ public class DhLitWorldGenRegion extends WorldGenRegion /** Overriding allows us to use our own lighting engine */ @Override public boolean canSeeSky(@NotNull BlockPos blockPos) - { - return (this.getBrightness(LightLayer.SKY, blockPos) >= this.getMaxLightLevel()); - } + { return (this.getBrightness(LightLayer.SKY, blockPos) >= LodUtil.MAX_MC_LIGHT); } public int getBlockTint(@NotNull BlockPos blockPos, @NotNull ColorResolver colorResolver) - { - return this.calculateBlockTint(blockPos, colorResolver); - } + { return this.calculateBlockTint(blockPos, colorResolver); } private Biome _getBiome(BlockPos pos) { 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 16d633031..a901a8386 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 @@ -80,21 +80,43 @@ public final class StepBiomes for (ChunkAccess chunk : chunksToDo) { - // System.out.println("StepBiomes: "+chunk.getPos()); #if MC_VER < MC_1_18_2 this.environment.params.generator.createBiomes(this.environment.params.biomes, chunk); #elif MC_VER < MC_1_19_2 - chunk = this.environment.joinSync(this.environment.params.generator.createBiomes(this.environment.params.biomes, Runnable::run, Blender.of(worldGenRegion), - tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk)); + chunk = this.environment.confirmFutureWasRunSynchronously( + this.environment.params.generator.createBiomes( + this.environment.params.biomes, + Runnable::run, + Blender.of(worldGenRegion), + tParams.structFeat.forWorldGenRegion(worldGenRegion), + chunk) + ); #elif MC_VER < MC_1_19_4 - chunk = this.environment.joinSync(this.environment.params.generator.createBiomes(this.environment.params.biomes, Runnable::run, this.environment.params.randomState, Blender.of(worldGenRegion), - tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk)); + chunk = this.environment.confirmFutureWasRunSynchronously( + this.environment.params.generator.createBiomes( + this.environment.params.biomes, + Runnable::run, + this.environment.params.randomState, Blender.of(worldGenRegion), + tParams.structFeat.forWorldGenRegion(worldGenRegion), + chunk) + ); #elif MC_VER < MC_1_21_1 - chunk = this.environment.joinSync(this.environment.params.generator.createBiomes(Runnable::run, this.environment.params.randomState, Blender.of(worldGenRegion), - tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk)); + chunk = this.environment.confirmFutureWasRunSynchronously( + this.environment.params.generator.createBiomes( + Runnable::run, + this.environment.params.randomState, + Blender.of(worldGenRegion), + tParams.structFeat.forWorldGenRegion(worldGenRegion), + chunk) + ); #else - chunk = this.environment.joinSync(this.environment.params.generator.createBiomes(this.environment.params.randomState, Blender.of(worldGenRegion), - tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk)); + chunk = this.environment.confirmFutureWasRunSynchronously( + this.environment.params.generator.createBiomes( + this.environment.params.randomState, + Blender.of(worldGenRegion), + tParams.structFeat.forWorldGenRegion(worldGenRegion), + chunk) + ); #endif } } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepNoise.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepNoise.java index a9c8d1a1e..ce6e31c2d 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepNoise.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/worldGeneration/step/StepNoise.java @@ -78,21 +78,36 @@ public final class StepNoise for (ChunkAccess chunk : chunksToDo) { - // System.out.println("StepNoise: "+chunk.getPos()); #if MC_VER < MC_1_17_1 this.environment.params.generator.fillFromNoise(worldGenRegion, tParams.structFeat, chunk); #elif MC_VER < MC_1_18_2 - chunk = this.environment.joinSync(this.environment.params.generator.fillFromNoise(Runnable::run, - tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk)); + chunk = this.environment.confirmFutureWasRunSynchronously( + this.environment.params.generator.fillFromNoise( + Runnable::run, + tParams.structFeat.forWorldGenRegion(worldGenRegion), + chunk)); #elif MC_VER < MC_1_19_2 - chunk = this.environment.joinSync(this.environment.params.generator.fillFromNoise(Runnable::run, Blender.of(worldGenRegion), - tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk)); + chunk = this.environment.confirmFutureWasRunSynchronously( + this.environment.params.generator.fillFromNoise( + Runnable::run, + Blender.of(worldGenRegion), + tParams.structFeat.forWorldGenRegion(worldGenRegion), + chunk)); #elif MC_VER < MC_1_21_1 - chunk = this.environment.joinSync(this.environment.params.generator.fillFromNoise(Runnable::run, Blender.of(worldGenRegion), this.environment.params.randomState, - tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk)); + chunk = this.environment.confirmFutureWasRunSynchronously( + this.environment.params.generator.fillFromNoise( + Runnable::run, + Blender.of(worldGenRegion), + this.environment.params.randomState, + tParams.structFeat.forWorldGenRegion(worldGenRegion), + chunk)); #else - chunk = this.environment.joinSync(this.environment.params.generator.fillFromNoise(Blender.of(worldGenRegion), this.environment.params.randomState, - tParams.structFeat.forWorldGenRegion(worldGenRegion), chunk)); + chunk = this.environment.confirmFutureWasRunSynchronously( + this.environment.params.generator.fillFromNoise( + Blender.of(worldGenRegion), + this.environment.params.randomState, + tParams.structFeat.forWorldGenRegion(worldGenRegion), + chunk)); #endif UncheckedInterruptedException.throwIfInterrupted(); } diff --git a/common/src/main/resources/1_21_3.distanthorizons.accesswidener b/common/src/main/resources/1_21_3.distanthorizons.accesswidener new file mode 100644 index 000000000..15ab6269a --- /dev/null +++ b/common/src/main/resources/1_21_3.distanthorizons.accesswidener @@ -0,0 +1,46 @@ +accessWidener v1 named + +# used when determining where to save files to +accessible field net/minecraft/world/level/storage/DimensionDataStorage dataFolder Ljava/nio/file/Path; + +# used when rendering +accessible method net/minecraft/client/renderer/GameRenderer getFov (Lnet/minecraft/client/Camera;FZ)F +accessible field net/minecraft/client/Minecraft deltaTracker Lnet/minecraft/client/DeltaTracker$Timer; + + +# used for grabbing vanilla rendered chunks +accessible field net/minecraft/client/renderer/LevelRenderer visibleSections Lit/unimi/dsi/fastutil/objects/ObjectArrayList; + +# world generation +# accessible method net/minecraft/world/level/lighting/LayerLightEngine queueSectionData (JLnet/minecraft/world/level/chunk/DataLayer;Z)V +accessible field net/minecraft/world/level/chunk/LevelChunk loaded Z +accessible field net/minecraft/world/level/lighting/LightEngine storage Lnet/minecraft/world/level/lighting/LayerLightSectionStorage; +accessible method net/minecraft/world/level/lighting/LayerLightSectionStorage lightOnInSection (J)Z + +# lod generation from save file +accessible field net/minecraft/world/level/chunk/storage/ChunkStorage worker Lnet/minecraft/world/level/chunk/storage/IOWorker; +accessible field net/minecraft/world/level/chunk/storage/IOWorker storage Lnet/minecraft/world/level/chunk/storage/RegionFileStorage; +accessible field net/minecraft/world/level/chunk/storage/RegionFileStorage regionCache Lit/unimi/dsi/fastutil/longs/Long2ObjectLinkedOpenHashMap; +accessible field net/minecraft/world/level/chunk/storage/RegionFileStorage folder Ljava/nio/file/Path; + +# grabbing textures +accessible class net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture +accessible method net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture getFrameX (I)I +accessible method net/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture getFrameY (I)I +accessible field net/minecraft/client/renderer/texture/SpriteContents animatedTexture Lnet/minecraft/client/renderer/texture/SpriteContents$AnimatedTexture; +accessible field net/minecraft/client/renderer/texture/SpriteContents originalImage Lcom/mojang/blaze3d/platform/NativeImage; + +# UI stuff +accessible field net/minecraft/client/gui/components/AbstractButton SPRITES Lnet/minecraft/client/gui/components/WidgetSprites; +# Handles inserting the config button +accessible field net/minecraft/client/gui/layouts/HeaderAndFooterLayout headerFrame Lnet/minecraft/client/gui/layouts/FrameLayout; +accessible field net/minecraft/client/gui/layouts/FrameLayout children Ljava/util/List; +accessible class net/minecraft/client/gui/layouts/FrameLayout$ChildContainer +accessible field net/minecraft/client/gui/layouts/LinearLayout wrapped Lnet/minecraft/client/gui/layouts/GridLayout; + +# hacky stuff +accessible field net/minecraft/util/ThreadingDetector lock Ljava/util/concurrent/Semaphore; +mutable field net/minecraft/util/ThreadingDetector lock Ljava/util/concurrent/Semaphore; +accessible field net/minecraft/client/gui/components/AbstractSelectionList scrollAmount D # Hack to bypass vanilla's setScrollAmount's clamp + + diff --git a/coreSubProjects b/coreSubProjects index 2dd83d182..b7fccae64 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 2dd83d182f9a1a7ed7d6f770372d4e1fb027682a +Subproject commit b7fccae64d26f0386be51dac8861967dcd587920 diff --git a/fabric/build.gradle b/fabric/build.gradle index c57429c51..b86aeaef6 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -1,5 +1,5 @@ plugins { - id "fabric-loom" version "1.6-SNAPSHOT" + id "fabric-loom" version "1.7-SNAPSHOT" } loom { diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinFogRenderer.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinFogRenderer.java index fbf6f82e4..39b78f50d 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinFogRenderer.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinFogRenderer.java @@ -23,6 +23,7 @@ import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import org.spongepowered.asm.mixin.Mixin; +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; @@ -35,35 +36,42 @@ import net.minecraft.client.renderer.FogRenderer.FogMode; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; + #if MC_VER < MC_1_17_1 import net.minecraft.world.level.material.FluidState; +#elif MC_VER < MC_1_21_3 +import net.minecraft.world.level.material.FogType; #else import net.minecraft.world.level.material.FogType; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import com.mojang.blaze3d.shaders.FogShape; +import net.minecraft.client.renderer.FogParameters; +import org.joml.Vector4f; #endif @Mixin(FogRenderer.class) public class MixinFogRenderer { - // Using this instead of Float.MAX_VALUE because Sodium don't like it. + @Unique private static final float A_REALLY_REALLY_BIG_VALUE = 420694206942069.F; + @Unique private static final float A_EVEN_LARGER_VALUE = 42069420694206942069.F; - @Inject(at = @At("RETURN"), method = "setupFog") + + #if MC_VER < MC_1_19_2 + @Inject(at = @At("RETURN"), method = "setupFog") private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, CallbackInfo callback) - { - #else + #elif MC_VER < MC_1_21_3 + @Inject(at = @At("RETURN"), method = "setupFog") private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, float g, CallbackInfo callback) - { + #else + @Inject(at = @At("RETURN"), method = "setupFog", cancellable = true) + private static void disableSetupFog(Camera camera, FogMode fogMode, Vector4f vector4f, float f, boolean bl, float g, CallbackInfoReturnable callback) #endif - #if MC_VER < MC_1_17_1 - FluidState fluidState = camera.getFluidInCamera(); - boolean cameraNotInFluid = fluidState.isEmpty(); - #else - FogType fogTypes = camera.getFluidInCamera(); - boolean cameraNotInFluid = fogTypes == FogType.NONE; - #endif + { + boolean cameraNotInFluid = cameraNotInFluid(camera); Entity entity = camera.getEntity(); boolean isSpecialFog = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS); @@ -74,11 +82,27 @@ public class MixinFogRenderer #if MC_VER < MC_1_17_1 RenderSystem.fogStart(A_REALLY_REALLY_BIG_VALUE); RenderSystem.fogEnd(A_EVEN_LARGER_VALUE); - #else + #elif MC_VER < MC_1_21_3 RenderSystem.setShaderFogStart(A_REALLY_REALLY_BIG_VALUE); RenderSystem.setShaderFogEnd(A_EVEN_LARGER_VALUE); + #else + callback.setReturnValue(FogParameters.NO_FOG); #endif } } + @Unique + private static boolean cameraNotInFluid(Camera camera) + { + #if MC_VER < MC_1_17_1 + FluidState fluidState = camera.getFluidInCamera(); + boolean cameraNotInFluid = fluidState.isEmpty(); + #else + FogType fogTypes = camera.getFluidInCamera(); + boolean cameraNotInFluid = fogTypes == FogType.NONE; + #endif + + return cameraNotInFluid; + } + } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinGameRenderer.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinGameRenderer.java deleted file mode 100644 index 4cc9c68c2..000000000 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinGameRenderer.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.seibel.distanthorizons.fabric.mixins.client; - -import com.seibel.distanthorizons.common.wrappers.DependencySetupDoneCheck; -import com.seibel.distanthorizons.core.api.internal.ClientApi; -import net.minecraft.client.renderer.GameRenderer; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(GameRenderer.class) -public class MixinGameRenderer -{ - private static final Logger LOGGER = LogManager.getLogger(MixinGameRenderer.class.getSimpleName()); - - - #if MC_VER >= MC_1_17_1 - // FIXME: This I think will dup multiple renderStartupEvent calls... - @Inject(method = {"reloadShaders", "preloadUiShader"}, at = @At("TAIL")) - public void onStartupShaders(CallbackInfo ci) - { - LOGGER.info("Starting up renderer (fabric)"); - if (!DependencySetupDoneCheck.isDone) - { - LOGGER.warn("Dependency setup is not done yet, skipping renderer this startup event!"); - return; - } - ClientApi.INSTANCE.rendererStartupEvent(); - } - - @Inject(method = "shutdownShaders", at = @At("HEAD")) - public void onShutdownShaders(CallbackInfo ci) - { - LOGGER.info("Shutting down renderer (fabric)"); - if (!DependencySetupDoneCheck.isDone) - { - LOGGER.warn("Dependency setup is not done yet, skipping renderer this shutdown event!"); - return; - } - ClientApi.INSTANCE.rendererShutdownEvent(); - } - #else - // FIXME: on 1.16 we dont have stuff for reloading/shutting down shaders - - // FIXME: This I think will dup multiple renderStartupEvent calls... - @Inject(method = {"loadEffect"}, at = @At("TAIL")) - public void onStartupShaders(CallbackInfo ci) { - ClientApi.INSTANCE.rendererStartupEvent(); - } - - @Inject(method = "shutdownEffect", at = @At("HEAD")) - public void onShutdownShaders(CallbackInfo ci) { - ClientApi.INSTANCE.rendererShutdownEvent(); - } - #endif -} 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 719901cfc..a405534d6 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 @@ -111,16 +111,22 @@ public class MixinLevelRenderer mcProjectionMatrix.setIdentity(); #endif + // TODO move this into a common place + float frameTime; + #if MC_VER < MC_1_21_1 + frameTime = Minecraft.getInstance().getFrameTime(); + #elif MC_VER < MC_1_21_3 + frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(); + #else + frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks(); + #endif + if (renderType.equals(RenderType.translucent())) { ClientApi.INSTANCE.renderDeferredLods(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, - #if MC_VER < MC_1_21_1 - Minecraft.getInstance().getFrameTime() - #else - Minecraft.getInstance().getTimer().getRealtimeDeltaTicks() - #endif + frameTime ); } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightTexture.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightTexture.java index f09edc1f5..98843c77c 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightTexture.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinLightTexture.java @@ -19,9 +19,6 @@ package com.seibel.distanthorizons.fabric.mixins.client; - -import com.mojang.blaze3d.platform.NativeImage; - import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; @@ -35,13 +32,22 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +#if MC_VER < MC_1_21_3 +import com.mojang.blaze3d.platform.NativeImage; +#else +import com.mojang.blaze3d.pipeline.TextureTarget; +#endif + @Mixin(LightTexture.class) public class MixinLightTexture { - @Shadow - @Final + @Shadow + @Final + #if MC_VER < MC_1_21_3 private NativeImage lightPixels; - + #else + private TextureTarget target; + #endif @Inject(method = "updateLightTexture(F)V", at = @At("RETURN")) public void updateLightTexture(float partialTicks, CallbackInfo ci) @@ -52,8 +58,14 @@ public class MixinLightTexture return; } + IClientLevelWrapper clientLevel = mc.getWrappedClientLevel(); + + #if MC_VER < MC_1_21_3 MinecraftRenderWrapper.INSTANCE.updateLightmap(this.lightPixels, clientLevel); + #else + MinecraftRenderWrapper.INSTANCE.setLightmapId(this.target.getColorTextureId(), clientLevel); + #endif } } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinServerPlayer.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinServerPlayer.java index 50b529017..7a24e3214 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinServerPlayer.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinServerPlayer.java @@ -31,8 +31,11 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -#if MC_VER >= MC_1_21_1 +#if MC_VER < MC_1_21_1 +#elif MC_VER < MC_1_21_3 import net.minecraft.world.level.portal.DimensionTransition; +#else +import net.minecraft.world.level.portal.TeleportTransition; #endif @@ -54,23 +57,29 @@ public class MixinServerPlayer implements IMixinServerPlayer { this.dimensionChangeDestination = dimensionChangeDestination; } #endif + #if MC_VER < MC_1_21_1 + @Inject(at = @At("HEAD"), method = "changeDimension") + public void changeDimension(ServerLevel destination, CallbackInfoReturnable cir) + { this.dimensionChangeDestination = destination; } + #elif MC_VER < MC_1_21_3 @Inject(at = @At("HEAD"), method = "changeDimension") - #if MC_VER >= MC_1_21_1 public void changeDimension(DimensionTransition dimensionTransition, CallbackInfoReturnable cir) { this.dimensionChangeDestination = dimensionTransition.newLevel(); } #else - public void changeDimension(ServerLevel destination, CallbackInfoReturnable cir) - { this.dimensionChangeDestination = destination; } + @Inject(at = @At("HEAD"), method = "teleport") + public void changeDimension(TeleportTransition teleportTransition, CallbackInfoReturnable cir) + { this.dimensionChangeDestination = teleportTransition.newLevel(); } #endif - #if MC_VER >= MC_1_20_1 - @Inject(at = @At("RETURN"), method = "setServerLevel") - public void setServerLevel(ServerLevel level, CallbackInfo ci) - { this.dimensionChangeDestination = null; } - #elif MC_VER >= MC_1_17_1 + #if MC_VER < MC_1_17_1 + #elif MC_VER < MC_1_20_1 @Inject(at = @At("RETURN"), method = "setLevel") public void setLevel(ServerLevel level, CallbackInfo ci) { this.dimensionChangeDestination = null; } + #else + @Inject(at = @At("RETURN"), method = "setServerLevel") + public void setServerLevel(ServerLevel level, CallbackInfo ci) + { this.dimensionChangeDestination = null; } #endif } \ No newline at end of file diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinTracingExecutor.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinTracingExecutor.java new file mode 100644 index 000000000..2273403d7 --- /dev/null +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinTracingExecutor.java @@ -0,0 +1,75 @@ +/* + * This file is part of the Distant Horizons mod + * licensed under the GNU LGPL v3 License. + * + * Copyright (C) 2020-2023 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.seibel.distanthorizons.fabric.mixins.server; + +import org.spongepowered.asm.mixin.Mixin; + +#if MC_VER < MC_1_21_3 +/** + * {@link MixinUtilBackgroundThread} was used for versions before 1.21.3 + * This is just a dummy class/mixin to make the compiler happy. + * + * @see MixinUtilBackgroundThread + */ +@Mixin(net.minecraft.Util.class) // TODO we should allow version specific mixins so we don't have to create dummy mixins that exist for all MC versions +public class MixinTracingExecutor +{ + +} +#else + +import com.seibel.distanthorizons.common.wrappers.DependencySetupDoneCheck; +import com.seibel.distanthorizons.core.util.objects.RunOnThisThreadExecutorService; +import net.minecraft.TracingExecutor; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.concurrent.Executor; + +/** + * This is needed for DH's world gen so we can run + * world gen on our own threads instead of using MC thread pools. + * + * @see MixinUtilBackgroundThread + * @see RunOnThisThreadExecutorService + */ +@Mixin(TracingExecutor.class) +public class MixinTracingExecutor +{ + // TODO put in a common location + private static boolean isWorldGenThread() + { return DependencySetupDoneCheck.isDone && DependencySetupDoneCheck.getIsCurrentThreadDistantGeneratorThread.get(); } + + + // replaced with TracingExecutor in MC 1.21.3+ + @Inject(method = "forName(Ljava/lang/String;)Ljava/util/concurrent/Executor;", at = @At("HEAD"), cancellable = true) + private void forName(String executorName, CallbackInfoReturnable ci) + { + if (isWorldGenThread()) + { + // run this task on the current DH thread instead of a new MC thread + ci.setReturnValue(new RunOnThisThreadExecutorService()); + } + } + +} +#endif \ No newline at end of file diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinUtilBackgroundThread.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinUtilBackgroundThread.java index 8bfd986df..5b4360f37 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinUtilBackgroundThread.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/server/MixinUtilBackgroundThread.java @@ -19,60 +19,81 @@ package com.seibel.distanthorizons.fabric.mixins.server; -import java.util.concurrent.ExecutorService; -import java.util.function.Supplier; - -import com.seibel.distanthorizons.fabric.FabricServerProxy; +import com.seibel.distanthorizons.common.wrappers.DependencySetupDoneCheck; +import com.seibel.distanthorizons.core.util.objects.RunOnThisThreadExecutorService; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import com.seibel.distanthorizons.core.util.objects.DummyRunExecutorService; - import net.minecraft.Util; +import java.util.concurrent.ExecutorService; + +#if MC_VER < MC_1_16_5 +#elif MC_VER < MC_1_21_3 +import java.util.function.Supplier; +#else +#endif + +/** + * This is needed for DH's world gen so we can run + * world gen on our own threads instead of using MC thread pools. + * + * @see MixinTracingExecutor + * @see RunOnThisThreadExecutorService + */ @Mixin(Util.class) public class MixinUtilBackgroundThread { - private static boolean shouldApplyOverride() - { - return FabricServerProxy.isGenerationThreadChecker != null && FabricServerProxy.isGenerationThreadChecker.get(); - } + private static boolean isWorldGenThread() + { return DependencySetupDoneCheck.isDone && DependencySetupDoneCheck.getIsCurrentThreadDistantGeneratorThread.get(); } + + #if MC_VER < MC_1_21_3 @Inject(method = "backgroundExecutor", at = @At("HEAD"), cancellable = true) private static void overrideUtil$backgroundExecutor(CallbackInfoReturnable ci) { - if (shouldApplyOverride()) + if (isWorldGenThread()) { - //ApiShared.LOGGER.info("util backgroundExecutor triggered"); - ci.setReturnValue(new DummyRunExecutorService()); + // run this task on the current DH thread instead of a new MC thread + ci.setReturnValue(new RunOnThisThreadExecutorService()); } } + #else + // replaced with TracingExecutor in MC 1.21.3+ + #endif - #if MC_VER >= MC_1_17_1 + #if MC_VER < MC_1_17_1 + #elif MC_VER < MC_1_21_3 @Inject(method = "wrapThreadWithTaskName(Ljava/lang/String;Ljava/lang/Runnable;)Ljava/lang/Runnable;", at = @At("HEAD"), cancellable = true) private static void overrideUtil$wrapThreadWithTaskName(String string, Runnable r, CallbackInfoReturnable ci) { - if (shouldApplyOverride()) + if (isWorldGenThread()) { //ApiShared.LOGGER.info("util wrapThreadWithTaskName(Runnable) triggered"); ci.setReturnValue(r); } } + #else + // replaced with TracingExecutor in MC 1.21.3+ #endif - #if MC_VER >= MC_1_18_2 + + #if MC_VER < MC_1_18_2 + #elif MC_VER < MC_1_21_3 @Inject(method = "wrapThreadWithTaskName(Ljava/lang/String;Ljava/util/function/Supplier;)Ljava/util/function/Supplier;", at = @At("HEAD"), cancellable = true) private static void overrideUtil$wrapThreadWithTaskNameForSupplier(String string, Supplier r, CallbackInfoReturnable> ci) { - if (shouldApplyOverride()) + if (isWorldGenThread()) { //ApiShared.LOGGER.info("util wrapThreadWithTaskName(Supplier) triggered"); ci.setReturnValue(r); } } + #else + // replaced with TracingExecutor in MC 1.21.3+ #endif } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/testing/TestChunkWorldGenerator.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/testing/TestChunkWorldGenerator.java index 1b0060ca3..35694944e 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/testing/TestChunkWorldGenerator.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/testing/TestChunkWorldGenerator.java @@ -69,8 +69,8 @@ public class TestChunkWorldGenerator extends AbstractDhApiChunkWorldGenerator ChunkAccess chunk = this.level.getChunk(chunkPosX, chunkPosZ); - int minBuildHeight = this.level.getMinBuildHeight(); - int maxBuildHeight = this.level.getMaxBuildHeight(); + int minBuildHeight = this.levelWrapper.getMinHeight(); + int maxBuildHeight = this.levelWrapper.getMaxHeight(); DhApiChunk apiChunk = DhApiChunk.create(chunkPosX, chunkPosZ, minBuildHeight, maxBuildHeight); for (int x = 0; x < 16; x++) diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/wrappers/modAccessor/IrisAccessor.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/wrappers/modAccessor/IrisAccessor.java index 90753eee3..e89df759e 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/wrappers/modAccessor/IrisAccessor.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/wrappers/modAccessor/IrisAccessor.java @@ -22,32 +22,50 @@ package com.seibel.distanthorizons.fabric.wrappers.modAccessor; #if MC_VER >= MC_1_19_4 import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IIrisAccessor; + #if MC_VER <= MC_1_20_4 import net.coderbot.iris.Iris; -#else -import net.irisshaders.iris.Iris; -#endif import net.irisshaders.iris.api.v0.IrisApi; +#elif MC_VER < MC_1_21_3 +import net.irisshaders.iris.Iris; +import net.irisshaders.iris.api.v0.IrisApi; +#else +// TODO fabric/iris needs fixing for MC 1.21.3 +#endif public class IrisAccessor implements IIrisAccessor { @Override public String getModName() { - //return "Iris-Fabric"; + // TODO + #if MC_VER < MC_1_21_3 return Iris.MODID; + #else + return "Iris-Fabric"; + #endif } @Override public boolean isShaderPackInUse() { + // TODO + #if MC_VER < MC_1_21_3 return IrisApi.getInstance().isShaderPackInUse(); + #else + return false; + #endif } @Override public boolean isRenderingShadowPass() { + // TODO + #if MC_VER < MC_1_21_3 return IrisApi.getInstance().isRenderingShadowPass(); + #else + return false; + #endif } } diff --git a/fabric/src/main/resources/DistantHorizons.fabric.mixins.json b/fabric/src/main/resources/DistantHorizons.fabric.mixins.json index 0ca4b0ad2..487bb1ee9 100644 --- a/fabric/src/main/resources/DistantHorizons.fabric.mixins.json +++ b/fabric/src/main/resources/DistantHorizons.fabric.mixins.json @@ -1,29 +1,29 @@ { - "required": true, - "minVersion": "0.8", - "package": "com.seibel.distanthorizons.fabric.mixins", - "mixins": [ - "server.MixinChunkGenerator", - "server.MixinChunkMap", - "server.MixinUtilBackgroundThread", - "server.MixinServerPlayer", - "server.MixinEntity" - ], - "client": [ - "client.MixinClientLevel", - "client.MixinClientPacketListener", - "client.MixinDebugScreenOverlay", - "client.MixinFogRenderer", - "client.MixinGameRenderer", - "client.MixinLevelRenderer", - "client.MixinLightTexture", - "client.MixinOptionsScreen", - "client.MixinMinecraft", - "client.MixinTextureUtil" - ], - "server": [], - "injectors": { - "defaultRequire": 1 - }, - "plugin": "com.seibel.distanthorizons.fabric.mixins.FabricMixinPlugin" + "required": true, + "minVersion": "0.8", + "package": "com.seibel.distanthorizons.fabric.mixins", + "mixins": [ + "server.MixinChunkGenerator", + "server.MixinChunkMap", + "server.MixinEntity", + "server.MixinServerPlayer", + "server.MixinTracingExecutor", + "server.MixinUtilBackgroundThread" + ], + "client": [ + "client.MixinClientLevel", + "client.MixinClientPacketListener", + "client.MixinDebugScreenOverlay", + "client.MixinFogRenderer", + "client.MixinLevelRenderer", + "client.MixinLightTexture", + "client.MixinMinecraft", + "client.MixinOptionsScreen", + "client.MixinTextureUtil" + ], + "server": [], + "injectors": { + "defaultRequire": 1 + }, + "plugin": "com.seibel.distanthorizons.fabric.mixins.FabricMixinPlugin" } diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinGameRenderer.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinGameRenderer.java deleted file mode 100644 index 614054ee2..000000000 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/client/MixinGameRenderer.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.seibel.distanthorizons.forge.mixins.client; - -import com.seibel.distanthorizons.common.wrappers.DependencySetupDoneCheck; -import com.seibel.distanthorizons.core.api.internal.ClientApi; -import net.minecraft.client.renderer.GameRenderer; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -// TODO: Check if this port from fabric works -@Mixin(GameRenderer.class) -public class MixinGameRenderer -{ - private static final Logger LOGGER = LogManager.getLogger(MixinGameRenderer.class.getSimpleName()); - - #if MC_VER >= MC_1_17_1 - // FIXME: This I think will dup multiple renderStartupEvent calls... - @Inject(method = {"reloadShaders", "preloadUiShader"}, at = @At("TAIL")) - public void onStartupShaders(CallbackInfo ci) - { - LOGGER.info("Starting up renderer (forge)"); - if (!DependencySetupDoneCheck.isDone) - { - LOGGER.warn("Dependency setup is not done yet, skipping renderer this startup event!"); - return; - } - ClientApi.INSTANCE.rendererStartupEvent(); - } - - @Inject(method = "shutdownShaders", at = @At("HEAD")) - public void onShutdownShaders(CallbackInfo ci) - { - LOGGER.info("Shutting down renderer (forge)"); - if (!DependencySetupDoneCheck.isDone) - { - LOGGER.warn("Dependency setup is not done yet, skipping renderer this shutdown event!"); - return; - } - ClientApi.INSTANCE.rendererShutdownEvent(); - } - #else - - - @Inject(method = {"loadEffect"}, at = @At("TAIL")) - public void onStartupShaders(CallbackInfo ci) { - ClientApi.INSTANCE.rendererStartupEvent(); - } - - @Inject(method = "shutdownEffect", at = @At("HEAD")) - public void onShutdownShaders(CallbackInfo ci) { - ClientApi.INSTANCE.rendererShutdownEvent(); - } - #endif - -} diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/server/MixinUtilBackgroundThread.java b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/server/MixinUtilBackgroundThread.java index dee12f792..045035646 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/server/MixinUtilBackgroundThread.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/mixins/server/MixinUtilBackgroundThread.java @@ -28,7 +28,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.seibel.distanthorizons.common.wrappers.DependencySetupDoneCheck; -import com.seibel.distanthorizons.core.util.objects.DummyRunExecutorService; +import com.seibel.distanthorizons.core.util.objects.RunOnThisThreadExecutorService; import net.minecraft.Util; @@ -46,7 +46,7 @@ public class MixinUtilBackgroundThread if (shouldApplyOverride()) { //ApiShared.LOGGER.info("util backgroundExecutor triggered"); - ci.setReturnValue(new DummyRunExecutorService()); + ci.setReturnValue(new RunOnThisThreadExecutorService()); } } diff --git a/forge/src/main/resources/DistantHorizons.forge.mixins.json b/forge/src/main/resources/DistantHorizons.forge.mixins.json index 5ff0aafeb..6539935e7 100644 --- a/forge/src/main/resources/DistantHorizons.forge.mixins.json +++ b/forge/src/main/resources/DistantHorizons.forge.mixins.json @@ -14,7 +14,6 @@ "client.MixinClientPacketListener", "client.MixinDebugScreenOverlay", "client.MixinFogRenderer", - "client.MixinGameRenderer", "client.MixinLevelRenderer", "client.MixinLightTexture", "client.MixinOptionsScreen", diff --git a/gradle.properties b/gradle.properties index da0053c21..2512c190e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -48,7 +48,7 @@ versionStr= # This defines what MC version Intellij will use for the preprocessor # and what version is used automatically by build and run commands -mcVer=1.21.1 +mcVer=1.21.3 # Defines the maximum amount of memory Minecraft is allowed when run in a development environment #minecraftMemoryJavaArg="-Xmx4G" diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinFogRenderer.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinFogRenderer.java index a8e956e6d..596d51fa2 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinFogRenderer.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinFogRenderer.java @@ -25,7 +25,6 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRen import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.mojang.blaze3d.systems.RenderSystem; @@ -35,10 +34,18 @@ import net.minecraft.client.renderer.FogRenderer.FogMode; import net.minecraft.world.effect.MobEffects; import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.LivingEntity; + #if MC_VER < MC_1_17_1 import net.minecraft.world.level.material.FluidState; -#else +org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +#elif MC_VER < MC_1_21_3 import net.minecraft.world.level.material.FogType; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +#else +import net.minecraft.client.renderer.FogParameters; +import net.minecraft.world.level.material.FogType; +import org.joml.Vector4f; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; #endif @@ -46,24 +53,30 @@ import net.minecraft.world.level.material.FogType; @Mixin(FogRenderer.class) public class MixinFogRenderer { - // Using this instead of Float.MAX_VALUE because Sodium don't like it. private static final float A_REALLY_REALLY_BIG_VALUE = 420694206942069.F; private static final float A_EVEN_LARGER_VALUE = 42069420694206942069.F; + + + #if MC_VER == MC_1_17_1 || MC_VER == MC_1_18_2 @Inject(at = @At("RETURN"), method = "setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;FZF)V", - remap = #if MC_VER == MC_1_17_1 || MC_VER == MC_1_18_2 false #else true #endif ) // Remap messiness due to this being weird in forge + remap = false) private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, float partTick, CallbackInfo callback) + #elif MC_VER < MC_1_21_3 + @Inject(at = @At("RETURN"), + method = "setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;FZF)V", + remap = true) + private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, float partTick, CallbackInfo callback) + #else + @Inject(at = @At("RETURN"), + method = "setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;Lorg/joml/Vector4f;FZF)Lnet/minecraft/client/renderer/FogParameters;", + remap = true, cancellable = true) + private static void disableSetupFog(Camera camera, FogMode fogMode, Vector4f vector4f, float f, boolean bl, float partTick, CallbackInfoReturnable callback) + #endif { - #if MC_VER < MC_1_17_1 - FluidState fluidState = camera.getFluidInCamera(); - boolean cameraNotInFluid = fluidState.isEmpty(); - #else - FogType fogTypes = camera.getFluidInCamera(); - boolean cameraNotInFluid = fogTypes == FogType.NONE; - #endif - + boolean cameraNotInFluid = cameraNotInFluid(camera); Entity entity = camera.getEntity(); boolean isSpecialFog = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS); @@ -74,11 +87,27 @@ public class MixinFogRenderer #if MC_VER < MC_1_17_1 RenderSystem.fogStart(A_REALLY_REALLY_BIG_VALUE); RenderSystem.fogEnd(A_EVEN_LARGER_VALUE); - #else + #elif MC_VER < MC_1_21_3 RenderSystem.setShaderFogStart(A_REALLY_REALLY_BIG_VALUE); RenderSystem.setShaderFogEnd(A_EVEN_LARGER_VALUE); + #else + callback.setReturnValue(FogParameters.NO_FOG); #endif } } + private static boolean cameraNotInFluid(Camera camera) + { + #if MC_VER < MC_1_17_1 + FluidState fluidState = camera.getFluidInCamera(); + boolean cameraNotInFluid = fluidState.isEmpty(); + #else + FogType fogTypes = camera.getFluidInCamera(); + boolean cameraNotInFluid = fogTypes == FogType.NONE; + #endif + + return cameraNotInFluid; + } + + } diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinGameRenderer.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinGameRenderer.java deleted file mode 100644 index 071983ab9..000000000 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinGameRenderer.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.seibel.distanthorizons.neoforge.mixins.client; - -import com.seibel.distanthorizons.common.wrappers.DependencySetupDoneCheck; -import com.seibel.distanthorizons.core.api.internal.ClientApi; -import net.minecraft.client.renderer.GameRenderer; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -// TODO: Check if this port from fabric works -@Mixin(GameRenderer.class) -public class MixinGameRenderer -{ - private static final Logger LOGGER = LogManager.getLogger(MixinGameRenderer.class.getSimpleName()); - - #if MC_VER >= MC_1_17_1 - // FIXME: This I think will dup multiple renderStartupEvent calls... - @Inject(method = {"reloadShaders", "preloadUiShader"}, at = @At("TAIL")) - public void onStartupShaders(CallbackInfo ci) - { - LOGGER.info("Starting up renderer (forge)"); - if (!DependencySetupDoneCheck.isDone) - { - LOGGER.warn("Dependency setup is not done yet, skipping renderer this startup event!"); - return; - } - ClientApi.INSTANCE.rendererStartupEvent(); - } - - @Inject(method = "shutdownShaders", at = @At("HEAD")) - public void onShutdownShaders(CallbackInfo ci) - { - LOGGER.info("Shutting down renderer (forge)"); - if (!DependencySetupDoneCheck.isDone) - { - LOGGER.warn("Dependency setup is not done yet, skipping renderer this shutdown event!"); - return; - } - ClientApi.INSTANCE.rendererShutdownEvent(); - } - #else - - - @Inject(method = {"loadEffect"}, at = @At("TAIL")) - public void onStartupShaders(CallbackInfo ci) { - ClientApi.INSTANCE.rendererStartupEvent(); - } - - @Inject(method = "shutdownEffect", at = @At("HEAD")) - public void onShutdownShaders(CallbackInfo ci) { - ClientApi.INSTANCE.rendererShutdownEvent(); - } - #endif - -} 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 39c158472..7d2f673c0 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 @@ -122,8 +122,10 @@ public class MixinLevelRenderer float frameTime; #if MC_VER < MC_1_21_1 frameTime = Minecraft.getInstance().getFrameTime(); - #else + #elif MC_VER < MC_1_21_3 frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(); + #else + frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks(); #endif diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java index 5ae06aec8..c8b9d15d3 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/client/MixinLightTexture.java @@ -20,14 +20,17 @@ package com.seibel.distanthorizons.neoforge.mixins.client; +import com.mojang.blaze3d.pipeline.TextureTarget; import com.mojang.blaze3d.platform.NativeImage; import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapper; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; +import com.seibel.distanthorizons.core.render.glObject.GLState; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import net.minecraft.client.renderer.LightTexture; +import org.lwjgl.opengl.GL32; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -38,6 +41,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(LightTexture.class) public class MixinLightTexture { + #if MC_VER < MC_1_21_3 @Shadow @Final private NativeImage lightPixels; @@ -55,5 +59,21 @@ public class MixinLightTexture IClientLevelWrapper clientLevel = mc.getWrappedClientLevel(); MinecraftRenderWrapper.INSTANCE.updateLightmap(this.lightPixels, clientLevel); } + #else + @Shadow @Final private TextureTarget target; + @Inject(method = "updateLightTexture(F)V", at = @At("RETURN")) + public void updateLightTexture(float partialTicks, CallbackInfo ci) + { + IMinecraftClientWrapper mc = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); + if (mc == null || mc.getWrappedClientLevel() == null) + { + return; + } + + IClientLevelWrapper clientLevel = mc.getWrappedClientLevel(); + MinecraftRenderWrapper.INSTANCE.setLightmapId(this.target.getColorTextureId(), clientLevel); + } + + #endif } diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinServerPlayer.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinServerPlayer.java index 52166866d..469e4cd21 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinServerPlayer.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinServerPlayer.java @@ -31,11 +31,16 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -#if MC_VER >= MC_1_21_1 +#if MC_VER < MC_1_20_6 import net.minecraft.world.level.portal.DimensionTransition; +#elif MC_VER < MC_1_21_1 +import net.neoforged.neoforge.common.util.ITeleporter; +#elif MC_VER < MC_1_21_3 +import net.minecraft.world.level.portal.DimensionTransition; +#else +import net.minecraft.world.level.portal.TeleportTransition; #endif - @Mixin(ServerPlayer.class) public class MixinServerPlayer implements IMixinServerPlayer { @@ -44,27 +49,37 @@ public class MixinServerPlayer implements IMixinServerPlayer private ServerLevel distantHorizons$dimensionChangeDestination; + @Unique @Override @Nullable public ServerLevel distantHorizons$getDimensionChangeDestination() { return this.distantHorizons$dimensionChangeDestination; } + #if MC_VER < MC_1_20_6 + @Inject(at = @At("HEAD"), method = "changeDimension") + public void changeDimension(ServerLevel destination, CallbackInfoReturnable cir) + { this.distantHorizons$dimensionChangeDestination = destination; } + #elif MC_VER < MC_1_21_1 + @Inject(at = @At("HEAD"), method = "changeDimension") + public void changeDimension(ServerLevel destination, ITeleporter teleporter, CallbackInfoReturnable cir) + { this.distantHorizons$dimensionChangeDestination = destination; } + #elif MC_VER < MC_1_21_3 @Inject(at = @At("HEAD"), method = "changeDimension") - #if MC_VER >= MC_1_21_1 public void changeDimension(DimensionTransition dimensionTransition, CallbackInfoReturnable cir) { this.distantHorizons$dimensionChangeDestination = dimensionTransition.newLevel(); } #else - public void changeDimension(ServerLevel destination, CallbackInfoReturnable cir) - { this.distantHorizons$dimensionChangeDestination = destination; } + @Inject(at = @At("HEAD"), method = "teleport") + public void changeDimension(TeleportTransition teleportTransition, CallbackInfoReturnable cir) + { this.distantHorizons$dimensionChangeDestination = teleportTransition.newLevel(); } #endif - #if MC_VER >= MC_1_20_1 - @Inject(at = @At("RETURN"), method = "setServerLevel") - public void setServerLevel(ServerLevel level, CallbackInfo ci) - #else + #if MC_VER < MC_1_20_1 @Inject(at = @At("RETURN"), method = "setLevel") public void setLevel(ServerLevel level, CallbackInfo ci) + #else + @Inject(at = @At("RETURN"), method = "setServerLevel") + public void setServerLevel(ServerLevel level, CallbackInfo ci) #endif { this.distantHorizons$dimensionChangeDestination = null; diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinTracingExecutor.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinTracingExecutor.java new file mode 100644 index 000000000..7a2cfa736 --- /dev/null +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinTracingExecutor.java @@ -0,0 +1,78 @@ +/* + * This file is part of the Distant Horizons mod + * licensed under the GNU LGPL v3 License. + * + * Copyright (C) 2020-2023 James Seibel + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, see . + */ + +package com.seibel.distanthorizons.neoforge.mixins.server; + +#if MC_VER < MC_1_21_3 +import org.spongepowered.asm.mixin.Mixin; + +/** + * {@link MixinUtilBackgroundThread} was used for versions before 1.21.3 + * This is just a dummy class/mixin to make the compiler happy. + * + * @see MixinUtilBackgroundThread + */ +@Mixin(net.minecraft.Util.class) // TODO we should allow version specific mixins so we don't have to create dummy mixins that exist for all MC versions +public class MixinTracingExecutor +{ + +} +#else + +import com.seibel.distanthorizons.common.wrappers.DependencySetupDoneCheck; +import com.seibel.distanthorizons.core.util.objects.RunOnThisThreadExecutorService; +import net.minecraft.TracingExecutor; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.concurrent.Executor; + +/** + * This is needed for DH's world gen so we can run + * world gen on our own threads instead of using MC thread pools. + * + * @see MixinUtilBackgroundThread + * @see RunOnThisThreadExecutorService + */ +@Mixin(TracingExecutor.class) +public class MixinTracingExecutor +{ + // TODO put in a common location + private static boolean isWorldGenThread() + { return DependencySetupDoneCheck.isDone && DependencySetupDoneCheck.getIsCurrentThreadDistantGeneratorThread.get(); } + + + // Util.backgroundExecutor().forName("init_biomes") + // needed for world gen + + // replaced with TracingExecutor in MC 1.21.3+ + @Inject(method = "forName(Ljava/lang/String;)Ljava/util/concurrent/Executor;", at = @At("HEAD"), cancellable = true) + private void forName(String executorName, CallbackInfoReturnable ci) + { + if (isWorldGenThread()) + { + // run this task on the current DH thread instead of a new MC thread + ci.setReturnValue(new RunOnThisThreadExecutorService()); + } + } + +} +#endif \ No newline at end of file diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinUtilBackgroundThread.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinUtilBackgroundThread.java index cbe606d49..65df31026 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinUtilBackgroundThread.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/mixins/server/MixinUtilBackgroundThread.java @@ -22,57 +22,75 @@ package com.seibel.distanthorizons.neoforge.mixins.server; import java.util.concurrent.ExecutorService; import java.util.function.Supplier; +import com.seibel.distanthorizons.core.util.objects.RunOnThisThreadExecutorService; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import com.seibel.distanthorizons.common.wrappers.DependencySetupDoneCheck; -import com.seibel.distanthorizons.core.util.objects.DummyRunExecutorService; import net.minecraft.Util; +/** + * This is needed for DH's world gen so we can run + * world gen on our own threads instead of using MC thread pools. + * + * @see MixinTracingExecutor + * @see RunOnThisThreadExecutorService + */ @Mixin(Util.class) public class MixinUtilBackgroundThread { - private static boolean shouldApplyOverride() - { - return DependencySetupDoneCheck.isDone && DependencySetupDoneCheck.getIsCurrentThreadDistantGeneratorThread.get(); - } + private static boolean isWorldGenThread() + { return DependencySetupDoneCheck.isDone && DependencySetupDoneCheck.getIsCurrentThreadDistantGeneratorThread.get(); } + + + #if MC_VER < MC_1_21_3 @Inject(method = "backgroundExecutor", at = @At("HEAD"), cancellable = true) private static void overrideUtil$backgroundExecutor(CallbackInfoReturnable ci) { - if (shouldApplyOverride()) + if (isWorldGenThread()) { - //ApiShared.LOGGER.info("util backgroundExecutor triggered"); - ci.setReturnValue(new DummyRunExecutorService()); + // run this task on the current DH thread instead of a new MC thread + ci.setReturnValue(new RunOnThisThreadExecutorService()); } } + #else + // replaced with TracingExecutor in MC 1.21.3+ + #endif - #if MC_VER >= MC_1_17_1 + #if MC_VER < MC_1_17_1 + #elif MC_VER < MC_1_21_3 @Inject(method = "wrapThreadWithTaskName(Ljava/lang/String;Ljava/lang/Runnable;)Ljava/lang/Runnable;", at = @At("HEAD"), cancellable = true) private static void overrideUtil$wrapThreadWithTaskName(String string, Runnable r, CallbackInfoReturnable ci) { - if (shouldApplyOverride()) + if (isWorldGenThread()) { //ApiShared.LOGGER.info("util wrapThreadWithTaskName(Runnable) triggered"); ci.setReturnValue(r); } } + #else + // replaced with TracingExecutor in MC 1.21.3+ #endif - #if MC_VER >= MC_1_18_2 + + #if MC_VER < MC_1_18_2 + #elif MC_VER < MC_1_21_3 @Inject(method = "wrapThreadWithTaskName(Ljava/lang/String;Ljava/util/function/Supplier;)Ljava/util/function/Supplier;", at = @At("HEAD"), cancellable = true) private static void overrideUtil$wrapThreadWithTaskNameForSupplier(String string, Supplier r, CallbackInfoReturnable> ci) { - if (shouldApplyOverride()) + if (isWorldGenThread()) { //ApiShared.LOGGER.info("util wrapThreadWithTaskName(Supplier) triggered"); ci.setReturnValue(r); } } + #else + // replaced with TracingExecutor in MC 1.21.3+ #endif } diff --git a/neoforge/src/main/resources/DistantHorizons.neoforge.mixins.json b/neoforge/src/main/resources/DistantHorizons.neoforge.mixins.json index 63d563684..96beda428 100644 --- a/neoforge/src/main/resources/DistantHorizons.neoforge.mixins.json +++ b/neoforge/src/main/resources/DistantHorizons.neoforge.mixins.json @@ -1,24 +1,24 @@ { - "required": true, - "minVersion": "0.8", - "package": "com.seibel.distanthorizons.neoforge.mixins", - "mixins": [ - "server.MixinUtilBackgroundThread", - "server.MixinChunkGenerator", - "server.MixinTFChunkGenerator", - "server.MixinChunkMap", - "server.MixinServerPlayer" - ], - "client": [ - "client.MixinClientPacketListener", - "client.MixinDebugScreenOverlay", - "client.MixinFogRenderer", - "client.MixinGameRenderer", - "client.MixinLevelRenderer", - "client.MixinLightTexture", - "client.MixinOptionsScreen", - "client.MixinTextureUtil" - ], - "server": [], - "plugin": "com.seibel.distanthorizons.neoforge.mixins.NeoforgeMixinPlugin" + "required": true, + "minVersion": "0.8", + "package": "com.seibel.distanthorizons.neoforge.mixins", + "mixins": [ + "server.MixinChunkGenerator", + "server.MixinChunkMap", + "server.MixinServerPlayer", + "server.MixinTFChunkGenerator", + "server.MixinTracingExecutor", + "server.MixinUtilBackgroundThread" + ], + "client": [ + "client.MixinClientPacketListener", + "client.MixinDebugScreenOverlay", + "client.MixinFogRenderer", + "client.MixinLevelRenderer", + "client.MixinLightTexture", + "client.MixinOptionsScreen", + "client.MixinTextureUtil" + ], + "server": [], + "plugin": "com.seibel.distanthorizons.neoforge.mixins.NeoforgeMixinPlugin" } diff --git a/versionProperties/1.21.3.properties b/versionProperties/1.21.3.properties new file mode 100644 index 000000000..c1bfd96ea --- /dev/null +++ b/versionProperties/1.21.3.properties @@ -0,0 +1,62 @@ +# 1.21.1 version +java_version=21 +minecraft_version=1.21.3 +parchment_version=1.21:2024.07.28 +compatible_minecraft_versions=["1.21.3"] +accessWidenerVersion=1_21_3 +builds_for=neoforge +# fabric is broken due to an issue with their rendering event, issue link: https://github.com/FabricMC/fabric/issues/4195 + # Iris/Sodium are also broken due to some Fabric/Architectury issue + # attempting to activate either will throw the following error: + # "Mod was built with a newer version of Loom (1.8.9), you are using Loom (1.7.414)" + # IrisAccessor will need to be re-enabled when this is fixed + # updating to fabric-loom 1.8 (and gradle-8.10) prevent building/cleaning in Intellij due to file locks +# forge is broken due to gradle/build script issues + +# Netty +netty_version=4.1.97.Final + +# Fabric loader +fabric_loader_version=0.16.9 +fabric_api_version=0.107.0+1.21.3 + # Fabric mod versions + modmenu_version=12.0.0-beta.1 + starlight_version_fabric= + phosphor_version_fabric= + lithium_version= + sodium_version=mc1.21.3-0.6.0-beta.4-fabric + iris_version=1.8.0-beta.6+1.21.2-fabric + bclib_version= + immersive_portals_version= + canvas_version= + + fabric_incompatibility_list={ "iris": "<=1.7.4" } + fabric_recommend_list={} + + # Fabric mod run + # 0 = Don't enable and don't run + # 1 = Can be referenced in code but doesn't run + # 2 = Can be referenced in code and runs in client + enable_starlight=0 + enable_phosphor=0 + enable_sodium=0 + enable_lithium=0 + enable_iris=0 + enable_bclib=0 + enable_immersive_portals=0 + enable_canvas=0 + +# (Neo)Forge loader +forge_version= +neoforge_version=21.3.4-beta + # (Neo)Forge mod versions + starlight_version_forge= + terraforged_version= + + # (Neo)Forge mod run + # 0 = Don't enable and don't run + # 1 = Can be referenced in code but doesn't run + # 2 = Can be referenced in code and runs in client + enable_starlight_forge=0 + enable_terraforged=0 + enable_terrafirmacraft=0