diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index a06de1a..b8f9f0f 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -8,10 +8,10 @@ jobs: steps: - uses: actions/checkout@v2 - - name: Set up JDK 16 + - name: Set up JDK 17 uses: actions/setup-java@v1 with: - java-version: 16 + java-version: 17 - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle diff --git a/build.gradle b/build.gradle index 9d42f0f..4097ffc 100644 --- a/build.gradle +++ b/build.gradle @@ -1,5 +1,5 @@ plugins { - id 'fabric-loom' version '0.8-SNAPSHOT' + id 'fabric-loom' version '0.10-SNAPSHOT' } archivesBaseName = "${project.archives_base_name}-mc${project.minecraft_version}" @@ -17,8 +17,8 @@ if (build_id != null) { version += "+build.${build_id}" } -minecraft { - refmapName = "mixins.hydrogen.refmap.json" +loom { + mixin.defaultRefmapName = "mixins.hydrogen.refmap.json" } dependencies { @@ -42,7 +42,7 @@ if (project.use_third_party_mods) { dependencies { // DataBreaker applies a number of patches to eliminate the loading of data fixers // This greatly reduces the amount of time needed to start the game, but is generally unsafe in production - modRuntime ("supercoder79:databreaker:${project.databreaker_version}") { + modRuntimeOnly ("supercoder79:databreaker:${project.databreaker_version}") { transitive = false } } diff --git a/gradle.properties b/gradle.properties index d81c540..950358d 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,10 +3,10 @@ org.gradle.jvmargs=-Xmx1G # Fabric Properties # check these on https://modmuss50.me/fabric.html -minecraft_version=1.17.1 -yarn_mappings=1.17.1+build.1 -loader_version=0.11.6 -fabric_api_version=0.36.1+1.17 +minecraft_version=1.18.1 +yarn_mappings=1.18.1+build.1 +loader_version=0.12.9 +fabric_api_version=0.44.0+1.18 # Mod Properties mod_version=0.3 @@ -15,4 +15,4 @@ archives_base_name=hydrogen-fabric # If true, third-party mods will be loaded during runtime in the developer run configurations use_third_party_mods = true -databreaker_version = 0.2.7 \ No newline at end of file +databreaker_version = 0.2.8 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index cc4fdc2..7454180 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 69a9715..e750102 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index 2fe81a7..744e882 100755 --- a/gradlew +++ b/gradlew @@ -72,7 +72,7 @@ case "`uname`" in Darwin* ) darwin=true ;; - MINGW* ) + MSYS* | MINGW* ) msys=true ;; NONSTOP* ) @@ -82,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -129,6 +130,7 @@ fi if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath diff --git a/gradlew.bat b/gradlew.bat index 9618d8d..107acd3 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @@ -37,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -51,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -61,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/main/java/com/google/common/collect/HydrogenImmutableReferenceHashMap.java b/src/main/java/com/google/common/collect/HydrogenImmutableReferenceHashMap.java index a5b7eb0..7772a42 100644 --- a/src/main/java/com/google/common/collect/HydrogenImmutableReferenceHashMap.java +++ b/src/main/java/com/google/common/collect/HydrogenImmutableReferenceHashMap.java @@ -116,6 +116,16 @@ ImmutableSet> createEntrySet() { return new HydrogenEntrySet<>(this.key, this.value, this.size); } + @Override + ImmutableSet createKeySet() { + return new ImmutableMapKeySet<>(this); + } + + @Override + ImmutableCollection createValues() { + return new ImmutableMapValues<>(this); + } + @Override boolean isPartialView() { return false; diff --git a/src/main/java/me/jellysquid/mods/hydrogen/mixin/chunk/MixinChunkSerializer.java b/src/main/java/me/jellysquid/mods/hydrogen/mixin/chunk/MixinChunkSerializer.java deleted file mode 100644 index f1f4004..0000000 --- a/src/main/java/me/jellysquid/mods/hydrogen/mixin/chunk/MixinChunkSerializer.java +++ /dev/null @@ -1,74 +0,0 @@ -package me.jellysquid.mods.hydrogen.mixin.chunk; - -import net.minecraft.block.Block; -import net.minecraft.fluid.Fluid; -import net.minecraft.nbt.NbtCompound; -import net.minecraft.server.world.ServerWorld; -import net.minecraft.structure.StructureManager; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.ChunkSerializer; -import net.minecraft.world.TickScheduler; -import net.minecraft.world.World; -import net.minecraft.world.biome.source.BiomeArray; -import net.minecraft.world.chunk.ChunkSection; -import net.minecraft.world.chunk.ProtoChunk; -import net.minecraft.world.chunk.UpgradeData; -import net.minecraft.world.chunk.WorldChunk; -import net.minecraft.world.poi.PointOfInterestStorage; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; - -import java.util.function.Consumer; - -@Mixin(ChunkSerializer.class) -public abstract class MixinChunkSerializer { - private static final ThreadLocal CAPTURED_TAGS = new ThreadLocal<>(); - - @Shadow - private static void loadEntities(ServerWorld world, NbtCompound nbt, WorldChunk chunk) { - throw new UnsupportedOperationException(); - } - - @Inject(method = "deserialize", at = @At("HEAD")) - private static void captureTag(ServerWorld world, StructureManager structureManager, PointOfInterestStorage poiStorage, ChunkPos pos, NbtCompound tag, CallbackInfoReturnable cir) { - // We can't access the method parameters in the later redirect, so capture them for this thread - CAPTURED_TAGS.set(tag); - } - - @Redirect(method = "deserialize", at = @At(value = "NEW", target = "net/minecraft/world/chunk/WorldChunk")) - private static WorldChunk create(World world, ChunkPos pos, BiomeArray biomes, UpgradeData upgradeData, - TickScheduler blockTickScheduler, TickScheduler fluidTickScheduler, - long inhabitedTime, @Nullable ChunkSection[] sections, - @Nullable Consumer loadToWorldConsumer) { - NbtCompound rootTag = CAPTURED_TAGS.get(); - - if (rootTag == null) { - throw new IllegalStateException("No captured tag was found"); - } - - NbtCompound level = rootTag.getCompound("Level"); - - // The (misleadingly named) writeEntities function below only cares about these two tags - // However, the lambda can end up staying loaded with the chunk if it isn't within ticking radius of a player yet - // In order to prevent huge NBT blobs from remaining loaded in memory all the time, we can strip all the other - // data to save a fair bit of memory. - NbtCompound strippedTag = new NbtCompound(); - strippedTag.put("Entities", level.getList("Entities", 10)); - strippedTag.put("TileEntities", level.getList("TileEntities", 10)); - - return new WorldChunk(world, pos, biomes, upgradeData, blockTickScheduler, fluidTickScheduler, inhabitedTime, sections, (chunk) -> { - loadEntities((ServerWorld) world, strippedTag, chunk); - }); - } - - @Inject(method = "deserialize", at = @At("RETURN")) - private static void releaseTag(ServerWorld world, StructureManager structureManager, PointOfInterestStorage poiStorage, ChunkPos pos, NbtCompound tag, CallbackInfoReturnable cir) { - // Avoid leaking tags in memory - CAPTURED_TAGS.remove(); - } -} diff --git a/src/main/java/me/jellysquid/mods/hydrogen/mixin/chunk/MixinWorldChunk.java b/src/main/java/me/jellysquid/mods/hydrogen/mixin/chunk/MixinWorldChunk.java deleted file mode 100644 index 95e4766..0000000 --- a/src/main/java/me/jellysquid/mods/hydrogen/mixin/chunk/MixinWorldChunk.java +++ /dev/null @@ -1,43 +0,0 @@ -package me.jellysquid.mods.hydrogen.mixin.chunk; - -import net.minecraft.block.Block; -import net.minecraft.fluid.Fluid; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.TickScheduler; -import net.minecraft.world.World; -import net.minecraft.world.biome.source.BiomeArray; -import net.minecraft.world.chunk.ChunkSection; -import net.minecraft.world.chunk.UpgradeData; -import net.minecraft.world.chunk.WorldChunk; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -import java.util.function.Consumer; - -@Mixin(WorldChunk.class) -public class MixinWorldChunk { - @Shadow - @Final - private ChunkSection[] sections; - - @Inject(method = "(Lnet/minecraft/world/World;Lnet/minecraft/util/math/ChunkPos;" + - "Lnet/minecraft/world/biome/source/BiomeArray;Lnet/minecraft/world/chunk/UpgradeData;" + - "Lnet/minecraft/world/TickScheduler;Lnet/minecraft/world/TickScheduler;J[" + - "Lnet/minecraft/world/chunk/ChunkSection;Ljava/util/function/Consumer;)V",at = @At("RETURN")) - private void reinit(World world, ChunkPos pos, BiomeArray biomes, UpgradeData upgradeData, - TickScheduler blockTickScheduler, TickScheduler fluidTickScheduler, - long inhabitedTime, ChunkSection[] sections, Consumer loadToWorldConsumer, - CallbackInfo ci) { - // Upgrading a ProtoChunk to a WorldChunk might result in empty sections being copied over - // These simply waste memory, and the WorldChunk will return air blocks for any absent section without issue. - for (int i = 0; i < this.sections.length; i++) { - if (ChunkSection.isEmpty(this.sections[i])) { - this.sections[i] = null; - } - } - } -} diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 11fd947..6a77b9f 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -26,9 +26,9 @@ ] }, "depends": { - "fabricloader": ">=0.11.0", + "fabricloader": ">=0.12.5", "fabric-resource-loader-v0": ">=0.4", - "minecraft": ["1.17", "1.17.1"] + "minecraft": [">=1.18-beta.4 <=1.18", ">=1.18.1-beta.1 <=1.18.1" ] }, "breaks": { "optifabric": "*" diff --git a/src/main/resources/hydrogen.mixins.json b/src/main/resources/hydrogen.mixins.json index 07598f9..e63e9c4 100644 --- a/src/main/resources/hydrogen.mixins.json +++ b/src/main/resources/hydrogen.mixins.json @@ -1,7 +1,7 @@ { "package": "me.jellysquid.mods.hydrogen.mixin", "required": true, - "compatibilityLevel": "JAVA_16", + "compatibilityLevel": "JAVA_17", "injectors": { "defaultRequire": 1 }, @@ -17,8 +17,6 @@ "client.model.MixinModelIdentifier" ], "mixins": [ - "chunk.MixinChunkSerializer", - "chunk.MixinWorldChunk", "nbt.MixinNbtCompound", "state.MixinState", "util.MixinIdentifier"