Improvements to various biomes, removed koru and desert sprouts, removed lava lakes from the redwood forest and wasteland, added advancements

This commit is contained in:
Forstride 2019-01-05 00:55:05 -05:00
parent 130ba3e77b
commit f146efb1ee
43 changed files with 1170 additions and 734 deletions

View File

@ -12,7 +12,7 @@ import net.minecraft.util.IStringSerializable;
public enum BOPFoliage implements IStringSerializable, IPagedVariants
{
SHORTGRASS, BUSH, BERRYBUSH, KORU, DEVILWEED, DUNEGRASS, DESERTSPROUTS, DESERTGRASS, DEADGRASS, SPECTRALFERN, BARLEY;
SHORTGRASS, BUSH, BERRYBUSH, BARLEY, DUNEGRASS, DESERTGRASS, DEADGRASS, DEVILWEED, SPECTRALFERN;
@Override
public String getName() {

View File

@ -10,9 +10,7 @@ package biomesoplenty.common.biome.overworld;
import java.util.Random;
import biomesoplenty.api.biome.BOPBiomes;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.api.block.IBlockPosQuery;
import biomesoplenty.api.enums.BOPClimates;
import biomesoplenty.api.enums.BOPFoliage;
@ -22,17 +20,20 @@ import biomesoplenty.api.enums.BOPWoods;
import biomesoplenty.api.generation.GeneratorStage;
import biomesoplenty.common.block.BlockBOPCoral;
import biomesoplenty.common.block.BlockBOPDoublePlant;
import biomesoplenty.common.block.BlockBOPLeaves;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.util.block.BlockQuery;
import biomesoplenty.common.world.generator.GeneratorColumns;
import biomesoplenty.common.world.generator.GeneratorDoubleFlora;
import biomesoplenty.common.world.generator.GeneratorFlora;
import biomesoplenty.common.world.generator.GeneratorGrass;
import biomesoplenty.common.world.generator.GeneratorSplatter;
import biomesoplenty.common.world.generator.GeneratorWaterside;
import biomesoplenty.common.world.generator.GeneratorWeighted;
import biomesoplenty.common.world.generator.tree.GeneratorBasicTree;
import biomesoplenty.common.world.generator.tree.GeneratorBayouTree;
import biomesoplenty.common.world.generator.tree.GeneratorBigTree;
import net.minecraft.block.BlockDoublePlant;
import net.minecraft.block.BlockOldLeaf;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.entity.monster.EntitySlime;
import net.minecraft.init.Blocks;
@ -45,7 +46,7 @@ public class BiomeGenBayou extends BOPOverworldBiome
public BiomeGenBayou()
{
super("bayou", new PropsBuilder("Bayou").withGuiColour(0x7DAD51).withTemperature(0.95F).withRainfall(0.9F).withWaterColor(0xFFD932));
super("bayou", new PropsBuilder("Bayou").withGuiColour(0x7DAD51).withTemperature(0.95F).withRainfall(0.9F).withWaterColor(0xB7FF32));
// terrain
this.terrainSettings.avgHeight(62).heightVariation(6, 3).octaves(1, 1, 1, 1, 0, 0).sidewaysNoise(0.0F);
@ -69,10 +70,11 @@ public class BiomeGenBayou extends BOPOverworldBiome
this.addGenerator("mud_splatter", GeneratorStage.SAND, (new GeneratorSplatter.Builder()).amountPerChunk(0.2F).replace(emptyGrassOrDirt).with(BOPBlocks.mud.getDefaultState()).create());
// trees & logs
GeneratorWeighted treeGenerator = new GeneratorWeighted(8);
GeneratorWeighted treeGenerator = new GeneratorWeighted(8.0F);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("willow", 3, (new GeneratorBayouTree.Builder()).log(BOPWoods.WILLOW).leaves(BOPTrees.WILLOW).minHeight(6).maxHeight(12).minLeavesRadius(1).leavesGradient(2).create());
treeGenerator.add("willow_large", 1, (new GeneratorBayouTree.Builder()).log(BOPWoods.WILLOW).leaves(BOPTrees.WILLOW).minHeight(10).maxHeight(18).minLeavesRadius(2).leavesGradient(3).create());
treeGenerator.add("willow", 4, (new GeneratorBasicTree.Builder()).log(BOPWoods.WILLOW).leaves(BlockBOPLeaves.paging.getVariantState(BOPTrees.WILLOW).withProperty(BlockOldLeaf.CHECK_DECAY, Boolean.valueOf(false))).minHeight(6).maxHeight(12).maxLeavesRadius(1).vine(BOPBlocks.willow_vine.getDefaultState()).leavesOffset(0).create());
treeGenerator.add("willow_decaying", 2, (new GeneratorBigTree.Builder()).log(BOPWoods.WILLOW).leaves(BlockBOPLeaves.paging.getVariantState(BOPTrees.WILLOW).withProperty(BlockOldLeaf.CHECK_DECAY, Boolean.valueOf(false))).foliageHeight(1).maxHeight(16).create());
treeGenerator.add("cypress", 3, (new GeneratorBayouTree.Builder()).log(BOPWoods.WILLOW).leaves(BlockBOPLeaves.paging.getVariantState(BOPTrees.WILLOW).withProperty(BlockOldLeaf.CHECK_DECAY, Boolean.valueOf(false))).minHeight(12).maxHeight(20).maxLeavesRadius(1).vine(BOPBlocks.willow_vine.getDefaultState()).leavesOffset(0).create());
// grasses
GeneratorWeighted grassGenerator = new GeneratorWeighted(2.0F);
@ -80,17 +82,17 @@ public class BiomeGenBayou extends BOPOverworldBiome
grassGenerator.add("shortgrass", 1, (new GeneratorGrass.Builder()).with(BOPFoliage.SHORTGRASS).create());
grassGenerator.add("tallgrass", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
grassGenerator.add("doublegrass", 1, (new GeneratorDoubleFlora.Builder()).with(BlockDoublePlant.EnumPlantType.GRASS).create());
grassGenerator.add("fern", 2, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.FERN).create());
// other plants
this.addGenerator("koru", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.3F).with(BOPFoliage.KORU).create());
this.addGenerator("cattail", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(6.0F).with(BOPPlants.CATTAIL).create());
this.addGenerator("double_cattail", GeneratorStage.FLOWERS, (new GeneratorDoubleFlora.Builder()).amountPerChunk(8.0F).with(BlockBOPDoublePlant.DoublePlantType.TALL_CATTAIL).create());
this.addGenerator("sugar_cane", GeneratorStage.FLOWERS,(new GeneratorColumns.Builder()).amountPerChunk(3.0F).generationAttempts(24).placeOn(BlockQueries.litFertileWaterside).with(Blocks.REEDS.getDefaultState()).minHeight(1).maxHeight(3).create());
this.addGenerator("cattail", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.CATTAIL).create());
this.addGenerator("double_cattail", GeneratorStage.FLOWERS, (new GeneratorDoubleFlora.Builder()).amountPerChunk(0.5F).with(BlockBOPDoublePlant.DoublePlantType.TALL_CATTAIL).create());
this.addGenerator("double_fern", GeneratorStage.FLOWERS, (new GeneratorDoubleFlora.Builder()).amountPerChunk(0.75F).with(BlockDoublePlant.EnumPlantType.FERN).create());
// water plants
this.addGenerator("lily", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(2.5F).with(Blocks.WATERLILY.getDefaultState()).create());
this.addGenerator("lily", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(2.0F).with(Blocks.WATERLILY.getDefaultState()).create());
this.addGenerator("algae", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(4.0F).replace(Blocks.WATER).with(BOPBlocks.coral.getDefaultState().withProperty(BlockBOPCoral.VARIANT, BlockBOPCoral.CoralType.ALGAE)).scatterYMethod(ScatterYMethod.AT_GROUND).create());
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.8F).with(BOPPlants.REED).generationAttempts(32).create());
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.75F).with(BOPPlants.REED).generationAttempts(32).create());
this.addGenerator("watergrass", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(2.0F).with(BOPPlants.WATERGRASS).generationAttempts(32).create());
// shrooms
@ -114,12 +116,12 @@ public class BiomeGenBayou extends BOPOverworldBiome
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return getModdedBiomeGrassColor(0x7DAD51);
return getModdedBiomeGrassColor(0x6FAA50);
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return getModdedBiomeFoliageColor(0x9DDD66);
return getModdedBiomeFoliageColor(0x8BDB67);
}
}

View File

@ -94,7 +94,6 @@ public class BiomeGenBog extends BOPOverworldBiome
grassGenerator.add("tallgrass", 1, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
// other plants
this.addGenerator("koru", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPFoliage.KORU).create());
this.addGenerator("bushes", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(3.0F).with(BOPFoliage.BUSH).create());
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).placeOn(BlockQueries.fertile).with(BlockBOPFlatPlant.PlantType.LEAFPILE).create());
this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).placeOn(BlockQueries.fertile).with(BlockBOPFlatPlant.PlantType.DEADLEAFPILE).create());

View File

@ -56,7 +56,7 @@ public class BiomeGenBrushland extends BOPOverworldBiome
this.addGenerator("sand", GeneratorStage.SAND_PASS2, (new GeneratorWaterside.Builder()).amountPerChunk(4).maxRadius(7).with(Blocks.SAND.getDefaultState()).create());
// trees & logs
GeneratorWeighted treeGenerator = new GeneratorWeighted(2.5F);
GeneratorWeighted treeGenerator = new GeneratorWeighted(3.5F);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("dead_tree", 1, (new GeneratorBigTree.Builder()).minHeight(7).maxHeight(12).foliageHeight(0).foliageDensity(0.5D).log(BOPWoods.DEAD).leaves(Blocks.AIR.getDefaultState()).create());
treeGenerator.add("brush_twiglet", 18, (new GeneratorTwigletTree.Builder()).minHeight(1).maxHeight(4).log(BlockPlanks.EnumType.ACACIA).leaves(BOPTrees.DEAD).create());
@ -72,7 +72,6 @@ public class BiomeGenBrushland extends BOPOverworldBiome
this.addGenerator("cacti", GeneratorStage.FLOWERS,(new GeneratorColumns.Builder()).amountPerChunk(0.2F).generationAttempts(24).placeOn(this.topBlock).with(Blocks.CACTUS.getDefaultState()).minHeight(1).maxHeight(2).create());
this.addGenerator("tiny_cacti", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.4F).with(BOPPlants.TINYCACTUS).create());
this.addGenerator("desertgrass", GeneratorStage.GRASS, (new GeneratorGrass.Builder()).amountPerChunk(2.0F).with(BOPFoliage.DESERTGRASS).generationAttempts(8).create());
this.addGenerator("desert_sprouts", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.25F).with(BOPFoliage.DESERTSPROUTS).generationAttempts(8).create());
this.addGenerator("thorns", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.0F).with(BOPPlants.THORN).create());
this.addGenerator("dead_bushes", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(1.75F).with(Blocks.DEADBUSH.getDefaultState()).create());
}

View File

@ -65,7 +65,7 @@ public class BiomeGenCherryBlossomGrove extends BOPOverworldBiome
treeGenerator.add("pink_cherry", 2, (new GeneratorBasicTree.Builder()).log(BOPWoods.CHERRY).leaves(BOPTrees.PINK_CHERRY).create());
treeGenerator.add("white_cherry", 1, (new GeneratorBasicTree.Builder()).log(BOPWoods.CHERRY).leaves(BOPTrees.WHITE_CHERRY).create());
treeGenerator.add("large_pink_cherry", 4, (new GeneratorBigTree.Builder()).log(BOPWoods.CHERRY).leaves(BOPTrees.PINK_CHERRY).create());
treeGenerator.add("large_white_cherry", 3, (new GeneratorBigTree.Builder()).log(BOPWoods.CHERRY).leaves(BOPTrees.WHITE_CHERRY).create());
treeGenerator.add("large_white_cherry", 2, (new GeneratorBigTree.Builder()).log(BOPWoods.CHERRY).leaves(BOPTrees.WHITE_CHERRY).create());
// other plants
this.addGenerator("flax", GeneratorStage.FLOWERS,(new GeneratorDoubleFlora.Builder()).amountPerChunk(0.2F).with(BlockBOPDoublePlant.DoublePlantType.FLAX).generationAttempts(6).create());

View File

@ -66,9 +66,6 @@ public class BiomeGenDeadSwamp extends BOPOverworldBiome
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("dying_tree", 3, (new GeneratorBigTree.Builder()).minHeight(5).maxHeight(12).foliageHeight(1).log(BOPWoods.DEAD).leaves(BOPTrees.DEAD).create());
treeGenerator.add("dead_tree", 1, (new GeneratorBigTree.Builder()).minHeight(5).maxHeight(12).foliageHeight(0).foliageDensity(0.5D).log(BOPWoods.DEAD).leaves(Blocks.AIR.getDefaultState()).create());
// other plants
this.addGenerator("koru", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPFoliage.KORU).create());
// water plants
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.REED).generationAttempts(32).create());

View File

@ -82,7 +82,6 @@ public class BiomeGenFen extends BOPOverworldBiome
// other plants
this.addGenerator("cattail", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.25F).with(BOPPlants.CATTAIL).create());
this.addGenerator("double_cattail", GeneratorStage.FLOWERS,(new GeneratorDoubleFlora.Builder()).amountPerChunk(0.25F).with(BlockBOPDoublePlant.DoublePlantType.TALL_CATTAIL).create());
this.addGenerator("koru", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPFoliage.KORU).create());
this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.5F).placeOn(BlockQueries.fertile).with(BlockBOPFlatPlant.PlantType.DEADLEAFPILE).generationAttempts(64).create());
// water plants

View File

@ -11,6 +11,7 @@ package biomesoplenty.common.biome.overworld;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.api.enums.BOPClimates;
import biomesoplenty.api.enums.BOPFoliage;
import biomesoplenty.api.enums.BOPTrees;
import biomesoplenty.api.generation.GeneratorStage;
import biomesoplenty.common.block.BlockBOPFlatPlant;
import biomesoplenty.common.world.generator.GeneratorDoubleFlora;
@ -49,7 +50,7 @@ public class BiomeGenGrove extends BOPOverworldBiome
// trees
GeneratorWeighted treeGenerator = new GeneratorWeighted(3.5F);
this.addGenerator("trees", GeneratorStage.TREE, treeGenerator);
treeGenerator.add("oak_tree", 1, (new GeneratorBigTree.Builder()).minHeight(11).maxHeight(15).foliageHeight(2).create());
treeGenerator.add("oak_tree", 1, (new GeneratorBigTree.Builder()).minHeight(11).maxHeight(15).altLeaves(BOPTrees.FLOWERING).foliageHeight(2).create());
treeGenerator.add("dark_poplar", 5, (new GeneratorProfileTree.Builder()).minHeight(9).maxHeight(15).log(BlockPlanks.EnumType.DARK_OAK).leaves(BlockPlanks.EnumType.DARK_OAK).profile(GeneratorProfileTree.TreeProfile.POPLAR).create());
treeGenerator.add("poplar", 5, (new GeneratorProfileTree.Builder()).minHeight(9).maxHeight(18).log(BlockPlanks.EnumType.BIRCH).leaves(BlockPlanks.EnumType.BIRCH).profile(GeneratorProfileTree.TreeProfile.POPLAR).create());
treeGenerator.add("bush", 8, (new GeneratorBush.Builder()).maxHeight(2).create());

View File

@ -77,7 +77,6 @@ public class BiomeGenHighlandMoor extends BOPOverworldBiome
this.addGenerator("red_mushrooms", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.3F).generationAttempts(16).with(Blocks.RED_MUSHROOM.getDefaultState()).create());
// other plants
this.addGenerator("koru", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.7F).with(BOPFoliage.KORU).create());
this.addGenerator("flax", GeneratorStage.FLOWERS,(new GeneratorDoubleFlora.Builder()).amountPerChunk(0.75F).with(BlockBOPDoublePlant.DoublePlantType.FLAX).generationAttempts(6).create());
this.addGenerator("algae", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(5.0F).replace(Blocks.WATER).with(BOPBlocks.coral.getDefaultState().withProperty(BlockBOPCoral.VARIANT, BlockBOPCoral.CoralType.ALGAE)).scatterYMethod(ScatterYMethod.AT_GROUND).create());

View File

@ -86,7 +86,6 @@ public class BiomeGenLushSwamp extends BOPOverworldBiome
flowerGenerator.add("poppy", 1, (new GeneratorFlora.Builder().with(BlockFlower.EnumFlowerType.POPPY).create()));
// other plants
this.addGenerator("koru", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.3F).with(BOPFoliage.KORU).create());
this.addGenerator("cattail", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BOPPlants.CATTAIL).create());
this.addGenerator("double_cattail", GeneratorStage.FLOWERS, (new GeneratorDoubleFlora.Builder()).amountPerChunk(0.1F).with(BlockBOPDoublePlant.DoublePlantType.TALL_CATTAIL).create());
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).placeOn(BlockQueries.fertile).with(BlockBOPFlatPlant.PlantType.LEAFPILE).create());

View File

@ -70,6 +70,6 @@ public class BiomeGenMapleWoods extends BOPOverworldBiome
this.addGenerator("dead_leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(3.0F).placeOn(BlockQueries.fertile).with(BlockBOPFlatPlant.PlantType.DEADLEAFPILE).create());
// water plants
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(2.0F).with(BOPPlants.REED).generationAttempts(32).create());
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(1.5F).with(BOPPlants.REED).generationAttempts(32).create());
}
}

View File

@ -83,9 +83,6 @@ public class BiomeGenMire extends BOPOverworldBiome
grassGenerator.add("shortgrass", 5, (new GeneratorGrass.Builder()).with(BOPFoliage.SHORTGRASS).create());
grassGenerator.add("tallgrass", 1, (new GeneratorGrass.Builder()).with(BlockTallGrass.EnumType.GRASS).create());
// other plants
this.addGenerator("koru", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.3F).with(BOPFoliage.KORU).create());
// water plants
this.addGenerator("algae", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.1F).replace(Blocks.WATER).with(BOPBlocks.coral.getDefaultState().withProperty(BlockBOPCoral.VARIANT, BlockBOPCoral.CoralType.ALGAE)).scatterYMethod(ScatterYMethod.AT_GROUND).create());
this.addGenerator("water_reeds", GeneratorStage.LILYPAD, (new GeneratorFlora.Builder()).amountPerChunk(0.5F).with(BOPPlants.REED).generationAttempts(32).create());

View File

@ -59,7 +59,6 @@ public class BiomeGenOasis extends BOPOverworldBiome
// other plants
this.addGenerator("dunegrass", GeneratorStage.GRASS, (new GeneratorGrass.Builder()).amountPerChunk(10.0F).with(BOPFoliage.DUNEGRASS).placeOn(BlockQueries.litDry).generationAttempts(8).create());
this.addGenerator("desert_sprouts", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(5.0F).with(BOPFoliage.DESERTSPROUTS).generationAttempts(8).create());
this.addGenerator("desertgrass", GeneratorStage.GRASS, (new GeneratorGrass.Builder()).amountPerChunk(1.0F).with(BOPFoliage.DESERTGRASS).generationAttempts(8).create());
this.addGenerator("tiny_cacti", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(0.2F).with(BOPPlants.TINYCACTUS).generationAttempts(8).create());
this.addGenerator("sugar_cane", GeneratorStage.FLOWERS,(new GeneratorColumns.Builder()).amountPerChunk(2.0F).generationAttempts(24).placeOn(BlockQueries.litDryWaterside).with(Blocks.REEDS.getDefaultState()).minHeight(1).maxHeight(3).create());

View File

@ -1,11 +1,9 @@
package biomesoplenty.common.biome.overworld;
import biomesoplenty.api.biome.BOPBiomes;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.api.enums.BOPClimates;
import biomesoplenty.api.enums.BOPFlowers;
import biomesoplenty.api.enums.BOPFoliage;
import biomesoplenty.api.enums.BOPPlants;
import biomesoplenty.api.enums.BOPTrees;
import biomesoplenty.api.enums.BOPWoods;
import biomesoplenty.api.generation.GeneratorStage;
@ -25,12 +23,13 @@ import net.minecraft.block.BlockOldLeaf;
import net.minecraft.block.BlockPlanks;
import net.minecraft.block.BlockTallGrass;
import net.minecraft.init.Blocks;
import net.minecraft.util.math.BlockPos;
public class BiomeGenRainforest extends BOPOverworldBiome
{
public BiomeGenRainforest()
{
super("rainforest", new PropsBuilder("Rainforest").withGuiColour(0x14E26F).withTemperature(0.85F).withRainfall(1.2F));
super("rainforest", new PropsBuilder("Rainforest").withGuiColour(0x14E26F).withTemperature(0.85F).withRainfall(1.5F));
// terrain
this.terrainSettings.avgHeight(75).heightVariation(45, 60).sidewaysNoise(0.3D);
@ -79,4 +78,16 @@ public class BiomeGenRainforest extends BOPOverworldBiome
// gem
this.addGenerator("emerald", GeneratorStage.SAND, (new GeneratorOreSingle.Builder()).amountPerChunk(12).with(Blocks.EMERALD_ORE.getDefaultState()).create());
}
@Override
public int getGrassColorAtPos(BlockPos pos)
{
return getModdedBiomeGrassColor(0x21D357);
}
@Override
public int getFoliageColorAtPos(BlockPos pos)
{
return getModdedBiomeFoliageColor(0x1DE064);
}
}

View File

@ -72,9 +72,6 @@ public class BiomeGenWasteland extends BOPOverworldBiome
GeneratorWeighted flowerGenerator = new GeneratorWeighted(0.05F);
this.addGenerator("flowers", GeneratorStage.FLOWERS, flowerGenerator);
flowerGenerator.add("wilted_lily", 1, (new GeneratorFlora.Builder()).with(BOPFlowers.WILTED_LILY).create());
// lakes
this.addGenerator("lakes", GeneratorStage.SAND, (new GeneratorLakes.Builder()).amountPerChunk(0.05F).waterLakeForBiome(this).create());
}
@Override

View File

@ -88,7 +88,6 @@ public class BiomeGenWetland extends BOPOverworldBiome
flowerGenerator.add("poppy", 1, (new GeneratorFlora.Builder().with(BlockFlower.EnumFlowerType.POPPY).create()));
// other plants
this.addGenerator("koru", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.3F).with(BOPFoliage.KORU).create());
this.addGenerator("cattail", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(8.0F).with(BOPPlants.CATTAIL).create());
this.addGenerator("double_cattail", GeneratorStage.FLOWERS, (new GeneratorDoubleFlora.Builder()).amountPerChunk(10.0F).with(BlockBOPDoublePlant.DoublePlantType.TALL_CATTAIL).create());
this.addGenerator("leaf_piles", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.5F).placeOn(BlockQueries.fertile).with(BlockBOPFlatPlant.PlantType.LEAFPILE).create());

View File

@ -78,9 +78,8 @@ public class BiomeGenXericShrubland extends BOPOverworldBiome
flowerGenerator.add("wildflower", 4, (new GeneratorFlora.Builder()).with(BOPFlowers.WILDFLOWER).create());
// other plants
this.addGenerator("dunegrass", GeneratorStage.GRASS, (new GeneratorGrass.Builder()).amountPerChunk(10.0F).with(BOPFoliage.DUNEGRASS).placeOn(this.topBlock).generationAttempts(8).create());
this.addGenerator("dunegrass", GeneratorStage.GRASS, (new GeneratorGrass.Builder()).amountPerChunk(12.5F).with(BOPFoliage.DUNEGRASS).placeOn(this.topBlock).generationAttempts(8).create());
this.addGenerator("desertgrass", GeneratorStage.GRASS, (new GeneratorGrass.Builder()).amountPerChunk(2.0F).with(BOPFoliage.DESERTGRASS).generationAttempts(8).create());
this.addGenerator("desert_sprouts", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(4.0F).with(BOPFoliage.DESERTSPROUTS).generationAttempts(8).create());
this.addGenerator("dead_bushes", GeneratorStage.FLOWERS, (new GeneratorFlora.Builder()).amountPerChunk(0.75F).with(Blocks.DEADBUSH.getDefaultState()).create());
}

View File

@ -14,7 +14,6 @@ public class BiomeExtMesa extends ExtendedBiomeWrapper
super(Biomes.MESA);
// other plants
this.addGenerator("desertgrass", GeneratorStage.GRASS, (new GeneratorGrass.Builder()).amountPerChunk(0.3F).with(BOPFoliage.DESERTGRASS).generationAttempts(8).create());
this.addGenerator("tiny_cacti", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.TINYCACTUS).generationAttempts(16).create());
this.addGenerator("desertgrass", GeneratorStage.GRASS, (new GeneratorGrass.Builder()).amountPerChunk(0.3F).with(BOPFoliage.DESERTGRASS).generationAttempts(8).create());
}
}

View File

@ -14,7 +14,6 @@ public class BiomeExtMesaPlateau extends ExtendedBiomeWrapper
super(Biomes.MESA_CLEAR_ROCK);
// other plants
this.addGenerator("desertgrass", GeneratorStage.GRASS, (new GeneratorGrass.Builder()).amountPerChunk(0.3F).with(BOPFoliage.DESERTGRASS).generationAttempts(8).create());
this.addGenerator("tiny_cacti", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(0.1F).with(BOPPlants.TINYCACTUS).generationAttempts(16).create());
this.addGenerator("desertgrass", GeneratorStage.GRASS, (new GeneratorGrass.Builder()).amountPerChunk(0.3F).with(BOPFoliage.DESERTGRASS).generationAttempts(8).create());
}
}

View File

@ -43,7 +43,6 @@ public class BiomeExtSwampland extends ExtendedBiomeWrapper
// other plants
this.addGenerator("cattail", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(6.0F).with(BOPPlants.CATTAIL).create());
this.addGenerator("double_cattail", GeneratorStage.FLOWERS,(new GeneratorDoubleFlora.Builder()).amountPerChunk(8.0F).with(BlockBOPDoublePlant.DoublePlantType.TALL_CATTAIL).create());
this.addGenerator("koru", GeneratorStage.FLOWERS,(new GeneratorFlora.Builder()).amountPerChunk(1.2F).with(BOPFoliage.KORU).create());
// shrooms
this.addGenerator("toadstools", GeneratorStage.SHROOM,(new GeneratorFlora.Builder()).amountPerChunk(0.4F).generationAttempts(16).with(BlockBOPMushroom.MushroomType.TOADSTOOL).create());

View File

@ -111,7 +111,7 @@ public class BlockBOPFoliage extends BlockBOPDecoration implements IShearable, I
{
case BUSH: case BERRYBUSH:
return ColoringType.LIKE_LEAVES;
case SHORTGRASS: case KORU: case DEVILWEED:
case SHORTGRASS: case DEVILWEED:
return ColoringType.LIKE_GRASS;
default:
return ColoringType.PLAIN;
@ -254,7 +254,7 @@ public class BlockBOPFoliage extends BlockBOPDecoration implements IShearable, I
BOPFoliage plant = (BOPFoliage) state.getValue(this.variantProperty);
switch (plant)
{
case SHORTGRASS: case DESERTGRASS: case DESERTSPROUTS:
case SHORTGRASS: case DESERTGRASS:
return new AxisAlignedBB(0.09999999403953552D, 0.0D, 0.09999999403953552D, 0.8999999761581421D, 0.4000000357627869D, 0.8999999761581421D);
default:
return new AxisAlignedBB(0.09999999403953552D, 0.0D, 0.09999999403953552D, 0.8999999761581421D, 0.800000011920929D, 0.8999999761581421D);
@ -271,8 +271,6 @@ public class BlockBOPFoliage extends BlockBOPDecoration implements IShearable, I
{
case DEADGRASS: case DESERTGRASS:
return BlockQueries.litDry.matches(world, pos.down()) || BlockQueries.sustainsNether.matches(world, pos.down());
case DESERTSPROUTS:
return BlockQueries.litDry.matches(world, pos.down()) || BlockQueries.litFertile.matches(world, pos.down());
case DUNEGRASS:
return BlockQueries.litSand.matches(world, pos.down());
case SPECTRALFERN:

View File

@ -18,7 +18,6 @@ import biomesoplenty.common.item.ItemBOPSapling;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.util.block.VariantPagingHelper;
import biomesoplenty.common.world.generator.tree.GeneratorBasicTree;
import biomesoplenty.common.world.generator.tree.GeneratorBigTree;
import biomesoplenty.common.world.generator.tree.GeneratorMahoganyTree;
import biomesoplenty.common.world.generator.tree.GeneratorPalmTree;
import biomesoplenty.common.world.generator.tree.GeneratorRedwoodTree;
@ -203,7 +202,7 @@ public class BlockBOPSapling extends BlockBOPDecoration implements IGrowable, IP
case PALM:
return new GeneratorPalmTree.Builder().log(BOPWoods.PALM).leaves(BlockBOPLeaves.paging.getVariantState(BOPTrees.PALM).withProperty(BlockOldLeaf.DECAYABLE, Boolean.valueOf(false))).updateNeighbours(true).create();
case REDWOOD:
return new GeneratorRedwoodTree.Builder().create();
return new GeneratorRedwoodTree.Builder().log(BOPWoods.REDWOOD).leaves(BOPTrees.REDWOOD).minHeight(10).maxHeight(30).trunkWidth(1).create();
case WILLOW:
return new GeneratorBasicTree.Builder().log(BOPWoods.WILLOW).leaves(BlockBOPLeaves.paging.getVariantState(BOPTrees.WILLOW).withProperty(BlockOldLeaf.CHECK_DECAY, Boolean.valueOf(false))).minHeight(8).maxHeight(12).maxLeavesRadius(2).vine(BOPBlocks.willow_vine.getDefaultState()).leavesOffset(0).updateNeighbours(true).create();
case MAHOGANY:

View File

@ -36,10 +36,8 @@ import biomesoplenty.common.world.generator.tree.GeneratorBush;
import biomesoplenty.common.world.generator.tree.GeneratorMahoganyTree;
import biomesoplenty.common.world.generator.tree.GeneratorMegaJungleTree;
import biomesoplenty.common.world.generator.tree.GeneratorPalmTree;
import biomesoplenty.common.world.generator.tree.GeneratorPineTree;
import biomesoplenty.common.world.generator.tree.GeneratorProfileTree;
import biomesoplenty.common.world.generator.tree.GeneratorRedwoodTree;
import biomesoplenty.common.world.generator.tree.GeneratorRedwoodTreeThin;
import biomesoplenty.common.world.generator.tree.GeneratorTaigaTree;
import biomesoplenty.common.world.generator.tree.GeneratorTwigletTree;
@ -54,7 +52,6 @@ public class ModGenerators
registerGenerator("big_tree", GeneratorBigTree.class, new GeneratorBigTree.Builder());
registerGenerator("bush", GeneratorBush.class, new GeneratorBush.Builder());
registerGenerator("twiglet_tree", GeneratorTwigletTree.class, new GeneratorTwigletTree.Builder());
registerGenerator("pine_tree", GeneratorPineTree.class, new GeneratorPineTree.Builder());
registerGenerator("bulb_tree", GeneratorBulbTree.class, new GeneratorBulbTree.Builder());
registerGenerator("mega_jungle_tree", GeneratorMegaJungleTree.class, new GeneratorMegaJungleTree.Builder());
registerGenerator("bayou_tree", GeneratorBayouTree.class, new GeneratorBayouTree.Builder());
@ -76,7 +73,6 @@ public class ModGenerators
registerGenerator("crystals", GeneratorCrystals.class, new GeneratorCrystals.Builder());
registerGenerator("spike", GeneratorSpike.class, new GeneratorSpike.Builder());
registerGenerator("redwood_tree", GeneratorRedwoodTree.class, new GeneratorRedwoodTree.Builder());
registerGenerator("redwood_tree_thin", GeneratorRedwoodTreeThin.class, new GeneratorRedwoodTreeThin.Builder());
registerGenerator("mahogany_tree", GeneratorMahoganyTree.class, new GeneratorMahoganyTree.Builder());
registerGenerator("palm_tree", GeneratorPalmTree.class, new GeneratorPalmTree.Builder());
}

View File

@ -26,6 +26,7 @@ import java.util.List;
import java.util.Map;
import java.util.Random;
import biomesoplenty.api.biome.BOPBiomes;
import biomesoplenty.common.biome.overworld.BOPOverworldBiome;
import biomesoplenty.common.util.biome.BiomeUtils;
import net.minecraft.block.BlockFalling;
@ -541,7 +542,7 @@ public class ChunkGeneratorOverworldBOP implements IChunkGenerator
}
// add lava lakes
if (!hasVillageGenerated && this.rand.nextInt(this.settings.lavaLakeChance / 10) == 0 && this.settings.useLavaLakes && TerrainGen.populate(this, world, rand, chunkX, chunkZ, hasVillageGenerated, LAVA))
if (!hasVillageGenerated && (BOPBiomes.redwood_forest.isPresent() && Biome != BOPBiomes.redwood_forest.get()) && (BOPBiomes.redwood_forest_edge.isPresent() && Biome != BOPBiomes.redwood_forest_edge.get()) && (BOPBiomes.wasteland.isPresent() && Biome != BOPBiomes.wasteland.get()) && this.rand.nextInt(this.settings.lavaLakeChance / 10) == 0 && this.settings.useLavaLakes && TerrainGen.populate(this, world, rand, chunkX, chunkZ, hasVillageGenerated, LAVA))
{
target = decorateStart.add(this.rand.nextInt(16), this.rand.nextInt(248) + 8, this.rand.nextInt(16));
if (target.getY() < 63 || this.rand.nextInt(this.settings.lavaLakeChance / 8) == 0)

View File

@ -7,9 +7,11 @@
******************************************************************************/
package biomesoplenty.common.world.generator.tree;
import java.util.Random;
import biomesoplenty.api.block.BOPBlocks;
import org.apache.commons.lang3.tuple.Pair;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.api.block.IBlockPosQuery;
import biomesoplenty.api.config.IConfigObj;
@ -17,9 +19,14 @@ import biomesoplenty.common.util.biome.GeneratorUtils;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.util.block.BlockQuery;
import biomesoplenty.common.util.block.BlockQuery.BlockQueryBlock;
import biomesoplenty.common.util.block.BlockQuery.BlockQueryMaterial;
import biomesoplenty.common.util.block.BlockQuery.BlockQueryParseException;
import biomesoplenty.common.util.block.BlockQuery.BlockQueryState;
import biomesoplenty.common.world.generator.GeneratorSpike;
import net.minecraft.block.Block;
import net.minecraft.block.BlockCocoa;
import net.minecraft.block.BlockVine;
import net.minecraft.block.material.Material;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.util.EnumFacing;
@ -28,267 +35,363 @@ import net.minecraft.world.World;
public class GeneratorBayouTree extends GeneratorTreeBase
{
public static class Builder extends GeneratorTreeBase.InnerBuilder<Builder, GeneratorBayouTree> implements IGeneratorBuilder<GeneratorBayouTree>
{
protected int minLeavesRadius;
protected int leavesGradient;
protected int vineAttempts;
protected int maxVineLength;
protected IBlockPosQuery rootsReplace;
public Builder minLeavesRadius(int a) {this.minLeavesRadius = a; return this.self();}
public Builder leavesGradient(int a) {this.leavesGradient = a; return this.self();}
public Builder vineAttempts(int a) {this.vineAttempts = a; return this.self();}
public Builder maxVineLength(int a) {this.maxVineLength = a; return this.self();}
public Builder rootsReplace(IBlockPosQuery a) {this.replace = a; return this.self();}
public Builder rootsReplace(String a) throws BlockQueryParseException {this.replace = BlockQuery.parseQueryString(a); return this.self();}
public Builder rootsReplace(Block a) {this.replace = new BlockQueryBlock(a); return this.self();}
public Builder rootsReplace(IBlockState a) {this.replace = new BlockQueryState(a); return this.self();}
public static class Builder extends GeneratorBayouTree.InnerBuilder<Builder, GeneratorBayouTree> implements IGeneratorBuilder<GeneratorBayouTree>
{
public Builder()
{
// defaults
this.amountPerChunk = 1.0F;
this.placeOn = BlockQueries.fertile;
this.replace = BlockQueries.airOrLeaves;
this.rootsReplace = BlockQueries.rootsCanDigThrough;
this.replace = new BlockQueryMaterial(Material.AIR, Material.LEAVES, Material.VINE, Material.WATER);
this.log = Blocks.LOG.getDefaultState();
this.leaves = Blocks.LEAVES.getDefaultState();
this.vine = BOPBlocks.willow_vine.getDefaultState();
this.vine = null;
this.hanging = null;
this.trunkFruit = null;
this.altLeaves = null;
this.minHeight = 8;
this.maxHeight = 18;
this.minLeavesRadius = 2;
this.leavesGradient = 4;
this.vineAttempts = 20;
this.maxVineLength = 20;
this.scatterYMethod = ScatterYMethod.AT_SURFACE;
this.minHeight = 4;
this.maxHeight = 7;
this.updateNeighbours = false;
this.leafLayers = 4;
this.leavesOffset = 1;
this.maxLeavesRadius = 1;
this.leavesLayerHeight = 2;
this.placeVinesOn = BlockQueries.air;
this.hangingChance = 0.0F;
this.scatterYMethod = ScatterYMethod.AT_GROUND;
}
@Override
public GeneratorBayouTree create()
{
return new GeneratorBayouTree(this.amountPerChunk, this.placeOn, this.replace, this.log, this.leaves, this.vine, this.hanging, this.trunkFruit, this.altLeaves, this.minHeight, this.maxHeight, this.minLeavesRadius, this.leavesGradient, this.vineAttempts, this.maxVineLength, this.rootsReplace, this.scatterYMethod);
return new GeneratorBayouTree(this.amountPerChunk, this.placeOn, this.replace, this.log, this.leaves, this.vine, this.hanging, this.trunkFruit, this.altLeaves, this.minHeight, this.maxHeight, this.updateNeighbours, this.leafLayers, this.leavesOffset, this.maxLeavesRadius, this.leavesLayerHeight, this.placeVinesOn, this.hangingChance, this.scatterYMethod);
}
}
private int minLeavesRadius;
private int leavesGradient;
private int vineAttempts;
private int maxVineLength;
private IBlockPosQuery rootsReplace;
protected static abstract class InnerBuilder<T extends InnerBuilder<T, G>, G extends GeneratorBayouTree> extends GeneratorTreeBase.InnerBuilder<T, G>
{
protected int leafLayers;
protected int leavesOffset;
protected int maxLeavesRadius;
protected int leavesLayerHeight;
protected IBlockPosQuery placeVinesOn;
protected float hangingChance;
public T leafLayers(int a) {this.leafLayers = a; return this.self();}
public T leavesOffset(int a) {this.leavesOffset = a; return this.self();}
public T leavesLayerHeight(int a) {this.leavesLayerHeight = a; return this.self();}
public T maxLeavesRadius(int a) {this.maxLeavesRadius = a; return this.self();}
public T placeVinesOn(IBlockPosQuery a) {this.placeVinesOn = a; return this.self();}
public T placeVinesOn(String a) throws BlockQueryParseException {this.placeVinesOn = BlockQuery.parseQueryString(a); return this.self();}
public T placeVinesOn(Block a) {this.placeVinesOn = new BlockQueryBlock(a); return this.self();}
public T placeVinesOn(IBlockState a) {this.placeVinesOn = new BlockQueryState(a); return this.self();}
public T placeVinesOn(Material... a) {this.placeVinesOn = new BlockQueryMaterial(a); return this.self();}
public T hangingChance(float a) {this.hangingChance = a; return this.self();}
}
public GeneratorBayouTree(float amountPerChunk, IBlockPosQuery placeOn, IBlockPosQuery replace, IBlockState log, IBlockState leaves, IBlockState vine, IBlockState hanging, IBlockState trunkFruit, IBlockState altLeaves, int minHeight, int maxHeight, int minLeavesRadius, int leavesGradient, int vineAttempts, int maxVineLength, IBlockPosQuery rootsReplace, ScatterYMethod scatterYMethod)
protected boolean updateNeighbours;
protected int leafLayers;
protected int leavesOffset;
protected int maxLeavesRadius;
protected int leavesLayerHeight;
protected IBlockPosQuery placeVinesOn;
protected float hangingChance;
public GeneratorBayouTree(float amountPerChunk, IBlockPosQuery placeOn, IBlockPosQuery replace, IBlockState log, IBlockState leaves, IBlockState vine, IBlockState hanging, IBlockState trunkFruit, IBlockState altLeaves, int minHeight, int maxHeight, boolean updateNeighbours, int leafLayers, int leavesOffset, int maxLeavesRadius, int leavesLayerHeight, IBlockPosQuery placeVinesOn, float hangingChance, ScatterYMethod scatterYMethod)
{
super(amountPerChunk, placeOn, replace, log, leaves, vine, hanging, trunkFruit, altLeaves, minHeight, maxHeight, scatterYMethod);
this.minLeavesRadius = minLeavesRadius;
this.leavesGradient = leavesGradient;
this.vineAttempts = vineAttempts;
this.maxVineLength = maxVineLength;
this.rootsReplace = rootsReplace;
this.updateNeighbours = updateNeighbours;
this.leavesOffset = leavesOffset;
this.leafLayers = leafLayers;
this.maxLeavesRadius = maxLeavesRadius;
this.leavesLayerHeight = leavesLayerHeight;
this.placeVinesOn = placeVinesOn;
this.hangingChance = hangingChance;
}
@Override
public BlockPos getScatterY(World world, Random random, int x, int z)
public boolean generate(World world, Random random, BlockPos pos)
{
// always at ground (sometimes underwater)
return GeneratorUtils.ScatterYMethod.AT_GROUND.getBlockPos(world, random, x, z);
}
public boolean setRoot(World world, BlockPos pos)
{
if (this.rootsReplace.matches(world, pos))
int height = random.nextInt(this.maxHeight - this.minHeight) + this.minHeight;
boolean hasSpace = true;
//Generate only if we are above the lowest bedrock level (1) and reach less than the world height
//There must be a gap of 1 between the top leaf block and the world height
if (pos.getY() >= 1 && pos.getY() + height + 1 <= 256)
{
world.setBlockState(pos, this.log, 2);
return true;
}
return false;
}
public boolean checkRootViable(World world, BlockPos pos, int rootHeight, EnumFacing direction)
{
// a viable root has an path which roots can dig through from trunk to some fertile ground
pos = pos.offset(direction).up(rootHeight - 1);
for (int i = 0; i < rootHeight; i++)
{
if (!this.rootsReplace.matches(world, pos)) {return false;}
pos = pos.down();
if (this.placeOn.matches(world, pos)) {return true;}
}
return false;
}
public boolean checkSpace(World world, BlockPos pos, int rootHeight, int middleHeight, int height)
{
// we want at least 2 of the roots to be viable
int rootsOk = 0;
for (EnumFacing direction : EnumFacing.Plane.HORIZONTAL)
{
if (this.checkRootViable(world, pos, rootHeight, direction)) {rootsOk++;}
}
if (rootsOk < 2) {return false;}
// check there's some space for the trunk and leaves too
for (int y = rootHeight; y <= height; y++)
{
// require 1x1 for the trunk, 3x3 for the leaves
int radius = (y <= (rootHeight + middleHeight) ? 0 : 1);
for (int x = -radius; x <= radius; x++)
int radius;
for (int y = pos.getY(); y <= pos.getY() + 1 + height; y++)
{
for (int z = -radius; z <= radius; z++)
radius = 1;
//Don't check for space on the first level, if we are a sapling then there will
//already be a block here (the sapling itself)
if (y == pos.getY())
{
BlockPos pos1 = pos.add(x, y, z);
// note, there may be a sapling on the first layer - make sure this.replace matches it!
if (pos1.getY() >= 255 || !this.replace.matches(world, pos1))
radius = 0;
}
//At and above the top log block, require a radius of 2 to be empty
if (y >= pos.getY() + 1 + height - 2)
{
radius = 2;
}
for (int x = pos.getX() - radius; x <= pos.getX() + radius && hasSpace; ++x)
{
for (int z = pos.getZ() - radius; z <= pos.getZ() + radius && hasSpace; ++z)
{
return false;
if (y < 0 || y > 256)
{
hasSpace = false;
}
}
}
}
}
return true;
}
public void generateTop(World world, Random random, BlockPos pos, int topHeight)
{
for (int y = 0; y < topHeight; y++)
{
int radius = Math.min(3, this.minLeavesRadius + (topHeight - y) / this.leavesGradient);
for (int x = -radius; x <= radius; ++x)
if (!hasSpace)
{
for (int z = -radius; z <= radius; ++z)
return false;
}
else
{
BlockPos soilPos = pos.down();
Block soil = world.getBlockState(soilPos).getBlock();
if (this.placeOn.matches(world, soilPos) && pos.getY() < 256 - height - 1)
{
// too far away and the leaves will decay
int dist = Math.abs(x) + Math.abs(z);
if (dist < 4 || (dist == 4 && random.nextInt(2) == 0))
soil.onPlantGrow(world.getBlockState(soilPos), world, soilPos, pos);
int leavesLayers = (this.leafLayers - 1);
//Generates leaves at the top of the tree, going one block above the top log (<= rather than <)
for (int y = pos.getY() + height - leavesLayers; y <= pos.getY() + height; y++)
{
this.setLeaves(world, pos.add(x, y, z));
//Determines the distance from the top of the tree as a negative number
int currentLayer = y - (pos.getY() + height);
//Uses integer division truncation (-3 / 2 = -1, -2 / 2 = -1) to reduce
//the radius closer to the top of the tree. (2, 2, 1, 1)
int leavesRadius = this.maxLeavesRadius - currentLayer / this.leavesLayerHeight;
for (int x = pos.getX() - leavesRadius; x <= pos.getX() + leavesRadius; x++)
{
int xDiff = x - pos.getX();
for (int z = pos.getZ() - leavesRadius; z <= pos.getZ() + leavesRadius; ++z)
{
int zDiff = z - pos.getZ();
//Randomly prevent the generation of leaves on the corners of each layer
//If the layer is the top layer, never generate the corners
if (Math.abs(xDiff) != leavesRadius || Math.abs(zDiff) != leavesRadius || random.nextInt(2) != 0 && currentLayer != 0)
{
BlockPos leavesPos = new BlockPos(x, y, z);
if (this.replace.matches(world, leavesPos))
{
if (this.altLeaves != null)
{
if (random.nextInt(4) == 0)
{
this.setBlockAndNotifyAdequately(world, leavesPos, this.altLeaves);
}
else
{
this.setBlockAndNotifyAdequately(world, leavesPos, this.leaves);
}
}
else
{
this.setBlockAndNotifyAdequately(world, leavesPos, this.leaves);
}
}
}
}
}
}
this.generateTrunk(world, pos, height);
if (this.vine != null)
{
for (int y = pos.getY() - leavesLayers + height; y <= pos.getY() + height; y++)
{
//Determines the distance from the top of the tree as a negative number
int currentLayer = y - (pos.getY() + height);
//Uses integer division truncation (-3 / 2 = -1, -2 / 2 = -1) to reduce
//the radius closer to the top of the tree. (3, 3, 2, 2)
int leavesRadius = (this.maxLeavesRadius + this.leavesOffset) - currentLayer / this.leavesLayerHeight;
for (int x = pos.getX() - leavesRadius; x <= pos.getX() + leavesRadius; x++)
{
for (int z = pos.getZ() - leavesRadius; z <= pos.getZ() + leavesRadius; z++)
{
BlockPos blockpos3 = new BlockPos(x, y, z);
//Surround leaves on the edge of the tree with vines and extend them downwards
if (world.getBlockState(blockpos3).getBlock().isLeaves(world.getBlockState(blockpos3), world, blockpos3))
{
BlockPos westPos = blockpos3.west();
BlockPos eastPos = blockpos3.east();
BlockPos northPos = blockpos3.north();
BlockPos southPos = blockpos3.south();
if (random.nextInt(4) == 0 && this.placeVinesOn.matches(world, westPos))
{
this.extendVines(world, westPos, EnumFacing.EAST);
}
if (random.nextInt(4) == 0 && this.placeVinesOn.matches(world, eastPos))
{
this.extendVines(world, eastPos, EnumFacing.WEST);
}
if (random.nextInt(4) == 0 && this.placeVinesOn.matches(world, northPos))
{
this.extendVines(world, northPos, EnumFacing.SOUTH);
}
if (random.nextInt(4) == 0 && this.placeVinesOn.matches(world, southPos))
{
this.extendVines(world, southPos, EnumFacing.NORTH);
}
}
}
}
}
}
//Generate fruit or any other blocks that may hang off of the tree
if (this.hanging != null) this.generateHanging(world, pos, height);
if (this.trunkFruit != null)
{
if (random.nextInt(5) == 0 && height > 5)
{
for (int l3 = 0; l3 < 2; ++l3)
{
for (EnumFacing enumfacing : EnumFacing.Plane.HORIZONTAL)
{
if (random.nextInt(4 - l3) == 0)
{
EnumFacing enumfacing1 = enumfacing.getOpposite();
this.generateTrunkFruit(world, random.nextInt(3), pos.add(enumfacing1.getFrontOffsetX(), height - 5 + l3, enumfacing1.getFrontOffsetZ()), enumfacing);
}
}
}
}
}
return true;
}
else
{
return false;
}
}
if (y < topHeight - 1)
}
else
{
return false;
}
}
protected void generateTrunk(World world, BlockPos start, int height)
{
//Create the trunk from the bottom up, using < to ensure it is covered with one layer of leaves
for (int layer = 0; layer < height; ++layer)
{
BlockPos blockpos2 = start.up(layer);
if (this.replace.matches(world, blockpos2))
{
// add the trunk in the middle
this.setLog(world, pos.add(0, y, 0));
} else {
// add leaves on top for certain
this.setLeaves(world, pos.add(0, y, 0));
this.setBlockAndNotifyAdequately(world, start.up(layer), this.log);
}
}
}
public void generateRoots(World world, Random random, BlockPos pos, int rootHeight)
protected void generateHanging(World world, BlockPos start, int height)
{
for (int i = 0; i < rootHeight; i++)
//Generate below the bottom layer of leaves
int y = start.getY() + (height - this.leafLayers);
for (int x = start.getX() - (maxLeavesRadius + 1); x <= start.getX() + (maxLeavesRadius + 1); x++)
{
this.setRoot(world, pos.north());
this.setRoot(world, pos.east());
this.setRoot(world, pos.south());
this.setRoot(world, pos.west());
pos = pos.up();
}
this.setRoot(world, pos.down());
}
@Override
public boolean generate(World world, Random random, BlockPos startPos)
{
for (int z = start.getZ() - (maxLeavesRadius + 1); z <= start.getZ() + (maxLeavesRadius + 1); z++)
{
BlockPos hangingPos = new BlockPos(x, y, z);
if (!this.placeOn.matches(world, startPos.down()))
{
// Abandon if we can't place the tree on this block
return false;
}
// Choose heights
int height = GeneratorUtils.nextIntBetween(random, this.minHeight, this.maxHeight);
int topHeight = Math.min(6, GeneratorUtils.nextIntBetween(random, height / 5, height / 3));
int rootHeight = Math.min(5, GeneratorUtils.nextIntBetween(random, height / 4, height / 2));
int middleHeight = height - topHeight - rootHeight;
if (middleHeight < 1) {return false;}
// Start in the ground block
BlockPos pos = startPos.down();
if (!this.checkSpace(world, pos, rootHeight, middleHeight, height))
{
// Abandon if there isn't enough room
return false;
}
// Generate roots
this.generateRoots(world, random, pos, rootHeight);
pos = pos.up(rootHeight);
// Generate middle of tree (trunk only)
for(int i = 0; i < middleHeight; i++)
{
this.setLog(world, pos);
pos = pos.up();
}
// Generate the top of the tree
this.generateTop(world, random, pos, topHeight);
// Add vines
if (this.vine != null)
{
int maxLeavesRadius = this.minLeavesRadius + topHeight / this.leavesGradient;
this.addVines(world, random, startPos, height, maxLeavesRadius, this.vineAttempts);
}
return true;
}
protected void addVines(World world, Random rand, BlockPos startPos, int height, int leavesRadius, int generationAttempts)
{
for (int i = 0; i < generationAttempts; i++)
{
// choose a random direction
EnumFacing direction = EnumFacing.Plane.HORIZONTAL.random(rand);
EnumFacing back = direction.getOpposite();
EnumFacing sideways = direction.rotateY();
// choose a random starting point somewhere just outside the boundary of the tree
BlockPos pos = startPos.up(GeneratorUtils.nextIntBetween(rand, 2, height)).offset(direction, leavesRadius + 1).offset(sideways, GeneratorUtils.nextIntBetween(rand, -leavesRadius, leavesRadius));
// move back towards the center until we meet a leaf or log, then stick a vine on it
IBlockState state;
for (int l = 0; l < leavesRadius; l++)
{
state = world.getBlockState(pos.offset(back, 1 + l));
if (state == this.leaves || state == this.log) {
this.setVine(world, rand, pos.offset(back, l), back, this.maxVineLength);
break;
if (!world.isAirBlock(hangingPos.up()) && (world.isAirBlock(hangingPos)) && world.rand.nextFloat() <= this.hangingChance)
{
this.setHanging(world, hangingPos);
}
}
}
}
private void generateTrunkFruit(World world, int age, BlockPos pos, EnumFacing direction)
{
if (this.trunkFruit == Blocks.COCOA.getDefaultState())
{
this.setBlockAndNotifyAdequately(world, pos, this.trunkFruit.withProperty(BlockCocoa.AGE, Integer.valueOf(age)).withProperty(BlockCocoa.FACING, direction));
}
else
{
this.setBlockAndNotifyAdequately(world, pos, this.trunkFruit.withProperty(BlockCocoa.FACING, direction));
}
}
private IBlockState getVineStateForSide(EnumFacing side)
{
return this.vine.getBlock() instanceof BlockVine ? this.vine.withProperty(BlockVine.getPropertyFor(side), Boolean.valueOf(true)) : this.vine;
}
private void extendVines(World world, BlockPos pos, EnumFacing side)
{
IBlockState vineState = this.getVineStateForSide(side);
this.setBlockAndNotifyAdequately(world, pos, vineState);
int length = 4;
//Extend vine downwards for a maximum of 4 blocks
for (pos = pos.down(); this.placeVinesOn.matches(world, pos) && length > 0; length--)
{
this.setBlockAndNotifyAdequately(world, pos, vineState);
pos = pos.down();
}
}
public void setBlockAndNotifyAdequately(World world, BlockPos pos, IBlockState state)
{
if (this.updateNeighbours)
{
world.setBlockState(pos, state, 3);
}
else
{
world.setBlockState(pos, state, 2);
}
}
@Override
public void configure(IConfigObj conf)
{
{
this.amountPerChunk = conf.getFloat("amountPerChunk", this.amountPerChunk);
this.minHeight = conf.getInt("minHeight", this.minHeight);
this.minLeavesRadius = conf.getInt("minLeavesRadius", this.minLeavesRadius);
this.leavesGradient = conf.getInt("leavesGradient", this.leavesGradient);
this.vineAttempts = conf.getInt("vineAttempts", this.vineAttempts);
this.maxVineLength = conf.getInt("maxVineLength", this.maxVineLength);
this.placeOn = conf.getBlockPosQuery("placeOn", this.placeOn);
this.replace = conf.getBlockPosQuery("replace", this.replace);
this.rootsReplace = conf.getBlockPosQuery("rootsReplace", this.rootsReplace);
this.updateNeighbours = conf.getBool("updateNeighbours", this.updateNeighbours);
int minHeight = conf.getInt("minHeight", this.minHeight);
int maxHeight = conf.getInt("maxHeight", this.maxHeight);
Pair<Integer, Integer> heights = GeneratorUtils.validateMinMaxHeight(minHeight, maxHeight);
this.minHeight = heights.getLeft();
this.maxHeight = heights.getRight();
this.log = conf.getBlockState("logState", this.log);
this.leaves = conf.getBlockState("leavesState", this.leaves);
this.vine = conf.getBlockState("vinesState", this.vine);
this.vine = conf.getBlockState("vineState", this.vine);
this.hanging = conf.getBlockState("hangingState", this.hanging);
this.trunkFruit = conf.getBlockState("trunkFruitState", this.trunkFruit);
this.altLeaves = conf.getBlockState("altLeavesState", this.altLeaves);
this.hangingChance = conf.getFloat("hangingChance", this.hangingChance);
}
}
}

View File

@ -1,208 +0,0 @@
/*******************************************************************************
* Copyright 2015-2016, the Biomes O' Plenty Team
*
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
*
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
******************************************************************************/
package biomesoplenty.common.world.generator.tree;
import java.util.Random;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.api.block.IBlockPosQuery;
import biomesoplenty.api.config.IConfigObj;
import biomesoplenty.common.util.biome.GeneratorUtils;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import net.minecraft.block.state.IBlockState;
import net.minecraft.init.Blocks;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class GeneratorPineTree extends GeneratorTreeBase
{
public static class Builder extends GeneratorTreeBase.InnerBuilder<Builder, GeneratorPineTree> implements IGeneratorBuilder<GeneratorPineTree>
{
public Builder()
{
this.amountPerChunk = 1.0F;
this.minHeight = 6;
this.maxHeight = 12;
this.placeOn = BlockQueries.fertile;
this.replace = BlockQueries.airOrLeaves;
this.log = Blocks.LOG.getDefaultState();
this.leaves = Blocks.LEAVES.getDefaultState();
this.vine = null;
this.hanging = hanging;
this.trunkFruit = null;
this.altLeaves = null;
this.scatterYMethod = ScatterYMethod.AT_SURFACE;
}
@Override
public GeneratorPineTree create() {
return new GeneratorPineTree(this.amountPerChunk, this.placeOn, this.replace, this.log, this.leaves, this.vine, this.hanging, this.trunkFruit, this.altLeaves, this.minHeight, this.maxHeight, this.scatterYMethod);
}
}
public GeneratorPineTree(float amountPerChunk, IBlockPosQuery placeOn, IBlockPosQuery replace, IBlockState log, IBlockState leaves, IBlockState vine, IBlockState hanging, IBlockState trunkFruit, IBlockState altLeaves, int minHeight, int maxHeight, ScatterYMethod scatterYMethod)
{
super(amountPerChunk, placeOn, replace, log, leaves, vine, hanging, trunkFruit, altLeaves, minHeight, maxHeight, scatterYMethod);
}
@Override
public boolean generate(World world, Random random, BlockPos pos)
{
// Move down until we reach the ground
while (pos.getY() > 1 && world.isAirBlock(pos) || world.getBlockState(pos).getBlock().isLeaves(world.getBlockState(pos), world, pos)) {pos = pos.down();}
if (!this.placeOn.matches(world, pos))
{
// Abandon if we can't place the tree on this block
return false;
}
// Choose heights
int height = GeneratorUtils.nextIntBetween(random, this.minHeight, this.maxHeight);
if (height < 6) {return false;}
int heightMinusTop = height - 3;
int numBranches = heightMinusTop / 3;
int baseHeight = heightMinusTop - (numBranches * 2);
// Move up to space above ground
pos = pos.up();
if (!this.checkSpace(world, pos, baseHeight, height))
{
// Abandon if there isn't enough room
return false;
}
// Generate bottom of tree (trunk only)
for(int i = 0; i < baseHeight; i++)
{
this.setLog(world, pos);
pos = pos.up();
}
// Generate middle of the tree - 2 steps at a time (trunk and leaves)
for(int i = 0; i < numBranches; i++)
{
this.generateLeafLayer(world, random, pos, i);
pos = pos.up(2);
}
// Generate top of tree
generateTop(world, pos);
return true;
}
public boolean checkSpace(World world, BlockPos pos, int baseHeight, int height)
{
for (int y = 0; y <= height; y++)
{
// require 3x3 for the leaves, 1x1 for the trunk
int radius = (y <= baseHeight ? 0 : 1);
for (int x = -radius; x <= radius; x++)
{
for (int z = -radius; z <= radius; z++)
{
BlockPos pos1 = pos.add(x, y, z);
// note, there may be a sapling on the first layer - make sure this.replace matches it!
if (pos1.getY() >= 255 || !this.replace.matches(world, pos1))
{
return false;
}
}
}
}
return true;
}
// generate the top of the tree (3 blocks)
public void generateTop(World world, BlockPos pos)
{
for(int x = -1; x <= 1; x++)
{
for(int z = -1; z <= 1; z++)
{
this.setLeaves(world, pos.add(x, 0, z));
}
}
this.setLog(world, pos);
pos = pos.up();
this.setLeaves(world, pos);
this.setLeaves(world, pos.north());
this.setLeaves(world, pos.east());
this.setLeaves(world, pos.south());
this.setLeaves(world, pos.west());
this.setLeaves(world, pos.up());
}
// generates a 'branch' of a leaf layer - extra leaves in the corner in the specified direction
public void generateBranch(World world, BlockPos pos, EnumFacing direction, boolean dropY, boolean dropCorner)
{
EnumFacing sideways = direction.rotateY();
if (dropY) {pos = pos.down();}
this.setLeaves(world, pos.offset(direction, 1).offset(sideways, 1));
this.setLeaves(world, pos.offset(direction, 2).offset(sideways, 1));
this.setLeaves(world, pos.offset(direction, 1).offset(sideways, 2));
this.setLeaves(world, pos.offset(direction, 2).offset(sideways, 2));
if (dropCorner)
{
this.setLeaves(world, pos.offset(direction, 2).offset(sideways, 2).down());
}
}
// generates a layer of leafs (2 blocks high)
public void generateLeafLayer(World world, Random rand, BlockPos pos, int leafLayerNum)
{
// middle 3x3 are always leaves
for(int x = -1; x <= 1; x++)
{
for(int z = -1; z <= 1; z++)
{
this.setLeaves(world, pos.add(x, 0, z));
}
}
// sometimes add leaves further out - alternate layers at right angles to each other
EnumFacing direction = (leafLayerNum % 2 == 0) ? EnumFacing.NORTH : EnumFacing.EAST;
boolean dropY = (rand.nextInt(2) == 0);
boolean dropCorner = (rand.nextInt(2) == 0);
if (rand.nextInt(2) == 0)
{
this.generateBranch(world, pos, direction, dropY, dropCorner);
}
if (rand.nextInt(2) == 0)
{
this.generateBranch(world, pos, direction.getOpposite(), dropY, dropCorner);
}
// add the trunk in the middle
this.setLog(world, pos);
this.setLog(world, pos.up());
}
@Override
public void configure(IConfigObj conf)
{
this.amountPerChunk = conf.getFloat("amountPerChunk", this.amountPerChunk);
this.minHeight = conf.getInt("minHeight", this.minHeight);
this.maxHeight = conf.getInt("minHeight", this.maxHeight);
this.placeOn = conf.getBlockPosQuery("placeOn", this.placeOn);
this.replace = conf.getBlockPosQuery("replace", this.replace);
this.log = conf.getBlockState("logState", this.log);
this.leaves = conf.getBlockState("leavesState", this.leaves);
}
}

View File

@ -1,202 +0,0 @@
/*******************************************************************************
* Copyright 2016, the Biomes O' Plenty Team
*
* This work is licensed under a Creative Commons Attribution-NonCommercial-NoDerivatives 4.0 International Public License.
*
* To view a copy of this license, visit http://creativecommons.org/licenses/by-nc-nd/4.0/.
******************************************************************************/
package biomesoplenty.common.world.generator.tree;
import java.util.Random;
import biomesoplenty.api.block.BlockQueries;
import biomesoplenty.api.block.IBlockPosQuery;
import biomesoplenty.api.config.IConfigObj;
import biomesoplenty.api.enums.BOPTrees;
import biomesoplenty.api.enums.BOPWoods;
import biomesoplenty.common.block.BlockBOPLeaves;
import biomesoplenty.common.block.BlockBOPLog;
import biomesoplenty.common.util.biome.GeneratorUtils;
import biomesoplenty.common.util.biome.GeneratorUtils.ScatterYMethod;
import biomesoplenty.common.world.generator.GeneratorSpike;
import net.minecraft.block.BlockOldLeaf;
import net.minecraft.block.state.IBlockState;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
public class GeneratorRedwoodTreeThin extends GeneratorTreeBase
{
public static class Builder extends GeneratorTreeBase.InnerBuilder<Builder, GeneratorRedwoodTreeThin> implements IGeneratorBuilder<GeneratorRedwoodTreeThin>
{
public Builder()
{
this.amountPerChunk = 1.0F;
this.minHeight = 30;
this.maxHeight = 50;
this.placeOn = BlockQueries.fertile;
this.replace = BlockQueries.replaceable;
this.log = BlockBOPLog.paging.getVariantState(BOPWoods.REDWOOD);
this.leaves = BlockBOPLeaves.paging.getVariantState(BOPTrees.REDWOOD).withProperty(BlockOldLeaf.CHECK_DECAY, Boolean.valueOf(false));
this.vine = null;
this.hanging = null;
this.trunkFruit = null;
this.altLeaves = null;
this.scatterYMethod = ScatterYMethod.AT_SURFACE;
}
@Override
public GeneratorRedwoodTreeThin create()
{
return new GeneratorRedwoodTreeThin(this.amountPerChunk, this.placeOn, this.replace, this.log, this.leaves, this.vine, this.hanging, this.trunkFruit, this.altLeaves, this.minHeight, this.maxHeight, this.scatterYMethod);
}
}
protected GeneratorRedwoodTreeThin(float amountPerChunk, IBlockPosQuery placeOn, IBlockPosQuery replace, IBlockState log, IBlockState leaves, IBlockState vine, IBlockState hanging, IBlockState trunkFruit, IBlockState altLeaves, int minHeight, int maxHeight, ScatterYMethod scatterYMethod)
{
super(amountPerChunk, placeOn, replace, log, leaves, vine, hanging, trunkFruit, altLeaves, minHeight, maxHeight, scatterYMethod);
}
public boolean canPlaceHere(World world, BlockPos pos, int height, int radius)
{
if (pos.getY() < 1 || pos.getY() + height > 255)
{
return false;
}
for (int y = pos.getY(); y <= pos.getY() + height; ++y)
{
for (int x = pos.getX() - radius; x <= pos.getX() + radius; ++x)
{
for (int z = pos.getZ() - radius; z <= pos.getZ() + radius; ++z)
{
if (y == pos.getY() && !this.placeOn.matches(world, new BlockPos(x, y - 1, z)))
{
return false;
}
if (!this.replace.matches(world, new BlockPos(x, y, z)))
{
return false;
}
}
}
}
return true;
}
public void generateTrunk(World world, Random random, BlockPos pos, int trunkHeight)
{
for (int i = 0; i < trunkHeight; i++)
{
this.setLog(world, pos);
pos = pos.up();
}
}
public void generateBranches(World world, Random rand, BlockPos pos, int length)
{
//Iterate over the possible directions
for (EnumFacing direction = EnumFacing.NORTH; direction.ordinal() < 5; direction = EnumFacing.values()[direction.ordinal() + 1])
{
EnumFacing.Axis axis = direction.getAxis();
EnumFacing sideways = direction.rotateY();
for (int i = 1; i <= length; i++)
{
BlockPos pos1 = pos.offset(direction, i);
this.setLog(world, pos1, axis);
}
}
}
public void generateLeafLayer(World world, Random rand, BlockPos pos, int leafLayerNum)
{
//Repeat in intervals of 6, 2 small radius, 4 large
int index = leafLayerNum % 7;
int leavesRadius;
//Alternate between a smaller radius and a larger radius
if (index < 2) leavesRadius = 1;
else leavesRadius = 2;
//This may break for larger radii however it will do for this purpose
double increment = 0.05D;
for (int radius = leavesRadius; radius >= 0; radius--)
{
for (double angle = 0.0F; angle <= Math.PI * 2; angle += increment)
{
BlockPos leavesPos = pos.add(Math.round(radius * Math.cos(angle)), 0, Math.round(radius * Math.sin(angle)));
if (radius < leavesRadius || index < 2 || rand.nextInt(4) == 0)
this.setLeaves(world, leavesPos);
}
}
}
@Override
public boolean generate(World world, Random random, BlockPos pos)
{
// Move down until we reach the ground
while (pos.getY() > 1 && world.isAirBlock(pos) || world.getBlockState(pos).getBlock().isLeaves(world.getBlockState(pos), world, pos)) {pos = pos.down();}
// Choose heights
int height = GeneratorUtils.nextIntBetween(random, this.minHeight, this.maxHeight);
if (height < 20) {return false;}
// Move up to space above ground
pos = pos.up();
GeneratorSpike spikeGenerator = (new GeneratorSpike.Builder().with(this.log).replace(BlockQueries.anything).minRadius(2).maxRadius(2).minHeight(2).maxHeight(4).create());
// check that there's room and if the blocks below are suitable
if (!spikeGenerator.canPlaceHere(world, pos, height, 2)) {return false;}
//Generate the base of the tree
spikeGenerator.generate(world, random, pos);
BlockPos trunkTop = pos;
//Move upwards until the block above this is air
for (; !world.isAirBlock(trunkTop.up()); trunkTop = trunkTop.up())
{
if (trunkTop.getY() >= 255)
{
return false;
}
}
int baseHeight = trunkTop.getY() - pos.getY();
int trunkHeight = height - baseHeight;
//Generate the trunk to 1 block below the height
this.generateTrunk(world, random, pos, height - 1);
//Generate the layers of leaves
for (int i = 0; i < trunkHeight * 0.75F; i++)
{
this.generateLeafLayer(world, random, pos.up(height - i), i);
}
GeneratorBush bushGenerator = new GeneratorBush.Builder().amountPerChunk(2F).log(this.log).leaves(this.leaves).placeOn(this.log).maxHeight(2).create();
//Add bushes around the base
for (int i = 0; i < 10; i++)
{
bushGenerator.generate(world, random, pos.add(random.nextInt(5) - 5, baseHeight, random.nextInt(5) - 5));
}
return true;
}
@Override
public void configure(IConfigObj conf)
{
this.amountPerChunk = conf.getFloat("amountPerChunk", this.amountPerChunk);
this.minHeight = conf.getInt("minHeight", this.minHeight);
this.maxHeight = conf.getInt("minHeight", this.maxHeight);
this.placeOn = conf.getBlockPosQuery("placeOn", this.placeOn);
this.replace = conf.getBlockPosQuery("replace", this.replace);
this.log = conf.getBlockState("logState", this.log);
this.leaves = conf.getBlockState("leavesState", this.leaves);
}
}

View File

@ -13,7 +13,7 @@
"show_toast": true,
"announce_to_chat": true
},
"parent": "biomesoplenty:biomesoplenty/root",
"parent": "biomesoplenty:biomesoplenty/nether_biomes",
"criteria": {
"alps": {
"trigger": "minecraft:location",

View File

@ -0,0 +1,56 @@
{
"display": {
"icon": {
"item": "biomesoplenty:sapling_1",
"data": 3
},
"title": {
"translate": "advancements.biomesoplenty.beach_island_biomes.title"
},
"description": {
"translate": "advancements.biomesoplenty.beach_island_biomes.description"
},
"frame": "goal",
"show_toast": true,
"announce_to_chat": true
},
"parent": "biomesoplenty:biomesoplenty/root",
"criteria": {
"origin_island": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:origin_island"
}
},
"tropical_island": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:tropical_island"
}
},
"volcanic_island": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:volcanic_island"
}
},
"gravel_beach": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:gravel_beach"
}
},
"white_beach": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:white_beach"
}
},
"origin_beach": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:origin_beach"
}
}
}
}

View File

@ -0,0 +1,104 @@
{
"display": {
"icon": {
"item": "biomesoplenty:sapling_0",
"data": 4
},
"title": {
"translate": "advancements.biomesoplenty.evergreen_biomes.title"
},
"description": {
"translate": "advancements.biomesoplenty.evergreen_biomes.description"
},
"frame": "goal",
"show_toast": true,
"announce_to_chat": true
},
"parent": "biomesoplenty:biomesoplenty/root",
"criteria": {
"boreal_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:boreal_forest"
}
},
"coniferous_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:coniferous_forest"
}
},
"dead_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:dead_forest"
}
},
"maple_woods": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:maple_woods"
}
},
"meadow": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:meadow"
}
},
"redwood_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:redwood_forest"
}
},
"seasonal_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:seasonal_forest"
}
},
"shield": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:shield"
}
},
"snowy_coniferous_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:snowy_coniferous_forest"
}
},
"temperate_rainforest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:temperate_rainforest"
}
},
"wetland": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:wetland"
}
},
"flower_meadow": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:flower_meadow"
}
},
"alps_foothills": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:alps_foothills"
}
},
"redwood_forest_edge": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:redwood_forest_edge"
}
}
}
}

View File

@ -0,0 +1,32 @@
{
"display": {
"icon": {
"item": "biomesoplenty:flower_0",
"data": 9
},
"title": {
"translate": "advancements.biomesoplenty.magic_biomes.title"
},
"description": {
"translate": "advancements.biomesoplenty.magic_biomes.description"
},
"frame": "goal",
"show_toast": true,
"announce_to_chat": true
},
"parent": "biomesoplenty:biomesoplenty/beach_island_biomes",
"criteria": {
"mystic_grove": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:mystic_grove"
}
},
"ominous_woods": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:ominous_woods"
}
}
}
}

View File

@ -0,0 +1,50 @@
{
"display": {
"icon": {
"item": "biomesoplenty:bramble_plant",
"data": 0
},
"title": {
"translate": "advancements.biomesoplenty.nether_biomes.title"
},
"description": {
"translate": "advancements.biomesoplenty.nether_biomes.description"
},
"frame": "goal",
"show_toast": true,
"announce_to_chat": true
},
"parent": "biomesoplenty:biomesoplenty/wasteland_biome",
"criteria": {
"corrupted_sands": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:corrupted_sands"
}
},
"fungi_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:fungi_forest"
}
},
"phantasmagoric_inferno": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:phantasmagoric_inferno"
}
},
"undergarden": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:undergarden"
}
},
"visceral_heap": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:visceral_heap"
}
}
}
}

View File

@ -1,7 +1,7 @@
{
"display": {
"icon": {
"item": "biomesoplenty:flower_0",
"item": "biomesoplenty:grass",
"data": 0
},
"title": {
@ -14,43 +14,472 @@
"show_toast": false,
"announce_to_chat": false
},
"criteria": {
"red_flower": {
"trigger": "minecraft:inventory_changed",
"criteria": {
"alps": {
"trigger": "minecraft:location",
"conditions": {
"items": [
{
"item": "minecraft:red_flower"
}
]
"biome": "biomesoplenty:alps"
}
},
"yellow_flower": {
"trigger": "minecraft:inventory_changed",
"bayou": {
"trigger": "minecraft:location",
"conditions": {
"items": [
{
"item": "minecraft:yellow_flower"
}
]
"biome": "biomesoplenty:bayou"
}
},
"bop_flower_0": {
"trigger": "minecraft:inventory_changed",
"bog": {
"trigger": "minecraft:location",
"conditions": {
"items": [
{
"item": "biomesoplenty:flower_0"
}
]
"biome": "biomesoplenty:bog"
}
},
"boreal_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:boreal_forest"
}
},
"brushland": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:brushland"
}
},
"chaparral": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:chaparral"
}
},
"cherry_blossom_grove": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:cherry_blossom_grove"
}
},
"cold_desert": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:cold_desert"
}
},
"coniferous_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:coniferous_forest"
}
},
"crag": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:crag"
}
},
"dead_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:dead_forest"
}
},
"dead_swamp": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:dead_swamp"
}
},
"fen": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:fen"
}
},
"floodplains": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:floodplains"
}
},
"grassland": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:grassland"
}
},
"grove": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:grove"
}
},
"highland": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:highland"
}
},
"lavender_fields": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:lavender_fields"
}
},
"lush_swamp": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:lush_swamp"
}
},
"maple_woods": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:maple_woods"
}
},
"marsh": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:marsh"
}
},
"meadow": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:meadow"
}
},
"mystic_grove": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:mystic_grove"
}
},
"ominous_woods": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:ominous_woods"
}
},
"orchard": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:orchard"
}
},
"outback": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:outback"
}
},
"overgrown_cliffs": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:overgrown_cliffs"
}
},
"prairie": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:prairie"
}
},
"rainforest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:rainforest"
}
},
"redwood_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:redwood_forest"
}
},
"scrubland": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:scrubland"
}
},
"seasonal_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:seasonal_forest"
}
},
"shield": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:shield"
}
},
"shrubland": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:shrubland"
}
},
"snowy_coniferous_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:snowy_coniferous_forest"
}
},
"snowy_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:snowy_forest"
}
},
"steppe": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:steppe"
}
},
"temperate_rainforest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:temperate_rainforest"
}
},
"tropical_rainforest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:tropical_rainforest"
}
},
"tundra": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:tundra"
}
},
"wasteland": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:wasteland"
}
},
"wetland": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:wetland"
}
},
"woodland": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:woodland"
}
},
"xeric_shrubland": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:xeric_shrubland"
}
},
"origin_island": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:origin_island"
}
},
"tropical_island": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:tropical_island"
}
},
"volcanic_island": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:volcanic_island"
}
},
"coral_reef": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:coral_reef"
}
},
"kelp_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:kelp_forest"
}
},
"cold_tundra": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:cold_tundra"
}
},
"dead_plains": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:dead_plains"
}
},
"flower_meadow": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:flower_meadow"
}
},
"highland_moor": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:highland_moor"
}
},
"mire": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:mire"
}
},
"oasis": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:oasis"
}
},
"pasture": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:pasture"
}
},
"gravel_beach": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:gravel_beach"
}
},
"white_beach": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:white_beach"
}
},
"origin_beach": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:origin_beach"
}
},
"alps_foothills": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:alps_foothills"
}
},
"redwood_forest_edge": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:redwood_forest_edge"
}
},
"corrupted_sands": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:corrupted_sands"
}
},
"fungi_forest": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:fungi_forest"
}
},
"phantasmagoric_inferno": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:phantasmagoric_inferno"
}
},
"undergarden": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:undergarden"
}
},
"visceral_heap": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:visceral_heap"
}
}
},
},
"requirements": [
[
"red_flower",
"yellow_flower",
"bop_flower_0"
"alps",
"bayou",
"bog",
"boreal_forest",
"brushland",
"chaparral",
"cherry_blossom_grove",
"cold_desert",
"coniferous_forest",
"crag",
"dead_forest",
"dead_swamp",
"fen",
"floodplains",
"grassland",
"grove",
"highland",
"lavender_fields",
"lush_swamp",
"maple_woods",
"marsh",
"meadow",
"mystic_grove",
"ominous_woods",
"orchard",
"outback",
"overgrown_cliffs",
"prairie",
"rainforest",
"redwood_forest",
"scrubland",
"seasonal_forest",
"shield",
"shrubland",
"snowy_coniferous_forest",
"snowy_forest",
"steppe",
"temperate_rainforest",
"tropical_rainforest",
"tundra",
"wasteland",
"wetland",
"woodland",
"xeric_shrubland",
"origin_island",
"tropical_island",
"volcanic_island",
"coral_reef",
"kelp_forest",
"cold_tundra",
"dead_plains",
"flower_meadow",
"highland_moor",
"mire",
"oasis",
"pasture",
"gravel_beach",
"origin_beach",
"white_beach",
"alps_foothills",
"redwood_forest_edge",
"corrupted_sands",
"fungi_forest",
"phantasmagoric_inferno",
"undergarden",
"visceral_heap"
]
]
}

View File

@ -0,0 +1,74 @@
{
"display": {
"icon": {
"item": "biomesoplenty:plant_0",
"data": 2
},
"title": {
"translate": "advancements.biomesoplenty.swamp_biomes.title"
},
"description": {
"translate": "advancements.biomesoplenty.swamp_biomes.description"
},
"frame": "goal",
"show_toast": true,
"announce_to_chat": true
},
"parent": "biomesoplenty:biomesoplenty/evergreen_biomes",
"criteria": {
"bayou": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:bayou"
}
},
"bog": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:bog"
}
},
"dead_swamp": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:dead_swamp"
}
},
"fen": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:fen"
}
},
"lush_swamp": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:lush_swamp"
}
},
"marsh": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:marsh"
}
},
"wetland": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:wetland"
}
},
"highland_moor": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:highland_moor"
}
},
"mire": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:mire"
}
}
}
}

View File

@ -0,0 +1,26 @@
{
"display": {
"icon": {
"item": "biomesoplenty:flower_0",
"data": 11
},
"title": {
"translate": "advancements.biomesoplenty.wasteland_biome.title"
},
"description": {
"translate": "advancements.biomesoplenty.wasteland_biome.description"
},
"frame": "goal",
"show_toast": true,
"announce_to_chat": true
},
"parent": "biomesoplenty:biomesoplenty/root",
"criteria": {
"wasteland": {
"trigger": "minecraft:location",
"conditions": {
"biome": "biomesoplenty:wasteland"
}
}
}
}

View File

@ -3,13 +3,11 @@
"variant=shortgrass": { "model": "biomesoplenty:shortgrass" },
"variant=bush": { "model": "biomesoplenty:bush" },
"variant=berrybush": { "model": "biomesoplenty:berrybush" },
"variant=koru": { "model": "biomesoplenty:koru" },
"variant=devilweed": { "model": "biomesoplenty:devilweed" },
"variant=barley": { "model": "biomesoplenty:barley" },
"variant=dunegrass": { "model": "biomesoplenty:dunegrass" },
"variant=desertsprouts": { "model": "biomesoplenty:desertsprouts" },
"variant=desertgrass": { "model": "biomesoplenty:desertgrass" },
"variant=deadgrass": { "model": "biomesoplenty:deadgrass" },
"variant=spectralfern": { "model": "biomesoplenty:spectralfern" },
"variant=barley": { "model": "biomesoplenty:barley" }
"variant=devilweed": { "model": "biomesoplenty:devilweed" },
"variant=spectralfern": { "model": "biomesoplenty:spectralfern" }
}
}

View File

@ -1,5 +1,17 @@
advancements.biomesoplenty.root.title=Biomes O' Plenty
advancements.biomesoplenty.root.description=The explorer's dream...
advancements.biomesoplenty.evergreen_biomes.title=To the Key of Evergreen
advancements.biomesoplenty.evergreen_biomes.description=Discover all biomes with evergreen trees in Biomes O' Plenty
advancements.biomesoplenty.swamp_biomes.title=Swamp Fever
advancements.biomesoplenty.swamp_biomes.description=Discover all swampy biomes in Biomes O' Plenty
advancements.biomesoplenty.beach_island_biomes.title=Sail Away
advancements.biomesoplenty.beach_island_biomes.description=Discover all beach and island biomes in Biomes O' Plenty
advancements.biomesoplenty.magic_biomes.title=Yin and Yang
advancements.biomesoplenty.magic_biomes.description=Discover both magic biomes in Biomes O' Plenty
advancements.biomesoplenty.wasteland_biome.title=Wasteland
advancements.biomesoplenty.wasteland_biome.description=Discover the Wasteland biome in Biomes O' Plenty
advancements.biomesoplenty.nether_biomes.title=Nether
advancements.biomesoplenty.nether_biomes.description=Discover all Nether biomes in Biomes O' Plenty
advancements.biomesoplenty.all_biomes.title=Wanderer
advancements.biomesoplenty.all_biomes.description=Discover every biome in Biomes O' Plenty
@ -120,14 +132,12 @@ tile.flower_0.burning_blossom.name=Burning Blossom
tile.foliage_0.shortgrass.name=Short Grass
tile.foliage_0.bush.name=Bush
tile.foliage_0.berrybush.name=Berry Bush
tile.foliage_0.koru.name=Koru
tile.foliage_0.devilweed.name=Devilweed
tile.foliage_0.barley.name=Barley
tile.foliage_0.dunegrass.name=Dune Grass
tile.foliage_0.desertsprouts.name=Desert Sprouts
tile.foliage_0.desertgrass.name=Desert Grass
tile.foliage_0.deadgrass.name=Dead Grass
tile.foliage_0.devilweed.name=Devilweed
tile.foliage_0.spectralfern.name=Spectral Fern
tile.foliage_0.barley.name=Barley
tile.grass.origin_grass_block.name=Origin Grass Block
tile.grass.loamy_grass_block.name=Loamy Grass Block
tile.grass.sandy_grass_block.name=Sandy Grass Block

View File

@ -1,6 +0,0 @@
{
"parent": "block/cross",
"textures": {
"cross": "biomesoplenty:blocks/desertsprouts"
}
}

View File

@ -1,6 +0,0 @@
{
"parent": "block/tinted_cross",
"textures": {
"cross": "biomesoplenty:blocks/koru"
}
}

View File

@ -1,6 +0,0 @@
{
"parent": "item/generated",
"textures": {
"layer0": "biomesoplenty:blocks/desertsprouts"
}
}

View File

@ -1,6 +0,0 @@
{
"parent": "item/generated",
"textures": {
"layer0": "biomesoplenty:blocks/koru"
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 805 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 291 B