diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 4031a0aba..625ea1f4f 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -9,28 +9,27 @@ object Versions { const val strata = "1.3.2" const val cloud = "2.0.0" - const val cloudPaper = "2.0.0-beta.10" - const val cloudFabric = "2.0.0-beta.9" const val caffeine = "3.1.8" const val slf4j = "2.0.16" object Internal { - const val shadow = "8.3.1" + const val shadow = "8.3.3" const val apacheText = "1.12.0" - const val apacheIO = "2.16.1" - const val guava = "33.3.0-jre" - const val asm = "9.7" + const val apacheIO = "2.17.0" + const val guava = "33.3.1-jre" + const val asm = "9.7.1" const val snakeYml = "2.3" - const val jetBrainsAnnotations = "24.1.0" - const val junit = "5.11.0" + const val jetBrainsAnnotations = "26.0.1" + const val junit = "5.11.3" const val nbt = "6.1" } } object Fabric { - const val fabricAPI = "0.104.0+${Mod.minecraft}" + const val fabricAPI = "0.106.1+${Mod.minecraft}" + const val cloud = "2.0.0-beta.9" } // // object Quilt { @@ -41,12 +40,13 @@ object Versions { object Mod { const val mixin = "0.15.3+mixin.0.8.7" - const val minecraft = "1.21.1" - const val yarn = "$minecraft+build.3" - const val fabricLoader = "0.16.5" + const val minecraft = "1.21.3" + const val yarn = "$minecraft+build.2" + const val fabricLoader = "0.16.7" const val architecuryLoom = "1.7.413" const val architecturyPlugin = "3.4.159" + } // // object Forge { @@ -55,14 +55,15 @@ object Versions { // } object Bukkit { - const val minecraft = "1.21.1" - const val paperBuild = "$minecraft-R0.1-20240917.151311-80" + const val minecraft = "1.21.3" + const val paperBuild = "$minecraft-R0.1-20241025.163321-1" const val paper = paperBuild const val paperLib = "1.0.8" const val reflectionRemapper = "0.1.1" const val paperDevBundle = paperBuild const val runPaper = "2.3.1" const val paperWeight = "1.7.2" + const val cloud = "2.0.0-beta.10" } // diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java index 4349ae661..1deb75c93 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteFactory.java @@ -8,7 +8,6 @@ package com.dfsek.terra.addons.palette; import com.dfsek.terra.addons.palette.palette.PaletteImpl; -import com.dfsek.terra.addons.palette.palette.PaletteLayerHolder; import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.config.ConfigFactory; import com.dfsek.terra.api.world.chunk.generation.util.Palette; @@ -17,10 +16,6 @@ import com.dfsek.terra.api.world.chunk.generation.util.Palette; public class PaletteFactory implements ConfigFactory { @Override public Palette build(PaletteTemplate config, Platform platform) { - PaletteImpl palette = new PaletteImpl(config.getNoise()); - for(PaletteLayerHolder layer : config.getPalette()) { - palette.add(layer.getLayer(), layer.getSize(), layer.getSampler()); - } - return palette; + return new PaletteImpl(config.getPalette(), config.getDefaultSampler()); } } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteTemplate.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteTemplate.java index eb5f219bc..d2c966320 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteTemplate.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/PaletteTemplate.java @@ -23,7 +23,7 @@ import com.dfsek.terra.api.noise.NoiseSampler; public class PaletteTemplate implements AbstractableTemplate { @Value("sampler") @Default - private @Meta NoiseSampler noise = NoiseSampler.zero(); + private @Meta NoiseSampler defaultSampler = NoiseSampler.zero(); @Value("id") @Final @@ -40,7 +40,7 @@ public class PaletteTemplate implements AbstractableTemplate { return palette; } - public NoiseSampler getNoise() { - return noise; + public NoiseSampler getDefaultSampler() { + return defaultSampler; } } diff --git a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java index 96186f3d4..1eeaff73d 100644 --- a/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java +++ b/common/addons/config-palette/src/main/java/com/dfsek/terra/addons/palette/palette/PaletteImpl.java @@ -15,73 +15,45 @@ import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.world.chunk.generation.util.Palette; - /** * A class representation of a "slice" of the world. * Used to get a section of blocks, based on the depth at which they are found. */ public class PaletteImpl implements Palette { - private final List pallet = new ArrayList<>(); - private final NoiseSampler sampler; + private final PaletteLayer[] layers; - public PaletteImpl(NoiseSampler sampler) { - this.sampler = sampler; - } + public PaletteImpl(List layers, NoiseSampler defaultSampler) { + List layerArray = new ArrayList<>(); - public Palette add(ProbabilityCollection m, int layers, NoiseSampler sampler) { - for(int i = 0; i < layers; i++) { - pallet.add(new PaletteLayer(m, sampler)); + for (PaletteLayerHolder holder : layers) { + PaletteLayer layer; + ProbabilityCollection materials = holder.getLayer(); + NoiseSampler sampler = holder.getSampler() == null ? defaultSampler : holder.getSampler(); + layer = new PaletteLayer(materials, sampler); + for (int i = 0; i < holder.getSize(); i++) + layerArray.add(layer); } - return this; + + this.layers = layerArray.toArray(new PaletteLayer[0]); } @Override public BlockState get(int layer, double x, double y, double z, long seed) { - PaletteLayer paletteLayer; - if(layer > this.getSize()) paletteLayer = this.getLayers().get(this.getLayers().size() - 1); - else { - List pl = getLayers(); - if(layer >= pl.size()) paletteLayer = pl.get(pl.size() - 1); - else paletteLayer = pl.get(layer); - } - NoiseSampler paletteSampler = paletteLayer.getSampler(); - return paletteLayer.get(paletteSampler == null ? sampler : paletteSampler, x, y, z, seed); + int idx = layer < layers.length ? layer : layers.length - 1; + return layers[idx].get(x, y, z, seed); } - - public int getSize() { - return pallet.size(); - } - - public List getLayers() { - return pallet; - } - - /** - * Class representation of a layer of a BlockPalette. - */ - public static class PaletteLayer { + static class PaletteLayer { private final NoiseSampler sampler; private final ProbabilityCollection collection; - /** - * Constructs a PaletteLayerHolder with a ProbabilityCollection of materials and a number of layers. - * - * @param type The collection of materials to choose from. - * @param sampler Noise sampler to use - */ public PaletteLayer(ProbabilityCollection type, NoiseSampler sampler) { this.sampler = sampler; this.collection = type; } - public BlockState get(NoiseSampler random, double x, double y, double z, long seed) { - return this.collection.get(random, x, y, z, seed); + public BlockState get(double x, double y, double z, long seed) { + return this.collection.get(sampler, x, y, z, seed); } - - public NoiseSampler getSampler() { - return sampler; - } - } } diff --git a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java index 6a9e10bd0..0c0406bf3 100644 --- a/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java +++ b/common/implementation/base/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java @@ -43,23 +43,27 @@ public class ProbabilityCollectionLoader implements TypeLoader map = (Map) o; + if (map.size() == 1) { + Object onlyKey = map.keySet().iterator().next(); + return new ProbabilityCollection.Singleton<>(configLoader.loadType(generic, onlyKey, depthTracker)); + } for(Map.Entry entry : map.entrySet()) { collection.add(configLoader.loadType(generic, entry.getKey(), depthTracker.entry((String) entry.getKey())), configLoader.loadType(Integer.class, entry.getValue(), depthTracker.entry((String) entry.getKey()))); } } else if(o instanceof List) { - List> map = (List>) o; - if(map.size() == 1) { - Map entry = map.get(0); - if(entry.size() == 1) { - for(Object value : entry.keySet()) { + List> list = (List>) o; + if(list.size() == 1) { + Map map = list.getFirst(); + if(map.size() == 1) { + for(Object value : map.keySet()) { return new ProbabilityCollection.Singleton<>(configLoader.loadType(generic, value, depthTracker)); } } } - for(int i = 0; i < map.size(); i++) { - Map l = map.get(i); - for(Entry entry : l.entrySet()) { + for(int i = 0; i < list.size(); i++) { + Map map = list.get(i); + for(Entry entry : map.entrySet()) { if(entry.getValue() == null) throw new LoadException("No probability defined for entry \"" + entry.getKey() + "\"", depthTracker); Object val = configLoader.loadType(generic, entry.getKey(), depthTracker.index(i).entry((String) entry.getKey())); diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index e6441136f..a4b76b953 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 8e876e1c5..fb602ee2a 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=1541fa36599e12857140465f3c91a97409b4512501c26f9631fb113e392c5bd1 -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.1-bin.zip +distributionSha256Sum=31c55713e40233a8303827ceb42ca48a47267a0ad4bab9177123121e71524c26 +distributionUrl=https\://services.gradle.org/distributions/gradle-8.10.2-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index b740cf133..f5feea6d6 100755 --- a/gradlew +++ b/gradlew @@ -15,6 +15,8 @@ # See the License for the specific language governing permissions and # limitations under the License. # +# SPDX-License-Identifier: Apache-2.0 +# ############################################################################## # @@ -84,7 +86,8 @@ done # shellcheck disable=SC2034 APP_BASE_NAME=${0##*/} # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) -APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s +' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum diff --git a/gradlew.bat b/gradlew.bat index 25da30dbd..9d21a2183 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -13,6 +13,8 @@ @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 @rem ########################################################################## diff --git a/platforms/bukkit/common/build.gradle.kts b/platforms/bukkit/common/build.gradle.kts index eaf1956cb..fb3b1cc8f 100644 --- a/platforms/bukkit/common/build.gradle.kts +++ b/platforms/bukkit/common/build.gradle.kts @@ -11,5 +11,5 @@ dependencies { shadedApi("com.google.guava", "guava", Versions.Libraries.Internal.guava) - shadedApi("org.incendo", "cloud-paper", Versions.Libraries.cloudPaper) + shadedApi("org.incendo", "cloud-paper", Versions.Bukkit.cloud) } diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java index 42d683394..2523e534e 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/AwfulBukkitHacks.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Objects; import com.dfsek.terra.bukkit.world.BukkitPlatformBiome; import com.dfsek.terra.registry.master.ConfigRegistry; @@ -43,7 +42,7 @@ public class AwfulBukkitHacks { NamespacedKey vanillaBukkitKey = platformBiome.getHandle().getKey(); ResourceLocation vanillaMinecraftKey = ResourceLocation.fromNamespaceAndPath(vanillaBukkitKey.getNamespace(), vanillaBukkitKey.getKey()); - Biome platform = NMSBiomeInjector.createBiome(biome, Objects.requireNonNull(biomeRegistry.get(vanillaMinecraftKey))); + Biome platform = NMSBiomeInjector.createBiome(biome, biomeRegistry.get(vanillaMinecraftKey).orElseThrow().value()); ResourceKey delegateKey = ResourceKey.create( Registries.BIOME, @@ -70,7 +69,7 @@ public class AwfulBukkitHacks { .getTags() // streamKeysAndEntries .collect(HashMap::new, (map, pair) -> - map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())), + map.put(pair.key(), new ArrayList<>(Reflection.HOLDER_SET.invokeContents(pair).stream().toList())), HashMap::putAll); terraBiomeMap @@ -91,8 +90,8 @@ public class AwfulBukkitHacks { () -> LOGGER.error("No such biome: {}", tb))), () -> LOGGER.error("No vanilla biome: {}", vb))); - biomeRegistry.resetTags(); - biomeRegistry.bindTags(ImmutableMap.copyOf(collect)); + ((MappedRegistry) biomeRegistry).bindAllTagsToEmpty(); + ImmutableMap.copyOf(collect).forEach(biomeRegistry::bindTag); } catch(SecurityException | IllegalArgumentException exception) { throw new RuntimeException(exception); diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInjector.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInjector.java index e6d1f7869..8dea43a32 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInjector.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeInjector.java @@ -19,7 +19,7 @@ public class NMSBiomeInjector { public static Optional> getEntry(Registry registry, ResourceLocation identifier) { return registry.getOptional(identifier) .flatMap(registry::getResourceKey) - .flatMap(registry::getHolder); + .flatMap(registry::get); } public static Biome createBiome(com.dfsek.terra.api.world.biome.Biome biome, Biome vanilla) diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeProvider.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeProvider.java index 8abe26a51..ca2b0e8da 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeProvider.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSBiomeProvider.java @@ -29,7 +29,7 @@ public class NMSBiomeProvider extends BiomeSource { protected Stream> collectPossibleBiomes() { return delegate.stream() .map(biome -> RegistryFetcher.biomeRegistry() - .getHolderOrThrow(((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() + .getOrThrow(((BukkitPlatformBiome) biome.getPlatformBiome()).getContext() .get(NMSBiomeInfo.class) .biomeKey())); } @@ -45,7 +45,7 @@ public class NMSBiomeProvider extends BiomeSource { @Override public @NotNull Holder getNoiseBiome(int x, int y, int z, @NotNull Sampler sampler) { - return biomeRegistry.getHolderOrThrow(((BukkitPlatformBiome) delegate.getBiome(x << 2, y << 2, z << 2, seed) + return biomeRegistry.getOrThrow(((BukkitPlatformBiome) delegate.getBiome(x << 2, y << 2, z << 2, seed) .getPlatformBiome()).getContext() .get(NMSBiomeInfo.class) .biomeKey()); diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSChunkGeneratorDelegate.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSChunkGeneratorDelegate.java index 16097df27..fe4fa6a59 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSChunkGeneratorDelegate.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSChunkGeneratorDelegate.java @@ -15,7 +15,6 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Beardifier; import net.minecraft.world.level.levelgen.DensityFunction.SinglePointContext; -import net.minecraft.world.level.levelgen.GenerationStep.Carving; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.RandomState; import net.minecraft.world.level.levelgen.blending.Blender; @@ -59,7 +58,7 @@ public class NMSChunkGeneratorDelegate extends ChunkGenerator { @Override public void applyCarvers(@NotNull WorldGenRegion chunkRegion, long seed, @NotNull RandomState noiseConfig, @NotNull BiomeManager world, - @NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk, @NotNull Carving carverStep) { + @NotNull StructureManager structureAccessor, @NotNull ChunkAccess chunk) { // no-op } diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java index 927b019ed..9d73a9e98 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSInjectListener.java @@ -41,19 +41,15 @@ public class NMSInjectListener implements Listener { ChunkGenerator vanilla = serverWorld.getChunkSource().getGenerator(); NMSBiomeProvider provider = new NMSBiomeProvider(pack.getBiomeProvider(), craftWorld.getSeed()); ChunkMap chunkMap = serverWorld.getChunkSource().chunkMap; - WorldGenContext worldGenContext = chunkMap.worldGenContext; - - try { - ReflectionUtil.setFinalField(chunkMap, "worldGenContext", new WorldGenContext( - worldGenContext.level(), - new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()), - worldGenContext.structureManager(), - worldGenContext.lightEngine(), - worldGenContext.mainThreadMailBox() - )); - } catch(NoSuchFieldException e) { - throw new RuntimeException(e); - } + WorldGenContext worldGenContext = Reflection.CHUNKMAP.getWorldGenContext(chunkMap); + Reflection.CHUNKMAP.setWorldGenContext(chunkMap, new WorldGenContext( + worldGenContext.level(), + new NMSChunkGeneratorDelegate(vanilla, pack, provider, craftWorld.getSeed()), + worldGenContext.structureManager(), + worldGenContext.lightEngine(), + worldGenContext.mainThreadExecutor(), + worldGenContext.unsavedListener() + )); LOGGER.info("Successfully injected into world."); diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSWorldProperties.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSWorldProperties.java index 7860cf530..f0651cc54 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSWorldProperties.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/NMSWorldProperties.java @@ -26,11 +26,11 @@ public class NMSWorldProperties implements WorldProperties { @Override public int getMaxHeight() { - return height.getMaxBuildHeight(); + return height.getMaxY(); } @Override public int getMinHeight() { - return height.getMinBuildHeight(); + return height.getMinY(); } } diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/Reflection.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/Reflection.java index 57e1b8c9c..13078e94d 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/Reflection.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/Reflection.java @@ -2,9 +2,12 @@ package com.dfsek.terra.bukkit.nms.v1_21; import net.minecraft.core.Holder; import net.minecraft.core.Holder.Reference; +import net.minecraft.core.HolderSet; import net.minecraft.core.MappedRegistry; +import net.minecraft.server.level.ChunkMap; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.StructureManager; +import net.minecraft.world.level.chunk.status.WorldGenContext; import xyz.jpenilla.reflectionremapper.ReflectionRemapper; import xyz.jpenilla.reflectionremapper.proxy.ReflectionProxyFactory; import xyz.jpenilla.reflectionremapper.proxy.annotation.FieldGetter; @@ -12,6 +15,8 @@ import xyz.jpenilla.reflectionremapper.proxy.annotation.FieldSetter; import xyz.jpenilla.reflectionremapper.proxy.annotation.MethodName; import xyz.jpenilla.reflectionremapper.proxy.annotation.Proxies; +import java.util.List; + public class Reflection { public static final MappedRegistryProxy MAPPED_REGISTRY; @@ -19,6 +24,9 @@ public class Reflection { public static final ReferenceProxy REFERENCE; + public static final ChunkMapProxy CHUNKMAP; + public static final HolderSetProxy HOLDER_SET; + static { ReflectionRemapper reflectionRemapper = ReflectionRemapper.forReobfMappingsInPaperJar(); ReflectionProxyFactory reflectionProxyFactory = ReflectionProxyFactory.create(reflectionRemapper, @@ -27,6 +35,8 @@ public class Reflection { MAPPED_REGISTRY = reflectionProxyFactory.reflectionProxy(MappedRegistryProxy.class); STRUCTURE_MANAGER = reflectionProxyFactory.reflectionProxy(StructureManagerProxy.class); REFERENCE = reflectionProxyFactory.reflectionProxy(ReferenceProxy.class); + CHUNKMAP = reflectionProxyFactory.reflectionProxy(ChunkMapProxy.class); + HOLDER_SET = reflectionProxyFactory.reflectionProxy(HolderSetProxy.class); } @@ -49,4 +59,19 @@ public class Reflection { @MethodName("bindValue") void invokeBindValue(Reference instance, T value); } + + @Proxies(ChunkMap.class) + public interface ChunkMapProxy { + @FieldGetter("worldGenContext") + WorldGenContext getWorldGenContext(ChunkMap instance); + + @FieldSetter("worldGenContext") + void setWorldGenContext(ChunkMap instance, WorldGenContext worldGenContext); + } + + @Proxies(HolderSet.class) + public interface HolderSetProxy { + @MethodName("contents") + List> invokeContents(HolderSet instance); + } } diff --git a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/RegistryFetcher.java b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/RegistryFetcher.java index 0377eea0f..eecc28047 100644 --- a/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/RegistryFetcher.java +++ b/platforms/bukkit/nms/v1_21/src/main/java/com/dfsek/terra/bukkit/nms/v1_21/RegistryFetcher.java @@ -15,7 +15,9 @@ public class RegistryFetcher { DedicatedServer dedicatedserver = craftserver.getServer(); return dedicatedserver .registryAccess() - .registryOrThrow(key); + .get(key) + .orElseThrow() + .value(); } public static Registry biomeRegistry() { diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 631424699..ce627df4f 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -26,8 +26,8 @@ dependencies { modImplementation("net.fabricmc:fabric-loader:${Versions.Mod.fabricLoader}") - modImplementation("org.incendo", "cloud-fabric", Versions.Libraries.cloudFabric) - include("org.incendo", "cloud-fabric", Versions.Libraries.cloudFabric) + modImplementation("org.incendo", "cloud-fabric", Versions.Fabric.cloud) + include("org.incendo", "cloud-fabric", Versions.Fabric.cloud) modRuntimeOnly("net.fabricmc.fabric-api", "fabric-api", Versions.Fabric.fabricAPI) } diff --git a/platforms/fabric/src/main/resources/fabric.mod.json b/platforms/fabric/src/main/resources/fabric.mod.json index 592d4021a..4a70bb873 100644 --- a/platforms/fabric/src/main/resources/fabric.mod.json +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -32,9 +32,9 @@ "terra.common.mixins.json" ], "depends": { - "fabricloader": ">=0.16.5", + "fabricloader": ">=0.16.7", "java": ">=21", - "minecraft": ">=1.21.1", + "minecraft": ">=1.21.3", "fabric": "*" } } \ No newline at end of file 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 457566444..8962f585f 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 @@ -29,7 +29,7 @@ public class BiomeParticleConfigTemplate implements ObjectTemplate> { @Override public EntityType get() { - return Registries.ENTITY_TYPE.get(id); + return Registries.ENTITY_TYPE.getEntry(id).orElseThrow().value(); } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java index 68e7a518f..b4b95416e 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/config/VillagerTypeTemplate.java @@ -15,6 +15,6 @@ public class VillagerTypeTemplate implements ObjectTemplate { @Override public VillagerType get() { - return Registries.VILLAGER_TYPE.get(id); + return Registries.VILLAGER_TYPE.getEntry(id).orElseThrow().value(); } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java index 5f311b99b..026758996 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/generation/MinecraftChunkGeneratorWrapper.java @@ -35,7 +35,6 @@ import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeAccess; import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.GenerationStep.Carver; import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.gen.StructureWeightSampler; import net.minecraft.world.gen.chunk.Blender; @@ -97,7 +96,7 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun public void populateEntities(ChunkRegion region) { if(this.settings.mobGeneration()) { ChunkPos chunkPos = region.getCenterPos(); - RegistryEntry registryEntry = region.getBiome(chunkPos.getStartPos().withY(region.getTopY() - 1)); + RegistryEntry registryEntry = region.getBiome(chunkPos.getStartPos().withY(region.getTopYInclusive() - 1)); ChunkRandom chunkRandom = new ChunkRandom(new CheckedRandom(RandomSeed.getSeed())); chunkRandom.setPopulationSeed(region.getSeed(), chunkPos.getStartX(), chunkPos.getStartZ()); SpawnHelper.populateEntities(region, registryEntry, chunkPos, chunkRandom); @@ -183,7 +182,7 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun WorldProperties properties = MinecraftAdapter.adapt(height, SeedHack.getSeed(noiseConfig.getMultiNoiseSampler())); BiomeProvider biomeProvider = pack.getBiomeProvider(); int min = height.getBottomY(); - for(int y = height.getTopY() - 1; y >= min; y--) { + for(int y = height.getTopYInclusive() - 1; y >= min; y--) { if(heightmap .getBlockPredicate() .test((BlockState) delegate.getBlock(properties, x, y, z, biomeProvider))) return y + 1; @@ -196,14 +195,14 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun BlockState[] array = new BlockState[height.getHeight()]; WorldProperties properties = MinecraftAdapter.adapt(height, SeedHack.getSeed(noiseConfig.getMultiNoiseSampler())); BiomeProvider biomeProvider = pack.getBiomeProvider(); - for(int y = height.getTopY() - 1; y >= height.getBottomY(); y--) { + for(int y = height.getTopYInclusive() - 1; y >= height.getBottomY(); y--) { array[y - height.getBottomY()] = (BlockState) delegate.getBlock(properties, x, y, z, biomeProvider); } return new VerticalBlockSample(height.getBottomY(), array); } @Override - public void getDebugHudText(List text, NoiseConfig noiseConfig, BlockPos pos) { + public void appendDebugHudText(List text, NoiseConfig noiseConfig, BlockPos pos) { // no op } @@ -219,10 +218,11 @@ public class MinecraftChunkGeneratorWrapper extends net.minecraft.world.gen.chun logger.debug("Loading world with config pack {}", pack.getID()); } + @Override - public void carve(ChunkRegion chunkRegion, long seed, NoiseConfig noiseConfig, BiomeAccess world, StructureAccessor structureAccessor, - Chunk chunk, Carver carverStep) { - // no op + public void carve(ChunkRegion chunkRegion, long seed, NoiseConfig noiseConfig, BiomeAccess biomeAccess, + StructureAccessor structureAccessor, Chunk chunk) { + //no op } @Override diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftItemHandle.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftItemHandle.java index c9ef02f37..5c34eb82c 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftItemHandle.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftItemHandle.java @@ -24,6 +24,7 @@ import net.minecraft.command.argument.ItemStackArgumentType; import net.minecraft.registry.Registry; import net.minecraft.registry.RegistryKey; import net.minecraft.registry.RegistryWrapper.Impl; +import net.minecraft.resource.featuretoggle.FeatureSet; import net.minecraft.util.Identifier; import java.util.Optional; @@ -43,14 +44,19 @@ public class MinecraftItemHandle implements ItemHandle { public Item createItem(String data) { try { return (Item) new ItemStackArgumentType(new CommandRegistryAccess() { + @Override + public FeatureSet getEnabledFeatures() { + return FeatureSet.empty(); + } + @Override public Stream>> streamAllRegistryKeys() { return CommonPlatform.get().getServer().getRegistryManager().streamAllRegistryKeys(); } @Override - public Optional> getOptionalWrapper(RegistryKey> registryRef) { - return Optional.of(CommonPlatform.get().getServer().getRegistryManager().getWrapperOrThrow(registryRef)); + public Optional> getOptional(RegistryKey> registryRef) { + return Optional.of(CommonPlatform.get().getServer().getRegistryManager().getOrThrow(registryRef)); } }).parse(new StringReader(data)).getItem(); } catch(CommandSyntaxException e) { @@ -60,7 +66,7 @@ public class MinecraftItemHandle implements ItemHandle { @Override public Enchantment getEnchantment(String id) { - return (Enchantment) (Object) (CommonPlatform.get().enchantmentRegistry().get(Identifier.tryParse(id))); + return (Enchantment) (Object) (CommonPlatform.get().enchantmentRegistry().getEntry(Identifier.tryParse(id))); } @Override diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java index 9b5d1738b..183b2e379 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/handle/MinecraftWorldHandle.java @@ -41,7 +41,7 @@ public class MinecraftWorldHandle implements WorldHandle { @Override public @NotNull BlockState createBlockState(@NotNull String data) { try { - net.minecraft.block.BlockState state = BlockArgumentParser.block(Registries.BLOCK.getReadOnlyWrapper(), data, true) + net.minecraft.block.BlockState state = BlockArgumentParser.block(Registries.BLOCK, data, true) .blockState(); if(state == null) throw new IllegalArgumentException("Invalid data: " + data); return (BlockState) state; @@ -60,6 +60,6 @@ public class MinecraftWorldHandle implements WorldHandle { if(!id.contains(":")) throw new IllegalArgumentException("Invalid entity identifier " + id); Identifier identifier = Identifier.tryParse(id); if(identifier == null) identifier = Identifier.tryParse(id); - return (EntityType) Registries.ENTITY_TYPE.get(identifier); + return (EntityType) Registries.ENTITY_TYPE.getEntry(identifier).orElseThrow().value(); } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java index 15e8fab34..5900bbb8f 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/entity/MobSpawnerBlockEntityMixin.java @@ -54,8 +54,8 @@ public abstract class MobSpawnerBlockEntityMixin extends BlockEntity { public abstract void setEntityType(net.minecraft.entity.EntityType entityType, Random random); public EntityType terra$getSpawnedType() { - return (EntityType) Registries.ENTITY_TYPE.get( - Identifier.tryParse(((MobSpawnerLogicAccessor) getLogic()).getSpawnEntry().getNbt().getString("id"))); + return (EntityType) Registries.ENTITY_TYPE.getEntry( + Identifier.tryParse(((MobSpawnerLogicAccessor) getLogic()).getSpawnEntry().getNbt().getString("id"))).orElseThrow(); } public void terra$setSpawnedType(@NotNull EntityType creatureType) { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/PropertyMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/PropertyMixin.java index 4cb1b4858..33f75afe6 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/PropertyMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/block/state/PropertyMixin.java @@ -9,6 +9,7 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import java.util.Collection; +import java.util.List; import com.dfsek.terra.api.block.state.properties.Property; @@ -24,7 +25,7 @@ public abstract class PropertyMixin { private String name; @Shadow - public abstract Collection getValues(); + public abstract List getValues(); @Intrinsic public Collection terra$values() { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java index 005822f69..1fa3d19b3 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/WorldChunkMixin.java @@ -49,9 +49,6 @@ public abstract class WorldChunkMixin { @Nullable public abstract net.minecraft.block.BlockState setBlockState(BlockPos pos, net.minecraft.block.BlockState state, boolean moved); - @Shadow - public abstract TickSchedulers getTickSchedulers(); - public void terra$setBlock(int x, int y, int z, BlockState data, boolean physics) { BlockPos blockPos = new BlockPos(x, y, z); setBlockState(blockPos, (net.minecraft.block.BlockState) data, false); diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/data/ProtoChunkMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/data/ProtoChunkMixin.java index b9a6dd14c..5e5403834 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/data/ProtoChunkMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/chunk/data/ProtoChunkMixin.java @@ -48,6 +48,6 @@ public abstract class ProtoChunkMixin { } public int terra$getMaxHeight() { - return getHeightLimitView().getTopY(); + return getHeightLimitView().getTopYInclusive(); } } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java index 76121f64b..7837c626a 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/inventory/item/ItemStackMixin.java @@ -19,7 +19,7 @@ package com.dfsek.terra.mod.mixin.implementations.terra.inventory.item; import net.minecraft.component.ComponentChanges; import net.minecraft.component.ComponentMap; -import net.minecraft.component.ComponentMapImpl; +import net.minecraft.component.MergedComponentMap; import net.minecraft.item.ItemStack; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Implements; @@ -37,7 +37,7 @@ import com.dfsek.terra.api.inventory.item.ItemMeta; public abstract class ItemStackMixin { @Shadow @Final - private ComponentMapImpl components; + private MergedComponentMap components; @Shadow public abstract int getCount(); diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java index 70a62ae79..b0ca554a3 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ChunkRegionMixin.java @@ -18,6 +18,7 @@ package com.dfsek.terra.mod.mixin.implementations.terra.world; import net.minecraft.block.FluidBlock; +import net.minecraft.entity.SpawnReason; import net.minecraft.fluid.Fluid; import net.minecraft.util.collection.BoundedRegionArray; import net.minecraft.util.math.BlockPos; @@ -99,7 +100,7 @@ public abstract class ChunkRegionMixin { } public int terraWorld$getMaxHeight() { - return world.getTopY(); + return world.getTopYInclusive(); } @Intrinsic(displace = true) @@ -125,7 +126,7 @@ public abstract class ChunkRegionMixin { } public Entity terraWorld$spawnEntity(double x, double y, double z, EntityType entityType) { - net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(world); + net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(world, SpawnReason.CHUNK_GENERATION); entity.setPos(x, y, z); ((ChunkRegion) (Object) this).spawnEntity(entity); return (Entity) entity; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java index f9a5bd1ea..d618ee656 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/implementations/terra/world/ServerWorldMixin.java @@ -17,6 +17,7 @@ package com.dfsek.terra.mod.mixin.implementations.terra.world; +import net.minecraft.entity.SpawnReason; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; import org.spongepowered.asm.mixin.Implements; @@ -42,7 +43,7 @@ import com.dfsek.terra.mod.util.MinecraftUtil; @Implements(@Interface(iface = ServerWorld.class, prefix = "terra$")) public abstract class ServerWorldMixin { public Entity terra$spawnEntity(double x, double y, double z, EntityType entityType) { - net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(null); + net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType) entityType).create(null, SpawnReason.CHUNK_GENERATION); entity.setPos(x, y, z); ((net.minecraft.server.world.ServerWorld) (Object) this).spawnEntity(entity); return (Entity) entity; diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/DataPackContentsMixin.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/DataPackContentsMixin.java index 680c1833c..0fa4006cc 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/DataPackContentsMixin.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/mixin/lifecycle/DataPackContentsMixin.java @@ -1,10 +1,16 @@ package com.dfsek.terra.mod.mixin.lifecycle; +import net.minecraft.registry.CombinedDynamicRegistries; import net.minecraft.registry.DynamicRegistryManager; import net.minecraft.registry.Registry; +import net.minecraft.registry.Registry.PendingTagLoad; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.ReloadableRegistries; +import net.minecraft.registry.ServerDynamicRegistryType; +import net.minecraft.resource.ResourceManager; +import net.minecraft.resource.featuretoggle.FeatureSet; import net.minecraft.server.DataPackContents; +import net.minecraft.server.command.CommandManager; import net.minecraft.world.biome.Biome; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -16,6 +22,12 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.dfsek.terra.mod.util.MinecraftUtil; import com.dfsek.terra.mod.util.TagUtil; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + @Mixin(DataPackContents.class) public class DataPackContentsMixin { @@ -26,12 +38,17 @@ public class DataPackContentsMixin { /* * #refresh populates all tags in the registries */ - @Inject(method = "refresh()V", at = @At("RETURN")) - private void injectReload(CallbackInfo ci) { - DynamicRegistryManager.Immutable dynamicRegistryManager = this.reloadableRegistries.getRegistryManager(); - TagUtil.registerWorldPresetTags(dynamicRegistryManager.get(RegistryKeys.WORLD_PRESET)); + @Inject(method = "reload(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/CombinedDynamicRegistries;Ljava/util/List;Lnet/minecraft/resource/featuretoggle/FeatureSet;Lnet/minecraft/server/command/CommandManager$RegistrationEnvironment;ILjava/util/concurrent/Executor;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;", at = @At("RETURN")) + private static void injectReload(ResourceManager resourceManager, + CombinedDynamicRegistries dynamicRegistries, + List> pendingTagLoads, FeatureSet enabledFeatures, + CommandManager.RegistrationEnvironment environment, int functionPermissionLevel, + Executor prepareExecutor, + Executor applyExecutor, CallbackInfoReturnable> cir) { + DynamicRegistryManager.Immutable dynamicRegistryManager = dynamicRegistries.getCombinedRegistryManager(); + TagUtil.registerWorldPresetTags(dynamicRegistryManager.getOrThrow(RegistryKeys.WORLD_PRESET)); - Registry biomeRegistry = dynamicRegistryManager.get(RegistryKeys.BIOME); + Registry biomeRegistry = dynamicRegistryManager.getOrThrow(RegistryKeys.BIOME); TagUtil.registerBiomeTags(biomeRegistry); MinecraftUtil.registerFlora(biomeRegistry); } diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java index b0fdb9564..ecde18087 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftAdapter.java @@ -42,7 +42,7 @@ public final class MinecraftAdapter { @Override public int getMaxHeight() { - return height.getTopY(); + return height.getTopYInclusive(); } @Override diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java index 64376ddde..544d819ad 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/MinecraftUtil.java @@ -54,9 +54,8 @@ public final class MinecraftUtil { } public static Optional> getEntry(Registry registry, Identifier identifier) { - return registry.getOrEmpty(identifier) - .flatMap(registry::getKey) - .flatMap(registry::getEntry); + return registry.getOptionalValue(identifier) + .flatMap(id -> Optional.ofNullable(registry.getEntry(id))); } public static BlockEntity createState(WorldAccess worldAccess, BlockPos pos) { diff --git a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java index 2324e14ee..b172878a8 100644 --- a/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java +++ b/platforms/mixin-common/src/main/java/com/dfsek/terra/mod/util/TagUtil.java @@ -1,8 +1,8 @@ package com.dfsek.terra.mod.util; -import com.google.common.collect.ImmutableMap; import net.minecraft.registry.Registry; import net.minecraft.registry.entry.RegistryEntry; +import net.minecraft.registry.tag.TagGroupLoader.RegistryTags; import net.minecraft.registry.tag.TagKey; import net.minecraft.registry.tag.WorldPresetTags; import net.minecraft.world.biome.Biome; @@ -14,6 +14,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public final class TagUtil { @@ -24,12 +25,9 @@ public final class TagUtil { } private static Map, List>> tagsToMutableMap(Registry registry) { - return registry - .streamTagsAndEntries() - .collect(HashMap::new, - (map, pair) -> - map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())), - HashMap::putAll); + return registry.streamTags().collect(HashMap::new, + (map, tag) -> map.put(tag.getTag(), tag.stream().collect(Collectors.toList())), + HashMap::putAll); } public static void registerWorldPresetTags(Registry registry) { @@ -46,8 +44,14 @@ public final class TagUtil { .add(preset), () -> logger.error("Preset {} does not exist!", id))); - registry.clearTags(); - registry.populateTags(ImmutableMap.copyOf(collect)); + registry.startTagReload(new RegistryTags<>(registry.getKey(), collect)).apply(); + + if(logger.isDebugEnabled()) { + registry.streamEntries() + .map(e -> e.registryKey().getValue() + ": " + + e.streamTags().reduce("", (s, t) -> t.id() + ", " + s, String::concat)) + .forEach(logger::debug); + } } public static void registerBiomeTags(Registry registry) { @@ -90,8 +94,7 @@ public final class TagUtil { tb))), () -> logger.error("No vanilla biome: {}", vb))); - registry.clearTags(); - registry.populateTags(ImmutableMap.copyOf(collect)); + registry.startTagReload(new RegistryTags<>(registry.getKey(), collect)).apply(); if(logger.isDebugEnabled()) { registry.streamEntries() diff --git a/platforms/mixin-lifecycle/build.gradle.kts b/platforms/mixin-lifecycle/build.gradle.kts index b7d209b7f..35461fc0a 100644 --- a/platforms/mixin-lifecycle/build.gradle.kts +++ b/platforms/mixin-lifecycle/build.gradle.kts @@ -15,7 +15,7 @@ dependencies { minecraft("com.mojang:minecraft:${Versions.Mod.minecraft}") mappings("net.fabricmc:yarn:${Versions.Mod.yarn}:v2") - modImplementation("org.incendo", "cloud-fabric", Versions.Libraries.cloudFabric) { + modImplementation("org.incendo", "cloud-fabric", Versions.Fabric.cloud) { exclude("net.fabricmc") exclude("net.fabricmc.fabric-api") } diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java index 02ba806a0..56462c4ea 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/LifecyclePlatform.java @@ -86,7 +86,7 @@ public abstract class LifecyclePlatform extends ModPlatform { boolean succeed = loadConfigPacks(); if(server != null) { - BiomeUtil.registerBiomes(server.getRegistryManager().get(RegistryKeys.BIOME)); + BiomeUtil.registerBiomes(server.getRegistryManager().getOrThrow(RegistryKeys.BIOME)); server.reloadResources(server.getDataPackManager().getEnabledIds()).exceptionally(throwable -> { LOGGER.warn("Failed to execute reload", throwable); return null; diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/CreateWorldScreenMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/CreateWorldScreenMixin.java new file mode 100644 index 000000000..61f385939 --- /dev/null +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/CreateWorldScreenMixin.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.lifecycle.mixin.lifecycle; + + +import com.dfsek.terra.api.Platform; + +import com.dfsek.terra.mod.CommonPlatform; + +import com.dfsek.terra.mod.ModPlatform; + +import net.minecraft.client.gui.screen.world.CreateWorldScreen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import static com.dfsek.terra.lifecycle.util.LifecycleUtil.initialized; + + +@Mixin(CreateWorldScreen.class) +public class CreateWorldScreenMixin { + @Inject(method = "onCloseScreen()V", at = @At("HEAD")) + public void onClose(CallbackInfo ci) { + ModPlatform platform = CommonPlatform.get(); + platform.getRawConfigRegistry().clear(); + initialized = false; + } +} diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java index 0f04c0963..2526079ed 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/MinecraftServerMixin.java @@ -1,5 +1,8 @@ package com.dfsek.terra.lifecycle.mixin.lifecycle; +import com.dfsek.terra.mod.CommonPlatform; +import com.dfsek.terra.mod.ModPlatform; + import com.mojang.datafixers.DataFixer; import net.minecraft.resource.ResourcePackManager; import net.minecraft.server.MinecraftServer; @@ -34,6 +37,8 @@ public class MinecraftServerMixin { @Inject(method = "shutdown()V", at = @At("RETURN")) private void injectShutdown(CallbackInfo ci) { + ModPlatform platform = CommonPlatform.get(); + platform.getRawConfigRegistry().clear(); initialized = false; } } diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java index 739c084f3..c04e0fad7 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/RegistryLoaderMixin.java @@ -39,8 +39,7 @@ public class RegistryLoaderMixin { private static Logger LOGGER; @Redirect( - method = "load(Lnet/minecraft/registry/RegistryLoader$RegistryLoadable;Lnet/minecraft/registry/DynamicRegistryManager;" + - "Ljava/util/List;)Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", + method = "load(Lnet/minecraft/registry/RegistryLoader$RegistryLoadable;Ljava/util/List;Ljava/util/List;)Lnet/minecraft/registry/DynamicRegistryManager$Immutable;", at = @At( value = "INVOKE", target = "Ljava/util/List;forEach(Ljava/util/function/Consumer;)V", diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java index 89490ef41..98aa4d27f 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/mixin/lifecycle/SaveLoadingMixin.java @@ -1,7 +1,8 @@ package com.dfsek.terra.lifecycle.mixin.lifecycle; -import net.minecraft.registry.DynamicRegistryManager; +import net.minecraft.registry.CombinedDynamicRegistries; import net.minecraft.registry.RegistryKeys; +import net.minecraft.registry.ServerDynamicRegistryType; import net.minecraft.server.SaveLoading; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -18,13 +19,11 @@ public class SaveLoadingMixin { "Ljava/util/concurrent/CompletableFuture;", at = @At( value = "INVOKE", - target = "Lnet/minecraft/registry/RegistryLoader;loadFromResource(Lnet/minecraft/resource/ResourceManager;" + - "Lnet/minecraft/registry/DynamicRegistryManager;Ljava/util/List;)" + - "Lnet/minecraft/registry/DynamicRegistryManager$Immutable;"), + target = "Lnet/minecraft/server/DataPackContents;reload(Lnet/minecraft/resource/ResourceManager;Lnet/minecraft/registry/CombinedDynamicRegistries;Ljava/util/List;Lnet/minecraft/resource/featuretoggle/FeatureSet;Lnet/minecraft/server/command/CommandManager$RegistrationEnvironment;ILjava/util/concurrent/Executor;Ljava/util/concurrent/Executor;)Ljava/util/concurrent/CompletableFuture;"), index = 1 ) - private static DynamicRegistryManager grabManager(DynamicRegistryManager registryManager) { - MinecraftUtil.registerFlora(registryManager.get(RegistryKeys.BIOME)); - return registryManager; + private static CombinedDynamicRegistries grabManager(CombinedDynamicRegistries dynamicRegistries) { + MinecraftUtil.registerFlora(dynamicRegistries.getCombinedRegistryManager().getOrThrow(RegistryKeys.BIOME)); + return dynamicRegistries; } } diff --git a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java index 77ac6447c..97b6db4b9 100644 --- a/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java +++ b/platforms/mixin-lifecycle/src/main/java/com/dfsek/terra/lifecycle/util/BiomeUtil.java @@ -51,7 +51,7 @@ public final class BiomeUtil { if(pack.getContext().get(PreLoadCompatibilityOptions.class).useVanillaBiomes()) { - ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(registry.getEntry(vanilla).orElseThrow()); + ((ProtoPlatformBiome) biome.getPlatformBiome()).setDelegate(registry.getEntry(registry.get(vanilla))); } else { VanillaBiomeProperties vanillaBiomeProperties = biome.getContext().get(VanillaBiomeProperties.class); diff --git a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json index 2e4708bd4..0646899cf 100644 --- a/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json +++ b/platforms/mixin-lifecycle/src/main/resources/terra.lifecycle.mixins.json @@ -1,23 +1,24 @@ { - "required": true, - "minVersion": "0.8", - "package": "com.dfsek.terra.lifecycle.mixin", - "compatibilityLevel": "JAVA_21", - "mixins": [ - "NoiseConfigMixin", - "RegistryEntryReferenceInvoker", - "RegistryMixin", - "SimpleRegistryMixin", - "lifecycle.MinecraftServerMixin", - "lifecycle.RegistryLoaderMixin", - "lifecycle.SaveLoadingMixin" - ], - "client": [ - ], - "server": [ - ], - "injectors": { - "defaultRequire": 1 - }, - "refmap": "terra.lifecycle.refmap.json" + "required": true, + "minVersion": "0.8", + "package": "com.dfsek.terra.lifecycle.mixin", + "compatibilityLevel": "JAVA_21", + "mixins": [ + "NoiseConfigMixin", + "RegistryEntryReferenceInvoker", + "RegistryMixin", + "SimpleRegistryMixin", + "lifecycle.MinecraftServerMixin", + "lifecycle.RegistryLoaderMixin", + "lifecycle.SaveLoadingMixin" + ], + "client": [ + "lifecycle.CreateWorldScreenMixin" + ], + "server": [ + ], + "injectors": { + "defaultRequire": 1 + }, + "refmap": "terra.lifecycle.refmap.json" } \ No newline at end of file