minecraft-source/src/net/minecraft/world/level/PortalForcer.java

214 lines
12 KiB
Java

package net.minecraft.world.level;
import net.minecraft.world.level.block.state.AbstractStateHolder;
import net.minecraft.world.level.block.state.properties.Property;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.util.Mth;
import javax.annotation.Nullable;
import java.util.Optional;
import net.minecraft.world.level.block.NetherPortalBlock;
import net.minecraft.server.level.TicketType;
import java.util.Comparator;
import net.minecraft.core.Vec3i;
import java.util.stream.Collector;
import java.util.stream.Collectors;
import net.minecraft.world.entity.ai.village.poi.PoiManager;
import net.minecraft.world.entity.ai.village.poi.PoiType;
import net.minecraft.world.entity.ai.village.poi.PoiRecord;
import java.util.List;
import net.minecraft.world.level.block.state.pattern.BlockPattern;
import net.minecraft.core.Direction;
import net.minecraft.world.phys.Vec3;
import net.minecraft.world.entity.player.Player;
import net.minecraft.core.BlockPos;
import net.minecraft.world.entity.Entity;
import java.util.Random;
import net.minecraft.server.level.ServerLevel;
public class PortalForcer {
private final ServerLevel level;
private final Random random;
public PortalForcer(final ServerLevel xd) {
this.level = xd;
this.random = new Random(xd.getSeed());
}
public boolean findAndMoveToPortal(final Entity akn, final float float2) {
final Vec3 cvi4 = akn.getPortalEntranceOffset();
final Direction fp5 = akn.getPortalEntranceForwards();
final BlockPattern.PortalInfo c6 = this.findPortal(new BlockPos(akn), akn.getDeltaMovement(), fp5, cvi4.x, cvi4.y, akn instanceof Player);
if (c6 == null) {
return false;
}
final Vec3 cvi5 = c6.pos;
final Vec3 cvi6 = c6.speed;
akn.setDeltaMovement(cvi6);
akn.yRot = float2 + c6.angle;
akn.forceMove(cvi5.x, cvi5.y, cvi5.z);
return true;
}
@Nullable
public BlockPattern.PortalInfo findPortal(final BlockPos fk, final Vec3 cvi, final Direction fp, final double double4, final double double5, final boolean boolean6) {
final PoiManager aso10 = this.level.getPoiManager();
aso10.ensureLoadedAndValid(this.level, fk, 128);
final List<PoiRecord> list11 = aso10.getInSquare(asr -> asr == PoiType.NETHER_PORTAL, fk, 128, PoiManager.Occupancy.ANY).collect(Collectors.toList());
final Optional<PoiRecord> optional12 = list11.stream().min(Comparator.comparingDouble(asp -> asp.getPos().distSqr(fk)).thenComparingInt(asp -> asp.getPos().getY()));
final BlockPos fk2;
final BlockPattern.BlockPatternMatch b10;
return optional12.<BlockPattern.PortalInfo>map(asp -> {
fk2 = asp.getPos();
this.level.getChunkSource().<BlockPos>addRegionTicket(TicketType.PORTAL, new ChunkPos(fk2), 3, fk2);
b10 = NetherPortalBlock.getPortalShape(this.level, fk2);
return b10.getPortalOutput(fp, fk2, double5, cvi, double4);
}).orElse(null);
}
public boolean createPortal(final Entity akn) {
final int integer3 = 16;
double double4 = -1.0;
final int integer4 = Mth.floor(akn.getX());
final int integer5 = Mth.floor(akn.getY());
final int integer6 = Mth.floor(akn.getZ());
int integer7 = integer4;
int integer8 = integer5;
int integer9 = integer6;
int integer10 = 0;
final int integer11 = this.random.nextInt(4);
final BlockPos.MutableBlockPos a14 = new BlockPos.MutableBlockPos();
for (int integer12 = integer4 - 16; integer12 <= integer4 + 16; ++integer12) {
final double double5 = integer12 + 0.5 - akn.getX();
for (int integer13 = integer6 - 16; integer13 <= integer6 + 16; ++integer13) {
final double double6 = integer13 + 0.5 - akn.getZ();
Label_0463:
for (int integer14 = this.level.getHeight() - 1; integer14 >= 0; --integer14) {
if (this.level.isEmptyBlock(a14.set(integer12, integer14, integer13))) {
while (integer14 > 0 && this.level.isEmptyBlock(a14.set(integer12, integer14 - 1, integer13))) {
--integer14;
}
for (int integer15 = integer11; integer15 < integer11 + 4; ++integer15) {
int integer16 = integer15 % 2;
int integer17 = 1 - integer16;
if (integer15 % 4 >= 2) {
integer16 = -integer16;
integer17 = -integer17;
}
for (int integer18 = 0; integer18 < 3; ++integer18) {
for (int integer19 = 0; integer19 < 4; ++integer19) {
for (int integer20 = -1; integer20 < 4; ++integer20) {
final int integer21 = integer12 + (integer19 - 1) * integer16 + integer18 * integer17;
final int integer22 = integer14 + integer20;
final int integer23 = integer13 + (integer19 - 1) * integer17 - integer18 * integer16;
a14.set(integer21, integer22, integer23);
if (integer20 < 0 && !this.level.getBlockState(a14).getMaterial().isSolid()) {
continue Label_0463;
}
if (integer20 >= 0 && !this.level.isEmptyBlock(a14)) {
continue Label_0463;
}
}
}
}
final double double7 = integer14 + 0.5 - akn.getY();
final double double8 = double5 * double5 + double7 * double7 + double6 * double6;
if (double4 < 0.0 || double8 < double4) {
double4 = double8;
integer7 = integer12;
integer8 = integer14;
integer9 = integer13;
integer10 = integer15 % 4;
}
}
}
}
}
}
if (double4 < 0.0) {
for (int integer12 = integer4 - 16; integer12 <= integer4 + 16; ++integer12) {
final double double5 = integer12 + 0.5 - akn.getX();
for (int integer13 = integer6 - 16; integer13 <= integer6 + 16; ++integer13) {
final double double6 = integer13 + 0.5 - akn.getZ();
Label_0837:
for (int integer14 = this.level.getHeight() - 1; integer14 >= 0; --integer14) {
if (this.level.isEmptyBlock(a14.set(integer12, integer14, integer13))) {
while (integer14 > 0 && this.level.isEmptyBlock(a14.set(integer12, integer14 - 1, integer13))) {
--integer14;
}
for (int integer15 = integer11; integer15 < integer11 + 2; ++integer15) {
final int integer16 = integer15 % 2;
final int integer17 = 1 - integer16;
for (int integer18 = 0; integer18 < 4; ++integer18) {
for (int integer19 = -1; integer19 < 4; ++integer19) {
final int integer20 = integer12 + (integer18 - 1) * integer16;
final int integer21 = integer14 + integer19;
final int integer22 = integer13 + (integer18 - 1) * integer17;
a14.set(integer20, integer21, integer22);
if (integer19 < 0 && !this.level.getBlockState(a14).getMaterial().isSolid()) {
continue Label_0837;
}
if (integer19 >= 0 && !this.level.isEmptyBlock(a14)) {
continue Label_0837;
}
}
}
final double double7 = integer14 + 0.5 - akn.getY();
final double double8 = double5 * double5 + double7 * double7 + double6 * double6;
if (double4 < 0.0 || double8 < double4) {
double4 = double8;
integer7 = integer12;
integer8 = integer14;
integer9 = integer13;
integer10 = integer15 % 2;
}
}
}
}
}
}
}
int integer12 = integer10;
final int integer24 = integer7;
int integer25 = integer8;
int integer13 = integer9;
int integer26 = integer12 % 2;
int integer27 = 1 - integer26;
if (integer12 % 4 >= 2) {
integer26 = -integer26;
integer27 = -integer27;
}
if (double4 < 0.0) {
integer8 = (integer25 = Mth.clamp(integer8, 70, this.level.getHeight() - 10));
for (int integer14 = -1; integer14 <= 1; ++integer14) {
for (int integer15 = 1; integer15 < 3; ++integer15) {
for (int integer16 = -1; integer16 < 3; ++integer16) {
final int integer17 = integer24 + (integer15 - 1) * integer26 + integer14 * integer27;
final int integer18 = integer25 + integer16;
final int integer19 = integer13 + (integer15 - 1) * integer27 - integer14 * integer26;
final boolean boolean27 = integer16 < 0;
a14.set(integer17, integer18, integer19);
this.level.setBlockAndUpdate(a14, boolean27 ? Blocks.OBSIDIAN.defaultBlockState() : Blocks.AIR.defaultBlockState());
}
}
}
}
for (int integer14 = -1; integer14 < 3; ++integer14) {
for (int integer15 = -1; integer15 < 4; ++integer15) {
if (integer14 == -1 || integer14 == 2 || integer15 == -1 || integer15 == 3) {
a14.set(integer24 + integer14 * integer26, integer25 + integer15, integer13 + integer14 * integer27);
this.level.setBlock(a14, Blocks.OBSIDIAN.defaultBlockState(), 3);
}
}
}
final BlockState byg21 = ((AbstractStateHolder<O, BlockState>)Blocks.NETHER_PORTAL.defaultBlockState()).<Direction.Axis, Direction.Axis>setValue(NetherPortalBlock.AXIS, (integer26 == 0) ? Direction.Axis.Z : Direction.Axis.X);
for (int integer15 = 0; integer15 < 2; ++integer15) {
for (int integer16 = 0; integer16 < 3; ++integer16) {
a14.set(integer24 + integer15 * integer26, integer25 + integer16, integer13 + integer15 * integer27);
this.level.setBlock(a14, byg21, 18);
}
}
return true;
}
}