Improved the Bayou biome, allowed all BOP biomes to be spawned in

This commit is contained in:
Forstride 2019-08-10 01:29:48 -04:00
parent d664cd9e1e
commit 66d0c6e5c5
16 changed files with 263 additions and 27 deletions

View file

@ -67,6 +67,5 @@ public class AlpsBiome extends BiomeBOP
this.addWeight(BOPClimates.ICE_CAP, 5);
this.setBeachBiome((Biome)null);
this.setRiverBiome((Biome)null);
this.canSpawnInBiome = false;
}
}

View file

@ -70,8 +70,7 @@ public class AlpsFoothillsBiome extends BiomeBOP
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.ENDERMAN, 10, 1, 4));
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.WITCH, 5, 1, 1));
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.STRAY, 80, 4, 4));
this.canSpawnInBiome = false;
this.setBeachBiome((Biome)null);
this.setRiverBiome((Biome)null);
}

View file

@ -37,7 +37,7 @@ public class BayouBiome extends BiomeBOP
{
public BayouBiome()
{
super((new Biome.Builder()).surfaceBuilder(new ConfiguredSurfaceBuilder(SurfaceBuilder.DEFAULT, SurfaceBuilder.GRASS_DIRT_GRAVEL_CONFIG)).precipitation(Biome.RainType.RAIN).category(Biome.Category.SWAMP).depth(-0.225F).scale(-0.05F).temperature(0.95F).downfall(0.9F).waterColor(0x62AF6E).waterFogColor(0x0C2116).parent((String)null));
super((new Biome.Builder()).surfaceBuilder(new ConfiguredSurfaceBuilder(SurfaceBuilder.DEFAULT, SurfaceBuilder.GRASS_DIRT_GRAVEL_CONFIG)).precipitation(Biome.RainType.RAIN).category(Biome.Category.SWAMP).depth(-0.315F).scale(-0.05F).temperature(0.95F).downfall(0.9F).waterColor(0x62AF6E).waterFogColor(0x0C2116).parent((String)null));
// Structures
this.addStructure(Feature.SWAMP_HUT, IFeatureConfig.NO_FEATURE_CONFIG);
@ -52,13 +52,11 @@ public class BayouBiome extends BiomeBOP
DefaultBiomeFeatures.addOres(this);
DefaultBiomeFeatures.addSwampClayDisks(this);
this.addFeature(GenerationStage.Decoration.UNDERGROUND_ORES, Biome.createDecoratedFeature(Feature.DISK, new SphereReplaceConfig(BOPBlocks.mud.getDefaultState(), 6, 2, Lists.newArrayList(new BlockState[]{Blocks.DIRT.getDefaultState(), Blocks.GRASS_BLOCK.getDefaultState()})), Placement.COUNT_TOP_SOLID, new FrequencyConfig(3)));
////////////////////////////////////////////////////////////
// Vegetation
// Trees
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(Feature.RANDOM_SELECTOR, new MultipleRandomFeatureConfig(new Feature[]{BOPBiomeFeatures.SPARSE_OAK_TREE, BOPBiomeFeatures.TALL_WILLOW_TREE}, new IFeatureConfig[]{IFeatureConfig.NO_FEATURE_CONFIG, IFeatureConfig.NO_FEATURE_CONFIG}, new float[]{0.1F, 0.3F}, Feature.SWAMP_TREE, IFeatureConfig.NO_FEATURE_CONFIG), Placement.COUNT_EXTRA_HEIGHTMAP, new AtSurfaceWithExtraConfig(8, 0.7F, 1)));
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(Feature.RANDOM_SELECTOR, new MultipleRandomFeatureConfig(new Feature[]{BOPBiomeFeatures.CYPRESS_TREE_MEDIUM}, new IFeatureConfig[]{IFeatureConfig.NO_FEATURE_CONFIG}, new float[]{0.3F}, BOPBiomeFeatures.CYPRESS_TREE, IFeatureConfig.NO_FEATURE_CONFIG), Placement.COUNT_EXTRA_HEIGHTMAP, new AtSurfaceWithExtraConfig(4, 0.6F, 1)));
// Flowers and Foliage
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(new FernGrassFeature(NoFeatureConfig::deserialize), IFeatureConfig.NO_FEATURE_CONFIG, Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(12)));
@ -66,8 +64,8 @@ public class BayouBiome extends BiomeBOP
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(Feature.DOUBLE_PLANT, new DoublePlantConfig(Blocks.LARGE_FERN.getDefaultState()), Placement.COUNT_HEIGHTMAP_32, new FrequencyConfig(12)));
// Other Plants
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(Feature.BUSH, new BushConfig(BOPBlocks.cattail.getDefaultState()), Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(15)));
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(Feature.DOUBLE_PLANT, new DoublePlantConfig(BOPBlocks.tall_cattail.getDefaultState()), Placement.COUNT_HEIGHTMAP_32, new FrequencyConfig(8)));
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(Feature.BUSH, new BushConfig(BOPBlocks.cattail.getDefaultState()), Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(24)));
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(Feature.DOUBLE_PLANT, new DoublePlantConfig(BOPBlocks.tall_cattail.getDefaultState()), Placement.COUNT_HEIGHTMAP_32, new FrequencyConfig(12)));
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(Feature.REED, IFeatureConfig.NO_FEATURE_CONFIG, Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(10)));
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(Feature.BUSH, new BushConfig(Blocks.BROWN_MUSHROOM.getDefaultState()), Placement.CHANCE_HEIGHTMAP_DOUBLE, new ChanceConfig(4)));
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(Feature.BUSH, new BushConfig(Blocks.RED_MUSHROOM.getDefaultState()), Placement.CHANCE_HEIGHTMAP_DOUBLE, new ChanceConfig(8)));
@ -85,10 +83,6 @@ public class BayouBiome extends BiomeBOP
DefaultBiomeFeatures.addFreezeTopLayer(this);
// Entities
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.SHEEP, 12, 4, 4));
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.PIG, 10, 4, 4));
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.CHICKEN, 10, 4, 4));
this.addSpawn(EntityClassification.CREATURE, new Biome.SpawnListEntry(EntityType.COW, 8, 4, 4));
this.addSpawn(EntityClassification.AMBIENT, new Biome.SpawnListEntry(EntityType.BAT, 10, 8, 8));
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.SPIDER, 100, 4, 4));
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.ZOMBIE, 95, 4, 4));

View file

@ -57,7 +57,7 @@ public class BogBiome extends BiomeBOP
////////////////////////////////////////////////////////////
// Vegetation
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(Feature.RANDOM_SELECTOR, new MultipleRandomFeatureConfig(new Feature[]{BOPBiomeFeatures.SPRUCE_TWIGLET_TREE, BOPBiomeFeatures.MAPLE_TWIGLET_TREE, Feature.PINE_TREE}, new IFeatureConfig[]{IFeatureConfig.NO_FEATURE_CONFIG, IFeatureConfig.NO_FEATURE_CONFIG, IFeatureConfig.NO_FEATURE_CONFIG}, new float[]{0.4F, 0.6F, 0.1F}, BOPBiomeFeatures.TWIGLET_TREE, IFeatureConfig.NO_FEATURE_CONFIG), Placement.COUNT_EXTRA_HEIGHTMAP, new AtSurfaceWithExtraConfig(5, 0.4F, 1)));
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(Feature.RANDOM_SELECTOR, new MultipleRandomFeatureConfig(new Feature[]{BOPBiomeFeatures.SPRUCE_TWIGLET_TREE, BOPBiomeFeatures.MAPLE_TWIGLET_TREE}, new IFeatureConfig[]{IFeatureConfig.NO_FEATURE_CONFIG, IFeatureConfig.NO_FEATURE_CONFIG}, new float[]{0.4F, 0.6F}, BOPBiomeFeatures.TWIGLET_TREE, IFeatureConfig.NO_FEATURE_CONFIG), Placement.COUNT_EXTRA_HEIGHTMAP, new AtSurfaceWithExtraConfig(5, 0.4F, 1)));
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(new StandardGrassFeature(NoFeatureConfig::deserialize), IFeatureConfig.NO_FEATURE_CONFIG, Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(8)));
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(Feature.SWEET_BERRY_BUSH, IFeatureConfig.NO_FEATURE_CONFIG, Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(50)));
this.addFeature(GenerationStage.Decoration.VEGETAL_DECORATION, Biome.createDecoratedFeature(Feature.BUSH, new BushConfig(BOPBlocks.reed.getDefaultState()), Placement.COUNT_HEIGHTMAP_DOUBLE, new FrequencyConfig(35)));

View file

@ -85,7 +85,6 @@ public class ColdDesertBiome extends BiomeBOP
this.addWeight(BOPClimates.ICE_CAP, 10);
this.setBeachBiome((Biome)null);
this.setRiverBiome((Biome)null);
this.canSpawnInBiome = false;
}
@OnlyIn(Dist.CLIENT)

View file

@ -72,7 +72,5 @@ public class OasisBiome extends BiomeBOP
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.ENDERMAN, 10, 1, 4));
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.WITCH, 5, 1, 1));
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.HUSK, 80, 4, 4));
this.canSpawnInBiome = false;
}
}

View file

@ -82,6 +82,5 @@ public class OutbackBiome extends BiomeBOP
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.HUSK, 80, 4, 4));
this.addWeight(BOPClimates.HOT_DESERT, 7);
this.canSpawnInBiome = false;
}
}

View file

@ -84,6 +84,5 @@ public class OvergrownCliffsBiome extends BiomeBOP
this.addWeight(BOPClimates.TROPICAL, 1);
this.setBeachBiome((Biome)null);
this.canSpawnInBiome = false;
}
}

View file

@ -78,7 +78,6 @@ public class SilkgladeBiome extends BiomeBOP
this.addWeight(BOPClimates.DRY_TEMPERATE, 1);
this.setBeachBiome((Biome)null);
this.setRiverBiome((Biome)null);
this.canSpawnInBiome = false;
}
@OnlyIn(Dist.CLIENT)

View file

@ -70,8 +70,7 @@ public class VolcanoBiome extends BiomeBOP
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.SLIME, 100, 4, 4));
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.ENDERMAN, 10, 1, 4));
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.WITCH, 5, 1, 1));
this.canSpawnInBiome = false;
this.setRiverBiome((Biome)null);
this.setBeachBiome(BOPBiomes.volcano_edge);
}

View file

@ -76,8 +76,7 @@ public class VolcanoEdgeBiome extends BiomeBOP
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.SLIME, 100, 4, 4));
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.ENDERMAN, 10, 1, 4));
this.addSpawn(EntityClassification.MONSTER, new Biome.SpawnListEntry(EntityType.WITCH, 5, 1, 1));
this.canSpawnInBiome = false;
this.setRiverBiome((Biome)null);
this.setBeachBiome((Biome)null);
}

View file

@ -75,7 +75,6 @@ public class WastelandBiome extends BiomeBOP
this.addWeight(BOPClimates.HOT_DESERT, 1);
this.setBeachBiome(Biomes.DESERT);
this.setRiverBiome((Biome)null);
this.canSpawnInBiome = false;
}
@OnlyIn(Dist.CLIENT)

View file

@ -62,9 +62,10 @@ public class BOPBiomeFeatures
public static final AbstractTreeFeature<NoFeatureConfig> YELLOW_POPLAR_TREE = new PoplarTreeFeature.Builder().log(Blocks.BIRCH_LOG.getDefaultState()).leaves(BOPBlocks.yellow_autumn_leaves.getDefaultState()).minHeight(10).maxHeight(18).create();
//Swamp Trees
public static final AbstractTreeFeature<NoFeatureConfig> CYPRESS_TREE = new CypressTreeFeature.Builder().create();
public static final AbstractTreeFeature<NoFeatureConfig> CYPRESS_TREE_MEDIUM = new CypressTreeFeature.Builder().minHeight(15).maxHeight(25).trunkWidth(2).create();
public static final AbstractTreeFeature<NoFeatureConfig> TALL_SWAMP_TREE = new BasicTreeFeature.Builder().vine(Blocks.VINE.getDefaultState()).minHeight(8).maxHeight(12).maxLeavesRadius(2).leavesOffset(0).create();
public static final AbstractTreeFeature<NoFeatureConfig> WILLOW_TREE = new BasicTreeFeature.Builder().log(BOPBlocks.willow_log.getDefaultState()).leaves(BOPBlocks.willow_leaves.getDefaultState()).vine(BOPBlocks.willow_vine.getDefaultState()).minHeight(6).maxHeight(10).maxLeavesRadius(2).leavesOffset(0).create();
public static final AbstractTreeFeature<NoFeatureConfig> TALL_WILLOW_TREE = new BasicTreeFeature.Builder().log(BOPBlocks.willow_log.getDefaultState()).leaves(BOPBlocks.willow_leaves.getDefaultState()).vine(BOPBlocks.willow_vine.getDefaultState()).minHeight(10).maxHeight(16).maxLeavesRadius(2).leavesOffset(0).create();
//Sparse Trees
public static final AbstractTreeFeature<NoFeatureConfig> SPARSE_OAK_TREE = new BigTreeFeature.Builder().minHeight(7).maxHeight(12).foliageHeight(1).create();

View file

@ -0,0 +1,252 @@
/*******************************************************************************
* Copyright 2014-2019, 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.gen.feature.tree;
import biomesoplenty.api.block.BOPBlocks;
import biomesoplenty.common.util.biome.GeneratorUtil;
import biomesoplenty.common.util.block.IBlockPosQuery;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.SaplingBlock;
import net.minecraft.block.SeaGrassBlock;
import net.minecraft.block.material.Material;
import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.MutableBoundingBox;
import net.minecraft.world.IWorld;
import java.util.Random;
import java.util.Set;
public class CypressTreeFeature extends TreeFeatureBase
{
public static class Builder extends BuilderBase<Builder, CypressTreeFeature>
{
protected int trunkWidth;
public Builder trunkWidth(int a) {this.trunkWidth = a; return this;}
public Builder()
{
this.minHeight = 6;
this.maxHeight = 15;
this.placeOn = (world, pos) -> world.getBlockState(pos).canSustainPlant(world, pos, Direction.UP, (SaplingBlock)Blocks.OAK_SAPLING);
this.replace = (world, pos) -> world.getBlockState(pos).canBeReplacedByLeaves(world, pos) || world.getBlockState(pos).getMaterial() == Material.WATER;
this.log = BOPBlocks.willow_log.getDefaultState();
this.leaves = BOPBlocks.willow_leaves.getDefaultState();
this.vine = BOPBlocks.willow_vine.getDefaultState();
this.trunkWidth = 1;
}
@Override
public CypressTreeFeature create()
{
return new CypressTreeFeature(this.updateNeighbours, this.placeOn, this.replace, this.log, this.leaves, this.altLeaves, this.vine, this.hanging, this.trunkFruit, this.minHeight, this.maxHeight, this.trunkWidth);
}
}
private int trunkWidth = 1;
protected CypressTreeFeature(boolean notify, IBlockPosQuery placeOn, IBlockPosQuery replace, BlockState log, BlockState leaves, BlockState altLeaves, BlockState vine, BlockState hanging, BlockState trunkFruit, int minHeight, int maxHeight, int trunkWidth)
{
super(notify, placeOn, replace, log, leaves, altLeaves, vine, hanging, trunkFruit, minHeight, maxHeight);
this.trunkWidth = trunkWidth;
}
public boolean checkSpace(IWorld world, BlockPos pos, int baseHeight, int height)
{
for (int y = 0; y <= height; y++)
{
int trunkWidth = (this.trunkWidth * (height - y) / height) + 1;
int trunkStart = MathHelper.ceil(0.25D - trunkWidth / 2.0D);
int trunkEnd = MathHelper.floor(0.25D + trunkWidth / 2.0D);
// require 3x3 for the leaves, 1x1 for the trunk
int start = (y <= baseHeight ? trunkStart : trunkStart - 1);
int end = (y <= baseHeight ? trunkEnd : trunkEnd + 1);
for (int x = start; x <= end; x++)
{
for (int z = start; z <= end; 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;
}
}
}
}
BlockPos pos2 = pos.add(0, height - 2,0);
if (!world.getBlockState(pos2).canBeReplacedByLeaves(world, pos2))
{
return false;
}
return true;
}
// generates a layer of leafs
public void generateLeafLayer(IWorld world, Random rand, BlockPos pos, int leavesRadius, int trunkStart, int trunkEnd)
{
int start = trunkStart - leavesRadius;
int end = trunkEnd + leavesRadius;
for (int x = start; x <= end; x++)
{
for (int z = start; z <= end; z++)
{
// skip corners
if ((leavesRadius > 0 ) && (x == start || x == end) && (z == start || z == end)) {continue;}
int distFromTrunk = (x < 0 ? trunkStart - x : x - trunkEnd) + (z < 0 ? trunkStart - z : z - trunkEnd);
// set leaves as long as it's not too far from the trunk to survive
if (distFromTrunk <= 2)
{
this.setLeaves(world, pos.add(x, 0, z));
}
}
}
}
public void generateBranch(Set<BlockPos> changedBlocks, MutableBoundingBox boundingBox, IWorld world, Random rand, BlockPos pos, Direction direction, int length)
{
Direction.Axis axis = direction.getAxis();
Direction sideways = direction.rotateY();
for (int i = 1; i <= length; i++)
{
BlockPos pos1 = pos.offset(direction, i);
int r = (i == 1 || i == length) ? 1 : 2;
for (int j = -r; j <= r; j++)
{
if (i < length || rand.nextInt(2) == 0)
{
this.setLeaves(world, pos1.offset(sideways, j));
}
}
if (length - i > 2)
{
this.setLeaves(world, pos1.up());
this.setLeaves(world, pos1.up().offset(sideways, -1));
this.setLeaves(world, pos1.up().offset(sideways, 1));
this.setLog(changedBlocks, world, pos1, axis, boundingBox);
}
}
}
@Override
protected boolean place(Set<BlockPos> changedBlocks, IWorld world, Random random, BlockPos startPos, MutableBoundingBox boundingBox)
{
// Move down until we reach the ground
while (startPos.getY() > 1 && this.replace.matches(world, startPos) || world.getBlockState(startPos).getMaterial() == Material.LEAVES) {startPos = startPos.down();}
for (int x = 0; x <= this.trunkWidth - 1; x++)
{
for (int z = 0; z <= this.trunkWidth - 1; z++)
{
if (!this.placeOn.matches(world, startPos.add(x, 0, z)))
{
// Abandon if we can't place the tree on this block
return false;
}
}
}
// Choose heights
int height = GeneratorUtil.nextIntBetween(random, this.minHeight, this.maxHeight);
int baseHeight = GeneratorUtil.nextIntBetween(random, (int)(height * 0.6F), (int)(height * 0.4F));
int leavesHeight = height - baseHeight;
if (leavesHeight < 3) {return false;}
if (!this.checkSpace(world, startPos.up(), baseHeight, height))
{
// Abandon if there isn't enough room
return false;
}
// Start at the top of the tree
BlockPos pos = startPos.up(height);
// Leaves at the top
this.setLeaves(world, pos);
pos.down();
// Add layers of leaves
for (int i = 0; i < leavesHeight; i++)
{
int trunkWidth = (this.trunkWidth * i / height) + 1;
int trunkStart = MathHelper.ceil(0.25D - trunkWidth / 2.0D);
int trunkEnd = MathHelper.floor(0.25D + trunkWidth / 2.0D);
int radius = MathHelper.clamp(i, 0, 2);
if (i == leavesHeight - 1)
{
radius = 1;
}
if (radius == 0)
{
this.setLeaves(world, pos);
}
else if (radius < 2)
{
this.generateLeafLayer(world, random, pos, radius, trunkStart, trunkEnd);
}
else
{
this.generateBranch(changedBlocks, boundingBox, world, random, pos.add(trunkStart, 0, trunkStart), Direction.NORTH, radius);
this.generateBranch(changedBlocks, boundingBox, world, random, pos.add(trunkEnd, 0, trunkStart), Direction.EAST, radius);
this.generateBranch(changedBlocks, boundingBox, world, random, pos.add(trunkEnd, 0, trunkEnd), Direction.SOUTH, radius);
this.generateBranch(changedBlocks, boundingBox, world, random, pos.add(trunkStart, 0, trunkEnd), Direction.WEST, radius);
}
pos = pos.down();
}
// Generate the trunk
for (int y = 0; y < height - 1; y++)
{
int trunkWidth = (this.trunkWidth * (height - y) / height) + 1;
int trunkStart = MathHelper.ceil(0.25D - trunkWidth / 2.0D);
int trunkEnd = MathHelper.floor(0.25D + trunkWidth / 2.0D);
if (trunkWidth < 1)
{
trunkStart = 0;
trunkEnd = 0;
}
for (int x = trunkStart; x <= trunkEnd; x++)
{
for (int z = trunkStart; z <= trunkEnd; z++)
{
this.setLog(changedBlocks, world, startPos.add(x, y, z), boundingBox);
}
}
}
return true;
}
@Override
public boolean setLeaves(IWorld world, BlockPos pos)
{
if (world.getBlockState(pos).canBeReplacedByLeaves(world, pos))
{
this.setBlockState(world, pos, this.leaves);
return true;
}
return false;
}
}

View file

@ -206,7 +206,7 @@ public class RedwoodTreeFeature extends TreeFeatureBase
int trunkStart = MathHelper.ceil(0.25D - trunkWidth / 2.0D);
int trunkEnd = MathHelper.floor(0.25D + trunkWidth / 2.0D);
if (trunkWidth < 1 || trunkWidth > this.trunkWidth)
if (trunkWidth < 1)
{
trunkStart = 0;
trunkEnd = 0;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 292 B

After

Width:  |  Height:  |  Size: 291 B