Code/net/minecraft/world/level/levelgen/heightproviders/TrapezoidHeight.java

72 lines
2.8 KiB
Java

package net.minecraft.world.level.levelgen.heightproviders;
import com.mojang.logging.LogUtils;
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.util.Mth;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.levelgen.VerticalAnchor;
import net.minecraft.world.level.levelgen.WorldGenerationContext;
import org.slf4j.Logger;
public class TrapezoidHeight extends HeightProvider {
public static final MapCodec<TrapezoidHeight> CODEC = RecordCodecBuilder.mapCodec(
p_162005_ -> p_162005_.group(
VerticalAnchor.CODEC.fieldOf("min_inclusive").forGetter(p_162021_ -> p_162021_.minInclusive),
VerticalAnchor.CODEC.fieldOf("max_inclusive").forGetter(p_162019_ -> p_162019_.maxInclusive),
Codec.INT.optionalFieldOf("plateau", 0).forGetter(p_162014_ -> p_162014_.plateau)
)
.apply(p_162005_, TrapezoidHeight::new)
);
private static final Logger LOGGER = LogUtils.getLogger();
private final VerticalAnchor minInclusive;
private final VerticalAnchor maxInclusive;
private final int plateau;
private TrapezoidHeight(VerticalAnchor p_162000_, VerticalAnchor p_162001_, int p_162002_) {
this.minInclusive = p_162000_;
this.maxInclusive = p_162001_;
this.plateau = p_162002_;
}
public static TrapezoidHeight of(VerticalAnchor p_162010_, VerticalAnchor p_162011_, int p_162012_) {
return new TrapezoidHeight(p_162010_, p_162011_, p_162012_);
}
public static TrapezoidHeight of(VerticalAnchor p_162007_, VerticalAnchor p_162008_) {
return of(p_162007_, p_162008_, 0);
}
@Override
public int sample(RandomSource p_226305_, WorldGenerationContext p_226306_) {
int i = this.minInclusive.resolveY(p_226306_);
int j = this.maxInclusive.resolveY(p_226306_);
if (i > j) {
LOGGER.warn("Empty height range: {}", this);
return i;
} else {
int k = j - i;
if (this.plateau >= k) {
return Mth.randomBetweenInclusive(p_226305_, i, j);
} else {
int l = (k - this.plateau) / 2;
int i1 = k - l;
return i + Mth.randomBetweenInclusive(p_226305_, 0, i1) + Mth.randomBetweenInclusive(p_226305_, 0, l);
}
}
}
@Override
public HeightProviderType<?> getType() {
return HeightProviderType.TRAPEZOID;
}
@Override
public String toString() {
return this.plateau == 0
? "triangle (" + this.minInclusive + "-" + this.maxInclusive + ")"
: "trapezoid(" + this.plateau + ") in [" + this.minInclusive + "-" + this.maxInclusive + "]";
}
}