From b90f9cc56f1f584e9e31add94c2e3a7efca5c48a Mon Sep 17 00:00:00 2001 From: Noah Jelen Date: Thu, 20 Sep 2018 08:18:52 -0700 Subject: [PATCH] I'm finally finished! --- changelog.txt | 8 +- .../NetherNoah/ParadiseMod/ParadiseMod.java | 76 +++-- .../ParadiseMod/blocks/formations/icicle.java | 2 + .../formations/mossyStoneFormation.java | 100 ++++++ .../formations/netherrackFormation.java | 100 ++++++ .../blocks/formations/sandstoneFormation.java | 100 ++++++ .../blocks/formations/stoneFormation.java | 100 ++++++ .../blocks/misc/bulletproofGlass.java | 60 ++++ .../blocks/misc/prismarineCrystalBlock.java | 80 +++++ .../blocks/misc/undergroundAir.java | 14 + .../ParadiseMod/handlers/CaveGenHandler.java | 320 ------------------ .../ParadiseMod/init/ModBlocks/Misc.java | 34 +- .../world/dimension/DUChunkGenerator.java | 20 +- .../world/dimension/DUWorldProvider.java | 3 +- .../world/dimension/DVWorldProvider.java | 3 +- .../world/worldgen/caveGen/CaveGenBase.java | 114 +++++++ .../worldgen/caveGen/CaveGenCrystal.java | 68 ++++ .../world/worldgen/caveGen/CaveGenDesert.java | 106 ++++++ .../world/worldgen/caveGen/CaveGenHumid.java | 135 ++++++++ .../world/worldgen/caveGen/CaveGenIcy.java | 104 ++++++ .../world/worldgen/caveGen/CaveGenMesa.java | 137 ++++++++ .../caveGen/CaveGenMushroomIsland.java | 114 +++++++ .../world/worldgen/caveGen/CaveGenOcean.java | 95 ++++++ .../world/worldgen/misc/DUTrees.java | 96 ++++-- .../world/worldgen/misc/DUTreesGen.java | 99 ------ .../world/worldgen/misc/DirtGen.java | 11 +- .../ParadiseMod/world/worldgen/misc/Rose.java | 48 ++- .../world/worldgen/misc/RoseGen.java | 83 ----- .../world/worldgen/ores/OreGenEnd.java | 11 +- .../world/worldgen/ores/OreGenNether.java | 11 +- .../world/worldgen/ores/OreGenOverworld.java | 11 +- .../structures/AttieCat/JeffTank.java | 46 ++- .../structures/AttieCat/JeffTankGen.java | 75 ---- .../worldgen/structures/AttieCat/Shrine.java | 74 +++- .../structures/AttieCat/ShrineGen.java | 81 ----- .../world/worldgen/structures/Buoy.java | 54 ++- .../world/worldgen/structures/BuoyGen.java | 54 --- .../structures/Dungeons/Dungeons.java | 46 --- .../structures/Dungeons/Minerbase.java | 22 +- .../structures/Dungeons/VoidDungeonGen.java | 87 ----- .../Dungeons/VoidDungeonLargeGen.java | 89 ----- .../structures/Dungeons/VoidTower.java | 7 +- .../structures/Dungeons/VoidTowerGen.java | 90 ----- .../world/worldgen/structures/EasterEgg.java | 56 ++- .../world/worldgen/structures/EasterEgg2.java | 34 -- .../worldgen/structures/EasterEgg2Gen.java | 46 --- .../worldgen/structures/EasterEggGen.java | 52 --- .../worldgen/structures/GiantGrassBlock.java | 45 ++- .../structures/GiantGrassBlockGen.java | 52 --- .../world/worldgen/structures/Home.java | 85 ++++- .../world/worldgen/structures/HomeGen.java | 103 ------ .../structures/Landmines/LandMine.java | 61 +++- .../structures/Landmines/LandMineDirt.java | 76 ++++- .../structures/Landmines/LandMineDirtGen.java | 80 ----- .../structures/Landmines/LandMineGen.java | 79 ----- .../structures/Landmines/LandMineStone.java | 46 ++- .../Landmines/LandMineStoneGen.java | 77 ----- .../world/worldgen/structures/Ocean.java | 10 +- .../worldgen/structures/PlayerTempleGen.java | 67 ---- .../worldgen/structures/PlayerTemples.java | 56 ++- .../worldgen/structures/RoguePortal.java | 68 +++- .../worldgen/structures/RoguePortalGen.java | 75 ---- .../world/worldgen/structures/Runway.java | 58 +++- .../world/worldgen/structures/RunwayGen.java | 66 ---- .../world/worldgen/structures/SkyWheel.java | 47 ++- .../worldgen/structures/SkyWheelGen.java | 46 --- .../worldgen/structures/TreasureChest.java | 48 ++- .../worldgen/structures/TreasureChestGen.java | 54 --- .../structures/UndergroundVillage.java | 51 ++- .../structures/UndergroundVillageGen.java | 49 --- .../world/worldgen/structures/WickerMan.java | 67 +++- .../worldgen/structures/WickerManGen.java | 79 ----- .../assets/minecraft/textures/blocks/ice.png | Bin 150 -> 0 bytes .../minecraft/textures/blocks/netherrack.png | Bin 727 -> 0 bytes .../minecraft/textures/blocks/stone.png | Bin 223 -> 0 bytes .../achievement/achievement_background.png | Bin 4933 -> 0 bytes .../blockstates/bulletproof_glass.json | 1 + .../blockstates/mossy_stone_formation.json | 10 + .../blockstates/netherrack_formation.json | 10 + .../blockstates/prismarine_crystal_block.json | 1 + .../blockstates/sandstone_formation.json | 10 + .../blockstates/stone_formation.json | 10 + .../blockstates/unfinished/icicle.json | 10 - .../unfinished/netherrack_formation.json | 10 - .../assets/nnparadisemod/lang/en_US.lang | 8 +- .../models/block/bulletproof_glass.json | 1 + .../models/block/mossy_stone_formation.json | 45 +++ ...rmation.json => netherrack_formation.json} | 0 .../block/prismarine_crystal_block.json | 1 + .../models/block/sandstone_formation.json | 45 +++ ...ne_formation.json => stone_formation.json} | 0 .../models/item/bulletproof_glass.json | 1 + .../models/item/mossy_stone_formation.json | 82 +++++ .../models/item/netherrack_formation.json | 82 +++++ .../models/item/prismarine_crystal_block.json | 1 + .../models/item/sandstone_formation.json | 82 +++++ .../models/item/stone_formation.json | 82 +++++ .../recipes/bulletproof_glass.json | 20 ++ .../recipes/prismarine_crystal_block.json | 16 + .../nnparadisemod/structures/blue_rose.nbt | Bin 168 -> 0 bytes .../structures/cacti/cactus_1.nbt | Bin 203 -> 0 bytes .../structures/cacti/cactus_2.nbt | Bin 211 -> 0 bytes .../structures/cacti/cactus_3.nbt | Bin 217 -> 0 bytes .../nnparadisemod/structures/cacti/shrub.nbt | Bin 196 -> 0 bytes .../nnparadisemod/structures/easter_egg_2.nbt | Bin 8964 -> 9016 bytes .../structures/ocean_village.nbt | Bin 26944 -> 27035 bytes .../assets/nnparadisemod/structures/rose.nbt | Bin 163 -> 0 bytes .../structures/trees/acacia_sapling.nbt | Bin 217 -> 0 bytes .../structures/trees/birch_sapling.nbt | Bin 216 -> 0 bytes .../structures/trees/dark_oak_sapling.nbt | Bin 248 -> 0 bytes .../structures/trees/jungle_sapling.nbt | Bin 217 -> 0 bytes .../structures/trees/oak_sapling.nbt | Bin 214 -> 0 bytes .../structures/trees/spruce_sapling.nbt | Bin 216 -> 0 bytes .../structures/underground_village.nbt | Bin 37037 -> 37537 bytes .../textures/blocks/bulletproof_glass.png | Bin 0 -> 1556 bytes .../blocks/prismarine_crystal_block.png | Bin 0 -> 8487 bytes .../prismarine_crystal_block.png.mcmeta | 30 ++ src/main/resources/mcmod.info | 2 +- 118 files changed, 3007 insertions(+), 2274 deletions(-) create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/blocks/formations/mossyStoneFormation.java create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/blocks/formations/netherrackFormation.java create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/blocks/formations/sandstoneFormation.java create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/blocks/formations/stoneFormation.java create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/blocks/misc/bulletproofGlass.java create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/blocks/misc/prismarineCrystalBlock.java create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/blocks/misc/undergroundAir.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/handlers/CaveGenHandler.java create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenBase.java create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenCrystal.java create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenDesert.java create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenHumid.java create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenIcy.java create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenMesa.java create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenMushroomIsland.java create mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenOcean.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/DUTreesGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/RoseGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/JeffTankGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/ShrineGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/BuoyGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/Dungeons.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/VoidDungeonGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/VoidDungeonLargeGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/VoidTowerGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEgg2.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEgg2Gen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEggGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/GiantGrassBlockGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/HomeGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineDirtGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineStoneGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/PlayerTempleGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/RoguePortalGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/RunwayGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/SkyWheelGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/TreasureChestGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/UndergroundVillageGen.java delete mode 100644 src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/WickerManGen.java delete mode 100644 src/main/resources/assets/minecraft/textures/blocks/ice.png delete mode 100644 src/main/resources/assets/minecraft/textures/blocks/netherrack.png delete mode 100644 src/main/resources/assets/minecraft/textures/blocks/stone.png delete mode 100644 src/main/resources/assets/minecraft/textures/gui/achievement/achievement_background.png create mode 100644 src/main/resources/assets/nnparadisemod/blockstates/bulletproof_glass.json create mode 100644 src/main/resources/assets/nnparadisemod/blockstates/mossy_stone_formation.json create mode 100644 src/main/resources/assets/nnparadisemod/blockstates/netherrack_formation.json create mode 100644 src/main/resources/assets/nnparadisemod/blockstates/prismarine_crystal_block.json create mode 100644 src/main/resources/assets/nnparadisemod/blockstates/sandstone_formation.json create mode 100644 src/main/resources/assets/nnparadisemod/blockstates/stone_formation.json delete mode 100644 src/main/resources/assets/nnparadisemod/blockstates/unfinished/icicle.json delete mode 100644 src/main/resources/assets/nnparadisemod/blockstates/unfinished/netherrack_formation.json create mode 100644 src/main/resources/assets/nnparadisemod/models/block/bulletproof_glass.json create mode 100644 src/main/resources/assets/nnparadisemod/models/block/mossy_stone_formation.json rename src/main/resources/assets/nnparadisemod/models/block/{unfinished/ netherrack_formation.json => netherrack_formation.json} (100%) create mode 100644 src/main/resources/assets/nnparadisemod/models/block/prismarine_crystal_block.json create mode 100644 src/main/resources/assets/nnparadisemod/models/block/sandstone_formation.json rename src/main/resources/assets/nnparadisemod/models/block/{unfinished/ stone_formation.json => stone_formation.json} (100%) create mode 100644 src/main/resources/assets/nnparadisemod/models/item/bulletproof_glass.json create mode 100644 src/main/resources/assets/nnparadisemod/models/item/mossy_stone_formation.json create mode 100644 src/main/resources/assets/nnparadisemod/models/item/netherrack_formation.json create mode 100644 src/main/resources/assets/nnparadisemod/models/item/prismarine_crystal_block.json create mode 100644 src/main/resources/assets/nnparadisemod/models/item/sandstone_formation.json create mode 100644 src/main/resources/assets/nnparadisemod/models/item/stone_formation.json create mode 100644 src/main/resources/assets/nnparadisemod/recipes/bulletproof_glass.json create mode 100644 src/main/resources/assets/nnparadisemod/recipes/prismarine_crystal_block.json delete mode 100644 src/main/resources/assets/nnparadisemod/structures/blue_rose.nbt delete mode 100644 src/main/resources/assets/nnparadisemod/structures/cacti/cactus_1.nbt delete mode 100644 src/main/resources/assets/nnparadisemod/structures/cacti/cactus_2.nbt delete mode 100644 src/main/resources/assets/nnparadisemod/structures/cacti/cactus_3.nbt delete mode 100644 src/main/resources/assets/nnparadisemod/structures/cacti/shrub.nbt delete mode 100644 src/main/resources/assets/nnparadisemod/structures/rose.nbt delete mode 100644 src/main/resources/assets/nnparadisemod/structures/trees/acacia_sapling.nbt delete mode 100644 src/main/resources/assets/nnparadisemod/structures/trees/birch_sapling.nbt delete mode 100644 src/main/resources/assets/nnparadisemod/structures/trees/dark_oak_sapling.nbt delete mode 100644 src/main/resources/assets/nnparadisemod/structures/trees/jungle_sapling.nbt delete mode 100644 src/main/resources/assets/nnparadisemod/structures/trees/oak_sapling.nbt delete mode 100644 src/main/resources/assets/nnparadisemod/structures/trees/spruce_sapling.nbt create mode 100644 src/main/resources/assets/nnparadisemod/textures/blocks/bulletproof_glass.png create mode 100644 src/main/resources/assets/nnparadisemod/textures/blocks/prismarine_crystal_block.png create mode 100644 src/main/resources/assets/nnparadisemod/textures/blocks/prismarine_crystal_block.png.mcmeta diff --git a/changelog.txt b/changelog.txt index 9f034a5..d17eb82 100644 --- a/changelog.txt +++ b/changelog.txt @@ -228,6 +228,12 @@ Optimized ore generation 1.3.1: - Attempted to optimize cave generation + Optimized cave generation (it should cause less lag now) Ore cystals no longer generate in ocean biomes Optimized structure generation + Buried Treasure will now generate 2 meters under grass instead of deep underground + Added Underground Air (mod internal use only) + Added formations to caves and the nether + Added prismarine Crystal Block + Crystals now generate in bunches in caves + Added lava pockets in the deep underground diff --git a/src/main/java/com/NetherNoah/ParadiseMod/ParadiseMod.java b/src/main/java/com/NetherNoah/ParadiseMod/ParadiseMod.java index 054e26d..8763321 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/ParadiseMod.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/ParadiseMod.java @@ -2,7 +2,6 @@ import com.NetherNoah.ParadiseMod.creativeTabs.ChristmasTab; import com.NetherNoah.ParadiseMod.handlers.AntiMobLampHandler; -import com.NetherNoah.ParadiseMod.handlers.CaveGenHandler; import com.NetherNoah.ParadiseMod.handlers.CustomCraftBenchGuiHandler; import com.NetherNoah.ParadiseMod.handlers.Events; import com.NetherNoah.ParadiseMod.handlers.OreDictHandler; @@ -37,6 +36,14 @@ import com.NetherNoah.ParadiseMod.tileentity.hopper.TileEntityGoldHopper; import com.NetherNoah.ParadiseMod.tileentity.hopper.TileEntitySilverHopper; import com.NetherNoah.ParadiseMod.world.dimension.DimensionRegistry; +import com.NetherNoah.ParadiseMod.world.worldgen.caveGen.CaveGenBase; +import com.NetherNoah.ParadiseMod.world.worldgen.caveGen.CaveGenCrystal; +import com.NetherNoah.ParadiseMod.world.worldgen.caveGen.CaveGenDesert; +import com.NetherNoah.ParadiseMod.world.worldgen.caveGen.CaveGenHumid; +import com.NetherNoah.ParadiseMod.world.worldgen.caveGen.CaveGenIcy; +import com.NetherNoah.ParadiseMod.world.worldgen.caveGen.CaveGenMesa; +import com.NetherNoah.ParadiseMod.world.worldgen.caveGen.CaveGenMushroomIsland; +import com.NetherNoah.ParadiseMod.world.worldgen.caveGen.CaveGenOcean; import com.NetherNoah.ParadiseMod.world.worldgen.misc.DUTrees; import com.NetherNoah.ParadiseMod.world.worldgen.misc.DirtGen; import com.NetherNoah.ParadiseMod.world.worldgen.misc.Rose; @@ -45,7 +52,6 @@ import com.NetherNoah.ParadiseMod.world.worldgen.ores.OreGenOverworld; import com.NetherNoah.ParadiseMod.world.worldgen.structures.Buoy; import com.NetherNoah.ParadiseMod.world.worldgen.structures.EasterEgg; -import com.NetherNoah.ParadiseMod.world.worldgen.structures.EasterEgg2; import com.NetherNoah.ParadiseMod.world.worldgen.structures.GiantGrassBlock; import com.NetherNoah.ParadiseMod.world.worldgen.structures.Home; import com.NetherNoah.ParadiseMod.world.worldgen.structures.Ocean; @@ -122,7 +128,6 @@ public void preInit(FMLPreInitializationEvent event) { //events MinecraftForge.EVENT_BUS.register(Events.class); - MinecraftForge.EVENT_BUS.register(CaveGenHandler.class); //some modifications to vanilla blocks //This is NOT a coremod! @@ -150,8 +155,32 @@ public void preInit(FMLPreInitializationEvent event) { GameRegistry.registerTileEntity(TEAntiMobLamp.class,"salt_lamp"); //world generators - IWorldGenerator[] generators = { - //structures! + //cave gen + IWorldGenerator[] cavegen= { + new CaveGenBase(), + new CaveGenDesert(), + new CaveGenHumid(), + new CaveGenIcy(), + new CaveGenOcean(), + new CaveGenMesa(), + new CaveGenMushroomIsland(), + new CaveGenCrystal() + }; + + //ores + IWorldGenerator[] ores= { + //overworld ore gen + new OreGenOverworld(), + + //nether ore gen + new OreGenNether(), + + //end ore gen + new OreGenEnd() + }; + + //structures + IWorldGenerator[] structures= { new Home(), new WickerMan(), new Ocean(), @@ -180,15 +209,15 @@ public void preInit(FMLPreInitializationEvent event) { new Shrine(), new JeffTank(), - //overworld ore gen - new OreGenOverworld(), - - //nether ore gen - new OreGenNether(), - - //end ore gen - new OreGenEnd(), + //easter egg + new EasterEgg(), + //underground villages + new UndergroundVillage() + }; + + //miscellaneous + IWorldGenerator[] misc= { //dirt, gravel, sand, and clay on the ocean floors new DirtGen(), @@ -196,18 +225,17 @@ public void preInit(FMLPreInitializationEvent event) { new Rose(), //trees in the Deep Underground - new DUTrees(), - - //easter egg - new EasterEgg(), - new EasterEgg2(), - - //underground villages - new UndergroundVillage() + new DUTrees() }; - - for(int i=0;i= 19) - theChunk.setBlockState(new BlockPos(x, y, z), Blocks.GRASS.getDefaultState()); - - //vines - if (stoneCheck&&y>=19) { - // east - if (theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.AIR&& rand.nextInt(10) == 0&&x!=15) - theChunk.setBlockState(new BlockPos(x + 1, y, z),Blocks.VINE.getDefaultState().withProperty(BlockVine.WEST, true)); - - // west - if (theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.AIR && rand.nextInt(10) == 0&&x!=0) - theChunk.setBlockState(new BlockPos(x - 1, y, z),Blocks.VINE.getDefaultState().withProperty(BlockVine.EAST, true)); - - // south - if (theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.AIR && rand.nextInt(10) == 0&&z!=15) - theChunk.setBlockState(new BlockPos(x, y, z + 1),Blocks.VINE.getDefaultState().withProperty(BlockVine.NORTH, true)); - - // north - if (theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.AIR && rand.nextInt(10) == 0&&z!=0) - theChunk.setBlockState(new BlockPos(x, y, z - 1),Blocks.VINE.getDefaultState().withProperty(BlockVine.SOUTH, true)); - } - blockToReplace = theChunk.getBlockState(x, y, z).getBlock(); - - } - - // randomly generate spider webs - if (airCheck&& (rand.nextInt(1000) == 0) && webs&&world.provider.getDimension() == 0) - theChunk.setBlockState(new BlockPos(x, y, z), Blocks.WEB.getDefaultState()); - - // water filled caves in oceans in the overworld - if (airCheck&& oceanic && world.provider.getDimension() == 0) { - theChunk.setBlockState(new BlockPos(x, y, z), WATER); - if (blockBelow == Blocks.LAVA) { - theChunk.setBlockState(new BlockPos(x, y - 1, z), Blocks.OBSIDIAN.getDefaultState()); - if (rand.nextBoolean()) - theChunk.setBlockState(new BlockPos(x, y - 1, z), Blocks.MAGMA.getDefaultState()); - } - } - - //scattered crystals - if(rand.nextInt(ModConfig.worldgen.caves.CrystalChance)==0&& - stoneCheck - &&theChunk.getBlockState(x, y+1, z).getBlock()==Blocks.AIR - &&!oceanic) - theChunk.setBlockState(new BlockPos(x, y+1, z), crystals[rand.nextInt(5)].getDefaultState()); - - // swamp only features - if (swamp&&blockToReplace==Blocks.GRASS) { - switch (rand.nextInt(5)) { - //slime blocks - case 1: - theChunk.setBlockState(new BlockPos(x, y, z), Blocks.SLIME_BLOCK.getDefaultState()); - break; - //tall grass - case 4: - theChunk.setBlockState(new BlockPos(x, y + 1, z), Blocks.TALLGRASS.getDefaultState().withProperty(BlockTallGrass.TYPE, BlockTallGrass.EnumType.GRASS)); - break; - } - } - - - // mushroom island only features - if (mushroom) { - // replace ground stone with mycelium - if (stoneCheck&& blockAbove == Blocks.AIR) - theChunk.setBlockState(new BlockPos(x, y, z), Blocks.MYCELIUM.getDefaultState()); - // little mushrooms - if(theChunk.getBlockState(x, y, z).getBlock() == Blocks.MYCELIUM){ - switch (rand.nextInt(10)) { - //red - case 1: - theChunk.setBlockState(new BlockPos(x, y + 1, z), Blocks.RED_MUSHROOM.getDefaultState()); - break; - //brown - case 9: - theChunk.setBlockState(new BlockPos(x, y + 1, z), Blocks.BROWN_MUSHROOM.getDefaultState()); - break; - } - } - // the cave is a giant mushroom! - if ((stoneCheck||blockToReplace==Blocks.COBBLESTONE) && blockBelow == Blocks.AIR) { - int a = 1; - theChunk.setBlockState(new BlockPos(x, y, z), Blocks.BROWN_MUSHROOM_BLOCK.getDefaultState().withProperty(BlockHugeMushroom.VARIANT, BlockHugeMushroom.EnumType.CENTER)); - if (rand.nextInt(30) == 0) { - Block blockToReplace2 = theChunk.getBlockState(x, y - 1, z).getBlock(); - while (blockToReplace2 == Blocks.AIR - || blockToReplace2 == Blocks.WATER - || blockToReplace2 == Blocks.LAVA - || blockToReplace2 == Blocks.FLOWING_LAVA - || blockToReplace2 == Blocks.FLOWING_WATER) { - theChunk.setBlockState(new BlockPos(x, y - a, z),Blocks.BROWN_MUSHROOM_BLOCK.getDefaultState().withProperty(BlockHugeMushroom.VARIANT, BlockHugeMushroom.EnumType.STEM)); - a++; - blockToReplace2 = theChunk.getBlockState(x, y - a, z).getBlock(); - } - } - } - } - - // shrubs in mesa and desert biomes - if ((mesa || desert)&& (blockToReplace == Blocks.HARDENED_CLAY || blockToReplace == Blocks.STAINED_HARDENED_CLAY|| blockToReplace == Blocks.SANDSTONE) && blockAbove == Blocks.AIR && rand.nextInt(5) == 0 ) { - theChunk.setBlockState(new BlockPos(x, y + 1, z), Blocks.DEADBUSH.getDefaultState()); - if (desert) - theChunk.setBlockState(new BlockPos(x, y, z), Blocks.SAND.getDefaultState()); - } - - } - } - } - theChunk.markDirty(); - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/init/ModBlocks/Misc.java b/src/main/java/com/NetherNoah/ParadiseMod/init/ModBlocks/Misc.java index 663c852..99e062f 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/init/ModBlocks/Misc.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/init/ModBlocks/Misc.java @@ -5,6 +5,10 @@ import com.NetherNoah.ParadiseMod.CustomBlockCode.VoidFurnaceCode; import com.NetherNoah.ParadiseMod.CustomBlockCode.xmasTree; import com.NetherNoah.ParadiseMod.blocks.formations.icicle; +import com.NetherNoah.ParadiseMod.blocks.formations.mossyStoneFormation; +import com.NetherNoah.ParadiseMod.blocks.formations.netherrackFormation; +import com.NetherNoah.ParadiseMod.blocks.formations.sandstoneFormation; +import com.NetherNoah.ParadiseMod.blocks.formations.stoneFormation; import com.NetherNoah.ParadiseMod.blocks.misc.BlueRose; import com.NetherNoah.ParadiseMod.blocks.misc.CactusBookshelf; import com.NetherNoah.ParadiseMod.blocks.misc.CompressedCactus; @@ -23,11 +27,14 @@ import com.NetherNoah.ParadiseMod.blocks.misc.VoidFurnace; import com.NetherNoah.ParadiseMod.blocks.misc.VoidFurnaceLit; import com.NetherNoah.ParadiseMod.blocks.misc.VoidStone; +import com.NetherNoah.ParadiseMod.blocks.misc.bulletproofGlass; import com.NetherNoah.ParadiseMod.blocks.misc.emeraldRail; import com.NetherNoah.ParadiseMod.blocks.misc.glowingIce; import com.NetherNoah.ParadiseMod.blocks.misc.glowingObsidian; +import com.NetherNoah.ParadiseMod.blocks.misc.prismarineCrystalBlock; import com.NetherNoah.ParadiseMod.blocks.misc.soulGlass; import com.NetherNoah.ParadiseMod.blocks.misc.soulGlassPane; +import com.NetherNoah.ParadiseMod.blocks.misc.undergroundAir; import com.NetherNoah.ParadiseMod.blocks.redstone.GoldHopper; import com.NetherNoah.ParadiseMod.blocks.redstone.SilverHopper; import com.NetherNoah.ParadiseMod.blocks.redstone.emeraldRailPowered; @@ -37,9 +44,9 @@ import com.NetherNoah.ParadiseMod.blocks.xmas.ChristmasTopper; import com.NetherNoah.ParadiseMod.blocks.xmas.Present; import com.NetherNoah.ParadiseMod.blocks.xmas.SantaHat; -import java.util.concurrent.TimeUnit; import net.minecraft.block.Block; +import net.minecraft.block.BlockAir; import net.minecraft.block.BlockBreakable; import net.minecraft.block.BlockBush; import net.minecraft.block.BlockDirectional; @@ -53,8 +60,16 @@ import net.minecraftforge.fml.common.registry.ForgeRegistries; public class Misc { + //cave formations public static BlockDirectional icicle; - + public static BlockDirectional stoneFormation; + public static BlockDirectional mossyStoneFormation; + public static BlockDirectional sandstoneFormation; + public static BlockDirectional netherrackFormation; + + public static BlockBreakable bulletproofGlass; + public static BlockBreakable prismarineCrystalBlock; + public static BlockAir undergroundAir; public static Block VoidBricks; public static Block RegenerationStone; public static Block PolishedVoidStone; @@ -90,6 +105,13 @@ public class Misc { public static void initAndRegister() { Utils.regBlock(icicle=new icicle()); + Utils.regBlock(stoneFormation=new stoneFormation()); + Utils.regBlock(mossyStoneFormation=new mossyStoneFormation()); + Utils.regBlock(sandstoneFormation=new sandstoneFormation()); + Utils.regBlock(netherrackFormation=new netherrackFormation()); + + Utils.regBlock(bulletproofGlass=new bulletproofGlass()); + Utils.regBlock(prismarineCrystalBlock=new prismarineCrystalBlock()); Utils.regBlock(RegenerationStone=new RegenerationStone()); Utils.regBlock(VoidBricks=new VoidBricks()); Utils.regBlock(PolishedVoidStone=new PolishedVoidStone()); @@ -120,13 +142,21 @@ public static void initAndRegister() { Utils.regBlock(MossyFurnace = new MossyFurnace()); Utils.regBlock(VoidFurnace=new VoidFurnace()); Utils.regBlock(glowingIce=new glowingIce()); + ForgeRegistries.BLOCKS.register(undergroundAir=new undergroundAir()); ForgeRegistries.BLOCKS.register(MossyFurnaceLit = new MossyFurnaceLit()); ForgeRegistries.BLOCKS.register(VoidFurnaceLit=new VoidFurnaceLit()); } + public static void regRenders() { Utils.regRender(icicle); + Utils.regRender(stoneFormation); + Utils.regRender(mossyStoneFormation); + Utils.regRender(sandstoneFormation); + Utils.regRender(netherrackFormation); + Utils.regRender(bulletproofGlass); + Utils.regRender(prismarineCrystalBlock); Utils.regRender(glowingIce); Utils.regRender(RegenerationStone); Utils.regRender(VoidBricks); diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/dimension/DUChunkGenerator.java b/src/main/java/com/NetherNoah/ParadiseMod/world/dimension/DUChunkGenerator.java index e29cc8c..b762f03 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/dimension/DUChunkGenerator.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/dimension/DUChunkGenerator.java @@ -114,6 +114,9 @@ public class DUChunkGenerator implements IChunkGenerator { private final WorldGenerator ironGen = new WorldGenMinable(Blocks.IRON_ORE.getDefaultState(), 14,BlockMatcher.forBlock(Blocks.STONE)); private final WorldGenerator goldGen = new WorldGenMinable(Blocks.GOLD_ORE.getDefaultState(), 7,BlockMatcher.forBlock(Blocks.STONE)); + //lava + private final WorldGenerator lava= new WorldGenMinable(Blocks.LAVA.getDefaultState(), 7,BlockMatcher.forBlock(Blocks.STONE)); + //decoration private final WorldGenBush brownMushroomFeature = new WorldGenBush(Blocks.BROWN_MUSHROOM); private final WorldGenBush redMushroomFeature = new WorldGenBush(Blocks.RED_MUSHROOM); @@ -132,7 +135,7 @@ public class DUChunkGenerator implements IChunkGenerator { public DUChunkGenerator(World worldIn, boolean p_i45637_2_, long seed) { world = worldIn; generateStructures = false; - rand = new Random(seed); + rand = worldIn.rand;//new Random(seed); lperlinNoise1 = new NoiseGeneratorOctaves(rand, 16); lperlinNoise2 = new NoiseGeneratorOctaves(rand, 16); perlinNoise1 = new NoiseGeneratorOctaves(rand, 16); @@ -260,7 +263,6 @@ public Chunk generateChunk(int x, int z) { prepareHeights(x, z, chunkprimer); buildSurfaces(x, z, chunkprimer, 0); genDURavines.generate(world, x, z, chunkprimer); - genDUMineshafts.generate(world, x, z, chunkprimer); genDUCaves.generate(world, x, z, chunkprimer); Chunk chunk = new Chunk(world, chunkprimer, x, z); Biome[] abiome = world.getBiomeProvider().getBiomes((Biome[]) null, x * 16, z * 16, 16, 16); @@ -456,11 +458,11 @@ public void populate(int x, int z) { if (TerrainGen.decorate(world, rand, blockpos, DecorateBiomeEvent.Decorate.EventType.SHROOM)) { //crystals if (rand.nextBoolean()) { - quartzGen.generate(world, rand,blockpos.add(rand.nextInt(16) + 8, rand.nextInt(256), rand.nextInt(16) + 8)); - diamondGen.generate(world, rand,blockpos.add(rand.nextInt(16) + 8, rand.nextInt(256), rand.nextInt(16) + 8)); - emeraldGen.generate(world, rand,blockpos.add(rand.nextInt(16) + 8, rand.nextInt(256), rand.nextInt(16) + 8)); - redstoneGen.generate(world, rand,blockpos.add(rand.nextInt(16) + 8, rand.nextInt(256), rand.nextInt(16) + 8)); - rubyGen.generate(world, rand,blockpos.add(rand.nextInt(16) + 8, rand.nextInt(256), rand.nextInt(16) + 8)); + quartzGen.generate(world, rand,blockpos.add(rand.nextInt(16) + 8, rand.nextInt(128), rand.nextInt(16) + 8)); + diamondGen.generate(world, rand,blockpos.add(rand.nextInt(16) + 8, rand.nextInt(128), rand.nextInt(16) + 8)); + emeraldGen.generate(world, rand,blockpos.add(rand.nextInt(16) + 8, rand.nextInt(128), rand.nextInt(16) + 8)); + redstoneGen.generate(world, rand,blockpos.add(rand.nextInt(16) + 8, rand.nextInt(128), rand.nextInt(16) + 8)); + rubyGen.generate(world, rand,blockpos.add(rand.nextInt(16) + 8, rand.nextInt(128), rand.nextInt(16) + 8)); } //mushrooms @@ -476,6 +478,10 @@ public void populate(int x, int z) { coalGen.generate(world, rand, blockpos.add(rand.nextInt(16), rand.nextInt(216) + 20, rand.nextInt(16))); ironGen.generate(world, rand, blockpos.add(rand.nextInt(16), rand.nextInt(216) + 20, rand.nextInt(16))); goldGen.generate(world, rand, blockpos.add(rand.nextInt(16), rand.nextInt(216) + 20, rand.nextInt(16))); + + //lava + lava.generate(world, rand, blockpos.add(rand.nextInt(16), rand.nextInt(216) + 20, rand.nextInt(16))); + } } diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/dimension/DUWorldProvider.java b/src/main/java/com/NetherNoah/ParadiseMod/world/dimension/DUWorldProvider.java index 78f3de8..0f5bf42 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/dimension/DUWorldProvider.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/dimension/DUWorldProvider.java @@ -11,7 +11,6 @@ public class DUWorldProvider extends WorldProvider{ @Override public void init() { biomeProvider = new BiomeProvider(world.getWorldInfo()); - doesWaterVaporize = false; hasSkyLight = false; nether=true; } @@ -29,7 +28,7 @@ public Vec3d getFogColor(float par1, float par2) { @Override public IChunkGenerator createChunkGenerator() { - return new DUChunkGenerator(world, doesWaterVaporize, DimensionRegistry.DeepUnderground); + return new DUChunkGenerator(world, false, DimensionRegistry.DeepUnderground); } @Override diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/dimension/DVWorldProvider.java b/src/main/java/com/NetherNoah/ParadiseMod/world/dimension/DVWorldProvider.java index d1c4fb4..9a0b370 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/dimension/DVWorldProvider.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/dimension/DVWorldProvider.java @@ -14,7 +14,6 @@ public class DVWorldProvider extends WorldProvider{ @Override public void init() { biomeProvider=new BiomeProviderSingle(Biomes.VOID); - doesWaterVaporize=false; hasSkyLight=false; nether=true; } @@ -32,7 +31,7 @@ public Vec3d getFogColor(float par1, float par2) { @Override public IChunkGenerator createChunkGenerator() { - return new DVChunkGenerator(world, doesWaterVaporize, DimensionRegistry.DeepVoid); + return new DVChunkGenerator(world, false, DimensionRegistry.DeepVoid); } @Override diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenBase.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenBase.java new file mode 100644 index 0000000..57391f0 --- /dev/null +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenBase.java @@ -0,0 +1,114 @@ +package com.NetherNoah.ParadiseMod.world.worldgen.caveGen; + +import java.util.Random; + +import com.NetherNoah.ParadiseMod.config.ModConfig; +import com.NetherNoah.ParadiseMod.init.ModBlocks.Crystals; +import com.NetherNoah.ParadiseMod.init.ModBlocks.Misc; +import com.NetherNoah.ParadiseMod.world.dimension.DimensionRegistry; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockDirectional; +import net.minecraft.init.Biomes; +import net.minecraft.init.Blocks; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.IChunkGenerator; +import net.minecraftforge.fml.common.IWorldGenerator; + +public class CaveGenBase implements IWorldGenerator { + public static int height; + public static boolean webs = false; + + @Override + public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, + IChunkProvider chunkProvider) { + Chunk theChunk = world.getChunkFromChunkCoords(chunkX, chunkZ); + // don't generate if the config says not to + // generate cave features + if (ModConfig.worldgen.caves.betterCaves == false) + return; + + // the height is 256 if the features are being generated in a cave dimension, + // else, it's 61 + height=255; + if (world.provider.getDimension() == 0) { + height = 61; + webs = true; + } + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < height; y++) { + + // biome of current block + Biome blockBiome = theChunk.getBiome(new BlockPos(x, y, z), world.getBiomeProvider()); + + // the block to be replaced + Block blockToReplace = theChunk.getBlockState(x, y, z).getBlock(); + + // the block above it + Block blockAbove = theChunk.getBlockState(x, y + 1, z).getBlock(); + + // the block below it + Block blockBelow = theChunk.getBlockState(x, y - 1, z).getBlock(); + + + // base cave generation + // replace exposed stone + if (blockToReplace == Blocks.STONE && + (theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.AIR + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.AIR + || theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.WATER + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.WATER + || theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.LAVA)) { + // random cobblestone + if (rand.nextInt(10) == 0) + theChunk.setBlockState(new BlockPos(x, y, z), Blocks.COBBLESTONE.getDefaultState()); + + //stone cave formations + if (blockAbove==Blocks.AIR&&rand.nextInt(10)==0&&!(blockBiome == Biomes.OCEAN || blockBiome == Biomes.DEEP_OCEAN)) + theChunk.setBlockState(new BlockPos(x,y+1,z), Misc.stoneFormation.getDefaultState()); + if (blockBelow==Blocks.AIR&&rand.nextInt(10)==0&&y>0&& !(blockBiome == Biomes.OCEAN || blockBiome == Biomes.DEEP_OCEAN)) + theChunk.setBlockState(new BlockPos(x,y-1,z), Misc.stoneFormation.getDefaultState().withProperty(BlockDirectional.FACING, EnumFacing.DOWN)); + + // magma around lava pools + if (world.provider.getDimension()!=DimensionRegistry.DeepUnderground&&( + theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.LAVA)) + theChunk.setBlockState(new BlockPos(x, y, z), Blocks.MAGMA.getDefaultState()); + } + + //random spider webs + if (blockToReplace==Blocks.AIR && rand.nextInt(1000)==0&&webs==true&&world.provider.getDimension()==0&&(blockBiome!=Biomes.OCEAN||blockBiome!=Biomes.DEEP_OCEAN)) + theChunk.setBlockState(new BlockPos(x,y,z), Blocks.WEB.getDefaultState()); + + //netherrack formations + if (blockToReplace==Blocks.NETHERRACK&&blockBelow==Blocks.AIR&&rand.nextInt(20)==0&&y>0) + theChunk.setBlockState(new BlockPos(x,y-1,z), Misc.netherrackFormation.getDefaultState().withProperty(BlockDirectional.FACING, EnumFacing.DOWN)); + if (blockToReplace==Blocks.NETHERRACK&&blockAbove==Blocks.AIR&&rand.nextInt(20)==0) + theChunk.setBlockState(new BlockPos(x,y+1,z), Misc.netherrackFormation.getDefaultState()); + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenCrystal.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenCrystal.java new file mode 100644 index 0000000..567f70f --- /dev/null +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenCrystal.java @@ -0,0 +1,68 @@ +package com.NetherNoah.ParadiseMod.world.worldgen.caveGen; + +import java.util.Random; + +import com.NetherNoah.ParadiseMod.config.ModConfig; +import com.NetherNoah.ParadiseMod.init.ModBlocks.Crystals; +import com.NetherNoah.ParadiseMod.init.ModBlocks.Misc; + +import net.minecraft.block.Block; +import net.minecraft.init.Blocks; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.IChunkGenerator; +import net.minecraftforge.fml.common.IWorldGenerator; + +public class CaveGenCrystal implements IWorldGenerator { + public static Block[] crystals= {Crystals.diamondCrystal,Crystals.emeraldCrystal,Crystals.quartzCrystal,Crystals.redstoneCrystal,Crystals.rubyCrystal}; + @Override + public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, + IChunkProvider chunkProvider) { + if (rand.nextInt(ModConfig.worldgen.caves.CrystalChance)==0){ + for (int i=0;i<256;i++) { + int blockX = (chunkX * 16)+rand.nextInt(32); + int blockZ = (chunkZ * 16)+rand.nextInt(32); + int y = getGroundFromAbove(world, blockX, blockZ); + BlockPos pos = new BlockPos(blockX, y+1, blockZ); + if (y>9) { + switch (rand.nextInt(5)) { + case 0: + world.setBlockState(pos, Crystals.diamondCrystal.getDefaultState(),1); + break; + + case 1: + world.setBlockState(pos, Crystals.emeraldCrystal.getDefaultState(),1); + break; + + case 2: + world.setBlockState(pos, Crystals.quartzCrystal.getDefaultState(),1); + break; + + case 3: + world.setBlockState(pos, Crystals.redstoneCrystal.getDefaultState(),1); + break; + + case 4: + world.setBlockState(pos, Crystals.rubyCrystal.getDefaultState(),1); + break; + } + } + } + } + } + + public static int getGroundFromAbove(World world, int x, int z) + { + int y = 40; + boolean foundGround = false; + while(!foundGround&&y--!=10) + { + Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); + Block blockAbove = world.getBlockState(new BlockPos(x,y+1,z)).getBlock(); + foundGround=((blockAt==Blocks.GRASS||blockAt==Blocks.STONE) && blockAbove==Blocks.AIR); + } + return y; + } + +} diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenDesert.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenDesert.java new file mode 100644 index 0000000..7e4a937 --- /dev/null +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenDesert.java @@ -0,0 +1,106 @@ +package com.NetherNoah.ParadiseMod.world.worldgen.caveGen; + +import java.util.Random; + +import com.NetherNoah.ParadiseMod.config.ModConfig; +import com.NetherNoah.ParadiseMod.init.ModBlocks.Misc; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockDirectional; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Biomes; +import net.minecraft.init.Blocks; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.IChunkGenerator; +import net.minecraftforge.fml.common.IWorldGenerator; + +public class CaveGenDesert implements IWorldGenerator{ + protected static final IBlockState SANDSTONE = Blocks.SANDSTONE.getDefaultState(); + public static int height; + + @Override + public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator,IChunkProvider chunkProvider) { + Chunk theChunk=world.getChunkFromChunkCoords(chunkX, chunkZ); + // don't generate if the config says not to + // generate cave features + if (ModConfig.worldgen.caves.betterCaves == false) + return; + if(ModConfig.worldgen.caves.types.Dry == false) + return; + + // the height is 256 if the features are being generated in a cave dimension, + // else, it's 61 + height=255; + if (world.provider.getDimension() == 0) { + height = 61; + } + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < height; y++) { + + // biome of current block + Biome blockBiome = theChunk.getBiome(new BlockPos(x, y, z), world.getBiomeProvider()); + + // the block to be replaced + Block blockToReplace = theChunk.getBlockState(x, y, z).getBlock(); + + // the block above it + Block blockAbove = theChunk.getBlockState(x, y + 1, z).getBlock(); + + // the block below it + Block blockBelow = theChunk.getBlockState(x, y - 1, z).getBlock(); + + if (blockBiome == Biomes.DESERT || blockBiome == Biomes.DESERT_HILLS|| blockBiome == Biomes.MUTATED_DESERT){ + if ((blockToReplace == Blocks.STONE||blockToReplace == Blocks.SANDSTONE)&&(theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.AIR + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.AIR + || theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.WATER + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.WATER + || theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.LAVA)) { + // lava + if (rand.nextInt(20) == 0 && blockAbove == Blocks.AIR) + theChunk.setBlockState(new BlockPos(x, y, z), Blocks.LAVA.getDefaultState()); + // sandstone + if (rand.nextBoolean()) + theChunk.setBlockState(new BlockPos(x, y, z), SANDSTONE); + + //sandstone formations + if (blockAbove==Blocks.AIR&&rand.nextInt(10)==0) + theChunk.setBlockState(new BlockPos(x,y+1,z), Misc.sandstoneFormation.getDefaultState()); + if (blockBelow==Blocks.AIR&&rand.nextInt(10)==0&&y>0) + theChunk.setBlockState(new BlockPos(x,y-1,z), Misc.sandstoneFormation.getDefaultState().withProperty(BlockDirectional.FACING, EnumFacing.DOWN)); + } + + //this needs to be reset + blockToReplace = theChunk.getBlockState(x, y, z).getBlock(); + + // shrubs + if (blockToReplace == Blocks.SANDSTONE && blockAbove == Blocks.AIR && rand.nextInt(5) == 0 ) { + theChunk.setBlockState(new BlockPos(x, y + 1, z), Blocks.DEADBUSH.getDefaultState()); + theChunk.setBlockState(new BlockPos(x, y, z), Blocks.SAND.getDefaultState()); + } + } + } + } + } + } +} + diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenHumid.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenHumid.java new file mode 100644 index 0000000..ad19eeb --- /dev/null +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenHumid.java @@ -0,0 +1,135 @@ +package com.NetherNoah.ParadiseMod.world.worldgen.caveGen; + +import java.util.Random; + +import com.NetherNoah.ParadiseMod.config.ModConfig; +import com.NetherNoah.ParadiseMod.init.ModBlocks.Misc; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockDirectional; +import net.minecraft.block.BlockTallGrass; +import net.minecraft.block.BlockVine; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Biomes; +import net.minecraft.init.Blocks; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.IChunkGenerator; +import net.minecraftforge.fml.common.IWorldGenerator; + +public class CaveGenHumid implements IWorldGenerator{ + protected static final IBlockState WATER = Blocks.WATER.getDefaultState(); + public static int height; + + @Override + public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator,IChunkProvider chunkProvider) { + Chunk theChunk=world.getChunkFromChunkCoords(chunkX, chunkZ); + // don't generate if the config says not to + // generate cave features + if (ModConfig.worldgen.caves.betterCaves == false) + return; + if (ModConfig.worldgen.caves.types.Wet == false) + return; + + // the height is 256 if the features are being generated in a cave dimension, + // else, it's 61 + height=255; + if (world.provider.getDimension() == 0) { + height = 61; + } + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < height; y++) { + + // biome of current block + Biome blockBiome = theChunk.getBiome(new BlockPos(x, y, z), world.getBiomeProvider()); + + // the block to be replaced + Block blockToReplace = theChunk.getBlockState(x, y, z).getBlock(); + + // the block above it + Block blockAbove = theChunk.getBlockState(x, y + 1, z).getBlock(); + + // the block below it + Block blockBelow = theChunk.getBlockState(x, y - 1, z).getBlock(); + + // biome types + boolean swamp = blockBiome == Biomes.SWAMPLAND|| blockBiome == Biomes.MUTATED_SWAMPLAND; + boolean jungle = blockBiome == Biomes.JUNGLE || blockBiome == Biomes.JUNGLE_EDGE|| blockBiome == Biomes.JUNGLE_HILLS || blockBiome == Biomes.MUTATED_JUNGLE|| blockBiome == Biomes.MUTATED_JUNGLE_EDGE; + + //shorthands for checking for stone and air + boolean stoneCheck=blockToReplace==Blocks.STONE||blockToReplace==Blocks.COBBLESTONE; + + // jungle and swamp features + if (jungle || swamp) { + + // mossy cobblestone + if (rand.nextInt(10) == 0&&stoneCheck) + theChunk.setBlockState(new BlockPos(x, y, z), Blocks.MOSSY_COBBLESTONE.getDefaultState()); + + // shallow water pools + if (blockToReplace==Blocks.AIR&& y < 20) { + theChunk.setBlockState(new BlockPos(x, y, z), WATER); + if (blockBelow == Blocks.LAVA) { + theChunk.setBlockState(new BlockPos(x, y - 1, z), Blocks.OBSIDIAN.getDefaultState()); + if (rand.nextBoolean()) + theChunk.setBlockState(new BlockPos(x, y - 1, z), Blocks.MAGMA.getDefaultState()); + } + } + + // replace ground stone with grass + if (stoneCheck&&blockAbove==Blocks.AIR && y >= 19) + theChunk.setBlockState(new BlockPos(x, y, z), Blocks.GRASS.getDefaultState()); + + //mossy stone formations + if (stoneCheck&&blockAbove==Blocks.AIR&&rand.nextInt(10)==0) + theChunk.setBlockState(new BlockPos(x,y+1,z), Misc.mossyStoneFormation.getDefaultState()); + if (stoneCheck&&blockBelow==Blocks.AIR&&rand.nextInt(10)==0&&y>0) + theChunk.setBlockState(new BlockPos(x,y-1,z), Misc.mossyStoneFormation.getDefaultState().withProperty(BlockDirectional.FACING, EnumFacing.DOWN)); + + //vines + if (stoneCheck&&y>=19) { + // east + if (theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.AIR&& rand.nextInt(10) == 0&&x!=15) + theChunk.setBlockState(new BlockPos(x + 1, y, z),Blocks.VINE.getDefaultState().withProperty(BlockVine.WEST, true)); + + // west + if (theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.AIR && rand.nextInt(10) == 0&&x!=0) + theChunk.setBlockState(new BlockPos(x - 1, y, z),Blocks.VINE.getDefaultState().withProperty(BlockVine.EAST, true)); + + // south + if (theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.AIR && rand.nextInt(10) == 0&&z!=15) + theChunk.setBlockState(new BlockPos(x, y, z + 1),Blocks.VINE.getDefaultState().withProperty(BlockVine.NORTH, true)); + + // north + if (theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.AIR && rand.nextInt(10) == 0&&z!=0) + theChunk.setBlockState(new BlockPos(x, y, z - 1),Blocks.VINE.getDefaultState().withProperty(BlockVine.SOUTH, true)); + } + blockToReplace = theChunk.getBlockState(x, y, z).getBlock(); + + } + + // swamp only features + if (swamp&&blockToReplace==Blocks.GRASS) { + switch (rand.nextInt(5)) { + //slime blocks + case 1: + theChunk.setBlockState(new BlockPos(x, y, z), Blocks.SLIME_BLOCK.getDefaultState()); + break; + + //tall grass + case 4: + theChunk.setBlockState(new BlockPos(x, y + 1, z), Blocks.TALLGRASS.getDefaultState().withProperty(BlockTallGrass.TYPE, BlockTallGrass.EnumType.GRASS)); + break; + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenIcy.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenIcy.java new file mode 100644 index 0000000..f6b7c18 --- /dev/null +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenIcy.java @@ -0,0 +1,104 @@ +package com.NetherNoah.ParadiseMod.world.worldgen.caveGen; + +import java.util.Random; + +import com.NetherNoah.ParadiseMod.config.ModConfig; +import com.NetherNoah.ParadiseMod.init.ModBlocks.Misc; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockDirectional; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Biomes; +import net.minecraft.init.Blocks; +import net.minecraft.util.EnumFacing; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.IChunkGenerator; +import net.minecraftforge.fml.common.IWorldGenerator; + +public class CaveGenIcy implements IWorldGenerator{ + protected static final IBlockState COMPICE = Blocks.PACKED_ICE.getDefaultState(); + public static int height; + + @Override + public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator,IChunkProvider chunkProvider) { + Chunk theChunk=world.getChunkFromChunkCoords(chunkX, chunkZ); + // don't generate if the config says not to + // generate cave features + if (ModConfig.worldgen.caves.betterCaves == false) + return; + if (ModConfig.worldgen.caves.types.Icy == false) + return; + + // the height is 256 if the features are being generated in a cave dimension, + // else, it's 61 + height=255; + if (world.provider.getDimension() == 0) + height = 61; + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < height; y++) { + + // biome of current block + Biome blockBiome = theChunk.getBiome(new BlockPos(x, y, z), world.getBiomeProvider()); + + // the block to be replaced + Block blockToReplace = theChunk.getBlockState(x, y, z).getBlock(); + + // the block above it + Block blockAbove = theChunk.getBlockState(x, y + 1, z).getBlock(); + + // the block below it + Block blockBelow = theChunk.getBlockState(x, y - 1, z).getBlock(); + + // base cave generation + if ((blockToReplace == Blocks.STONE||blockToReplace == Blocks.PACKED_ICE)&&(blockBiome == Biomes.ICE_MOUNTAINS || blockBiome == Biomes.ICE_PLAINS|| blockBiome == Biomes.MUTATED_ICE_FLATS || blockBiome == Biomes.FROZEN_RIVER|| blockBiome == Biomes.COLD_TAIGA || blockBiome == Biomes.COLD_TAIGA_HILLS|| blockBiome == Biomes.COLD_BEACH)) { + // replace exposed stone + if (theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.AIR + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.AIR + || theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.WATER + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.WATER + || theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.LAVA) { + + //icicles + if (blockAbove==Blocks.AIR&&rand.nextInt(10)==0) + theChunk.setBlockState(new BlockPos(x,y+1,z), Misc.icicle.getDefaultState()); + if (blockBelow==Blocks.AIR&&rand.nextInt(10)==0&&y>0) + theChunk.setBlockState(new BlockPos(x,y-1,z), Misc.icicle.getDefaultState().withProperty(BlockDirectional.FACING, EnumFacing.DOWN)); + + // ice cave generation + switch (rand.nextInt(5)) { + //packed ice + case 1: + theChunk.setBlockState(new BlockPos(x, y, z), COMPICE); + break; + //snow + case 4: + if(blockAbove==Blocks.AIR) + theChunk.setBlockState(new BlockPos(x, y + 1, z),Blocks.SNOW_LAYER.getDefaultState()); + break; + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenMesa.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenMesa.java new file mode 100644 index 0000000..1ca5e02 --- /dev/null +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenMesa.java @@ -0,0 +1,137 @@ +package com.NetherNoah.ParadiseMod.world.worldgen.caveGen; + +import java.util.Random; + +import com.NetherNoah.ParadiseMod.config.ModConfig; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockStainedHardenedClay; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Biomes; +import net.minecraft.init.Blocks; +import net.minecraft.item.EnumDyeColor; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.IChunkGenerator; +import net.minecraftforge.fml.common.IWorldGenerator; + +public class CaveGenMesa implements IWorldGenerator { + protected static final IBlockState TERRACOTTA = Blocks.HARDENED_CLAY.getDefaultState(); + protected static final IBlockState ORANGE_TERRACOTTA = Blocks.STAINED_HARDENED_CLAY.getDefaultState() + .withProperty(BlockStainedHardenedClay.COLOR, EnumDyeColor.ORANGE); + protected static final IBlockState WHITE_TERRACOTTA = Blocks.STAINED_HARDENED_CLAY.getDefaultState() + .withProperty(BlockStainedHardenedClay.COLOR, EnumDyeColor.WHITE); + protected static final IBlockState BROWN_TERRACOTTA = Blocks.STAINED_HARDENED_CLAY.getDefaultState() + .withProperty(BlockStainedHardenedClay.COLOR, EnumDyeColor.BROWN); + protected static final IBlockState YELLOW_TERRACOTTA = Blocks.STAINED_HARDENED_CLAY.getDefaultState() + .withProperty(BlockStainedHardenedClay.COLOR, EnumDyeColor.YELLOW); + protected static final IBlockState RED_TERRACOTTA = Blocks.STAINED_HARDENED_CLAY.getDefaultState() + .withProperty(BlockStainedHardenedClay.COLOR, EnumDyeColor.RED); + public static int height; + + @Override + public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, + IChunkProvider chunkProvider) { + Chunk theChunk = world.getChunkFromChunkCoords(chunkX, chunkZ); + // don't generate if the config says not to + // generate cave features + if (ModConfig.worldgen.caves.betterCaves == false) + return; + if (ModConfig.worldgen.caves.types.Mesa == false) + return; + + // the height is 256 if the features are being generated in a cave dimension, + // else, it's 61 + height=255; + if (world.provider.getDimension() == 0) { + height = 61; + } + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < height; y++) { + + // biome of current block + Biome blockBiome = theChunk.getBiome(new BlockPos(x, y, z), world.getBiomeProvider()); + + // the block to be replaced + Block blockToReplace = theChunk.getBlockState(x, y, z).getBlock(); + + // the block above it + Block blockAbove = theChunk.getBlockState(x, y + 1, z).getBlock(); + + // the block below it + Block blockBelow = theChunk.getBlockState(x, y - 1, z).getBlock(); + + boolean mesa = blockBiome == Biomes.MESA || blockBiome == Biomes.MESA_CLEAR_ROCK + || blockBiome == Biomes.MESA_ROCK || blockBiome == Biomes.MUTATED_MESA + || blockBiome == Biomes.MUTATED_MESA_CLEAR_ROCK || blockBiome == Biomes.MUTATED_MESA_ROCK; + + // replace exposed stone + if (mesa&&(blockToReplace == Blocks.STONE || blockToReplace == Blocks.COBBLESTONE) + && (theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.AIR + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.AIR + || theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.WATER + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.WATER + || theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.LAVA)) { + + // hardened clay (terracotta) + switch (y) { + case 74: + case 45: + theChunk.setBlockState(new BlockPos(x, y, z), ORANGE_TERRACOTTA); + break; + + case 79: + case 50: + theChunk.setBlockState(new BlockPos(x, y, z), WHITE_TERRACOTTA); + break; + + case 83: + case 55: + theChunk.setBlockState(new BlockPos(x, y, z), BROWN_TERRACOTTA); + break; + + case 85: + case 64: + theChunk.setBlockState(new BlockPos(x, y, z), YELLOW_TERRACOTTA); + break; + + case 40: + case 56: + theChunk.setBlockState(new BlockPos(x, y, z), RED_TERRACOTTA); + break; + + default: + theChunk.setBlockState(new BlockPos(x, y, z), TERRACOTTA); + + } + } + + // shrubs + if (mesa && (blockToReplace == Blocks.HARDENED_CLAY || blockToReplace == Blocks.STAINED_HARDENED_CLAY + || blockToReplace == Blocks.SANDSTONE) && blockAbove == Blocks.AIR && rand.nextInt(5) == 0) { + theChunk.setBlockState(new BlockPos(x, y + 1, z), Blocks.DEADBUSH.getDefaultState()); + + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenMushroomIsland.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenMushroomIsland.java new file mode 100644 index 0000000..ac35ab0 --- /dev/null +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenMushroomIsland.java @@ -0,0 +1,114 @@ +package com.NetherNoah.ParadiseMod.world.worldgen.caveGen; + +import java.util.Random; + +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; +import com.NetherNoah.ParadiseMod.init.ModBlocks.Crystals; +import com.NetherNoah.ParadiseMod.world.dimension.DimensionRegistry; + +import net.minecraft.block.Block; +import net.minecraft.block.BlockHugeMushroom; +import net.minecraft.block.BlockStainedHardenedClay; +import net.minecraft.block.BlockTallGrass; +import net.minecraft.block.BlockVine; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Biomes; +import net.minecraft.init.Blocks; +import net.minecraft.item.EnumDyeColor; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.IChunkGenerator; +import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; +import net.minecraftforge.fml.common.IWorldGenerator; + +public class CaveGenMushroomIsland implements IWorldGenerator{ + public static int height; + + @Override + public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator,IChunkProvider chunkProvider) { + Chunk theChunk=world.getChunkFromChunkCoords(chunkX, chunkZ); + // don't generate if the config says not to + // generate cave features + if (ModConfig.worldgen.caves.betterCaves == false) + return; + if (ModConfig.worldgen.caves.types.Mushroom == false) + return; + + // the height is 256 if the features are being generated in a cave dimension, + // else, it's 61 + height=255; + if (world.provider.getDimension() == 0) { + height = 61; + } + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < height; y++) { + + // biome of current block + Biome blockBiome = theChunk.getBiome(new BlockPos(x, y, z), world.getBiomeProvider()); + + // the block to be replaced + Block blockToReplace = theChunk.getBlockState(x, y, z).getBlock(); + + // the block above it + Block blockAbove = theChunk.getBlockState(x, y + 1, z).getBlock(); + + // the block below it + Block blockBelow = theChunk.getBlockState(x, y - 1, z).getBlock(); + + if (blockBiome == Biomes.MUSHROOM_ISLAND|| blockBiome == Biomes.MUSHROOM_ISLAND_SHORE) { + // replace ground stone with mycelium + if ((blockToReplace==Blocks.STONE||blockToReplace==Blocks.COBBLESTONE)&& blockAbove == Blocks.AIR) + theChunk.setBlockState(new BlockPos(x, y, z), Blocks.MYCELIUM.getDefaultState()); + + // little mushrooms + if(theChunk.getBlockState(x, y, z).getBlock() == Blocks.MYCELIUM){ + switch (rand.nextInt(10)) { + //red + case 1: + theChunk.setBlockState(new BlockPos(x, y + 1, z), Blocks.RED_MUSHROOM.getDefaultState()); + break; + //brown + case 9: + theChunk.setBlockState(new BlockPos(x, y + 1, z), Blocks.BROWN_MUSHROOM.getDefaultState()); + break; + } + } + + // the cave is a giant mushroom! + if ((blockToReplace==Blocks.STONE||blockToReplace==Blocks.COBBLESTONE) && blockBelow == Blocks.AIR) { + int a = 1; + theChunk.setBlockState(new BlockPos(x, y, z), Blocks.BROWN_MUSHROOM_BLOCK.getDefaultState().withProperty(BlockHugeMushroom.VARIANT, BlockHugeMushroom.EnumType.CENTER)); + if (rand.nextInt(30) == 0) { + Block blockToReplace2 = theChunk.getBlockState(x, y - 1, z).getBlock(); + while (blockToReplace2 == Blocks.AIR + || blockToReplace2 == Blocks.WATER + || blockToReplace2 == Blocks.LAVA + || blockToReplace2 == Blocks.FLOWING_LAVA + || blockToReplace2 == Blocks.FLOWING_WATER) { + theChunk.setBlockState(new BlockPos(x, y - a, z),Blocks.BROWN_MUSHROOM_BLOCK.getDefaultState().withProperty(BlockHugeMushroom.VARIANT, BlockHugeMushroom.EnumType.STEM)); + a++; + blockToReplace2 = theChunk.getBlockState(x, y - a, z).getBlock(); + } + } + } + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenOcean.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenOcean.java new file mode 100644 index 0000000..73a6f62 --- /dev/null +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/caveGen/CaveGenOcean.java @@ -0,0 +1,95 @@ +package com.NetherNoah.ParadiseMod.world.worldgen.caveGen; + +import java.util.Random; + +import com.NetherNoah.ParadiseMod.config.ModConfig; +import com.NetherNoah.ParadiseMod.init.ModBlocks.Misc; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Biomes; +import net.minecraft.init.Blocks; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.IChunkProvider; +import net.minecraft.world.gen.IChunkGenerator; +import net.minecraftforge.fml.common.IWorldGenerator; + +// water filled caves in oceans in the overworld +public class CaveGenOcean implements IWorldGenerator{ + protected static final IBlockState WATER = Blocks.WATER.getDefaultState(); + public static int height; + @Override + public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator,IChunkProvider chunkProvider) { + Chunk theChunk=world.getChunkFromChunkCoords(chunkX, chunkZ); + + // don't generate if the config says not to + // generate cave features + if (ModConfig.worldgen.caves.betterCaves == false) + return; + if (ModConfig.worldgen.caves.types.Ocean== false) + return; + + // the height is 256 if the features are being generated in a cave dimension, + // else, it's 61 + height=255; + if (world.provider.getDimension() == 0) { + height = 61; + } + + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < height; y++) { + + // biome of current block + Biome blockBiome = theChunk.getBiome(new BlockPos(x, y, z), world.getBiomeProvider()); + + // the block to be replaced + Block blockToReplace = theChunk.getBlockState(x, y, z).getBlock(); + + // the block above it + Block blockAbove = theChunk.getBlockState(x, y + 1, z).getBlock(); + + // the block below it + Block blockBelow = theChunk.getBlockState(x, y - 1, z).getBlock(); + + if (blockToReplace==Blocks.AIR&& (blockBiome == Biomes.OCEAN|| blockBiome == Biomes.DEEP_OCEAN)&& world.provider.getDimension() == 0) { + theChunk.setBlockState(new BlockPos(x, y, z), WATER); + if (blockBelow == Blocks.LAVA) { + theChunk.setBlockState(new BlockPos(x, y - 1, z), Blocks.OBSIDIAN.getDefaultState()); + if (rand.nextBoolean()) + theChunk.setBlockState(new BlockPos(x, y - 1, z), Blocks.MAGMA.getDefaultState()); + } + } + + if ((blockBiome == Biomes.OCEAN|| blockBiome == Biomes.DEEP_OCEAN)&&(blockToReplace == Blocks.STONE||blockToReplace == Blocks.PRISMARINE) && + (theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.AIR + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.AIR + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.AIR + || theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.WATER + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.WATER + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.WATER + || theChunk.getBlockState(x + 1, y, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y + 1, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y, z + 1).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x - 1, y, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y - 1, z).getBlock() == Blocks.LAVA + || theChunk.getBlockState(x, y, z - 1).getBlock() == Blocks.LAVA)) { + if (rand.nextInt(5)==0) + theChunk.setBlockState(new BlockPos(x,y,z), Blocks.PRISMARINE.getDefaultState()); + if (rand.nextInt(ModConfig.worldgen.caves.CrystalChance)==0) + theChunk.setBlockState(new BlockPos(x,y,z), Misc.prismarineCrystalBlock.getDefaultState()); + } + } + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/DUTrees.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/DUTrees.java index 54db29e..94fc04a 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/DUTrees.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/DUTrees.java @@ -2,34 +2,93 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.init.ModBlocks.Misc; import com.NetherNoah.ParadiseMod.world.dimension.DimensionRegistry; import net.minecraft.block.Block; +import net.minecraft.block.BlockPlanks; +import net.minecraft.block.BlockSapling; +import net.minecraft.block.BlockPlanks.EnumType; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Biomes; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; -public class DUTrees extends WorldGenerator implements IWorldGenerator{ +public class DUTrees implements IWorldGenerator{ @Override - public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, - IChunkProvider chunkProvider) { - int blockX = chunkX * 16; - int blockZ = chunkZ * 16; - if (world.provider.getDimension()==DimensionRegistry.DeepUnderground) - generateDU(world, rand, blockX + 8, blockZ + 8); - } - private void generateDU(World world, Random rand, int blockX, int blockZ) - { - int y = getGroundFromAbove(world, blockX, blockZ); - BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new DUTreesGen(); - if (y>31) - structure.generate(world, rand, pos); + public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator,IChunkProvider chunkProvider) { + for (int i=0;i<5;i++) { + int blockX = (chunkX * 16)+rand.nextInt(16); + int blockZ = (chunkZ * 16)+rand.nextInt(16); + if (world.provider.getDimension()==DimensionRegistry.DeepUnderground) { + int y = getGroundFromAbove(world, blockX, blockZ); + BlockPos position = new BlockPos(blockX, y+1, blockZ); + if (y>31) { + Biome biome = world.getBiomeForCoordsBody(position); + + //oak sapling + IBlockState block=Blocks.SAPLING.getDefaultState().withProperty(BlockSapling.STAGE, 1); + + //acacia sapling + if(biome == Biomes.SAVANNA||biome == Biomes.SAVANNA_PLATEAU||biome == Biomes.MUTATED_SAVANNA||biome == Biomes.MUTATED_SAVANNA_ROCK) + block=Blocks.SAPLING.getDefaultState().withProperty(BlockSapling.TYPE, EnumType.ACACIA).withProperty(BlockSapling.STAGE, 1); + + //birch sapling + if(biome == Biomes.BIRCH_FOREST_HILLS|| biome == Biomes.BIRCH_FOREST_HILLS) + block=Blocks.SAPLING.getDefaultState().withProperty(BlockSapling.TYPE, EnumType.BIRCH).withProperty(BlockSapling.STAGE, 1); + + //dark oak sapling + if(biome == Biomes.ROOFED_FOREST) + block=Blocks.SAPLING.getDefaultState().withProperty(BlockSapling.TYPE, EnumType.DARK_OAK).withProperty(BlockSapling.STAGE, 1); + + //jungle sapling + if(biome == Biomes.JUNGLE||biome == Biomes.JUNGLE_EDGE||biome == Biomes.JUNGLE_HILLS||biome == Biomes.MUTATED_JUNGLE||biome == Biomes.MUTATED_JUNGLE_EDGE) + block=Blocks.SAPLING.getDefaultState().withProperty(BlockSapling.TYPE, EnumType.JUNGLE).withProperty(BlockSapling.STAGE, 1); + + //spruce sapling + if(biome == Biomes.TAIGA||biome == Biomes.TAIGA_HILLS||biome == Biomes.COLD_TAIGA||biome == Biomes.COLD_TAIGA_HILLS||biome == Biomes.MUTATED_REDWOOD_TAIGA||biome == Biomes.MUTATED_REDWOOD_TAIGA_HILLS||biome == Biomes.MUTATED_TAIGA||biome == Biomes.MUTATED_TAIGA_COLD||biome == Biomes.REDWOOD_TAIGA||biome == Biomes.REDWOOD_TAIGA_HILLS||biome==Biomes.EXTREME_HILLS_WITH_TREES||biome==Biomes.MUTATED_EXTREME_HILLS_WITH_TREES) + block=Blocks.SAPLING.getDefaultState().withProperty(BlockSapling.TYPE, EnumType.SPRUCE).withProperty(BlockSapling.STAGE, 1); + + if(biome==Biomes.DESERT||biome==Biomes.DESERT_HILLS||biome==Biomes.MUTATED_DESERT) + block=Blocks.CACTUS.getDefaultState(); + + world.setBlockState(position, block); + if (block==Blocks.CACTUS.getDefaultState()) { + world.setBlockState(new BlockPos(position.getX(),position.getY()-1,position.getZ()),Blocks.SAND.getDefaultState()); + for (int j=0;j= 31) { Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - foundGround = blockAt == Blocks.GRASS||blockAt==Blocks.SAND||blockAt==Blocks.SANDSTONE; + Block blockAbove = world.getBlockState(new BlockPos(x,y+1,z)).getBlock(); + foundGround = (blockAt == Blocks.GRASS||blockAt==Blocks.SAND||blockAt==Blocks.SANDSTONE)&&blockAbove==Blocks.AIR; } return y; } - @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { - return false; - } } diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/DUTreesGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/DUTreesGen.java deleted file mode 100644 index ac4d2cc..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/DUTreesGen.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.misc; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Biomes; -import net.minecraft.init.Blocks; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class DUTreesGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - Biome biome = world.getBiomeForCoordsBody(position); - WorldServer worldserver = (WorldServer) world; - - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - - Template oak= templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":trees/oak_sapling")); - Template birch=templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":trees/birch_sapling")); - Template darkOak=templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":trees/dark_oak_sapling")); - Template acacia=templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":trees/acacia_sapling")); - Template jungle=templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":trees/jungle_sapling")); - Template spruce=templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":trees/spruce_sapling")); - Template [] cacti= {templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":cacti/cactus_1")),templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":cacti/cactus_2")),templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":cacti/cactus_3")),templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":cacti/shrub"))}; - Template template = oak; - //oak sapling - if(biome == Biomes.FOREST || biome == Biomes.FOREST_HILLS||biome==Biomes.SWAMPLAND||biome==Biomes.MUTATED_SWAMPLAND) { - template = oak; - } - //acacia sapling - if(biome == Biomes.SAVANNA||biome == Biomes.SAVANNA_PLATEAU||biome == Biomes.MUTATED_SAVANNA||biome == Biomes.MUTATED_SAVANNA_ROCK) - template = acacia; - //birch sapling - if(biome == Biomes.BIRCH_FOREST_HILLS|| biome == Biomes.BIRCH_FOREST_HILLS) - template = birch; - //dark oak sapling - if(biome == Biomes.ROOFED_FOREST) - template = darkOak; - //jungle sapling - if(biome == Biomes.JUNGLE||biome == Biomes.JUNGLE_EDGE||biome == Biomes.JUNGLE_HILLS||biome == Biomes.MUTATED_JUNGLE||biome == Biomes.MUTATED_JUNGLE_EDGE) - template = jungle; - //spruce sapling - if(biome == Biomes.TAIGA||biome == Biomes.TAIGA_HILLS||biome == Biomes.COLD_TAIGA||biome == Biomes.COLD_TAIGA_HILLS||biome == Biomes.MUTATED_REDWOOD_TAIGA||biome == Biomes.MUTATED_REDWOOD_TAIGA_HILLS||biome == Biomes.MUTATED_TAIGA||biome == Biomes.MUTATED_TAIGA_COLD||biome == Biomes.REDWOOD_TAIGA||biome == Biomes.REDWOOD_TAIGA_HILLS||biome==Biomes.EXTREME_HILLS_WITH_TREES||biome==Biomes.MUTATED_EXTREME_HILLS_WITH_TREES) - template = spruce; - if(biome==Biomes.DESERT||biome==Biomes.DESERT_HILLS||biome==Biomes.MUTATED_DESERT) - template= cacti[rand.nextInt(4)]; - - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); - return true; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - return posAboveGround.getY() > 31; - } - public static boolean isCornerValid(World world, BlockPos pos) - { - int variation = 3; - int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); - if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) - return true; - return false; - } - - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 85; - boolean foundGround = false; - while(!foundGround && y-- >= 31) - { - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - foundGround = (blockAt == Blocks.GRASS||blockAt==Blocks.SAND||blockAt==Blocks.SANDSTONE); - } - return y; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/DirtGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/DirtGen.java index 330131c..e380078 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/DirtGen.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/DirtGen.java @@ -15,13 +15,12 @@ public class DirtGen implements IWorldGenerator { @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { - if (world.provider.getDimension() == 0) - generateOverworld(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider); - } - private void generateOverworld(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider){ - IBlockState[] earth= {Blocks.DIRT.getDefaultState(),Blocks.SAND.getDefaultState(),Blocks.CLAY.getDefaultState()}; - generateOre(earth[random.nextInt(3)], world, random, chunkX * 16, chunkZ * 16, 16, 64, 4 + random.nextInt(55), 6); + if (world.provider.getDimension() == 0) { + IBlockState[] earth= {Blocks.DIRT.getDefaultState(),Blocks.SAND.getDefaultState(),Blocks.CLAY.getDefaultState()}; + generateOre(earth[random.nextInt(3)], world, random, chunkX * 16, chunkZ * 16, 16, 64, 4 + random.nextInt(55), 6); + } } + private void generateOre(IBlockState ore, World world, Random random, int x, int z, int minY, int maxY, int size, int chances) { int deltaY = maxY - minY; for (int i = 0; i < chances; i++) { diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/Rose.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/Rose.java index 2ed0463..097d906 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/Rose.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/Rose.java @@ -2,43 +2,57 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; +import com.NetherNoah.ParadiseMod.init.ModBlocks.Misc; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; -public class Rose extends WorldGenerator implements IWorldGenerator{ +public class Rose implements IWorldGenerator{ + @Override public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { - int blockX = chunkX * 16; - int blockZ = chunkZ * 16; - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { - int y = getGroundFromAbove(world, blockX, blockZ); - BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new RoseGen(); - structure.generate(world, rand, pos); + for (int i=0;i<5;i++) { + int blockX = (chunkX * 16)+rand.nextInt(16); + int blockZ = (chunkZ * 16)+rand.nextInt(16); + int y = getGroundFromAbove(world, blockX, blockZ); + BlockPos pos = new BlockPos(blockX, y+1, blockZ); + if (y<40) return; + world.setBlockState(pos, Misc.BlueRose.getDefaultState()); + if (rand.nextBoolean()) + world.setBlockState(pos, Misc.Rose.getDefaultState()); + } } + public static int getGroundFromAbove(World world, int x, int z) { int y = 255; boolean foundGround = false; - while(!foundGround && y-- >= 31) + while(!foundGround && y-->= 31) { Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - foundGround = blockAt == Blocks.GRASS|| blockAt == Blocks.DIRT; + Block blockAbove = world.getBlockState(new BlockPos(x,y+1,z)).getBlock(); + foundGround=((blockAt==Blocks.GRASS||blockAt==Blocks.DIRT) && blockAbove==Blocks.AIR); } return y; } - @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { - return false; - } } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/RoseGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/RoseGen.java deleted file mode 100644 index 080365a..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/misc/RoseGen.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.misc; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class RoseGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - Biome biome = world.getBiomeForCoordsBody(position); - WorldServer worldserver = (WorldServer) world; - - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = null; - Template[] roses= {templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":rose")),templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":blue_rose"))}; - - template=roses[rand.nextInt(2)]; - - if(ModConfig.worldgen.GenerateRoses==false) - return false; - - if(RoseGen.canSpawnHere(template, worldserver, position)) { - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, 1, 0), placementsettings); - return true; - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - boolean corner1 = isCornerValid(world, posAboveGround); - boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); - return posAboveGround.getY() > 31 && corner1 && corner2; - } - public static boolean isCornerValid(World world, BlockPos pos) - { - int variation = 3; - int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); - if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) - return true; - return false; - } - - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 255; - boolean foundGround = false; - while(!foundGround && y-- >= 31) - { - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - Block blockAbove = world.getBlockState(new BlockPos(x,y+1,z)).getBlock(); - foundGround=((blockAt==Blocks.GRASS||blockAt==Blocks.DIRT) && blockAbove==Blocks.AIR); - } - return y; - } - -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/ores/OreGenEnd.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/ores/OreGenEnd.java index 386c645..f7bbccb 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/ores/OreGenEnd.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/ores/OreGenEnd.java @@ -18,13 +18,12 @@ public class OreGenEnd implements IWorldGenerator { @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { - if ((world.provider.getDimension() == 1)&&ModConfig.worldgen.GenerateEndOres) - generateEnd(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider); - } - private void generateEnd(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { - IBlockState[]endOres= {Ores.EndRubyOre.getDefaultState(),Ores.EnderPearlOre.getDefaultState(),Ores.VoidPearlOre.getDefaultState()}; - generateOre(endOres[random.nextInt(3)], world, random, chunkX * 16, chunkZ * 16, 16, 64, 4 + random.nextInt(15), 6); + if ((world.provider.getDimension() == 1)&&ModConfig.worldgen.GenerateEndOres){ + IBlockState[]endOres= {Ores.EndRubyOre.getDefaultState(),Ores.EnderPearlOre.getDefaultState(),Ores.VoidPearlOre.getDefaultState()}; + generateOre(endOres[random.nextInt(3)], world, random, chunkX * 16, chunkZ * 16, 16, 64, 4 + random.nextInt(15), 6); + } } + private void generateOre(IBlockState ore, World world, Random random, int x, int z, int minY, int maxY, int size, int chances) { int deltaY = maxY - minY; for (int i = 0; i < chances; i++) { diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/ores/OreGenNether.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/ores/OreGenNether.java index 04a520d..76a1f85 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/ores/OreGenNether.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/ores/OreGenNether.java @@ -18,13 +18,12 @@ public class OreGenNether implements IWorldGenerator { @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { - if ((world.provider.getDimension() == -1)&&ModConfig.worldgen.GenerateNetherOres) - generateNether(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider); - } - private void generateNether(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { - IBlockState [] netherOres= {Ores.SilverOreNether.getDefaultState(),Ores.GoldOreNether.getDefaultState()}; - generateOre(netherOres[random.nextInt(2)], world, random, chunkX * 16, chunkZ * 16, 16, 64, 4 + random.nextInt(15), 6); + if ((world.provider.getDimension() == -1)&&ModConfig.worldgen.GenerateNetherOres) { + IBlockState [] netherOres= {Ores.SilverOreNether.getDefaultState(),Ores.GoldOreNether.getDefaultState()}; + generateOre(netherOres[random.nextInt(2)], world, random, chunkX * 16, chunkZ * 16, 16, 64, 4 + random.nextInt(15), 6); + } } + private void generateOre(IBlockState ore, World world, Random random, int x, int z, int minY, int maxY, int size, int chances) { int deltaY = maxY - minY; for (int i = 0; i < chances; i++) { diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/ores/OreGenOverworld.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/ores/OreGenOverworld.java index 39aa486..a20cc84 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/ores/OreGenOverworld.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/ores/OreGenOverworld.java @@ -18,13 +18,12 @@ public class OreGenOverworld implements IWorldGenerator { @Override public void generate(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { - if ((world.provider.getDimension()==0)&&ModConfig.worldgen.GenerateOverworldOres==true) - generateOverworld(random, chunkX, chunkZ, world, chunkGenerator, chunkProvider); - } - private void generateOverworld(Random random, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { - IBlockState[] ores= {Ores.SaltOre.getDefaultState(),Ores.RubyOre.getDefaultState(),Ores.SilverOre.getDefaultState()}; - generateOre(ores[random.nextInt(3)], world, random, chunkX * 16, chunkZ * 16, 16, 64, 4 + random.nextInt(4), 6); + if ((world.provider.getDimension()==0)&&ModConfig.worldgen.GenerateOverworldOres==true){ + IBlockState[] ores= {Ores.SaltOre.getDefaultState(),Ores.RubyOre.getDefaultState(),Ores.SilverOre.getDefaultState()}; + generateOre(ores[random.nextInt(3)], world, random, chunkX * 16, chunkZ * 16, 16, 64, 4 + random.nextInt(4), 6); + } } + private void generateOre(IBlockState ore, World world, Random random, int x, int z, int minY, int maxY, int size, int chances) { int deltaY = maxY - minY; int rarity = 16; diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/JeffTank.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/JeffTank.java index bdd97fa..20d83e8 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/JeffTank.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/JeffTank.java @@ -2,13 +2,26 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class JeffTank extends WorldGenerator implements IWorldGenerator{ @@ -17,15 +30,12 @@ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGen IChunkProvider chunkProvider) { int blockX = chunkX * 16; int blockZ = chunkZ * 16; - if (world.provider.getDimension()==-1) - generateNether(world, rand, blockX + 8, blockZ + 8); - } - private void generateNether(World world, Random rand, int blockX, int blockZ) - { - int y = getGroundFromAbove(world, blockX, blockZ); - BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new JeffTankGen(); - structure.generate(world, rand, pos); + if (world.provider.getDimension()==-1) { + + int y = getGroundFromAbove(world, blockX, blockZ); + BlockPos pos = new BlockPos(blockX, y, blockZ); + generate(world, rand, pos); + } } public static int getGroundFromAbove(World world, int x, int z) @@ -41,7 +51,23 @@ public static int getGroundFromAbove(World world, int x, int z) return y; } @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { + public boolean generate(World world, Random rand, BlockPos position) { + WorldServer worldserver = (WorldServer) world; + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":attiecat/jeff_tank")); + if(template == null||ModConfig.worldgen.structures.attiecat.JeffTank) + return false; + if(rand.nextInt(ModConfig.worldgen.structures.attiecat.JeffTankChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, 1, 0), placementsettings); + return true; + } return false; } } diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/JeffTankGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/JeffTankGen.java deleted file mode 100644 index b3e15ce..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/JeffTankGen.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures.AttieCat; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class JeffTankGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - WorldServer worldserver = (WorldServer) world; - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":attiecat/jeff_tank")); - if(template == null||ModConfig.worldgen.structures.attiecat.JeffTank) - return false; - if(JeffTankGen.canSpawnHere(template, worldserver, position)) { - if(rand.nextInt(ModConfig.worldgen.structures.attiecat.JeffTankChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, 1, 0), placementsettings); - return true; - } - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - boolean corner1 = isCornerValid(world, posAboveGround); - boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); - return posAboveGround.getY() > 31 && corner1 && corner2; - } - public static boolean isCornerValid(World world, BlockPos pos) - { - int variation = 3; - int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); - if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) - return true; - return false; - } - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 255; - boolean foundGround = false; - while(!foundGround && y-- >= 31) - { - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - foundGround = blockAt == Blocks.SOUL_SAND; - } - - return y; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/Shrine.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/Shrine.java index fa81305..75695f4 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/Shrine.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/Shrine.java @@ -2,13 +2,26 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class Shrine extends WorldGenerator implements IWorldGenerator{ @@ -17,17 +30,31 @@ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGen IChunkProvider chunkProvider) { int blockX = chunkX * 16; int blockZ = chunkZ * 16; - if (world.provider.getDimension() == 1) - generateEnd(world, rand, blockX + 8, blockZ + 8); + if (world.provider.getDimension() == 1) { + int y = getGroundFromAbove(world, blockX, blockZ); + BlockPos pos = new BlockPos(blockX, y, blockZ); + generate(world, rand, pos); + } } - private void generateEnd(World world, Random rand, int blockX, int blockZ) - { - int y = getGroundFromAbove(world, blockX, blockZ); - BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new ShrineGen(); - structure.generate(world, rand, pos); + + public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) + { + int zwidth = template.getSize().getZ(); + int xwidth = template.getSize().getX(); + boolean corner1 = isCornerValid(world, posAboveGround); + boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); + return posAboveGround.getY() > 31 && corner1 && corner2; } - + + public static boolean isCornerValid(World world, BlockPos pos){ + int variation = 3; + int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); + + if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) + return true; + return false; + } + public static int getGroundFromAbove(World world, int x, int z) { int y = 255; @@ -39,8 +66,35 @@ public static int getGroundFromAbove(World world, int x, int z) } return y; } + @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { + public boolean generate(World world, Random rand, BlockPos position) { + WorldServer worldserver = (WorldServer) world; + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + int selectShrine=rand.nextInt(2); + Template template = null; + if (selectShrine==1) + template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":attiecat/bill_shrine")); + else + template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":attiecat/john_shrine")); + + if(template == null||ModConfig.worldgen.structures.attiecat.Shrines) + return false; + + if(canSpawnHere(template, worldserver, position)) { + if(rand.nextInt(ModConfig.worldgen.structures.attiecat.ShrinesChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); + return true; + } + } return false; } + } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/ShrineGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/ShrineGen.java deleted file mode 100644 index 92df924..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/AttieCat/ShrineGen.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures.AttieCat; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class ShrineGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - WorldServer worldserver = (WorldServer) world; - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - int selectShrine=rand.nextInt(2); - Template template = null; - if (selectShrine==1) - template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":attiecat/bill_shrine")); - else - template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":attiecat/john_shrine")); - - if(template == null||ModConfig.worldgen.structures.attiecat.Shrines) - return false; - - if(ShrineGen.canSpawnHere(template, worldserver, position)) { - if(rand.nextInt(ModConfig.worldgen.structures.attiecat.ShrinesChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); - return true; - } - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - boolean corner1 = isCornerValid(world, posAboveGround); - boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); - return posAboveGround.getY() > 31 && corner1 && corner2; - } - public static boolean isCornerValid(World world, BlockPos pos){ - int variation = 3; - int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); - - if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) - return true; - return false; - } - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 255; - boolean foundGround = false; - while(!foundGround && y-- >= 31) - { - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - foundGround = blockAt == Blocks.END_STONE; - } - return y; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Buoy.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Buoy.java index 62b8e7e..88c184f 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Buoy.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Buoy.java @@ -2,13 +2,28 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; +import com.NetherNoah.ParadiseMod.world.dimension.DimensionRegistry; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class Buoy extends WorldGenerator implements IWorldGenerator{ @@ -17,15 +32,13 @@ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGen IChunkProvider chunkProvider) { int blockX = chunkX * 16; int blockZ = chunkZ * 16; - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { int y = getGroundFromAbove(world, blockX, blockZ); + if (y>60||world.provider.getDimension()==DimensionRegistry.DeepUnderground) { BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new BuoyGen(); - structure.generate(world, rand, pos); + generate(world, rand, pos); + } } + public static int getGroundFromAbove(World world, int x, int z) { int y = 255; @@ -37,8 +50,35 @@ public static int getGroundFromAbove(World world, int x, int z) } return y; } + @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { + public boolean generate(World world, Random rand, BlockPos position) { + WorldServer worldserver = (WorldServer) world; + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":buoy")); + if(ModConfig.worldgen.structures.Buoys==false) + return false; + Biome biome = world.getBiomeForCoordsBody(position); + if(canSpawnHere(template, worldserver, position)) { + if(rand.nextInt(ModConfig.worldgen.structures.BuoysChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, -1, 0), placementsettings); + return true; + } + } return false; } + + public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) + { + int zwidth = template.getSize().getZ(); + int xwidth = template.getSize().getX(); + return posAboveGround.getY() > 10; + } } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/BuoyGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/BuoyGen.java deleted file mode 100644 index ac392d0..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/BuoyGen.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class BuoyGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - WorldServer worldserver = (WorldServer) world; - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":buoy")); - if(ModConfig.worldgen.structures.Buoys==false) - return false; - Biome biome = world.getBiomeForCoordsBody(position); - if(BuoyGen.canSpawnHere(template, worldserver, position)) { - if(rand.nextInt(ModConfig.worldgen.structures.BuoysChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, -1, 0), placementsettings); - return true; - } - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - return posAboveGround.getY() > 10; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/Dungeons.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/Dungeons.java deleted file mode 100644 index a1660da..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/Dungeons.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures.Dungeons; - -import java.util.Random; - -import net.minecraft.block.Block; -import net.minecraft.init.Blocks; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.chunk.IChunkProvider; -import net.minecraft.world.gen.IChunkGenerator; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraftforge.fml.common.IWorldGenerator; - -public class Dungeons extends WorldGenerator implements IWorldGenerator{ - @Override - public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, - IChunkProvider chunkProvider) { - int blockX = chunkX * 16; - int blockZ = chunkZ * 16; - if (world.provider.getDimension() == 0) - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { - int y = getGroundFromAbove(world, blockX, blockZ); - BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new BrickPyramidGen(); - structure.generate(world, rand, pos); - } - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 255; - boolean foundGround = false; - while(!foundGround && y-- >= 31) - { - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - foundGround = blockAt == Blocks.GRAVEL||blockAt == Blocks.GRASS||blockAt == Blocks.SAND||blockAt == Blocks.DIRT||blockAt == Blocks.STONE; - } - return y; - } - @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { - return false; - } - -} diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/Minerbase.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/Minerbase.java index 5e27e87..3ff4e31 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/Minerbase.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/Minerbase.java @@ -32,24 +32,10 @@ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGen IChunkProvider chunkProvider) { int blockX = chunkX * 16; int blockZ = chunkZ * 16; - if (world.provider.getDimension() != 1 && world.provider.getDimension() != DimensionRegistry.DeepVoid - && world.provider.getDimension() != -1) { - int y = getGroundFromAbove(world, blockX, blockZ); - if (y > 31) { - BlockPos pos = new BlockPos(blockX, y, blockZ); - generate(world, rand, pos); - } - } - } - - public static int getGroundFromAbove(World world, int x, int z) { - int y = 75; - boolean foundGround = false; - while (!foundGround && y-- >= 31) { - Block blockAt = world.getBlockState(new BlockPos(x, y, z)).getBlock(); - foundGround = blockAt == Blocks.STONE; + if (world.provider.getDimension() == 0||world.provider.getDimension() != DimensionRegistry.DeepUnderground) { + BlockPos pos = new BlockPos(blockX, 30, blockZ); + generate(world, rand, pos); } - return y; } @Override @@ -70,7 +56,7 @@ public boolean generate(World world, Random rand, BlockPos position) { .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, -30, 0), placementsettings); + template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); return true; } } diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/VoidDungeonGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/VoidDungeonGen.java deleted file mode 100644 index 35a11b8..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/VoidDungeonGen.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures.Dungeons; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; -import com.NetherNoah.ParadiseMod.init.ModBlocks.Misc; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class VoidDungeonGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - Biome biome = world.getBiomeForCoordsBody(position); - WorldServer worldserver = (WorldServer) world; - if (ModConfig.worldgen.structures.VoidDungeon==false) - return false; - - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = null; - Template[] dungeons= { - templatemanager.getTemplate(minecraftserver,new ResourceLocation(Reference.MOD_ID+":dungeons/void_dungeon_small_zombie")), - templatemanager.getTemplate(minecraftserver,new ResourceLocation(Reference.MOD_ID+":dungeons/void_dungeon_small_skeleton")), - templatemanager.getTemplate(minecraftserver,new ResourceLocation(Reference.MOD_ID+":dungeons/void_dungeon_small_spider")), - templatemanager.getTemplate(minecraftserver,new ResourceLocation(Reference.MOD_ID+":dungeons/dungeon_medium")) - }; - template=dungeons[rand.nextInt(4)]; - - if(VoidDungeonGen.canSpawnHere(template, worldserver, position)) { - if(rand.nextInt(ModConfig.worldgen.structures.VoidDungeonChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, -17, 0), placementsettings); - return true; - } - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - boolean corner1 = isCornerValid(world, posAboveGround); - boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); - return posAboveGround.getY() > 31 && corner1 && corner2; - } - public static boolean isCornerValid(World world, BlockPos pos) - { - int variation = 3; - int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); - if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) - return true; - return false; - } - - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 120; - boolean foundGround = false; - while(!foundGround && y-- >= 31) - { - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - Block blockAbove = world.getBlockState(new BlockPos(x,y+1,z)).getBlock(); - foundGround = (blockAt == Misc.VoidStone); - } - return y; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/VoidDungeonLargeGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/VoidDungeonLargeGen.java deleted file mode 100644 index faedd2d..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/VoidDungeonLargeGen.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures.Dungeons; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; -import com.NetherNoah.ParadiseMod.init.ModBlocks.Misc; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class VoidDungeonLargeGen extends WorldGenerator { - - @Override - public boolean generate(World world, Random rand, BlockPos position) { - WorldServer worldserver = (WorldServer) world; - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template part1 = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":dungeons/void_dungeon_large_piece_1")); - Template part2 = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":dungeons/void_dungeon_large_piece_2")); - Template part3 = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":dungeons/void_dungeon_large_piece_3")); - Template part4 = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":dungeons/void_dungeon_large_piece_4")); - if (ModConfig.worldgen.structures.VoidDungeonLarge==false) - return false; - if(part1 == null) - return false; - Biome biome = world.getBiomeForCoordsBody(position); - if(VoidDungeonLargeGen.canSpawnHere(part1, worldserver, position)) { - if(rand.nextInt(ModConfig.worldgen.structures.VoidDungeonLargeChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - part1.getDataBlocks(position, placementsettings); - part1.addBlocksToWorld(world, position.add(0, -11, 0), placementsettings); - part2.getDataBlocks(position, placementsettings); - part2.addBlocksToWorld(world, position.add(0, -11, 32), placementsettings); - part3.getDataBlocks(position, placementsettings); - part3.addBlocksToWorld(world, position.add(32, -11, 0), placementsettings); - part4.getDataBlocks(position, placementsettings); - part4.addBlocksToWorld(world, position.add(32, -11, 32), placementsettings); - return true; - } - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - boolean corner1 = isCornerValid(world, posAboveGround); - boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); - return posAboveGround.getY() > 31 && corner1 && corner2; - } - public static boolean isCornerValid(World world, BlockPos pos) - { - int variation = 3; - int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); - if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) - return true; - return false; - } - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 120; - boolean foundGround = false; - while(!foundGround && y-- >= 31) - { - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - Block blockAbove = world.getBlockState(new BlockPos(x,y+1,z)).getBlock(); - foundGround = blockAt == Misc.VoidStone; - } - return y; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/VoidTower.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/VoidTower.java index d3f6d2f..2da3634 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/VoidTower.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Dungeons/VoidTower.java @@ -59,6 +59,7 @@ public boolean generate(World world, Random rand, BlockPos position) { Template section = templatemanager.getTemplate(minecraftserver,new ResourceLocation(Reference.MOD_ID+":dungeons/void_tower_section")); Template top = templatemanager.getTemplate(minecraftserver,new ResourceLocation(Reference.MOD_ID+":dungeons/void_tower_top")); int sections=rand.nextInt(16); + sections++; if (ModConfig.worldgen.structures.VoidTower==false) return false; if(canSpawnHere(bottom, worldserver, position)) { @@ -72,11 +73,11 @@ public boolean generate(World world, Random rand, BlockPos position) { bottom.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); for (int i=1;i 31 && corner1 && corner2; - } - public static boolean isCornerValid(World world, BlockPos pos) - { - int variation = 3; - int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); - if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) - return true; - return false; - } - - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 120; - boolean foundGround = false; - while(!foundGround && y-- >= 31) - { - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - Block blockAbove = world.getBlockState(new BlockPos(x,y+1,z)).getBlock(); - foundGround = (blockAt == Misc.VoidStone); - } - return y; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEgg.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEgg.java index 6dfa947..09ffa8d 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEgg.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEgg.java @@ -2,30 +2,44 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class EasterEgg extends WorldGenerator implements IWorldGenerator{ + @Override public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { int blockX = chunkX * 16; - int blockZ = chunkZ * 16; - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { + int blockZ = chunkZ * 16; int y = getGroundFromAbove(world, blockX, blockZ); + boolean isUnderground=rand.nextBoolean(); BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new EasterEggGen(); - structure.generate(world, rand, pos); + if (isUnderground==true) + pos = new BlockPos(blockX, 30, blockZ); + generate(world, rand, pos,isUnderground); } + public static int getGroundFromAbove(World world, int x, int z) { int y = 255; @@ -37,8 +51,36 @@ public static int getGroundFromAbove(World world, int x, int z) } return y; } + + public boolean generate(World world, Random rand, BlockPos position, Boolean isUnderground) { + WorldServer worldserver = (WorldServer) world; + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":easter_egg_1")); + if (isUnderground==true) { + + template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":easter_egg_2")); + } + if(ModConfig.worldgen.structures.EasterEgg==false) + return false; + Biome biome = world.getBiomeForCoordsBody(position); + if(rand.nextInt(ModConfig.worldgen.structures.EasterEggChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); + return true; + } + return false; + } + @Override public boolean generate(World worldIn, Random rand, BlockPos position) { + // TODO Auto-generated method stub return false; } + } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEgg2.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEgg2.java deleted file mode 100644 index 0525775..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEgg2.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures; - -import java.util.Random; - -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.chunk.IChunkProvider; -import net.minecraft.world.gen.IChunkGenerator; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraftforge.fml.common.IWorldGenerator; - -public class EasterEgg2 extends WorldGenerator implements IWorldGenerator{ - - @Override - public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, - IChunkProvider chunkProvider) { - int blockX = chunkX * 16; - int blockZ = chunkZ * 16; - if (world.provider.getDimension() == 0) - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { - BlockPos pos = new BlockPos(blockX, 30, blockZ); - WorldGenerator structure = new EasterEgg2Gen(); - structure.generate(world, rand, pos); - } - - @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { - return false; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEgg2Gen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEgg2Gen.java deleted file mode 100644 index 47e0283..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEgg2Gen.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class EasterEgg2Gen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - WorldServer worldserver = (WorldServer) world; - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":easter_egg_2")); - if(template == null||ModConfig.worldgen.structures.EasterEgg==false) - return false; - Biome biome = world.getBiomeForCoordsBody(position); - if(rand.nextInt(ModConfig.worldgen.structures.EasterEggChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); - return true; - } - return false; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEggGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEggGen.java deleted file mode 100644 index 62767e3..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/EasterEggGen.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class EasterEggGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - WorldServer worldserver = (WorldServer) world; - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":easter_egg_1")); - if(ModConfig.worldgen.structures.EasterEgg==false) - return false; - Biome biome = world.getBiomeForCoordsBody(position); - if(rand.nextInt(ModConfig.worldgen.structures.EasterEggChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); - return true; - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - return posAboveGround.getY() > 10; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/GiantGrassBlock.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/GiantGrassBlock.java index 8d695d8..64d9316 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/GiantGrassBlock.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/GiantGrassBlock.java @@ -2,13 +2,27 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class GiantGrassBlock extends WorldGenerator implements IWorldGenerator{ @@ -16,16 +30,12 @@ public class GiantGrassBlock extends WorldGenerator implements IWorldGenerator{ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { int blockX = chunkX * 16; - int blockZ = chunkZ * 16; - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { + int blockZ = chunkZ * 16; int y = getGroundFromAbove(world, blockX, blockZ); BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new GiantGrassBlockGen(); - structure.generate(world, rand, pos); + generate(world, rand, pos); } + public static int getGroundFromAbove(World world, int x, int z) { int y = 255; @@ -37,8 +47,27 @@ public static int getGroundFromAbove(World world, int x, int z) } return y; } + @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { + public boolean generate(World world, Random rand, BlockPos position) { + WorldServer worldserver = (WorldServer) world; + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":grass_block_large")); + if(ModConfig.worldgen.structures.GiantGrassBlock==false) + return false; + Biome biome = world.getBiomeForCoordsBody(position); + if(rand.nextInt(ModConfig.worldgen.structures.GiantGrassBlockChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); + return true; + } return false; } + } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/GiantGrassBlockGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/GiantGrassBlockGen.java deleted file mode 100644 index a474ac7..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/GiantGrassBlockGen.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class GiantGrassBlockGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - WorldServer worldserver = (WorldServer) world; - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":grass_block_large")); - if(ModConfig.worldgen.structures.GiantGrassBlock==false) - return false; - Biome biome = world.getBiomeForCoordsBody(position); - if(rand.nextInt(ModConfig.worldgen.structures.GiantGrassBlockChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); - return true; - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - return posAboveGround.getY() > 10; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Home.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Home.java index 75ec454..fd7012e 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Home.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Home.java @@ -2,16 +2,32 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Biomes; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class Home extends WorldGenerator implements IWorldGenerator{ + @Override public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { @@ -19,13 +35,14 @@ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGen int blockZ = chunkZ * 16; generateOverworld(world, rand, blockX + 8, blockZ + 8); } + private void generateOverworld(World world, Random rand, int blockX, int blockZ) { int y = getGroundFromAbove(world, blockX, blockZ); BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new HomeGen(); - structure.generate(world, rand, pos); + generate(world, rand, pos); } + public static int getGroundFromAbove(World world, int x, int z) { int y = 75; @@ -33,12 +50,72 @@ public static int getGroundFromAbove(World world, int x, int z) while(!foundGround && y-- >= 31) { Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - foundGround = blockAt == Blocks.GRASS|| blockAt == Blocks.DIRT || blockAt == Blocks.SAND || blockAt == Blocks.SNOW ||blockAt == Blocks.MYCELIUM||blockAt==Blocks.STONE; + Block blockAbove = world.getBlockState(new BlockPos(x,y+1,z)).getBlock(); + foundGround = (blockAt == Blocks.GRASS|| blockAt == Blocks.DIRT || blockAt == Blocks.SAND || blockAt == Blocks.SNOW ||blockAt == Blocks.MYCELIUM||blockAt==Blocks.STONE)&&blockAbove==Blocks.AIR; } return y; } + + public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) + { + int zwidth = template.getSize().getZ(); + int xwidth = template.getSize().getX(); + boolean corner1 = isCornerValid(world, posAboveGround); + boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); + return posAboveGround.getY() > 31 && corner1 && corner2; + } + + public static boolean isCornerValid(World world, BlockPos pos) + { + int variation = 3; + int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); + if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) + return true; + return false; + } + @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { + public boolean generate(World world, Random rand, BlockPos position) { + Biome biome = world.getBiomeForCoordsBody(position); + WorldServer worldserver = (WorldServer) world; + + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house")); + + //savanna home + if(biome == Biomes.SAVANNA||biome == Biomes.SAVANNA_PLATEAU||biome == Biomes.MUTATED_SAVANNA||biome == Biomes.MUTATED_SAVANNA_ROCK) + template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house_acacia")); + //birch forest home + if(biome == Biomes.BIRCH_FOREST_HILLS|| biome == Biomes.BIRCH_FOREST_HILLS) + template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house_birch")); + //roofed forest home + if(biome == Biomes.ROOFED_FOREST) + template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house_dark_oak")); + //desert home + if(biome == Biomes.DESERT||biome == Biomes.DESERT_HILLS||biome == Biomes.MUTATED_DESERT) + template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house_desert")); + //jungle home + if(biome == Biomes.JUNGLE||biome == Biomes.JUNGLE_EDGE||biome == Biomes.JUNGLE_HILLS||biome == Biomes.MUTATED_JUNGLE||biome == Biomes.MUTATED_JUNGLE_EDGE) + template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house_jungle")); + //spruce home + if(biome == Biomes.TAIGA||biome == Biomes.TAIGA_HILLS||biome == Biomes.COLD_TAIGA||biome == Biomes.COLD_TAIGA_HILLS||biome == Biomes.MUTATED_REDWOOD_TAIGA||biome == Biomes.MUTATED_REDWOOD_TAIGA_HILLS||biome == Biomes.MUTATED_TAIGA||biome == Biomes.MUTATED_TAIGA_COLD||biome == Biomes.REDWOOD_TAIGA||biome == Biomes.REDWOOD_TAIGA_HILLS||biome==Biomes.EXTREME_HILLS_WITH_TREES||biome==Biomes.MUTATED_EXTREME_HILLS_WITH_TREES) + template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house_spruce")); + + if(ModConfig.worldgen.structures.Homes==false) + return false; + if(canSpawnHere(template, worldserver, position)) { + if(rand.nextInt(ModConfig.worldgen.structures.HomesChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); + return true; + } + } return false; } } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/HomeGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/HomeGen.java deleted file mode 100644 index 77986f8..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/HomeGen.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Biomes; -import net.minecraft.init.Blocks; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class HomeGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - Biome biome = world.getBiomeForCoordsBody(position); - WorldServer worldserver = (WorldServer) world; - - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house")); - - //oak forest home - if(biome == Biomes.FOREST || biome == Biomes.FOREST_HILLS||biome==Biomes.SWAMPLAND||biome==Biomes.MUTATED_SWAMPLAND||biome==Biomes.PLAINS||biome==Biomes.MUTATED_PLAINS||biome==Biomes.ICE_PLAINS) - template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house")); - //savanna home - if(biome == Biomes.SAVANNA||biome == Biomes.SAVANNA_PLATEAU||biome == Biomes.MUTATED_SAVANNA||biome == Biomes.MUTATED_SAVANNA_ROCK) - template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house_acacia")); - //birch forest home - if(biome == Biomes.BIRCH_FOREST_HILLS|| biome == Biomes.BIRCH_FOREST_HILLS) - template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house_birch")); - //roofed forest home - if(biome == Biomes.ROOFED_FOREST) - template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house_dark_oak")); - //desert home - if(biome == Biomes.DESERT||biome == Biomes.DESERT_HILLS||biome == Biomes.MUTATED_DESERT) - template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house_desert")); - //jungle home - if(biome == Biomes.JUNGLE||biome == Biomes.JUNGLE_EDGE||biome == Biomes.JUNGLE_HILLS||biome == Biomes.MUTATED_JUNGLE||biome == Biomes.MUTATED_JUNGLE_EDGE) - template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house_jungle")); - //spruce home - if(biome == Biomes.TAIGA||biome == Biomes.TAIGA_HILLS||biome == Biomes.COLD_TAIGA||biome == Biomes.COLD_TAIGA_HILLS||biome == Biomes.MUTATED_REDWOOD_TAIGA||biome == Biomes.MUTATED_REDWOOD_TAIGA_HILLS||biome == Biomes.MUTATED_TAIGA||biome == Biomes.MUTATED_TAIGA_COLD||biome == Biomes.REDWOOD_TAIGA||biome == Biomes.REDWOOD_TAIGA_HILLS||biome==Biomes.EXTREME_HILLS_WITH_TREES||biome==Biomes.MUTATED_EXTREME_HILLS_WITH_TREES) - template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":homes/starter_house_spruce")); - - if(ModConfig.worldgen.structures.Homes==false) - return false; - if(HomeGen.canSpawnHere(template, worldserver, position)) { - if(rand.nextInt(ModConfig.worldgen.structures.HomesChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); - return true; - } - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - boolean corner1 = isCornerValid(world, posAboveGround); - boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); - return posAboveGround.getY() > 31 && corner1 && corner2; - } - public static boolean isCornerValid(World world, BlockPos pos) - { - int variation = 3; - int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); - if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) - return true; - return false; - } - - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 75; - boolean foundGround = false; - while(!foundGround && y-- >= 31) - { - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - Block blockAbove = world.getBlockState(new BlockPos(x,y+1,z)).getBlock(); - foundGround = (blockAt == Blocks.GRASS|| blockAt == Blocks.DIRT || blockAt == Blocks.SAND || blockAt == Blocks.SNOW ||blockAt == Blocks.MYCELIUM||blockAt==Blocks.STONE && blockAbove==Blocks.AIR); - } - return y; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMine.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMine.java index ec4f7ca..36adba8 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMine.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMine.java @@ -2,13 +2,27 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class LandMine extends WorldGenerator implements IWorldGenerator{ @@ -16,15 +30,10 @@ public class LandMine extends WorldGenerator implements IWorldGenerator{ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { int blockX = chunkX * 16; - int blockZ = chunkZ * 16; - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { + int blockZ = chunkZ * 16; int y = getGroundFromAbove(world, blockX, blockZ); BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new LandMineGen(); - structure.generate(world, rand, pos); + generate(world, rand, pos); } public static int getGroundFromAbove(World world, int x, int z) { @@ -38,7 +47,43 @@ public static int getGroundFromAbove(World world, int x, int z) return y; } @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { + public boolean generate(World world, Random rand, BlockPos position) { + Biome biome = world.getBiomeForCoordsBody(position); + WorldServer worldserver = (WorldServer) world; + + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":landmines/landmine")); + if(ModConfig.worldgen.structures.Landmines==false) + return false; + if(canSpawnHere(template, worldserver, position)) { + if(rand.nextInt(ModConfig.worldgen.structures.LandminesChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, -1, 0), placementsettings); + return true; + } + } + return false; + } + public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) + { + int zwidth = template.getSize().getZ(); + int xwidth = template.getSize().getX(); + boolean corner1 = isCornerValid(world, posAboveGround); + boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); + return posAboveGround.getY() > 31 && corner1 && corner2; + } + public static boolean isCornerValid(World world, BlockPos pos) + { + int variation = 3; + int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); + if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) + return true; return false; } } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineDirt.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineDirt.java index 4617294..f81ac71 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineDirt.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineDirt.java @@ -2,13 +2,27 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class LandMineDirt extends WorldGenerator implements IWorldGenerator{ @@ -16,29 +30,67 @@ public class LandMineDirt extends WorldGenerator implements IWorldGenerator{ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { int blockX = chunkX * 16; - int blockZ = chunkZ * 16; - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { + int blockZ = chunkZ * 16; int y = getGroundFromAbove(world, blockX, blockZ); BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new LandMineDirtGen(); - structure.generate(world, rand, pos); + generate(world, rand, pos); + } + + @Override + public boolean generate(World world, Random rand, BlockPos position) { + Biome biome = world.getBiomeForCoordsBody(position); + WorldServer worldserver = (WorldServer) world; + + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":landmines/landmine_dirt")); + if(ModConfig.worldgen.structures.Landmines==false) + return false; + if(canSpawnHere(template, worldserver, position)) { + if(rand.nextInt(ModConfig.worldgen.structures.LandminesChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, -1, 0), placementsettings); + return true; + } + } + return false; + } + + public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) + { + int zwidth = template.getSize().getZ(); + int xwidth = template.getSize().getX(); + boolean corner1 = isCornerValid(world, posAboveGround); + boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); + return posAboveGround.getY() > 31 && corner1 && corner2; } + + public static boolean isCornerValid(World world, BlockPos pos) + { + int variation = 3; + int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); + if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) + return true; + return false; + } + public static int getGroundFromAbove(World world, int x, int z) { int y = 255; boolean foundGround = false; while(!foundGround && y-- >= 31) { + Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - foundGround=blockAt==Blocks.DIRT; + Block blockAbove = world.getBlockState(new BlockPos(x,y+1,z)).getBlock(); + foundGround=(blockAt==Blocks.DIRT && blockAbove==Blocks.AIR); } return y; } - @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { - return false; - } + } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineDirtGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineDirtGen.java deleted file mode 100644 index 9c5c804..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineDirtGen.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures.Landmines; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class LandMineDirtGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - Biome biome = world.getBiomeForCoordsBody(position); - WorldServer worldserver = (WorldServer) world; - - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":landmines/landmine_dirt")); - if(ModConfig.worldgen.structures.Landmines==false) - return false; - if(LandMineDirtGen.canSpawnHere(template, worldserver, position)) { - if(rand.nextInt(ModConfig.worldgen.structures.LandminesChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, -1, 0), placementsettings); - return true; - } - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - boolean corner1 = isCornerValid(world, posAboveGround); - boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); - return posAboveGround.getY() > 31 && corner1 && corner2; - } - public static boolean isCornerValid(World world, BlockPos pos) - { - int variation = 3; - int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); - if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) - return true; - return false; - } - - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 255; - boolean foundGround = false; - while(!foundGround && y-- >= 31) - { - - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - Block blockAbove = world.getBlockState(new BlockPos(x,y+1,z)).getBlock(); - foundGround=(blockAt==Blocks.DIRT && blockAbove==Blocks.AIR); - } - return y; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineGen.java deleted file mode 100644 index d7558ed..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineGen.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures.Landmines; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class LandMineGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - Biome biome = world.getBiomeForCoordsBody(position); - WorldServer worldserver = (WorldServer) world; - - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":landmines/landmine")); - if(ModConfig.worldgen.structures.Landmines==false) - return false; - if(LandMineGen.canSpawnHere(template, worldserver, position)) { - if(rand.nextInt(ModConfig.worldgen.structures.LandminesChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, -1, 0), placementsettings); - return true; - } - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - boolean corner1 = isCornerValid(world, posAboveGround); - boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); - return posAboveGround.getY() > 31 && corner1 && corner2; - } - public static boolean isCornerValid(World world, BlockPos pos) - { - int variation = 3; - int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); - if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) - return true; - return false; - } - - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 255; - boolean foundGround = false; - while(!foundGround && y-- >= 31) - { - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - Block blockAbove = world.getBlockState(new BlockPos(x,y+1,z)).getBlock(); - foundGround=(blockAt==Blocks.GRASS && blockAbove==Blocks.AIR); - } - return y; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineStone.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineStone.java index 1c86ab7..b115977 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineStone.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineStone.java @@ -2,13 +2,27 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class LandMineStone extends WorldGenerator implements IWorldGenerator{ @@ -16,16 +30,12 @@ public class LandMineStone extends WorldGenerator implements IWorldGenerator{ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { int blockX = chunkX * 16; - int blockZ = chunkZ * 16; - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { + int blockZ = chunkZ * 16; int y = getGroundFromAbove(world, blockX, blockZ); BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new LandMineStoneGen(); - structure.generate(world, rand, pos); + generate(world, rand, pos); } + public static int getGroundFromAbove(World world, int x, int z) { Random rand = new Random(); @@ -40,8 +50,28 @@ public static int getGroundFromAbove(World world, int x, int z) } return y; } + @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { + public boolean generate(World world, Random rand, BlockPos position) { + Biome biome = world.getBiomeForCoordsBody(position); + WorldServer worldserver = (WorldServer) world; + + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":landmines/landmine_stone")); + if(ModConfig.worldgen.structures.Landmines==false) + return false; + if(rand.nextInt(ModConfig.worldgen.structures.LandminesChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, -1, 0), placementsettings); + return true; + } return false; } + } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineStoneGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineStoneGen.java deleted file mode 100644 index b1e569f..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Landmines/LandMineStoneGen.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures.Landmines; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class LandMineStoneGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - Biome biome = world.getBiomeForCoordsBody(position); - WorldServer worldserver = (WorldServer) world; - - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":landmines/landmine_stone")); - if(ModConfig.worldgen.structures.Landmines==false) - return false; - if(rand.nextInt(ModConfig.worldgen.structures.LandminesChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, -1, 0), placementsettings); - return true; - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - boolean corner1 = isCornerValid(world, posAboveGround); - boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); - //return posAboveGround.getY() > 16 && corner1 && corner2; - return true; - } - public static boolean isCornerValid(World world, BlockPos pos) - { - int variation = 3; - int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); - if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) - return true; - return true; - } - - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 255; - boolean foundGround = false; - while(!foundGround && y-- >= 16) - { - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - foundGround = blockAt == Blocks.STONE; - } - return y; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Ocean.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Ocean.java index d53d8a1..208dd8b 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Ocean.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Ocean.java @@ -36,17 +36,9 @@ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGen int y = getGroundFromAbove(world, blockX, blockZ); BlockPos pos = new BlockPos(blockX, y, blockZ); generate(world, rand, pos); - //generateOverworld(world, rand, blockX + 8, blockZ + 8); } } - /*/ - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { - int y = getGroundFromAbove(world, blockX, blockZ); - BlockPos pos = new BlockPos(blockX, y, blockZ); - generate(world, rand, pos); - } - /*/ + public static int getGroundFromAbove(World world, int x, int z) { int y = 255; diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/PlayerTempleGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/PlayerTempleGen.java deleted file mode 100644 index f15eed1..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/PlayerTempleGen.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Biomes; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class PlayerTempleGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - WorldServer worldserver = (WorldServer) world; - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = null; - switch (rand.nextInt(2)) { - case 0: - template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":player_temples/nn777_temple")); - break; - case 1: - template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":player_temples/attiecat_temple")); - break; - } - /*/ - if (rand.nextInt(2)==0) - template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":player_temples/attiecat_temple")); - /*/ - if(ModConfig.worldgen.structures.PlayerTemples==false) - return false; - Biome biome = world.getBiomeForCoordsBody(position); - if (biome==Biomes.DESERT||biome==Biomes.SAVANNA||biome==Biomes.TAIGA||biome==Biomes.PLAINS) { - if(rand.nextInt(ModConfig.worldgen.structures.PlayerTemplesChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); - return true; - } - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - return posAboveGround.getY() > 10; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/PlayerTemples.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/PlayerTemples.java index 1dd2755..1d605b1 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/PlayerTemples.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/PlayerTemples.java @@ -2,13 +2,28 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Biomes; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class PlayerTemples extends WorldGenerator implements IWorldGenerator{ @@ -16,16 +31,12 @@ public class PlayerTemples extends WorldGenerator implements IWorldGenerator{ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { int blockX = chunkX * 16; - int blockZ = chunkZ * 16; - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { + int blockZ = chunkZ * 16; int y = getGroundFromAbove(world, blockX, blockZ); BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new PlayerTempleGen(); - structure.generate(world, rand, pos); + generate(world, rand, pos); } + public static int getGroundFromAbove(World world, int x, int z) { int y = 255; @@ -37,8 +48,37 @@ public static int getGroundFromAbove(World world, int x, int z) } return y; } + @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { + public boolean generate(World world, Random rand, BlockPos position) { + WorldServer worldserver = (WorldServer) world; + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = null; + switch (rand.nextInt(2)) { + case 0: + template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":player_temples/nn777_temple")); + break; + case 1: + template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":player_temples/attiecat_temple")); + break; + } + if(ModConfig.worldgen.structures.PlayerTemples==false) + return false; + Biome biome = world.getBiomeForCoordsBody(position); + if (biome==Biomes.DESERT||biome==Biomes.SAVANNA||biome==Biomes.TAIGA||biome==Biomes.PLAINS) { + if(rand.nextInt(ModConfig.worldgen.structures.PlayerTemplesChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); + return true; + } + } return false; } + } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/RoguePortal.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/RoguePortal.java index 235da0a..a4430b9 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/RoguePortal.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/RoguePortal.java @@ -2,13 +2,26 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class RoguePortal extends WorldGenerator implements IWorldGenerator{ @@ -17,16 +30,13 @@ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGen IChunkProvider chunkProvider) { int blockX = chunkX * 16; int blockZ = chunkZ * 16; - if (world.provider.getDimension() == 0) - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { - int y = getGroundFromAbove(world, blockX, blockZ); - BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new RoguePortalGen(); - structure.generate(world, rand, pos); + if (world.provider.getDimension() == 0){ + int y = getGroundFromAbove(world, blockX, blockZ); + BlockPos pos = new BlockPos(blockX, y, blockZ); + generate(world, rand, pos); + } } + public static int getGroundFromAbove(World world, int x, int z) { int y = 255; @@ -38,8 +48,46 @@ public static int getGroundFromAbove(World world, int x, int z) } return y; } + @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { + public boolean generate(World world, Random rand, BlockPos position) { + WorldServer worldserver = (WorldServer) world; + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":rogue_portal")); + if(template == null||ModConfig.worldgen.structures.RoguePortal==false) + return false; + + if(canSpawnHere(template, worldserver, position)) { + if(rand.nextInt(ModConfig.worldgen.structures.RoguePortalChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); + return true; + } + } + return false; + } + + public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) + { + int zwidth = template.getSize().getZ(); + int xwidth = template.getSize().getX(); + boolean corner1 = isCornerValid(world, posAboveGround); + boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); + return posAboveGround.getY() > 31 && corner1 && corner2; + } + + public static boolean isCornerValid(World world, BlockPos pos) + { + int variation = 3; + int highestBlock = getGroundFromAbove(world,pos.getX(),pos.getZ()); + if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) + return true; return false; } } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/RoguePortalGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/RoguePortalGen.java deleted file mode 100644 index a16bca4..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/RoguePortalGen.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class RoguePortalGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - WorldServer worldserver = (WorldServer) world; - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":rogue_portal")); - if(template == null||ModConfig.worldgen.structures.RoguePortal==false) - return false; - - if(RoguePortalGen.canSpawnHere(template, worldserver, position)) { - if(rand.nextInt(ModConfig.worldgen.structures.RoguePortalChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); - return true; - } - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - boolean corner1 = isCornerValid(world, posAboveGround); - boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); - return posAboveGround.getY() > 31 && corner1 && corner2; - } - public static boolean isCornerValid(World world, BlockPos pos) - { - int variation = 3; - int highestBlock = getGroundFromAbove(world,pos.getX(),pos.getZ()); - if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) - return true; - return false; - } - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 255; - boolean foundGround = false; - while(!foundGround && y-- >= 31) - { - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - foundGround = blockAt == Blocks.GRASS||blockAt==Blocks.STONE||blockAt==Blocks.DIRT||blockAt==Blocks.GRAVEL; - } - return y; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Runway.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Runway.java index e75c6e9..5413f54 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Runway.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/Runway.java @@ -2,13 +2,27 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class Runway extends WorldGenerator implements IWorldGenerator{ @@ -17,16 +31,13 @@ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGen IChunkProvider chunkProvider) { int blockX = chunkX * 16; int blockZ = chunkZ * 16; - if (world.provider.getDimension() == 0) - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { - int y = getGroundFromAbove(world, blockX, blockZ); - BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new RunwayGen(); - structure.generate(world, rand, pos); + if (world.provider.getDimension() == 0){ + int y = getGroundFromAbove(world, blockX, blockZ); + BlockPos pos = new BlockPos(blockX, y, blockZ); + generate(world, rand, pos); + } } + public static int getGroundFromAbove(World world, int x, int z) { int y = 255; @@ -38,8 +49,35 @@ public static int getGroundFromAbove(World world, int x, int z) } return y; } + @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { + public boolean generate(World world, Random rand, BlockPos position) { + WorldServer worldserver = (WorldServer) world; + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":runway")); + if(template == null||ModConfig.worldgen.structures.Runway==false) + return false; + Biome biome = world.getBiomeForCoordsBody(position); + if(canSpawnHere(template, worldserver, position)) { + if(rand.nextInt(ModConfig.worldgen.structures.RunwayChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, -4, 0), placementsettings); + return true; + } + } return false; } + + public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) + { + int zwidth = template.getSize().getZ(); + int xwidth = template.getSize().getX(); + return posAboveGround.getY() > 10; + } } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/RunwayGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/RunwayGen.java deleted file mode 100644 index 2735812..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/RunwayGen.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Blocks; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class RunwayGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - WorldServer worldserver = (WorldServer) world; - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":runway")); - if(template == null||ModConfig.worldgen.structures.Runway==false) - return false; - Biome biome = world.getBiomeForCoordsBody(position); - if(RunwayGen.canSpawnHere(template, worldserver, position)) { - if(rand.nextInt(ModConfig.worldgen.structures.RunwayChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, -4, 0), placementsettings); - return true; - } - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - return posAboveGround.getY() > 10; - } - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 255; - boolean foundGround = false; - while(!foundGround) - { - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - foundGround = blockAt == Blocks.GRASS|| blockAt == Blocks.DIRT || blockAt == Blocks.SAND || blockAt == Blocks.SNOW ||blockAt == Blocks.MYCELIUM||blockAt==Blocks.STONE||blockAt==Blocks.WATER; - } - return y; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/SkyWheel.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/SkyWheel.java index b67bc08..cca7a58 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/SkyWheel.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/SkyWheel.java @@ -2,11 +2,26 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class SkyWheel extends WorldGenerator implements IWorldGenerator{ @@ -16,19 +31,31 @@ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGen IChunkProvider chunkProvider) { int blockX = chunkX * 16; int blockZ = chunkZ * 16; - if (world.provider.getDimension() == 0) - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { - BlockPos pos = new BlockPos(blockX, 200, blockZ); - WorldGenerator structure = new SkyWheelGen(); - structure.generate(world, rand, pos); + if (world.provider.getDimension() == 0){ + BlockPos pos = new BlockPos(blockX, 200, blockZ); + generate(world, rand, pos); + } } @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { + public boolean generate(World world, Random rand, BlockPos position) { + WorldServer worldserver = (WorldServer) world; + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":sky_wheel")); + if(template == null||ModConfig.worldgen.structures.SkyWheel==false) + return false; + Biome biome = world.getBiomeForCoordsBody(position); + if(rand.nextInt(ModConfig.worldgen.structures.SkyWheelChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); + return true; + } return false; } } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/SkyWheelGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/SkyWheelGen.java deleted file mode 100644 index 3b5fa19..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/SkyWheelGen.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class SkyWheelGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - WorldServer worldserver = (WorldServer) world; - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":sky_wheel")); - if(template == null||ModConfig.worldgen.structures.SkyWheel==false) - return false; - Biome biome = world.getBiomeForCoordsBody(position); - if(rand.nextInt(ModConfig.worldgen.structures.SkyWheelChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); - return true; - } - return false; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/TreasureChest.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/TreasureChest.java index ed85f9b..2e40135 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/TreasureChest.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/TreasureChest.java @@ -2,13 +2,27 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class TreasureChest extends WorldGenerator implements IWorldGenerator{ @@ -16,16 +30,12 @@ public class TreasureChest extends WorldGenerator implements IWorldGenerator{ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { int blockX = chunkX * 16; - int blockZ = chunkZ * 16; - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { + int blockZ = chunkZ * 16; int y = getGroundFromAbove(world, blockX, blockZ); BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new TreasureChestGen(); - structure.generate(world, rand, pos); + generate(world, rand, pos); } + public static int getGroundFromAbove(World world, int x, int z) { int y = 255; @@ -33,12 +43,30 @@ public static int getGroundFromAbove(World world, int x, int z) while(!foundGround && y-- >= 31) { Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - foundGround = blockAt == Blocks.STONE; + foundGround = blockAt == Blocks.GRASS; } - return y; + return y-2; } + @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { + public boolean generate(World world, Random rand, BlockPos position) { + WorldServer worldserver = (WorldServer) world; + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":treasure_chest")); + if(template == null||ModConfig.worldgen.structures.TreasureChest==false) + return false; + Biome biome = world.getBiomeForCoordsBody(position); + if(rand.nextInt(ModConfig.worldgen.structures.TreasureChestChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); + return true; + } return false; } } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/TreasureChestGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/TreasureChestGen.java deleted file mode 100644 index f3ebd80..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/TreasureChestGen.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class TreasureChestGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - WorldServer worldserver = (WorldServer) world; - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":treasure_chest")); - if(template == null||ModConfig.worldgen.structures.TreasureChest==false) - return false; - Biome biome = world.getBiomeForCoordsBody(position); - if(TreasureChestGen.canSpawnHere(template, worldserver, position)) { - if(rand.nextInt(ModConfig.worldgen.structures.TreasureChestChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, -30, 0), placementsettings); - return true; - } - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - return posAboveGround.getY() > 10; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/UndergroundVillage.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/UndergroundVillage.java index 7fe8116..4afaee8 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/UndergroundVillage.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/UndergroundVillage.java @@ -2,11 +2,26 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + +import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class UndergroundVillage extends WorldGenerator implements IWorldGenerator{ @@ -16,19 +31,35 @@ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGen IChunkProvider chunkProvider) { int blockX = chunkX * 16; int blockZ = chunkZ * 16; - if (world.provider.getDimension() == 0) - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { - BlockPos pos = new BlockPos(blockX, 20, blockZ); - WorldGenerator structure = new UndergroundVillageGen(); - structure.generate(world, rand, pos); + if (world.provider.getDimension() == 0) { + BlockPos pos = new BlockPos(blockX, 20, blockZ); + generate(world, rand, pos); + } } @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { + public boolean generate(World world, Random rand, BlockPos position) { + WorldServer worldserver = (WorldServer) world; + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":underground_village")); + Template filler = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":filler")); + if(template == null||ModConfig.worldgen.structures.UndergroundVillage==false) + return false; + Biome biome = world.getBiomeForCoordsBody(position); + if(rand.nextInt(ModConfig.worldgen.structures.UndergroundVillageChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + filler.getDataBlocks(position, placementsettings); + filler.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings,0); + + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings,0); + return true; + } return false; } } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/UndergroundVillageGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/UndergroundVillageGen.java deleted file mode 100644 index 013347f..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/UndergroundVillageGen.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class UndergroundVillageGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - WorldServer worldserver = (WorldServer) world; - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":underground_village")); - Template filler = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":filler")); - if(template == null||ModConfig.worldgen.structures.UndergroundVillage==false) - return false; - Biome biome = world.getBiomeForCoordsBody(position); - if(rand.nextInt(ModConfig.worldgen.structures.UndergroundVillageChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - filler.getDataBlocks(position, placementsettings); - filler.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings,0); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings,0); - return true; - } - return false; - } -} \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/WickerMan.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/WickerMan.java index 311fd51..0af39f4 100644 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/WickerMan.java +++ b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/WickerMan.java @@ -2,13 +2,28 @@ import java.util.Random; +import com.NetherNoah.ParadiseMod.Reference; +import com.NetherNoah.ParadiseMod.config.ModConfig; + import net.minecraft.block.Block; +import net.minecraft.block.state.IBlockState; +import net.minecraft.init.Biomes; import net.minecraft.init.Blocks; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.Mirror; +import net.minecraft.util.ResourceLocation; +import net.minecraft.util.Rotation; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; import net.minecraft.world.World; +import net.minecraft.world.WorldServer; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.gen.IChunkGenerator; import net.minecraft.world.gen.feature.WorldGenerator; +import net.minecraft.world.gen.structure.template.PlacementSettings; +import net.minecraft.world.gen.structure.template.Template; +import net.minecraft.world.gen.structure.template.TemplateManager; import net.minecraftforge.fml.common.IWorldGenerator; public class WickerMan extends WorldGenerator implements IWorldGenerator{ @@ -16,16 +31,12 @@ public class WickerMan extends WorldGenerator implements IWorldGenerator{ public void generate(Random rand, int chunkX, int chunkZ, World world, IChunkGenerator chunkGenerator, IChunkProvider chunkProvider) { int blockX = chunkX * 16; - int blockZ = chunkZ * 16; - generateOverworld(world, rand, blockX + 8, blockZ + 8); - } - private void generateOverworld(World world, Random rand, int blockX, int blockZ) - { + int blockZ = chunkZ * 16; int y = getGroundFromAbove(world, blockX, blockZ); BlockPos pos = new BlockPos(blockX, y, blockZ); - WorldGenerator structure = new WickerManGen(); - structure.generate(world, rand, pos); + generate(world, rand, pos); } + public static int getGroundFromAbove(World world, int x, int z) { int y = 255; @@ -37,8 +48,48 @@ public static int getGroundFromAbove(World world, int x, int z) } return y; } + @Override - public boolean generate(World worldIn, Random rand, BlockPos position) { + public boolean generate(World world, Random rand, BlockPos position) { + WorldServer worldserver = (WorldServer) world; + MinecraftServer minecraftserver = world.getMinecraftServer(); + TemplateManager templatemanager = worldserver.getStructureTemplateManager(); + Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":wicker_man")); + if (ModConfig.worldgen.structures.WickerMan==false||template == null) + return false; + Biome biome = world.getBiomeForCoordsBody(position); + if(biome == Biomes.FOREST || biome == Biomes.FOREST_HILLS|| biome == Biomes.BIRCH_FOREST_HILLS|| biome == Biomes.FOREST_HILLS) { + if(canSpawnHere(template, worldserver, position)) { + if(rand.nextInt(ModConfig.worldgen.structures.WickerManChance) == 0){ + IBlockState iblockstate = world.getBlockState(position); + world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); + PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) + .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) + .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); + template.getDataBlocks(position, placementsettings); + template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); + return true; + } + } + } + return false; + } + + public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) + { + int zwidth = template.getSize().getZ(); + int xwidth = template.getSize().getX(); + boolean corner1 = isCornerValid(world, posAboveGround); + boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); + return posAboveGround.getY() > 31 && corner1 && corner2; + } + + public static boolean isCornerValid(World world, BlockPos pos) + { + int variation = 3; + int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); + if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) + return true; return false; } } \ No newline at end of file diff --git a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/WickerManGen.java b/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/WickerManGen.java deleted file mode 100644 index d821685..0000000 --- a/src/main/java/com/NetherNoah/ParadiseMod/world/worldgen/structures/WickerManGen.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.NetherNoah.ParadiseMod.world.worldgen.structures; - -import java.util.Random; - -import com.NetherNoah.ParadiseMod.Reference; -import com.NetherNoah.ParadiseMod.config.ModConfig; - -import net.minecraft.block.Block; -import net.minecraft.block.state.IBlockState; -import net.minecraft.init.Biomes; -import net.minecraft.init.Blocks; -import net.minecraft.server.MinecraftServer; -import net.minecraft.util.Mirror; -import net.minecraft.util.ResourceLocation; -import net.minecraft.util.Rotation; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.ChunkPos; -import net.minecraft.world.World; -import net.minecraft.world.WorldServer; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.gen.feature.WorldGenerator; -import net.minecraft.world.gen.structure.template.PlacementSettings; -import net.minecraft.world.gen.structure.template.Template; -import net.minecraft.world.gen.structure.template.TemplateManager; - -public class WickerManGen extends WorldGenerator { - @Override - public boolean generate(World world, Random rand, BlockPos position) { - WorldServer worldserver = (WorldServer) world; - MinecraftServer minecraftserver = world.getMinecraftServer(); - TemplateManager templatemanager = worldserver.getStructureTemplateManager(); - Template template = templatemanager.getTemplate(minecraftserver, new ResourceLocation(Reference.MOD_ID+":wicker_man")); - if (ModConfig.worldgen.structures.WickerMan==false||template == null) - return false; - Biome biome = world.getBiomeForCoordsBody(position); - if(biome == Biomes.FOREST || biome == Biomes.FOREST_HILLS|| biome == Biomes.BIRCH_FOREST_HILLS|| biome == Biomes.FOREST_HILLS) { - if(WickerManGen.canSpawnHere(template, worldserver, position)) { - if(rand.nextInt(ModConfig.worldgen.structures.WickerManChance) == 0){ - IBlockState iblockstate = world.getBlockState(position); - world.notifyBlockUpdate(position, iblockstate, iblockstate, 3); - PlacementSettings placementsettings = (new PlacementSettings()).setMirror(Mirror.NONE) - .setRotation(Rotation.NONE).setIgnoreEntities(false).setChunk((ChunkPos) null) - .setReplacedBlock((Block) null).setIgnoreStructureBlock(false); - template.getDataBlocks(position, placementsettings); - template.addBlocksToWorld(world, position.add(0, 0, 0), placementsettings); - return true; - } - } - } - return false; - } - public static boolean canSpawnHere(Template template, World world, BlockPos posAboveGround) - { - int zwidth = template.getSize().getZ(); - int xwidth = template.getSize().getX(); - boolean corner1 = isCornerValid(world, posAboveGround); - boolean corner2 = isCornerValid(world, posAboveGround.add(xwidth, 0, zwidth)); - return posAboveGround.getY() > 31 && corner1 && corner2; - } - public static boolean isCornerValid(World world, BlockPos pos) - { - int variation = 3; - int highestBlock = getGroundFromAbove(world, pos.getX(), pos.getZ()); - if (highestBlock > pos.getY() - variation && highestBlock < pos.getY() + variation) - return true; - return false; - } - public static int getGroundFromAbove(World world, int x, int z) - { - int y = 255; - boolean foundGround = false; - while(!foundGround && y-- >= 31) - { - Block blockAt = world.getBlockState(new BlockPos(x,y,z)).getBlock(); - foundGround = blockAt == Blocks.GRASS || blockAt == Blocks.SAND || blockAt == Blocks.SNOW || blockAt == Blocks.SNOW_LAYER || blockAt == Blocks.GLASS||blockAt == Blocks.MYCELIUM; - } - return y; - } -} \ No newline at end of file diff --git a/src/main/resources/assets/minecraft/textures/blocks/ice.png b/src/main/resources/assets/minecraft/textures/blocks/ice.png deleted file mode 100644 index ac946e95d918ec043f288c5d8f4f1ed850f027c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`v7RoDAr-fhHR6BP+o{fAoS$;P zPKfu%|M@0oHP{rg)z}W}Bq+EU@3PtST7u(di@$LxvtX>DXQRiOq)C?<4H?fk^rfW~ xvIQ{<+zps?h+%fOM90-0Z&_yFVr4@KhAAy4MXsf8ybQF6!PC{xWt~$(69BwkFcts+ diff --git a/src/main/resources/assets/minecraft/textures/blocks/netherrack.png b/src/main/resources/assets/minecraft/textures/blocks/netherrack.png deleted file mode 100644 index 88129c4e58257b6862e50b33bc3f58b670a8cc2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 727 zcmV;|0x127P)NklMQq!J`>VG$KN z6h@0^5d`jP+p0~_qQB$xoiBg0xZL0G-gC}(zQ;93^YeJ;_v_jn9K_K^1oJKzeAU(H zt*X+so|y>?cekZQ&kn}N^~_io-sEI#_VuA8ElmMDCz0RRl9I4JGNSuTN(y3ir!j4} z;~*G>8Iuo2B)K{-4_7KG5)mhaP@a{ALJ?hQZ&!huoE%(lYJy9IwtPOA1&;?Em6a$= zP1TF{Vl65*UrkKlaLx~VQ4zY!%awS(q(mKkiN)|ZI~#$92ADr@S2fyJ{{!OrcZJw_;z!%9^7&|5j?I3qchsCwKc4Eb!i=T zu6i_bzNB>~Hy4I^5zIPJV63(lHi=9!J8?qO z93Iv*nCnHcJLPcTtN8VrZRq82yP9h8_NKbEy`Q5|+!4%xxVa?7 zt}7@&n&6q%@7E7u*dD9zk3?XS)@(K!5&;Or- z^_1zNwX_t0(i12WF^ZD-MhGNdmiO??=Z3Sm7%u6OQ{DyB`UinG*&?hOlnVd=002ov JPDHLkV1nUUNN4~6 diff --git a/src/main/resources/assets/minecraft/textures/blocks/stone.png b/src/main/resources/assets/minecraft/textures/blocks/stone.png deleted file mode 100644 index 87e19ff46b57f2bb86553459b2ebb2805ebbc55a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 223 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 diff --git a/src/main/resources/assets/nnparadisemod/structures/cacti/cactus_2.nbt b/src/main/resources/assets/nnparadisemod/structures/cacti/cactus_2.nbt deleted file mode 100644 index 891a17488842b391a0a8369e9812f3a417172cee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211 zcmV;^04)C>iwFP!000000DX^53&JoAhTmB~)(PTIQS{`+i+B`I-s6n3INQ-iL4Up5 z&?!R9AMhpj3q0!&xE9m**V)W@MC+DHJIo;XMXLF4~K{<s`UVIyc7PM&6K>@-?!DazS@P z7slvfET^81vZ(tlOHsy%CJjFR;3=hY4ZnryUtzpuaikiU9xsC4yub diff --git a/src/main/resources/assets/nnparadisemod/structures/cacti/shrub.nbt b/src/main/resources/assets/nnparadisemod/structures/cacti/shrub.nbt deleted file mode 100644 index 3fb82e8108491a30d5ce2b45611e2e2419b09bbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196 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 diff --git a/src/main/resources/assets/nnparadisemod/structures/ocean_village.nbt b/src/main/resources/assets/nnparadisemod/structures/ocean_village.nbt index 9ee1b52d1cd6cf3c503265f3dcdc33a07d352e0d..ce8b11b0f1293d164839dca968685e4c56da3ab8 100644 GIT binary patch literal 27035 zcmb_kc_5VQ_pgv7R4Q9h*DZA`My~9paxc1xN+sE*lqnU7v1A!bam&_j>~)oWNs{bT zsEkorCd-&2h8aw@8H}0vJ@1UQxat1B_YXJYecyTB=Q+^^na7r%md%+Yx&GuV~gL_`VJN z<;)*(E06yXY;?`|_s+Nt>x(o!N)vS3zDAwA`1fv6<-W6>&BiFBx}+*}&k!ZKsqShE zbEMg*riwmBZ)BvhBWUU*S1GApe+Swt_(y5`^XIp*rL)*#+t^)ps!a)W!|v#h+LRu) z`{xTmM#M~&mcQ+DU0kT;_-5zUT3SP4nlX~bE@q0i2)VoG%k@5Yp%y$#6>2L_%WA@- zJIZrkHoz>OqHNt|3(qkIX}#C1W4&xCbvftlqnq>H+jiNVH~&p;t6Ozfv^Bjs6V)9P zW*4iKi7v0HcxIB}R&Q@H8qvRJFq-kqs3(kd8u=`TdN_K6c~=_2SR?@DWWHm1eQtX1CViYdr)<6-3R)i4N#v4YIc z^6Z+lCNm_RRUL-@z#gsl7+iSnW!~pnTwww|W~h+93VvF%7ajzj7u(Q6Xw=Abyexq{ z64L$1EP>jrHiXGSKI?@uF&fT>M0eUAiGd>$q0}hNTt{|M!8vz!)lh6|qDjM+5$62slWiP+M^|sW% ziF9^0YynSuvRf=!RmYk<2v4GZ!QH05*3xN2aM!;X(chVjg;*IP+1=Lq>ZkxGWpoXZF^W(ehjwv*oT83m7bRxCBuCwZ=HQ7J!(t<~XQyKmW z%-SRSKQ=2=v&@|7Uf3a*uTnDlY=V&&p3Oee;g2fXMEv^f(U2WMyC`Q{ueMB2Y}c#a zj@vs`qQqjodV5*h^Bo=8mQ+{A=Ox zEoQ+-g1Q@ttQ<+nkgyl0$56!}HT>##eUiiRW72!v>cNygU$ zrZl25>5+yzY2_Dlt>;}rM$GVmZ5|`x8acFQ_L{lGlifrXGs?VZMRik?Hi{J^pQV2J zO)svG$=iY+%565ykF1~@d${8X8Kla?)FUd^M+isJZ9>$OiR~l!9jq-zW1ljMN1G`* z&B1+MY1$_F(qq0vkH(sG;>YK#X9{qW6zKv6qh+){XS?8OO=NMA_TalGLKZRfJr2Qs zfq7>sgZm8E=9Aiyc7z7gmLtf91+mp>eg5d0`d%8XH?4_&A=bQ~nF?oH-CIbrFY&6U z=J;vkXY}DzHWf0^Yy#ujZ$;LOY?dHh)TTjm8+CYHrF$NFdy3sJs%W^%7;~Sdz#*Z~37Y*TVXf=r#6*){t)^ zRMIAMRruj^@sV_(XiyHdkyIA&jYKf7&6#wS zhgj&@U;C_}8OyjLRXl?CBK0$_WS_+~7|YRmi<;$66lja0Kh?@GEBMnx6~Z@oeA@c5 zf`t{8cNUQGC{xj#!O#%QYNe%4s`~Z2u~oZ8(6mV%*9h94-8`KWrH` zT7@tasy+H7MHPnrNcp|BWGv5xS_mH@=PNvYp~o|@^}AqHddeg+Uysx>v;w;STzaoVXe@}f=|aKFji(77uTLX`=q7B zgHqRI(kSOq5BFrW(*;6bC5|;w@RD@t;&u}SiM#9Q|RoP;~0B z*Vu<(HPGd(4RFK_nHoCc=k#yF`lq z8NMxtW(13PR2-p-98USY=Llta5c5fMq9DQI_}WZ(zBQ60&5U8$^sG$??ZJB&_Gs7_ ze|g0COn=sUN##jckBVoLi#DU+__GD1+YantRX5@rAxEbo!)+;@r?sSq15G?S`!!

@(FtgnsEv8c=C9aS0bc=%X_n0jnn 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%0DLP%Wyy&iiOLB_6Wd^+2axB&f!O%Hi-rd#n@-)LK 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�>!pAT$^lp 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 diff --git a/src/main/resources/assets/nnparadisemod/structures/rose.nbt b/src/main/resources/assets/nnparadisemod/structures/rose.nbt deleted file mode 100644 index f5a1ef9e0914e984027aa86ffb61b548832ed3e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmb2|=3syTUtdGMLk0rIUeS{_Df~Ocz|EcH;`7G6+Tn`X%A(^8>)XXd6Hhkh-qd4k z_xaP!+t9eVlW$sc)mI&f2LUm+B20tof-k$z^s<+DvS^77S9g^*l2U4g9l3O3Z}kT<*@Jf9o>JA PE>Fo4}G~$$sCn-2n!3vEN(+C|Tv4m1@wkSF4r!M{zWE-LK z=}9IiXjpo(WWS&P41mK*{U^5os+yv!njLzM=FPLBhQoRn(sR#Ar4JusJijotN>j@b|yGQVu>&Wy0M{l8K+m=#52viY?sY1G=a3 S%FUnlx%34lRYsUn0RR9^MQa%V diff --git a/src/main/resources/assets/nnparadisemod/structures/trees/dark_oak_sapling.nbt b/src/main/resources/assets/nnparadisemod/structures/trees/dark_oak_sapling.nbt deleted file mode 100644 index de6cbeb88a70128f765c1a48aa1c7ec430dcc69f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 248 zcmV?dupma%i4`5?8mzc+WFJD| z*W(}(B514jBoDUVd&8B0#XPxB)&Tl58;*tHMw~cK=*MF5;={U5Wxf~--G($s<7gB~ zNchK?GU^Cs7KZ z66Gp}mSewRlienKbSO6D6K8$?NL$9m)-}A2w2|8?QcCz|2~`ZW%z|`n7GEjW&w=VO yarK)>)Oy!c`y$sTMlK&htoWXUo;W5K8Vx&gKyjD%b3Xb0e)<9it094M0ssKQu5$bU diff --git a/src/main/resources/assets/nnparadisemod/structures/trees/jungle_sapling.nbt b/src/main/resources/assets/nnparadisemod/structures/trees/jungle_sapling.nbt deleted file mode 100644 index c265bd97a7eac5475d1396c6ecf869daddaf0e88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 217 zcmV;~04Dz*iwFP!000000A-IcPXjRwh2L?#<8lnZKk3BKr3+$2ow}RK4S_U?Vpr(; z>zh=iMa7b3$$sCnJpu+ZaR+Vz)ND%L)oL(sP^XRsH4OR>A2;7JR)s;EqWnUaXwiw1 z@|n2RG&hlp@X~ek7F>$V!422ExXF|6nFI@21JM9>c zI~RD9X{!sHNd*5WCCg~$1<)xm`mcSk{%Y`iH4sYP1zRkh-eR`=N=j?a;$moFE;^uF TmR}zJj8Cm2x$zx2Qvm<~&wFBP diff --git a/src/main/resources/assets/nnparadisemod/structures/trees/oak_sapling.nbt b/src/main/resources/assets/nnparadisemod/structures/trees/oak_sapling.nbt deleted file mode 100644 index 57e5e8427efeeee73026f1267430383ed0ec65c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 214 zcmV;{04e_;iwFP!000000A zK7A7e*NR%QB02x3#64g!6Zg#qK<%dVLp?1z4(imgpq9n_)5qOW`kJsXDas8^WzdR} z@>Setn!8Mc4s-g_L(J&5o<`2=mBk{FXH~wu)T7_#m^jy;bj5~v9?|Z}3l~0nrxWAp zBr`vg(Ho2U6kE8H4(OiB SFE@Y2$JRFnBFh_70RR9o>s*5X diff --git a/src/main/resources/assets/nnparadisemod/structures/underground_village.nbt b/src/main/resources/assets/nnparadisemod/structures/underground_village.nbt index 0e9952a15edbe4960dc44d0f9d0ad8cc7b119ea1..e57322e1d0feb5082be06fc826835bb97d0ef137 100644 GIT binary patch literal 37537 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 G>Hh#M9^XU& literal 37037 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 diff --git a/src/main/resources/assets/nnparadisemod/textures/blocks/bulletproof_glass.png b/src/main/resources/assets/nnparadisemod/textures/blocks/bulletproof_glass.png new file mode 100644 index 0000000000000000000000000000000000000000..ae168b5b3c0a2d44e7248015e4fdee85a99214a6 GIT binary patch literal 1556 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