From a89371007f66271ef3b7277cffb0525173f00476 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 7 Mar 2025 23:36:56 +0700 Subject: [PATCH] Declare BooleanProvider as interface --- .../ru/dbotthepony/mc/otm/datagen/WorldGen.kt | 2 +- .../mc/otm/OverdriveThatMatters.kt | 2 + .../mc/otm/data/world/BooleanProvider.kt | 69 ++++++++++++++----- .../otm/worldgen/placement/WormPlacement.kt | 2 + 4 files changed, 57 insertions(+), 18 deletions(-) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/WorldGen.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/WorldGen.kt index 3d754847c..2ffdb3d61 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/WorldGen.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/WorldGen.kt @@ -130,7 +130,7 @@ fun registerPlacedFeatures(context: BootstrapContext) { ) ), wormLength = UniformInt.of(40, 200), - wormTurnChance = BooleanProvider.onceEvery(4), + wormTurnChance = BooleanProvider.Uniform(4), wormTurnXY = WormPlacement.normalDistributedTurnRate(60f), wormTurnXZ = WormPlacement.normalDistributedTurnRate(60f), ) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/OverdriveThatMatters.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/OverdriveThatMatters.kt index e74ea6911..a91bf2da4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/OverdriveThatMatters.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/OverdriveThatMatters.kt @@ -53,6 +53,7 @@ import ru.dbotthepony.mc.otm.config.MachinesConfig import ru.dbotthepony.mc.otm.config.ServerConfig import ru.dbotthepony.mc.otm.config.ToolsConfig import ru.dbotthepony.mc.otm.data.FlywheelMaterials +import ru.dbotthepony.mc.otm.data.world.BooleanProvider import ru.dbotthepony.mc.otm.data.world.DecimalProvider import ru.dbotthepony.mc.otm.entity.WitheredSkeletonSpawnHandler import ru.dbotthepony.mc.otm.item.ChestUpgraderItem @@ -136,6 +137,7 @@ object OverdriveThatMatters { MOD_BUS.addListener(::registerNetworkPackets) DecimalProvider.register(MOD_BUS) + BooleanProvider.register(MOD_BUS) AndroidResearchDescription.register(MOD_BUS) AndroidResearchDescriptions.register(MOD_BUS) AndroidResearchResult.register(MOD_BUS) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/data/world/BooleanProvider.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/data/world/BooleanProvider.kt index 7d5d4bdc6..f19fb7c00 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/data/world/BooleanProvider.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/data/world/BooleanProvider.kt @@ -1,33 +1,68 @@ package ru.dbotthepony.mc.otm.data.world import com.mojang.serialization.Codec +import com.mojang.serialization.MapCodec import com.mojang.serialization.codecs.RecordCodecBuilder import net.minecraft.util.RandomSource -import net.minecraft.util.valueproviders.FloatProvider -import net.minecraft.util.valueproviders.UniformFloat +import net.neoforged.bus.api.IEventBus +import ru.dbotthepony.mc.otm.OverdriveThatMatters +import ru.dbotthepony.mc.otm.core.ResourceLocation +import ru.dbotthepony.mc.otm.data.codec.minRange +import ru.dbotthepony.mc.otm.registry.MDeferredRegister +import ru.dbotthepony.mc.otm.registry.RegistryDelegate -class BooleanProvider(val sampler: FloatProvider, val threshold: Float, val lessThan: Boolean = true) { - fun sample(random: RandomSource): Boolean { - val sampled = sampler.sample(random) +interface BooleanProvider { + interface Type { + val codec: MapCodec + } - if (lessThan) { - return sampled < threshold - } else { - return sampled >= threshold + fun instance(): Instance + val type: Type<*> + + fun interface Instance { + fun sample(random: RandomSource): Boolean + } + + class Uniform(val chance: Int) : BooleanProvider, Instance { + override fun instance(): Instance { + return this + } + + override val type: Type<*> + get() = Companion + + override fun sample(random: RandomSource): Boolean { + return random.nextInt(chance) == 0 + } + + companion object : Type { + override val codec: MapCodec = RecordCodecBuilder.mapCodec { + it.group(Codec.INT.minRange(1).fieldOf("once_every").forGetter(Uniform::chance)).apply(it, ::Uniform) + } } } companion object { - fun onceEvery(samples: Int): BooleanProvider { - return BooleanProvider(UniformFloat.of(0f, samples.toFloat()), 1f, lessThan = true) + private val registryHolder = RegistryDelegate>("decimal_provider_type") { + defaultKey(ResourceLocation(OverdriveThatMatters.MOD_ID, "zero")) } - val CODEC: Codec = RecordCodecBuilder.create { - it.group( - FloatProvider.CODEC.fieldOf("sampler").forGetter(BooleanProvider::sampler), - Codec.FLOAT.fieldOf("threshold").forGetter(BooleanProvider::threshold), - Codec.BOOL.optionalFieldOf("less_than", true).forGetter(BooleanProvider::lessThan) - ).apply(it, ::BooleanProvider) + val registry by registryHolder + val registryKey get() = registryHolder.key + + private val registrar = MDeferredRegister(registryKey) + + init { + registrar.register("uniform") { Uniform.Companion } + } + + val CODEC: Codec by lazy { + registry.byNameCodec().dispatch({ it.type }, { it.codec }) + } + + fun register(bus: IEventBus) { + bus.addListener(registryHolder::build) + registrar.register(bus) } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/WormPlacement.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/WormPlacement.kt index c1094c2d1..bd6d8cc3b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/WormPlacement.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/worldgen/placement/WormPlacement.kt @@ -43,6 +43,8 @@ class WormPlacement( var prevPos = position.toBlockPos() positions.add(prevPos) + val wormTurnChance = wormTurnChance.instance() + for (traveledDistance in 0 .. maxDistance) { // wormy turn if (wormTurnChance.sample(random)) {