cn.nukkit.level.generator.object.tree.ObjectBigSpruceTree Maven / Gradle / Ivy
package cn.nukkit.level.generator.object.tree;
import cn.nukkit.api.PowerNukkitXOnly;
import cn.nukkit.api.Since;
import cn.nukkit.block.Block;
import cn.nukkit.level.ChunkManager;
import cn.nukkit.math.NukkitRandom;
/**
* @author DaPorkchop_ (Nukkit Project)
*/
public class ObjectBigSpruceTree extends ObjectSpruceTree {
private final float leafStartHeightMultiplier;
private final int baseLeafRadius;
public ObjectBigSpruceTree(float leafStartHeightMultiplier, int baseLeafRadius) {
this.leafStartHeightMultiplier = leafStartHeightMultiplier;
this.baseLeafRadius = baseLeafRadius;
}
@PowerNukkitXOnly
@Since("1.19.10-r2")
public void setRandomTreeHeight(NukkitRandom random) {
this.treeHeight = random.nextBoundedInt(15) + 20;
}
@Override
public void placeObject(ChunkManager level, int x, int y, int z, NukkitRandom random) {
if (this.treeHeight == 0) {
this.setRandomTreeHeight(random);
}
int topSize = this.treeHeight - (int) (this.treeHeight * leafStartHeightMultiplier);
int lRadius = baseLeafRadius + random.nextBoundedInt(2);
this.placeTrunk(level, x, y, z, random, this.getTreeHeight() - random.nextBoundedInt(3));
this.placeLeaves(level, topSize, lRadius, x, y, z, random);
}
@Override
protected void placeTrunk(ChunkManager level, int x, int y, int z, NukkitRandom random, int trunkHeight) {
// The base dirt block
level.setBlockAt(x, y - 1, z, Block.DIRT);
int radius = 2;
for (int yy = 0; yy < trunkHeight; ++yy) {
for (int xx = 0; xx < radius; xx++) {
for (int zz = 0; zz < radius; zz++) {
int blockId = level.getBlockIdAt(x, y + yy, z);
if (this.overridable(blockId)) {
level.setBlockAt(x + xx, y + yy, z + zz, this.getTrunkBlock(), this.getType());
}
}
}
}
}
@Override
public void placeLeaves(ChunkManager level, int topSize, int lRadius, int x, int y, int z, NukkitRandom random) {
int radius = random.nextBoundedInt(2);
int maxR = 1;
int minR = 0;
for (int yy = 0; yy <= topSize; ++yy) {
int yyy = y + this.treeHeight - yy;
for (int xx = x - radius; xx <= x + radius; ++xx) {
int xOff = Math.abs(xx - x);
for (int zz = z - radius; zz <= z + radius; ++zz) {
int zOff = Math.abs(zz - z);
if (xOff == radius && zOff == radius && radius > 0) {
continue;
}
if (!Block.isSolid(level.getBlockIdAt(xx, yyy, zz))) {
level.setBlockAt(xx, yyy, zz, this.getLeafBlock(), this.getType());
}
}
}
if (radius >= maxR) {
radius = minR;
minR = 1;
if (++maxR > lRadius) {
maxR = lRadius;
}
} else {
++radius;
}
}
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy