From b53ed9842d447b6e6ab4cd7bfd645b5ff9454880 Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 20 Jan 2022 18:10:15 +0100 Subject: [PATCH] Mor work on Codecs for Surface Rules (paulevsGitch/BetterNether#503) --- gradle.properties | 2 +- .../api/surface/rules/NoiseCondition.java | 1 + .../api/surface/rules/RandomIntProvider.java | 9 +++++++- .../api/surface/rules/SwitchRuleSource.java | 22 +++++++++++++++++-- .../ru/bclib/interfaces/NumericProvider.java | 8 ++++++- .../DoubleBlockSurfaceNoiseCondition.java | 5 +++++ 6 files changed, 42 insertions(+), 5 deletions(-) diff --git a/gradle.properties b/gradle.properties index 6a7cce5f..0248697c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,7 +11,7 @@ loader_version= 0.12.12 fabric_version = 0.44.0+1.18 # Mod Properties -mod_version = 1.2.5 +mod_version = 1.3.0 maven_group = ru.bclib archives_base_name = bclib diff --git a/src/main/java/ru/bclib/api/surface/rules/NoiseCondition.java b/src/main/java/ru/bclib/api/surface/rules/NoiseCondition.java index e8847356..3c0766c2 100644 --- a/src/main/java/ru/bclib/api/surface/rules/NoiseCondition.java +++ b/src/main/java/ru/bclib/api/surface/rules/NoiseCondition.java @@ -1,5 +1,6 @@ package ru.bclib.api.surface.rules; +import net.minecraft.core.Registry; import net.minecraft.world.level.levelgen.SurfaceRules; import ru.bclib.mixin.common.SurfaceRulesContextAccessor; diff --git a/src/main/java/ru/bclib/api/surface/rules/RandomIntProvider.java b/src/main/java/ru/bclib/api/surface/rules/RandomIntProvider.java index 12ace5a3..69cc7f16 100644 --- a/src/main/java/ru/bclib/api/surface/rules/RandomIntProvider.java +++ b/src/main/java/ru/bclib/api/surface/rules/RandomIntProvider.java @@ -1,12 +1,15 @@ package ru.bclib.api.surface.rules; import com.mojang.serialization.Codec; +import net.minecraft.core.Registry; +import net.minecraft.world.level.levelgen.SurfaceRules; import ru.bclib.interfaces.NumericProvider; import ru.bclib.mixin.common.SurfaceRulesContextAccessor; import ru.bclib.util.MHelper; public record RandomIntProvider(int range) implements NumericProvider { - public static final Codec CODEC = Codec.INT.fieldOf("nethrangeer_noise").xmap(RandomIntProvider::new, obj -> obj.range).codec(); + public static final Codec CODEC = Codec.INT.fieldOf("range").xmap(RandomIntProvider::new, obj -> obj.range).codec(); + @Override public int getNumber(SurfaceRulesContextAccessor context) { return MHelper.RANDOM.nextInt(range); @@ -16,4 +19,8 @@ public record RandomIntProvider(int range) implements NumericProvider { public Codec pcodec() { return CODEC; } + + static { + Registry.register(NumericProvider.NUMERIC_PROVIDER , "biome", RandomIntProvider.CODEC); + } } diff --git a/src/main/java/ru/bclib/api/surface/rules/SwitchRuleSource.java b/src/main/java/ru/bclib/api/surface/rules/SwitchRuleSource.java index 3feaca12..31635231 100644 --- a/src/main/java/ru/bclib/api/surface/rules/SwitchRuleSource.java +++ b/src/main/java/ru/bclib/api/surface/rules/SwitchRuleSource.java @@ -1,20 +1,35 @@ package ru.bclib.api.surface.rules; +import com.mojang.datafixers.kinds.Applicative; +import com.mojang.datafixers.kinds.K1; import com.mojang.serialization.Codec; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.SurfaceRules; import net.minecraft.world.level.levelgen.SurfaceRules.Context; import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; import net.minecraft.world.level.levelgen.SurfaceRules.SurfaceRule; +import net.minecraft.world.level.levelgen.VerticalAnchor; import org.jetbrains.annotations.Nullable; import ru.bclib.interfaces.NumericProvider; import ru.bclib.mixin.common.SurfaceRulesContextAccessor; import java.util.List; +import java.util.function.Function; +// public record SwitchRuleSource(NumericProvider selector, List collection) implements RuleSource { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + NumericProvider.CODEC.fieldOf("selector").forGetter(SwitchRuleSource::selector), + RuleSource.CODEC.listOf().fieldOf("collection").forGetter(SwitchRuleSource::collection) + ).apply(instance, SwitchRuleSource::new)); + @Override public Codec codec() { - return RuleSource.CODEC; + return SwitchRuleSource.CODEC; } @Override @@ -30,6 +45,9 @@ public record SwitchRuleSource(NumericProvider selector, List collec return collection.get(nr).apply(context).tryApply(x, y, z); } }; - + } + + static { + Registry.register(Registry.RULE, "bclib_switch_rule", SwitchRuleSource.CODEC); } } diff --git a/src/main/java/ru/bclib/interfaces/NumericProvider.java b/src/main/java/ru/bclib/interfaces/NumericProvider.java index 06befdd1..b24d305e 100644 --- a/src/main/java/ru/bclib/interfaces/NumericProvider.java +++ b/src/main/java/ru/bclib/interfaces/NumericProvider.java @@ -1,13 +1,19 @@ package ru.bclib.interfaces; import com.mojang.serialization.Codec; +import com.mojang.serialization.Lifecycle; +import net.minecraft.core.MappedRegistry; import net.minecraft.core.Registry; -import net.minecraft.world.level.levelgen.SurfaceRules; +import net.minecraft.resources.ResourceKey; +import ru.bclib.BCLib; import ru.bclib.mixin.common.SurfaceRulesContextAccessor; import java.util.function.Function; public interface NumericProvider { + ResourceKey>> NUMERIC_PROVIDER_REGISTRY = ResourceKey.createRegistryKey(BCLib.makeID("worldgen/numeric_provider")); + Registry> NUMERIC_PROVIDER = new MappedRegistry<>(NUMERIC_PROVIDER_REGISTRY, Lifecycle.experimental()); + Codec CODEC = NUMERIC_PROVIDER.byNameCodec().dispatch(NumericProvider::pcodec, Function.identity()); int getNumber(SurfaceRulesContextAccessor context); Codec pcodec(); diff --git a/src/main/java/ru/bclib/world/surface/DoubleBlockSurfaceNoiseCondition.java b/src/main/java/ru/bclib/world/surface/DoubleBlockSurfaceNoiseCondition.java index 4aeb42fc..107bcbc8 100644 --- a/src/main/java/ru/bclib/world/surface/DoubleBlockSurfaceNoiseCondition.java +++ b/src/main/java/ru/bclib/world/surface/DoubleBlockSurfaceNoiseCondition.java @@ -1,6 +1,7 @@ package ru.bclib.world.surface; import com.mojang.serialization.Codec; +import net.minecraft.core.Registry; import net.minecraft.world.level.levelgen.SurfaceRules; import ru.bclib.api.surface.rules.SurfaceNoiseCondition; import ru.bclib.mixin.common.SurfaceRulesContextAccessor; @@ -38,4 +39,8 @@ public class DoubleBlockSurfaceNoiseCondition extends SurfaceNoiseCondition { lastValue=value; return value > threshold; } + + static { + Registry.register(Registry.CONDITION , "betternether_doubleblock_surface", DoubleBlockSurfaceNoiseCondition.CODEC); + } }