package eiteam.esteemedinnovation.materials.raw;
import eiteam.esteemedinnovation.commons.Config;
import eiteam.esteemedinnovation.commons.util.WorldHelper;
import net.minecraft.block.BlockFurnace;
import net.minecraft.init.Blocks;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityChest;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraft.world.chunk.IChunkGenerator;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraftforge.fml.common.IWorldGenerator;
import java.util.Random;
import static eiteam.esteemedinnovation.materials.MaterialsModule.ORE_DEPOSIT_GENERATOR;
import static eiteam.esteemedinnovation.materials.MaterialsModule.WORKED_OUT_ORE_DEPOSIT_LOOTTABLE;
public class SurfaceDepositOreGenerator implements IWorldGenerator {
@Override
public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) {
if (world.provider.getDimension() == 0) {
boolean doCopperDeposit = random.nextInt(16) == 1;
boolean doZincDeposit = random.nextInt(16) == 2;
int coordX = chunkX * 16;
int coordZ = chunkZ * 16;
if (doCopperDeposit) {
if (Config.genCopperOverworldDeposits) {
generateDepositGenerators(random, coordX, coordZ, world, BlockOreDepositGenerator.Types.COPPER);
}
} else if (doZincDeposit) {
if (Config.genZincOverworldDeposits) {
generateDepositGenerators(random, coordX, coordZ, world, BlockOreDepositGenerator.Types.ZINC);
}
}
}
}
private static void generateDepositGenerators(Random random, int baseX, int baseZ, World world, BlockOreDepositGenerator.Types type) {
// 30% of deposits are worked out
boolean workedOut = random.nextInt(10) <= 3;
WorldGenSingleMinable minable = new WorldGenSingleMinable(ORE_DEPOSIT_GENERATOR.getDefaultState()
.withProperty(BlockOreDepositGenerator.VARIANT, type)
.withProperty(BlockOreDepositGenerator.WORKED_OUT, workedOut));
int baseY = random.nextInt(40);
for (int i = 0; i < 9; i++) {
boolean generate = i <= 5 || random.nextBoolean();
if (!generate) {
continue;
}
BlockPos pos = new BlockPos(baseX + random.nextInt(16), baseY + random.nextInt(16), baseZ + random.nextInt(16));
boolean generated = minable.generate(world, random, pos);
if (!workedOut || !generated) {
continue;
}
if (!random.nextBoolean()) {
boolean genChest = random.nextBoolean();
boolean genBench = random.nextBoolean();
boolean genSmelt = random.nextBoolean();
for (EnumFacing dir : EnumFacing.HORIZONTALS) {
BlockPos offset = pos.offset(dir, random.nextInt(3) + 1);
if (BlockOreDepositGenerator.canReplace(offset, world)) {
continue;
}
if (genChest) {
world.setTileEntity(offset, new TileEntityChest());
world.setBlockState(offset, Blocks.CHEST.correctFacing(world, offset, Blocks.CHEST.getDefaultState()));
TileEntity tileentity = world.getTileEntity(offset);
if (tileentity instanceof TileEntityChest) {
TileEntityChest chest = (TileEntityChest) tileentity;
chest.setLootTable(WORKED_OUT_ORE_DEPOSIT_LOOTTABLE, random.nextLong());
}
genChest = false;
} else if (genBench) {
world.setBlockState(offset, Blocks.CRAFTING_TABLE.getDefaultState());
genBench = false;
} else if (genSmelt) {
world.setBlockState(offset,
Blocks.FURNACE.getDefaultState().withProperty(BlockFurnace.FACING, WorldHelper.randomHorizontal(random)));
genSmelt = false;
}
}
}
BlockPos.MutableBlockPos mutablePos = new BlockPos.MutableBlockPos(pos);
for (int x = -3; x < 4; x++) {
for (int y = 0; y < 2; y++) {
for (int z = -3; z < 4; z++) {
mutablePos.setPos(pos.getX() + x, pos.getY() + y, pos.getZ() + z);
if (BlockOreDepositGenerator.canReplace(mutablePos, world)) {
world.setBlockToAir(mutablePos);
}
}
}
}
}
}
}