mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-17 14:21:08 +00:00
Reimplement fractal trees
This commit is contained in:
@@ -6,6 +6,7 @@ import com.dfsek.terra.api.generic.TerraPlugin;
|
|||||||
import com.dfsek.terra.api.generic.world.block.BlockData;
|
import com.dfsek.terra.api.generic.world.block.BlockData;
|
||||||
import com.dfsek.terra.api.generic.world.block.MaterialData;
|
import com.dfsek.terra.api.generic.world.block.MaterialData;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Location;
|
import com.dfsek.terra.api.generic.world.vector.Location;
|
||||||
|
import com.dfsek.terra.util.MaterialSet;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -18,9 +19,11 @@ import java.util.function.Consumer;
|
|||||||
public abstract class FractalTree {
|
public abstract class FractalTree {
|
||||||
private final Map<Location, BlockData> treeAssembler = new HashMap<>();
|
private final Map<Location, BlockData> treeAssembler = new HashMap<>();
|
||||||
private final List<EntitySpawnHolder> entities = new GlueList<>();
|
private final List<EntitySpawnHolder> entities = new GlueList<>();
|
||||||
private final Location origin;
|
protected final Location origin;
|
||||||
private final Random random;
|
protected final Random random;
|
||||||
private final TerraPlugin main;
|
protected final TerraPlugin main;
|
||||||
|
|
||||||
|
public abstract MaterialSet getSpawnable();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a TreeGrower at an origin location.
|
* Instantiates a TreeGrower at an origin location.
|
||||||
|
|||||||
@@ -4,10 +4,17 @@ import com.dfsek.terra.api.gaea.tree.fractal.FractalTree;
|
|||||||
import com.dfsek.terra.api.generic.TerraPlugin;
|
import com.dfsek.terra.api.generic.TerraPlugin;
|
||||||
import com.dfsek.terra.api.generic.world.block.BlockData;
|
import com.dfsek.terra.api.generic.world.block.BlockData;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Location;
|
import com.dfsek.terra.api.generic.world.vector.Location;
|
||||||
|
import com.dfsek.terra.util.MaterialSet;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class Cactus extends FractalTree {
|
public class Cactus extends FractalTree {
|
||||||
|
@Override
|
||||||
|
public MaterialSet getSpawnable() {
|
||||||
|
return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:sand"),
|
||||||
|
main.getWorldHandle().createMaterialData("minecraft:red_sand"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a TreeGrower at an origin location.
|
* Instantiates a TreeGrower at an origin location.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle;
|
|||||||
import com.dfsek.terra.api.generic.world.block.BlockData;
|
import com.dfsek.terra.api.generic.world.block.BlockData;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Location;
|
import com.dfsek.terra.api.generic.world.vector.Location;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Vector3;
|
import com.dfsek.terra.api.generic.world.vector.Vector3;
|
||||||
|
import com.dfsek.terra.util.MaterialSet;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
@@ -16,6 +17,14 @@ public class IceSpike extends FractalTree {
|
|||||||
private final TreeGeometry geo;
|
private final TreeGeometry geo;
|
||||||
private final ProbabilityCollection<BlockData> ice;
|
private final ProbabilityCollection<BlockData> ice;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MaterialSet getSpawnable() {
|
||||||
|
return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:stone"),
|
||||||
|
main.getWorldHandle().createMaterialData("minecraft:gravel"),
|
||||||
|
main.getWorldHandle().createMaterialData("minecraft:snow_block"),
|
||||||
|
main.getWorldHandle().createMaterialData("minecraft:grass_block"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a TreeGrower at an origin location.
|
* Instantiates a TreeGrower at an origin location.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import com.dfsek.terra.api.generic.TerraPlugin;
|
|||||||
import com.dfsek.terra.api.generic.world.block.BlockData;
|
import com.dfsek.terra.api.generic.world.block.BlockData;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Location;
|
import com.dfsek.terra.api.generic.world.vector.Location;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Vector3;
|
import com.dfsek.terra.api.generic.world.vector.Vector3;
|
||||||
|
import com.dfsek.terra.util.MaterialSet;
|
||||||
import net.jafama.FastMath;
|
import net.jafama.FastMath;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
@@ -14,6 +15,12 @@ import java.util.Random;
|
|||||||
public class OakTree extends FractalTree {
|
public class OakTree extends FractalTree {
|
||||||
private final TreeGeometry geo;
|
private final TreeGeometry geo;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MaterialSet getSpawnable() {
|
||||||
|
return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:podzol"),
|
||||||
|
main.getWorldHandle().createMaterialData("minecraft:grass_block"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a TreeGrower at an origin location.
|
* Instantiates a TreeGrower at an origin location.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -4,10 +4,17 @@ import com.dfsek.terra.api.gaea.tree.fractal.FractalTree;
|
|||||||
import com.dfsek.terra.api.generic.TerraPlugin;
|
import com.dfsek.terra.api.generic.TerraPlugin;
|
||||||
import com.dfsek.terra.api.generic.world.block.BlockData;
|
import com.dfsek.terra.api.generic.world.block.BlockData;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Location;
|
import com.dfsek.terra.api.generic.world.vector.Location;
|
||||||
|
import com.dfsek.terra.util.MaterialSet;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class ShatteredPillar extends FractalTree {
|
public class ShatteredPillar extends FractalTree {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MaterialSet getSpawnable() {
|
||||||
|
return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:end_stone"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a TreeGrower at an origin location.
|
* Instantiates a TreeGrower at an origin location.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle;
|
|||||||
import com.dfsek.terra.api.generic.world.block.BlockData;
|
import com.dfsek.terra.api.generic.world.block.BlockData;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Location;
|
import com.dfsek.terra.api.generic.world.vector.Location;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Vector3;
|
import com.dfsek.terra.api.generic.world.vector.Vector3;
|
||||||
|
import com.dfsek.terra.util.MaterialSet;
|
||||||
import net.jafama.FastMath;
|
import net.jafama.FastMath;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
@@ -17,6 +18,11 @@ public class ShatteredTree extends FractalTree {
|
|||||||
private final ProbabilityCollection<BlockData> bark;
|
private final ProbabilityCollection<BlockData> bark;
|
||||||
private final ProbabilityCollection<BlockData> leaves;
|
private final ProbabilityCollection<BlockData> leaves;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MaterialSet getSpawnable() {
|
||||||
|
return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:end_stone"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a TreeGrower at an origin location.
|
* Instantiates a TreeGrower at an origin location.
|
||||||
*
|
*
|
||||||
|
|||||||
+7
@@ -4,10 +4,17 @@ import com.dfsek.terra.api.gaea.tree.fractal.FractalTree;
|
|||||||
import com.dfsek.terra.api.generic.TerraPlugin;
|
import com.dfsek.terra.api.generic.TerraPlugin;
|
||||||
import com.dfsek.terra.api.generic.world.block.BlockData;
|
import com.dfsek.terra.api.generic.world.block.BlockData;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Location;
|
import com.dfsek.terra.api.generic.world.vector.Location;
|
||||||
|
import com.dfsek.terra.util.MaterialSet;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
|
||||||
public class SmallShatteredPillar extends FractalTree {
|
public class SmallShatteredPillar extends FractalTree {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MaterialSet getSpawnable() {
|
||||||
|
return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:end_stone"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a TreeGrower at an origin location.
|
* Instantiates a TreeGrower at an origin location.
|
||||||
*
|
*
|
||||||
|
|||||||
+6
@@ -8,6 +8,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle;
|
|||||||
import com.dfsek.terra.api.generic.world.block.BlockData;
|
import com.dfsek.terra.api.generic.world.block.BlockData;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Location;
|
import com.dfsek.terra.api.generic.world.vector.Location;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Vector3;
|
import com.dfsek.terra.api.generic.world.vector.Vector3;
|
||||||
|
import com.dfsek.terra.util.MaterialSet;
|
||||||
import net.jafama.FastMath;
|
import net.jafama.FastMath;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
@@ -17,6 +18,11 @@ public class SmallShatteredTree extends FractalTree {
|
|||||||
private final ProbabilityCollection<BlockData> bark;
|
private final ProbabilityCollection<BlockData> bark;
|
||||||
private final ProbabilityCollection<BlockData> leaves;
|
private final ProbabilityCollection<BlockData> leaves;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MaterialSet getSpawnable() {
|
||||||
|
return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:end_stone"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a TreeGrower at an origin location.
|
* Instantiates a TreeGrower at an origin location.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import com.dfsek.terra.api.generic.TerraPlugin;
|
|||||||
import com.dfsek.terra.api.generic.world.block.BlockData;
|
import com.dfsek.terra.api.generic.world.block.BlockData;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Location;
|
import com.dfsek.terra.api.generic.world.vector.Location;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Vector3;
|
import com.dfsek.terra.api.generic.world.vector.Vector3;
|
||||||
|
import com.dfsek.terra.util.MaterialSet;
|
||||||
import net.jafama.FastMath;
|
import net.jafama.FastMath;
|
||||||
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
@@ -13,6 +14,12 @@ import java.util.Random;
|
|||||||
public class SpruceTree extends FractalTree {
|
public class SpruceTree extends FractalTree {
|
||||||
private final TreeGeometry geo;
|
private final TreeGeometry geo;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public MaterialSet getSpawnable() {
|
||||||
|
return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:podzol"),
|
||||||
|
main.getWorldHandle().createMaterialData("minecraft:grass_block"));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instantiates a TreeGrower at an origin location.
|
* Instantiates a TreeGrower at an origin location.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -89,7 +89,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
|
|||||||
@Default
|
@Default
|
||||||
private List<FloraLayer> flora = new GlueList<>();
|
private List<FloraLayer> flora = new GlueList<>();
|
||||||
|
|
||||||
//@Value("trees")
|
@Value("trees")
|
||||||
@Abstractable
|
@Abstractable
|
||||||
@Default
|
@Default
|
||||||
private List<TreeLayer> trees = new GlueList<>();
|
private List<TreeLayer> trees = new GlueList<>();
|
||||||
|
|||||||
@@ -1,10 +1,22 @@
|
|||||||
package com.dfsek.terra.registry;
|
package com.dfsek.terra.registry;
|
||||||
|
|
||||||
import com.dfsek.terra.api.gaea.tree.Tree;
|
import com.dfsek.terra.api.gaea.tree.Tree;
|
||||||
|
import com.dfsek.terra.api.gaea.tree.fractal.FractalTree;
|
||||||
|
import com.dfsek.terra.api.gaea.tree.fractal.trees.Cactus;
|
||||||
|
import com.dfsek.terra.api.gaea.tree.fractal.trees.OakTree;
|
||||||
|
import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredPillar;
|
||||||
|
import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredTree;
|
||||||
|
import com.dfsek.terra.api.gaea.tree.fractal.trees.SmallShatteredPillar;
|
||||||
|
import com.dfsek.terra.api.gaea.tree.fractal.trees.SmallShatteredTree;
|
||||||
|
import com.dfsek.terra.api.gaea.tree.fractal.trees.SpruceTree;
|
||||||
import com.dfsek.terra.api.generic.TerraPlugin;
|
import com.dfsek.terra.api.generic.TerraPlugin;
|
||||||
|
import com.dfsek.terra.api.generic.world.WorldHandle;
|
||||||
import com.dfsek.terra.api.generic.world.block.MaterialData;
|
import com.dfsek.terra.api.generic.world.block.MaterialData;
|
||||||
import com.dfsek.terra.api.generic.world.vector.Location;
|
import com.dfsek.terra.api.generic.world.vector.Location;
|
||||||
|
import com.dfsek.terra.util.MaterialSet;
|
||||||
|
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
@@ -16,6 +28,27 @@ public class TreeRegistry extends TerraRegistry<Tree> {
|
|||||||
addTree("ACACIA");
|
addTree("ACACIA");
|
||||||
addTree("BIRCH");
|
addTree("BIRCH");
|
||||||
addTree("BROWN_MUSHROOM");
|
addTree("BROWN_MUSHROOM");
|
||||||
|
tryAdd("CACTUS", Cactus.class);
|
||||||
|
addTree("CHORUS_PLANT");
|
||||||
|
addTree("DARK_OAK");
|
||||||
|
tryAdd("GIANT_OAK", OakTree.class);
|
||||||
|
tryAdd("GIANT_SPRUCE", SpruceTree.class);
|
||||||
|
addTree("JUNGLE");
|
||||||
|
addTree("JUNGLE_COCOA");
|
||||||
|
addTree("JUNGLE_BUSH");
|
||||||
|
addTree("LARGE_OAK");
|
||||||
|
tryAdd("LARGE_SHATTERED_PILLAR", ShatteredPillar.class);
|
||||||
|
addTree("LARGE_SPRUCE");
|
||||||
|
addTree("MEGA_SPRUCE");
|
||||||
|
addTree("OAK");
|
||||||
|
addTree("RED_MUSHROOM");
|
||||||
|
tryAdd("SHATTERED_LARGE", ShatteredTree.class);
|
||||||
|
tryAdd("SHATTERED_SMALL", SmallShatteredTree.class);
|
||||||
|
addTree("SMALL_JUNGLE");
|
||||||
|
addTree("SPRUCE");
|
||||||
|
addTree("SWAMP_OAK");
|
||||||
|
tryAdd("SMALL_SHATTERED_PILLAR", SmallShatteredPillar.class);
|
||||||
|
addTree("TALL_BIRCH");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addTree(String id) {
|
private void addTree(String id) {
|
||||||
@@ -26,16 +59,41 @@ public class TreeRegistry extends TerraRegistry<Tree> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final class FractalTreeHolder implements Tree {
|
private void tryAdd(String id, Class<? extends FractalTree> value) {
|
||||||
|
try {
|
||||||
|
add(id, new FractalTreeHolder(value));
|
||||||
|
} catch(Exception e) {
|
||||||
|
main.getLogger().warning("Unable to load tree " + id + ": " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private final class FractalTreeHolder implements Tree { // TODO: this is jank and should be replaced later.
|
||||||
|
private final Constructor<? extends FractalTree> constructor;
|
||||||
|
private final MaterialSet set;
|
||||||
|
|
||||||
|
private FractalTreeHolder(Class<? extends FractalTree> clazz) throws NoSuchMethodException {
|
||||||
|
constructor = clazz.getConstructor(Location.class, Random.class, TerraPlugin.class);
|
||||||
|
WorldHandle h = main.getWorldHandle();
|
||||||
|
set = MaterialSet.get(h.createMaterialData("minecraft:grass_block"), h.createMaterialData("minecraft:snow_block")); // TODO: actually implement
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean plant(Location l, Random r) {
|
public boolean plant(Location l, Random r) {
|
||||||
return false;
|
try {
|
||||||
|
FractalTree tree = constructor.newInstance(l, r, main);
|
||||||
|
if(!getSpawnable().contains(l.subtract(0, 1, 0).getBlock().getType())) return false;
|
||||||
|
tree.grow();
|
||||||
|
tree.plant();
|
||||||
|
return true;
|
||||||
|
} catch(InstantiationException | IllegalAccessException | InvocationTargetException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<MaterialData> getSpawnable() {
|
public Set<MaterialData> getSpawnable() {
|
||||||
return null;
|
return set;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -24,7 +24,7 @@ public class FabricBlockData implements BlockData {
|
|||||||
@Override
|
@Override
|
||||||
public BlockData clone() {
|
public BlockData clone() {
|
||||||
try {
|
try {
|
||||||
return (BlockData) super.clone();
|
return (FabricBlockData) super.clone();
|
||||||
} catch(CloneNotSupportedException e) {
|
} catch(CloneNotSupportedException e) {
|
||||||
throw new Error(e);
|
throw new Error(e);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user