// 
// Decompiled by Procyon v0.6.0
// 

package com.hypixel.hytale.server.core.universe.world.spawn;

import com.hypixel.hytale.codec.Codec;
import com.hypixel.hytale.codec.KeyedCodec;
import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
import com.hypixel.hytale.math.vector.Vector3d;
import com.hypixel.hytale.math.util.MathUtil;
import com.hypixel.hytale.math.util.ChunkUtil;
import com.hypixel.hytale.math.vector.Transform;
import java.util.UUID;
import com.hypixel.hytale.server.core.universe.world.World;
import javax.annotation.Nonnull;
import com.hypixel.hytale.codec.builder.BuilderCodec;

public class FitToHeightMapSpawnProvider implements ISpawnProvider
{
    @Nonnull
    public static BuilderCodec<FitToHeightMapSpawnProvider> CODEC;
    private ISpawnProvider spawnProvider;
    
    protected FitToHeightMapSpawnProvider() {
    }
    
    public FitToHeightMapSpawnProvider(@Nonnull final ISpawnProvider spawnProvider) {
        this.spawnProvider = spawnProvider;
    }
    
    @Nonnull
    @Override
    public Transform getSpawnPoint(@Nonnull final World world, @Nonnull final UUID uuid) {
        final Transform spawnPoint = this.spawnProvider.getSpawnPoint(world, uuid);
        final Vector3d position = spawnPoint.getPosition();
        if (position.getY() < 0.0) {
            final WorldChunk worldChunk = world.getNonTickingChunk(ChunkUtil.indexChunkFromBlock(position.getX(), position.getZ()));
            if (worldChunk != null) {
                final int x = MathUtil.floor(position.getX());
                final int z = MathUtil.floor(position.getZ());
                position.setY(worldChunk.getHeight(x, z) + 1);
            }
        }
        return spawnPoint;
    }
    
    @Override
    public Transform[] getSpawnPoints() {
        return this.spawnProvider.getSpawnPoints();
    }
    
    @Override
    public boolean isWithinSpawnDistance(@Nonnull final Vector3d position, final double distance) {
        return this.spawnProvider.isWithinSpawnDistance(position, distance);
    }
    
    static {
        FitToHeightMapSpawnProvider.CODEC = 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(new KeyedCodec("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();
    }
}
