126 lines
5.0 KiB
Java
126 lines
5.0 KiB
Java
package net.minecraft.world.entity.ai.util;
|
|
|
|
import com.google.common.annotations.VisibleForTesting;
|
|
import java.util.function.Predicate;
|
|
import java.util.function.Supplier;
|
|
import java.util.function.ToDoubleFunction;
|
|
import javax.annotation.Nullable;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.core.Direction;
|
|
import net.minecraft.util.Mth;
|
|
import net.minecraft.util.RandomSource;
|
|
import net.minecraft.world.entity.PathfinderMob;
|
|
import net.minecraft.world.phys.Vec3;
|
|
|
|
public class RandomPos {
|
|
private static final int RANDOM_POS_ATTEMPTS = 10;
|
|
|
|
public static BlockPos generateRandomDirection(RandomSource p_217852_, int p_217853_, int p_217854_) {
|
|
int i = p_217852_.nextInt(2 * p_217853_ + 1) - p_217853_;
|
|
int j = p_217852_.nextInt(2 * p_217854_ + 1) - p_217854_;
|
|
int k = p_217852_.nextInt(2 * p_217853_ + 1) - p_217853_;
|
|
return new BlockPos(i, j, k);
|
|
}
|
|
|
|
@Nullable
|
|
public static BlockPos generateRandomDirectionWithinRadians(RandomSource p_217856_, int p_217857_, int p_217858_, int p_217859_, double p_217860_, double p_217861_, double p_217862_) {
|
|
double d0 = Mth.atan2(p_217861_, p_217860_) - (float) (Math.PI / 2);
|
|
double d1 = d0 + (2.0F * p_217856_.nextFloat() - 1.0F) * p_217862_;
|
|
double d2 = Math.sqrt(p_217856_.nextDouble()) * Mth.SQRT_OF_TWO * p_217857_;
|
|
double d3 = -d2 * Math.sin(d1);
|
|
double d4 = d2 * Math.cos(d1);
|
|
if (!(Math.abs(d3) > p_217857_) && !(Math.abs(d4) > p_217857_)) {
|
|
int i = p_217856_.nextInt(2 * p_217858_ + 1) - p_217858_ + p_217859_;
|
|
return BlockPos.containing(d3, i, d4);
|
|
} else {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@VisibleForTesting
|
|
public static BlockPos moveUpOutOfSolid(BlockPos p_148546_, int p_148547_, Predicate<BlockPos> p_148548_) {
|
|
if (!p_148548_.test(p_148546_)) {
|
|
return p_148546_;
|
|
} else {
|
|
BlockPos.MutableBlockPos blockpos$mutableblockpos = p_148546_.mutable().move(Direction.UP);
|
|
|
|
while (blockpos$mutableblockpos.getY() <= p_148547_ && p_148548_.test(blockpos$mutableblockpos)) {
|
|
blockpos$mutableblockpos.move(Direction.UP);
|
|
}
|
|
|
|
return blockpos$mutableblockpos.immutable();
|
|
}
|
|
}
|
|
|
|
@VisibleForTesting
|
|
public static BlockPos moveUpToAboveSolid(BlockPos p_26948_, int p_26949_, int p_26950_, Predicate<BlockPos> p_26951_) {
|
|
if (p_26949_ < 0) {
|
|
throw new IllegalArgumentException("aboveSolidAmount was " + p_26949_ + ", expected >= 0");
|
|
} else if (!p_26951_.test(p_26948_)) {
|
|
return p_26948_;
|
|
} else {
|
|
BlockPos.MutableBlockPos blockpos$mutableblockpos = p_26948_.mutable().move(Direction.UP);
|
|
|
|
while (blockpos$mutableblockpos.getY() <= p_26950_ && p_26951_.test(blockpos$mutableblockpos)) {
|
|
blockpos$mutableblockpos.move(Direction.UP);
|
|
}
|
|
|
|
int i = blockpos$mutableblockpos.getY();
|
|
|
|
while (blockpos$mutableblockpos.getY() <= p_26950_ && blockpos$mutableblockpos.getY() - i < p_26949_) {
|
|
blockpos$mutableblockpos.move(Direction.UP);
|
|
if (p_26951_.test(blockpos$mutableblockpos)) {
|
|
blockpos$mutableblockpos.move(Direction.DOWN);
|
|
break;
|
|
}
|
|
}
|
|
|
|
return blockpos$mutableblockpos.immutable();
|
|
}
|
|
}
|
|
|
|
@Nullable
|
|
public static Vec3 generateRandomPos(PathfinderMob p_148543_, Supplier<BlockPos> p_148544_) {
|
|
return generateRandomPos(p_148544_, p_148543_::getWalkTargetValue);
|
|
}
|
|
|
|
@Nullable
|
|
public static Vec3 generateRandomPos(Supplier<BlockPos> p_148562_, ToDoubleFunction<BlockPos> p_148563_) {
|
|
double d0 = Double.NEGATIVE_INFINITY;
|
|
BlockPos blockpos = null;
|
|
|
|
for (int i = 0; i < 10; i++) {
|
|
BlockPos blockpos1 = p_148562_.get();
|
|
if (blockpos1 != null) {
|
|
double d1 = p_148563_.applyAsDouble(blockpos1);
|
|
if (d1 > d0) {
|
|
d0 = d1;
|
|
blockpos = blockpos1;
|
|
}
|
|
}
|
|
}
|
|
|
|
return blockpos != null ? Vec3.atBottomCenterOf(blockpos) : null;
|
|
}
|
|
|
|
public static BlockPos generateRandomPosTowardDirection(PathfinderMob p_217864_, int p_217865_, RandomSource p_217866_, BlockPos p_217867_) {
|
|
int i = p_217867_.getX();
|
|
int j = p_217867_.getZ();
|
|
if (p_217864_.hasRestriction() && p_217865_ > 1) {
|
|
BlockPos blockpos = p_217864_.getRestrictCenter();
|
|
if (p_217864_.getX() > blockpos.getX()) {
|
|
i -= p_217866_.nextInt(p_217865_ / 2);
|
|
} else {
|
|
i += p_217866_.nextInt(p_217865_ / 2);
|
|
}
|
|
|
|
if (p_217864_.getZ() > blockpos.getZ()) {
|
|
j -= p_217866_.nextInt(p_217865_ / 2);
|
|
} else {
|
|
j += p_217866_.nextInt(p_217865_ / 2);
|
|
}
|
|
}
|
|
|
|
return BlockPos.containing(i + p_217864_.getX(), p_217867_.getY() + p_217864_.getY(), j + p_217864_.getZ());
|
|
}
|
|
} |