/** * Copyright (c) Lambda Innovation, 2013-2016 * This file is part of the AcademyCraft mod. * https://github.com/LambdaInnovation/AcademyCraft * Licensed under GPLv3, see project root for more information. */ package cn.academy.crafting; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.init.Blocks; import net.minecraft.world.EnumSkyBlock; import net.minecraft.world.World; import net.minecraft.world.biome.BiomeGenBase; import net.minecraft.world.gen.feature.WorldGenerator; import java.util.Random; public class WorldGenPhaseLiq extends WorldGenerator { private Block theBlock; public WorldGenPhaseLiq() { this.theBlock = ModuleCrafting.imagPhase; } @Override public boolean generate(World world, Random random, int x, int y, int z) { for (x -= 8, z -= 8; y > 5 && world.isAirBlock(x, y, z); --y) ; // Find a non-air-block as origin to generate. if (y <= 4) return false; y -= 4; boolean[] buffer = new boolean[2048]; for (int i = 0, loops = random.nextInt(4) + 4; i < loops; ++i) { double d0 = random.nextDouble() * 6.0D + 3.0D; // 3~9 double d1 = random.nextDouble() * 4.0D + 2.0D; // 2~6 double d2 = random.nextDouble() * 6.0D + 3.0D; // 3~9 double d3 = random.nextDouble() * (14.0D - d0) + 1.0D + d0 / 2.0D; double d4 = random.nextDouble() * (4.0D - d1) + 2.0D + d1 / 2.0D; double d5 = random.nextDouble() * (14.0D - d2) + 1.0D + d2 / 2.0D; for (int j = 1; j < 15; ++j) { for (int k = 1; k < 15; ++k) { for (int l = 1; l < 7; ++l) { double d6 = (j - d3) / (d0 / 2.0D); double d7 = (l - d4) / (d1 / 2.0D); double d8 = (k - d5) / (d2 / 2.0D); double d9 = d6 * d6 + d7 * d7 + d8 * d8; if (d9 < 0.6D) { buffer[(j * 16 + k) * 8 + l] = true; } } } } } boolean flag; for (int i = 0; i < 16; ++i) { for (int j2 = 0; j2 < 16; ++j2) { for (int j1 = 0; j1 < 8; ++j1) { flag = !buffer[(i * 16 + j2) * 8 + j1] && (i < 15 && buffer[((i + 1) * 16 + j2) * 8 + j1] || i > 0 && buffer[((i - 1) * 16 + j2) * 8 + j1] || j2 < 15 && buffer[(i * 16 + j2 + 1) * 8 + j1] || j2 > 0 && buffer[(i * 16 + (j2 - 1)) * 8 + j1] || j1 < 7 && buffer[(i * 16 + j2) * 8 + j1 + 1] || j1 > 0 && buffer[(i * 16 + j2) * 8 + (j1 - 1)]); if (flag) { Material material = world.getBlock(x + i, y + j1, z + j2).getMaterial(); if (j1 >= 4 && material.isLiquid()) { return false; } if (j1 < 4 && !material.isSolid() && world.getBlock(x + i, y + j1, z + j2) != this.theBlock) { return false; } } } } } for (int i1 = 0; i1 < 16; ++i1) { for (int j2 = 0; j2 < 16; ++j2) { for (int j1 = 0; j1 < 8; ++j1) { if (buffer[(i1 * 16 + j2) * 8 + j1]) { world.setBlock(x + i1, y + j1, z + j2, j1 >= 4 ? Blocks.air : this.theBlock, 0, 2); } } } } for (int i1 = 0; i1 < 16; ++i1) { for (int j2 = 0; j2 < 16; ++j2) { for (int j1 = 4; j1 < 8; ++j1) { if (buffer[(i1 * 16 + j2) * 8 + j1] && world.getBlock(x + i1, y + j1 - 1, z + j2) == Blocks.dirt && world.getSavedLightValue(EnumSkyBlock.Sky, x + i1, y + j1, z + j2) > 0) { BiomeGenBase biomegenbase = world.getBiomeGenForCoords(x + i1, z + j2); if (biomegenbase.topBlock == Blocks.mycelium) { world.setBlock(x + i1, y + j1 - 1, z + j2, Blocks.mycelium, 0, 2); } else { world.setBlock(x + i1, y + j1 - 1, z + j2, Blocks.grass, 0, 2); } } } } } for (int i1 = 0; i1 < 16; ++i1) { for (int j2 = 0; j2 < 16; ++j2) { if (world.isBlockFreezable(x + i1, y + 4, z + j2)) { world.setBlock(x + i1, y + 4, z + j2, Blocks.ice, 0, 2); } } } return true; } }