Code/net/minecraft/server/level/PlayerRespawnLogic.java

63 lines
2.7 KiB
Java
Raw Permalink Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.server.level;
import javax.annotation.Nullable;
import net.minecraft.SharedConstants;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.core.SectionPos;
import net.minecraft.world.level.ChunkPos;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.chunk.LevelChunk;
import net.minecraft.world.level.levelgen.Heightmap;
public class PlayerRespawnLogic {
@Nullable
protected static BlockPos getOverworldRespawnPos(ServerLevel p_183929_, int p_183930_, int p_183931_) {
boolean flag = p_183929_.dimensionType().hasCeiling();
LevelChunk levelchunk = p_183929_.getChunk(SectionPos.blockToSectionCoord(p_183930_), SectionPos.blockToSectionCoord(p_183931_));
int i = flag ? p_183929_.getChunkSource().getGenerator().getSpawnHeight(p_183929_) : levelchunk.getHeight(Heightmap.Types.MOTION_BLOCKING, p_183930_ & 15, p_183931_ & 15);
if (i < p_183929_.getMinY()) {
return null;
} else {
int j = levelchunk.getHeight(Heightmap.Types.WORLD_SURFACE, p_183930_ & 15, p_183931_ & 15);
if (j <= i && j > levelchunk.getHeight(Heightmap.Types.OCEAN_FLOOR, p_183930_ & 15, p_183931_ & 15)) {
return null;
} else {
BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos();
for (int k = i + 1; k >= p_183929_.getMinY(); k--) {
blockpos$mutableblockpos.set(p_183930_, k, p_183931_);
BlockState blockstate = p_183929_.getBlockState(blockpos$mutableblockpos);
if (!blockstate.getFluidState().isEmpty()) {
break;
}
if (Block.isFaceFull(blockstate.getCollisionShape(p_183929_, blockpos$mutableblockpos), Direction.UP)) {
return blockpos$mutableblockpos.above().immutable();
}
}
return null;
}
}
}
@Nullable
public static BlockPos getSpawnPosInChunk(ServerLevel p_183933_, ChunkPos p_183934_) {
if (SharedConstants.debugVoidTerrain(p_183934_)) {
return null;
} else {
for (int i = p_183934_.getMinBlockX(); i <= p_183934_.getMaxBlockX(); i++) {
for (int j = p_183934_.getMinBlockZ(); j <= p_183934_.getMaxBlockZ(); j++) {
BlockPos blockpos = getOverworldRespawnPos(p_183933_, i, j);
if (blockpos != null) {
return blockpos;
}
}
}
return null;
}
}
}