From 4ddace2a92c5f634d24eb69996afedbe9d88ea93 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 28 Nov 2020 02:03:05 -0700 Subject: [PATCH] Flora --- lib/Tectonic-0.1.0.jar | Bin 30199 -> 30197 bytes .../dfsek/terra/config/base/ConfigPack.java | 17 ++++++++- .../terra/config/factories/FloraFactory.java | 20 +++++++++++ .../config/loaders/FloraLayerLoader.java | 33 ++++++++++++++++++ .../com/dfsek/terra/config/loaders/Types.java | 4 +++ .../terra/config/templates/BiomeTemplate.java | 16 +++++++-- .../terra/config/templates/FloraTemplate.java | 27 +++++++++----- .../generation/items/flora/FloraLayer.java | 33 ++++++++++++++++++ .../items/{ => flora}/TerraFlora.java | 2 +- .../terra/population/FloraPopulator.java | 25 +++---------- .../java/com/dfsek/terra/util/ConfigUtil.java | 5 ++- 11 files changed, 147 insertions(+), 35 deletions(-) create mode 100644 src/main/java/com/dfsek/terra/config/factories/FloraFactory.java create mode 100644 src/main/java/com/dfsek/terra/config/loaders/FloraLayerLoader.java create mode 100644 src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java rename src/main/java/com/dfsek/terra/generation/items/{ => flora}/TerraFlora.java (98%) diff --git a/lib/Tectonic-0.1.0.jar b/lib/Tectonic-0.1.0.jar index abcd04c58d5b1ab7ba1238d0949c6e728737c854..cfd1c45a6a032cc636556c8ab8a2c251cf248169 100644 GIT binary patch delta 4685 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 Wn~4D_*?9@cv+p(|2(<5fzWXo!6&76p delta 4661 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 diff --git a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index f4be5e8bc..08ba46ba8 100644 --- a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -11,22 +11,26 @@ import com.dfsek.terra.config.exception.FileMissingException; import com.dfsek.terra.config.factories.BiomeFactory; import com.dfsek.terra.config.factories.BiomeGridFactory; import com.dfsek.terra.config.factories.CarverFactory; +import com.dfsek.terra.config.factories.FloraFactory; import com.dfsek.terra.config.factories.PaletteFactory; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.loaders.NoiseBuilderLoader; import com.dfsek.terra.config.templates.BiomeGridTemplate; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.CarverTemplate; +import com.dfsek.terra.config.templates.FloraTemplate; import com.dfsek.terra.config.templates.PaletteTemplate; import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.generation.config.NoiseBuilder; import com.dfsek.terra.registry.BiomeGridRegistry; import com.dfsek.terra.registry.BiomeRegistry; import com.dfsek.terra.registry.CarverRegistry; +import com.dfsek.terra.registry.FloraRegistry; import com.dfsek.terra.registry.PaletteRegistry; import com.dfsek.terra.registry.StructureRegistry; import com.dfsek.terra.util.ConfigUtil; import org.polydev.gaea.biome.Biome; +import org.polydev.gaea.world.Flora; import org.polydev.gaea.world.palette.Palette; import parsii.eval.Scope; @@ -50,6 +54,7 @@ public class ConfigPack { private final StructureRegistry structureRegistry = new StructureRegistry(); private final CarverRegistry carverRegistry = new CarverRegistry(); private final PaletteRegistry paletteRegistry = new PaletteRegistry(); + private final FloraRegistry floraRegistry = new FloraRegistry(); private final Scope varScope; @@ -77,7 +82,8 @@ public class ConfigPack { abstractConfigLoader .registerLoader(Palette.class, paletteRegistry) .registerLoader(Biome.class, biomeRegistry) - .registerLoader(UserDefinedCarver.class, carverRegistry); + .registerLoader(UserDefinedCarver.class, carverRegistry) + .registerLoader(Flora.class, floraRegistry); ConfigUtil.registerAllLoaders(abstractConfigLoader); List paletteTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "palettes").toPath()), PaletteTemplate::new); @@ -87,6 +93,13 @@ public class ConfigPack { Debug.info("Loaded palette " + palette.getID()); }); + List floraTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "flora").toPath()), FloraTemplate::new); + FloraFactory floraFactory = new FloraFactory(); + floraTemplates.forEach(flora -> { + floraRegistry.add(flora.getID(), floraFactory.build(flora)); + Debug.info("Loaded flora " + flora.getID()); + }); + List structureTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "structures/single").toPath()), StructureTemplate::new); structureTemplates.forEach(structure -> { structureRegistry.add(structure.getID(), structure); @@ -105,6 +118,8 @@ public class ConfigPack { biomeTemplates.forEach(biome -> { biomeRegistry.add(biome.getID(), biomeFactory.build(biome)); Debug.info("Loaded biome " + biome.getID()); + Debug.info("Flora: " + biome.getFlora()); + Debug.info("Carvers: " + biome.getCarvers()); }); List biomeGridTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "grids").toPath()), BiomeGridTemplate::new); diff --git a/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java b/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java new file mode 100644 index 000000000..88e43e16c --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.config.factories; + +import com.dfsek.terra.biome.palette.PaletteLayer; +import com.dfsek.terra.config.templates.FloraTemplate; +import com.dfsek.terra.generation.items.flora.TerraFlora; +import org.bukkit.block.data.BlockData; +import org.polydev.gaea.util.FastRandom; +import org.polydev.gaea.world.palette.Palette; +import org.polydev.gaea.world.palette.RandomPalette; + +public class FloraFactory implements TerraFactory { + @Override + public TerraFlora build(FloraTemplate config) { + Palette palette = new RandomPalette<>(new FastRandom(2403)); + for(PaletteLayer layer : config.getFloraPalette()) { + palette.add(layer.getLayer(), layer.getSize()); + } + return new TerraFlora(palette, config.doPhysics(), config.isCeiling(), config.getIrrigable(), config.getSpawnable(), config.getReplaceable()); + } +} diff --git a/src/main/java/com/dfsek/terra/config/loaders/FloraLayerLoader.java b/src/main/java/com/dfsek/terra/config/loaders/FloraLayerLoader.java new file mode 100644 index 000000000..b79650e89 --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/loaders/FloraLayerLoader.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.config.loaders; + +import com.dfsek.tectonic.exception.LoadException; +import com.dfsek.tectonic.loading.ConfigLoader; +import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.generation.items.flora.FloraLayer; +import org.polydev.gaea.math.FastNoiseLite; +import org.polydev.gaea.math.ProbabilityCollection; +import org.polydev.gaea.math.Range; +import org.polydev.gaea.world.Flora; + +import java.lang.reflect.Type; +import java.util.Map; + +@SuppressWarnings("unchecked") +public class FloraLayerLoader implements TypeLoader { + @Override + public FloraLayer load(Type type, Object o, ConfigLoader configLoader) throws LoadException { + Map map = (Map) o; + int density = (Integer) map.get("density"); + Range range = (Range) configLoader.loadType(Range.class, map.get("y")); + if(range == null) throw new LoadException("Flora range unspecified"); + ProbabilityCollection items = (ProbabilityCollection) configLoader.loadType(Types.FLORA_PROBABILITY_COLLECTION_TYPE, map.get("items")); + + if(map.containsKey("simplex-frequency")) { + FastNoiseLite noiseLite = new FastNoiseLite(); + noiseLite.setFrequency((Double) map.get("simplex-frequency")); + return new FloraLayer(density, range, items, noiseLite); + } + + return new FloraLayer(density, range, items, null); + } +} diff --git a/src/main/java/com/dfsek/terra/config/loaders/Types.java b/src/main/java/com/dfsek/terra/config/loaders/Types.java index da85047fe..b1ce95e9d 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/Types.java +++ b/src/main/java/com/dfsek/terra/config/loaders/Types.java @@ -3,6 +3,7 @@ package com.dfsek.terra.config.loaders; import org.bukkit.Material; import org.bukkit.block.data.BlockData; import org.polydev.gaea.math.ProbabilityCollection; +import org.polydev.gaea.world.Flora; import org.polydev.gaea.world.palette.Palette; import java.lang.reflect.Type; @@ -17,18 +18,21 @@ public final class Types { public static final Type MATERIAL_PROBABILITY_COLLECTION_TYPE; public static final Type BLOCK_DATA_PALETTE_TYPE; public static final Type BLOCK_DATA_PROBABILITY_COLLECTION_TYPE; + public static final Type FLORA_PROBABILITY_COLLECTION_TYPE; static { MATERIAL_SET_TYPE = getType("materialSet"); MATERIAL_PROBABILITY_COLLECTION_TYPE = getType("materialProbabilityCollection"); BLOCK_DATA_PALETTE_TYPE = getType("blockDataPalette"); BLOCK_DATA_PROBABILITY_COLLECTION_TYPE = getType("blockDataProbabilityCollection"); + FLORA_PROBABILITY_COLLECTION_TYPE = getType("floraProbabilityCollection"); } private Set materialSet; private Palette blockDataPalette; private ProbabilityCollection materialProbabilityCollection; private ProbabilityCollection blockDataProbabilityCollection; + private ProbabilityCollection floraProbabilityCollection; private static Type getType(String dummyFieldName) { try { diff --git a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index 1e5a8a111..c3f2e7bf8 100644 --- a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -8,6 +8,7 @@ import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.biome.palette.SinglePalette; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; +import com.dfsek.terra.generation.items.flora.FloraLayer; import com.dfsek.terra.generation.items.ores.Ore; import com.dfsek.terra.structure.TerraStructure; import org.bukkit.Material; @@ -51,9 +52,9 @@ public class BiomeTemplate implements ConfigTemplate { @Value("noise-equation") @Abstractable private String noiseEquation; - @Value("ores") - @Abstractable - @Default + //@Value("ores") + //@Abstractable + //@Default private List ores = new GlueList<>(); @Value("ocean.level") @Abstractable @@ -76,6 +77,11 @@ public class BiomeTemplate implements ConfigTemplate { @Abstractable private String elevationEquation = null; + @Value("flora") + @Abstractable + @Default + private List flora = new GlueList<>(); + @Value("slabs.enable") @Abstractable @Default @@ -100,6 +106,10 @@ public class BiomeTemplate implements ConfigTemplate { return slabThreshold; } + public List getFlora() { + return flora; + } + public boolean doSlabs() { return doSlabs; } diff --git a/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java b/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java index 06390e7ac..4f8e37019 100644 --- a/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java @@ -4,11 +4,11 @@ import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.terra.biome.palette.PaletteHolder; +import com.dfsek.terra.biome.palette.PaletteLayer; import com.google.common.collect.Sets; import org.bukkit.Material; -import org.bukkit.block.data.BlockData; +import java.util.List; import java.util.Set; @SuppressWarnings({"FieldMayBeFinal", "unused"}) @@ -18,16 +18,21 @@ public class FloraTemplate implements ConfigTemplate { @Value("spawnable") @Abstractable - private Set spawnable; + private Set spawnable; @Value("replaceable") @Abstractable @Default - private Set replaceable = Sets.newHashSet(Material.AIR.createBlockData()); + private Set replaceable = Sets.newHashSet(Material.AIR); + + @Value("irrigable") + @Abstractable + @Default + private Set irrigable = null; @Value("layers") @Abstractable - private PaletteHolder floraPalette; + private List palette; @Value("physics") @Abstractable @@ -39,20 +44,24 @@ public class FloraTemplate implements ConfigTemplate { @Default private boolean ceiling = false; - public Set getReplaceable() { + public Set getReplaceable() { return replaceable; } - public Set getSpawnable() { + public Set getSpawnable() { return spawnable; } + public Set getIrrigable() { + return irrigable; + } + public String getID() { return id; } - public PaletteHolder getFloraPalette() { - return floraPalette; + public List getFloraPalette() { + return palette; } public boolean doPhysics() { diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java b/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java new file mode 100644 index 000000000..13fbedd49 --- /dev/null +++ b/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.generation.items.flora; + +import com.dfsek.terra.procgen.math.Vector2; +import org.bukkit.Chunk; +import org.polydev.gaea.math.FastNoiseLite; +import org.polydev.gaea.math.ProbabilityCollection; +import org.polydev.gaea.math.Range; +import org.polydev.gaea.world.Flora; + +import java.util.Random; + +public class FloraLayer { + private final double density; + private final Range level; + private final ProbabilityCollection layer; + private final FastNoiseLite noise; + + public FloraLayer(double density, Range level, ProbabilityCollection layer, FastNoiseLite noise) { + this.density = density; + this.level = level; + this.layer = layer; + this.noise = noise; + } + + public double getDensity() { + return density; + } + + public void plant(Chunk chunk, Vector2 coords, Random random) { + Flora item = noise == null ? layer.get(random) : layer.get(noise, (chunk.getX() << 4) + coords.getX(), (chunk.getZ() << 4) + coords.getZ()); + item.getValidSpawnsAt(chunk, (int) coords.getX(), (int) coords.getZ(), level).forEach(block -> item.plant(block.getLocation())); + } +} diff --git a/src/main/java/com/dfsek/terra/generation/items/TerraFlora.java b/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java similarity index 98% rename from src/main/java/com/dfsek/terra/generation/items/TerraFlora.java rename to src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java index b77b3313e..dbbd087f2 100644 --- a/src/main/java/com/dfsek/terra/generation/items/TerraFlora.java +++ b/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.generation.items; +package com.dfsek.terra.generation.items.flora; import net.jafama.FastMath; import org.bukkit.Chunk; diff --git a/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/src/main/java/com/dfsek/terra/population/FloraPopulator.java index c4b6e500f..b5412b67e 100644 --- a/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -4,7 +4,7 @@ import com.dfsek.terra.TerraProfiler; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.TerraBiomeGrid; -import com.dfsek.terra.config.templates.BiomeTemplate; +import com.dfsek.terra.procgen.math.Vector2; import org.bukkit.Chunk; import org.bukkit.World; import org.jetbrains.annotations.NotNull; @@ -24,29 +24,14 @@ public class FloraPopulator extends GaeaBlockPopulator { try(ProfileFuture ignored = TerraProfiler.fromWorld(world).measure("FloraTime")) { TerraWorld tw = TerraWorld.getWorld(world); if(!tw.isSafe()) return; - int originX = chunk.getX() << 4; - int originZ = chunk.getZ() << 4; TerraBiomeGrid grid = tw.getGrid(); for(int x = 0; x < 16; x++) { for(int z = 0; z < 16; z++) { UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z, GenerationPhase.POPULATE); - if(biome.getDecorator().getFloraChance() <= 0) continue; - try { - BiomeTemplate c = biome.getConfig(); - /* - for(int i = 0; i < 0; i++) { - Flora item; - if(f.isFloraSimplex()) - item = biome.getDecorator().getFlora().get(f.getFloraNoise(), originX + x, originZ + z); - else item = biome.getDecorator().getFlora().get(random); - for(Block highest : item.getValidSpawnsAt(chunk, x, z, c.getFloraHeights(item))) { - if(random.nextInt(100) < biome.getDecorator().getFloraChance()) - item.plant(highest.getLocation()); - } - } - */ - } catch(NullPointerException ignore) { - } + Vector2 l = new Vector2(x, z); + biome.getConfig().getFlora().forEach(layer -> { + if(layer.getDensity() >= random.nextDouble() * 100D) layer.plant(chunk, l, random); + }); } } } diff --git a/src/main/java/com/dfsek/terra/util/ConfigUtil.java b/src/main/java/com/dfsek/terra/util/ConfigUtil.java index 4d985df7a..0889ac73f 100644 --- a/src/main/java/com/dfsek/terra/util/ConfigUtil.java +++ b/src/main/java/com/dfsek/terra/util/ConfigUtil.java @@ -5,6 +5,7 @@ import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.config.loaders.BlockDataLoader; +import com.dfsek.terra.config.loaders.FloraLayerLoader; import com.dfsek.terra.config.loaders.GridSpawnLoader; import com.dfsek.terra.config.loaders.MaterialLoader; import com.dfsek.terra.config.loaders.PaletteHolderLoader; @@ -13,6 +14,7 @@ import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; import com.dfsek.terra.config.loaders.RangeLoader; import com.dfsek.terra.config.loaders.VanillaBiomeLoader; import com.dfsek.terra.config.loaders.base.CarverPaletteLoader; +import com.dfsek.terra.generation.items.flora.FloraLayer; import com.dfsek.terra.procgen.GridSpawn; import org.bukkit.Material; import org.bukkit.block.Biome; @@ -63,6 +65,7 @@ public final class ConfigUtil { .registerLoader(PaletteLayer.class, new PaletteLayerLoader()) .registerLoader(Biome.class, new VanillaBiomeLoader()) .registerLoader(BlockData.class, new BlockDataLoader()) - .registerLoader(Material.class, new MaterialLoader()); + .registerLoader(Material.class, new MaterialLoader()) + .registerLoader(FloraLayer.class, new FloraLayerLoader()); } }