ChipiMod/src/main/java/net/Chipperfluff/chipi/block/ChipperPortalShape.java

115 lines
3.6 KiB
Java

package net.Chipperfluff.chipi.block;
import net.minecraft.block.BlockState;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
import net.minecraft.world.World;
import net.Chipperfluff.chipi.advancement.ModCriteria;
public class ChipperPortalShape {
private final World world;
private final BlockPos origin;
private final Direction.Axis axis;
public ChipperPortalShape(World world, BlockPos origin, Direction.Axis axis) {
this.world = world;
this.origin = origin;
this.axis = axis;
}
public static boolean tryCreate(World world, BlockPos placedPos) {
if (!(world instanceof ServerWorld serverWorld)) return false;
for (Direction.Axis axis : new Direction.Axis[]{Direction.Axis.X, Direction.Axis.Z}) {
ChipperPortalShape shape = new ChipperPortalShape(world, placedPos, axis);
if (shape.isValid()) {
shape.placePortal();
if (serverWorld.getClosestPlayer(
placedPos.getX(),
placedPos.getY(),
placedPos.getZ(),
10,
false
) instanceof net.minecraft.server.network.ServerPlayerEntity serverPlayer) {
ModCriteria.PORTAL_ACTIVATED.trigger(serverPlayer);
}
System.out.println("[CHIPI] portal created at " + placedPos + " axis=" + axis);
return true;
}
}
return false;
}
private boolean isValid() {
BlockPos base = findBottomLeft();
if (base == null) return false;
for (int x = 0; x < 4; x++) {
for (int y = 0; y < 5; y++) {
boolean edge = x == 0 || x == 3 || y == 0 || y == 4;
BlockPos pos = offset(base, x, y);
BlockState state = world.getBlockState(pos);
if (edge) {
if (!state.isOf(ModBlocks.CHIPPER_FRAME)) return false;
} else {
if (!state.isAir()) return false;
}
}
}
return true;
}
private BlockPos findBottomLeft() {
for (int dx = -3; dx <= 0; dx++) {
for (int dy = -4; dy <= 0; dy++) {
BlockPos pos = offset(origin.add(dx, dy, 0), 0, 0);
if (world.getBlockState(pos).isOf(ModBlocks.CHIPPER_FRAME)) {
return pos;
}
}
}
return null;
}
private BlockPos offset(BlockPos pos, int x, int y) {
return axis == Direction.Axis.X
? pos.add(0, y, x)
: pos.add(x, y, 0);
}
private void placePortal() {
BlockPos base = findBottomLeft();
if (base == null) return;
for (int x = 1; x <= 2; x++) {
for (int y = 1; y <= 3; y++) {
world.setBlockState(
offset(base, x, y),
ModBlocks.CHIPPER_PORTAL.getDefaultState(),
3
);
}
}
}
public static void destroyNearby(World world, BlockPos pos) {
for (int x = -3; x <= 3; x++) {
for (int y = -4; y <= 4; y++) {
for (int z = -3; z <= 3; z++) {
BlockPos p = pos.add(x, y, z);
if (world.getBlockState(p).isOf(ModBlocks.CHIPPER_PORTAL)) {
world.setBlockState(p, world.getFluidState(p).getBlockState(), 3);
}
}
}
}
}
}