|
8 | 8 | import dev.ftb.mods.ftbteambases.util.DimensionUtils;
|
9 | 9 | import dev.ftb.mods.ftbteambases.util.RegionExtents;
|
10 | 10 | import net.minecraft.core.BlockPos;
|
| 11 | +import net.minecraft.core.Direction; |
11 | 12 | import net.minecraft.core.registries.Registries;
|
12 | 13 | import net.minecraft.resources.ResourceKey;
|
13 | 14 | import net.minecraft.util.Mth;
|
14 | 15 | import net.minecraft.world.level.Level;
|
| 16 | +import net.minecraft.world.level.block.Block; |
| 17 | +import net.minecraft.world.level.block.Blocks; |
15 | 18 | import net.minecraft.world.level.levelgen.Heightmap;
|
| 19 | +import org.jetbrains.annotations.NotNull; |
16 | 20 |
|
17 | 21 | import java.text.SimpleDateFormat;
|
18 | 22 | import java.util.Date;
|
@@ -48,8 +52,29 @@ default BlockPos getInitialSpawnPos(Level destLevel, BaseDefinition baseDefiniti
|
48 | 52 | BlockPos offset = baseDefinition.spawnOffset();
|
49 | 53 | XZ spawnXZ = getSpawnXZ().offset(offset.getX(), offset.getZ());
|
50 | 54 | destLevel.getChunk(spawnXZ.x() >> 4, spawnXZ.z() >> 4);
|
51 |
| - int yPos = destLevel.getHeight(Heightmap.Types.WORLD_SURFACE_WG, spawnXZ.x(), spawnXZ.z()); |
52 |
| - return new BlockPos(spawnXZ.x(), yPos, spawnXZ.z()).above(offset.getY()); |
| 55 | + int yPos = destLevel.getHeight(Heightmap.Types.WORLD_SURFACE, spawnXZ.x(), spawnXZ.z()); |
| 56 | + |
| 57 | + if (yPos > destLevel.getMinBuildHeight()) { |
| 58 | + return new BlockPos(spawnXZ.x(), yPos, spawnXZ.z()).above(offset.getY()); |
| 59 | + } else { |
| 60 | + return findSafeSpawn(destLevel, baseDefinition, spawnXZ); |
| 61 | + } |
| 62 | + } |
| 63 | + |
| 64 | + private static @NotNull BlockPos findSafeSpawn(Level destLevel, BaseDefinition baseDefinition, XZ spawnXZ) { |
| 65 | + // oops, this spot's over the void. try to find a safe spot nearby to avoid pain and suffering |
| 66 | + BlockPos start = new BlockPos(spawnXZ.x() - 8, 0, spawnXZ.z() - 8); |
| 67 | + for (BlockPos.MutableBlockPos pos : BlockPos.spiralAround(start, 16, Direction.EAST, Direction.SOUTH)) { |
| 68 | + int y = destLevel.getHeight(Heightmap.Types.WORLD_SURFACE, pos.getX(), pos.getZ()); |
| 69 | + if (y > destLevel.getMinBuildHeight()) { |
| 70 | + return new BlockPos(pos.getX(), y + 1, pos.getZ()); |
| 71 | + } |
| 72 | + } |
| 73 | + // still nothing :( create an emergency block for the player to stand on |
| 74 | + BlockPos fallbackPos = new BlockPos(spawnXZ.x(), 64, spawnXZ.z()); |
| 75 | + FTBTeamBases.LOGGER.warn("can't find safe player spawn for base {}, creating emergency block at {}", baseDefinition.id(), fallbackPos); |
| 76 | + destLevel.setBlock(fallbackPos, Blocks.STONE.defaultBlockState(), Block.UPDATE_ALL); |
| 77 | + return fallbackPos.above(); |
53 | 78 | }
|
54 | 79 |
|
55 | 80 | default LiveBaseDetails makeLiveBaseDetails(Level destLevel, BaseDefinition baseDefinition) {
|
|
0 commit comments