mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-17 14:21:08 +00:00
compile flora addon
This commit is contained in:
@@ -1,21 +1,17 @@
|
|||||||
package com.dfsek.terra.addons.flora;
|
package com.dfsek.terra.addons.flora;
|
||||||
|
|
||||||
|
import com.dfsek.terra.addons.flora.flora.TerraFlora;
|
||||||
import com.dfsek.terra.api.TerraPlugin;
|
import com.dfsek.terra.api.TerraPlugin;
|
||||||
import com.dfsek.terra.api.config.ConfigFactory;
|
import com.dfsek.terra.api.config.ConfigFactory;
|
||||||
import com.dfsek.terra.api.world.Flora;
|
import com.dfsek.terra.api.world.Flora;
|
||||||
import com.dfsek.terra.api.world.palette.NoisePalette;
|
|
||||||
import com.dfsek.terra.api.world.palette.PaletteImpl;
|
|
||||||
import com.dfsek.terra.api.world.palette.holder.PaletteLayerHolder;
|
|
||||||
import com.dfsek.terra.noise.samplers.noise.random.WhiteNoiseSampler;
|
|
||||||
import com.dfsek.terra.addons.flora.flora.TerraFlora;
|
|
||||||
|
|
||||||
public class FloraFactory implements ConfigFactory<FloraTemplate, Flora> {
|
public class FloraFactory implements ConfigFactory<FloraTemplate, Flora> {
|
||||||
@Override
|
@Override
|
||||||
public TerraFlora build(FloraTemplate config, TerraPlugin main) {
|
public TerraFlora build(FloraTemplate config, TerraPlugin main) {
|
||||||
PaletteImpl palette = new NoisePalette(new WhiteNoiseSampler(2403), false);
|
/*PaletteImpl palette = new NoisePalette(new WhiteNoiseSampler(2403), false);
|
||||||
for(PaletteLayerHolder layer : config.getFloraPalette()) {
|
for(PaletteLayerHolder layer : config.getFloraPalette()) {
|
||||||
palette.add(layer.getLayer(), layer.getSize(), layer.getSampler());
|
palette.add(layer.getLayer(), layer.getSize(), layer.getSampler());
|
||||||
}
|
}*/
|
||||||
return new TerraFlora(palette, config.doPhysics(), config.isCeiling(), config.getIrrigable(), config.getSpawnable(), config.getReplaceable(), config.getRotatable(), config.getMaxPlacements(), config.getSearch(), config.isSpawnBlacklist(), config.getIrrigableOffset(), main);
|
return new TerraFlora(null, config.doPhysics(), config.isCeiling(), config.getIrrigable(), config.getSpawnable(), config.getReplaceable(), config.getRotatable(), config.getMaxPlacements(), config.getSearch(), config.isSpawnBlacklist(), config.getIrrigableOffset(), main);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
package com.dfsek.terra.addons.flora;
|
|
||||||
|
|
||||||
import com.dfsek.tectonic.exception.ConfigException;
|
|
||||||
import com.dfsek.tectonic.exception.LoadException;
|
|
||||||
import com.dfsek.tectonic.loading.ConfigLoader;
|
|
||||||
import com.dfsek.tectonic.loading.TypeLoader;
|
|
||||||
import com.dfsek.terra.api.util.ProbabilityCollection;
|
|
||||||
import com.dfsek.terra.api.util.Range;
|
|
||||||
import com.dfsek.terra.api.util.seeded.NoiseSeeded;
|
|
||||||
import com.dfsek.terra.api.world.Flora;
|
|
||||||
import com.dfsek.terra.config.loaders.Types;
|
|
||||||
import com.dfsek.terra.noise.samplers.noise.random.WhiteNoiseSampler;
|
|
||||||
import com.dfsek.terra.addons.flora.flora.FloraLayer;
|
|
||||||
|
|
||||||
import java.lang.reflect.Type;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public class FloraLayerLoader implements TypeLoader<FloraLayer> {
|
|
||||||
@Override
|
|
||||||
public FloraLayer load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
|
|
||||||
Map<String, Object> map = (Map<String, Object>) o;
|
|
||||||
double density = ((Number) map.get("density")).doubleValue();
|
|
||||||
Range range = configLoader.loadClass(Range.class, map.get("y"));
|
|
||||||
if(range == null) throw new LoadException("Flora range unspecified");
|
|
||||||
ProbabilityCollection<Flora> items = (ProbabilityCollection<Flora>) configLoader.loadType(Types.FLORA_PROBABILITY_COLLECTION_TYPE, map.get("items"));
|
|
||||||
|
|
||||||
NoiseSeeded sampler;
|
|
||||||
if(map.containsKey("distribution")) {
|
|
||||||
try {
|
|
||||||
sampler = configLoader.loadClass(NoiseSeeded.class, map.get("distribution"));
|
|
||||||
} catch(ConfigException e) {
|
|
||||||
throw new LoadException("Unable to load noise", e);
|
|
||||||
}
|
|
||||||
return new FloraLayer(density, range, items, sampler.apply(2403L));
|
|
||||||
}
|
|
||||||
|
|
||||||
return new FloraLayer(density, range, items, new WhiteNoiseSampler(2403));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,22 +2,12 @@ package com.dfsek.terra.addons.flora;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.TerraPlugin;
|
import com.dfsek.terra.api.TerraPlugin;
|
||||||
import com.dfsek.terra.api.profiler.ProfileFrame;
|
import com.dfsek.terra.api.profiler.ProfileFrame;
|
||||||
import com.dfsek.terra.api.util.PopulationUtil;
|
|
||||||
import com.dfsek.terra.api.vector.Vector2;
|
|
||||||
import com.dfsek.terra.api.world.Chunk;
|
import com.dfsek.terra.api.world.Chunk;
|
||||||
import com.dfsek.terra.api.world.TerraWorld;
|
import com.dfsek.terra.api.world.TerraWorld;
|
||||||
import com.dfsek.terra.api.world.World;
|
import com.dfsek.terra.api.world.World;
|
||||||
import com.dfsek.terra.api.world.biome.UserDefinedBiome;
|
|
||||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
|
||||||
import com.dfsek.terra.api.world.generator.TerraBlockPopulator;
|
import com.dfsek.terra.api.world.generator.TerraBlockPopulator;
|
||||||
import com.dfsek.terra.addons.flora.flora.FloraLayer;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Random;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Populates Flora
|
* Populates Flora
|
||||||
*/
|
*/
|
||||||
@@ -33,6 +23,7 @@ public class FloraPopulator implements TerraBlockPopulator {
|
|||||||
public void populate(@NotNull World world, @NotNull Chunk chunk) {
|
public void populate(@NotNull World world, @NotNull Chunk chunk) {
|
||||||
TerraWorld tw = main.getWorld(world);
|
TerraWorld tw = main.getWorld(world);
|
||||||
try(ProfileFrame ignore = main.getProfiler().profile("flora")) {
|
try(ProfileFrame ignore = main.getProfiler().profile("flora")) {
|
||||||
|
/*
|
||||||
if(tw.getConfig().disableFlora()) return;
|
if(tw.getConfig().disableFlora()) return;
|
||||||
|
|
||||||
if(!tw.isSafe()) return;
|
if(!tw.isSafe()) return;
|
||||||
@@ -60,6 +51,7 @@ public class FloraPopulator implements TerraBlockPopulator {
|
|||||||
}
|
}
|
||||||
iter++;
|
iter++;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,12 +3,9 @@ package com.dfsek.terra.addons.flora;
|
|||||||
import com.dfsek.tectonic.annotations.Abstractable;
|
import com.dfsek.tectonic.annotations.Abstractable;
|
||||||
import com.dfsek.tectonic.annotations.Default;
|
import com.dfsek.tectonic.annotations.Default;
|
||||||
import com.dfsek.tectonic.annotations.Value;
|
import com.dfsek.tectonic.annotations.Value;
|
||||||
import com.dfsek.terra.api.config.AbstractableTemplate;
|
|
||||||
import com.dfsek.terra.api.util.collections.MaterialSet;
|
|
||||||
import com.dfsek.terra.api.world.palette.holder.PaletteLayerHolder;
|
|
||||||
import com.dfsek.terra.addons.flora.flora.TerraFlora;
|
import com.dfsek.terra.addons.flora.flora.TerraFlora;
|
||||||
|
import com.dfsek.terra.api.config.AbstractableTemplate;
|
||||||
import java.util.List;
|
import com.dfsek.terra.api.util.MaterialSet;
|
||||||
|
|
||||||
@SuppressWarnings({"FieldMayBeFinal", "unused"})
|
@SuppressWarnings({"FieldMayBeFinal", "unused"})
|
||||||
public class FloraTemplate implements AbstractableTemplate {
|
public class FloraTemplate implements AbstractableTemplate {
|
||||||
@@ -28,7 +25,7 @@ public class FloraTemplate implements AbstractableTemplate {
|
|||||||
@Value("replaceable")
|
@Value("replaceable")
|
||||||
@Abstractable
|
@Abstractable
|
||||||
@Default
|
@Default
|
||||||
private MaterialSet replaceable = new MaterialSet();
|
private MaterialSet replaceable = MaterialSet.empty();
|
||||||
|
|
||||||
@Value("irrigable")
|
@Value("irrigable")
|
||||||
@Abstractable
|
@Abstractable
|
||||||
@@ -38,11 +35,7 @@ public class FloraTemplate implements AbstractableTemplate {
|
|||||||
@Value("rotatable")
|
@Value("rotatable")
|
||||||
@Abstractable
|
@Abstractable
|
||||||
@Default
|
@Default
|
||||||
private MaterialSet rotatable = new MaterialSet();
|
private MaterialSet rotatable = MaterialSet.empty();
|
||||||
|
|
||||||
@Value("layers")
|
|
||||||
@Abstractable
|
|
||||||
private List<PaletteLayerHolder> palette;
|
|
||||||
|
|
||||||
@Value("physics")
|
@Value("physics")
|
||||||
@Abstractable
|
@Abstractable
|
||||||
@@ -97,10 +90,6 @@ public class FloraTemplate implements AbstractableTemplate {
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<PaletteLayerHolder> getFloraPalette() {
|
|
||||||
return palette;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean doPhysics() {
|
public boolean doPhysics() {
|
||||||
return doPhysics;
|
return doPhysics;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,28 +0,0 @@
|
|||||||
package com.dfsek.terra.addons.flora.flora;
|
|
||||||
|
|
||||||
import com.dfsek.terra.api.noise.NoiseSampler;
|
|
||||||
import com.dfsek.terra.api.util.ProbabilityCollection;
|
|
||||||
import com.dfsek.terra.api.util.Range;
|
|
||||||
import com.dfsek.terra.api.vector.Vector2;
|
|
||||||
import com.dfsek.terra.api.world.Chunk;
|
|
||||||
import com.dfsek.terra.api.world.Flora;
|
|
||||||
import com.dfsek.terra.world.population.items.PlaceableLayer;
|
|
||||||
|
|
||||||
public class FloraLayer extends PlaceableLayer<Flora> {
|
|
||||||
|
|
||||||
public FloraLayer(double density, Range level, ProbabilityCollection<Flora> layer, NoiseSampler noise) {
|
|
||||||
super(density, level, layer, noise);
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getDensity() {
|
|
||||||
return density;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void place(Chunk chunk, Vector2 coords) {
|
|
||||||
int cx = chunk.getX() << 4;
|
|
||||||
int cz = chunk.getZ() << 4;
|
|
||||||
Flora item = layer.get(noise, coords.getX() + cx, coords.getZ() + cz);
|
|
||||||
item.getValidSpawnsAt(chunk, (int) coords.getX(), (int) coords.getZ(), level).forEach(block -> item.plant(block.add(cx, 0, cz), chunk.getWorld()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+3
-3
@@ -4,9 +4,8 @@ import com.dfsek.terra.api.TerraPlugin;
|
|||||||
import com.dfsek.terra.api.block.state.BlockState;
|
import com.dfsek.terra.api.block.state.BlockState;
|
||||||
import com.dfsek.terra.api.block.state.properties.base.Properties;
|
import com.dfsek.terra.api.block.state.properties.base.Properties;
|
||||||
import com.dfsek.terra.api.block.state.properties.enums.Direction;
|
import com.dfsek.terra.api.block.state.properties.enums.Direction;
|
||||||
import com.dfsek.terra.api.util.FastRandom;
|
import com.dfsek.terra.api.util.MaterialSet;
|
||||||
import com.dfsek.terra.api.util.Range;
|
import com.dfsek.terra.api.util.Range;
|
||||||
import com.dfsek.terra.api.util.collections.MaterialSet;
|
|
||||||
import com.dfsek.terra.api.vector.Vector3;
|
import com.dfsek.terra.api.vector.Vector3;
|
||||||
import com.dfsek.terra.api.world.Chunk;
|
import com.dfsek.terra.api.world.Chunk;
|
||||||
import com.dfsek.terra.api.world.Flora;
|
import com.dfsek.terra.api.world.Flora;
|
||||||
@@ -17,6 +16,7 @@ import net.jafama.FastMath;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.EnumSet;
|
import java.util.EnumSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
public class TerraFlora implements Flora {
|
public class TerraFlora implements Flora {
|
||||||
private final Palette floraPalette;
|
private final Palette floraPalette;
|
||||||
@@ -104,7 +104,7 @@ public class TerraFlora implements Flora {
|
|||||||
int lvl = (FastMath.abs(i));
|
int lvl = (FastMath.abs(i));
|
||||||
BlockState data = floraPalette.get((ceiling ? lvl : size - lvl - 1), location.getX(), location.getY(), location.getZ()).clone();
|
BlockState data = floraPalette.get((ceiling ? lvl : size - lvl - 1), location.getX(), location.getY(), location.getZ()).clone();
|
||||||
if(doRotation) {
|
if(doRotation) {
|
||||||
Direction oneFace = new ArrayList<>(faces).get(new FastRandom(location.getBlockX() ^ location.getBlockZ()).nextInt(faces.size())); // Get random face.
|
Direction oneFace = new ArrayList<>(faces).get(new Random(location.getBlockX() ^ location.getBlockZ()).nextInt(faces.size())); // Get random face.
|
||||||
|
|
||||||
data.setIfPresent(Properties.DIRECTION, oneFace.opposite())
|
data.setIfPresent(Properties.DIRECTION, oneFace.opposite())
|
||||||
.setIfPresent(Properties.NORTH, faces.contains(Direction.NORTH))
|
.setIfPresent(Properties.NORTH, faces.contains(Direction.NORTH))
|
||||||
|
|||||||
@@ -2,7 +2,11 @@ package com.dfsek.terra.api.util;
|
|||||||
|
|
||||||
import com.dfsek.terra.api.block.BlockType;
|
import com.dfsek.terra.api.block.BlockType;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public interface MaterialSet extends Set<BlockType> {
|
public interface MaterialSet extends Set<BlockType> {
|
||||||
|
static MaterialSet empty() {
|
||||||
|
return (MaterialSet) (Object) Collections.emptySet();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user