diff --git a/.github/workflows/gradle-build.yml b/.github/workflows/gradle-build.yml
index b289ca1aa5..f4b8d9dff0 100644
--- a/.github/workflows/gradle-build.yml
+++ b/.github/workflows/gradle-build.yml
@@ -21,7 +21,7 @@ jobs:
- name: Set up JDK 21
uses: actions/setup-java@v4.7.1
with:
- java-version: '21'
+ java-version: '25'
distribution: 'temurin'
server-id: github # Value of the distributionManagement/repository/id field of the pom.xml
settings-path: ${{ github.workspace }} # location for the settings.xml file
diff --git a/buildSrc/src/main/kotlin/Utils.kt b/buildSrc/src/main/kotlin/Utils.kt
index 679786788b..4b761e1e2f 100644
--- a/buildSrc/src/main/kotlin/Utils.kt
+++ b/buildSrc/src/main/kotlin/Utils.kt
@@ -1,25 +1,21 @@
import java.io.ByteArrayOutputStream
import org.gradle.api.Action
import org.gradle.api.Project
+import org.gradle.kotlin.dsl.support.serviceOf
var isPrerelease = false
fun Project.getGitHash(): String {
- val stdout = ByteArrayOutputStream()
- exec {
+ return providers.exec {
commandLine = mutableListOf("git", "rev-parse", "--short", "HEAD")
- standardOutput = stdout
- }
- return stdout.toString().trim()
+ }.standardOutput.asText.get().trim()
}
fun Project.gitClone(name: String) {
- val stdout = ByteArrayOutputStream()
- exec {
+ providers.exec {
commandLine = mutableListOf("git", "clone", name)
- standardOutput = stdout
}
}
diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt
index 6f564513b4..ae15639cfb 100644
--- a/buildSrc/src/main/kotlin/Versions.kt
+++ b/buildSrc/src/main/kotlin/Versions.kt
@@ -32,7 +32,7 @@ object Versions {
}
object Fabric {
- const val fabricAPI = "0.134.1+${Mod.minecraft}"
+ const val fabricAPI = "0.140.0+${Mod.minecraft}"
const val cloud = "2.0.0-beta.13"
}
//
@@ -42,14 +42,14 @@ object Versions {
// }
object Mod {
- const val mixin = "0.16.4+mixin.0.8.7"
+ const val mixin = "0.16.5+mixin.0.8.7"
const val mixinExtras = "0.5.0"
- const val minecraft = "1.21.10"
- const val yarn = "$minecraft+build.1"
- const val fabricLoader = "0.18.2"
+ const val minecraft = "1.21.11"
+ const val yarn = "$minecraft+build.3"
+ const val fabricLoader = "0.18.3"
- const val architecuryLoom = "1.11.451"
+ const val architecturyLoom = "1.13.463"
const val architecturyPlugin = "3.4.162"
}
@@ -60,9 +60,9 @@ object Versions {
// }
object Bukkit {
- const val minecraft = "1.21.10"
+ const val minecraft = "1.21.11-rc3"
const val nms = "$minecraft-R0.1"
- const val paperBuild = "$nms-20251012.013929-7"
+ const val paperBuild = "$nms-20251208.200020-2"
const val paper = paperBuild
const val paperLib = "1.0.8"
const val reflectionRemapper = "0.1.3"
@@ -96,6 +96,6 @@ object Versions {
}
object Minestom {
- const val minestom = "2025.10.04-1.21.8"
+ const val minestom = "2025.12.20c-1.21.11"
}
}
diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/ExtensibleRegistry.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/ExtensibleRegistry.java
new file mode 100644
index 0000000000..0d6a8e3b88
--- /dev/null
+++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/ExtensibleRegistry.java
@@ -0,0 +1,93 @@
+package com.dfsek.terra.registry;
+
+import com.google.errorprone.annotations.MustBeClosed;
+import org.intellij.lang.annotations.Pattern;
+import org.jspecify.annotations.Nullable;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.stream.Stream;
+
+
+/**
+ * A file-discoverable registry that can be extended by system properties
+ *
+ * The main use-case for this is to allow for customized locations of file-system-based key entries,
+ * such as putting config packs into custom locations.
+ *
+ * Two system properties are used to define the search path:
+ *
+ * terra.registry.{searchPathName}.searchPath is a list of "parent folder" paths (like the pack directory) that
+ * will be searched for contained files.
+ *
+ * terra.registry.{searchPathName}.extraPath is a list of files that will be directly evaluated for membership and
+ * as such will be directly treated as members of the registry.
+ *
+ * These system properties are formatted like UNIX-style paths, with each path separated by a colon (':') character.
+ */
+public interface ExtensibleRegistry {
+ /**
+ * Get a lowercase search path name for this registry that will get plugged into
+ *
+ * terra.registry.{searchPathName}.searchPath
+ *
+ * and
+ *
+ * terra.registry.{searchPathName}.extraPath
+ */
+ @Pattern("^[a-z._]+$")
+ String getRegistryName();
+
+ /**
+ * Check if a path may be a member of this registry heuristically.
+ *
+ * @param path Path to check
+ *
+ * @return True if the path is a member of this registry.
+ */
+ boolean validatePathIsMember(Path path);
+
+ default @MustBeClosed Stream getMemberPaths(Path baseSearchPath) {
+ String basePropertyName = "terra.registry." + getRegistryName();
+
+ Stream searchPath = Stream.concat(
+ parseValidPaths(System.getProperty(basePropertyName + ".search-path")),
+ Stream.of(baseSearchPath)
+ );
+
+ Stream extraPath = parseValidPaths(System.getProperty(basePropertyName + ".extra-path"));
+
+ return Stream.concat(
+ searchPath
+ .filter(Files::isDirectory)
+ .flatMap(ExtensibleRegistry::listDirectory),
+ extraPath
+ )
+ .filter(this::validatePathIsMember);
+ }
+
+ private static Stream parseValidPaths(@Nullable String paths) {
+ return Stream.ofNullable(paths)
+ .flatMap(p -> Arrays.stream(p.split(":")))
+ .filter(v -> !v.isBlank())
+ .map(v -> {
+ try {
+ return Path.of(v).toAbsolutePath().normalize();
+ } catch (Exception e) {
+ return null;
+ }
+ })
+ .filter(Objects::nonNull);
+ }
+
+ private static Stream listDirectory(Path dir) {
+ try {
+ return Files.list(dir);
+ } catch(IOException e) {
+ return Stream.empty();
+ }
+ }
+}
diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java
index f4b4c9dd1a..08343d59f9 100644
--- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java
+++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/ConfigRegistry.java
@@ -29,13 +29,14 @@
import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.config.pack.ConfigPackImpl;
+import com.dfsek.terra.registry.ExtensibleRegistry;
import com.dfsek.terra.registry.OpenRegistryImpl;
/**
* Class to hold config packs
*/
-public class ConfigRegistry extends OpenRegistryImpl {
+public class ConfigRegistry extends OpenRegistryImpl implements ExtensibleRegistry {
public ConfigRegistry() {
super(TypeKey.of(ConfigPack.class));
@@ -45,7 +46,7 @@ public synchronized void loadAll(Platform platform) throws IOException, PackLoad
Path packsDirectory = platform.getDataFolder().toPath().resolve("packs");
Files.createDirectories(packsDirectory);
List failedLoads = new CopyOnWriteArrayList<>();
- try(Stream packs = Files.list(packsDirectory)) {
+ try(Stream packs = getMemberPaths(packsDirectory)) {
packs.parallel().forEach(path -> {
try {
ConfigPack pack = new ConfigPackImpl(path, platform);
@@ -60,6 +61,16 @@ public synchronized void loadAll(Platform platform) throws IOException, PackLoad
}
}
+ @Override
+ public String getRegistryName() {
+ return "config";
+ }
+
+ @Override
+ public boolean validatePathIsMember(Path path) {
+ return Files.isDirectory(path)|| path.getFileName().endsWith(".zip");
+ }
+
public static class PackLoadFailuresException extends Exception {
@Serial
private static final long serialVersionUID = 538998844645186306L;
diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/MetaConfigRegistry.java b/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/MetaConfigRegistry.java
index 05539475e5..65a4164001 100644
--- a/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/MetaConfigRegistry.java
+++ b/common/implementation/base/src/main/java/com/dfsek/terra/registry/master/MetaConfigRegistry.java
@@ -28,6 +28,7 @@
import com.dfsek.terra.api.config.MetaPack;
import com.dfsek.terra.api.util.reflection.TypeKey;
import com.dfsek.terra.config.pack.MetaPackImpl;
+import com.dfsek.terra.registry.ExtensibleRegistry;
import com.dfsek.terra.registry.OpenRegistryImpl;
import com.dfsek.terra.registry.master.ConfigRegistry.PackLoadFailuresException;
@@ -35,7 +36,7 @@
/**
* Class to hold config packs
*/
-public class MetaConfigRegistry extends OpenRegistryImpl {
+public class MetaConfigRegistry extends OpenRegistryImpl implements ExtensibleRegistry {
public MetaConfigRegistry() {
super(TypeKey.of(MetaPack.class));
@@ -45,8 +46,8 @@ public void loadAll(Platform platform, ConfigRegistry configRegistry) throws IOE
Path packsDirectory = platform.getDataFolder().toPath().resolve("metapacks");
Files.createDirectories(packsDirectory);
List failedLoads = new ArrayList<>();
- try(Stream packs = Files.list(packsDirectory)) {
- packs.forEach(path -> {
+ try(Stream paths = getMemberPaths(packsDirectory)) {
+ paths.forEach(path -> {
try {
MetaPack pack = new MetaPackImpl(path, platform, configRegistry);
registerChecked(pack.getRegistryKey(), pack);
@@ -59,4 +60,14 @@ public void loadAll(Platform platform, ConfigRegistry configRegistry) throws IOE
throw new PackLoadFailuresException(failedLoads);
}
}
+
+ @Override
+ public String getRegistryName() {
+ return "metaconfig";
+ }
+
+ @Override
+ public boolean validatePathIsMember(Path path) {
+ return Files.isDirectory(path) || path.getFileName().endsWith(".zip");
+ }
}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
index 1b33c55baa..f8e1ee3125 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 9128c7d428..8a848873f3 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionSha256Sum=845952a9d6afa783db70bb3b0effaae45ae5542ca2bb7929619e8af49cb634cf
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.1-bin.zip
+distributionSha256Sum=72f44c9f8ebcb1af43838f45ee5c4aa9c5444898b3468ab3f4af7b6076c5bc3f
+distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
diff --git a/gradlew b/gradlew
index 23d15a9367..adff685a03 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.
@@ -114,7 +114,6 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;;
esac
-CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
@@ -172,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" )
@@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
- -classpath "$CLASSPATH" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
diff --git a/gradlew.bat b/gradlew.bat
index db3a6ac207..c4bdd3ab8e 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -70,11 +70,10 @@ goto fail
:execute
@rem Setup the command line
-set CLASSPATH=
@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell
diff --git a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/NMSInitializer.java b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/NMSInitializer.java
index f15beea0a6..e1cee73ffa 100644
--- a/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/NMSInitializer.java
+++ b/platforms/bukkit/common/src/main/java/com/dfsek/terra/bukkit/NMSInitializer.java
@@ -9,7 +9,7 @@
public interface NMSInitializer {
- List SUPPORTED_VERSIONS = List.of("v1.21.9", "v1.21.10");
+ List SUPPORTED_VERSIONS = List.of("v1.21.11");
String MINECRAFT_VERSION = VersionUtil.getMinecraftVersionInfo().toString();
String TERRA_PACKAGE = NMSInitializer.class.getPackageName();
diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/AwfulBukkitHacks.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/AwfulBukkitHacks.java
index beea1c536d..310e4190f4 100644
--- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/AwfulBukkitHacks.java
+++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/AwfulBukkitHacks.java
@@ -7,10 +7,10 @@
import net.minecraft.core.MappedRegistry;
import net.minecraft.core.RegistrationInfo;
import net.minecraft.core.registries.Registries;
+import net.minecraft.resources.Identifier;
import net.minecraft.resources.ResourceKey;
-import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.TagKey;
-import net.minecraft.world.entity.npc.VillagerType;
+import net.minecraft.world.entity.npc.villager.VillagerType;
import net.minecraft.world.level.biome.Biome;
import org.bukkit.NamespacedKey;
import org.slf4j.Logger;
@@ -34,7 +34,7 @@
public class AwfulBukkitHacks {
private static final Logger LOGGER = LoggerFactory.getLogger(AwfulBukkitHacks.class);
- private static final Map> terraBiomeMap = new HashMap<>();
+ private static final Map> terraBiomeMap = new HashMap<>();
public static void registerBiomes(ConfigRegistry configRegistry) {
try {
@@ -50,7 +50,7 @@ public static void registerBiomes(ConfigRegistry configRegistry) {
BukkitPlatformBiome platformBiome = (BukkitPlatformBiome) biome.getPlatformBiome();
NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey();
- ResourceLocation vanillaMinecraftKey = ResourceLocation.fromNamespaceAndPath(vanillaBukkitKey.getNamespace(),
+ Identifier vanillaMinecraftKey = Identifier.fromNamespaceAndPath(vanillaBukkitKey.getNamespace(),
vanillaBukkitKey.getKey());
VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class);
@@ -58,7 +58,7 @@ public static void registerBiomes(ConfigRegistry configRegistry) {
Biome platform = NMSBiomeInjector.createBiome(biomeRegistry.get(vanillaMinecraftKey).orElseThrow().value(),
vanillaBiomeProperties);
- ResourceLocation delegateMinecraftKey = ResourceLocation.fromNamespaceAndPath("terra",
+ Identifier delegateMinecraftKey = Identifier.fromNamespaceAndPath("terra",
NMSBiomeInjector.createBiomeID(pack, key));
NamespacedKey delegateBukkitKey = NamespacedKey.fromString(delegateMinecraftKey.toString());
ResourceKey delegateKey = ResourceKey.create(Registries.BIOME, delegateMinecraftKey);
@@ -75,7 +75,7 @@ public static void registerBiomes(ConfigRegistry configRegistry) {
Objects.requireNonNullElse(vanillaBiomeProperties.getVillagerType(),
villagerMap.getOrDefault(delegateKey, VillagerType.PLAINS)));
- terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.location());
+ terraBiomeMap.computeIfAbsent(vanillaMinecraftKey, i -> new ArrayList<>()).add(delegateKey.identifier());
LOGGER.debug("Registered biome: " + delegateKey);
} catch(NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
@@ -100,8 +100,8 @@ public static void registerBiomes(ConfigRegistry configRegistry) {
tb -> NMSBiomeInjector.getEntry(biomeRegistry, tb).ifPresentOrElse(
terra -> {
LOGGER.debug("{} (vanilla for {}): {}",
- vanilla.unwrapKey().orElseThrow().location(),
- terra.unwrapKey().orElseThrow().location(),
+ vanilla.unwrapKey().orElseThrow().identifier(),
+ terra.unwrapKey().orElseThrow().identifier(),
vanilla.tags().toList());
vanilla.tags()
.forEach(tag -> collect
diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java
index fea134c9ef..5c3de74313 100644
--- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java
+++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/NMSBiomeInjector.java
@@ -2,7 +2,8 @@
import net.minecraft.core.Holder;
import net.minecraft.core.Registry;
-import net.minecraft.resources.ResourceLocation;
+import net.minecraft.resources.Identifier;
+import net.minecraft.world.attribute.EnvironmentAttributes;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.biome.BiomeGenerationSettings;
import net.minecraft.world.level.biome.BiomeSpecialEffects;
@@ -17,7 +18,7 @@
public class NMSBiomeInjector {
- public static Optional> getEntry(Registry registry, ResourceLocation identifier) {
+ public static Optional> getEntry(Registry registry, Identifier identifier) {
return registry.getOptional(identifier)
.flatMap(registry::getResourceKey)
.flatMap(registry::get);
@@ -29,55 +30,59 @@ public static Biome createBiome(Biome vanilla, VanillaBiomeProperties vanillaBio
BiomeSpecialEffects.Builder effects = new BiomeSpecialEffects.Builder();
- effects.fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor()))
- .waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor()))
- .waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor()))
- .skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor()))
+ // TODO: Migrate to EnvironmentAttributes
+// builder.setAttribute(EnvironmentAttributes.FOG_COLOR, Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getAttributes().get(EnvironmentAttributes.FOG_COLOR)))
+
+// effects.fogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getFogColor(), vanilla.getFogColor()));
+ effects.waterColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterColor(), vanilla.getWaterColor()))
+// .waterFogColor(Objects.requireNonNullElse(vanillaBiomeProperties.getWaterFogColor(), vanilla.getWaterFogColor()))
+// .skyColor(Objects.requireNonNullElse(vanillaBiomeProperties.getSkyColor(), vanilla.getSkyColor()))
.grassColorModifier(Objects.requireNonNullElse(vanillaBiomeProperties.getGrassColorModifier(),
- vanilla.getSpecialEffects().getGrassColorModifier()))
- .backgroundMusicVolume(Objects.requireNonNullElse(vanillaBiomeProperties.getMusicVolume(), vanilla.getBackgroundMusicVolume()));
+ vanilla.getSpecialEffects().grassColorModifier()));
+// .backgroundMusicVolume(Objects.requireNonNullElse(vanillaBiomeProperties.getMusicVolume(), vanilla.getBackgroundMusicVolume()));
if(vanillaBiomeProperties.getGrassColor() == null) {
- vanilla.getSpecialEffects().getGrassColorOverride().ifPresent(effects::grassColorOverride);
+ vanilla.getSpecialEffects().grassColorOverride().ifPresent(effects::grassColorOverride);
} else {
effects.grassColorOverride(vanillaBiomeProperties.getGrassColor());
}
if(vanillaBiomeProperties.getFoliageColor() == null) {
- vanilla.getSpecialEffects().getFoliageColorOverride().ifPresent(effects::foliageColorOverride);
+ vanilla.getSpecialEffects().foliageColorOverride().ifPresent(effects::foliageColorOverride);
} else {
effects.foliageColorOverride(vanillaBiomeProperties.getFoliageColor());
}
- if(vanillaBiomeProperties.getParticleConfig() == null) {
- vanilla.getSpecialEffects().getAmbientParticleSettings().ifPresent(effects::ambientParticle);
- } else {
- effects.ambientParticle(vanillaBiomeProperties.getParticleConfig());
- }
-
- if(vanillaBiomeProperties.getLoopSound() == null) {
- vanilla.getSpecialEffects().getAmbientLoopSoundEvent().ifPresent(effects::ambientLoopSound);
- } else {
- RegistryFetcher.soundEventRegistry().get(vanillaBiomeProperties.getLoopSound().location()).ifPresent(effects::ambientLoopSound);
- }
-
- if(vanillaBiomeProperties.getMoodSound() == null) {
- vanilla.getSpecialEffects().getAmbientMoodSettings().ifPresent(effects::ambientMoodSound);
- } else {
- effects.ambientMoodSound(vanillaBiomeProperties.getMoodSound());
- }
-
- if(vanillaBiomeProperties.getAdditionsSound() == null) {
- vanilla.getSpecialEffects().getAmbientAdditionsSettings().ifPresent(effects::ambientAdditionsSound);
- } else {
- effects.ambientAdditionsSound(vanillaBiomeProperties.getAdditionsSound());
- }
-
- if(vanillaBiomeProperties.getMusic() == null) {
- vanilla.getSpecialEffects().getBackgroundMusic().ifPresent(effects::backgroundMusic);
- } else {
- effects.backgroundMusic(vanillaBiomeProperties.getMusic());
- }
+ // TODO
+// if(vanillaBiomeProperties.getParticleConfig() == null) {
+// vanilla.getSpecialEffects().getAmbientParticleSettings().ifPresent(effects::ambientParticle);
+// } else {
+// effects.ambientParticle(vanillaBiomeProperties.getParticleConfig());
+// }
+
+// if(vanillaBiomeProperties.getLoopSound() == null) {
+// vanilla.getSpecialEffects().getAmbientLoopSoundEvent().ifPresent(effects::ambientLoopSound);
+// } else {
+// RegistryFetcher.soundEventRegistry().get(vanillaBiomeProperties.getLoopSound().location()).ifPresent(effects::ambientLoopSound);
+// }
+
+// if(vanillaBiomeProperties.getMoodSound() == null) {
+// vanilla.getSpecialEffects().getAmbientMoodSettings().ifPresent(effects::ambientMoodSound);
+// } else {
+// effects.ambientMoodSound(vanillaBiomeProperties.getMoodSound());
+// }
+//
+// if(vanillaBiomeProperties.getAdditionsSound() == null) {
+// vanilla.getSpecialEffects().getAmbientAdditionsSettings().ifPresent(effects::ambientAdditionsSound);
+// } else {
+// effects.ambientAdditionsSound(vanillaBiomeProperties.getAdditionsSound());
+// }
+//
+// if(vanillaBiomeProperties.getMusic() == null) {
+// vanilla.getSpecialEffects().getBackgroundMusic().ifPresent(effects::backgroundMusic);
+// } else {
+// effects.backgroundMusic(vanillaBiomeProperties.getMusic());
+// }
builder.hasPrecipitation(Objects.requireNonNullElse(vanillaBiomeProperties.getPrecipitation(), vanilla.hasPrecipitation()));
diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/NMSPlatform.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/NMSPlatform.java
index efbdde212d..c8b0c70364 100644
--- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/NMSPlatform.java
+++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/NMSPlatform.java
@@ -2,15 +2,15 @@
import com.dfsek.tectonic.api.TypeRegistry;
import com.dfsek.tectonic.api.exception.LoadException;
-import net.minecraft.resources.ResourceLocation;
+import net.minecraft.resources.Identifier;
import net.minecraft.sounds.Music;
import net.minecraft.sounds.SoundEvent;
+import net.minecraft.world.attribute.AmbientParticle;
import net.minecraft.world.entity.EntityType;
import net.minecraft.world.entity.MobCategory;
-import net.minecraft.world.entity.npc.VillagerType;
-import net.minecraft.world.level.biome.AmbientAdditionsSettings;
-import net.minecraft.world.level.biome.AmbientMoodSettings;
-import net.minecraft.world.level.biome.AmbientParticleSettings;
+import net.minecraft.world.attribute.AmbientAdditionsSettings;
+import net.minecraft.world.attribute.AmbientMoodSettings;
+import net.minecraft.world.entity.npc.villager.VillagerType;
import net.minecraft.world.level.biome.Biome.Precipitation;
import net.minecraft.world.level.biome.Biome.TemperatureModifier;
import net.minecraft.world.level.biome.BiomeSpecialEffects.GrassColorModifier;
@@ -52,8 +52,8 @@ public NMSPlatform(TerraBukkitPlugin plugin) {
public void register(TypeRegistry registry) {
super.register(registry);
registry.registerLoader(PlatformBiome.class, (type, o, loader, depthTracker) -> parseBiome((String) o, depthTracker))
- .registerLoader(ResourceLocation.class, (type, o, loader, depthTracker) -> {
- ResourceLocation identifier = ResourceLocation.tryParse((String) o);
+ .registerLoader(Identifier.class, (type, o, loader, depthTracker) -> {
+ Identifier identifier = Identifier.tryParse((String) o);
if(identifier == null)
throw new LoadException("Invalid identifier: " + o, depthTracker);
return identifier;
@@ -67,7 +67,7 @@ public void register(TypeRegistry registry) {
(type, o, loader, depthTracker) -> TemperatureModifier.valueOf(((String) o).toUpperCase(
Locale.ROOT)))
.registerLoader(MobCategory.class, (type, o, loader, depthTracker) -> MobCategory.valueOf((String) o))
- .registerLoader(AmbientParticleSettings.class, BiomeParticleConfigTemplate::new)
+ .registerLoader(AmbientParticle.class, BiomeParticleConfigTemplate::new)
.registerLoader(SoundEvent.class, SoundEventTemplate::new)
.registerLoader(AmbientMoodSettings.class, BiomeMoodSoundTemplate::new)
.registerLoader(AmbientAdditionsSettings.class, BiomeAdditionsSoundTemplate::new)
diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/Reflection.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/Reflection.java
index 3c0e93e67a..316c9ab8bf 100644
--- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/Reflection.java
+++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/Reflection.java
@@ -7,7 +7,7 @@
import net.minecraft.resources.ResourceKey;
import net.minecraft.server.level.ChunkMap;
import net.minecraft.tags.TagKey;
-import net.minecraft.world.entity.npc.VillagerType;
+import net.minecraft.world.entity.npc.villager.VillagerType;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.StructureManager;
import net.minecraft.world.level.biome.Biome;
diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/BiomeAdditionsSoundTemplate.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/BiomeAdditionsSoundTemplate.java
index 83ac758b2d..3e3286098f 100644
--- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/BiomeAdditionsSoundTemplate.java
+++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/BiomeAdditionsSoundTemplate.java
@@ -5,7 +5,7 @@
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.sounds.SoundEvent;
-import net.minecraft.world.level.biome.AmbientAdditionsSettings;
+import net.minecraft.world.attribute.AmbientAdditionsSettings;
public class BiomeAdditionsSoundTemplate implements ObjectTemplate {
diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/BiomeMoodSoundTemplate.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/BiomeMoodSoundTemplate.java
index 20f982920f..b7b774ae3c 100644
--- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/BiomeMoodSoundTemplate.java
+++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/BiomeMoodSoundTemplate.java
@@ -5,7 +5,7 @@
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.sounds.SoundEvent;
-import net.minecraft.world.level.biome.AmbientMoodSettings;
+import net.minecraft.world.attribute.AmbientMoodSettings;
public class BiomeMoodSoundTemplate implements ObjectTemplate {
diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/BiomeParticleConfigTemplate.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/BiomeParticleConfigTemplate.java
index 99fe0cda39..7c31521f2b 100644
--- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/BiomeParticleConfigTemplate.java
+++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/BiomeParticleConfigTemplate.java
@@ -8,12 +8,12 @@
import net.minecraft.commands.arguments.ParticleArgument;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.registries.BuiltInRegistries;
-import net.minecraft.world.level.biome.AmbientParticleSettings;
+import net.minecraft.world.attribute.AmbientParticle;
import java.util.stream.Stream;
-public class BiomeParticleConfigTemplate implements ObjectTemplate {
+public class BiomeParticleConfigTemplate implements ObjectTemplate {
@Value("particle")
@Default
private String particle = null;
@@ -23,13 +23,13 @@ public class BiomeParticleConfigTemplate implements ObjectTemplate> {
@Value("id")
@Default
- private ResourceLocation id = null;
+ private Identifier id = null;
@Override
public EntityType> get() {
diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/SoundEventTemplate.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/SoundEventTemplate.java
index 2535823611..4d7b7bddd1 100644
--- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/SoundEventTemplate.java
+++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/SoundEventTemplate.java
@@ -3,14 +3,14 @@
import com.dfsek.tectonic.api.config.template.annotations.Default;
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
-import net.minecraft.resources.ResourceLocation;
+import net.minecraft.resources.Identifier;
import net.minecraft.sounds.SoundEvent;
public class SoundEventTemplate implements ObjectTemplate {
@Value("id")
@Default
- private ResourceLocation id = null;
+ private Identifier id = null;
@Value("distance-to-travel")
@Default
diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/VanillaBiomeProperties.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/VanillaBiomeProperties.java
index 3cd1e992bb..c5637007de 100644
--- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/VanillaBiomeProperties.java
+++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/VanillaBiomeProperties.java
@@ -6,10 +6,10 @@
import net.minecraft.resources.ResourceKey;
import net.minecraft.sounds.Music;
import net.minecraft.sounds.SoundEvent;
-import net.minecraft.world.entity.npc.VillagerType;
-import net.minecraft.world.level.biome.AmbientAdditionsSettings;
-import net.minecraft.world.level.biome.AmbientMoodSettings;
-import net.minecraft.world.level.biome.AmbientParticleSettings;
+import net.minecraft.world.entity.npc.villager.VillagerType;
+import net.minecraft.world.attribute.AmbientAdditionsSettings;
+import net.minecraft.world.attribute.AmbientMoodSettings;
+import net.minecraft.world.attribute.AmbientParticle;
import net.minecraft.world.level.biome.Biome.TemperatureModifier;
import net.minecraft.world.level.biome.BiomeSpecialEffects.GrassColorModifier;
import net.minecraft.world.level.biome.MobSpawnSettings;
@@ -52,7 +52,7 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
@Value("particles")
@Default
- private AmbientParticleSettings particleConfig = null;
+ private AmbientParticle particleConfig = null;
@Value("climate.precipitation")
@Default
@@ -130,7 +130,7 @@ public GrassColorModifier getGrassColorModifier() {
return grassColorModifier;
}
- public AmbientParticleSettings getParticleConfig() {
+ public AmbientParticle getParticleConfig() {
return particleConfig;
}
diff --git a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/VillagerTypeTemplate.java b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/VillagerTypeTemplate.java
index c254628b8f..ab25b5011a 100644
--- a/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/VillagerTypeTemplate.java
+++ b/platforms/bukkit/nms/src/main/java/com/dfsek/terra/bukkit/nms/config/VillagerTypeTemplate.java
@@ -5,14 +5,14 @@
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceKey;
-import net.minecraft.resources.ResourceLocation;
-import net.minecraft.world.entity.npc.VillagerType;
+import net.minecraft.resources.Identifier;
+import net.minecraft.world.entity.npc.villager.VillagerType;
public class VillagerTypeTemplate implements ObjectTemplate> {
@Value("id")
@Default
- private ResourceLocation id = null;
+ private Identifier id = null;
@Override
public ResourceKey get() {
diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts
index 7e301083a7..c1a427cb33 100644
--- a/platforms/fabric/build.gradle.kts
+++ b/platforms/fabric/build.gradle.kts
@@ -1,7 +1,7 @@
import java.util.*
plugins {
- id("dev.architectury.loom") version Versions.Mod.architecuryLoom
+ id("dev.architectury.loom") version Versions.Mod.architecturyLoom
id("architectury-plugin") version Versions.Mod.architecturyPlugin
}
diff --git a/platforms/minestom/build.gradle.kts b/platforms/minestom/build.gradle.kts
index 694cedbd58..d3924c991e 100644
--- a/platforms/minestom/build.gradle.kts
+++ b/platforms/minestom/build.gradle.kts
@@ -9,3 +9,7 @@ dependencies {
tasks.named("jar") {
finalizedBy("installAddonsIntoDefaultJar")
}
+
+tasks.withType().configureEach {
+ options.release = 25
+}
\ No newline at end of file
diff --git a/platforms/minestom/example/build.gradle.kts b/platforms/minestom/example/build.gradle.kts
index 1cec6c60d5..8c465b7c96 100644
--- a/platforms/minestom/example/build.gradle.kts
+++ b/platforms/minestom/example/build.gradle.kts
@@ -20,6 +20,10 @@ tasks.withType {
}
}
+tasks.withType().configureEach {
+ options.release = 25
+}
+
application {
mainClass.set(javaMainClass)
}
diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java
index 810426f830..ba5d6bb66a 100644
--- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java
+++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java
@@ -7,6 +7,8 @@
import net.minestom.server.MinecraftServer;
import net.minestom.server.instance.Instance;
import net.minestom.server.sound.SoundEvent;
+import net.minestom.server.world.attribute.AmbientParticle;
+import net.minestom.server.world.attribute.AmbientSounds;
import net.minestom.server.world.biome.BiomeEffects;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -82,9 +84,9 @@ public void register(TypeRegistry registry) {
(TypeLoader) (annotatedType, o, configLoader, depthTracker) -> new MinestomEntityType((String) o))
.registerLoader(BlockState.class,
(TypeLoader) (annotatedType, o, configLoader, depthTracker) -> worldHandle.createBlockState((String) o))
- .registerLoader(BiomeEffects.Particle.class, BiomeParticleConfigTemplate::new)
- .registerLoader(BiomeEffects.MoodSound.class, BiomeMoodSoundTemplate::new)
- .registerLoader(BiomeEffects.AdditionsSound.class, BiomeAdditionsSoundTemplate::new)
+ .registerLoader(AmbientParticle.class, BiomeParticleConfigTemplate::new)
+ .registerLoader(AmbientSounds.Mood.class, BiomeMoodSoundTemplate::new)
+ .registerLoader(AmbientSounds.Additions.class, BiomeAdditionsSoundTemplate::new)
.registerLoader(SoundEvent.class, SoundEventTemplate::new);
}
diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomeFactory.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomeFactory.java
index 644350d494..29ea5b117f 100644
--- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomeFactory.java
+++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomeFactory.java
@@ -5,6 +5,7 @@
import net.minestom.server.color.Color;
import net.minestom.server.registry.DynamicRegistry;
import net.minestom.server.registry.RegistryKey;
+import net.minestom.server.world.attribute.EnvironmentAttribute;
import net.minestom.server.world.biome.Biome;
import net.minestom.server.world.biome.BiomeEffects;
import org.intellij.lang.annotations.Subst;
@@ -27,6 +28,11 @@ private static T mergeNullable(T first, T second) {
return first;
}
+ private static void applyAttributeIfNotNull(Biome.Builder biomeBuilder, EnvironmentAttribute attribute, T value) {
+ if (value == null) return;
+ biomeBuilder.setAttribute(attribute, value);
+ }
+
@Subst("value")
protected static String createBiomeID(ConfigPack pack, String biomeId) {
return pack.getID().toLowerCase() + "/" + biomeId.toLowerCase(Locale.ROOT);
@@ -41,32 +47,25 @@ public UserDefinedBiome create(ConfigPack pack, com.dfsek.terra.api.world.biome.
Key key = Key.key("terra", createBiomeID(pack, source.getID()));
BiomeEffects.Builder effectsBuilder = BiomeEffects.builder()
- .fogColor(mergeNullable(properties.getFogColor(), parentEffects.fogColor()))
- .skyColor(mergeNullable(properties.getSkyColor(), parentEffects.skyColor()))
.waterColor(mergeNullable(properties.getWaterColor(), parentEffects.waterColor()))
- .waterFogColor(mergeNullable(properties.getWaterFogColor(), parentEffects.waterFogColor()))
.foliageColor(mergeNullable(properties.getFoliageColor(), parentEffects.foliageColor()))
.grassColor(mergeNullable(properties.getGrassColor(), parentEffects.grassColor()))
- .grassColorModifier(mergeNullable(properties.getGrassColorModifier(), parentEffects.grassColorModifier()))
- .biomeParticle(mergeNullable(properties.getParticleConfig(), parentEffects.biomeParticle()))
- .ambientSound(mergeNullable(properties.getLoopSound(), parentEffects.ambientSound()))
- .moodSound(mergeNullable(properties.getMoodSound(), parentEffects.moodSound()))
- .additionsSound(mergeNullable(properties.getAdditionsSound(), parentEffects.additionsSound()))
- // TODO music
- .music(parentEffects.music())
- .musicVolume(parentEffects.musicVolume());
-
- if(effectsBuilder.build().equals(BiomeEffects.PLAINS_EFFECTS)) {
- effectsBuilder.fogColor(new Color(0xC0D8FE)); // circumvent a minestom bug
- }
+ .grassColorModifier(mergeNullable(properties.getGrassColorModifier(), parentEffects.grassColorModifier()));
- Biome target = Biome.builder()
+ Biome.Builder targetBuilder = Biome.builder()
.downfall(mergeNullable(properties.getDownfall(), parent.downfall()))
- .hasPrecipitation(mergeNullable(properties.getPrecipitation(), parent.hasPrecipitation()))
+ .precipitation(mergeNullable(properties.getPrecipitation(), parent.hasPrecipitation()))
.temperature(mergeNullable(properties.getTemperature(), parent.temperature()))
- .temperatureModifier(mergeNullable(properties.getTemperatureModifier(), parent.temperatureModifier()))
- .effects(effectsBuilder.build())
- .build();
+ .effects(effectsBuilder.build());
+
+ applyAttributeIfNotNull(targetBuilder, EnvironmentAttribute.FOG_COLOR, properties.getFogColor());
+ applyAttributeIfNotNull(targetBuilder, EnvironmentAttribute.SKY_COLOR, properties.getSkyColor());
+ applyAttributeIfNotNull(targetBuilder, EnvironmentAttribute.WATER_FOG_COLOR, properties.getWaterFogColor());
+ applyAttributeIfNotNull(targetBuilder, EnvironmentAttribute.AMBIENT_PARTICLES, properties.getParticleConfig());
+ applyAttributeIfNotNull(targetBuilder, EnvironmentAttribute.AMBIENT_SOUNDS, properties.getAmbientSoundConfig());
+ // TODO music
+
+ Biome target = targetBuilder.build();
RegistryKey registryKey = MinecraftServer.getBiomeRegistry().register(key, target);
return new UserDefinedBiome(key, registryKey, source.getID(), target);
diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeAdditionsSoundTemplate.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeAdditionsSoundTemplate.java
index 85e4499fc5..c5686688aa 100644
--- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeAdditionsSoundTemplate.java
+++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeAdditionsSoundTemplate.java
@@ -4,10 +4,11 @@
import com.dfsek.tectonic.api.config.template.annotations.Value;
import com.dfsek.tectonic.api.config.template.object.ObjectTemplate;
import net.minestom.server.sound.SoundEvent;
+import net.minestom.server.world.attribute.AmbientSounds;
import net.minestom.server.world.biome.BiomeEffects;
-public class BiomeAdditionsSoundTemplate implements ObjectTemplate {
+public class BiomeAdditionsSoundTemplate implements ObjectTemplate {
@Value("sound")
@Default
private SoundEvent sound = null;
@@ -17,8 +18,8 @@ public class BiomeAdditionsSoundTemplate implements ObjectTemplate {
+public class BiomeMoodSoundTemplate implements ObjectTemplate {
@Value("sound")
@Default
private SoundEvent sound = null;
@@ -25,9 +26,9 @@ public class BiomeMoodSoundTemplate implements ObjectTemplate {
+
+public class BiomeParticleConfigTemplate implements ObjectTemplate {
@Value("particle")
@Default
private String particle = null;
@@ -18,22 +23,44 @@ public class BiomeParticleConfigTemplate implements ObjectTemplate 1) {
- LoggerFactory.getLogger(BiomeParticleConfigTemplate.class).warn("Particle {} has additional data, particle will be ignored.",
- particle);
- return null;
+ int start = particle.indexOf("{");
+ String dataString = particle.substring(start);
+ parsedParticle = parseAdditionalParticleData(dataString, key);
+ if (parsedParticle == null) return null;
}
- return new BiomeEffects.Particle(
- probability,
- parsedParticle
+ return new AmbientParticle(
+ parsedParticle,
+ probability
);
}
+
+ private Particle parseAdditionalParticleData(String dataString, String key) {
+ CompoundBinaryTag nbt = null;
+ Particle parsedParticle;
+ try {
+ nbt = MinestomAdventure.NBT_CODEC.decode(dataString);
+ // transform minecraft:x{a:"b"} into {type:"minecraft:x", a:"b"} as described in Particle.CODEC
+ nbt = nbt.putString("type", key);
+ parsedParticle = Particle.CODEC.decode(Transcoder.NBT, nbt).orElseThrow();
+ } catch(Exception e) {
+ String nbtString = "null";
+ try {
+ nbtString = (nbt == null ? "null" : MinestomAdventure.NBT_CODEC.encode(nbt));
+ } catch(IOException _) { }
+ LoggerFactory.getLogger(BiomeParticleConfigTemplate.class).warn(
+ "Failed to decode particle from '" + particle + "', nbt: '" + nbtString + "'. This particle will be ignored.", e);
+ return null;
+ }
+ return parsedParticle;
+ }
}
diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/VanillaBiomeProperties.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/VanillaBiomeProperties.java
index 14b91b5c1e..7ba4ba47ec 100644
--- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/VanillaBiomeProperties.java
+++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/VanillaBiomeProperties.java
@@ -5,12 +5,16 @@
import com.dfsek.tectonic.api.config.template.annotations.Value;
import net.kyori.adventure.util.RGBLike;
import net.minestom.server.sound.SoundEvent;
+import net.minestom.server.world.attribute.AmbientParticle;
+import net.minestom.server.world.attribute.AmbientSounds;
import net.minestom.server.world.biome.Biome.TemperatureModifier;
import net.minestom.server.world.biome.BiomeEffects;
import net.minestom.server.world.biome.BiomeEffects.GrassColorModifier;
import com.dfsek.terra.api.properties.Properties;
+import java.util.List;
+
public class VanillaBiomeProperties implements ConfigTemplate, Properties {
@Value("colors.grass")
@@ -43,7 +47,7 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
@Value("particles")
@Default
- private BiomeEffects.Particle particleConfig = null;
+ private AmbientParticle particleConfig = null;
@Value("climate.precipitation")
@Default
@@ -67,11 +71,11 @@ public class VanillaBiomeProperties implements ConfigTemplate, Properties {
@Value("sound.mood-sound")
@Default
- private BiomeEffects.MoodSound moodSound = null;
+ private AmbientSounds.Mood moodSound = null;
@Value("sound.additions-sound")
@Default
- private BiomeEffects.AdditionsSound additionsSound = null;
+ private AmbientSounds.Additions additionsSound = null;
// @Value("sound.music")
// @Default
@@ -105,8 +109,9 @@ public GrassColorModifier getGrassColorModifier() {
return grassColorModifier;
}
- public BiomeEffects.Particle getParticleConfig() {
- return particleConfig;
+ public List getParticleConfig() {
+ if (particleConfig == null) return null;
+ return List.of(particleConfig);
}
public Boolean getPrecipitation() {
@@ -125,15 +130,12 @@ public Float getDownfall() {
return downfall;
}
- public SoundEvent getLoopSound() {
- return loopSound;
- }
-
- public BiomeEffects.MoodSound getMoodSound() {
- return moodSound;
- }
-
- public BiomeEffects.AdditionsSound getAdditionsSound() {
- return additionsSound;
+ public AmbientSounds getAmbientSoundConfig() {
+ List additions = additionsSound == null ? List.of() : List.of(additionsSound);
+ return new AmbientSounds(
+ loopSound,
+ moodSound,
+ additions
+ );
}
}
diff --git a/platforms/mixin-common/build.gradle.kts b/platforms/mixin-common/build.gradle.kts
index 2fb92233c6..97ed1768ed 100644
--- a/platforms/mixin-common/build.gradle.kts
+++ b/platforms/mixin-common/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("dev.architectury.loom") version Versions.Mod.architecuryLoom
+ id("dev.architectury.loom") version Versions.Mod.architecturyLoom
id("architectury-plugin") version Versions.Mod.architecturyPlugin
}
@@ -16,7 +16,7 @@ dependencies {
compileOnly("net.fabricmc:sponge-mixin:${Versions.Mod.mixin}")
annotationProcessor("net.fabricmc:sponge-mixin:${Versions.Mod.mixin}")
- annotationProcessor("dev.architectury:architectury-loom:${Versions.Mod.architecuryLoom}")
+ annotationProcessor("dev.architectury:architectury-loom:${Versions.Mod.architecturyLoom}")
minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}")
mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2")
diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java
index 262fbf8fef..7dbc696b5c 100644
--- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java
+++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/ModPlatform.java
@@ -14,11 +14,11 @@
import net.minecraft.sound.SoundEvent;
import net.minecraft.util.Identifier;
import net.minecraft.village.VillagerType;
+import net.minecraft.world.attribute.AmbientParticle;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.biome.Biome.Precipitation;
import net.minecraft.world.biome.Biome.TemperatureModifier;
import net.minecraft.world.biome.BiomeEffects.GrassColorModifier;
-import net.minecraft.world.biome.BiomeParticleConfig;
import net.minecraft.world.biome.SpawnSettings;
import net.minecraft.world.biome.source.MultiNoiseBiomeSourceParameterList;
import net.minecraft.world.dimension.DimensionType;
@@ -87,7 +87,7 @@ public void register(TypeRegistry registry) {
.registerLoader(TemperatureModifier.class,
(type, o, loader, depthTracker) -> TemperatureModifier.valueOf(((String) o).toUpperCase()))
.registerLoader(SpawnGroup.class, (type, o, loader, depthTracker) -> SpawnGroup.valueOf((String) o))
- .registerLoader(BiomeParticleConfig.class, BiomeParticleConfigTemplate::new)
+ .registerLoader(AmbientParticle.class, BiomeParticleConfigTemplate::new)
.registerLoader(SoundEvent.class, SoundEventTemplate::new)
.registerLoader(BiomeMoodSound.class, BiomeMoodSoundTemplate::new)
.registerLoader(BiomeAdditionsSound.class, BiomeAdditionsSoundTemplate::new)
diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeParticleConfigTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeParticleConfigTemplate.java
index ba2c4c1fb7..83774831b7 100644
--- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeParticleConfigTemplate.java
+++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/BiomeParticleConfigTemplate.java
@@ -8,12 +8,11 @@
import net.minecraft.command.argument.ParticleEffectArgumentType;
import net.minecraft.registry.Registries;
import net.minecraft.registry.RegistryWrapper;
-import net.minecraft.world.biome.BiomeParticleConfig;
-
+import net.minecraft.world.attribute.AmbientParticle;
import java.util.stream.Stream;
-public class BiomeParticleConfigTemplate implements ObjectTemplate {
+public class BiomeParticleConfigTemplate implements ObjectTemplate {
@Value("particle")
@Default
private String particle = null;
@@ -23,13 +22,13 @@ public class BiomeParticleConfigTemplate implements ObjectTemplate>> cir) {
if(flora != null) {
cir.setReturnValue(flora);
diff --git a/platforms/mixin-lifecycle/build.gradle.kts b/platforms/mixin-lifecycle/build.gradle.kts
index f93b86cbea..2663caf2f3 100644
--- a/platforms/mixin-lifecycle/build.gradle.kts
+++ b/platforms/mixin-lifecycle/build.gradle.kts
@@ -1,5 +1,5 @@
plugins {
- id("dev.architectury.loom") version Versions.Mod.architecuryLoom
+ id("dev.architectury.loom") version Versions.Mod.architecturyLoom
id("architectury-plugin") version Versions.Mod.architecturyPlugin
}
@@ -9,7 +9,7 @@ dependencies {
compileOnly("net.fabricmc:sponge-mixin:${Versions.Mod.mixin}")
compileOnly("io.github.llamalad7:mixinextras-common:${Versions.Mod.mixinExtras}")
annotationProcessor("net.fabricmc:sponge-mixin:${Versions.Mod.mixin}")
- annotationProcessor("dev.architectury:architectury-loom:${Versions.Mod.architecuryLoom}")
+ annotationProcessor("dev.architectury:architectury-loom:${Versions.Mod.architecturyLoom}")
implementation(project(path = ":platforms:mixin-common", configuration = "namedElements")) { isTransitive = false }