diff --git a/.gitignore b/.gitignore index cc1a2f9aa71..21f396da38c 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,7 @@ changelog.txt loader-neoforge/.cache loader-neoforge/config + +# ClientDevBridge session state (golden images are intentionally kept) +.clientdevbridge/* +!.clientdevbridge/golden/ diff --git a/build.gradle b/build.gradle index ea8e63c9b5a..105d8845a17 100644 --- a/build.gradle +++ b/build.gradle @@ -11,8 +11,8 @@ plugins { id 'com.diffplug.spotless' version '7.2.1' apply false id 'com.modrinth.minotaur' version '2.+' apply false - id 'net.fabricmc.fabric-loom' version '1.17-SNAPSHOT' apply false - id 'net.neoforged.moddev' version '2.0.141' apply false + id 'net.fabricmc.fabric-loom' version '1.18.2' apply false + id 'net.neoforged.moddev' version '2.0.147' apply false id 'net.minecraftforge.accesstransformers' version '5.0.3' apply false id 'net.minecraftforge.gradle' version '[7.0.21,8.0)' apply false } diff --git a/gradle.properties b/gradle.properties index 258aedfef67..59a0f2bb1e9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,7 @@ group=org.cyclops.cyclopscore java_version=25 # Common -minecraft_version=26.2 +minecraft_version=26.3 mod_name=Cyclops Core mod_author=rubensworks (aka kroeser) mod_id=cyclopscore @@ -14,25 +14,25 @@ issue_tracker_url=https://github.com/CyclopsMC/CyclopsCore/issues display_url=https://www.curseforge.com/minecraft/mc-mods/cyclops-core description=Coremod for Integrated Dynamics, EvilCraft and others. fingerprint=bd0353b3e8a2810d60dd584e256e364bc3bedd44 -neo_form_version=26.2-1 +neo_form_version=26.3-1 curseforge_project_id=232758 modrinth_project_id=Z9DM0LJ4 # Fabric -fabric_version=0.152.2+26.2 -fabric_loader_version=0.19.3 +fabric_version=0.161.0+26.3 +fabric_loader_version=0.19.5 # Dependencies -fabric_forgeconfigapiport_version=26.2.0 +fabric_forgeconfigapiport_version=26.3.0 # NeoForge -neoforge_version=26.2.0.6-beta +neoforge_version=26.3.0.7-beta neoforge_loader_version_range=[4,) neoforge_update_json_url=https://raw.githubusercontent.com/CyclopsMC/Versions/master/neoforge_update/cyclops-core.json # Dependencies -neoforge_curios_version=15.0.0-beta.1+26.1 +neoforge_curios_version=16.0.0+26.2 # Forge -forge_version=65.0.0 +forge_version=66.0.2 forge_loader_version_range=[2,) forge_update_json_url=https://raw.githubusercontent.com/CyclopsMC/Versions/master/forge_update/cyclops-core.json diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 7454180f2ae..eddabd2eef8 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 f0d24e584e2..ad7845be306 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,9 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zip networkTimeout=10000 +retries=0 +retryBackOffMs=500 +validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew index c53aefaa5fc..249efbb032c 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -15,10 +15,12 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # -# Gradle start up script for POSIX generated by Gradle. +# gradlew start up script for POSIX generated by Gradle. # # Important for running: # @@ -27,15 +29,15 @@ # bash, then to run this script, type that shell name before the whole # command line, like: # -# ksh Gradle +# ksh gradlew # # Busybox and similar reduced shells will NOT work, because this script # requires all of these POSIX shell features: # * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». # # Important for patching: # @@ -55,7 +57,7 @@ # Darwin, MinGW, and NonStop. # # (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt +# https://github.com/gradle/gradle/blob/3d91ce3b8caaf77ad09f381f43615b715b53f72c/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # within the Gradle project. # # You can find Gradle at https://github.com/gradle/gradle/. @@ -80,13 +82,11 @@ do esac done -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -APP_NAME="Gradle" +# This is normally unused +# shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' +# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -133,22 +132,29 @@ location of your Java installation." fi else JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + if ! command -v java >/dev/null 2>&1 + then + die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. Please set the JAVA_HOME variable in your environment to match the location of your Java installation." + fi fi # Increase the maximum file descriptors if we can. if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then case $MAX_FD in #( max*) + # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 MAX_FD=$( ulimit -H -n ) || warn "Could not query maximum file descriptor limit" esac case $MAX_FD in #( '' | soft) :;; #( *) + # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. + # shellcheck disable=SC2039,SC3045 ulimit -n "$MAX_FD" || warn "Could not set maximum file descriptor limit to $MAX_FD" esac @@ -165,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -193,18 +198,27 @@ if "$cygwin" || "$msys" ; then done fi -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Collect all arguments for the java command: +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# and any embedded shellness will be escaped. +# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be +# treated as '${Hostname}' itself on the command line. set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" +# Stop when "xargs" is not available. +if ! command -v xargs >/dev/null 2>&1 +then + die "xargs is not available" +fi + # Use "xargs" to parse quoted args. # # With -n1 it outputs one arg per line, with the quotes and backslashes removed. diff --git a/gradlew.bat b/gradlew.bat index ac1b06f9382..8508ef684d4 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,19 +13,22 @@ @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem +@rem SPDX-License-Identifier: Apache-2.0 +@rem -@if "%DEBUG%" == "" @echo off +@if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem -@rem Gradle startup script for Windows +@rem gradlew startup script for Windows @rem @rem ########################################################################## -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal +@rem Set local scope for the variables, and ensure extensions are enabled +setlocal EnableExtensions set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @@ -40,15 +43,15 @@ if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute +if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% @@ -56,34 +59,24 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 -goto fail +"%COMSPEC%" /c exit 1 :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 %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 -:mainEnd -if "%OS%"=="Windows_NT" endlocal +@rem Execute gradlew +@rem endlocal doesn't take effect until after the line is parsed and variables are expanded +@rem which allows us to clear the local environment before executing the java command +endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel -:omega +:exitWithErrorLevel +@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts +"%COMSPEC%" /c exit %ERRORLEVEL% diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/advancement/criterion/GuiContainerOpenTrigger.java b/loader-common/src/main/java/org/cyclops/cyclopscore/advancement/criterion/GuiContainerOpenTrigger.java index d7bc2f57d65..7b87b5ad9c2 100644 --- a/loader-common/src/main/java/org/cyclops/cyclopscore/advancement/criterion/GuiContainerOpenTrigger.java +++ b/loader-common/src/main/java/org/cyclops/cyclopscore/advancement/criterion/GuiContainerOpenTrigger.java @@ -2,11 +2,11 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.advancements.predicates.ContextAwarePredicate; -import net.minecraft.advancements.predicates.entity.EntityPredicate; import net.minecraft.advancements.triggers.SimpleCriterionTrigger; +import net.minecraft.core.Holder; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AbstractContainerMenu; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import java.util.Optional; import java.util.function.Predicate; @@ -19,7 +19,7 @@ public class GuiContainerOpenTrigger extends SimpleCriterionTrigger CODEC = RecordCodecBuilder.create( p_311401_ -> p_311401_.group( - EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(Instance::player), + LootItemCondition.CODEC.optionalFieldOf("player").forGetter(Instance::player), Codec.STRING.optionalFieldOf("container_class").forGetter(Instance::containerClass) ) .apply(p_311401_, Instance::new) @@ -35,7 +35,7 @@ public void trigger(ServerPlayer pPlayer, Predicate player, + Optional> player, Optional containerClass ) implements SimpleInstance, ICriterionInstanceTestable { @Override diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/advancement/criterion/ItemCraftedTrigger.java b/loader-common/src/main/java/org/cyclops/cyclopscore/advancement/criterion/ItemCraftedTrigger.java index 0b634ff329d..baffdd1224e 100644 --- a/loader-common/src/main/java/org/cyclops/cyclopscore/advancement/criterion/ItemCraftedTrigger.java +++ b/loader-common/src/main/java/org/cyclops/cyclopscore/advancement/criterion/ItemCraftedTrigger.java @@ -2,12 +2,12 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.advancements.predicates.ContextAwarePredicate; import net.minecraft.advancements.predicates.ItemPredicate; -import net.minecraft.advancements.predicates.entity.EntityPredicate; import net.minecraft.advancements.triggers.SimpleCriterionTrigger; +import net.minecraft.core.Holder; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import java.util.Optional; import java.util.function.Predicate; @@ -20,7 +20,7 @@ public class ItemCraftedTrigger extends SimpleCriterionTrigger CODEC = RecordCodecBuilder.create( p_311401_ -> p_311401_.group( - EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(Instance::player), + LootItemCondition.CODEC.optionalFieldOf("player").forGetter(Instance::player), ItemPredicate.CODEC.fieldOf("item").forGetter(Instance::itemPredicate) ) .apply(p_311401_, Instance::new) @@ -36,7 +36,7 @@ public void trigger(ServerPlayer pPlayer, Predicate } public static record Instance( - Optional player, + Optional> player, ItemPredicate itemPredicate ) implements SimpleInstance, ICriterionInstanceTestable { @@ -46,7 +46,7 @@ public boolean test(ServerPlayer player, ItemStack craftingStack) { } @Override - public Optional player() { + public Optional> player() { return player; } } diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/advancement/criterion/ModItemObtainedTrigger.java b/loader-common/src/main/java/org/cyclops/cyclopscore/advancement/criterion/ModItemObtainedTrigger.java index 148c6810abf..1397476b902 100644 --- a/loader-common/src/main/java/org/cyclops/cyclopscore/advancement/criterion/ModItemObtainedTrigger.java +++ b/loader-common/src/main/java/org/cyclops/cyclopscore/advancement/criterion/ModItemObtainedTrigger.java @@ -2,12 +2,12 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.advancements.predicates.ContextAwarePredicate; -import net.minecraft.advancements.predicates.entity.EntityPredicate; import net.minecraft.advancements.triggers.SimpleCriterionTrigger; +import net.minecraft.core.Holder; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.storage.loot.predicates.LootItemCondition; import java.util.Optional; import java.util.function.Predicate; @@ -20,7 +20,7 @@ public class ModItemObtainedTrigger extends SimpleCriterionTrigger CODEC = RecordCodecBuilder.create( p_311401_ -> p_311401_.group( - EntityPredicate.ADVANCEMENT_CODEC.optionalFieldOf("player").forGetter(Instance::player), + LootItemCondition.CODEC.optionalFieldOf("player").forGetter(Instance::player), Codec.STRING.fieldOf("mod_id").forGetter(Instance::modId) ) .apply(p_311401_, Instance::new) @@ -36,7 +36,7 @@ public void trigger(ServerPlayer pPlayer, Predicate player, + Optional> player, String modId ) implements SimpleInstance, ICriterionInstanceTestable { diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/client/gui/GuiMainMenuExtensionDevWorld.java b/loader-common/src/main/java/org/cyclops/cyclopscore/client/gui/GuiMainMenuExtensionDevWorld.java index 419d869d811..6673e405f01 100644 --- a/loader-common/src/main/java/org/cyclops/cyclopscore/client/gui/GuiMainMenuExtensionDevWorld.java +++ b/loader-common/src/main/java/org/cyclops/cyclopscore/client/gui/GuiMainMenuExtensionDevWorld.java @@ -132,7 +132,7 @@ public static void onMainMenuInit(Minecraft minecraft, Screen screen) { WorldOptions worldOptionsFinal = worldOptions; Function generatorSettingsFinal = generatorSettings; CompletableFuture resourceLoad = WorldLoader.load(initConfig, context -> { - WorldDimensions dimensions = generatorSettingsFinal.apply(context.datapackWorldgen()); + WorldDimensions dimensions = generatorSettingsFinal.apply(context.datapackWorldRegistries()); WorldDimensions.Complete completeDimensions = dimensions.bake(context.datapackDimensions().lookupOrThrow(Registries.LEVEL_STEM)); return new WorldLoader.DataLoadOutput<>( new LevelDataAndDimensions.WorldDataAndGenSettings( diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/client/particle/ParticleBlur.java b/loader-common/src/main/java/org/cyclops/cyclopscore/client/particle/ParticleBlur.java index 478de4837f1..16333c0c070 100644 --- a/loader-common/src/main/java/org/cyclops/cyclopscore/client/particle/ParticleBlur.java +++ b/loader-common/src/main/java/org/cyclops/cyclopscore/client/particle/ParticleBlur.java @@ -1,12 +1,12 @@ package org.cyclops.cyclopscore.client.particle; -import com.mojang.blaze3d.PrimitiveTopology; -import com.mojang.blaze3d.pipeline.BlendFunction; -import com.mojang.blaze3d.pipeline.ColorTargetState; -import com.mojang.blaze3d.pipeline.DepthStencilState; -import com.mojang.blaze3d.pipeline.RenderPipeline; -import com.mojang.blaze3d.platform.BlendFactor; import com.mojang.blaze3d.vertex.DefaultVertexFormat; +import com.mojang.renderpearl.api.pipeline.BlendFactor; +import com.mojang.renderpearl.api.pipeline.BlendFunction; +import com.mojang.renderpearl.api.pipeline.ColorTargetState; +import com.mojang.renderpearl.api.pipeline.DepthStencilState; +import com.mojang.renderpearl.api.pipeline.PrimitiveTopology; +import com.mojang.renderpearl.api.pipeline.RenderPipeline; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.particle.SingleQuadParticle; diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/config/ConfigurableTypeCommon.java b/loader-common/src/main/java/org/cyclops/cyclopscore/config/ConfigurableTypeCommon.java index b7c1bc37f18..f59f7eadd8d 100644 --- a/loader-common/src/main/java/org/cyclops/cyclopscore/config/ConfigurableTypeCommon.java +++ b/loader-common/src/main/java/org/cyclops/cyclopscore/config/ConfigurableTypeCommon.java @@ -30,7 +30,8 @@ public class ConfigurableTypeCommon { public static final ConfigurableTypeCommon CRITERION_TRIGGER = new ConfigurableTypeCommon(true, CriterionTriggerConfigCommon.class, new ConfigurableTypeActionRegistry<>(), "criterion_trigger"); public static final ConfigurableTypeCommon LOOT_FUNCTION = new ConfigurableTypeCommon(true, LootFunctionConfigCommon.class, new ConfigurableTypeActionRegistry<>(), "loot_function"); public static final ConfigurableTypeCommon LOOT_CONDITION = new ConfigurableTypeCommon(true, LootConditionConfigCommon.class, new ConfigurableTypeActionRegistry<>(), "loot_condition"); - public static final ConfigurableTypeCommon LOOT_NUMBER_PROVIDER = new ConfigurableTypeCommon(true, LootNumberProviderConfigCommon.class, new ConfigurableTypeActionRegistry<>(), "loot_number_provider"); + public static final ConfigurableTypeCommon LOOT_CONTEXT_FLOAT_PROVIDER = new ConfigurableTypeCommon(true, LootContextFloatProviderConfigCommon.class, new ConfigurableTypeActionRegistry<>(), "loot_context_float_provider"); + public static final ConfigurableTypeCommon LOOT_CONTEXT_INT_PROVIDER = new ConfigurableTypeCommon(true, LootContextIntProviderConfigCommon.class, new ConfigurableTypeActionRegistry<>(), "loot_context_int_provider"); public static final ConfigurableTypeCommon LOOT_NBT_PROVIDER = new ConfigurableTypeCommon(true, LootNbtProviderConfigCommon.class, new ConfigurableTypeActionRegistry<>(), "loot_nbt_provider"); public static final ConfigurableTypeCommon LOOT_SCORE_PROVIDER = new ConfigurableTypeCommon(true, LootScoreProviderConfigCommon.class, new ConfigurableTypeActionRegistry<>(), "loot_score_provider"); public static final ConfigurableTypeCommon SOUND_EVENT = new ConfigurableTypeCommon(true, SoundEventConfigCommon.class, new ConfigurableTypeActionRegistry<>(), "sound_event"); diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/config/DeferredHolderCommon.java b/loader-common/src/main/java/org/cyclops/cyclopscore/config/DeferredHolderCommon.java index ba846d8eb9f..5514c0ecb10 100644 --- a/loader-common/src/main/java/org/cyclops/cyclopscore/config/DeferredHolderCommon.java +++ b/loader-common/src/main/java/org/cyclops/cyclopscore/config/DeferredHolderCommon.java @@ -327,7 +327,7 @@ public Holder getDelegate() { bind(false); var tmp = Holder.Reference.createStandAlone(new HolderOwner() { // TODO: this was just "this" when Holder was not sealed. @Override - public boolean canSerializeIn(HolderOwner context) { + public boolean canSerialize(HolderOwner context) { return false; } }, key); diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/config/extendedconfig/LootContextFloatProviderConfigCommon.java b/loader-common/src/main/java/org/cyclops/cyclopscore/config/extendedconfig/LootContextFloatProviderConfigCommon.java new file mode 100644 index 00000000000..78db3ab20fd --- /dev/null +++ b/loader-common/src/main/java/org/cyclops/cyclopscore/config/extendedconfig/LootContextFloatProviderConfigCommon.java @@ -0,0 +1,42 @@ +package org.cyclops.cyclopscore.config.extendedconfig; + +import com.mojang.serialization.MapCodec; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.storage.loot.providers.number.floats.ContextFloatProvider; +import org.cyclops.cyclopscore.config.ConfigurableTypeCommon; +import org.cyclops.cyclopscore.init.IModBase; + +/** + * Config for loot context float providers. + * @author rubensworks + * @param The mod type + * @see ExtendedConfigCommon + */ +public abstract class LootContextFloatProviderConfigCommon extends ExtendedConfigRegistry, MapCodec, M> { + + public LootContextFloatProviderConfigCommon(M mod, String namedId, MapCodec lootContextFloatProviderType) { + super(mod, namedId, (eConfig) -> lootContextFloatProviderType); + } + + @Override + public String getTranslationKey() { + return "lootcontextfloatprovider." + getMod().getModId() + "." + getNamedId(); + } + + // Needed for config gui + @Override + public String getFullTranslationKey() { + return getTranslationKey(); + } + + @Override + public ConfigurableTypeCommon getConfigurableType() { + return ConfigurableTypeCommon.LOOT_CONTEXT_FLOAT_PROVIDER; + } + + @Override + public Registry> getRegistry() { + return BuiltInRegistries.CONTEXT_FLOAT_PROVIDER_TYPE; + } +} diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/config/extendedconfig/LootContextIntProviderConfigCommon.java b/loader-common/src/main/java/org/cyclops/cyclopscore/config/extendedconfig/LootContextIntProviderConfigCommon.java new file mode 100644 index 00000000000..09d9f745927 --- /dev/null +++ b/loader-common/src/main/java/org/cyclops/cyclopscore/config/extendedconfig/LootContextIntProviderConfigCommon.java @@ -0,0 +1,42 @@ +package org.cyclops.cyclopscore.config.extendedconfig; + +import com.mojang.serialization.MapCodec; +import net.minecraft.core.Registry; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.level.storage.loot.providers.number.ints.ContextIntProvider; +import org.cyclops.cyclopscore.config.ConfigurableTypeCommon; +import org.cyclops.cyclopscore.init.IModBase; + +/** + * Config for loot context int providers. + * @author rubensworks + * @param The mod type + * @see ExtendedConfigCommon + */ +public abstract class LootContextIntProviderConfigCommon extends ExtendedConfigRegistry, MapCodec, M> { + + public LootContextIntProviderConfigCommon(M mod, String namedId, MapCodec lootContextIntProviderType) { + super(mod, namedId, (eConfig) -> lootContextIntProviderType); + } + + @Override + public String getTranslationKey() { + return "lootcontextintprovider." + getMod().getModId() + "." + getNamedId(); + } + + // Needed for config gui + @Override + public String getFullTranslationKey() { + return getTranslationKey(); + } + + @Override + public ConfigurableTypeCommon getConfigurableType() { + return ConfigurableTypeCommon.LOOT_CONTEXT_INT_PROVIDER; + } + + @Override + public Registry> getRegistry() { + return BuiltInRegistries.CONTEXT_INT_PROVIDER_TYPE; + } +} diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/config/extendedconfig/LootNumberProviderConfigCommon.java b/loader-common/src/main/java/org/cyclops/cyclopscore/config/extendedconfig/LootNumberProviderConfigCommon.java deleted file mode 100644 index 81e5ddb0286..00000000000 --- a/loader-common/src/main/java/org/cyclops/cyclopscore/config/extendedconfig/LootNumberProviderConfigCommon.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.cyclops.cyclopscore.config.extendedconfig; - -import net.minecraft.core.Registry; -import net.minecraft.core.registries.BuiltInRegistries; -import com.mojang.serialization.MapCodec; -import net.minecraft.world.level.storage.loot.providers.number.NumberProvider; -import org.cyclops.cyclopscore.config.ConfigurableTypeCommon; -import org.cyclops.cyclopscore.init.IModBase; - -/** - * Config for loot number providers. - * @author rubensworks - * @param The mod type - * @see ExtendedConfigCommon - */ -public abstract class LootNumberProviderConfigCommon extends ExtendedConfigRegistry, MapCodec, M> { - - public LootNumberProviderConfigCommon(M mod, String namedId, MapCodec lootItemFunctionType) { - super(mod, namedId, (eConfig) -> lootItemFunctionType); - } - - @Override - public String getTranslationKey() { - return "lootnumberprovider." + getMod().getModId() + "." + getNamedId(); - } - - // Needed for config gui - @Override - public String getFullTranslationKey() { - return getTranslationKey(); - } - - @Override - public ConfigurableTypeCommon getConfigurableType() { - return ConfigurableTypeCommon.LOOT_NUMBER_PROVIDER; - } - - @Override - public Registry> getRegistry() { - return BuiltInRegistries.LOOT_NUMBER_PROVIDER_TYPE; - } -} diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/config/extendedconfig/WorldFeatureConfigCommon.java b/loader-common/src/main/java/org/cyclops/cyclopscore/config/extendedconfig/WorldFeatureConfigCommon.java index 5c7309519bf..9fc70453881 100644 --- a/loader-common/src/main/java/org/cyclops/cyclopscore/config/extendedconfig/WorldFeatureConfigCommon.java +++ b/loader-common/src/main/java/org/cyclops/cyclopscore/config/extendedconfig/WorldFeatureConfigCommon.java @@ -1,5 +1,6 @@ package org.cyclops.cyclopscore.config.extendedconfig; +import com.mojang.serialization.MapCodec; import net.minecraft.core.Registry; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.level.levelgen.feature.Feature; @@ -9,14 +10,15 @@ import java.util.function.Function; /** - * Config for world features. + * Config for world feature types. * @author rubensworks + * @param The feature type * @param The mod type * @see ExtendedConfigCommon */ -public abstract class WorldFeatureConfigCommon extends ExtendedConfigRegistry, Feature, M> { +public abstract class WorldFeatureConfigCommon extends ExtendedConfigRegistry, MapCodec, M> { - public WorldFeatureConfigCommon(M mod, String namedId, Function, ? extends Feature> elementConstructor) { + public WorldFeatureConfigCommon(M mod, String namedId, Function, MapCodec> elementConstructor) { super(mod, namedId, elementConstructor); } @@ -31,7 +33,7 @@ public ConfigurableTypeCommon getConfigurableType() { } @Override - public Registry> getRegistry() { - return BuiltInRegistries.FEATURE; + public Registry> getRegistry() { + return BuiltInRegistries.FEATURE_TYPE; } } diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/gametest/GameTestLoaderHelpers.java b/loader-common/src/main/java/org/cyclops/cyclopscore/gametest/GameTestLoaderHelpers.java index 62677a1d06b..2357b0eadd1 100644 --- a/loader-common/src/main/java/org/cyclops/cyclopscore/gametest/GameTestLoaderHelpers.java +++ b/loader-common/src/main/java/org/cyclops/cyclopscore/gametest/GameTestLoaderHelpers.java @@ -9,6 +9,7 @@ import net.minecraft.gametest.framework.TestEnvironmentDefinition; import net.minecraft.resources.Identifier; import net.minecraft.resources.ResourceKey; +import net.minecraft.world.level.Level; import java.lang.reflect.Method; import java.util.Collection; @@ -55,6 +56,7 @@ public static Collection generateCommonTests(String modI testsList.add(new MethodGameTestInstance( new TestData<>( environment, + Level.OVERWORLD, Identifier.parse(gameTest.template()), gameTest.timeoutTicks(), gameTest.setupTicks(), diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/helper/BaseHelpersCommon.java b/loader-common/src/main/java/org/cyclops/cyclopscore/helper/BaseHelpersCommon.java index bda4db91bda..bcf975406d5 100644 --- a/loader-common/src/main/java/org/cyclops/cyclopscore/helper/BaseHelpersCommon.java +++ b/loader-common/src/main/java/org/cyclops/cyclopscore/helper/BaseHelpersCommon.java @@ -1,6 +1,6 @@ package org.cyclops.cyclopscore.helper; -import net.minecraft.util.Util; +import com.mojang.blaze3d.Blaze3D; import org.apache.commons.lang3.tuple.Triple; import org.apache.logging.log4j.Level; @@ -98,7 +98,7 @@ public int castSafe(long value) { public void openUrl(String url) { try { URI uri = new URI(url); - Util.getPlatform().openUri(uri); + Blaze3D.openUri(uri); } catch (Throwable e) { e.printStackTrace(); CyclopsCoreInstance.MOD.log(Level.ERROR, e.getMessage()); diff --git a/loader-common/src/main/java/org/cyclops/cyclopscore/helper/InventoryHelpersCommon.java b/loader-common/src/main/java/org/cyclops/cyclopscore/helper/InventoryHelpersCommon.java index 1cce8a10786..fa00d6a3189 100644 --- a/loader-common/src/main/java/org/cyclops/cyclopscore/helper/InventoryHelpersCommon.java +++ b/loader-common/src/main/java/org/cyclops/cyclopscore/helper/InventoryHelpersCommon.java @@ -2,6 +2,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; +import net.minecraft.util.Prediction; import net.minecraft.world.Container; import net.minecraft.world.InteractionHand; import net.minecraft.world.entity.player.Player; @@ -48,7 +49,7 @@ public void tryReAddToStack(Player player, ItemStack originalStack, ItemStack ne originalStack.shrink(1); } if(!player.getInventory().add(newStackPart)) { - player.drop(newStackPart, false); + player.drop(newStackPart, false, Prediction.PREDICTED); } } } diff --git a/loader-common/src/main/resources/META-INF/accesstransformer.cfg b/loader-common/src/main/resources/META-INF/accesstransformer.cfg index 2ab250b53d5..6fb26f93137 100644 --- a/loader-common/src/main/resources/META-INF/accesstransformer.cfg +++ b/loader-common/src/main/resources/META-INF/accesstransformer.cfg @@ -31,7 +31,7 @@ public net.minecraft.world.inventory.MenuType constructor public-f net.minecraft.world.inventory.AbstractContainerMenu slots # GuiGraphicsExtractor -public net.minecraft.client.gui.GuiGraphicsExtractor innerBlit(Lcom/mojang/blaze3d/pipeline/RenderPipeline;Lnet/minecraft/resources/Identifier;IIIIFFFFI)V +public net.minecraft.client.gui.GuiGraphicsExtractor innerBlit(Lcom/mojang/renderpearl/api/pipeline/RenderPipeline;Lnet/minecraft/resources/Identifier;IIIIFFFFI)V public net.minecraft.client.gui.GuiGraphicsExtractor itemBar(Lnet/minecraft/world/item/ItemStack;II)V public net.minecraft.client.gui.GuiGraphicsExtractor itemCooldown(Lnet/minecraft/world/item/ItemStack;II)V @@ -72,7 +72,7 @@ public net.minecraft.client.particle.ParticleResources$SpriteParticleRegistratio public net.minecraft.client.color.item.ItemTintSources ID_MAPPER # RenderPipelines -public net.minecraft.client.renderer.RenderPipelines register(Lcom/mojang/blaze3d/pipeline/RenderPipeline;)Lcom/mojang/blaze3d/pipeline/RenderPipeline; +public net.minecraft.client.renderer.RenderPipelines register(Lcom/mojang/renderpearl/api/pipeline/RenderPipeline;)Lcom/mojang/renderpearl/api/pipeline/RenderPipeline; # RenderType public net.minecraft.client.renderer.rendertype.RenderType diff --git a/loader-common/src/main/resources/assets/cyclopscore/shaders/core/particle_blur.fsh b/loader-common/src/main/resources/assets/cyclopscore/shaders/core/particle_blur.fsh index 1e987d0d30a..c202af53aac 100644 --- a/loader-common/src/main/resources/assets/cyclopscore/shaders/core/particle_blur.fsh +++ b/loader-common/src/main/resources/assets/cyclopscore/shaders/core/particle_blur.fsh @@ -1,26 +1,22 @@ #version 330 +#extension GL_ARB_separate_shader_objects : require -#moj_import -#moj_import - -//layout(std140) uniform SamplerInfo { -// vec2 OutSize; -// vec2 InSize; -//}; +#include +#include +#include uniform sampler2D Sampler0; -uniform sampler2D Sampler2; -in float sphericalVertexDistance; -in float cylindricalVertexDistance; -in vec2 texCoord0; -in vec4 vertexColor; +layout(location = 0) in float sphericalVertexDistance; +layout(location = 1) in float cylindricalVertexDistance; +layout(location = 2) in vec2 texCoord0; +layout(location = 3) in vec4 vertexColor; -out vec4 fragColor; +#ifndef OIT_ALPHA_ONLY +layout(location = 0) out vec4 fragColor; +#endif vec4 box_blur(vec2 BlurDir) { -// vec2 oneTexel = 1.0 / vec2(512, 256.0); -// vec2 oneTexel = 1.0 / InSize; // Seems to be difficult to pass SamplerInfo as param into RenderPipeline... vec2 oneTexel = 1.0 / textureSize(Sampler0, 0); vec2 sampleStep = oneTexel * BlurDir; @@ -34,12 +30,26 @@ vec4 box_blur(vec2 BlurDir) { return blurred / (actualRadius + 0.5); } +vec4 calculateFinalColor(vec4 color) { + #ifdef OIT_ACCUMULATE + color = sampleColorForAccumulation(color); + vec4 fogColor = vec4(FogColor.rgb * color.a, FogColor.a); + #else + vec4 fogColor = FogColor; + #endif + return apply_fog(color, sphericalVertexDistance, cylindricalVertexDistance, FogEnvironmentalStart, FogEnvironmentalEnd, FogRenderDistanceStart, FogRenderDistanceEnd, fogColor); +} + // This is a combination of vanilla's core/particle.fsh and post/box_blur.fsh and post/entity_outline_box_blur.fsh void main() { vec4 color = texture(Sampler0, texCoord0) * vertexColor * ColorModulator; if (color.a < 0.1) { discard; } + #ifdef OIT_ALPHA_ONLY + executeAlphaOnlyPhase(gl_FragCoord.z, color.a); + #else // We apply box blur in 2 passes: horizontal and vertical - fragColor = apply_fog(color, sphericalVertexDistance, cylindricalVertexDistance, FogEnvironmentalStart, FogEnvironmentalEnd, FogRenderDistanceStart, FogRenderDistanceEnd, FogColor) * box_blur(vec2(1.0, 0.0)) * box_blur(vec2(0.0, 1.0)); + fragColor = calculateFinalColor(color) * box_blur(vec2(1.0, 0.0)) * box_blur(vec2(0.0, 1.0)); + #endif } diff --git a/loader-common/src/main/resources/cyclopscore.accesswidener b/loader-common/src/main/resources/cyclopscore.accesswidener index b7824d5ce73..7e227fd94d3 100644 --- a/loader-common/src/main/resources/cyclopscore.accesswidener +++ b/loader-common/src/main/resources/cyclopscore.accesswidener @@ -19,7 +19,7 @@ accessible field net/minecraft/world/inventory/MenuType constructor Lnet/minecra mutable field net/minecraft/world/inventory/AbstractContainerMenu slots Lnet/minecraft/core/NonNullList; # GuiGraphics -accessible method net/minecraft/client/gui/GuiGraphicsExtractor innerBlit (Lcom/mojang/blaze3d/pipeline/RenderPipeline;Lnet/minecraft/resources/Identifier;IIIIFFFFI)V +accessible method net/minecraft/client/gui/GuiGraphicsExtractor innerBlit (Lcom/mojang/renderpearl/api/pipeline/RenderPipeline;Lnet/minecraft/resources/Identifier;IIIIFFFFI)V accessible method net/minecraft/client/gui/GuiGraphicsExtractor itemBar (Lnet/minecraft/world/item/ItemStack;II)V accessible method net/minecraft/client/gui/GuiGraphicsExtractor itemCooldown (Lnet/minecraft/world/item/ItemStack;II)V @@ -76,11 +76,11 @@ accessible field net/minecraft/client/color/item/ItemTintSources ID_MAPPER Lnet/ accessible field net/minecraft/resources/RegistryLoadTask registry Lnet/minecraft/core/WritableRegistry; # RenderPipelines -accessible field net/minecraft/client/renderer/RenderPipelines PARTICLE_SNIPPET Lcom/mojang/blaze3d/pipeline/RenderPipeline$Snippet; -accessible method net/minecraft/client/renderer/RenderPipelines register (Lcom/mojang/blaze3d/pipeline/RenderPipeline;)Lcom/mojang/blaze3d/pipeline/RenderPipeline; +accessible field net/minecraft/client/renderer/RenderPipelines PARTICLE_SNIPPET Lcom/mojang/renderpearl/api/pipeline/RenderPipeline$Snippet; +accessible method net/minecraft/client/renderer/RenderPipelines register (Lcom/mojang/renderpearl/api/pipeline/RenderPipeline;)Lcom/mojang/renderpearl/api/pipeline/RenderPipeline; # RenderType -accessible field net/minecraft/client/renderer/RenderPipelines MATRICES_FOG_SNIPPET Lcom/mojang/blaze3d/pipeline/RenderPipeline$Snippet; +accessible field net/minecraft/client/renderer/RenderPipelines MATRICES_FOG_SNIPPET Lcom/mojang/renderpearl/api/pipeline/RenderPipeline$Snippet; # Structures accessible field net/minecraft/world/level/levelgen/structure/pools/StructureTemplatePool rawTemplates Ljava/util/List; diff --git a/loader-neoforge/build.gradle b/loader-neoforge/build.gradle index 6628506dd0c..3c2e5ba45d6 100644 --- a/loader-neoforge/build.gradle +++ b/loader-neoforge/build.gradle @@ -39,7 +39,6 @@ repositories { } dependencies { - //runtimeOnly fg.deobf("top.theillusivec4.curios:curios-neoforge:${curios_version}") // https://maven.theillusivec4.top/top/theillusivec4/curios/curios-neoforge/ compileOnly "top.theillusivec4.curios:curios-neoforge:${neoforge_curios_version}:api" } diff --git a/loader-neoforge/src/api/java/org/cyclops/commoncapabilities/api b/loader-neoforge/src/api/java/org/cyclops/commoncapabilities/api index 7cc8eb2c2a7..eac103d55e2 160000 --- a/loader-neoforge/src/api/java/org/cyclops/commoncapabilities/api +++ b/loader-neoforge/src/api/java/org/cyclops/commoncapabilities/api @@ -1 +1 @@ -Subproject commit 7cc8eb2c2a74ede82120de4d42e74865db9f8c2b +Subproject commit eac103d55e2a5d66ad2fc177d5c4ac37d9e401be diff --git a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/block/component/ParticleDropBlockComponent.java b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/block/component/ParticleDropBlockComponent.java index d71fe00e3ca..e3a5a19c563 100644 --- a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/block/component/ParticleDropBlockComponent.java +++ b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/block/component/ParticleDropBlockComponent.java @@ -55,7 +55,7 @@ public void setChance(int chance) { public void randomDisplayTick(BlockState blockState, Level world, BlockPos blockPos, RandomSource rand) { if (rand.nextInt(chance) == 0 && (offset == 0 || IModHelpers.get().getBlockHelpers().doesBlockHaveSolidTopSurface(world, blockPos.offset(0, -offset, 0))) && - !world.getBlockState(blockPos.offset(0, - offset - 1, 0)).blocksMotion()) { + !world.getBlockState(blockPos.offset(0, - offset - 1, 0)).isSolidRender()) { double px = (double) ((float) blockPos.getX() + rand.nextFloat()); double py = (double) blockPos.getY() - 0.05D - offset; double pz = (double) ((float) blockPos.getZ() + rand.nextFloat()); diff --git a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/client/model/DynamicBaseModel.java b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/client/model/DynamicBaseModel.java index 78836cce0e1..88ddc15f12a 100644 --- a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/client/model/DynamicBaseModel.java +++ b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/client/model/DynamicBaseModel.java @@ -211,7 +211,11 @@ protected static void addBakedQuadRotated(List quads, float x1, float UVPair.pack(texture.getU(uvs[(2 + rotation) % 4][0]), texture.getV(uvs[(2 + rotation) % 4][1])), UVPair.pack(texture.getU(uvs[(3 + rotation) % 4][0]), texture.getV(uvs[(3 + rotation) % 4][1])), side, - new BakedQuad.MaterialInfo(texture, ChunkSectionLayer.CUTOUT, RenderTypes.entityCutout(texture.atlasLocation()), -1, false, 0, true), + new BakedQuad.MaterialInfo(texture, ChunkSectionLayer.CUTOUT, + RenderTypes.entityCutout(texture.atlasLocation()), + RenderTypes.itemCutoutGlint(texture.atlasLocation()), + RenderTypes.itemCutoutGlintSpecial(texture.atlasLocation()), + -1, Direction.UP, 0, true), // Shading along UP is unshaded, matching the previous shade=false BakedNormals.UNSPECIFIED, isColored ? BakedColors.of(shadeColor) : BakedColors.DEFAULT )); diff --git a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/client/render/blockentity/RenderBlockEntityModel.java b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/client/render/blockentity/RenderBlockEntityModel.java index 0ee94da241f..82ce65a3b2b 100644 --- a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/client/render/blockentity/RenderBlockEntityModel.java +++ b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/client/render/blockentity/RenderBlockEntityModel.java @@ -82,7 +82,7 @@ public void submit(S renderState, PoseStack matrixStack, SubmitNodeCollector nod rotation = -90; } - matrixStack.mulPose(Axis.YP.rotationDegrees(rotation)); + matrixStack.rotateDegrees(Axis.YP, rotation); postRotate(renderState, matrixStack); submitModel(renderState, getModel(), matrixStack, nodeCollector, cameraRenderState); diff --git a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/infobook/ScreenInfoBook.java b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/infobook/ScreenInfoBook.java index 14823bbe4e6..973ee5ea720 100644 --- a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/infobook/ScreenInfoBook.java +++ b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/infobook/ScreenInfoBook.java @@ -1,7 +1,7 @@ package org.cyclops.cyclopscore.infobook; import com.google.common.collect.Lists; -import com.mojang.blaze3d.pipeline.RenderPipeline; +import com.mojang.renderpearl.api.pipeline.RenderPipeline; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Font; diff --git a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/infobook/pageelement/AdvancementButton.java b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/infobook/pageelement/AdvancementButton.java index 6194b0ecbd4..0bf6b558376 100644 --- a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/infobook/pageelement/AdvancementButton.java +++ b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/infobook/pageelement/AdvancementButton.java @@ -36,8 +36,8 @@ public void renderTooltip(GuiGraphicsExtractor guiGraphics, Font font, int mx, i AdvancementHolder advancement = AdvancementHelpers.getAdvancement(Dist.CLIENT, advancementId); if (advancement != null) { advancement.value().display().ifPresent(display -> { - lines.add(display.getTitle().getVisualOrderText()); - lines.add(display.getDescription().getVisualOrderText()); + lines.add(display.title().getVisualOrderText()); + lines.add(display.description().getVisualOrderText()); }); } guiGraphics.setTooltipForNextFrame(font, lines, mx, my); diff --git a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/infobook/pageelement/AdvancementRewardsAppendixClient.java b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/infobook/pageelement/AdvancementRewardsAppendixClient.java index 3a71deb0b8a..8fbf57fb255 100644 --- a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/infobook/pageelement/AdvancementRewardsAppendixClient.java +++ b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/infobook/pageelement/AdvancementRewardsAppendixClient.java @@ -53,7 +53,7 @@ protected void drawElement(ScreenInfoBook gui, GuiGraphicsExtractor guiGraphics, } else { int finalOffsetX = offsetX; int finalOffsetY = offsetY; - advancement.value().display().ifPresent(display -> RecipeAppendixClient.renderItemForButton(gui, guiGraphics, x + finalOffsetX, y + finalOffsetY, display.getIcon().create(), mx, my, true, null)); + advancement.value().display().ifPresent(display -> RecipeAppendixClient.renderItemForButton(gui, guiGraphics, x + finalOffsetX, y + finalOffsetY, display.icon().create(), mx, my, true, null)); if (AdvancementHelpers.hasAdvancementUnlocked(Minecraft.getInstance().player, advancementId)) { Images.OK.draw(guiGraphics, x + offsetX + 1, y + offsetY + 2); } else { diff --git a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/inventory/InventoryModifiableContainerNeoForge.java b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/inventory/InventoryModifiableContainerNeoForge.java deleted file mode 100644 index 98799c959c6..00000000000 --- a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/inventory/InventoryModifiableContainerNeoForge.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.cyclops.cyclopscore.inventory; - -import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.items.IItemHandlerModifiable; - -/** - * @author rubensworks - */ -public class InventoryModifiableContainerNeoForge implements IInventoryCommonModifiable { - - private final IItemHandlerModifiable itemHandler; - - public InventoryModifiableContainerNeoForge(IItemHandlerModifiable itemHandler) { - this.itemHandler = itemHandler; - } - - @Override - public int getSlots() { - return this.itemHandler.getSlots(); - } - - @Override - public ItemStack getStackInSlot(int slot) { - return this.itemHandler.getStackInSlot(slot); - } - - @Override - public void setStackInSlot(int slot, ItemStack itemStack) { - this.itemHandler.setStackInSlot(slot, itemStack); - } -} diff --git a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/inventory/InventoryModifiableResourceHandlerNeoForge.java b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/inventory/InventoryModifiableResourceHandlerNeoForge.java new file mode 100644 index 00000000000..12dc1e8b33a --- /dev/null +++ b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/inventory/InventoryModifiableResourceHandlerNeoForge.java @@ -0,0 +1,51 @@ +package org.cyclops.cyclopscore.inventory; + +import net.minecraft.world.item.ItemStack; +import net.neoforged.neoforge.transfer.ResourceHandler; +import net.neoforged.neoforge.transfer.item.ItemResource; +import net.neoforged.neoforge.transfer.item.ItemUtil; +import net.neoforged.neoforge.transfer.transaction.Transaction; + +/** + * An {@link IInventoryCommonModifiable} that is backed by a {@link ResourceHandler} of items. + * @author rubensworks + */ +public class InventoryModifiableResourceHandlerNeoForge implements IInventoryCommonModifiable { + + private final ResourceHandler resourceHandler; + + public InventoryModifiableResourceHandlerNeoForge(ResourceHandler resourceHandler) { + this.resourceHandler = resourceHandler; + } + + @Override + public int getSlots() { + return this.resourceHandler.size(); + } + + @Override + public ItemStack getStackInSlot(int slot) { + return ItemUtil.getStack(this.resourceHandler, slot); + } + + /** + * The transfer API has no slot setter, so the slot is emptied and refilled in one transaction. + * Unlike a plain setter, this respects the handler's own slot validation: + * if the slot refuses (part of) the stack, the transaction is rolled back and the slot is left as it was, + * rather than dropping the items. + */ + @Override + public void setStackInSlot(int slot, ItemStack itemStack) { + try (Transaction transaction = Transaction.openRoot()) { + int amount = this.resourceHandler.getAmountAsInt(slot); + if (amount > 0) { + this.resourceHandler.extract(slot, this.resourceHandler.getResource(slot), amount, transaction); + } + if (!itemStack.isEmpty() && this.resourceHandler.insert(slot, ItemResource.of(itemStack), + itemStack.getCount(), transaction) != itemStack.getCount()) { + return; + } + transaction.commit(); + } + } +} diff --git a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/item/ItemBlockNBT.java b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/item/ItemBlockNBT.java index 715a5f6178e..0e789f290af 100644 --- a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/item/ItemBlockNBT.java +++ b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/item/ItemBlockNBT.java @@ -1,18 +1,15 @@ package org.cyclops.cyclopscore.item; -import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.BlockPlaceContext; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; import org.cyclops.cyclopscore.block.BlockWithEntity; -import javax.annotation.Nullable; - /** * An extended {@link BlockItem} that will add the NBT data that is stored inside * the item to the placed {@link BlockEntity} for the blockState. @@ -33,17 +30,20 @@ public ItemBlockNBT(Block block, Item.Properties builder) { } @Override - protected boolean updateCustomBlockEntityTag(BlockPos pos, Level world, @Nullable Player player, ItemStack itemStack, BlockState blockState) { - if (super.updateCustomBlockEntityTag(pos, world, player, itemStack, blockState)) { - return true; + protected boolean placeBlock(BlockPlaceContext context, BlockState placementState) { + if (!super.placeBlock(context, placementState)) { + return false; } - BlockEntity tile = world.getBlockEntity(pos); - if (tile != null) { - return itemStackDataToTile(itemStack.copy().split(1), tile); + Level world = context.getLevel(); + if (!world.isClientSide()) { + BlockEntity tile = world.getBlockEntity(context.getClickedPos()); + if (tile != null) { + itemStackDataToTile(context.getItemInHand().copy().split(1), tile); + } } - return false; + return true; } /** diff --git a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/loot/modifier/LootModifierInjectItem.java b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/loot/modifier/LootModifierInjectItem.java index c603b471b45..83893dd2cda 100644 --- a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/loot/modifier/LootModifierInjectItem.java +++ b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/loot/modifier/LootModifierInjectItem.java @@ -5,6 +5,7 @@ import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import net.minecraft.core.Holder; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStackTemplate; import net.minecraft.world.level.storage.loot.LootContext; @@ -14,6 +15,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; +import java.util.Optional; import java.util.function.Supplier; /** @@ -32,8 +34,8 @@ public class LootModifierInjectItem extends LootModifier { private final List lootTables; private final int maxStackSize; - public LootModifierInjectItem(LootItemCondition[] conditionsIn, int priority, ItemStackTemplate itemStack, List lootTables, int maxStackSize) { - super(conditionsIn, priority); + public LootModifierInjectItem(Optional> condition, int priority, ItemStackTemplate itemStack, List lootTables, int maxStackSize) { + super(condition, priority); this.itemStack = itemStack; this.lootTables = lootTables; this.maxStackSize = maxStackSize; diff --git a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/modcompat/curios/InventoryLocationCurios.java b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/modcompat/curios/InventoryLocationCurios.java index 00bb2f53c62..81e120c39ac 100644 --- a/loader-neoforge/src/main/java/org/cyclops/cyclopscore/modcompat/curios/InventoryLocationCurios.java +++ b/loader-neoforge/src/main/java/org/cyclops/cyclopscore/modcompat/curios/InventoryLocationCurios.java @@ -3,13 +3,17 @@ import net.minecraft.resources.Identifier; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.neoforged.neoforge.items.wrapper.EmptyItemHandler; +import net.neoforged.neoforge.transfer.EmptyResourceHandler; +import net.neoforged.neoforge.transfer.ResourceHandler; +import net.neoforged.neoforge.transfer.item.ItemResource; +import net.neoforged.neoforge.transfer.item.ItemUtil; import org.cyclops.cyclopscore.Reference; import org.cyclops.cyclopscore.inventory.IInventoryCommonModifiable; import org.cyclops.cyclopscore.inventory.IInventoryLocation; -import org.cyclops.cyclopscore.inventory.InventoryModifiableContainerNeoForge; -import top.theillusivec4.curios.api.CuriosApi; -import top.theillusivec4.curios.api.type.capability.ICuriosItemHandler; +import org.cyclops.cyclopscore.inventory.InventoryModifiableResourceHandlerNeoForge; +import top.theillusivec4.curios.api.CuriosCapability; + +import javax.annotation.Nullable; /** * @author rubensworks @@ -21,24 +25,30 @@ public Identifier getUniqueName() { return Identifier.fromNamespaceAndPath(Reference.MOD_ID, "curios"); } + @Nullable + protected static ResourceHandler getCuriosHandler(Player player) { + return player.getCapability(CuriosCapability.ITEM_HANDLER, null); + } + @Override public IInventoryCommonModifiable getInventory(Player player) { - return new InventoryModifiableContainerNeoForge(CuriosApi.getCuriosInventory(player) - .map(ICuriosItemHandler::getEquippedCurios) - .orElseGet(EmptyItemHandler::new)); + ResourceHandler handler = getCuriosHandler(player); + return new InventoryModifiableResourceHandlerNeoForge( + handler == null ? EmptyResourceHandler.instance() : handler); } @Override public ItemStack getItemInSlot(Player player, int slot) { - return CuriosApi.getCuriosInventory(player) - .map(handler -> handler.getEquippedCurios().getStackInSlot(slot)) - .orElse(ItemStack.EMPTY); + ResourceHandler handler = getCuriosHandler(player); + return handler == null ? ItemStack.EMPTY : ItemUtil.getStack(handler, slot); } @Override public void setItemInSlot(Player player, int slot, ItemStack itemStack) { - CuriosApi.getCuriosInventory(player) - .ifPresent(handler -> handler.getEquippedCurios().setStackInSlot(slot, itemStack)); + ResourceHandler handler = getCuriosHandler(player); + if (handler != null) { + new InventoryModifiableResourceHandlerNeoForge(handler).setStackInSlot(slot, itemStack); + } } }