package com.hypixel.hytale.server.core.universe.world.spawn;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.codec.builder.BuilderCodec;
import com.hypixel.hytale.math.util.ChunkUtil;
import com.hypixel.hytale.math.util.MathUtil;
import com.hypixel.hytale.math.vector.Transform;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.server.core.universe.world.World;
import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
import java.util.UUID;
import javax.annotation.Nonnull;
publicclassFitToHeightMapSpawnProviderimplementsISpawnProvider {
@Nonnullpublicstatic BuilderCodec<FitToHeightMapSpawnProvider> CODEC;
private ISpawnProvider spawnProvider;
protectedFitToHeightMapSpawnProvider() {
}
publicFitToHeightMapSpawnProvider(@Nonnull ISpawnProvider spawnProvider) {
this.spawnProvider = spawnProvider;
}
@Nonnullpublic Transform getSpawnPoint(@Nonnull World world, @Nonnull UUID uuid) {
TransformspawnPoint=this.spawnProvider.getSpawnPoint(world, uuid);
Vector3dposition= spawnPoint.getPosition();
if (position.getY() < 0.0) {
WorldChunkworldChunk= world.getNonTickingChunk(ChunkUtil.indexChunkFromBlock(position.getX(), position.getZ()));
if (worldChunk != null) {
intx= MathUtil.floor(position.getX());
intz= MathUtil.floor(position.getZ());
position.setY((double)(worldChunk.getHeight(x, z) + 1));
}
}
return spawnPoint;
}
public Transform[] getSpawnPoints() {
returnthis.spawnProvider.getSpawnPoints();
}
publicbooleanisWithinSpawnDistance(@Nonnull Vector3d position, double distance) {
returnthis.spawnProvider.isWithinSpawnDistance(position, distance);
}
static {
CODEC = ((BuilderCodec.Builder)((BuilderCodec.Builder)BuilderCodec.builder(FitToHeightMapSpawnProvider.class, FitToHeightMapSpawnProvider::new).documentation("A spawn provider that takes a spawn point from another provider and attempts to fit it to the heightmap of the world whenever the spawn point would place the player out of bounds.")).append(newKeyedCodec("SpawnProvider", ISpawnProvider.CODEC), (o, i) -> o.spawnProvider = i, (o) -> o.spawnProvider).documentation("The target spawn provider to take the initial spawn point from.").add()).build();
}
}