Skip to content

Commit d569761

Browse files
committed
chore: add a bit of spawn safety checking
Avoid dropping players into the void where possible, they don't like that
1 parent 01aabea commit d569761

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

common/src/main/java/dev/ftb/mods/ftbteambases/data/construction/ConstructionWorker.java

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,15 @@
88
import dev.ftb.mods.ftbteambases.util.DimensionUtils;
99
import dev.ftb.mods.ftbteambases.util.RegionExtents;
1010
import net.minecraft.core.BlockPos;
11+
import net.minecraft.core.Direction;
1112
import net.minecraft.core.registries.Registries;
1213
import net.minecraft.resources.ResourceKey;
1314
import net.minecraft.util.Mth;
1415
import net.minecraft.world.level.Level;
16+
import net.minecraft.world.level.block.Block;
17+
import net.minecraft.world.level.block.Blocks;
1518
import net.minecraft.world.level.levelgen.Heightmap;
19+
import org.jetbrains.annotations.NotNull;
1620

1721
import java.text.SimpleDateFormat;
1822
import java.util.Date;
@@ -48,8 +52,29 @@ default BlockPos getInitialSpawnPos(Level destLevel, BaseDefinition baseDefiniti
4852
BlockPos offset = baseDefinition.spawnOffset();
4953
XZ spawnXZ = getSpawnXZ().offset(offset.getX(), offset.getZ());
5054
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();
5378
}
5479

5580
default LiveBaseDetails makeLiveBaseDetails(Level destLevel, BaseDefinition baseDefinition) {

common/src/main/resources/data/ftbteambases/ftb_base_definitions/default_jigsaw.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
"preview_image": "ftbteambases:textures/spawn/default.png",
55
"dev_mode": true,
66
"construction": {
7-
"template_pool": "minecraft:trail_ruins/tower",
8-
"target": "minecraft:road_anchor",
7+
"template_pool": "minecraft:pillager_outpost/towers",
8+
"target": "minecraft:entrance",
99
"y_pos": 64,
1010
"max_gen_depth": 7,
1111
"orientation": "up_north"

0 commit comments

Comments
 (0)