Code/net/minecraft/world/level/levelgen/structure/templatesystem/LinearPosTest.java

48 lines
2.0 KiB
Java
Raw Permalink Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.world.level.levelgen.structure.templatesystem;
import com.mojang.serialization.Codec;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.mojang.serialization.codecs.RecordCodecBuilder.Instance;
import net.minecraft.core.BlockPos;
import net.minecraft.util.Mth;
import net.minecraft.util.RandomSource;
public class LinearPosTest extends PosRuleTest {
public static final MapCodec<LinearPosTest> CODEC = RecordCodecBuilder.mapCodec(
p_74160_ -> p_74160_.group(
Codec.FLOAT.fieldOf("min_chance").orElse(0.0F).forGetter(p_163737_ -> p_163737_.minChance),
Codec.FLOAT.fieldOf("max_chance").orElse(0.0F).forGetter(p_163735_ -> p_163735_.maxChance),
Codec.INT.fieldOf("min_dist").orElse(0).forGetter(p_163733_ -> p_163733_.minDist),
Codec.INT.fieldOf("max_dist").orElse(0).forGetter(p_163731_ -> p_163731_.maxDist)
)
.apply(p_74160_, LinearPosTest::new)
);
private final float minChance;
private final float maxChance;
private final int minDist;
private final int maxDist;
public LinearPosTest(float p_74154_, float p_74155_, int p_74156_, int p_74157_) {
if (p_74156_ >= p_74157_) {
throw new IllegalArgumentException("Invalid range: [" + p_74156_ + "," + p_74157_ + "]");
} else {
this.minChance = p_74154_;
this.maxChance = p_74155_;
this.minDist = p_74156_;
this.maxDist = p_74157_;
}
}
@Override
public boolean test(BlockPos p_230296_, BlockPos p_230297_, BlockPos p_230298_, RandomSource p_230299_) {
int i = p_230297_.distManhattan(p_230298_);
float f = p_230299_.nextFloat();
return f <= Mth.clampedLerp(this.minChance, this.maxChance, Mth.inverseLerp(i, this.minDist, this.maxDist));
}
@Override
protected PosRuleTestType<?> getType() {
return PosRuleTestType.LINEAR_POS_TEST;
}
}