Code/net/minecraft/world/level/levelgen/Column.java

197 lines
5.7 KiB
Java

package net.minecraft.world.level.levelgen;
import java.util.Optional;
import java.util.OptionalInt;
import java.util.function.Predicate;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.level.LevelSimulatedReader;
import net.minecraft.world.level.block.state.BlockState;
public abstract class Column {
public static Column.Range around(int p_158165_, int p_158166_) {
return new Column.Range(p_158165_ - 1, p_158166_ + 1);
}
public static Column.Range inside(int p_158189_, int p_158190_) {
return new Column.Range(p_158189_, p_158190_);
}
public static Column below(int p_158163_) {
return new Column.Ray(p_158163_, false);
}
public static Column fromHighest(int p_158187_) {
return new Column.Ray(p_158187_ + 1, false);
}
public static Column above(int p_158194_) {
return new Column.Ray(p_158194_, true);
}
public static Column fromLowest(int p_158196_) {
return new Column.Ray(p_158196_ - 1, true);
}
public static Column line() {
return Column.Line.INSTANCE;
}
public static Column create(OptionalInt p_158184_, OptionalInt p_158185_) {
if (p_158184_.isPresent() && p_158185_.isPresent()) {
return inside(p_158184_.getAsInt(), p_158185_.getAsInt());
} else if (p_158184_.isPresent()) {
return above(p_158184_.getAsInt());
} else {
return p_158185_.isPresent() ? below(p_158185_.getAsInt()) : line();
}
}
public abstract OptionalInt getCeiling();
public abstract OptionalInt getFloor();
public abstract OptionalInt getHeight();
public Column withFloor(OptionalInt p_158182_) {
return create(p_158182_, this.getCeiling());
}
public Column withCeiling(OptionalInt p_158192_) {
return create(this.getFloor(), p_158192_);
}
public static Optional<Column> scan(
LevelSimulatedReader p_158176_, BlockPos p_158177_, int p_158178_, Predicate<BlockState> p_158179_, Predicate<BlockState> p_158180_
) {
BlockPos.MutableBlockPos blockpos$mutableblockpos = p_158177_.mutable();
if (!p_158176_.isStateAtPosition(p_158177_, p_158179_)) {
return Optional.empty();
} else {
int i = p_158177_.getY();
OptionalInt optionalint = scanDirection(p_158176_, p_158178_, p_158179_, p_158180_, blockpos$mutableblockpos, i, Direction.UP);
OptionalInt optionalint1 = scanDirection(p_158176_, p_158178_, p_158179_, p_158180_, blockpos$mutableblockpos, i, Direction.DOWN);
return Optional.of(create(optionalint1, optionalint));
}
}
private static OptionalInt scanDirection(
LevelSimulatedReader p_158168_,
int p_158169_,
Predicate<BlockState> p_158170_,
Predicate<BlockState> p_158171_,
BlockPos.MutableBlockPos p_158172_,
int p_158173_,
Direction p_158174_
) {
p_158172_.setY(p_158173_);
for (int i = 1; i < p_158169_ && p_158168_.isStateAtPosition(p_158172_, p_158170_); i++) {
p_158172_.move(p_158174_);
}
return p_158168_.isStateAtPosition(p_158172_, p_158171_) ? OptionalInt.of(p_158172_.getY()) : OptionalInt.empty();
}
public static final class Line extends Column {
static final Column.Line INSTANCE = new Column.Line();
private Line() {
}
@Override
public OptionalInt getCeiling() {
return OptionalInt.empty();
}
@Override
public OptionalInt getFloor() {
return OptionalInt.empty();
}
@Override
public OptionalInt getHeight() {
return OptionalInt.empty();
}
@Override
public String toString() {
return "C(-)";
}
}
public static final class Range extends Column {
private final int floor;
private final int ceiling;
protected Range(int p_158207_, int p_158208_) {
this.floor = p_158207_;
this.ceiling = p_158208_;
if (this.height() < 0) {
throw new IllegalArgumentException("Column of negative height: " + this);
}
}
@Override
public OptionalInt getCeiling() {
return OptionalInt.of(this.ceiling);
}
@Override
public OptionalInt getFloor() {
return OptionalInt.of(this.floor);
}
@Override
public OptionalInt getHeight() {
return OptionalInt.of(this.height());
}
public int ceiling() {
return this.ceiling;
}
public int floor() {
return this.floor;
}
public int height() {
return this.ceiling - this.floor - 1;
}
@Override
public String toString() {
return "C(" + this.ceiling + "-" + this.floor + ")";
}
}
public static final class Ray extends Column {
private final int edge;
private final boolean pointingUp;
public Ray(int p_158219_, boolean p_158220_) {
this.edge = p_158219_;
this.pointingUp = p_158220_;
}
@Override
public OptionalInt getCeiling() {
return this.pointingUp ? OptionalInt.empty() : OptionalInt.of(this.edge);
}
@Override
public OptionalInt getFloor() {
return this.pointingUp ? OptionalInt.of(this.edge) : OptionalInt.empty();
}
@Override
public OptionalInt getHeight() {
return OptionalInt.empty();
}
@Override
public String toString() {
return this.pointingUp ? "C(" + this.edge + "-)" : "C(-" + this.edge + ")";
}
}
}