Compare commits

..

6 Commits

Author SHA1 Message Date
Ran 8e7f82d3e0 Update Forgix 2025-05-08 12:44:29 +10:00
Ran 931aa2974e Better CI formatting 2025-05-06 14:00:27 +10:00
Ran 1f77a12fe3 attempt #3 on fixing the CI 2025-05-06 13:14:34 +10:00
Ran dcf546a163 attempt #2 on fixing the CI 2025-05-06 12:37:46 +10:00
Ran 81f050dc8b try to fix CI 2025-05-06 11:33:49 +10:00
Ran 9cd1ada37f multiversion test 2025-05-06 11:27:16 +10:00
54 changed files with 533 additions and 1374 deletions
+2 -1
View File
@@ -5,6 +5,7 @@ root = true
[*] [*]
charset = utf-8 charset = utf-8
end_of_line = crlf
indent_size = 4 indent_size = 4
indent_style = space indent_style = space
insert_final_newline = false insert_final_newline = false
@@ -687,7 +688,7 @@ ij_markdown_wrap_text_inside_blockquotes = true
ij_toml_keep_indents_on_empty_lines = false ij_toml_keep_indents_on_empty_lines = false
[{*.yaml,*.yml}] [{*.yaml,*.yml}]
indent_size = 4 indent_size = 2
ij_yaml_align_values_properties = do_not_align ij_yaml_align_values_properties = do_not_align
ij_yaml_autoinsert_sequence_marker = true ij_yaml_autoinsert_sequence_marker = true
ij_yaml_block_mapping_on_new_line = false ij_yaml_block_mapping_on_new_line = false
+30 -6
View File
@@ -6,6 +6,7 @@ image: eclipse-temurin:21
# TODO: Make stages depend on what is in versionProperties # TODO: Make stages depend on what is in versionProperties
stages: stages:
- build - build
- multiversion
- api - api
- pages - pages
@@ -35,26 +36,49 @@ build:
stage: build stage: build
parallel: parallel:
matrix: matrix:
- MC_VER: ["1.16.5", "1.17.1", "1.18.2", "1.19.2", "1.19.4", "1.20.1", "1.20.2", "1.20.4", "1.20.6", "1.21.1", "1.21.3", "1.21.4", "1.21.5", "1.21.6", "1.21.8"] - MC_VER: ["1.16.5", "1.17.1", "1.18.2", "1.19.2", "1.19.4", "1.20.1", "1.20.2", "1.20.4", "1.20.6", "1.21.1", "1.21.3", "1.21.4", "1.21.5"]
script: script:
# this both runs the unit tests and assembles the code # this both runs the unit tests and assembles the code
- ./gradlew clean -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/;
- ./gradlew build -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/; - ./gradlew build -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/;
- ./gradlew mergeJars -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/; - ./gradlew mergeJars -PmcVer="${MC_VER}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/;
- cp ./fabric/build/libs/* ./forge/build/libs/* ./neoforge/build/libs/* ./build/merged/* . || true - cp ./build/forgix/* . || true
- mkdir -p ./builds
- cp ./fabric/build/libs/* ./forge/build/libs/* ./neoforge/build/libs/* ./builds || true
# When the archive is created, the merged jar will be the main jar and a subfolder named "builds" will contain the other jars
artifacts: artifacts:
name: "NightlyBuild_${MC_VER}-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_TIMESTAMP}" name: "NightlyBuild_${MC_VER}-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_TIMESTAMP}"
paths: paths:
- ./*.jar - ./*.jar
- ./builds/*.jar
exclude: exclude:
- ./*-all.jar - ./builds/*-all.jar
- ./*-dev.jar - ./builds/*-dev.jar
- ./*-sources.jar - ./builds/*-sources.jar
expire_in: 14 days expire_in: 14 days
when: always when: always
extends: .build_java extends: .build_java
multiversion:
stage: multiversion
needs: [build]
script:
# Create a semicolon-separated list of jar paths
- MC_VER_PATHS=$(find . -maxdepth 1 -name "*.jar" -type f | tr '\n' ';')
# Run the mergeVersions task
- ./gradlew mergeVersions -PmergeVersions="${MC_VER_PATHS}" -PinfoGitCommit="${CI_COMMIT_SHA}" -PinfoGitBranch="${CI_COMMIT_BRANCH}" -PinfoBuildSource="GitLab CI (${CI_PIPELINE_ID})" --gradle-user-home cache/;
# Clean up existing jars and make sure only the multiversion jar remains which will be uploaded
- rm -f ./*.jar
- cp ./build/forgix/multiversion/* .
artifacts:
name: "NightlyBuild_Multiversion-${CI_COMMIT_SHORT_SHA}-${CI_COMMIT_TIMESTAMP}"
paths:
- ./*.jar
expire_in: 30 days
when: always
extends: .build_java
api: api:
stage: api stage: api
needs: [] needs: []
+10 -6
View File
@@ -13,7 +13,7 @@ plugins {
id "com.github.johnrengelman.shadow" version '8.1.1' apply false id "com.github.johnrengelman.shadow" version '8.1.1' apply false
// Plugin to create merged jars // Plugin to create merged jars
id "io.github.pacifistmc.forgix" version "1.3.4" id "io.github.pacifistmc.forgix" version "2.0.0-SNAPSHOT.2"
// Manifold preprocessor // Manifold preprocessor
id "systems.manifold.manifold-gradle-plugin" version "0.0.2-alpha" id "systems.manifold.manifold-gradle-plugin" version "0.0.2-alpha"
@@ -22,6 +22,14 @@ plugins {
id "dev.architectury.loom" version "1.10-SNAPSHOT" apply false id "dev.architectury.loom" version "1.10-SNAPSHOT" apply false
} }
// Sets up Forgix for multiversion merging
forgix {
if (project.hasProperty('mergeVersions')) { // This is set using -PmergeVersions by the GitLab CI
multiversion {
inputJars = project.files(project.property('mergeVersions').toString().split(';'))
}
}
}
/** /**
* Creates the list of preprocessors to use. * Creates the list of preprocessors to use.
@@ -245,9 +253,7 @@ subprojects { p ->
// Note: MC 1.16 uses 8.2.1, and versions after use 8.5.12 // Note: MC 1.16 uses 8.2.1, and versions after use 8.5.12
// We cannot relocate this library since we call some MC classes that reference it // We cannot relocate this library since we call some MC classes that reference it
implementation("it.unimi.dsi:fastutil:${rootProject.fastutil_version}") implementation("it.unimi.dsi:fastutil:${rootProject.fastutil_version}")
//forgeShadowMe("com.github.luben:zstd-jni:1.5.7-3")
//forgeShadowMe("org.apache.commons:commons-compress:1.27.1")
// Compression // Compression
forgeShadowMe("org.lz4:lz4-java:${rootProject.lz4_version}") // LZ4 forgeShadowMe("org.lz4:lz4-java:${rootProject.lz4_version}") // LZ4
@@ -447,8 +453,6 @@ subprojects { p ->
fabric_incompatibility_list : fabric_incompatibility_list, fabric_incompatibility_list : fabric_incompatibility_list,
fabric_recommend_list : fabric_recommend_list, fabric_recommend_list : fabric_recommend_list,
neoforge_version_range : neoforge_version_range,
] ]
// replace any properties in the sub-projects with the values defined here // replace any properties in the sub-projects with the values defined here
+2 -2
View File
@@ -22,7 +22,7 @@ for d in versionProperties/*; do
echo "==================== Merging $version ====================" echo "==================== Merging $version ===================="
sh gradlew mergeJars -PmcVer=$version sh gradlew mergeJars -PmcVer=$version
if [ $? != 0 ]; then continue; fi if [ $? != 0 ]; then continue; fi
echo "==================== Moving jar ====================" echo "==================== Moving jar ===================="
mv build/merged/*.jar buildAllJars/ mv Merged/*.jar buildAllJars/
done done
+3 -6
View File
@@ -15,15 +15,12 @@ for %%f in (versionProperties\*) do (
@rem Clean out the folders, build it, and merge it @rem Clean out the folders, build it, and merge it
echo ==================== Cleaning workspace to build !version! ==================== echo ==================== Cleaning workspace to build !version! ====================
call .\gradlew.bat clean call .\gradlew.bat clean
echo ==================== Building !version! ====================
echo ==================== Building !version! ====================
call .\gradlew.bat build -PmcVer="!version!" call .\gradlew.bat build -PmcVer="!version!"
echo ==================== Merging !version! ====================
echo ==================== Merging !version! ====================
call .\gradlew.bat mergeJars -PmcVer="!version!" call .\gradlew.bat mergeJars -PmcVer="!version!"
echo ==================== Moving jar ==================== echo ==================== Moving jar ====================
move build\merged\*.jar buildAllJars\ move Merged\*.jar buildAllJars\
) )
endlocal endlocal
@@ -66,7 +66,7 @@ public abstract class AbstractModInitializer
{ {
DependencySetup.createClientBindings(); DependencySetup.createClientBindings();
LOGGER.info("Initializing " + ModInfo.READABLE_NAME + " client, firing DhApiBeforeDhInitEvent..."); LOGGER.info("Initializing " + ModInfo.READABLE_NAME + " client.");
ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null); ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null);
this.startup(); this.startup();
@@ -77,12 +77,13 @@ public abstract class AbstractModInitializer
this.initializeModCompat(); this.initializeModCompat();
LOGGER.info(ModInfo.READABLE_NAME + " client Initialized.");
ApiEventInjector.INSTANCE.fireAllEvents(DhApiAfterDhInitEvent.class, null);
// Client uses config for auto-updater, so it's initialized here instead of post-init stage // Client uses config for auto-updater, so it's initialized here instead of post-init stage
this.initConfig(); this.initConfig();
logModIncompatibilityWarnings(); // needs to be called after config loading logModIncompatibilityWarnings(); // needs to be called after config loading
LOGGER.info(ModInfo.READABLE_NAME + " client Initialized.");
this.subscribeClientStartedEvent(this::postInit); this.subscribeClientStartedEvent(this::postInit);
} }
@@ -90,7 +91,7 @@ public abstract class AbstractModInitializer
{ {
DependencySetup.createServerBindings(); DependencySetup.createServerBindings();
LOGGER.info("Initializing " + ModInfo.READABLE_NAME + " server, firing DhApiBeforeDhInitEvent event..."); LOGGER.info("Initializing " + ModInfo.READABLE_NAME + " server.");
ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null); ApiEventInjector.INSTANCE.fireAllEvents(DhApiBeforeDhInitEvent.class, null);
this.startup(); this.startup();
@@ -105,7 +106,8 @@ public abstract class AbstractModInitializer
this.initializeModCompat(); this.initializeModCompat();
LOGGER.info(ModInfo.READABLE_NAME + " server Initialized, adding event subscribers..."); LOGGER.info(ModInfo.READABLE_NAME + " server Initialized.");
ApiEventInjector.INSTANCE.fireAllEvents(DhApiAfterDhInitEvent.class, null);
this.subscribeRegisterCommandsEvent(dispatcher -> { this.commandInitializer = new CommandInitializer(dispatcher); }); this.subscribeRegisterCommandsEvent(dispatcher -> { this.commandInitializer = new CommandInitializer(dispatcher); });
@@ -119,7 +121,7 @@ public abstract class AbstractModInitializer
this.checkForUpdates(); this.checkForUpdates();
LOGGER.info(ModInfo.READABLE_NAME + " server Initialized at " + server.getServerDirectory()); LOGGER.info("Dedicated server initialized at " + server.getServerDirectory());
}); });
} }
@@ -181,12 +183,9 @@ public abstract class AbstractModInitializer
private void postInit() private void postInit()
{ {
LOGGER.info("Running Delayed setup..."); LOGGER.info("Post-Initializing Mod");
this.runDelayedSetup(); this.runDelayedSetup();
LOGGER.info("Delayed setup complete, firing DhApiAfterDhInitEvent event..."); LOGGER.info("Mod Post-Initialized");
// should be fired after all delayed setup so singletons and config can be accessed
ApiEventInjector.INSTANCE.fireAllEvents(DhApiAfterDhInitEvent.class, null);
} }
@@ -49,9 +49,7 @@ public class McObjectConverter
@Deprecated @Deprecated
public static Mat4f Convert( public static Mat4f Convert(
#if MC_VER < MC_1_19_4 com.mojang.math.Matrix4f #if MC_VER < MC_1_19_4 com.mojang.math.Matrix4f
#elif MC_VER < MC_1_21_6 org.joml.Matrix4f #else org.joml.Matrix4f #endif
#else org.joml.Matrix4fc
#endif
mcMatrix) mcMatrix)
{ {
FloatBuffer buffer = FloatBuffer.allocate(16); FloatBuffer buffer = FloatBuffer.allocate(16);
@@ -65,9 +63,7 @@ public class McObjectConverter
/** Taken from Minecraft's com.mojang.math.Matrix4f class from 1.18.2 */ /** Taken from Minecraft's com.mojang.math.Matrix4f class from 1.18.2 */
private static void storeMatrix( private static void storeMatrix(
#if MC_VER < MC_1_19_4 com.mojang.math.Matrix4f #if MC_VER < MC_1_19_4 com.mojang.math.Matrix4f
#elif MC_VER < MC_1_21_6 org.joml.Matrix4f #else org.joml.Matrix4f #endif
#else org.joml.Matrix4fc
#endif
matrix, matrix,
FloatBuffer buffer) FloatBuffer buffer)
{ {
@@ -74,10 +74,6 @@ public class VersionConstants implements IVersionConstants
return "1.21.4"; return "1.21.4";
#elif MC_VER == MC_1_21_5 #elif MC_VER == MC_1_21_5
return "1.21.5"; return "1.21.5";
#elif MC_VER == MC_1_21_6
return "1.21.6";
#elif MC_VER == MC_1_21_8
return "1.21.8";
#else #else
ERROR MC version constant missing ERROR MC version constant missing
#endif #endif
@@ -47,7 +47,6 @@ import net.minecraft.core.registries.Registries;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome;
#if MC_VER >= MC_1_18_2 #if MC_VER >= MC_1_18_2
import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.biome.Biomes;
#endif #endif
@@ -131,6 +130,14 @@ public class BiomeWrapper implements IBiomeWrapper
//LOGGER.trace("Created BiomeWrapper ["+this.serialString+"] for ["+biome+"]"); //LOGGER.trace("Created BiomeWrapper ["+this.serialString+"] for ["+biome+"]");
} }
/** should only be used to create {@link BiomeWrapper#EMPTY_WRAPPER} */
private BiomeWrapper()
{
this.biome = null;
this.serialString = EMPTY_BIOME_STRING;
this.hashCode = Objects.hash(this.serialString);
}
//=========// //=========//
@@ -279,16 +286,64 @@ public class BiomeWrapper implements IBiomeWrapper
BiomeWrapper foundWrapper = EMPTY_WRAPPER; BiomeWrapper foundWrapper = EMPTY_WRAPPER;
try try
{ {
// parse the resource location
int separatorIndex = resourceLocationString.indexOf(":");
if (separatorIndex == -1)
{
throw new IOException("Unable to parse resource location string: [" + resourceLocationString + "].");
}
ResourceLocation resourceLocation;
try
{
#if MC_VER < MC_1_21_1
resourceLocation = new ResourceLocation(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1));
#else
resourceLocation = ResourceLocation.fromNamespaceAndPath(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1));
#endif
}
catch (Exception e)
{
throw new IOException("No Resource Location found for the string: [" + resourceLocationString + "] Error: [" + e.getMessage() + "].");
}
try try
{ {
Level level = (Level) levelWrapper.getWrappedMcObject(); Level level = (Level) levelWrapper.getWrappedMcObject();
net.minecraft.core.RegistryAccess registryAccess = level.registryAccess(); net.minecraft.core.RegistryAccess registryAccess = level.registryAccess();
BiomeDeserializeResult deserializeResult = deserializeBiome(resourceLocationString, registryAccess); boolean success;
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
Biome biome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation);
success = (biome != null);
#elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2
Biome unwrappedBiome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation);
success = (unwrappedBiome != null);
Holder<Biome> biome = new Holder.Direct<>(unwrappedBiome);
#elif MC_VER < MC_1_21_3
Biome unwrappedBiome = registryAccess.registryOrThrow(Registries.BIOME).get(resourceLocation);
success = (unwrappedBiome != null);
Holder<Biome> biome = new Holder.Direct<>(unwrappedBiome);
#else
Holder<Biome> biome;
Optional<Holder.Reference<Biome>> 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
if (!deserializeResult.success) if (!success)
{ {
if (!brokenResourceLocationStrings.contains(resourceLocationString)) if (!brokenResourceLocationStrings.contains(resourceLocationString))
{ {
@@ -299,7 +354,7 @@ public class BiomeWrapper implements IBiomeWrapper
} }
foundWrapper = (BiomeWrapper) getBiomeWrapper(deserializeResult.biome, levelWrapper); foundWrapper = (BiomeWrapper) getBiomeWrapper(biome, levelWrapper);
return foundWrapper; return foundWrapper;
} }
catch (Exception e) catch (Exception e)
@@ -313,82 +368,4 @@ public class BiomeWrapper implements IBiomeWrapper
} }
} }
public static BiomeDeserializeResult deserializeBiome(String resourceLocationString, net.minecraft.core.RegistryAccess registryAccess) throws IOException
{
// parse the resource location
int separatorIndex = resourceLocationString.indexOf(":");
if (separatorIndex == -1)
{
throw new IOException("Unable to parse resource location string: [" + resourceLocationString + "].");
}
ResourceLocation resourceLocation;
try
{
#if MC_VER < MC_1_21_1
resourceLocation = new ResourceLocation(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1));
#else
resourceLocation = ResourceLocation.fromNamespaceAndPath(resourceLocationString.substring(0, separatorIndex), resourceLocationString.substring(separatorIndex + 1));
#endif
}
catch (Exception e)
{
throw new IOException("No Resource Location found for the string: [" + resourceLocationString + "] Error: [" + e.getMessage() + "].");
}
boolean success;
#if MC_VER == MC_1_16_5 || MC_VER == MC_1_17_1
Biome biome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation);
success = (biome != null);
#elif MC_VER == MC_1_18_2 || MC_VER == MC_1_19_2
Biome unwrappedBiome = registryAccess.registryOrThrow(Registry.BIOME_REGISTRY).get(resourceLocation);
success = (unwrappedBiome != null);
Holder<Biome> biome = new Holder.Direct<>(unwrappedBiome);
#elif MC_VER < MC_1_21_3
Biome unwrappedBiome = registryAccess.registryOrThrow(Registries.BIOME).get(resourceLocation);
success = (unwrappedBiome != null);
Holder<Biome> biome = new Holder.Direct<>(unwrappedBiome);
#else
Holder<Biome> biome;
Optional<Holder.Reference<Biome>> 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
return new BiomeDeserializeResult(success, biome);
}
//================//
// helper classes //
//================//
public static class BiomeDeserializeResult
{
public final boolean success;
#if MC_VER < MC_1_18_2
public final Biome biome;
#else
public final Holder<Biome> biome;
#endif
public BiomeDeserializeResult(boolean success, #if MC_VER < MC_1_18_2 Biome #else Holder<Biome> #endif biome)
{
this.success = success;
this.biome = biome;
}
}
} }
@@ -91,7 +91,7 @@ public class ClientBlockStateColorCache
private static final RandomSource RANDOM = RandomSource.create(); private static final RandomSource RANDOM = RandomSource.create();
#endif #endif
private final IClientLevelWrapper clientLevelWrapper; private final IClientLevelWrapper levelWrapper;
private final BlockState blockState; private final BlockState blockState;
private final LevelReader level; private final LevelReader level;
@@ -174,7 +174,7 @@ public class ClientBlockStateColorCache
public ClientBlockStateColorCache(BlockState blockState, IClientLevelWrapper samplingLevel) public ClientBlockStateColorCache(BlockState blockState, IClientLevelWrapper samplingLevel)
{ {
this.blockState = blockState; this.blockState = blockState;
this.clientLevelWrapper = samplingLevel; this.levelWrapper = samplingLevel;
this.level = (LevelReader) samplingLevel.getWrappedMcObject(); this.level = (LevelReader) samplingLevel.getWrappedMcObject();
this.resolveColors(); this.resolveColors();
} }
@@ -471,7 +471,7 @@ public class ClientBlockStateColorCache
try try
{ {
tintColor = Minecraft.getInstance().getBlockColors() tintColor = Minecraft.getInstance().getBlockColors()
.getColor(this.blockState, new TintWithoutLevelOverrider(biome, this.clientLevelWrapper), McObjectConverter.Convert(pos), this.tintIndex); .getColor(this.blockState, new TintWithoutLevelOverrider(biome, this.levelWrapper), McObjectConverter.Convert(pos), this.tintIndex);
} }
catch (UnsupportedOperationException e) catch (UnsupportedOperationException e)
{ {
@@ -19,10 +19,8 @@
package com.seibel.distanthorizons.common.wrappers.block; package com.seibel.distanthorizons.common.wrappers.block;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.util.ColorUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.world.level.*; import net.minecraft.world.level.*;
@@ -31,7 +29,6 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.lighting.LevelLightEngine; import net.minecraft.world.level.lighting.LevelLightEngine;
import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.FluidState;
import org.apache.logging.log4j.Logger;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -39,64 +36,22 @@ import org.jetbrains.annotations.Nullable;
import net.minecraft.core.Holder; import net.minecraft.core.Holder;
#endif #endif
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
public class TintWithoutLevelOverrider implements BlockAndTintGetter public class TintWithoutLevelOverrider implements BlockAndTintGetter
{ {
private static final Logger LOGGER = DhLoggerBuilder.getLogger(); /**
* This will only ever be null if there was an issue with {@link IClientLevelWrapper#getPlainsBiomeWrapper()}
#if MC_VER < MC_1_18_2 * but {@link Nullable} is there just in case.
public static final ConcurrentMap<String, Biome> BIOME_BY_RESOURCE_STRING = new ConcurrentHashMap<>(); */
@Nullable
#if MC_VER >= MC_1_18_2
public final Holder<Biome> biome;
#else #else
public static final ConcurrentMap<String, Holder<Biome>> BIOME_BY_RESOURCE_STRING = new ConcurrentHashMap<>(); public final Biome biome;
#endif #endif
@NotNull
private final BiomeWrapper biomeWrapper;
//=============//
// constructor //
//=============//
public TintWithoutLevelOverrider(@NotNull BiomeWrapper biomeWrapper, IClientLevelWrapper clientLevelWrapper)
{ this.biomeWrapper = biomeWrapper; }
//=========//
// methods //
//=========//
@Override
public int getBlockTint(@NotNull BlockPos blockPos, @NotNull ColorResolver colorResolver)
{
String biomeString = this.biomeWrapper.getSerialString();
if (biomeString == null
|| biomeString.isEmpty()
|| biomeString.equals(BiomeWrapper.EMPTY_BIOME_STRING))
{
// default to "plains" for empty/invalid biomes
biomeString = "minecraft:plains";
}
return colorResolver.getColor(unwrap(getClientBiome(biomeString)), blockPos.getX(), blockPos.getZ());
}
private static Biome unwrap(#if MC_VER >= MC_1_18_2 Holder<Biome> #else Biome #endif biome)
{
#if MC_VER >= MC_1_18_2
return biome.value();
#else
return biome;
#endif
}
/** /**
* Constructs the TintWithoutLevelOverrider, storing the provided Biome Holder for late-binding access.
*
* <p>Previously, this class might have immediately unwrapped the Holder like this:</p> * <p>Previously, this class might have immediately unwrapped the Holder like this:</p>
* <pre>{@code * <pre>{@code
* // Inside constructor (OLD WAY - PROBLEMATIC): * // Inside constructor (OLD WAY - PROBLEMATIC):
@@ -130,52 +85,41 @@ public class TintWithoutLevelOverrider implements BlockAndTintGetter
* whenever the biome information is needed, ensuring it always retrieves the most current {@code Biome} * whenever the biome information is needed, ensuring it always retrieves the most current {@code Biome}
* instance associated with the holder at that time.</p> * instance associated with the holder at that time.</p>
*/ */
private static #if MC_VER < MC_1_18_2 Biome #else Holder<Biome> #endif getClientBiome(String biomeResourceString) public TintWithoutLevelOverrider(BiomeWrapper biomeWrapper, IClientLevelWrapper clientLevelWrapper)
{ {
// cache the client biomes so we don't have to re-parse the resource location every time #if MC_VER >= MC_1_18_2 Holder<Biome> #else Biome #endif biome = biomeWrapper.biome;
return BIOME_BY_RESOURCE_STRING.compute(biomeResourceString, if (biome == null) // We are looking at the empty biome wrapper
(resourceString, existingBiome) -> {
{ BiomeWrapper plainsBiomeWrapper = ((BiomeWrapper) clientLevelWrapper.getPlainsBiomeWrapper());
if (existingBiome != null) if (plainsBiomeWrapper != null)
{ {
return existingBiome; biome = plainsBiomeWrapper.biome;
} }
}
ClientLevel clientLevel = Minecraft.getInstance().level;
if (clientLevel == null) this.biome = biome;
{ }
// shouldn't happen, but just in case
throw new IllegalStateException("Attempted to get client biome when no client level was loaded.");
}
@Override
BiomeWrapper.BiomeDeserializeResult result; public int getBlockTint(@NotNull BlockPos blockPos, @NotNull ColorResolver colorResolver)
try {
{ if (this.biome == null)
result = BiomeWrapper.deserializeBiome(resourceString, clientLevel.registryAccess()); {
} // hopefully unneeded debug color
catch (Exception e) return ColorUtil.CYAN;
{ }
LOGGER.warn("Unable to deserialize client biome ["+resourceString+"], using fallback..."); return colorResolver.getColor(unwrap(biome), blockPos.getX(), blockPos.getZ());
}
try
{ private static Biome unwrap(#if MC_VER >= MC_1_18_2 Holder<Biome> #else Biome #endif biome)
result = BiomeWrapper.deserializeBiome("minecraft:plains", clientLevel.registryAccess()); {
} #if MC_VER >= MC_1_18_2
catch (IOException ex) return biome.value();
{ #else
// should never happen, if it does this log will explode, but just in case return biome;
LOGGER.error("Unable to deserialize fallback client biome [minecraft:plains], returning NULL."); #endif
return null;
}
}
if (result.success)
{
existingBiome = result.biome;
}
return existingBiome;
});
} }
@@ -56,20 +56,20 @@ import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
import static com.seibel.distanthorizons.common.wrappers.gui.GuiHelper.*; import static com.seibel.distanthorizons.common.wrappers.gui.GuiHelper.*;
import static com.seibel.distanthorizons.common.wrappers.gui.GuiHelper.Translatable;
/* /**
* Based upon TinyConfig but is highly modified * Based upon TinyConfig but is highly modified
* https://github.com/Minenash/TinyConfig * https://github.com/Minenash/TinyConfig
* *
* Note: floats don't work with this system, use doubles.
*
* Credits to Motschen * Credits to Motschen
* *
* @author coolGi * @author coolGi
* @version 5-21-2022 * @version 5-21-2022
*/ */
// FLOATS DONT WORK WITH THIS
/** This file is going to be removed sometime soon, please dont hook onto anything within this file until the new UI is compleated */
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class ClassicConfigGUI public class ClassicConfigGUI
{ {
@@ -178,7 +178,7 @@ public class ClassicConfigGUI
} }
else else
{ {
((ConfigEntry) info).uiSetWithoutSaving(value != null ? value.intValue() : 0); ((ConfigEntry) info).uiSetWithoutSaving(value.intValue());
} }
} }
@@ -249,7 +249,7 @@ public class ClassicConfigGUI
protected void init() protected void init()
{ {
super.init(); super.init();
if (!this.reload) if (!reload)
{ {
ConfigBase.INSTANCE.configFileINSTANCE.loadFromFile(); ConfigBase.INSTANCE.configFileINSTANCE.loadFromFile();
} }
@@ -276,7 +276,7 @@ public class ClassicConfigGUI
(buttonWidget) -> { (buttonWidget) -> {
ChangelogScreen changelogScreen = new ChangelogScreen(this); ChangelogScreen changelogScreen = new ChangelogScreen(this);
if (changelogScreen.usable) if (changelogScreen.usable)
Objects.requireNonNull(this.minecraft).setScreen(changelogScreen); Objects.requireNonNull(minecraft).setScreen(changelogScreen);
else else
LOGGER.warn("Changelog was not able to open"); LOGGER.warn("Changelog was not able to open");
}, },
@@ -286,17 +286,17 @@ public class ClassicConfigGUI
} }
this.addBtn(MakeBtn(Translatable("distanthorizons.general.cancel"), addBtn(MakeBtn(Translatable("distanthorizons.general.cancel"),
this.width / 2 - 154, this.height - 28, this.width / 2 - 154, this.height - 28,
150, 20, 150, 20,
button -> button ->
{ {
ConfigBase.INSTANCE.configFileINSTANCE.loadFromFile(); ConfigBase.INSTANCE.configFileINSTANCE.loadFromFile();
Objects.requireNonNull(this.minecraft).setScreen(this.parent); Objects.requireNonNull(minecraft).setScreen(parent);
})); }));
this.doneButton = this.addBtn(MakeBtn(Translatable("distanthorizons.general.done"), this.width / 2 + 4, this.height - 28, 150, 20, (button) -> { doneButton = addBtn(MakeBtn(Translatable("distanthorizons.general.done"), this.width / 2 + 4, this.height - 28, 150, 20, (button) -> {
ConfigBase.INSTANCE.configFileINSTANCE.saveToFile(); ConfigBase.INSTANCE.configFileINSTANCE.saveToFile();
Objects.requireNonNull(this.minecraft).setScreen(this.parent); Objects.requireNonNull(minecraft).setScreen(parent);
})); }));
this.list = new ConfigListWidget(this.minecraft, this.width * 2, this.height, 32, 32, 25); this.list = new ConfigListWidget(this.minecraft, this.width * 2, this.height, 32, 32, 25);
@@ -312,8 +312,8 @@ public class ClassicConfigGUI
{ {
try try
{ {
if (info.getCategory().matches(this.category) && info.getAppearance().showInGui) if (info.getCategory().matches(category) && info.getAppearance().showInGui)
this.addMenuItem(info); addMenuItem(info);
} }
catch (Exception e) catch (Exception e)
{ {
@@ -336,7 +336,7 @@ public class ClassicConfigGUI
private void addMenuItem(AbstractConfigType info) private void addMenuItem(AbstractConfigType info)
{ {
initEntry(info, this.translationPrefix); initEntry(info, this.translationPrefix);
Component name = Translatable(this.translationPrefix + info.getNameWCategory()); Component name = Translatable(translationPrefix + info.getNameWCategory());
if (ConfigEntry.class.isAssignableFrom(info.getClass())) if (ConfigEntry.class.isAssignableFrom(info.getClass()))
@@ -345,7 +345,7 @@ public class ClassicConfigGUI
((ConfigEntry) info).uiSetWithoutSaving(((ConfigEntry) info).getDefaultValue()); ((ConfigEntry) info).uiSetWithoutSaving(((ConfigEntry) info).getDefaultValue());
((EntryInfo) info.guiValue).index = 0; ((EntryInfo) info.guiValue).index = 0;
this.reload = true; this.reload = true;
Objects.requireNonNull(this.minecraft).setScreen(this); Objects.requireNonNull(minecraft).setScreen(this);
}; };
int posX = this.width - ConfigScreenConfigs.SpaceFromRightScreen - 150 - ConfigScreenConfigs.ButtonWidthSpacing - ConfigScreenConfigs.ResetButtonWidth; int posX = this.width - ConfigScreenConfigs.SpaceFromRightScreen - 150 - ConfigScreenConfigs.ButtonWidthSpacing - ConfigScreenConfigs.ResetButtonWidth;
int posZ = 0; int posZ = 0;
@@ -359,17 +359,17 @@ public class ClassicConfigGUI
Map.Entry<Button.OnPress, Function<Object, Component>> widget = (Map.Entry<Button.OnPress, Function<Object, Component>>) ((EntryInfo) info.guiValue).widget; Map.Entry<Button.OnPress, Function<Object, Component>> widget = (Map.Entry<Button.OnPress, Function<Object, Component>>) ((EntryInfo) info.guiValue).widget;
if (info.getType().isEnum()) if (info.getType().isEnum())
{ {
widget.setValue(value -> Translatable(this.translationPrefix + "enum." + info.getType().getSimpleName() + "." + info.get().toString())); widget.setValue(value -> Translatable(translationPrefix + "enum." + info.getType().getSimpleName() + "." + info.get().toString()));
} }
this.list.addButton(MakeBtn(widget.getValue().apply(info.get()), this.width - 150 - ConfigScreenConfigs.SpaceFromRightScreen, 0, 150, 20, widget.getKey()), resetButton, null, name); this.list.addButton(MakeBtn(widget.getValue().apply(info.get()), this.width - 150 - ConfigScreenConfigs.SpaceFromRightScreen, 0, 150, 20, widget.getKey()), resetButton, null, name);
return; return;
} }
else if (((EntryInfo) info.guiValue).widget != null) else if (((EntryInfo) info.guiValue).widget != null)
{ {
EditBox widget = new EditBox(this.font, this.width - 150 - ConfigScreenConfigs.SpaceFromRightScreen + 2, 0, 150 - 4, 20, Translatable("")); EditBox widget = new EditBox(font, this.width - 150 - ConfigScreenConfigs.SpaceFromRightScreen + 2, 0, 150 - 4, 20, null);
widget.setMaxLength(150); widget.setMaxLength(150);
widget.insertText(String.valueOf(info.get())); widget.insertText(String.valueOf(info.get()));
Predicate<String> processor = ((BiFunction<EditBox, Button, Predicate<String>>) ((EntryInfo) info.guiValue).widget).apply(widget, this.doneButton); Predicate<String> processor = ((BiFunction<EditBox, Button, Predicate<String>>) ((EntryInfo) info.guiValue).widget).apply(widget, doneButton);
widget.setFilter(processor); widget.setFilter(processor);
this.list.addButton(widget, resetButton, null, name); this.list.addButton(widget, resetButton, null, name);
return; return;
@@ -379,7 +379,7 @@ public class ClassicConfigGUI
{ {
Button widget = MakeBtn(name, this.width / 2 - 100, this.height - 28, 100 * 2, 20, (button -> { Button widget = MakeBtn(name, this.width / 2 - 100, this.height - 28, 100 * 2, 20, (button -> {
ConfigBase.INSTANCE.configFileINSTANCE.saveToFile(); ConfigBase.INSTANCE.configFileINSTANCE.saveToFile();
Objects.requireNonNull(this.minecraft).setScreen(ClassicConfigGUI.getScreen(this.configBase, this, ((ConfigCategory) info).getDestination())); Objects.requireNonNull(minecraft).setScreen(ClassicConfigGUI.getScreen(this.configBase, this, ((ConfigCategory) info).getDestination()));
})); }));
this.list.addButton(widget, null, null, null); this.list.addButton(widget, null, null, null);
return; return;
@@ -420,34 +420,16 @@ public class ClassicConfigGUI
#endif #endif
this.list.render(matrices, mouseX, mouseY, delta); // Render buttons this.list.render(matrices, mouseX, mouseY, delta); // Render buttons
// Render title DhDrawCenteredString(matrices, font, title, width / 2, 15, 0xFFFFFF); // Render title
this.DhDrawCenteredString(matrices, this.font, this.title, this.width / 2, 15,
#if MC_VER < MC_1_21_6
0xFFFFFF // RGB white
#else
0xFFFFFFFF // ARGB white
#endif);
if (this.configBase.modID.equals("distanthorizons")) if (this.configBase.modID.equals("distanthorizons"))
{ {
// Display version // Display version
this.DhDrawString(matrices, this.font, TextOrLiteral(ModInfo.VERSION), 2, this.height - 10, DhDrawString(matrices, font, TextOrLiteral(ModInfo.VERSION), 2, height - 10, 0xAAAAAA);
#if MC_VER < MC_1_21_6
0xAAAAAA // RGB white
#else
0xFFAAAAAA // ARGB white
#endif);
// If the update is pending, display this message to inform the user that it will apply when the game restarts // If the update is pending, display this message to inform the user that it will apply when the game restarts
if (SelfUpdater.deleteOldJarOnJvmShutdown) if (SelfUpdater.deleteOldJarOnJvmShutdown)
{ DhDrawString(matrices, font, Translatable(configBase.modID + ".updater.waitingForClose"), 4, height - 38, 0xFFFFFF);
this.DhDrawString(matrices, this.font, Translatable(this.configBase.modID + ".updater.waitingForClose"), 4, this.height - 38,
#if MC_VER < MC_1_21_6
0xFFFFFF // RGB white
#else
0xFFFFFFFF // ARGB white
#endif);
}
} }
@@ -677,10 +659,8 @@ public class ClassicConfigGUI
if (text != null && (!text.getString().contains("spacer") || button != null)) if (text != null && (!text.getString().contains("spacer") || button != null))
#if MC_VER < MC_1_20_1 #if MC_VER < MC_1_20_1
GuiComponent.drawString(matrices, textRenderer, text, 12, y + 5, 0xFFFFFF); GuiComponent.drawString(matrices, textRenderer, text, 12, y + 5, 0xFFFFFF);
#elif MC_VER < MC_1_21_6
matrices.drawString(textRenderer, this.text, 12, y + 5, 0xFFFFFF);
#else #else
matrices.drawString(textRenderer, this.text, 12, y + 5, 0xFFFFFFFF); matrices.drawString(textRenderer, text, 12, y + 5, 0xFFFFFF);
#endif #endif
} }
@@ -52,27 +52,6 @@ public class DhScreen extends Screen
{ {
renderTooltip(guiStack, comp, x, y); renderTooltip(guiStack, comp, x, y);
} }
#elif MC_VER < MC_1_21_6
protected void DhDrawCenteredString(GuiGraphics guiStack, Font font, Component text, int x, int y, int color)
{
guiStack.drawCenteredString(font, text, x, y, color);
}
protected void DhDrawString(GuiGraphics guiStack, Font font, Component text, int x, int y, int color)
{
guiStack.drawString(font, text, x, y, color);
}
//protected void DhRenderTooltip(GuiGraphics guiStack, Font font, List<? extends net.minecraft.util.FormattedCharSequence> text, int x, int y)
//{
// guiStack.renderTooltip(font, text, x, y);
//}
protected void DhRenderComponentTooltip(GuiGraphics guiStack, Font font, List<Component> comp, int x, int y)
{
guiStack.renderComponentTooltip(font, comp, x, y);
}
protected void DhRenderTooltip(GuiGraphics guiStack, Font font, Component text, int x, int y)
{
guiStack.renderTooltip(font, text, x, y);
}
#else #else
protected void DhDrawCenteredString(GuiGraphics guiStack, Font font, Component text, int x, int y, int color) protected void DhDrawCenteredString(GuiGraphics guiStack, Font font, Component text, int x, int y, int color)
{ {
@@ -82,20 +61,17 @@ public class DhScreen extends Screen
{ {
guiStack.drawString(font, text, x, y, color); guiStack.drawString(font, text, x, y, color);
} }
//protected void DhRenderTooltip(GuiGraphics guiStack, Font font, List<? extends net.minecraft.util.FormattedCharSequence> text, int x, int y) protected void DhRenderTooltip(GuiGraphics guiStack, Font font, List<? extends net.minecraft.util.FormattedCharSequence> text, int x, int y)
//{ {
// //guiStack.renderTooltip(font, text, x, y); guiStack.renderTooltip(font, text, x, y);
//} }
protected void DhRenderComponentTooltip(GuiGraphics guiStack, Font font, List<Component> comp, int x, int y) protected void DhRenderComponentTooltip(GuiGraphics guiStack, Font font, List<Component> comp, int x, int y)
{ {
guiStack.setComponentTooltipForNextFrame(font, comp, x, y); guiStack.renderComponentTooltip(font, comp, x, y);
} }
protected void DhRenderTooltip(GuiGraphics guiStack, Font font, Component text, int x, int y) protected void DhRenderTooltip(GuiGraphics guiStack, Font font, Component text, int x, int y)
{ {
guiStack.setTooltipForNextFrame(font, text, x, y); guiStack.renderTooltip(font, text, x, y);
} }
#endif #endif
} }
@@ -39,13 +39,9 @@ import net.minecraft.client.renderer.GameRenderer;
#elif MC_VER < MC_1_20_2 #elif MC_VER < MC_1_20_2
import net.minecraft.client.gui.components.ImageButton; import net.minecraft.client.gui.components.ImageButton;
import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.GuiGraphics;
#elif MC_VER < MC_1_21_6
import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.RenderType;
#else #else
import net.minecraft.client.gui.GuiGraphics; import net.minecraft.client.gui.GuiGraphics;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.RenderPipelines;
#endif #endif
/** /**
@@ -176,15 +172,9 @@ public class TexturedButtonWidget extends Button
{ {
#if MC_VER < MC_1_21_3 #if MC_VER < MC_1_21_3
matrices.blitSprite(SPRITES.get(this.active, this.isHoveredOrFocused()), this.getX(), this.getY(), this.getWidth(), this.getHeight()); matrices.blitSprite(SPRITES.get(this.active, this.isHoveredOrFocused()), this.getX(), this.getY(), this.getWidth(), this.getHeight());
#elif MC_VER < MC_1_21_6
matrices.blitSprite(
RenderType::guiTextured,
SPRITES.get(this.active, this.isHoveredOrFocused()),
this.getX(), this.getY(),
this.getWidth(), this.getHeight());
#else #else
matrices.blitSprite( matrices.blitSprite(
RenderPipelines.GUI_TEXTURED, RenderType::guiTextured,
SPRITES.get(this.active, this.isHoveredOrFocused()), SPRITES.get(this.active, this.isHoveredOrFocused()),
this.getX(), this.getY(), this.getX(), this.getY(),
this.getWidth(), this.getHeight()); this.getWidth(), this.getHeight());
@@ -206,17 +196,9 @@ public class TexturedButtonWidget extends Button
#if MC_VER < MC_1_21_3 #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); matrices.blit(this.textureResourceLocation, this.getX(), this.getY(), this.u, this.v + (this.hoveredVOffset * i), this.width, this.height, this.textureWidth, this.textureHeight);
#elif MC_VER < MC_1_21_6
matrices.blit(
RenderType::guiTextured,
this.textureResourceLocation,
this.getX(), this.getY(),
this.u, this.v + (this.hoveredVOffset * i),
this.width, this.height,
this.textureWidth, this.textureHeight);
#else #else
matrices.blit( matrices.blit(
RenderPipelines.GUI_TEXTURED, RenderType::guiTextured,
this.textureResourceLocation, this.textureResourceLocation,
this.getX(), this.getY(), this.getX(), this.getY(),
this.u, this.v + (this.hoveredVOffset * i), this.u, this.v + (this.hoveredVOffset * i),
@@ -169,10 +169,8 @@ public class UpdateModScreen extends DhScreen
{ {
#if MC_VER < MC_1_20_2 #if MC_VER < MC_1_20_2
this.renderBackground(matrices); // Render background this.renderBackground(matrices); // Render background
#elif MC_VER < MC_1_21_6
this.renderBackground(matrices, mouseX, mouseY, delta); // Render background
#else #else
// background blur is already being rendered, rendering again causes the game to crash this.renderBackground(matrices, mouseX, mouseY, delta); // Render background
#endif #endif
// TODO: add the tooltips for the buttons // TODO: add the tooltips for the buttons
@@ -180,30 +178,16 @@ public class UpdateModScreen extends DhScreen
// TODO: Add tooltips // TODO: Add tooltips
// Render the text's // Render the text's
this.DhDrawCenteredString(matrices, this.font, DhDrawCenteredString(matrices, this.font, Translatable(ModInfo.ID + ".updater.text1"), this.width / 2, this.height / 2 - 35, 0xFFFFFF);
Translatable(ModInfo.ID + ".updater.text1"), DhDrawCenteredString(matrices, this.font,
this.width / 2, this.height / 2 - 35, Translatable(ModInfo.ID + ".updater.text2", currentVer, nextVer),
#if MC_VER < MC_1_21_6 this.width / 2, this.height / 2 - 20, 0x52FD52);
0xFFFFFF // RGB
#else
0xFFFFFFFF // ARGB
#endif
);
this.DhDrawCenteredString(matrices, this.font,
Translatable(ModInfo.ID + ".updater.text2", this.currentVer, this.nextVer),
this.width / 2, this.height / 2 - 20,
#if MC_VER < MC_1_21_6
0x52FD52 // RGB
#else
0xFF52FD52 // ARGB
#endif
);
} }
@Override @Override
public void onClose() public void onClose()
{ {
Objects.requireNonNull(this.minecraft).setScreen(this.parent); // Go to the parent screen Objects.requireNonNull(minecraft).setScreen(this.parent); // Goto the parent screen
} }
} }
@@ -21,7 +21,7 @@ package com.seibel.distanthorizons.common.wrappers.minecraft;
#if MC_VER < MC_1_21_5 #if MC_VER < MC_1_21_5
import com.mojang.blaze3d.platform.GlStateManager; import com.mojang.blaze3d.platform.GlStateManager;
#elif MC_VER >= MC_1_21_5 #elif MC_VER == MC_1_21_5
import com.mojang.blaze3d.opengl.GlStateManager; import com.mojang.blaze3d.opengl.GlStateManager;
#endif #endif
@@ -233,7 +233,7 @@ public class MinecraftGLWrapper implements IMinecraftGLWrapper
GlStateManager._activeTexture(textureId); GlStateManager._activeTexture(textureId);
} }
@Override @Override
public int getActiveTexture() { return GL32.glGetInteger(GL32.GL_TEXTURE_BINDING_2D); } public int getActiveTexture() { return GL32.glGetInteger(GL32.GL_ACTIVE_TEXTURE); }
/** /**
* Always binds to {@link GL32#GL_TEXTURE_2D} * Always binds to {@link GL32#GL_TEXTURE_2D}
@@ -33,12 +33,9 @@ import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.util.ColorUtil; import com.seibel.distanthorizons.core.util.ColorUtil;
import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.ILightMapWrapper;
#if MC_VER < MC_1_17_1 #if MC_VER >= MC_1_17_1
#elif MC_VER < MC_1_21_6
import net.minecraft.client.renderer.FogRenderer; import net.minecraft.client.renderer.FogRenderer;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
#else
import net.minecraft.client.renderer.fog.FogRenderer;
#endif #endif
#if MC_VER < MC_1_19_4 #if MC_VER < MC_1_19_4
@@ -46,6 +43,8 @@ import org.joml.Matrix4f;
import org.joml.Vector3f; import org.joml.Vector3f;
#else #else
#endif #endif
#if MC_VER >= MC_1_20_2
#endif
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOptifineAccessor; import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.AbstractOptifineAccessor;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
@@ -74,6 +73,7 @@ import org.joml.Vector4f;
#if MC_VER >= MC_1_21_5 #if MC_VER >= MC_1_21_5
import com.mojang.blaze3d.opengl.GlTexture; import com.mojang.blaze3d.opengl.GlTexture;
import org.lwjgl.opengl.GL32;
#endif #endif
/** /**
@@ -109,11 +109,6 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
public boolean colorTextureCastFailLogged = false; public boolean colorTextureCastFailLogged = false;
public boolean depthTextureCastFailLogged = false; public boolean depthTextureCastFailLogged = false;
#if MC_VER < MC_1_21_6
#else
private static FogRenderer mcFogRenderer = null;
#endif
//=========// //=========//
@@ -131,22 +126,11 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
/** Unless you really need to know if the player is blind, use {@link MinecraftRenderWrapper#isFogStateSpecial()}/{@link IMinecraftRenderWrapper#isFogStateSpecial()} instead */ /** Unless you really need to know if the player is blind, use {@link MinecraftRenderWrapper#isFogStateSpecial()}/{@link IMinecraftRenderWrapper#isFogStateSpecial()} instead */
public boolean playerHasBlindingEffect() public boolean playerHasBlindingEffect()
{ {
if (MC.player == null) return MC.player.getActiveEffectsMap().get(MobEffects.BLINDNESS) != null
{
return false;
}
else if (MC.player.getActiveEffectsMap() == null)
{
return false;
}
else
{
return MC.player.getActiveEffectsMap().get(MobEffects.BLINDNESS) != null
#if MC_VER >= MC_1_19_2 #if MC_VER >= MC_1_19_2
|| MC.player.getActiveEffectsMap().get(MobEffects.DARKNESS) != null // Deep dark effect || MC.player.getActiveEffectsMap().get(MobEffects.DARKNESS) != null // Deep dark effect
#endif #endif
; ;
}
} }
@Override @Override
@@ -179,33 +163,8 @@ public class MinecraftRenderWrapper implements IMinecraftRenderWrapper
Math.max(0f, Math.min(colorValues[2], 1f)), // b Math.max(0f, Math.min(colorValues[2], 1f)), // b
Math.max(0f, Math.min(colorValues[3], 1f)) // a Math.max(0f, Math.min(colorValues[3], 1f)) // a
); );
#elif MC_VER < MC_1_21_6
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
);
#else #else
Vector4f colorValues = FogRenderer.computeFogColor(MC.gameRenderer.getMainCamera(), partialTicks, MC.level, 1, MC.gameRenderer.getDarkenWorldAmount(partialTicks));
if (mcFogRenderer == null)
{
mcFogRenderer = new FogRenderer();
}
if (MC.level == null)
{
// shouldn't happen, but just in case
return Color.white;
}
boolean isFoggy =
MC.level.effects().isFoggyAt(
MC.gameRenderer.getMainCamera().getBlockPosition().getX(),
MC.gameRenderer.getMainCamera().getBlockPosition().getZ())
|| MC.gui.getBossOverlay().shouldCreateWorldFog();
Vector4f colorValues = mcFogRenderer.setupFog(MC.gameRenderer.getMainCamera(), MC.options.getEffectiveRenderDistance(), isFoggy, MC.deltaTracker, MC.gameRenderer.getDarkenWorldAmount(MC.deltaTracker.getGameTimeDeltaPartialTick(true)), MC.level);
return new Color( return new Color(
Math.max(0f, Math.min(colorValues.x, 1f)), // r Math.max(0f, Math.min(colorValues.x, 1f)), // r
Math.max(0f, Math.min(colorValues.y, 1f)), // g Math.max(0f, Math.min(colorValues.y, 1f)), // g
@@ -54,10 +54,8 @@ public class ServerPlayerWrapper implements IServerPlayerWrapper
{ {
#if MC_VER < MC_1_20_1 #if MC_VER < MC_1_20_1
level = this.getServerPlayer().getLevel(); level = this.getServerPlayer().getLevel();
#elif MC_VER < MC_1_21_6
level = this.getServerPlayer().serverLevel();
#else #else
level = this.getServerPlayer().level(); level = this.getServerPlayer().serverLevel();
#endif #endif
} }
@@ -72,14 +70,7 @@ public class ServerPlayerWrapper implements IServerPlayerWrapper
} }
@Override @Override
public int getViewDistance() public int getViewDistance() { return this.getServerPlayer().server.getPlayerList().getViewDistance(); }
{
#if MC_VER < MC_1_21_6
return this.getServerPlayer().server.getPlayerList().getViewDistance();
#else
return this.getServerPlayer().getServer().getPlayerList().getViewDistance();
#endif
}
@Override @Override
public SocketAddress getRemoteAddress() public SocketAddress getRemoteAddress()
@@ -37,7 +37,6 @@ import java.util.Collections;
import java.util.Map; import java.util.Map;
import java.util.WeakHashMap; import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
#if MC_VER <= MC_1_20_4 #if MC_VER <= MC_1_20_4
import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.ChunkStatus;
@@ -67,10 +66,6 @@ public class ClientLevelWrapper implements IClientLevelWrapper
private final ClientLevel level; private final ClientLevel level;
private final ConcurrentHashMap<BlockState, ClientBlockStateColorCache> blockCache = new ConcurrentHashMap<>(); private final ConcurrentHashMap<BlockState, ClientBlockStateColorCache> blockCache = new ConcurrentHashMap<>();
/** cached method reference to reduce GC overhead */
private final Function<BlockState, ClientBlockStateColorCache> cachedBlockColorCacheFunction = (blockState) -> this.createBlockColorCache(blockState);
private BlockStateWrapper dirtBlockWrapper; private BlockStateWrapper dirtBlockWrapper;
private BiomeWrapper plainsBiomeWrapper; private BiomeWrapper plainsBiomeWrapper;
@Deprecated // TODO circular references are bad @Deprecated // TODO circular references are bad
@@ -110,26 +105,14 @@ public class ClientLevelWrapper implements IClientLevelWrapper
} }
} }
return LEVEL_WRAPPER_REF_BY_CLIENT_LEVEL.compute(level, (newLevel, levelRef) ->
WeakReference<ClientLevelWrapper> levelRef = LEVEL_WRAPPER_REF_BY_CLIENT_LEVEL.get(level);
if (levelRef != null)
{ {
ClientLevelWrapper levelWrapper = levelRef.get(); if (levelRef != null)
if (levelWrapper != null)
{ {
return levelWrapper; ClientLevelWrapper oldLevelWrapper = levelRef.get();
}
}
return LEVEL_WRAPPER_REF_BY_CLIENT_LEVEL.compute(level, (newLevel, newLevelRef) ->
{
if (newLevelRef != null)
{
ClientLevelWrapper oldLevelWrapper = newLevelRef.get();
if (oldLevelWrapper != null) if (oldLevelWrapper != null)
{ {
return newLevelRef; return levelRef;
} }
} }
@@ -179,13 +162,10 @@ public class ClientLevelWrapper implements IClientLevelWrapper
{ {
ClientBlockStateColorCache blockColorCache = this.blockCache.computeIfAbsent( ClientBlockStateColorCache blockColorCache = this.blockCache.computeIfAbsent(
((BlockStateWrapper) blockWrapper).blockState, ((BlockStateWrapper) blockWrapper).blockState,
this.cachedBlockColorCacheFunction); (block) -> new ClientBlockStateColorCache(block, this));
return blockColorCache.getColor((BiomeWrapper) biome, pos); return blockColorCache.getColor((BiomeWrapper) biome, pos);
} }
/** used by {@link ClientLevelWrapper#cachedBlockColorCacheFunction} */
private ClientBlockStateColorCache createBlockColorCache(BlockState block) { return new ClientBlockStateColorCache(block, this); }
@Override @Override
public int getDirtBlockColor() public int getDirtBlockColor()
@@ -162,7 +162,7 @@ public class ChunkLoader
#if MC_VER < MC_1_18_2 #if MC_VER < MC_1_18_2
if (chunkType != ChunkStatus.ChunkType.LEVELCHUNK) if (chunkType != ChunkStatus.ChunkType.LEVELCHUNK)
return null; return null;
#elif MC_VER < MC_1_21_6 #else
BlendingData blendingData = readBlendingData(tagLevel); BlendingData blendingData = readBlendingData(tagLevel);
#if MC_VER < MC_1_19_2 #if MC_VER < MC_1_19_2
@@ -172,39 +172,27 @@ public class ChunkLoader
if (chunkType == #if MC_VER < MC_1_20_6 ChunkStatus.ChunkType.PROTOCHUNK #else ChunkType.PROTOCHUNK #endif && blendingData == null) if (chunkType == #if MC_VER < MC_1_20_6 ChunkStatus.ChunkType.PROTOCHUNK #else ChunkType.PROTOCHUNK #endif && blendingData == null)
return null; return null;
#endif #endif
#else
// ignore blending data, there appears to be an issue with parsing it in 1.21.6
BlendingData blendingData = null;
if (chunkType == ChunkType.PROTOCHUNK)
{
return null;
}
#endif #endif
long inhabitedTime = tagGetLong(tagLevel, "InhabitedTime"); long inhabitedTime = tagGetLong(tagLevel, "InhabitedTime");
//================== Read params for making the LevelChunk ================== //================== Read params for making the LevelChunk ==================
UpgradeData upgradeData = UpgradeData.EMPTY; UpgradeData upgradeData;
// commented out 2025-06-04 as a test to see if the upgrade data #if MC_VER < MC_1_17_1
// is actually necessary for DH or if it can be ignored upgradeData = tagLevel.contains(TAG_UPGRADE_DATA, 10)
// (if it can't be ignored we'll need to handle null responses from tagGetCompoundTag()) ? new UpgradeData(tagGetCompoundTag(tagLevel, TAG_UPGRADE_DATA))
// : UpgradeData.EMPTY;
//#if MC_VER < MC_1_17_1 #elif MC_VER < MC_1_21_5
//upgradeData = tagLevel.contains(TAG_UPGRADE_DATA, 10) upgradeData = tagLevel.contains(TAG_UPGRADE_DATA, 10)
// ? new UpgradeData(tagGetCompoundTag(tagLevel, TAG_UPGRADE_DATA)) ? new UpgradeData(tagGetCompoundTag(tagLevel, TAG_UPGRADE_DATA), level)
// : UpgradeData.EMPTY; : UpgradeData.EMPTY;
//#elif MC_VER < MC_1_21_5 #else
//upgradeData = tagLevel.contains(TAG_UPGRADE_DATA, 10) upgradeData = tagLevel.contains(TAG_UPGRADE_DATA)
// ? new UpgradeData(tagGetCompoundTag(tagLevel, TAG_UPGRADE_DATA), level) ? new UpgradeData(tagGetCompoundTag(tagLevel, TAG_UPGRADE_DATA), level)
// : UpgradeData.EMPTY; : UpgradeData.EMPTY;
//#else #endif
//upgradeData = tagLevel.contains(TAG_UPGRADE_DATA)
// ? new UpgradeData(tagGetCompoundTag(tagLevel, TAG_UPGRADE_DATA), level)
// : UpgradeData.EMPTY;
//#endif
boolean isLightOn = tagGetBoolean(tagLevel, "isLightOn"); boolean isLightOn = tagGetBoolean(tagLevel, "isLightOn");
@@ -254,7 +242,7 @@ public class ChunkLoader
// Set some states after object creation // Set some states after object creation
chunk.setLightCorrect(isLightOn); chunk.setLightCorrect(isLightOn);
readHeightmaps(chunk, chunkData); readHeightmaps(chunk, chunkData);
//readPostPocessings(chunk, chunkData); readPostPocessings(chunk, chunkData);
return chunk; return chunk;
} }
private static LevelChunkSection[] readSections(LevelAccessor level, ChunkPos chunkPos, CompoundTag chunkData) private static LevelChunkSection[] readSections(LevelAccessor level, ChunkPos chunkPos, CompoundTag chunkData)
@@ -297,54 +285,48 @@ public class ChunkLoader
for (int j = 0; j < tagSections.size(); ++j) for (int j = 0; j < tagSections.size(); ++j)
{ {
CompoundTag tagSection = tagGetCompoundTag(tagSections, j); CompoundTag tagSection = tagGetCompoundTag(tagSections, j);
if (tagSection == null) int sectionYPos = tagGetByte(tagSection, "Y");
{
continue;
}
final int sectionYPos = tagGetByte(tagSection, "Y");
#if MC_VER < MC_1_18_2 #if MC_VER < MC_1_18_2
if (tagSection.contains("Palette", 9) && tagSection.contains("BlockStates", 12)) if (tagSection.contains("Palette", 9) && tagSection.contains("BlockStates", 12))
{ {
LevelChunkSection levelChunkSection = new LevelChunkSection(sectionYPos << 4); LevelChunkSection levelChunkSection = new LevelChunkSection(sectionYPos << 4);
levelChunkSection.getStates().read(tagSection.getList("Palette", 10), levelChunkSection.getStates().read(tagSection.getList("Palette", 10),
tagSection.getLongArray("BlockStates")); tagSection.getLongArray("BlockStates"));
levelChunkSection.recalcBlockCounts(); levelChunkSection.recalcBlockCounts();
if (!levelChunkSection.isEmpty()) if (!levelChunkSection.isEmpty())
chunkSections[#if MC_VER < MC_1_17_1 sectionYPos #else level.getSectionIndexFromSectionY(sectionYPos) #endif ] chunkSections[#if MC_VER < MC_1_17_1 sectionYPos #else level.getSectionIndexFromSectionY(sectionYPos) #endif ]
= levelChunkSection; = levelChunkSection;
} }
#else #else
int sectionId = level.getSectionIndexFromSectionY(sectionYPos); int sectionId = level.getSectionIndexFromSectionY(sectionYPos);
if (sectionId >= 0 && sectionId < chunkSections.length) if (sectionId >= 0 && sectionId < chunkSections.length)
{ {
PalettedContainer<BlockState> blockStateContainer; PalettedContainer<BlockState> blockStateContainer;
#if MC_VER < MC_1_18_2 #if MC_VER < MC_1_18_2
PalettedContainer<Biome> biomeContainer; PalettedContainer<Biome> biomeContainer;
#else #else
PalettedContainer<Holder<Biome>> biomeContainer; PalettedContainer<Holder<Biome>> biomeContainer;
#endif #endif
boolean containsBlockStates; boolean containsBlockStates;
#if MC_VER < MC_1_21_5 #if MC_VER < MC_1_21_5
containsBlockStates = tagSection.contains("block_states", 10); containsBlockStates = tagSection.contains("block_states", 10);
#else #else
containsBlockStates = tagSection.contains("block_states"); containsBlockStates = tagSection.contains("block_states");
#endif #endif
if (containsBlockStates) if (containsBlockStates)
{ {
#if MC_VER < MC_1_20_6 #if MC_VER < MC_1_20_6
blockStateContainer = BLOCK_STATE_CODEC.parse(NbtOps.INSTANCE, tagGetCompoundTag(tagSection, "block_states")) blockStateContainer = BLOCK_STATE_CODEC.parse(NbtOps.INSTANCE, tagGetCompoundTag(tagSection, "block_states"))
.promotePartial(string -> logBlockDeserializationWarning(chunkPos, sectionYPos, string)) .promotePartial(string -> logBlockDeserializationWarning(chunkPos, sectionYPos, string))
.getOrThrow(false, (message) -> logParsingWarningOnce(message)); .getOrThrow(false, (message) -> logParsingWarningOnce(message));
#else #else
blockStateContainer = BLOCK_STATE_CODEC.parse(NbtOps.INSTANCE, tagGetCompoundTag(tagSection, "block_states")) blockStateContainer = BLOCK_STATE_CODEC.parse(NbtOps.INSTANCE, tagGetCompoundTag(tagSection, "block_states"))
.promotePartial(string -> logBlockDeserializationWarning(chunkPos, sectionYPos, string)) .promotePartial(string -> logBlockDeserializationWarning(chunkPos, sectionYPos, string))
.getOrThrow((message) -> logErrorAndReturnException(message)); .getOrThrow((message) -> logErrorAndReturnException(message));
#endif #endif
} }
else else
{ {
@@ -352,31 +334,31 @@ public class ChunkLoader
} }
#if MC_VER < MC_1_18_2 #if MC_VER < MC_1_18_2
biomeContainer = tagSection.contains("biomes", 10) biomeContainer = tagSection.contains("biomes", 10)
? biomeCodec.parse(NbtOps.INSTANCE, tagSection.getCompound("biomes")).promotePartial(string -> logErrors(chunkPos, sectionYPos, string)).getOrThrow(false, (message) -> logWarningOnce(message)) ? biomeCodec.parse(NbtOps.INSTANCE, tagSection.getCompound("biomes")).promotePartial(string -> logErrors(chunkPos, sectionYPos, string)).getOrThrow(false, (message) -> logWarningOnce(message))
: new PalettedContainer<Biome>(biomes, biomes.getOrThrow(Biomes.PLAINS), PalettedContainer.Strategy.SECTION_BIOMES); : new PalettedContainer<Biome>(biomes, biomes.getOrThrow(Biomes.PLAINS), PalettedContainer.Strategy.SECTION_BIOMES);
#else #else
boolean containsBiomes; boolean containsBiomes;
#if MC_VER < MC_1_21_5 #if MC_VER < MC_1_21_5
containsBiomes = tagSection.contains("biomes", 10); containsBiomes = tagSection.contains("biomes", 10);
#else #else
containsBiomes = tagSection.contains("biomes"); containsBiomes = tagSection.contains("biomes");
#endif #endif
if (containsBiomes) if (containsBiomes)
{ {
#if MC_VER < MC_1_20_6 #if MC_VER < MC_1_20_6
biomeContainer = biomeCodec.parse(NbtOps.INSTANCE, tagGetCompoundTag(tagSection, "biomes")) biomeContainer = biomeCodec.parse(NbtOps.INSTANCE, tagGetCompoundTag(tagSection, "biomes"))
.promotePartial(string -> logBiomeDeserializationWarning(chunkPos, sectionYIndex, (String) string)) .promotePartial(string -> logBiomeDeserializationWarning(chunkPos, sectionYIndex, (String) string))
.getOrThrow(false, (message) -> logParsingWarningOnce(message)); .getOrThrow(false, (message) -> logParsingWarningOnce(message));
#else #else
biomeContainer = biomeCodec.parse(NbtOps.INSTANCE, tagGetCompoundTag(tagSection, "biomes")) biomeContainer = biomeCodec.parse(NbtOps.INSTANCE, tagGetCompoundTag(tagSection, "biomes"))
.promotePartial(string -> logBiomeDeserializationWarning(chunkPos, sectionYIndex, (String) string)) .promotePartial(string -> logBiomeDeserializationWarning(chunkPos, sectionYIndex, (String) string))
.getOrThrow((message) -> logErrorAndReturnException(message)); .getOrThrow((message) -> logErrorAndReturnException(message));
#endif #endif
} }
else else
{ {
@@ -389,16 +371,16 @@ public class ChunkLoader
PalettedContainer.Strategy.SECTION_BIOMES); PalettedContainer.Strategy.SECTION_BIOMES);
} }
#endif
#if MC_VER < MC_1_20_1
chunkSections[sectionId] = new LevelChunkSection(sectionYPos, blockStateContainer, biomeContainer);
#else
chunkSections[sectionId] = new LevelChunkSection(blockStateContainer, biomeContainer);
#endif
}
#endif #endif
#if MC_VER < MC_1_20_1
chunkSections[sectionId] = new LevelChunkSection(sectionYPos, blockStateContainer, biomeContainer);
#else
chunkSections[sectionId] = new LevelChunkSection(blockStateContainer, biomeContainer);
#endif
}
#endif
} }
} }
return chunkSections; return chunkSections;
@@ -409,14 +391,10 @@ public class ChunkLoader
#else ChunkType #endif #else ChunkType #endif
readChunkType(CompoundTag tagLevel) readChunkType(CompoundTag tagLevel)
{ {
String statusString = tagGetString(tagLevel,"Status"); ChunkStatus chunkStatus = ChunkStatus.byName(tagGetString(tagLevel,"Status"));
if (statusString != null) if (chunkStatus != null)
{ {
ChunkStatus chunkStatus = ChunkStatus.byName(statusString); return chunkStatus.getChunkType();
if (chunkStatus != null)
{
return chunkStatus.getChunkType();
}
} }
#if MC_VER <= MC_1_20_4 #if MC_VER <= MC_1_20_4
@@ -428,52 +406,43 @@ public class ChunkLoader
private static void readHeightmaps(LevelChunk chunk, CompoundTag chunkData) private static void readHeightmaps(LevelChunk chunk, CompoundTag chunkData)
{ {
CompoundTag tagHeightmaps = tagGetCompoundTag(chunkData, "Heightmaps"); CompoundTag tagHeightmaps = tagGetCompoundTag(chunkData, "Heightmaps");
if (tagHeightmaps != null) for (Heightmap.Types type : ChunkStatus.FULL.heightmapsAfter())
{ {
for (Heightmap.Types type : ChunkStatus.FULL.heightmapsAfter()) String heightmap = type.getSerializationKey();
#if MC_VER < MC_1_21_5
if (tagHeightmaps.contains(heightmap, 12))
{ {
String heightmap = type.getSerializationKey(); chunk.setHeightmap(type, tagHeightmaps.getLongArray(heightmap));
#if MC_VER < MC_1_21_5 }
if (tagHeightmaps.contains(heightmap, 12)) #else
if (tagHeightmaps.contains(heightmap))
{
Optional<long[]> optionalHeightmap = tagHeightmaps.getLongArray(heightmap);
if (optionalHeightmap.isPresent())
{ {
chunk.setHeightmap(type, tagHeightmaps.getLongArray(heightmap)); chunk.setHeightmap(type, optionalHeightmap.get());
} }
}
#endif
}
Heightmap.primeHeightmaps(chunk, ChunkStatus.FULL.heightmapsAfter());
}
private static void readPostPocessings(LevelChunk chunk, CompoundTag chunkData)
{
ListTag tagPostProcessings = tagGetListTag(chunkData,"PostProcessing", 9);
for (int i = 0; i < tagPostProcessings.size(); ++i)
{
ListTag listTag3 = tagGetListTag(tagPostProcessings, i);
for (int j = 0; j < listTag3.size(); ++j)
{
#if MC_VER < MC_1_21_3
chunk.addPackedPostProcess(listTag3.getShort(j), i);
#else #else
if (tagHeightmaps.contains(heightmap)) chunk.addPackedPostProcess(ShortList.of(tagGetShort(listTag3, j)), i);
{
Optional<long[]> optionalHeightmap = tagHeightmaps.getLongArray(heightmap);
if (optionalHeightmap.isPresent())
{
chunk.setHeightmap(type, optionalHeightmap.get());
}
}
#endif #endif
} }
Heightmap.primeHeightmaps(chunk, ChunkStatus.FULL.heightmapsAfter());
} }
} }
// commented out as a test as of 2025-06-04 to see if this is actually necessary for DH
// DH probably doesn't need any chunk post-processing data
//private static void readPostPocessings(LevelChunk chunk, CompoundTag chunkData)
//{
// ListTag tagPostProcessings = tagGetListTag(chunkData,"PostProcessing", 9);
// if (tagPostProcessings != null)
// {
// for (int i = 0; i < tagPostProcessings.size(); ++i)
// {
// ListTag listTag3 = tagGetListTag(tagPostProcessings, i);
// for (int j = 0; j < listTag3.size(); ++j)
// {
// #if MC_VER < MC_1_21_3
// chunk.addPackedPostProcess(listTag3.getShort(j), i);
// #else
// chunk.addPackedPostProcess(ShortList.of(tagGetShort(listTag3, j)), i);
// #endif
// }
// }
// }
//}
#if MC_VER >= MC_1_18_2 #if MC_VER >= MC_1_18_2
private static BlendingData readBlendingData(CompoundTag chunkData) private static BlendingData readBlendingData(CompoundTag chunkData)
{ {
@@ -497,7 +466,6 @@ public class ChunkLoader
#if MC_VER < MC_1_21_3 #if MC_VER < MC_1_21_3
blendingData = BlendingData.CODEC.parse(blendingDataTag).resultOrPartial((message) -> logParsingWarningOnce(message)).orElse(null); blendingData = BlendingData.CODEC.parse(blendingDataTag).resultOrPartial((message) -> logParsingWarningOnce(message)).orElse(null);
#else #else
// blending data appears to have changed as of 1.21.6 causing a class cast exception here due to it being wrapped in a Java.Optional
blendingData = BlendingData.unpack(BlendingData.Packed.CODEC.parse(blendingDataTag).resultOrPartial((message) -> logParsingWarningOnce(message)).orElse(null)); blendingData = BlendingData.unpack(BlendingData.Packed.CODEC.parse(blendingDataTag).resultOrPartial((message) -> logParsingWarningOnce(message)).orElse(null));
#endif #endif
} }
@@ -760,7 +728,6 @@ public class ChunkLoader
/** defaults to null if the tag isn't present */ /** defaults to null if the tag isn't present */
@Nullable
private static String tagGetString(CompoundTag tag, String key) private static String tagGetString(CompoundTag tag, String key)
{ {
#if MC_VER < MC_1_21_5 #if MC_VER < MC_1_21_5
@@ -771,7 +738,6 @@ public class ChunkLoader
} }
/** defaults to null if the tag isn't present */ /** defaults to null if the tag isn't present */
@Nullable
private static byte[] tagGetByteArray(CompoundTag tag, String key) private static byte[] tagGetByteArray(CompoundTag tag, String key)
{ {
#if MC_VER < MC_1_21_5 #if MC_VER < MC_1_21_5
@@ -228,14 +228,6 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
modelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix()); modelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix());
#endif #endif
//LOGGER.info("\n\n" +
// "Level Render\n" +
// "Mc MVM: \n" + modelViewMatrix.toString() + "\n" +
// "Mc Proj: \n" + projectionMatrix.toString()
//);
this.clientApi.renderLods(ClientLevelWrapper.getWrapper(renderContext.world()), this.clientApi.renderLods(ClientLevelWrapper.getWrapper(renderContext.world()),
modelViewMatrix, modelViewMatrix,
projectionMatrix, projectionMatrix,
@@ -284,17 +276,6 @@ public class FabricClientProxy implements AbstractModInitializer.IEventProxy
modelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix()); modelViewMatrix = McObjectConverter.Convert(renderContext.positionMatrix());
#endif #endif
#if MC_VER < MC_1_21_6
// rendered in MixinLevelRenderer
#else
ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(renderContext.world()),
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime
);
#endif
this.clientApi.renderFade( this.clientApi.renderFade(
modelViewMatrix, modelViewMatrix,
projectionMatrix, projectionMatrix,
@@ -20,7 +20,6 @@
package com.seibel.distanthorizons.fabric; package com.seibel.distanthorizons.fabric;
import com.mojang.brigadier.CommandDispatcher; import com.mojang.brigadier.CommandDispatcher;
import com.seibel.distanthorizons.api.enums.config.EDhApiMcRenderingFadeMode;
import com.seibel.distanthorizons.common.AbstractModInitializer; import com.seibel.distanthorizons.common.AbstractModInitializer;
import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.config.ConfigBase; import com.seibel.distanthorizons.core.config.ConfigBase;
@@ -127,8 +126,7 @@ public class FabricMain extends AbstractModInitializer implements ClientModIniti
} }
@Override @Override
protected void subscribeClientStartedEvent(Runnable eventHandler) protected void subscribeClientStartedEvent(Runnable eventHandler) { ClientLifecycleEvents.CLIENT_STARTED.register((mc) -> eventHandler.run()); }
{ ClientLifecycleEvents.CLIENT_STARTED.register((mc) -> eventHandler.run()); }
@Override @Override
protected void subscribeServerStartingEvent(Consumer<MinecraftServer> eventHandler) protected void subscribeServerStartingEvent(Consumer<MinecraftServer> eventHandler)
@@ -22,51 +22,31 @@ package com.seibel.distanthorizons.fabric.mixins.client;
import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
import net.minecraft.client.Minecraft;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; 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;
import net.minecraft.client.Camera; import net.minecraft.client.Camera;
import net.minecraft.client.renderer.FogRenderer;
import net.minecraft.client.renderer.FogRenderer.FogMode;
import net.minecraft.world.effect.MobEffects; import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
#if MC_VER < MC_1_17_1 #if MC_VER < MC_1_17_1
import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.FluidState;
import net.minecraft.client.renderer.FogRenderer;
import net.minecraft.client.renderer.FogRenderer.FogMode;
import com.mojang.blaze3d.systems.RenderSystem;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
#elif MC_VER < MC_1_21_3 #elif MC_VER < MC_1_21_3
import net.minecraft.world.level.material.FogType; import net.minecraft.world.level.material.FogType;
import net.minecraft.client.renderer.FogRenderer; #else
import net.minecraft.client.renderer.FogRenderer.FogMode;
import com.mojang.blaze3d.systems.RenderSystem;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
#elif MC_VER < MC_1_21_6
import net.minecraft.world.level.material.FogType; import net.minecraft.world.level.material.FogType;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import com.mojang.blaze3d.shaders.FogShape; import com.mojang.blaze3d.shaders.FogShape;
import net.minecraft.client.renderer.FogRenderer;
import net.minecraft.client.renderer.FogRenderer.FogMode;
import net.minecraft.client.renderer.FogParameters; import net.minecraft.client.renderer.FogParameters;
import org.joml.Vector4f; import org.joml.Vector4f;
import com.mojang.blaze3d.systems.RenderSystem;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
#else
import net.minecraft.world.level.material.FogType;
import net.minecraft.client.renderer.fog.FogRenderer;
import net.minecraft.client.renderer.fog.FogData;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
#endif #endif
@Mixin(FogRenderer.class) @Mixin(FogRenderer.class)
@@ -86,23 +66,18 @@ public class MixinFogRenderer
#elif MC_VER < MC_1_21_3 #elif MC_VER < MC_1_21_3
@Inject(at = @At("RETURN"), method = "setupFog") @Inject(at = @At("RETURN"), method = "setupFog")
private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, float g, CallbackInfo callback) private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, float g, CallbackInfo callback)
#elif MC_VER < MC_1_21_6 #else
@Inject(at = @At("RETURN"), method = "setupFog", cancellable = true) @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<FogParameters> callback) private static void disableSetupFog(Camera camera, FogMode fogMode, Vector4f vector4f, float f, boolean bl, float g, CallbackInfoReturnable<FogParameters> callback)
#else
@Unique
private static void unused()
#endif #endif
{ {
#if MC_VER < MC_1_21_6 boolean cameraNotInFluid = cameraNotInFluid(camera);
boolean cancelFog = cancelFog(camera, fogMode);
#elif MC_VER < MC_1_21_6
boolean cancelFog = cancelFog(camera);
#else
boolean cancelFog = cancelFog();
#endif
if (cancelFog) Entity entity = camera.getEntity();
boolean isSpecialFog = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS);
if (!isSpecialFog && cameraNotInFluid && fogMode == FogMode.FOG_TERRAIN
&& !SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class).isFogStateSpecial()
&& !Config.Client.Advanced.Graphics.Fog.enableVanillaFog.get())
{ {
#if MC_VER < MC_1_17_1 #if MC_VER < MC_1_17_1
RenderSystem.fogStart(A_REALLY_REALLY_BIG_VALUE); RenderSystem.fogStart(A_REALLY_REALLY_BIG_VALUE);
@@ -110,74 +85,10 @@ public class MixinFogRenderer
#elif MC_VER < MC_1_21_3 #elif MC_VER < MC_1_21_3
RenderSystem.setShaderFogStart(A_REALLY_REALLY_BIG_VALUE); RenderSystem.setShaderFogStart(A_REALLY_REALLY_BIG_VALUE);
RenderSystem.setShaderFogEnd(A_EVEN_LARGER_VALUE); RenderSystem.setShaderFogEnd(A_EVEN_LARGER_VALUE);
#elif MC_VER < MC_1_21_6
callback.setReturnValue(FogParameters.NO_FOG);
#else #else
callback.setReturnValue(FogParameters.NO_FOG);
#endif #endif
} }
}
#if MC_VER < MC_1_21_6
#else
// In MC's FogRenderer they clamp the "renderDistanceEnd" fog field to the render distance,
// which prevents us from disabling the vanilla fog.
// This mixin fires after they set the "renderDistanceEnd" so we can change it.
@WrapOperation(
method = "setupFog",
at = @At(
value = "FIELD",
target = "Lnet/minecraft/client/renderer/fog/FogData;renderDistanceEnd:F",
opcode = org.objectweb.asm.Opcodes.PUTFIELD
)
)
private void onSetRenderDistanceEnd(FogData instance, float value, Operation<Void> original)
{
if (cancelFog())
{
instance.environmentalStart = A_REALLY_REALLY_BIG_VALUE;
instance.environmentalEnd = A_EVEN_LARGER_VALUE;
instance.renderDistanceStart = A_REALLY_REALLY_BIG_VALUE;
instance.renderDistanceEnd = A_EVEN_LARGER_VALUE;
}
// Always call the original with the modified or original value
original.call(instance, value);
}
#endif
@Unique
#if MC_VER < MC_1_21_6
private static boolean cancelFog(Camera camera, FogMode fogMode)
#else
private static boolean cancelFog()
#endif
{
#if MC_VER < MC_1_21_6
Entity entity = camera.getEntity();
#else
Camera camera = Minecraft.getInstance().gameRenderer.getMainCamera();
Entity entity = camera.getEntity();
#endif
boolean cameraNotInFluid = cameraNotInFluid(camera);
boolean isSpecialFog = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS);
boolean cancelFog = !isSpecialFog;
cancelFog = cancelFog && cameraNotInFluid;
#if MC_VER < MC_1_21_6
cancelFog = cancelFog && (fogMode == FogMode.FOG_TERRAIN);
#endif
cancelFog = cancelFog && !SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class).isFogStateSpecial();
cancelFog = cancelFog && !Config.Client.Advanced.Graphics.Fog.enableVanillaFog.get();
return cancelFog;
} }
@Unique @Unique
@@ -194,6 +105,4 @@ public class MixinFogRenderer
return cameraNotInFluid; return cameraNotInFluid;
} }
} }
@@ -19,54 +19,51 @@
package com.seibel.distanthorizons.fabric.mixins.client; package com.seibel.distanthorizons.fabric.mixins.client;
#if MC_VER < MC_1_19_4
import net.minecraft.client.renderer.RenderType;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
#if MC_VER < MC_1_19_4
import com.mojang.math.Matrix4f; import com.mojang.math.Matrix4f;
import org.lwjgl.opengl.GL32; import org.lwjgl.opengl.GL32;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
#elif MC_VER < MC_1_21_6
import net.minecraft.client.renderer.RenderType;
import com.mojang.blaze3d.vertex.PoseStack;
import org.joml.Matrix4f;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
#else #else
import net.minecraft.client.renderer.chunk.ChunkSectionsToRender; import org.joml.Matrix4f;
import org.joml.Matrix4fc;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
#endif #endif
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
import com.seibel.distanthorizons.common.wrappers.McObjectConverter; import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.core.api.internal.ClientApi; import com.seibel.distanthorizons.core.api.internal.ClientApi;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.fabric.FabricClientProxy;
import com.seibel.distanthorizons.core.util.math.Mat4f; import com.seibel.distanthorizons.core.util.math.Mat4f;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.client.renderer.LightTexture;
import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.config.Config;
import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.RenderType;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.apache.logging.log4j.Logger; /**
* This class is used to mix in my rendering code
* before Minecraft starts rendering blocks.
* If this wasn't done, and we used Forge's
* render last event, the LODs would render on top
* of the normal terrain.
*
* This is also the mixin for rendering the clouds
*
* @author coolGi
* @author James Seibel
* @version 12-31-2021
*/
@Mixin(LevelRenderer.class) @Mixin(LevelRenderer.class)
public class MixinLevelRenderer public class MixinLevelRenderer
{ {
@Shadow @Shadow
private ClientLevel level; private ClientLevel level;
@Unique
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
#if MC_VER < MC_1_17_1 #if MC_VER < MC_1_17_1
@Inject(at = @At("HEAD"), @Inject(at = @At("HEAD"),
method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDD)V", method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDD)V",
@@ -87,65 +84,51 @@ public class MixinLevelRenderer
method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V", method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
cancellable = true) cancellable = true)
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo callback) private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo callback)
#elif MC_VER < MC_1_21_6 #else
@Inject(at = @At("HEAD"), @Inject(at = @At("HEAD"),
method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;DDDLorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V", method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;DDDLorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V",
cancellable = true) cancellable = true)
private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f projectionMatrix, Matrix4f frustumMatrix, CallbackInfo callback) private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f projectionMatrix, Matrix4f frustumMatrix, CallbackInfo callback)
#else
@Inject(at = @At("HEAD"), method = "prepareChunkRenders", cancellable = true)
private void prepareChunkRenders(Matrix4fc projectionMatrix, double d, double e, double f, CallbackInfoReturnable<ChunkSectionsToRender> callback)
#endif #endif
{ {
#if MC_VER == MC_1_16_5 #if MC_VER == MC_1_16_5
// get the matrices from the OpenGL fixed pipeline // get the matrices from the OpenGL fixed pipeline
float[] mcProjMatrixRaw = new float[16]; float[] mcProjMatrixRaw = new float[16];
GL32.glGetFloatv(GL32.GL_PROJECTION_MATRIX, mcProjMatrixRaw); GL32.glGetFloatv(GL32.GL_PROJECTION_MATRIX, mcProjMatrixRaw);
ClientApi.RENDER_STATE.mcProjectionMatrix = new Mat4f(mcProjMatrixRaw); Mat4f mcProjectionMatrix = new Mat4f(mcProjMatrixRaw);
ClientApi.RENDER_STATE.mcProjectionMatrix.transpose(); mcProjectionMatrix.transpose();
ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose()); Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose());
#elif MC_VER <= MC_1_20_4 #elif MC_VER <= MC_1_20_4
// get the matrices directly from MC // get the matrices directly from MC
ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose()); Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose());
ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix);
#else #else
// MC combined the model view and projection matricies // MC combined the model view and projection matricies
ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(projectionMatrix); Mat4f mcModelViewMatrix = McObjectConverter.Convert(projectionMatrix);
ClientApi.RENDER_STATE.mcProjectionMatrix = new Mat4f(); Mat4f mcProjectionMatrix = new Mat4f();
ClientApi.RENDER_STATE.mcProjectionMatrix.setIdentity(); mcProjectionMatrix.setIdentity();
#endif #endif
// TODO move this into a common place // TODO move this into a common place
float frameTime;
#if MC_VER < MC_1_21_1 #if MC_VER < MC_1_21_1
ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().getFrameTime(); frameTime = Minecraft.getInstance().getFrameTime();
#elif MC_VER < MC_1_21_3 #elif MC_VER < MC_1_21_3
ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(); frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks();
#else #else
ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks(); frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks();
#endif #endif
//LOGGER.info("\n\n" +
// "Level Mixin\n" +
// "Mc MVM: \n" + mcModelViewMatrix.toString() + "\n" +
// "Mc Proj: \n" + mcProjectionMatrix.toString()
//);
#if MC_VER < MC_1_21_6
if (renderType.equals(RenderType.translucent())) if (renderType.equals(RenderType.translucent()))
{ {
ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(this.level), ClientApi.INSTANCE.renderDeferredLods(ClientLevelWrapper.getWrapper(this.level),
ClientApi.RENDER_STATE.mcModelViewMatrix, mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix, mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime frameTime
); );
} }
#else
// rendering handled via Fabric Api render event
#endif
// FIXME completely disables rendering when sodium is installed // FIXME completely disables rendering when sodium is installed
if (Config.Client.Advanced.Debugging.lodOnlyMode.get()) if (Config.Client.Advanced.Debugging.lodOnlyMode.get())
@@ -154,6 +137,4 @@ public class MixinLevelRenderer
} }
} }
} }
@@ -1,48 +0,0 @@
package com.seibel.distanthorizons.fabric.mixins.server;
#if MC_VER < MC_1_21_4
import net.minecraft.world.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
@Mixin(Entity.class)
public class MixinLevelTicks<T>
{
// dummy mixin to make the loader happy
}
#else
import com.seibel.distanthorizons.common.wrappers.DependencySetupDoneCheck;
import net.minecraft.world.ticks.LevelTicks;
import net.minecraft.world.ticks.ScheduledTick;
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(LevelTicks.class) // available in 1.18.2+, but only needed in 1.21.4+
public class MixinLevelTicks<T>
{
// TODO put in a common location
private static boolean isWorldGenThread()
{ return DependencySetupDoneCheck.isDone && DependencySetupDoneCheck.getIsCurrentThreadDistantGeneratorThread.get(); }
@Inject(method = "schedule", at = @At(value = "HEAD"), cancellable = true)
private void onChunkSave(ScheduledTick<T> tick, CallbackInfo ci)
{
// In MC 1.21.4 an error check was added to log attempting to schedule ticks for unloaded chunks
// this caused a lot of unnecessary errors when generating sand (FallingBlock.class).
if (isWorldGenThread())
{
ci.cancel();
}
}
}
#endif
@@ -8,8 +8,7 @@
"server.MixinEntity", "server.MixinEntity",
"server.MixinServerPlayer", "server.MixinServerPlayer",
"server.MixinTracingExecutor", "server.MixinTracingExecutor",
"server.MixinUtilBackgroundThread", "server.MixinUtilBackgroundThread"
"server.MixinLevelTicks"
], ],
"client": [ "client": [
"client.MixinClientLevel", "client.MixinClientLevel",
@@ -118,14 +118,14 @@ public class ForgeMain extends AbstractModInitializer
@Override @Override
protected void subscribeRegisterCommandsEvent(Consumer<CommandDispatcher<CommandSourceStack>> eventHandler) protected void subscribeRegisterCommandsEvent(Consumer<CommandDispatcher<CommandSourceStack>> eventHandler)
{ MinecraftForge.EVENT_BUS.addListener((RegisterCommandsEvent e) -> { eventHandler.accept(e.getDispatcher()); }); } {
MinecraftForge.EVENT_BUS.addListener((RegisterCommandsEvent e) -> { eventHandler.accept(e.getDispatcher()); });
}
@Override @Override
protected void subscribeClientStartedEvent(Runnable eventHandler) protected void subscribeClientStartedEvent(Runnable eventHandler)
{ {
// Just run the event handler, since there are no proper ClientLifecycleEvent for the client // FIXME What event is this?
// to signify readiness other than FmlClientSetupEvent
eventHandler.run();
} }
@Override @Override
@@ -156,7 +156,7 @@ public class MixinLevelRenderer
} }
else if (renderType.equals(RenderType.translucent())) else if (renderType.equals(RenderType.translucent()))
{ {
ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, frameTime); ClientApi.INSTANCE.renderDeferredLods(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, frameTime);
} }
// render fade // render fade
+4 -3
View File
@@ -5,7 +5,7 @@ org.gradle.caching=true
# Mod Info # Mod Info
mod_name=DistantHorizons mod_name=DistantHorizons
mod_version=2.3.4-b mod_version=2.3.3-b-dev
api_version=4.0.0 api_version=4.0.0
maven_group=com.seibel.distanthorizons maven_group=com.seibel.distanthorizons
mod_readable_name=Distant Horizons mod_readable_name=Distant Horizons
@@ -18,7 +18,7 @@ mod_issues=https://gitlab.com/jeseibel/distant-horizons/-/issues
mod_discord=https://discord.gg/xAB8G4cENx mod_discord=https://discord.gg/xAB8G4cENx
# Global Plugin Versions # Global Plugin Versions
manifold_version=2025.1.20 manifold_version=2024.1.37
# 2023.1.17 can be used if there are mystery Java compiler issues # 2023.1.17 can be used if there are mystery Java compiler issues
nightconfig_version=3.6.6 nightconfig_version=3.6.6
lz4_version=1.8.0 lz4_version=1.8.0
@@ -48,10 +48,11 @@ infoBuildSource=User
# Internal Properties (These are set at runtime for Forgix to merge jar's) # Internal Properties (These are set at runtime for Forgix to merge jar's)
versionStr= versionStr=
mergeVersions=
# This defines what MC version Intellij will use for the preprocessor # This defines what MC version Intellij will use for the preprocessor
# and what version is used automatically by build and run commands # and what version is used automatically by build and run commands
mcVer=1.21.8 mcVer=1.21.5
# Defines the maximum amount of memory Minecraft is allowed when run in a development environment # Defines the maximum amount of memory Minecraft is allowed when run in a development environment
#minecraftMemoryJavaArg="-Xmx4G" #minecraftMemoryJavaArg="-Xmx4G"
@@ -78,6 +78,13 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class);
private static final Logger LOGGER = DhLoggerBuilder.getLogger(); private static final Logger LOGGER = DhLoggerBuilder.getLogger();
// private static SimpleChannel multiversePluginChannel;
// Not the cleanest way of passing this to the LOD renderer, but it'll have to do for now
public static Mat4f currentModelViewMatrix = new Mat4f();
public static Mat4f currentProjectionMatrix = new Mat4f();
@Override @Override
@@ -237,7 +244,16 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
// rendering // // rendering //
//===========// //===========//
#if MC_VER < MC_1_21_6 @SubscribeEvent
public void beforeLevelRenderEvent(RenderLevelStageEvent event)
{
if (event.getStage() == RenderLevelStageEvent.Stage.AFTER_SKY)
{
currentModelViewMatrix = McObjectConverter.Convert(event.getModelViewMatrix());
currentProjectionMatrix = McObjectConverter.Convert(event.getProjectionMatrix());
}
}
@SubscribeEvent @SubscribeEvent
public void afterLevelRenderEvent(RenderLevelStageEvent event) public void afterLevelRenderEvent(RenderLevelStageEvent event)
{ {
@@ -256,56 +272,6 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
} }
} }
} }
#else
@SubscribeEvent
public void afterLevelEntityRenderEvent(RenderLevelStageEvent.AfterEntities event)
{
ClientApi.INSTANCE.renderFade(
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime,
ClientLevelWrapper.getWrapper((ClientLevel)event.getLevel())
);
}
@SubscribeEvent
public void afterLevelTranslucentRenderEvent(RenderLevelStageEvent.AfterTranslucentBlocks event)
{
ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper((ClientLevel)event.getLevel()),
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime
);
}
@SubscribeEvent
public void afterLevelRenderEvent(RenderLevelStageEvent.AfterLevel event)
{
try
{
// should generally only need to be set once per game session
// allows DH to render directly to Optifine's level frame buffer,
// allowing better shader support
MinecraftRenderWrapper.INSTANCE.finalLevelFrameBufferId = GL32.glGetInteger(GL32.GL_FRAMEBUFFER_BINDING);
}
catch (Exception | Error e)
{
LOGGER.error("Unexpected error in afterLevelRenderEvent: "+e.getMessage(), e);
}
ClientApi.INSTANCE.renderFadeOpaque(
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime,
ClientLevelWrapper.getWrapper((ClientLevel)event.getLevel())
);
}
#endif
@@ -316,5 +282,4 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
private static LevelAccessor GetEventLevel(LevelEvent e) { return e.getLevel(); } private static LevelAccessor GetEventLevel(LevelEvent e) { return e.getLevel(); }
} }
@@ -23,6 +23,7 @@ import com.mojang.brigadier.CommandDispatcher;
import com.seibel.distanthorizons.common.AbstractModInitializer; import com.seibel.distanthorizons.common.AbstractModInitializer;
import com.seibel.distanthorizons.common.wrappers.gui.GetConfigScreen; import com.seibel.distanthorizons.common.wrappers.gui.GetConfigScreen;
import com.seibel.distanthorizons.core.api.internal.ClientApi; import com.seibel.distanthorizons.core.api.internal.ClientApi;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.api.internal.ServerApi; import com.seibel.distanthorizons.core.api.internal.ServerApi;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage; import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage;
@@ -50,13 +51,9 @@ import java.util.function.Consumer;
#if MC_VER < MC_1_20_6 #if MC_VER < MC_1_20_6
import net.neoforged.neoforge.client.ConfigScreenHandler; import net.neoforged.neoforge.client.ConfigScreenHandler;
#elif MC_VER < MC_1_21_8
import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
import org.jetbrains.annotations.NotNull;
#else #else
import net.neoforged.neoforge.client.gui.IConfigScreenFactory; import net.neoforged.neoforge.client.gui.IConfigScreenFactory;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import net.neoforged.neoforge.client.network.event.RegisterClientPayloadHandlersEvent;
#endif #endif
/** /**
@@ -75,11 +72,6 @@ public class NeoforgeMain extends AbstractModInitializer
{ {
this.onInitializeClient(); this.onInitializeClient();
eventBus.addListener(this::registerNetworkingClientServer); eventBus.addListener(this::registerNetworkingClientServer);
#if MC_VER < MC_1_21_8
#else
eventBus.addListener(this::registerClientPayloadEvent);
#endif
}); });
// handles dedicated servers // handles dedicated servers
@@ -107,12 +99,6 @@ public class NeoforgeMain extends AbstractModInitializer
public void registerNetworkingServer(RegisterPayloadHandlersEvent event) public void registerNetworkingServer(RegisterPayloadHandlersEvent event)
{ NeoforgePluginPacketSender.setPacketHandler(event, ServerApi.INSTANCE::pluginMessageReceived); } { NeoforgePluginPacketSender.setPacketHandler(event, ServerApi.INSTANCE::pluginMessageReceived); }
#if MC_VER < MC_1_21_8
#else
public void registerClientPayloadEvent(RegisterClientPayloadHandlersEvent event)
{ NeoforgePluginPacketSender.registerClientPacketHandler(event); }
#endif
@@ -155,9 +141,7 @@ public class NeoforgeMain extends AbstractModInitializer
@Override @Override
protected void subscribeClientStartedEvent(Runnable eventHandler) protected void subscribeClientStartedEvent(Runnable eventHandler)
{ {
// Just run the event handler, since there are no proper ClientLifecycleEvent for the client // FIXME What event is this?
// to signify readiness other than FmlClientSetupEvent
eventHandler.run();
} }
@Override @Override
@@ -14,19 +14,10 @@ import java.util.Optional;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
import java.util.function.Consumer; import java.util.function.Consumer;
#if MC_VER < MC_1_21_8
#else
import net.neoforged.neoforge.client.network.ClientPacketDistributor;
import net.neoforged.neoforge.client.network.event.RegisterClientPayloadHandlersEvent;
#endif
public class NeoforgePluginPacketSender extends AbstractPluginPacketSender public class NeoforgePluginPacketSender extends AbstractPluginPacketSender
{ {
private static BiConsumer<IServerPlayerWrapper, AbstractNetworkMessage> packetConsumer; private static BiConsumer<IServerPlayerWrapper, AbstractNetworkMessage> packetConsumer;
public static void setPacketHandler(RegisterPayloadHandlersEvent event, Consumer<AbstractNetworkMessage> consumer) public static void setPacketHandler(RegisterPayloadHandlersEvent event, Consumer<AbstractNetworkMessage> consumer)
{ setPacketHandler(event, (player, buffer) -> consumer.accept(buffer)); } { setPacketHandler(event, (player, buffer) -> consumer.accept(buffer)); }
public static void setPacketHandler(RegisterPayloadHandlersEvent event, BiConsumer<IServerPlayerWrapper, AbstractNetworkMessage> consumer) public static void setPacketHandler(RegisterPayloadHandlersEvent event, BiConsumer<IServerPlayerWrapper, AbstractNetworkMessage> consumer)
@@ -48,31 +39,9 @@ public class NeoforgePluginPacketSender extends AbstractPluginPacketSender
}); });
} }
#if MC_VER < MC_1_21_8
#else
public static void registerClientPacketHandler(RegisterClientPayloadHandlersEvent event)
{
// as of MC 1.21.7 Neo added a separate client network register
// https://github.com/neoforged/NeoForge/pull/2272
event.register(CommonPacketPayload.TYPE, (payload, context) ->
{
if (payload.message() != null)
{
packetConsumer.accept(null, payload.message());
}
});
}
#endif
@Override @Override
public void sendToServer(AbstractNetworkMessage message) public void sendToServer(AbstractNetworkMessage message)
{ { PacketDistributor.sendToServer(new CommonPacketPayload(message)); }
#if MC_VER < MC_1_21_8
PacketDistributor.sendToServer(new CommonPacketPayload(message));
#else
ClientPacketDistributor.sendToServer(new CommonPacketPayload(message));
#endif
}
@Override @Override
public void sendToClient(ServerPlayer serverPlayer, AbstractNetworkMessage message) public void sendToClient(ServerPlayer serverPlayer, AbstractNetworkMessage message)
@@ -22,87 +22,67 @@ package com.seibel.distanthorizons.neoforge.mixins.client;
import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector;
import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
import net.minecraft.client.Minecraft;
import org.spongepowered.asm.mixin.Mixin; 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.At;
import org.spongepowered.asm.mixin.injection.Inject;
import com.mojang.blaze3d.systems.RenderSystem;
import net.minecraft.client.Camera; import net.minecraft.client.Camera;
import net.minecraft.client.renderer.FogRenderer;
import net.minecraft.client.renderer.FogRenderer.FogMode;
import net.minecraft.world.effect.MobEffects; import net.minecraft.world.effect.MobEffects;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.LivingEntity;
#if MC_VER < MC_1_17_1 #if MC_VER < MC_1_17_1
import net.minecraft.world.level.material.FluidState; import net.minecraft.world.level.material.FluidState;
import net.minecraft.client.renderer.FogRenderer; org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import net.minecraft.client.renderer.FogRenderer.FogMode;
import com.mojang.blaze3d.systems.RenderSystem;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
#elif MC_VER < MC_1_21_3 #elif MC_VER < MC_1_21_3
import net.minecraft.world.level.material.FogType; import net.minecraft.world.level.material.FogType;
import net.minecraft.client.renderer.FogRenderer;
import net.minecraft.client.renderer.FogRenderer.FogMode;
import com.mojang.blaze3d.systems.RenderSystem;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
#elif MC_VER < MC_1_21_6
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.FogRenderer;
import net.minecraft.client.renderer.FogRenderer.FogMode;
import net.minecraft.client.renderer.FogParameters;
import org.joml.Vector4f;
import com.mojang.blaze3d.systems.RenderSystem;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
#else #else
import net.minecraft.client.renderer.FogParameters;
import net.minecraft.world.level.material.FogType; import net.minecraft.world.level.material.FogType;
import net.minecraft.client.renderer.fog.FogRenderer; import org.joml.Vector4f;
import net.minecraft.client.renderer.fog.FogData; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
#endif #endif
@Mixin(FogRenderer.class) @Mixin(FogRenderer.class)
public class MixinFogRenderer public class MixinFogRenderer
{ {
// Using this instead of Float.MAX_VALUE because Sodium don't like it. // 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; private static final float A_REALLY_REALLY_BIG_VALUE = 420694206942069.F;
@Unique
private static final float A_EVEN_LARGER_VALUE = 42069420694206942069.F; private static final float A_EVEN_LARGER_VALUE = 42069420694206942069.F;
#if MC_VER < MC_1_19_2 #if MC_VER == MC_1_17_1 || MC_VER == MC_1_18_2
@Inject(at = @At("RETURN"), method = "setupFog") @Inject(at = @At("RETURN"),
private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, CallbackInfo callback) method = "setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;FZF)V",
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 #elif MC_VER < MC_1_21_3
@Inject(at = @At("RETURN"), method = "setupFog") @Inject(at = @At("RETURN"),
private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, float g, CallbackInfo callback) method = "setupFog(Lnet/minecraft/client/Camera;Lnet/minecraft/client/renderer/FogRenderer$FogMode;FZF)V",
#elif MC_VER < MC_1_21_6 remap = true)
@Inject(at = @At("RETURN"), method = "setupFog", cancellable = true) private static void disableSetupFog(Camera camera, FogMode fogMode, float f, boolean bl, float partTick, CallbackInfo callback)
private static void disableSetupFog(Camera camera, FogMode fogMode, Vector4f vector4f, float f, boolean bl, float g, CallbackInfoReturnable<FogParameters> callback)
#else #else
@Unique @Inject(at = @At("RETURN"),
private static void unused() 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<FogParameters> callback)
#endif #endif
{ {
#if MC_VER < MC_1_21_6 boolean cameraNotInFluid = cameraNotInFluid(camera);
boolean cancelFog = cancelFog(camera, fogMode);
#elif MC_VER < MC_1_21_6
boolean cancelFog = cancelFog(camera);
#else
boolean cancelFog = cancelFog();
#endif
if (cancelFog) Entity entity = camera.getEntity();
boolean isSpecialFog = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS);
if (!isSpecialFog && cameraNotInFluid && fogMode == FogMode.FOG_TERRAIN
&& !SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class).isFogStateSpecial()
&& !Config.Client.Advanced.Graphics.Fog.enableVanillaFog.get())
{ {
#if MC_VER < MC_1_17_1 #if MC_VER < MC_1_17_1
RenderSystem.fogStart(A_REALLY_REALLY_BIG_VALUE); RenderSystem.fogStart(A_REALLY_REALLY_BIG_VALUE);
@@ -110,77 +90,12 @@ public class MixinFogRenderer
#elif MC_VER < MC_1_21_3 #elif MC_VER < MC_1_21_3
RenderSystem.setShaderFogStart(A_REALLY_REALLY_BIG_VALUE); RenderSystem.setShaderFogStart(A_REALLY_REALLY_BIG_VALUE);
RenderSystem.setShaderFogEnd(A_EVEN_LARGER_VALUE); RenderSystem.setShaderFogEnd(A_EVEN_LARGER_VALUE);
#elif MC_VER < MC_1_21_6
callback.setReturnValue(FogParameters.NO_FOG);
#else #else
callback.setReturnValue(FogParameters.NO_FOG);
#endif #endif
} }
} }
#if MC_VER < MC_1_21_6
#else
// In MC's FogRenderer they clamp the "renderDistanceEnd" fog field to the render distance,
// which prevents us from disabling the vanilla fog.
// This mixin fires after they set the "renderDistanceEnd" so we can change it.
@WrapOperation(
method = "setupFog",
at = @At(
value = "FIELD",
target = "Lnet/minecraft/client/renderer/fog/FogData;renderDistanceEnd:F",
opcode = org.objectweb.asm.Opcodes.PUTFIELD
)
)
private void onSetRenderDistanceEnd(FogData instance, float value, Operation<Void> original)
{
if (cancelFog())
{
instance.environmentalStart = A_REALLY_REALLY_BIG_VALUE;
instance.environmentalEnd = A_EVEN_LARGER_VALUE;
instance.renderDistanceStart = A_REALLY_REALLY_BIG_VALUE;
instance.renderDistanceEnd = A_EVEN_LARGER_VALUE;
}
// Always call the original with the modified or original value
original.call(instance, value);
}
#endif
@Unique
#if MC_VER < MC_1_21_6
private static boolean cancelFog(Camera camera, FogMode fogMode)
#else
private static boolean cancelFog()
#endif
{
#if MC_VER < MC_1_21_6
Entity entity = camera.getEntity();
#else
Camera camera = Minecraft.getInstance().gameRenderer.getMainCamera();
Entity entity = camera.getEntity();
#endif
boolean cameraNotInFluid = cameraNotInFluid(camera);
boolean isSpecialFog = (entity instanceof LivingEntity) && ((LivingEntity) entity).hasEffect(MobEffects.BLINDNESS);
boolean cancelFog = !isSpecialFog;
cancelFog = cancelFog && cameraNotInFluid;
#if MC_VER < MC_1_21_6
cancelFog = cancelFog && (fogMode == FogMode.FOG_TERRAIN);
#endif
cancelFog = cancelFog && !SingletonInjector.INSTANCE.get(IMinecraftRenderWrapper.class).isFogStateSpecial();
cancelFog = cancelFog && !Config.Client.Advanced.Graphics.Fog.enableVanillaFog.get();
return cancelFog;
}
@Unique
private static boolean cameraNotInFluid(Camera camera) private static boolean cameraNotInFluid(Camera camera)
{ {
#if MC_VER < MC_1_17_1 #if MC_VER < MC_1_17_1
@@ -195,5 +110,4 @@ public class MixinFogRenderer
} }
} }
@@ -19,53 +19,39 @@
package com.seibel.distanthorizons.neoforge.mixins.client; package com.seibel.distanthorizons.neoforge.mixins.client;
#if MC_VER < MC_1_21_6 import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack;
#if MC_VER < MC_1_19_4
import com.mojang.math.Matrix4f;
#else
import com.seibel.distanthorizons.core.util.math.Mat4f;
import com.seibel.distanthorizons.neoforge.NeoforgeClientProxy;
import net.minecraft.client.Camera;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GameRenderer;
import net.minecraft.client.renderer.LightTexture;
import org.joml.Matrix4f;
#endif
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.api.internal.ClientApi;
import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.LevelRenderer; import net.minecraft.client.renderer.LevelRenderer;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.neoforged.neoforge.client.event.RenderLevelStageEvent;
import org.joml.Matrix4f;
#else
import com.mojang.blaze3d.vertex.PoseStack;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.chunk.ChunkSectionsToRender;
import net.minecraft.client.Camera;
import net.minecraft.client.DeltaTracker;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.LevelRenderer;
import org.joml.Matrix4f;
import org.joml.Matrix4fc;
import org.joml.Vector4f;
import com.mojang.blaze3d.buffers.GpuBufferSlice;
import com.mojang.blaze3d.resource.GraphicsResourceAllocator;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
#endif
import org.apache.logging.log4j.Logger;
import com.seibel.distanthorizons.neoforge.NeoforgeClientProxy;
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.core.api.internal.ClientApi;
import com.seibel.distanthorizons.core.config.Config;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.util.math.Mat4f;
import com.seibel.distanthorizons.coreapi.ModInfo;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.Unique;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
#if MC_VER < MC_1_17_1
import org.lwjgl.opengl.GL15;
#endif
/** /**
* This class is used to mix in DH's rendering code * This class is used to mix in DH's rendering code
* before Minecraft starts rendering blocks. * before Minecraft starts rendering blocks.
@@ -84,66 +70,73 @@ public class MixinLevelRenderer
#endif #endif
private ClientLevel level; private ClientLevel level;
@Unique
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
#if MC_VER < MC_1_17_1
@Inject(at = @At("HEAD"),
#if MC_VER < MC_1_21_6 method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDD)V",
@Inject(at = @At("HEAD"), method = "renderSectionLayer", cancellable = true) cancellable = true)
private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f modelViewMatrix, Matrix4f projectionMatrix, CallbackInfo callback) private void renderChunkLayer(RenderType renderType, PoseStack matrixStackIn, double xIn, double yIn, double zIn, CallbackInfo callback)
#elif MC_VER < MC_1_19_4
@Inject(at = @At("HEAD"),
method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLcom/mojang/math/Matrix4f;)V",
cancellable = true)
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback)
#elif MC_VER < MC_1_20_2
@Inject(at = @At("HEAD"),
method = "renderChunkLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
cancellable = true)
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double cameraXBlockPos, double cameraYBlockPos, double cameraZBlockPos, Matrix4f projectionMatrix, CallbackInfo callback)
#elif MC_VER < MC_1_20_6
@Inject(at = @At("HEAD"),
method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;Lcom/mojang/blaze3d/vertex/PoseStack;DDDLorg/joml/Matrix4f;)V",
cancellable = true)
private void renderChunkLayer(RenderType renderType, PoseStack modelViewMatrixStack, double camX, double camY, double camZ, Matrix4f projectionMatrix, CallbackInfo callback)
#else #else
@Inject(at = @At("HEAD"), method = "renderLevel", cancellable = true) @Inject(at = @At("HEAD"),
private void onRenderLevel(GraphicsResourceAllocator resourceAllocator, DeltaTracker deltaTracker, boolean renderBlockOutline, Camera camera, Matrix4f positionMatrix, Matrix4f projectionMatrix, GpuBufferSlice gpuBufferSlice, Vector4f skyColor, boolean thinFog, CallbackInfo callback) method = "Lnet/minecraft/client/renderer/LevelRenderer;renderSectionLayer(Lnet/minecraft/client/renderer/RenderType;DDDLorg/joml/Matrix4f;Lorg/joml/Matrix4f;)V",
#endif cancellable = true)
private void renderChunkLayer(RenderType renderType, double x, double y, double z, Matrix4f projectionMatrix, Matrix4f frustumMatrix, CallbackInfo callback)
#endif
{ {
#if MC_VER < MC_1_21_6 #if MC_VER == MC_1_16_5
// MC combined the model view and projection matricies // get the matrices from the OpenGL fixed pipeline
ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrix); float[] mcProjMatrixRaw = new float[16];
ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); GL15.glGetFloatv(GL15.GL_PROJECTION_MATRIX, mcProjMatrixRaw);
Mat4f mcProjectionMatrix = new Mat4f(mcProjMatrixRaw);
mcProjectionMatrix.transpose();
Mat4f mcModelViewMatrix = McObjectConverter.Convert(matrixStackIn.last().pose());
#elif MC_VER <= MC_1_20_4
// get the matrices directly from MC
Mat4f mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrixStack.last().pose());
Mat4f mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix);
#else #else
ClientApi.RENDER_STATE.mcProjectionMatrix = McObjectConverter.Convert(projectionMatrix); // get the matrices from neoForge's render event.
// We can't call the renderer there because we don't have access to the level that's being rendered
Mat4f mcModelViewMatrix = NeoforgeClientProxy.currentModelViewMatrix;
Mat4f mcProjectionMatrix = NeoforgeClientProxy.currentProjectionMatrix;
#endif #endif
//LOGGER.info("\n\n" +
// "Level Mixin\n" +
// "Mc MVM: \n" + ClientApi.RENDER_STATE.mcModelViewMatrix.toString() + "\n" +
// "Mc Proj: \n" + ClientApi.RENDER_STATE.mcProjectionMatrix.toString()
//);
float frameTime;
#if MC_VER < MC_1_21_1 #if MC_VER < MC_1_21_1
ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().getFrameTime(); frameTime = Minecraft.getInstance().getFrameTime();
#elif MC_VER < MC_1_21_3 #elif MC_VER < MC_1_21_3
ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks(); frameTime = Minecraft.getInstance().getTimer().getRealtimeDeltaTicks();
#else #else
ClientApi.RENDER_STATE.frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks(); frameTime = Minecraft.getInstance().deltaTracker.getRealtimeDeltaTicks();
#endif #endif
#if MC_VER < MC_1_21_6
// only crash during development
if (ModInfo.IS_DEV_BUILD)
{
ClientApi.RENDER_STATE.canRenderOrThrow();
}
// render LODs // render LODs
if (renderType.equals(RenderType.solid())) if (renderType.equals(RenderType.solid()))
{ {
ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level), ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, frameTime);
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime);
} }
else if (renderType.equals(RenderType.translucent())) else if (renderType.equals(RenderType.translucent()))
{ {
ClientApi.INSTANCE.renderDeferredLodsForShaders(ClientLevelWrapper.getWrapper(this.level), ClientApi.INSTANCE.renderDeferredLods(ClientLevelWrapper.getWrapper(this.level), mcModelViewMatrix, mcProjectionMatrix, frameTime);
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime);
} }
// render fade // render fade
@@ -153,22 +146,21 @@ public class MixinLevelRenderer
if (renderType.equals(RenderType.cutout())) if (renderType.equals(RenderType.cutout()))
{ {
ClientApi.INSTANCE.renderFadeOpaque( ClientApi.INSTANCE.renderFadeOpaque(
ClientApi.RENDER_STATE.mcModelViewMatrix, mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix, mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime, frameTime,
ClientLevelWrapper.getWrapper(this.level) ClientLevelWrapper.getWrapper(this.level)
); );
} }
else if (renderType.equals(RenderType.tripwire())) else if (renderType.equals(RenderType.tripwire()))
{ {
ClientApi.INSTANCE.renderFade( ClientApi.INSTANCE.renderFade(
ClientApi.RENDER_STATE.mcModelViewMatrix, mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix, mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime, frameTime,
ClientLevelWrapper.getWrapper(this.level) ClientLevelWrapper.getWrapper(this.level)
); );
} }
#endif
if (Config.Client.Advanced.Debugging.lodOnlyMode.get()) if (Config.Client.Advanced.Debugging.lodOnlyMode.get())
{ {
@@ -177,30 +169,4 @@ public class MixinLevelRenderer
} }
#if MC_VER < MC_1_21_6
// formerly handled in renderChunkLayer()
#else
@Inject(at = @At("HEAD"), method = "prepareChunkRenders", cancellable = true)
private void renderChunkLayer(Matrix4fc modelViewMatrix, double d, double e, double f, CallbackInfoReturnable<ChunkSectionsToRender> callback)
{
ClientApi.RENDER_STATE.mcModelViewMatrix = McObjectConverter.Convert(modelViewMatrix);
// only crash during development
if (ModInfo.IS_DEV_BUILD)
{
ClientApi.RENDER_STATE.canRenderOrThrow();
}
ClientApi.INSTANCE.renderLods(ClientLevelWrapper.getWrapper(this.level),
ClientApi.RENDER_STATE.mcModelViewMatrix,
ClientApi.RENDER_STATE.mcProjectionMatrix,
ClientApi.RENDER_STATE.frameTime);
}
#endif
} }
@@ -1,46 +0,0 @@
package com.seibel.distanthorizons.neoforge.mixins.server;
#if MC_VER < MC_1_21_4
import net.minecraft.world.entity.Entity;
import org.spongepowered.asm.mixin.Mixin;
@Mixin(Entity.class)
public class MixinLevelTicks<T>
{
// dummy mixin to make the loader happy
}
#else
import com.seibel.distanthorizons.common.wrappers.DependencySetupDoneCheck;
import net.minecraft.world.ticks.LevelTicks;
import net.minecraft.world.ticks.ScheduledTick;
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(LevelTicks.class) // available in 1.18.2+, but only needed in 1.21.4+
public class MixinLevelTicks<T>
{
// TODO put in a common location
private static boolean isWorldGenThread()
{ return DependencySetupDoneCheck.isDone && DependencySetupDoneCheck.getIsCurrentThreadDistantGeneratorThread.get(); }
@Inject(method = "schedule", at = @At(value = "HEAD"), cancellable = true)
private void onChunkSave(ScheduledTick<T> tick, CallbackInfo ci)
{
// In MC 1.21.4 an error check was added to log attempting to schedule ticks for unloaded chunks
// this caused a lot of unnecessary errors when generating sand (FallingBlock.class).
if (isWorldGenThread())
{
ci.cancel();
}
}
}
#endif
@@ -8,8 +8,7 @@
"server.MixinServerPlayer", "server.MixinServerPlayer",
"server.MixinTFChunkGenerator", "server.MixinTFChunkGenerator",
"server.MixinTracingExecutor", "server.MixinTracingExecutor",
"server.MixinUtilBackgroundThread", "server.MixinUtilBackgroundThread"
"server.MixinLevelTicks"
], ],
"client": [ "client": [
"client.MixinClientPacketListener", "client.MixinClientPacketListener",
@@ -3,8 +3,6 @@ loaderVersion = "*" # // mandatory. Allow all forge versions as we are definding
license = "LGPL" license = "LGPL"
issueTrackerURL = "${issues}" issueTrackerURL = "${issues}"
# https://docs.neoforged.net/docs/gettingstarted/modfiles/#neoforgemodstoml
[[mods]] #//mandatory [[mods]] #//mandatory
modId = "distanthorizons" #//mandatory modId = "distanthorizons" #//mandatory
@@ -34,11 +32,4 @@ issueTrackerURL = "${issues}"
type = "required" type = "required"
versionRange = "${compatible_forgemc_versions}" # Where we set what version of mc it is avalible for versionRange = "${compatible_forgemc_versions}" # Where we set what version of mc it is avalible for
ordering = "NONE" ordering = "NONE"
side = "BOTH" side = "BOTH"
[[dependencies.distanthorizons]]
modId = "neoforge"
type = "required"
versionRange = "${neoforge_version_range}"
ordering = "NONE"
side = "BOTH"
+1 -1
View File
@@ -58,7 +58,7 @@ If you still need help with compiling, please read the Readme.md
/** Loads the VersionProperties fiel for the currently selected Minecraft version. */ /** Loads the VersionProperties field for the currently selected Minecraft version. */
def loadProperties() { def loadProperties() {
def defaultMcVersion = "1.20.1" // 1.20.1 is our current most stable version so we use that if no version was defined def defaultMcVersion = "1.20.1" // 1.20.1 is our current most stable version so we use that if no version was defined
-4
View File
@@ -24,7 +24,6 @@ fabric_api_version=0.42.0+1.16
immersive_portals_version= immersive_portals_version=
canvas_version= canvas_version=
# iris - needs 1.7.4+ to support the DH API
fabric_incompatibility_list={ "iris": "*" } fabric_incompatibility_list={ "iris": "*" }
fabric_recommend_list={} fabric_recommend_list={}
@@ -44,9 +43,6 @@ fabric_api_version=0.42.0+1.16
# Forge loader # Forge loader
forge_version=36.2.39 forge_version=36.2.39
# Neo not used but the variable still needs to be defined to make gradle happy
neoforge_version_range=[*,)
# Forge mod versions # Forge mod versions
starlight_version_forge= starlight_version_forge=
terraforged_version=4044290 terraforged_version=4044290
-4
View File
@@ -24,7 +24,6 @@ fabric_api_version=0.46.1+1.17
immersive_portals_version= immersive_portals_version=
canvas_version= canvas_version=
# iris - needs 1.7.4+ to support the DH API
fabric_incompatibility_list={ "iris": "*" } fabric_incompatibility_list={ "iris": "*" }
fabric_recommend_list={} fabric_recommend_list={}
@@ -43,9 +42,6 @@ fabric_api_version=0.46.1+1.17
# Forge loader # Forge loader
forge_version=37.1.1 forge_version=37.1.1
# Neo not used but the variable still needs to be defined to make gradle happy
neoforge_version_range=[*,)
# Forge mod versions # Forge mod versions
starlight_version_forge=3457784 starlight_version_forge=3457784
terraforged_version= terraforged_version=
-4
View File
@@ -25,7 +25,6 @@ fabric_api_version=0.76.0+1.18.2
immersive_portals_version=v1.4.11-1.18 immersive_portals_version=v1.4.11-1.18
canvas_version=mc118:1.0.2616 canvas_version=mc118:1.0.2616
# iris - needs 1.7.4+ to support the DH API
fabric_incompatibility_list={ "iris": "*" } fabric_incompatibility_list={ "iris": "*" }
fabric_recommend_list={} fabric_recommend_list={}
@@ -52,9 +51,6 @@ quilted_api_version=1.0.0-beta.28+0.67.0-1.18.2
# Forge loader # Forge loader
forge_version=40.2.10 forge_version=40.2.10
# Neo not used but the variable still needs to be defined to make gradle happy
neoforge_version_range=[*,)
# Forge mod versions # Forge mod versions
starlight_version_forge= starlight_version_forge=
terraforged_version= terraforged_version=
-4
View File
@@ -24,7 +24,6 @@ fabric_api_version=0.76.1+1.19.2
immersive_portals_version= immersive_portals_version=
canvas_version=mc119-1.0.2480 canvas_version=mc119-1.0.2480
# iris - needs 1.7.4+ to support the DH API
fabric_incompatibility_list={ "iris": "*" } fabric_incompatibility_list={ "iris": "*" }
fabric_recommend_list={} fabric_recommend_list={}
@@ -43,9 +42,6 @@ fabric_api_version=0.76.1+1.19.2
# Forge loader # Forge loader
forge_version=43.3.2 forge_version=43.3.2
# Neo not used but the variable still needs to be defined to make gradle happy
neoforge_version_range=[*,)
# Forge mod versions # Forge mod versions
starlight_version_forge= starlight_version_forge=
terraforged_version= terraforged_version=
+1 -5
View File
@@ -22,8 +22,7 @@ fabric_api_version=0.87.1+1.19.4
bclib_version=2.3.3 bclib_version=2.3.3
immersive_portals_version= immersive_portals_version=
canvas_version= canvas_version=
# iris - needs 1.7.4+ to support the DH API
fabric_incompatibility_list={ "iris": "*" } fabric_incompatibility_list={ "iris": "*" }
fabric_recommend_list={} fabric_recommend_list={}
@@ -42,9 +41,6 @@ fabric_api_version=0.87.1+1.19.4
# Forge loader # Forge loader
forge_version=45.2.4 forge_version=45.2.4
# Neo not used but the variable still needs to be defined to make gradle happy
neoforge_version_range=[*,)
# Forge mod versions # Forge mod versions
starlight_version_forge= starlight_version_forge=
terraforged_version= terraforged_version=
+1 -5
View File
@@ -22,8 +22,7 @@ fabric_api_version=0.90.4+1.20.1
bclib_version=3.0.13 bclib_version=3.0.13
immersive_portals_version= immersive_portals_version=
canvas_version= canvas_version=
# iris - needs 1.7.4+ to support the DH API
fabric_incompatibility_list={ "iris": "<=1.7.4" } fabric_incompatibility_list={ "iris": "<=1.7.4" }
fabric_recommend_list={} fabric_recommend_list={}
@@ -42,9 +41,6 @@ fabric_api_version=0.90.4+1.20.1
# Forge loader # Forge loader
forge_version=47.2.1 forge_version=47.2.1
# Neo not used but the variable still needs to be defined to make gradle happy
neoforge_version_range=[*,)
# Forge mod versions # Forge mod versions
starlight_version_forge= starlight_version_forge=
terraforged_version= terraforged_version=
+1 -5
View File
@@ -22,8 +22,7 @@ fabric_api_version=0.90.4+1.20.2
bclib_version=3.0.13 bclib_version=3.0.13
immersive_portals_version= immersive_portals_version=
canvas_version= canvas_version=
# iris - needs 1.7.4+ to support the DH API
fabric_incompatibility_list={ "iris": "<=1.7.4" } fabric_incompatibility_list={ "iris": "<=1.7.4" }
fabric_recommend_list={} fabric_recommend_list={}
@@ -42,9 +41,6 @@ fabric_api_version=0.90.4+1.20.2
# Forge loader # Forge loader
forge_version=48.0.13 forge_version=48.0.13
# Neo not used but the variable still needs to be defined to make gradle happy
neoforge_version_range=[*,)
# Forge mod versions # Forge mod versions
starlight_version_forge= starlight_version_forge=
terraforged_version= terraforged_version=
+2 -5
View File
@@ -23,8 +23,7 @@ fabric_api_version=0.91.2+1.20.4
bclib_version= bclib_version=
immersive_portals_version= immersive_portals_version=
canvas_version= canvas_version=
# iris - needs 1.7.4+ to support the DH API
fabric_incompatibility_list={ "iris": "<=1.7.4" } fabric_incompatibility_list={ "iris": "<=1.7.4" }
fabric_recommend_list={} fabric_recommend_list={}
@@ -43,9 +42,7 @@ fabric_api_version=0.91.2+1.20.4
# (Neo)Forge loader # (Neo)Forge loader
forge_version=49.1.13 forge_version=49.1.13
neoforge_version=20.4.246 neoforge_version=20.4.233
neoforge_version_range=[*,)
# (Neo)Forge mod versions # (Neo)Forge mod versions
starlight_version_forge= starlight_version_forge=
terraforged_version= terraforged_version=
+2 -5
View File
@@ -23,8 +23,7 @@ fabric_api_version=0.97.8+1.20.6
bclib_version= bclib_version=
immersive_portals_version= immersive_portals_version=
canvas_version= canvas_version=
# iris - needs 1.7.4+ to support the DH API
fabric_incompatibility_list={ "iris": "<=1.7.4" } fabric_incompatibility_list={ "iris": "<=1.7.4" }
fabric_recommend_list={} fabric_recommend_list={}
@@ -43,9 +42,7 @@ fabric_api_version=0.97.8+1.20.6
# (Neo)Forge loader # (Neo)Forge loader
forge_version=50.0.19 forge_version=50.0.19
neoforge_version=20.6.136 neoforge_version=20.6.70-beta
neoforge_version_range=[*,)
# (Neo)Forge mod versions # (Neo)Forge mod versions
starlight_version_forge= starlight_version_forge=
terraforged_version= terraforged_version=
+2 -5
View File
@@ -23,8 +23,7 @@ fabric_api_version=0.115.0+1.21.1
bclib_version= bclib_version=
immersive_portals_version= immersive_portals_version=
canvas_version= canvas_version=
# iris - needs 1.7.4+ to support the DH API
fabric_incompatibility_list={ "iris": "<=1.7.4" } fabric_incompatibility_list={ "iris": "<=1.7.4" }
fabric_recommend_list={} fabric_recommend_list={}
@@ -43,9 +42,7 @@ fabric_api_version=0.115.0+1.21.1
# (Neo)Forge loader # (Neo)Forge loader
forge_version= forge_version=
neoforge_version=21.1.192 neoforge_version=21.1.92
neoforge_version_range=[*,)
# (Neo)Forge mod versions # (Neo)Forge mod versions
starlight_version_forge= starlight_version_forge=
terraforged_version= terraforged_version=
+1 -3
View File
@@ -43,9 +43,7 @@ fabric_api_version=0.110.0+1.21.3
# (Neo)Forge loader # (Neo)Forge loader
forge_version= forge_version=
neoforge_version=21.3.86 neoforge_version=21.3.11-beta
neoforge_version_range=[*,)
# (Neo)Forge mod versions # (Neo)Forge mod versions
starlight_version_forge= starlight_version_forge=
terraforged_version= terraforged_version=
+2 -5
View File
@@ -23,7 +23,7 @@ fabric_api_version=0.110.5+1.21.4
bclib_version= bclib_version=
immersive_portals_version= immersive_portals_version=
canvas_version= canvas_version=
fabric_incompatibility_list={ } fabric_incompatibility_list={ }
fabric_recommend_list={} fabric_recommend_list={}
@@ -42,10 +42,7 @@ fabric_api_version=0.110.5+1.21.4
# (Neo)Forge loader # (Neo)Forge loader
forge_version= forge_version=
neoforge_version=21.4.147 neoforge_version=21.4.3-beta
# version range may not be necessary, but having compiled DH for an older version caused issues with shaders
neoforge_version_range=[21.4.147,)
# (Neo)Forge mod versions # (Neo)Forge mod versions
starlight_version_forge= starlight_version_forge=
terraforged_version= terraforged_version=
+3 -5
View File
@@ -1,4 +1,4 @@
# 1.21.5 version # 1.21.4 version
java_version=21 java_version=21
minecraft_version=1.21.5 minecraft_version=1.21.5
parchment_version=1.21:2024.07.28 parchment_version=1.21:2024.07.28
@@ -23,7 +23,7 @@ fabric_api_version=0.119.5+1.21.5
immersive_portals_version= immersive_portals_version=
canvas_version= canvas_version=
# Iris - some versions of 1.8.11 nightly builds may not work, but the ones after 2025-03-30 should # some versions of 1.8.11 nightly builds may not work, but the ones after 2025-03-30 should
fabric_incompatibility_list={ "iris": "<=1.8.10" } fabric_incompatibility_list={ "iris": "<=1.8.10" }
fabric_recommend_list={} fabric_recommend_list={}
@@ -42,9 +42,7 @@ fabric_api_version=0.119.5+1.21.5
# (Neo)Forge loader # (Neo)Forge loader
forge_version= forge_version=
neoforge_version=21.5.87 neoforge_version=21.5.0-beta
neoforge_version_range=[*,)
# (Neo)Forge mod versions # (Neo)Forge mod versions
starlight_version_forge= starlight_version_forge=
terraforged_version= terraforged_version=
-58
View File
@@ -1,58 +0,0 @@
# 1.21.6 version
java_version=21
minecraft_version=1.21.6
parchment_version=1.21:2024.07.28
compatible_minecraft_versions=["1.21.6"]
accessWidenerVersion=1_21_4
builds_for=fabric,neoforge
# forge is broken due to gradle/build script issues
# Netty
netty_version=4.1.97.Final
# Fabric loader
fabric_loader_version=0.16.13
fabric_api_version=0.127.0+1.21.6
modmenu_version=15.0.0-beta.2
starlight_version_fabric=
phosphor_version_fabric=
lithium_version=
sodium_version=mc1.21.6-0.6.13-fabric
iris_version=1.9.0+1.21.6-fabric
bclib_version=
immersive_portals_version=
canvas_version=
fabric_incompatibility_list={ }
fabric_recommend_list={}
# Fabric mod run
# 0 = Don't enable and don't run
# 1 = Can be referenced in code but doesn't run
# 2 = Can be referenced in code and runs in client
enable_starlight=0
enable_phosphor=0
enable_sodium=1
enable_lithium=0
enable_iris=1
enable_bclib=0
enable_immersive_portals=0
enable_canvas=0
# (Neo)Forge loader
forge_version=
neoforge_version=21.6.20-beta
# around 6.19 neo changed how their render API works, failing to meet this causes the game to crash
neoforge_version_range=[21.6.19-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
-58
View File
@@ -1,58 +0,0 @@
# 1.21.7 version
java_version=21
minecraft_version=1.21.8
parchment_version=1.21:2024.07.28
compatible_minecraft_versions=["1.21.8"]
accessWidenerVersion=1_21_4
builds_for=fabric,neoforge
# forge is broken due to gradle/build script issues
# Netty
netty_version=4.1.97.Final
# Fabric loader
fabric_loader_version=0.16.13
fabric_api_version=0.129.0+1.21.8
modmenu_version=15.0.0-beta.3
starlight_version_fabric=
phosphor_version_fabric=
lithium_version=
sodium_version=mc1.21.6-0.6.13-fabric
iris_version=1.9.1+1.21.7-fabric
bclib_version=
immersive_portals_version=
canvas_version=
fabric_incompatibility_list={ }
fabric_recommend_list={}
# Fabric mod run
# 0 = Don't enable and don't run
# 1 = Can be referenced in code but doesn't run
# 2 = Can be referenced in code and runs in client
enable_starlight=0
enable_phosphor=0
enable_sodium=1
enable_lithium=0
enable_iris=1
enable_bclib=0
enable_immersive_portals=0
enable_canvas=0
# (Neo)Forge loader
forge_version=
neoforge_version=21.8.2-beta
# around 6.19 neo changed how their render API works, failing to meet this causes the game to crash
neoforge_version_range=[*,)
# (Neo)Forge mod versions
starlight_version_forge=
terraforged_version=
# (Neo)Forge mod run
# 0 = Don't enable and don't run
# 1 = Can be referenced in code but doesn't run
# 2 = Can be referenced in code and runs in client
enable_starlight_forge=0
enable_terraforged=0
enable_terrafirmacraft=0