They grow. But not sustain yet (
This commit is contained in:
parent
d6788c8da5
commit
c2e871a31b
3 changed files with 98 additions and 149 deletions
|
@ -28,7 +28,7 @@ import net.fabricmc.fabric.api.block.FabricBlockSettings;
|
||||||
import net.minecraft.block.Material;
|
import net.minecraft.block.Material;
|
||||||
import net.minecraft.block.SaplingBlock;
|
import net.minecraft.block.SaplingBlock;
|
||||||
import net.minecraft.sound.BlockSoundGroup;
|
import net.minecraft.sound.BlockSoundGroup;
|
||||||
import techreborn.world.RubberTreeGenerator;
|
import techreborn.world.RubberSaplingGenerator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by modmuss50 on 20/02/2016.
|
* Created by modmuss50 on 20/02/2016.
|
||||||
|
@ -36,6 +36,6 @@ import techreborn.world.RubberTreeGenerator;
|
||||||
public class BlockRubberSapling extends SaplingBlock {
|
public class BlockRubberSapling extends SaplingBlock {
|
||||||
|
|
||||||
public BlockRubberSapling() {
|
public BlockRubberSapling() {
|
||||||
super(new RubberTreeGenerator(), FabricBlockSettings.of(Material.PLANT).sounds(BlockSoundGroup.GRASS).build());
|
super(new RubberSaplingGenerator(), FabricBlockSettings.of(Material.PLANT).sounds(BlockSoundGroup.GRASS).build());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
package techreborn.world;
|
package techreborn.world;
|
||||||
|
|
||||||
import net.minecraft.block.sapling.SaplingGenerator;
|
import net.minecraft.block.sapling.SaplingGenerator;
|
||||||
import net.minecraft.world.IWorld;
|
|
||||||
import net.minecraft.world.gen.feature.AbstractTreeFeature;
|
import net.minecraft.world.gen.feature.AbstractTreeFeature;
|
||||||
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
|
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
|
||||||
|
|
||||||
|
@ -33,146 +32,8 @@ import javax.annotation.Nullable;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class RubberSaplingGenerator extends SaplingGenerator {
|
public class RubberSaplingGenerator extends SaplingGenerator {
|
||||||
|
|
||||||
boolean isWorldGen = true;
|
|
||||||
|
|
||||||
public RubberSaplingGenerator() {
|
|
||||||
super();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
|
||||||
protected AbstractTreeFeature<DefaultFeatureConfig> createTreeFeature(Random random) {
|
protected AbstractTreeFeature<DefaultFeatureConfig> createTreeFeature(Random random) {
|
||||||
return null;
|
return new RubberTreeFeature(DefaultFeatureConfig::deserialize, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public RubberSaplingGenerator(boolean isWorldGen) {
|
|
||||||
super();
|
|
||||||
this.isWorldGen = isWorldGen;
|
|
||||||
}
|
|
||||||
|
|
||||||
// @Override
|
|
||||||
// public boolean generate(World worldIn, Random rand, BlockPos position) {
|
|
||||||
// int retries = rand.nextInt(3) + 2;
|
|
||||||
// for (int c = 0; c < retries; c++) {
|
|
||||||
// int x = position.getX() + 8 + rand.nextInt(16);
|
|
||||||
// int z = position.getZ() + 8 + rand.nextInt(16);
|
|
||||||
// int y = worldIn.getHeight(x, z) - 1;
|
|
||||||
// while (worldIn.isAirBlock(new BlockPos(x, y, z)) && y > 0) {
|
|
||||||
// y--;
|
|
||||||
// }
|
|
||||||
// if (!growTree(worldIn, rand, x, y + 1, z)) {
|
|
||||||
// retries--;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
|
|
||||||
public boolean growTree(IWorld world, Random rand, int x, int y, int z) {
|
|
||||||
/*
|
|
||||||
int treeHeight = rand.nextInt(5) + TechReborn.worldGen.config.rubberTreeConfig.treeBaseHeight;
|
|
||||||
int worldHeight = world.getHeight();
|
|
||||||
if (y >= 1 && y + treeHeight + 1 <= worldHeight) {
|
|
||||||
int xOffset;
|
|
||||||
int yOffset;
|
|
||||||
int zOffset;
|
|
||||||
IBlockState baseSate = world.getBlockState(new BlockPos(x, y - 1, z));
|
|
||||||
Block baseBlock = baseSate.getBlock();
|
|
||||||
boolean hasPlacedBlock = false;
|
|
||||||
if (baseBlock != null && baseBlock.canSustainPlant(baseSate, world, new BlockPos(x, y - 1, z),
|
|
||||||
EnumFacing.UP, (IPlantable) TRContent.RUBBER_SAPLING) && y < worldHeight - treeHeight - 1) {
|
|
||||||
for (yOffset = y; yOffset <= y + 1 + treeHeight; ++yOffset) {
|
|
||||||
byte radius = 1;
|
|
||||||
if (yOffset == y) {
|
|
||||||
radius = 0;
|
|
||||||
}
|
|
||||||
if (yOffset >= y + 1 + treeHeight - 2) {
|
|
||||||
radius = 2;
|
|
||||||
}
|
|
||||||
if (yOffset >= 0 & yOffset < worldHeight) {
|
|
||||||
for (xOffset = x - radius; xOffset <= x + radius; ++xOffset) {
|
|
||||||
for (zOffset = z - radius; zOffset <= z + radius; ++zOffset) {
|
|
||||||
IBlockState state = world.getBlockState(new BlockPos(xOffset, yOffset, zOffset));
|
|
||||||
Block block = state.getBlock();
|
|
||||||
|
|
||||||
if (block != null
|
|
||||||
&& !(block.isLeaves(state, world, new BlockPos(xOffset, yOffset, zOffset))
|
|
||||||
|| block.isAir(state, world, new BlockPos(xOffset, yOffset, zOffset))
|
|
||||||
|| block.canBeReplacedByLeaves(state, world,
|
|
||||||
new BlockPos(xOffset, yOffset, zOffset)))) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BlockPos treeBase = new BlockPos(x, y, z);
|
|
||||||
BlockPos treeRoot = treeBase.down();
|
|
||||||
IBlockState state = world.getBlockState(treeRoot);
|
|
||||||
state.getBlock().onPlantGrow(state, world, treeRoot, treeBase);
|
|
||||||
for (yOffset = y - 3 + treeHeight; yOffset <= y + treeHeight; ++yOffset) {
|
|
||||||
int var12 = yOffset - (y + treeHeight), center = 1 - var12 / 2;
|
|
||||||
for (xOffset = x - center; xOffset <= x + center; ++xOffset) {
|
|
||||||
int xPos = xOffset - x, t = xPos >> 15;
|
|
||||||
xPos = (xPos + t) ^ t;
|
|
||||||
for (zOffset = z - center; zOffset <= z + center; ++zOffset) {
|
|
||||||
int zPos = zOffset - z;
|
|
||||||
zPos = (zPos + (t = zPos >> 31)) ^ t;
|
|
||||||
IBlockState state1 = world.getBlockState(new BlockPos(xOffset, yOffset, zOffset));
|
|
||||||
Block block = state1.getBlock();
|
|
||||||
if (((xPos != center | zPos != center) || rand.nextInt(2) != 0 && var12 != 0)
|
|
||||||
&& (block == null
|
|
||||||
|| block.isLeaves(state1, world, new BlockPos(xOffset, yOffset, zOffset))
|
|
||||||
|| block.isAir(state1, world, new BlockPos(xOffset, yOffset, zOffset))
|
|
||||||
|| block.canBeReplacedByLeaves(state1, world,
|
|
||||||
new BlockPos(xOffset, yOffset, zOffset)))) {
|
|
||||||
this.setBlockAndNotifyAdequately(world, new BlockPos(xOffset, yOffset, zOffset),
|
|
||||||
TRContent.RUBBER_LEAVES.getDefaultState().with(BlockRubberLeaves.DECAYABLE, true).with(BlockRubberLeaves.CHECK_DECAY, false));
|
|
||||||
hasPlacedBlock = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
BlockPos topLogPos = null;
|
|
||||||
for (yOffset = 0; yOffset < treeHeight; ++yOffset) {
|
|
||||||
BlockPos blockpos = new BlockPos(x, y + yOffset, z);
|
|
||||||
IBlockState state1 = world.getBlockState(blockpos);
|
|
||||||
Block block = state1.getBlock();
|
|
||||||
if (block == null || block.isAir(state1, world, blockpos) || block.isLeaves(state1, world, blockpos)
|
|
||||||
|| block.isReplaceable(world, blockpos)) {
|
|
||||||
IBlockState newState = TRContent.RUBBER_LOG.getDefaultState();
|
|
||||||
boolean isAddingSap = false;
|
|
||||||
if (rand.nextInt(TechReborn.worldGen.config.rubberTreeConfig.sapRarity) == 0) {
|
|
||||||
newState = newState.with(BlockRubberLog.HAS_SAP, true)
|
|
||||||
.with(BlockRubberLog.SAP_SIDE, EnumFacing.byHorizontalIndex(rand.nextInt(4)));
|
|
||||||
isAddingSap = true;
|
|
||||||
}
|
|
||||||
if (isAddingSap) {
|
|
||||||
world.setBlockState(blockpos, newState, 2);
|
|
||||||
} else {
|
|
||||||
this.setBlockAndNotifyAdequately(world, blockpos, newState);
|
|
||||||
}
|
|
||||||
hasPlacedBlock = true;
|
|
||||||
topLogPos = blockpos;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (topLogPos != null) {
|
|
||||||
for (int i = 0; i < TechReborn.worldGen.config.rubberTreeConfig.spireHeight; i++) {
|
|
||||||
BlockPos spikePos = topLogPos.up(i);
|
|
||||||
this.setBlockAndNotifyAdequately(world, spikePos, TRContent.RUBBER_LEAVES.getDefaultState()
|
|
||||||
.with(BlockRubberLeaves.DECAYABLE, true).with(BlockRubberLeaves.CHECK_DECAY, false));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return hasPlacedBlock;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,11 +30,15 @@ import java.util.function.Function;
|
||||||
|
|
||||||
import com.mojang.datafixers.Dynamic;
|
import com.mojang.datafixers.Dynamic;
|
||||||
|
|
||||||
|
import net.minecraft.block.BlockState;
|
||||||
import net.minecraft.util.math.BlockPos;
|
import net.minecraft.util.math.BlockPos;
|
||||||
|
import net.minecraft.util.math.Direction;
|
||||||
import net.minecraft.util.math.MutableIntBoundingBox;
|
import net.minecraft.util.math.MutableIntBoundingBox;
|
||||||
import net.minecraft.world.ModifiableTestableWorld;
|
import net.minecraft.world.ModifiableTestableWorld;
|
||||||
import net.minecraft.world.gen.feature.AbstractTreeFeature;
|
import net.minecraft.world.gen.feature.AbstractTreeFeature;
|
||||||
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
|
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
|
||||||
|
import techreborn.blocks.misc.BlockRubberLog;
|
||||||
|
import techreborn.init.TRContent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author drcrazy
|
* @author drcrazy
|
||||||
|
@ -42,16 +46,100 @@ import net.minecraft.world.gen.feature.DefaultFeatureConfig;
|
||||||
*/
|
*/
|
||||||
public class RubberTreeFeature extends AbstractTreeFeature<DefaultFeatureConfig> {
|
public class RubberTreeFeature extends AbstractTreeFeature<DefaultFeatureConfig> {
|
||||||
|
|
||||||
public RubberTreeFeature(Function<Dynamic<?>, ? extends DefaultFeatureConfig> featureConfig, boolean boolean_1) {
|
// TODO: Configs
|
||||||
super(featureConfig, boolean_1);
|
private int treeBaseHeight = 5;
|
||||||
// TODO Auto-generated constructor stub
|
private int sapRarity = 10;
|
||||||
|
private int spireHeight = 4;
|
||||||
|
|
||||||
|
|
||||||
|
public RubberTreeFeature(Function<Dynamic<?>, ? extends DefaultFeatureConfig> featureConfig, boolean notify) {
|
||||||
|
super(featureConfig, notify);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected boolean generate(Set<BlockPos> changedBlocks, ModifiableTestableWorld worldIn, Random rand, BlockPos saplingPos,
|
protected boolean generate(Set<BlockPos> changedBlocks, ModifiableTestableWorld worldIn, Random rand,
|
||||||
MutableIntBoundingBox var5) {
|
BlockPos saplingPos, MutableIntBoundingBox mutableBoundingBox) {
|
||||||
// TODO Auto-generated method stub
|
int treeHeight = rand.nextInt(5) + treeBaseHeight;
|
||||||
return false;
|
int baseY = saplingPos.getY();
|
||||||
|
int baseX = saplingPos.getX();
|
||||||
|
int baseZ = saplingPos.getZ();
|
||||||
|
if (baseY <= 1 && baseY + treeHeight + spireHeight + 1 >= 256) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isDirtOrGrass(worldIn, saplingPos.down())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
int yOffset;
|
||||||
|
int xOffset;
|
||||||
|
int zOffset;
|
||||||
|
for (yOffset = baseY; yOffset <= baseY + 1 + treeHeight; ++yOffset) {
|
||||||
|
byte radius = 1;
|
||||||
|
if (yOffset == baseY) {
|
||||||
|
radius = 0;
|
||||||
|
}
|
||||||
|
if (yOffset >= baseY + 1 + treeHeight - 2) {
|
||||||
|
radius = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
BlockPos.Mutable blockpos$mutable = new BlockPos.Mutable();
|
||||||
|
for (xOffset = baseX - radius; xOffset <= baseX + radius; ++xOffset) {
|
||||||
|
for (zOffset = baseZ - radius; zOffset <= baseZ + radius; ++zOffset) {
|
||||||
|
if (!isAirOrLeaves(worldIn, blockpos$mutable.set(xOffset, yOffset, zOffset))) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ok, we are cleared for take off!
|
||||||
|
this.setToDirt(worldIn, saplingPos.down());
|
||||||
|
|
||||||
|
// Leaves
|
||||||
|
BlockState leafState = TRContent.RUBBER_LEAVES.getDefaultState();
|
||||||
|
for (yOffset = baseY - 3 + treeHeight; yOffset <= baseY + treeHeight; ++yOffset) {
|
||||||
|
int var12 = yOffset - (baseY + treeHeight), center = 1 - var12 / 2;
|
||||||
|
for (xOffset = baseX - center; xOffset <= baseX + center; ++xOffset) {
|
||||||
|
int xPos = xOffset - baseX, t = xPos >> 15;
|
||||||
|
xPos = (xPos + t) ^ t;
|
||||||
|
for (zOffset = baseZ - center; zOffset <= baseZ + center; ++zOffset) {
|
||||||
|
int zPos = zOffset - baseZ;
|
||||||
|
zPos = (zPos + (t = zPos >> 31)) ^ t;
|
||||||
|
if ((xPos != center | zPos != center) || rand.nextInt(2) != 0 && var12 != 0) {
|
||||||
|
BlockPos leafPos = new BlockPos(xOffset, yOffset, zOffset);
|
||||||
|
if (isAirOrLeaves(worldIn, leafPos) || isReplaceablePlant(worldIn, leafPos)) {
|
||||||
|
this.setBlockState(changedBlocks, worldIn, leafPos, leafState, mutableBoundingBox);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Trunk
|
||||||
|
BlockPos currentLogPos = null;
|
||||||
|
BlockState logState = TRContent.RUBBER_LOG.getDefaultState();
|
||||||
|
for (yOffset = 0; yOffset < treeHeight; ++yOffset) {
|
||||||
|
currentLogPos = saplingPos.up(yOffset);
|
||||||
|
if (!isAirOrLeaves(worldIn, currentLogPos)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (rand.nextInt(sapRarity) == 0) {
|
||||||
|
logState = logState.with(BlockRubberLog.HAS_SAP, true).with(BlockRubberLog.SAP_SIDE,
|
||||||
|
Direction.fromHorizontal(rand.nextInt(4)));
|
||||||
|
}
|
||||||
|
this.setBlockState(changedBlocks, worldIn, currentLogPos, logState, mutableBoundingBox);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Spire
|
||||||
|
if (currentLogPos != null) {
|
||||||
|
for (int i = 0; i < spireHeight; i++) {
|
||||||
|
BlockPos blockpos = currentLogPos.up(i);
|
||||||
|
this.setBlockState(changedBlocks, worldIn, blockpos, leafState, mutableBoundingBox);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue