Declare BooleanProvider as interface
This commit is contained in:
parent
70ac0f2c7f
commit
a89371007f
@ -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),
|
||||
)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)) {
|
||||
|
Loading…
Reference in New Issue
Block a user