Declare BooleanProvider as interface

This commit is contained in:
DBotThePony 2025-03-07 23:36:56 +07:00
parent 70ac0f2c7f
commit a89371007f
Signed by: DBot
GPG Key ID: DCC23B5715498507
4 changed files with 57 additions and 18 deletions

View File

@ -130,7 +130,7 @@ fun registerPlacedFeatures(context: BootstrapContext<PlacedFeature>) {
)
),
wormLength = UniformInt.of(40, 200),
wormTurnChance = BooleanProvider.onceEvery(4),
wormTurnChance = BooleanProvider.Uniform(4),
wormTurnXY = WormPlacement.normalDistributedTurnRate(60f),
wormTurnXZ = WormPlacement.normalDistributedTurnRate(60f),
)

View File

@ -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)

View File

@ -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<T : BooleanProvider> {
val codec: MapCodec<T>
}
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<Uniform> {
override val codec: MapCodec<Uniform> = 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<Type<*>>("decimal_provider_type") {
defaultKey(ResourceLocation(OverdriveThatMatters.MOD_ID, "zero"))
}
val CODEC: Codec<BooleanProvider> = 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<BooleanProvider> by lazy {
registry.byNameCodec().dispatch({ it.type }, { it.codec })
}
fun register(bus: IEventBus) {
bus.addListener(registryHolder::build)
registrar.register(bus)
}
}
}

View File

@ -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)) {