diff --git a/common/src/main/java/org/dimdev/dimdoors/api/util/Location.java b/common/src/main/java/org/dimdev/dimdoors/api/util/Location.java index 09ebf85d..ef7936ac 100644 --- a/common/src/main/java/org/dimdev/dimdoors/api/util/Location.java +++ b/common/src/main/java/org/dimdev/dimdoors/api/util/Location.java @@ -13,6 +13,7 @@ import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.material.FluidState; import org.dimdev.dimdoors.DimensionalDoors; @@ -101,4 +102,12 @@ public static Location fromNbt(CompoundTag nbt) { new BlockPos(pos[0], pos[1], pos[2]) ); } + + //Does not check for "hasChunk" like getHeightmapPos. Is that safe? I don't know. But it fixes teleporting at bedrock. + public static BlockPos getHeightmapPosSafe(ServerLevel level, Heightmap.Types heightmapType, BlockPos pos) { + //net.minecraft.world.level.Level, taken directly from getHeight + var y = level.getChunkAt(pos).getHeight(heightmapType, pos.getX() & 15, pos.getZ() & 15) + 1; + + return new BlockPos(pos.getX(), y, pos.getZ()); + } } diff --git a/common/src/main/java/org/dimdev/dimdoors/rift/targets/EscapeTarget.java b/common/src/main/java/org/dimdev/dimdoors/rift/targets/EscapeTarget.java index 9e6d993f..08796442 100644 --- a/common/src/main/java/org/dimdev/dimdoors/rift/targets/EscapeTarget.java +++ b/common/src/main/java/org/dimdev/dimdoors/rift/targets/EscapeTarget.java @@ -72,15 +72,15 @@ public boolean receiveEntity(Entity entity, Vec3 relativePos, Rotations relative if (DimensionalDoors.getWorld(targetWorldResourceKey) != null) { LOGGER.log(Level.INFO, "Sending player from limbo to the exit dimension, good luck!"); var level = DimensionalDoors.getWorld(targetWorldResourceKey); - destLoc = new Location(level, level.getHeightmapPos(Heightmap.Types.WORLD_SURFACE, entity.blockPosition())); + destLoc = new Location(level, Location.getHeightmapPosSafe(level, Heightmap.Types.WORLD_SURFACE, entity.blockPosition())); } else { LOGGER.log(Level.INFO, "Target dimension defined in config does not exist. Use /forge dimensions for a list!"); LOGGER.log(Level.INFO, "Sending player from limbo to worldspawn, good luck!"); - destLoc = new Location(DimensionalDoors.getServer().overworld(), DimensionalDoors.getServer().overworld().getHeightmapPos(Heightmap.Types.WORLD_SURFACE, DimensionalDoors.getServer().overworld().getSharedSpawnPos())); + destLoc = new Location(DimensionalDoors.getServer().overworld(), Location.getHeightmapPosSafe(DimensionalDoors.getServer().overworld(), Heightmap.Types.WORLD_SURFACE, DimensionalDoors.getServer().overworld().getSharedSpawnPos())); } } else { LOGGER.log(Level.INFO, "sending player from limbo to worldspawn, good luck!"); - destLoc = new Location(DimensionalDoors.getServer().overworld(), DimensionalDoors.getServer().overworld().getHeightmapPos(Heightmap.Types.WORLD_SURFACE, DimensionalDoors.getServer().overworld().getSharedSpawnPos())); + destLoc = new Location(DimensionalDoors.getServer().overworld(), Location.getHeightmapPosSafe(DimensionalDoors.getServer().overworld(), Heightmap.Types.WORLD_SURFACE, DimensionalDoors.getServer().overworld().getSharedSpawnPos())); }