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

package com.hypixel.hytale.server.worldgen.chunk.populator;

import com.hypixel.hytale.server.core.asset.type.fluid.FluidTicker;
import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
import com.hypixel.hytale.server.worldgen.container.WaterContainer;
import com.hypixel.hytale.server.worldgen.biome.Biome;
import javax.annotation.Nonnull;
import com.hypixel.hytale.server.worldgen.chunk.ChunkGeneratorExecution;

public class WaterPopulator
{
    public static void populate(final int seed, @Nonnull final ChunkGeneratorExecution execution) {
        for (int cx = 0; cx < 32; ++cx) {
            for (int cz = 0; cz < 32; ++cz) {
                submergeColumn(seed, cx, cz, execution);
            }
        }
    }
    
    private static void submergeColumn(final int seed, final int cx, final int cz, @Nonnull final ChunkGeneratorExecution execution) {
        final Biome biome = execution.zoneBiomeResult(cx, cz).getBiome();
        final int x = execution.globalX(cx);
        final int z = execution.globalZ(cz);
        final WaterContainer waterContainer = biome.getWaterContainer();
        for (final WaterContainer.Entry waterEntry : waterContainer.getEntries()) {
            if (waterEntry.shouldPopulate(seed, x, z)) {
                final int waterMin = waterEntry.getMin(seed, x, z);
                final int waterMax = waterEntry.getMax(seed, x, z);
                if (waterMin <= waterMax) {
                    final int blockId = waterEntry.getBlock();
                    final int fluidId = waterEntry.getFluid();
                    for (int y = waterMin; y <= waterMax; ++y) {
                        submergeBlock(cx, y, cz, blockId, fluidId, execution);
                    }
                }
            }
        }
    }
    
    private static void submergeBlock(final int cx, final int y, final int cz, final int blockId, final int fluidId, @Nonnull final ChunkGeneratorExecution execution) {
        final byte rawPriority = execution.getPriorityChunk().getRaw(cx, y, cz);
        final byte priority = (byte)(rawPriority & 0x1F);
        if (priority >= 4 && (rawPriority & 0x20) == 0x0) {
            return;
        }
        int currentBlockId;
        if (blockId != 0 && priority < 4) {
            execution.setBlock(cx, y, cz, (byte)(-1), blockId);
            currentBlockId = blockId;
        }
        else {
            currentBlockId = execution.getBlock(cx, y, cz);
        }
        final BlockType blockType = BlockType.getAssetMap().getAsset(currentBlockId);
        if (blockType == null || FluidTicker.isSolid(blockType)) {
            return;
        }
        execution.setFluid(cx, y, cz, (byte)(-1), fluidId);
    }
}
