This commit is contained in:
Shadows_of_Fire 2019-02-06 15:01:33 -05:00
parent 81a988811b
commit 7fe79f09be
2 changed files with 59 additions and 51 deletions

View file

@ -57,7 +57,9 @@ public enum ConfigBoolValues{
MOST_BLAND_PERSON_EVER("No Colored Item Names", ConfigCategories.OTHER, false, "If you want to be really boring and lame, you can turn on this setting to disable colored names on Actually Additions items. Because why would you want things to look pretty anyways, right?"),
COLOR_LENS_USES_OREDICT("Color Lens Oredict", ConfigCategories.OTHER, false, "If true, the Lens of Color will attempt to pull from the oredict instead of only using vanilla dyes."),
SOLID_XP_ALWAYS_ORBS("Solid XP Orbs", ConfigCategories.OTHER, false, "If true, Solidified Experience will always spawn orbs, even for regular players.");
SOLID_XP_ALWAYS_ORBS("Solid XP Orbs", ConfigCategories.OTHER, false, "If true, Solidified Experience will always spawn orbs, even for regular players."),
ORE_GEN_DIM_WHITELIST("Ore Gen Whitelist", ConfigCategories.WORLD_GEN, false, "If true, the ore gen dimension blacklist will be treated as a whitelist.");
public final String name;

View file

@ -10,6 +10,11 @@
package de.ellpeck.actuallyadditions.mod.gen;
import java.util.ArrayList;
import java.util.Random;
import org.apache.commons.lang3.ArrayUtils;
import de.ellpeck.actuallyadditions.mod.ActuallyAdditions;
import de.ellpeck.actuallyadditions.mod.blocks.BlockMisc;
import de.ellpeck.actuallyadditions.mod.blocks.BlockWildPlant;
@ -43,68 +48,69 @@ import net.minecraftforge.fml.common.IWorldGenerator;
import net.minecraftforge.fml.common.eventhandler.Event;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.registry.GameRegistry;
import org.apache.commons.lang3.ArrayUtils;
import java.util.ArrayList;
import java.util.Random;
public class OreGen implements IWorldGenerator{
public class OreGen implements IWorldGenerator {
public static final int QUARTZ_MIN = 0;
public static final int QUARTZ_MAX = 45;
private final WorldGenLushCaves caveGen = new WorldGenLushCaves();
public OreGen(){
public OreGen() {
ActuallyAdditions.LOGGER.info("Registering World Generator...");
GameRegistry.registerWorldGenerator(this, 10000);
MinecraftForge.TERRAIN_GEN_BUS.register(this);
}
@Override
public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider){
public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) {
int dimension = world.provider.getDimension();
if(dimension != -1 && dimension != 1){
if(world.getWorldType() != WorldType.FLAT && !ArrayUtils.contains(ConfigIntListValues.ORE_GEN_DIMENSION_BLACKLIST.getValue(), world.provider.getDimension())){
if (dimension != -1 && dimension != 1) {
if (world.getWorldType() != WorldType.FLAT && canGen(world.provider.getDimension())) {
this.generateDefault(world, random, chunkX, chunkZ);
}
}
}
private void generateDefault(World world, Random random, int x, int z){
if(ConfigBoolValues.GENERATE_QUARTZ.isEnabled()){
this.addOreSpawn(InitBlocks.blockMisc.getDefaultState().withProperty(BlockMisc.TYPE, TheMiscBlocks.ORE_QUARTZ), Blocks.STONE, world, random, x*16, z*16, MathHelper.getInt(random, 5, 8), 10, QUARTZ_MIN, QUARTZ_MAX);
private boolean canGen(int dimension) {
boolean inList = ArrayUtils.contains(ConfigIntListValues.ORE_GEN_DIMENSION_BLACKLIST.getValue(), dimension);
return (inList && ConfigBoolValues.ORE_GEN_DIM_WHITELIST.isEnabled()) || (!inList && !ConfigBoolValues.ORE_GEN_DIM_WHITELIST.isEnabled());
}
private void generateDefault(World world, Random random, int x, int z) {
if (ConfigBoolValues.GENERATE_QUARTZ.isEnabled()) {
this.addOreSpawn(InitBlocks.blockMisc.getDefaultState().withProperty(BlockMisc.TYPE, TheMiscBlocks.ORE_QUARTZ), Blocks.STONE, world, random, x * 16, z * 16, MathHelper.getInt(random, 5, 8), 10, QUARTZ_MIN, QUARTZ_MAX);
}
if(ConfigBoolValues.GEN_LUSH_CAVES.isEnabled()){
if (ConfigBoolValues.GEN_LUSH_CAVES.isEnabled()) {
int randConst = 0x969ce69d;//so that it won't generate the same numbers as other mod that does the same thing
Random chunkRand = new Random(randConst ^ world.getSeed() ^ (x*29+z*31));
Random chunkRand = new Random(randConst ^ world.getSeed() ^ (x * 29 + z * 31));
StructureBoundingBox box = new StructureBoundingBox(x*16+8, 0, z*16+8, x*16+8+15, 255, z*16+8+15);
if(chunkRand.nextInt(ConfigIntValues.LUSH_CAVE_CHANCE.getValue()) <= 0){
BlockPos randPos = world.getTopSolidOrLiquidBlock(new BlockPos(x*16+chunkRand.nextInt(16)+8, 0, z*16+chunkRand.nextInt(16)+8));
BlockPos pos = randPos.down(MathHelper.getInt(chunkRand, 15, randPos.getY()-15));
StructureBoundingBox box = new StructureBoundingBox(x * 16 + 8, 0, z * 16 + 8, x * 16 + 8 + 15, 255, z * 16 + 8 + 15);
if (chunkRand.nextInt(ConfigIntValues.LUSH_CAVE_CHANCE.getValue()) <= 0) {
BlockPos randPos = world.getTopSolidOrLiquidBlock(new BlockPos(x * 16 + chunkRand.nextInt(16) + 8, 0, z * 16 + chunkRand.nextInt(16) + 8));
BlockPos pos = randPos.down(MathHelper.getInt(chunkRand, 15, randPos.getY() - 15));
this.caveGen.generate(world, chunkRand, pos, box);
}
}
}
public void addOreSpawn(IBlockState state, Block blockIn, World world, Random random, int blockXPos, int blockZPos, int maxVeinSize, int chancesToSpawn, int minY, int maxY){
for(int i = 0; i < chancesToSpawn; i++){
int posX = blockXPos+random.nextInt(16);
int posY = minY+random.nextInt(maxY-minY);
int posZ = blockZPos+random.nextInt(16);
public void addOreSpawn(IBlockState state, Block blockIn, World world, Random random, int blockXPos, int blockZPos, int maxVeinSize, int chancesToSpawn, int minY, int maxY) {
for (int i = 0; i < chancesToSpawn; i++) {
int posX = blockXPos + random.nextInt(16);
int posY = minY + random.nextInt(maxY - minY);
int posZ = blockZPos + random.nextInt(16);
new WorldGenMinable(state, maxVeinSize, BlockMatcher.forBlock(blockIn)).generate(world, random, new BlockPos(posX, posY, posZ));
}
}
@SubscribeEvent
public void onWorldDecoration(DecorateBiomeEvent.Decorate event){
if((event.getResult() == Event.Result.ALLOW || event.getResult() == Event.Result.DEFAULT)){
if(event.getType() == EventType.FLOWERS){
if(!ArrayUtils.contains(ConfigIntListValues.PLANT_DIMENSION_BLACKLIST.getValue(), event.getWorld().provider.getDimension())){
public void onWorldDecoration(DecorateBiomeEvent.Decorate event) {
if ((event.getResult() == Event.Result.ALLOW || event.getResult() == Event.Result.DEFAULT)) {
if (event.getType() == EventType.FLOWERS) {
if (!ArrayUtils.contains(ConfigIntListValues.PLANT_DIMENSION_BLACKLIST.getValue(), event.getWorld().provider.getDimension())) {
this.generateRice(event);
IBlockState plantDefault = InitBlocks.blockWildPlant.getDefaultState();
this.genPlantNormally(plantDefault.withProperty(BlockWildPlant.TYPE, TheWildPlants.CANOLA), ConfigIntValues.CANOLA_AMOUNT.getValue(), ConfigBoolValues.DO_CANOLA_GEN.isEnabled(), Material.GRASS, event);
@ -114,17 +120,17 @@ public class OreGen implements IWorldGenerator{
}
}
if(event.getType() == EventType.LILYPAD){
if (event.getType() == EventType.LILYPAD) {
//Generate Treasure Chests
if(ConfigBoolValues.DO_TREASURE_CHEST_GEN.isEnabled()){
if(event.getRand().nextInt(40) == 0){
BlockPos randomPos = event.getChunkPos().getBlock(event.getRand().nextInt(16)+8, 0, event.getRand().nextInt(16)+8);
if (ConfigBoolValues.DO_TREASURE_CHEST_GEN.isEnabled()) {
if (event.getRand().nextInt(40) == 0) {
BlockPos randomPos = event.getChunkPos().getBlock(event.getRand().nextInt(16) + 8, 0, event.getRand().nextInt(16) + 8);
randomPos = event.getWorld().getTopSolidOrLiquidBlock(randomPos);
if(event.getWorld().getBiome(randomPos) instanceof BiomeOcean){
if(randomPos.getY() >= 25 && randomPos.getY() <= 45){
if(event.getWorld().getBlockState(randomPos).getMaterial() == Material.WATER){
if(event.getWorld().getBlockState(randomPos.down()).getMaterial().isSolid()){
if (event.getWorld().getBiome(randomPos) instanceof BiomeOcean) {
if (randomPos.getY() >= 25 && randomPos.getY() <= 45) {
if (event.getWorld().getBlockState(randomPos).getMaterial() == Material.WATER) {
if (event.getWorld().getBlockState(randomPos.down()).getMaterial().isSolid()) {
event.getWorld().setBlockState(randomPos, InitBlocks.blockTreasureChest.getDefaultState().withProperty(BlockHorizontal.FACING, EnumFacing.byHorizontalIndex(event.getRand().nextInt(4))), 2);
}
}
@ -136,18 +142,18 @@ public class OreGen implements IWorldGenerator{
}
}
private void generateRice(DecorateBiomeEvent event){
if(ConfigBoolValues.DO_RICE_GEN.isEnabled()){
for(int i = 0; i < ConfigIntValues.RICE_AMOUNT.getValue(); i++){
if(event.getRand().nextInt(3) == 0){
BlockPos randomPos = event.getChunkPos().getBlock(event.getRand().nextInt(16)+8, 0, event.getRand().nextInt(16)+8);
private void generateRice(DecorateBiomeEvent event) {
if (ConfigBoolValues.DO_RICE_GEN.isEnabled()) {
for (int i = 0; i < ConfigIntValues.RICE_AMOUNT.getValue(); i++) {
if (event.getRand().nextInt(3) == 0) {
BlockPos randomPos = event.getChunkPos().getBlock(event.getRand().nextInt(16) + 8, 0, event.getRand().nextInt(16) + 8);
randomPos = event.getWorld().getTopSolidOrLiquidBlock(randomPos);
if(event.getWorld().getBlockState(randomPos).getMaterial() == Material.WATER){
if (event.getWorld().getBlockState(randomPos).getMaterial() == Material.WATER) {
ArrayList<Material> blocksAroundBottom = WorldUtil.getMaterialsAround(event.getWorld(), randomPos);
BlockPos posToGenAt = randomPos.up();
ArrayList<Material> blocksAroundTop = WorldUtil.getMaterialsAround(event.getWorld(), posToGenAt);
if(blocksAroundBottom.contains(Material.GRASS) || blocksAroundBottom.contains(Material.GROUND) || blocksAroundBottom.contains(Material.ROCK) || blocksAroundBottom.contains(Material.SAND)){
if(!blocksAroundTop.contains(Material.WATER) && event.getWorld().getBlockState(posToGenAt).getMaterial() == Material.AIR){
if (blocksAroundBottom.contains(Material.GRASS) || blocksAroundBottom.contains(Material.GROUND) || blocksAroundBottom.contains(Material.ROCK) || blocksAroundBottom.contains(Material.SAND)) {
if (!blocksAroundTop.contains(Material.WATER) && event.getWorld().getBlockState(posToGenAt).getMaterial() == Material.AIR) {
event.getWorld().setBlockState(posToGenAt, InitBlocks.blockWildPlant.getDefaultState().withProperty(BlockWildPlant.TYPE, TheWildPlants.RICE), 2);
}
}
@ -157,15 +163,15 @@ public class OreGen implements IWorldGenerator{
}
}
private void genPlantNormally(IBlockState plant, int amount, boolean doIt, Material blockBelow, DecorateBiomeEvent event){
if(doIt){
for(int i = 0; i < amount; i++){
if(event.getRand().nextInt(100) == 0){
BlockPos randomPos = event.getChunkPos().getBlock(event.getRand().nextInt(16)+8, 0, event.getRand().nextInt(16)+8);
private void genPlantNormally(IBlockState plant, int amount, boolean doIt, Material blockBelow, DecorateBiomeEvent event) {
if (doIt) {
for (int i = 0; i < amount; i++) {
if (event.getRand().nextInt(100) == 0) {
BlockPos randomPos = event.getChunkPos().getBlock(event.getRand().nextInt(16) + 8, 0, event.getRand().nextInt(16) + 8);
randomPos = event.getWorld().getTopSolidOrLiquidBlock(randomPos);
if(event.getWorld().getBlockState(randomPos.down()).getMaterial() == blockBelow){
if(plant.getBlock().canPlaceBlockAt(event.getWorld(), randomPos) && event.getWorld().isAirBlock(randomPos)){
if (event.getWorld().getBlockState(randomPos.down()).getMaterial() == blockBelow) {
if (plant.getBlock().canPlaceBlockAt(event.getWorld(), randomPos) && event.getWorld().isAirBlock(randomPos)) {
event.getWorld().setBlockState(randomPos, plant, 2);
}
}