From 0d04871ca3f51444e566a3430f542c920a672138 Mon Sep 17 00:00:00 2001 From: tolziplohu Date: Tue, 10 Aug 2021 14:39:29 -0500 Subject: [PATCH 1/6] chore: remove dependency on AnotherWorld --- module.txt | 8 +-- .../terasology/gf/generator/BushFacet.java | 2 +- .../terasology/gf/generator/BushProvider.java | 16 ++--- .../terasology/gf/generator/FloraFacet.java | 2 +- .../gf/generator/FloraFeatureGenerator.java | 69 ++++++++----------- .../gf/generator/FloraProvider.java | 8 +-- .../terasology/gf/generator/FoliageFacet.java | 2 +- .../gf/generator/FoliageProvider.java | 16 ++--- .../StaticBlockFloraSpawnDefinition.java | 4 +- .../terasology/gf/generator/TreeFacet.java | 2 +- .../terasology/gf/generator/TreeProvider.java | 16 ++--- .../grass/AdvancedStagesGrowthDefinition.java | 6 +- .../grass/ReplaceBlockGrowthDefinition.java | 6 +- .../AdvancedLSystemTreeDefinition.java | 26 ++++--- .../SimpleAxionElementReplacement.java | 14 +++- .../gf/util/EnvironmentLocalParameters.java | 27 ++++++++ .../gf/util/GenerationLocalParameters.java | 31 +++++++++ .../terasology/gf/util/LocalParameters.java | 10 +++ 18 files changed, 167 insertions(+), 98 deletions(-) create mode 100644 src/main/java/org/terasology/gf/util/EnvironmentLocalParameters.java create mode 100644 src/main/java/org/terasology/gf/util/GenerationLocalParameters.java create mode 100644 src/main/java/org/terasology/gf/util/LocalParameters.java diff --git a/module.txt b/module.txt index dfca25b..f51ca94 100644 --- a/module.txt +++ b/module.txt @@ -5,10 +5,6 @@ "displayName": "Growing Flora", "description": "Module providing mechanisms for growing plants (trees, bushes, crops)", "dependencies": [ - { - "id": "AnotherWorld", - "minVersion": "1.0.0" - }, { "id": "BiomesAPI", "minVersion": "4.0.0" @@ -21,6 +17,10 @@ "id": "CoreAssets", "minVersion": "2.0.1" }, + { + "id": "CoreWorlds", + "minVersion": "2.0.1" + }, { "id": "Inventory", "minVersion": "1.1.0" diff --git a/src/main/java/org/terasology/gf/generator/BushFacet.java b/src/main/java/org/terasology/gf/generator/BushFacet.java index 1461362..170f736 100644 --- a/src/main/java/org/terasology/gf/generator/BushFacet.java +++ b/src/main/java/org/terasology/gf/generator/BushFacet.java @@ -15,7 +15,7 @@ */ package org.terasology.gf.generator; -import org.terasology.anotherWorld.SparseObjectFacet3D; +import org.terasology.engine.world.generation.facets.base.SparseObjectFacet3D; import org.terasology.engine.world.block.BlockRegion; import org.terasology.engine.world.generation.Border3D; diff --git a/src/main/java/org/terasology/gf/generator/BushProvider.java b/src/main/java/org/terasology/gf/generator/BushProvider.java index 68e9500..3dbdf9b 100644 --- a/src/main/java/org/terasology/gf/generator/BushProvider.java +++ b/src/main/java/org/terasology/gf/generator/BushProvider.java @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 package org.terasology.gf.generator; -import org.joml.Vector3i; -import org.terasology.engine.utilities.procedural.NoiseTable; +import org.joml.Vector3ic; +import org.terasology.engine.utilities.procedural.WhiteNoise; import org.terasology.engine.world.generation.Facet; import org.terasology.engine.world.generation.FacetProvider; import org.terasology.engine.world.generation.GeneratingRegion; @@ -19,7 +19,7 @@ @Requires(@Facet(FloraFacet.class)) public class BushProvider implements FacetProvider { private float amount; - private NoiseTable noise; + private WhiteNoise noise; public BushProvider(float amount) { this.amount = amount; @@ -27,7 +27,7 @@ public BushProvider(float amount) { @Override public void setSeed(long seed) { - noise = new NoiseTable(seed + 28873); + noise = new WhiteNoise(seed + 28873); } @Override @@ -35,12 +35,12 @@ public void process(GeneratingRegion region) { BushFacet facet = new BushFacet(region.getRegion(), region.getBorderForFacet(BushFacet.class)); FloraFacet floraFacet = region.getRegionFacet(FloraFacet.class); - for (Map.Entry positionValue : floraFacet.getFlaggedPositions().entrySet()) { - Vector3i pos = positionValue.getKey(); + for (Map.Entry positionValue : floraFacet.getWorldEntries().entrySet()) { + Vector3ic pos = positionValue.getKey(); float value = positionValue.getValue(); - if (noise.noise(pos.x, pos.y, pos.z) / 256f < amount) { - facet.setFlag(pos, value); + if (noise.noise(pos.x(), pos.y(), pos.z()) / 256f < amount) { + facet.setWorld(pos, value); } } diff --git a/src/main/java/org/terasology/gf/generator/FloraFacet.java b/src/main/java/org/terasology/gf/generator/FloraFacet.java index f536503..0f6833e 100644 --- a/src/main/java/org/terasology/gf/generator/FloraFacet.java +++ b/src/main/java/org/terasology/gf/generator/FloraFacet.java @@ -15,7 +15,7 @@ */ package org.terasology.gf.generator; -import org.terasology.anotherWorld.SparseObjectFacet3D; +import org.terasology.engine.world.generation.facets.base.SparseObjectFacet3D; import org.terasology.engine.world.block.BlockRegion; import org.terasology.engine.world.generation.Border3D; diff --git a/src/main/java/org/terasology/gf/generator/FloraFeatureGenerator.java b/src/main/java/org/terasology/gf/generator/FloraFeatureGenerator.java index 5938068..d98ef3a 100644 --- a/src/main/java/org/terasology/gf/generator/FloraFeatureGenerator.java +++ b/src/main/java/org/terasology/gf/generator/FloraFeatureGenerator.java @@ -5,21 +5,20 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Ordering; import com.google.common.collect.TreeMultimap; -import org.joml.Vector3i; -import org.terasology.anotherWorld.AnotherWorldBiome; -import org.terasology.anotherWorld.FeatureGenerator; -import org.terasology.anotherWorld.generation.BiomeFacet; -import org.terasology.anotherWorld.util.ChanceRandomizer; -import org.terasology.biomesAPI.BiomeRegistry; +import org.joml.Vector3ic; +import org.terasology.biomesAPI.Biome; +import org.terasology.core.world.generator.facets.BiomeFacet; import org.terasology.engine.registry.CoreRegistry; import org.terasology.engine.utilities.random.FastRandom; import org.terasology.engine.utilities.random.Random; import org.terasology.engine.world.chunks.Chunk; import org.terasology.engine.world.generation.Region; +import org.terasology.engine.world.generation.WorldRasterizer; import org.terasology.engine.world.generator.plugin.WorldGeneratorPluginLibrary; +import org.terasology.gestalt.naming.Name; import org.terasology.gf.PlantRegistry; import org.terasology.gf.PlantType; -import org.terasology.gestalt.naming.Name; +import org.terasology.utilities.procedural.ChanceRandomizer; import java.util.Comparator; import java.util.HashMap; @@ -28,7 +27,7 @@ import java.util.Map; import java.util.Set; -public class FloraFeatureGenerator implements FeatureGenerator { +public class FloraFeatureGenerator implements WorldRasterizer { private Multimap treeDefinitions = TreeMultimap.create(Ordering.natural(), Comparator.comparing(PlantSpawnDefinition::getPlantId)); @@ -84,42 +83,41 @@ public void generateChunk(Chunk chunk, Region chunkRegion) { BushFacet bushFacet = chunkRegion.getFacet(BushFacet.class); FoliageFacet foliageFacet = chunkRegion.getFacet(FoliageFacet.class); BiomeFacet biomeFacet = chunkRegion.getFacet(BiomeFacet.class); - BiomeRegistry biomeRegistry = CoreRegistry.get(BiomeRegistry.class); - Set usedPositions = new HashSet<>(); + Set usedPositions = new HashSet<>(); // First, generate trees, as these are the rarest ones - for (Map.Entry positionEntry : treeFacet.getFlaggedPositions().entrySet()) { - Vector3i position = positionEntry.getKey(); + for (Map.Entry positionEntry : treeFacet.getWorldEntries().entrySet()) { + Vector3ic position = positionEntry.getKey(); float value = positionEntry.getValue(); - AnotherWorldBiome biome = biomeFacet.getWorld(position.x, position.z); + Biome biome = biomeFacet.getWorld(position.x(), position.z()); long seed = Float.floatToRawIntBits(value); Random random = new FastRandom(seed); - ChanceRandomizer definitionsForBiome = getDefinitionsForBiome(biome, biomeRegistry, treeDefinitionsCache, treeDefinitions); + ChanceRandomizer definitionsForBiome = getDefinitionsForBiome(biome, treeDefinitionsCache, treeDefinitions); PlantSpawnDefinition treeDefinition = definitionsForBiome.randomizeObject(random); if (treeDefinition != null && random.nextFloat() < treeDefinition.getProbability()) { - treeDefinition.generatePlant(seed, chunk, position.x, position.y, position.z, chunkRegion); + treeDefinition.generatePlant(seed, chunk, position.x(), position.y(), position.z(), chunkRegion); } usedPositions.add(position); } // Second, generate bushes, as these are a bit more common - for (Map.Entry positionEntry : bushFacet.getFlaggedPositions().entrySet()) { - Vector3i position = positionEntry.getKey(); + for (Map.Entry positionEntry : bushFacet.getWorldEntries().entrySet()) { + Vector3ic position = positionEntry.getKey(); if (!usedPositions.contains(position)) { float value = positionEntry.getValue(); - AnotherWorldBiome biome = biomeFacet.getWorld(position.x, position.z); + Biome biome = biomeFacet.getWorld(position.x(), position.z()); long seed = Float.floatToRawIntBits(value); Random random = new FastRandom(seed); - ChanceRandomizer definitionsForBiome = getDefinitionsForBiome(biome, biomeRegistry, bushDefinitionsCache, bushDefinitions); + ChanceRandomizer definitionsForBiome = getDefinitionsForBiome(biome, bushDefinitionsCache, bushDefinitions); PlantSpawnDefinition bushDefinition = definitionsForBiome.randomizeObject(random); if (bushDefinition != null && random.nextFloat() < bushDefinition.getProbability()) { - bushDefinition.generatePlant(seed, chunk, position.x, position.y, position.z, chunkRegion); + bushDefinition.generatePlant(seed, chunk, position.x(), position.y(), position.z(), chunkRegion); } usedPositions.add(position); @@ -127,19 +125,19 @@ public void generateChunk(Chunk chunk, Region chunkRegion) { } // Third, generate grass and flowers, as these are the most common - for (Map.Entry positionEntry : foliageFacet.getFlaggedPositions().entrySet()) { - Vector3i position = positionEntry.getKey(); + for (Map.Entry positionEntry : foliageFacet.getWorldEntries().entrySet()) { + Vector3ic position = positionEntry.getKey(); if (!usedPositions.contains(position)) { float value = positionEntry.getValue(); - AnotherWorldBiome biome = biomeFacet.getWorld(position.x, position.z); + Biome biome = biomeFacet.getWorld(position.x(), position.z()); long seed = Float.floatToRawIntBits(value); Random random = new FastRandom(seed); - ChanceRandomizer definitionsForBiome = getDefinitionsForBiome(biome, biomeRegistry, foliageDefinitionsCache, foliageDefinitions); + ChanceRandomizer definitionsForBiome = getDefinitionsForBiome(biome, foliageDefinitionsCache, foliageDefinitions); PlantSpawnDefinition foliageDefinition = definitionsForBiome.randomizeObject(random); if (foliageDefinition != null && random.nextFloat() < foliageDefinition.getProbability()) { - foliageDefinition.generatePlant(seed, chunk, position.x, position.y, position.z, chunkRegion); + foliageDefinition.generatePlant(seed, chunk, position.x(), position.y(), position.z(), chunkRegion); } usedPositions.add(position); @@ -147,29 +145,16 @@ public void generateChunk(Chunk chunk, Region chunkRegion) { } } - private ChanceRandomizer getDefinitionsForBiome( - AnotherWorldBiome biome, BiomeRegistry biomeRegistry, - Map> cache, Multimap definitions) { + private ChanceRandomizer getDefinitionsForBiome(Biome biome, Map> cache, Multimap definitions) { ChanceRandomizer result = cache.get(biome.getId()); if (result != null) { return result; } result = new ChanceRandomizer<>(100); - AnotherWorldBiome biomeToAdd = biome; - boolean parentFound = true; - while (parentFound) { - parentFound = false; - for (PlantSpawnDefinition floraDefinition : definitions.get(biome.getId())) { - result.addChance(floraDefinition.getRarity(), floraDefinition); - } - for (AnotherWorldBiome biome1 : biomeRegistry.getRegisteredBiomes(AnotherWorldBiome.class)) { - if (biomeToAdd.getBiomeParent().equals(biome1.getId())) { - biomeToAdd = biome1; - parentFound = true; - break; - } - } + for (PlantSpawnDefinition floraDefinition : definitions.get(biome.getId())) { + result.addChance(floraDefinition.getRarity(), floraDefinition); } result.initialize(); cache.put(biome.getId(), result); diff --git a/src/main/java/org/terasology/gf/generator/FloraProvider.java b/src/main/java/org/terasology/gf/generator/FloraProvider.java index d3a0cdd..ab0032b 100644 --- a/src/main/java/org/terasology/gf/generator/FloraProvider.java +++ b/src/main/java/org/terasology/gf/generator/FloraProvider.java @@ -3,7 +3,7 @@ package org.terasology.gf.generator; import org.joml.Vector3i; -import org.terasology.engine.utilities.procedural.NoiseTable; +import org.terasology.engine.utilities.procedural.WhiteNoise; import org.terasology.engine.world.generation.Facet; import org.terasology.engine.world.generation.FacetBorder; import org.terasology.engine.world.generation.FacetProvider; @@ -19,7 +19,7 @@ @Requires(@Facet(value = SurfacesFacet.class, border = @FacetBorder(bottom = 1))) public class FloraProvider implements FacetProvider { - private NoiseTable noiseTable; + private WhiteNoise noiseTable; private int seaLevel; public FloraProvider(int seaLevel) { @@ -28,7 +28,7 @@ public FloraProvider(int seaLevel) { @Override public void setSeed(long seed) { - noiseTable = new NoiseTable(seed); + noiseTable = new WhiteNoise(seed); } @Override @@ -46,7 +46,7 @@ public void process(GeneratingRegion region) { for (int height : surface.getWorldColumn(x, z)) { // if the surface is in range, and if we are above sea level if (facet.getWorldRegion().contains(x, height, z) && facet.getWorldRegion().contains(x, height + 1, z) && height >= seaLevel) { - facet.setFlag(new Vector3i(x, height, z), noiseTable.noise(x, z) / 256f); + facet.setWorld(new Vector3i(x, height, z), noiseTable.noise(x, z) / 256f); } } } diff --git a/src/main/java/org/terasology/gf/generator/FoliageFacet.java b/src/main/java/org/terasology/gf/generator/FoliageFacet.java index 52902b8..105f39d 100644 --- a/src/main/java/org/terasology/gf/generator/FoliageFacet.java +++ b/src/main/java/org/terasology/gf/generator/FoliageFacet.java @@ -15,7 +15,7 @@ */ package org.terasology.gf.generator; -import org.terasology.anotherWorld.SparseObjectFacet3D; +import org.terasology.engine.world.generation.facets.base.SparseObjectFacet3D; import org.terasology.engine.world.block.BlockRegion; import org.terasology.engine.world.generation.Border3D; diff --git a/src/main/java/org/terasology/gf/generator/FoliageProvider.java b/src/main/java/org/terasology/gf/generator/FoliageProvider.java index bf4551c..a84832e 100644 --- a/src/main/java/org/terasology/gf/generator/FoliageProvider.java +++ b/src/main/java/org/terasology/gf/generator/FoliageProvider.java @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 package org.terasology.gf.generator; -import org.joml.Vector3i; -import org.terasology.engine.utilities.procedural.NoiseTable; +import org.joml.Vector3ic; +import org.terasology.engine.utilities.procedural.WhiteNoise; import org.terasology.engine.world.generation.Facet; import org.terasology.engine.world.generation.FacetProvider; import org.terasology.engine.world.generation.GeneratingRegion; @@ -19,7 +19,7 @@ @Requires(@Facet(FloraFacet.class)) public class FoliageProvider implements FacetProvider { private float amount; - private NoiseTable noise; + private WhiteNoise noise; public FoliageProvider(float amount) { this.amount = amount; @@ -27,7 +27,7 @@ public FoliageProvider(float amount) { @Override public void setSeed(long seed) { - noise = new NoiseTable(seed + 25873); + noise = new WhiteNoise(seed + 25873); } @Override @@ -35,12 +35,12 @@ public void process(GeneratingRegion region) { FoliageFacet facet = new FoliageFacet(region.getRegion(), region.getBorderForFacet(FoliageFacet.class)); FloraFacet floraFacet = region.getRegionFacet(FloraFacet.class); - for (Map.Entry positionValue : floraFacet.getFlaggedPositions().entrySet()) { - Vector3i pos = positionValue.getKey(); + for (Map.Entry positionValue : floraFacet.getWorldEntries().entrySet()) { + Vector3ic pos = positionValue.getKey(); float value = positionValue.getValue(); - if (noise.noise(pos.x, pos.y, pos.z) / 256f < amount) { - facet.setFlag(pos, value); + if (noise.noise(pos.x(), pos.y(), pos.z()) / 256f < amount) { + facet.setWorld(pos, value); } } diff --git a/src/main/java/org/terasology/gf/generator/StaticBlockFloraSpawnDefinition.java b/src/main/java/org/terasology/gf/generator/StaticBlockFloraSpawnDefinition.java index b06a65c..dd9891d 100644 --- a/src/main/java/org/terasology/gf/generator/StaticBlockFloraSpawnDefinition.java +++ b/src/main/java/org/terasology/gf/generator/StaticBlockFloraSpawnDefinition.java @@ -4,8 +4,8 @@ import com.google.common.base.Predicate; import org.joml.Vector3i; -import org.terasology.anotherWorld.GenerationLocalParameters; -import org.terasology.anotherWorld.LocalParameters; +import org.terasology.gf.util.GenerationLocalParameters; +import org.terasology.gf.util.LocalParameters; import org.terasology.engine.registry.CoreRegistry; import org.terasology.engine.utilities.random.FastRandom; import org.terasology.engine.world.block.Block; diff --git a/src/main/java/org/terasology/gf/generator/TreeFacet.java b/src/main/java/org/terasology/gf/generator/TreeFacet.java index 16381f0..435c09a 100644 --- a/src/main/java/org/terasology/gf/generator/TreeFacet.java +++ b/src/main/java/org/terasology/gf/generator/TreeFacet.java @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 package org.terasology.gf.generator; -import org.terasology.anotherWorld.SparseObjectFacet3D; +import org.terasology.engine.world.generation.facets.base.SparseObjectFacet3D; import org.terasology.engine.world.block.BlockRegion; import org.terasology.engine.world.generation.Border3D; diff --git a/src/main/java/org/terasology/gf/generator/TreeProvider.java b/src/main/java/org/terasology/gf/generator/TreeProvider.java index 853c047..2eb8261 100644 --- a/src/main/java/org/terasology/gf/generator/TreeProvider.java +++ b/src/main/java/org/terasology/gf/generator/TreeProvider.java @@ -2,8 +2,8 @@ // SPDX-License-Identifier: Apache-2.0 package org.terasology.gf.generator; -import org.joml.Vector3i; -import org.terasology.engine.utilities.procedural.NoiseTable; +import org.joml.Vector3ic; +import org.terasology.engine.utilities.procedural.WhiteNoise; import org.terasology.engine.world.generation.Facet; import org.terasology.engine.world.generation.FacetProvider; import org.terasology.engine.world.generation.GeneratingRegion; @@ -19,7 +19,7 @@ @Requires(@Facet(FloraFacet.class)) public class TreeProvider implements FacetProvider { private float amount; - private NoiseTable noise; + private WhiteNoise noise; public TreeProvider(float amount) { this.amount = amount; @@ -27,7 +27,7 @@ public TreeProvider(float amount) { @Override public void setSeed(long seed) { - noise = new NoiseTable(seed + 26873); + noise = new WhiteNoise(seed + 26873); } @Override @@ -35,12 +35,12 @@ public void process(GeneratingRegion region) { TreeFacet facet = new TreeFacet(region.getRegion(), region.getBorderForFacet(TreeFacet.class)); FloraFacet floraFacet = region.getRegionFacet(FloraFacet.class); - for (Map.Entry positionValue : floraFacet.getFlaggedPositions().entrySet()) { - Vector3i pos = positionValue.getKey(); + for (Map.Entry positionValue : floraFacet.getWorldEntries().entrySet()) { + Vector3ic pos = positionValue.getKey(); float value = positionValue.getValue(); - if (noise.noise(pos.x, pos.y, pos.z) / 256f < amount) { - facet.setFlag(pos, value); + if (noise.noise(pos.x(), pos.y(), pos.z()) / 256f < amount) { + facet.setWorld(pos, value); } } diff --git a/src/main/java/org/terasology/gf/grass/AdvancedStagesGrowthDefinition.java b/src/main/java/org/terasology/gf/grass/AdvancedStagesGrowthDefinition.java index 3b65035..1ee3534 100644 --- a/src/main/java/org/terasology/gf/grass/AdvancedStagesGrowthDefinition.java +++ b/src/main/java/org/terasology/gf/grass/AdvancedStagesGrowthDefinition.java @@ -5,9 +5,9 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import org.joml.Vector3i; -import org.terasology.anotherWorld.EnvironmentLocalParameters; -import org.terasology.anotherWorld.GenerationLocalParameters; -import org.terasology.anotherWorld.LocalParameters; +import org.terasology.gf.util.EnvironmentLocalParameters; +import org.terasology.gf.util.GenerationLocalParameters; +import org.terasology.gf.util.LocalParameters; import org.terasology.climateConditions.ClimateConditionsSystem; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.registry.CoreRegistry; diff --git a/src/main/java/org/terasology/gf/grass/ReplaceBlockGrowthDefinition.java b/src/main/java/org/terasology/gf/grass/ReplaceBlockGrowthDefinition.java index ed1aac2..8929de1 100644 --- a/src/main/java/org/terasology/gf/grass/ReplaceBlockGrowthDefinition.java +++ b/src/main/java/org/terasology/gf/grass/ReplaceBlockGrowthDefinition.java @@ -5,9 +5,9 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import org.joml.Vector3i; -import org.terasology.anotherWorld.EnvironmentLocalParameters; -import org.terasology.anotherWorld.GenerationLocalParameters; -import org.terasology.anotherWorld.LocalParameters; +import org.terasology.gf.util.EnvironmentLocalParameters; +import org.terasology.gf.util.GenerationLocalParameters; +import org.terasology.gf.util.LocalParameters; import org.terasology.climateConditions.ClimateConditionsSystem; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.registry.CoreRegistry; diff --git a/src/main/java/org/terasology/gf/tree/lsystem/AdvancedLSystemTreeDefinition.java b/src/main/java/org/terasology/gf/tree/lsystem/AdvancedLSystemTreeDefinition.java index b742d25..a529f28 100644 --- a/src/main/java/org/terasology/gf/tree/lsystem/AdvancedLSystemTreeDefinition.java +++ b/src/main/java/org/terasology/gf/tree/lsystem/AdvancedLSystemTreeDefinition.java @@ -12,8 +12,6 @@ import org.joml.Vector3ic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.terasology.anotherWorld.util.ChunkRandom; -import org.terasology.anotherWorld.util.PDist; import org.terasology.engine.core.Time; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.math.Side; @@ -35,6 +33,7 @@ import org.terasology.engine.world.chunks.Chunks; import org.terasology.gf.LivingPlantComponent; import org.terasology.gestalt.naming.Name; +import org.terasology.utilities.procedural.PDist; import java.util.Collection; import java.util.Collections; @@ -131,7 +130,7 @@ public Long setupTreeBaseBlock(WorldProvider worldProvider, BlockEntityRegistry } private LSystemTreeComponent createNewTreeComponent(long seed, Vector3ic location) { - Random random = ChunkRandom.getChunkRandom(seed, new Vector3i(location), 345245); + Random random = new FastRandom(seed + 345245 * (97L * location.x() + 13L * location.y() + location.z())); // New axion (grown) int generation = 1 + random.nextInt((int) treeLongevity.getMax() - 1); @@ -142,7 +141,7 @@ private LSystemTreeComponent createNewTreeComponent(long seed, Vector3ic locatio LSystemTreeComponent lSystemTree = new LSystemTreeComponent(); lSystemTree.axion = nextAxion; - lSystemTree.branchAngle = branchAngle.getIntValue(random); + lSystemTree.branchAngle = branchAngle.getValue(random); lSystemTree.rotationAngle = (float) Math.PI * random.nextFloat(); lSystemTree.generation = generation; return lSystemTree; @@ -157,7 +156,7 @@ public Long setupPlantedSapling(EntityRef treeRef) { LSystemTreeComponent lSystemTree = new LSystemTreeComponent(); lSystemTree.axion = saplingAxion; - lSystemTree.branchAngle = branchAngle.getIntValue(random); + lSystemTree.branchAngle = branchAngle.getValue(random); lSystemTree.rotationAngle = (float) Math.PI * random.nextFloat(); lSystemTree.generation = generation; // This tree was just planted @@ -343,6 +342,7 @@ private TreeStructure generateTreeFromAxion(Vector3i location, String currentAxi tempRotation.identity(); char c = axion.key; + float currentAngle = axion.parameter == null ? angle : (float) Math.toRadians(Integer.parseInt(axion.parameter)); switch (c) { case '[': stackOrientation.push(new Matrix4f(rotation)); @@ -359,19 +359,27 @@ private TreeStructure generateTreeFromAxion(Vector3i location, String currentAxi callback.setBranchLocation(branchLocation); break; case '&': - tempRotation = new Matrix4f().rotation(new Quaternionf().setAngleAxis(angle,1,0,0)); + tempRotation = new Matrix4f().rotation(new Quaternionf().setAngleAxis(currentAngle, 1, 0, 0)); rotation.mul(tempRotation); break; case '^': - tempRotation = new Matrix4f().rotation(new Quaternionf().setAngleAxis(-angle,1, 0, 0)); + tempRotation = new Matrix4f().rotation(new Quaternionf().setAngleAxis(currentAngle, -1, 0, 0)); rotation.mul(tempRotation); break; case '+': - tempRotation = new Matrix4f().rotation(new Quaternionf().setAngleAxis(Math.toRadians(Integer.parseInt(axion.parameter)),0, 1, 0)); + tempRotation = new Matrix4f().rotation(new Quaternionf().setAngleAxis(currentAngle, 0, 1, 0)); rotation.mul(tempRotation); break; case '-': - tempRotation = new Matrix4f().rotation(new Quaternionf().setAngleAxis(-Math.toRadians(Integer.parseInt(axion.parameter)),0, 1, 0)); + tempRotation = new Matrix4f().rotation(new Quaternionf().setAngleAxis(currentAngle, 0, -1, 0)); + rotation.mul(tempRotation); + break; + case '*': + tempRotation = new Matrix4f().rotation(new Quaternionf().setAngleAxis(currentAngle, 0, 0, 1)); + rotation.mul(tempRotation); + break; + case '/': + tempRotation = new Matrix4f().rotation(new Quaternionf().setAngleAxis(currentAngle, 0, 0, -1)); rotation.mul(tempRotation); break; default: diff --git a/src/main/java/org/terasology/gf/tree/lsystem/SimpleAxionElementReplacement.java b/src/main/java/org/terasology/gf/tree/lsystem/SimpleAxionElementReplacement.java index 0b7d66e..196db52 100644 --- a/src/main/java/org/terasology/gf/tree/lsystem/SimpleAxionElementReplacement.java +++ b/src/main/java/org/terasology/gf/tree/lsystem/SimpleAxionElementReplacement.java @@ -37,11 +37,17 @@ public SimpleAxionElementReplacement(String defaultReplacement) { replacements.add(null); } - public void addReplacement(float probability, String replacement) { - addReplacement(probability, new StaticReplacementGenerator(replacement)); + /** + * @return {@code this}, to allow for method chaining + */ + public SimpleAxionElementReplacement addReplacement(float probability, String replacement) { + return addReplacement(probability, new StaticReplacementGenerator(replacement)); } - public void addReplacement(float probability, AxionElementReplacement replacement) { + /** + * @return {@code this}, to allow for method chaining + */ + public SimpleAxionElementReplacement addReplacement(float probability, AxionElementReplacement replacement) { if (probabilitySum + probability > 1f) { throw new IllegalArgumentException("Sum of probabilities exceeds 1"); } @@ -49,6 +55,8 @@ public void addReplacement(float probability, AxionElementReplacement replacemen probabilities.add(1 - probabilitySum); replacements.add(replacement); + + return this; } @Override diff --git a/src/main/java/org/terasology/gf/util/EnvironmentLocalParameters.java b/src/main/java/org/terasology/gf/util/EnvironmentLocalParameters.java new file mode 100644 index 0000000..572fb02 --- /dev/null +++ b/src/main/java/org/terasology/gf/util/EnvironmentLocalParameters.java @@ -0,0 +1,27 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + +package org.terasology.gf.util; + +import org.joml.Vector3ic; +import org.terasology.climateConditions.ClimateConditionsSystem; + +public class EnvironmentLocalParameters implements LocalParameters { + private ClimateConditionsSystem environmentSystem; + private Vector3ic location; + + public EnvironmentLocalParameters(ClimateConditionsSystem environmentSystem, Vector3ic location) { + this.environmentSystem = environmentSystem; + this.location = location; + } + + @Override + public float getTemperature() { + return environmentSystem.getTemperature(location.x(), location.y(), location.z()); + } + + @Override + public float getHumidity() { + return environmentSystem.getHumidity(location.x(), location.y(), location.z()); + } +} diff --git a/src/main/java/org/terasology/gf/util/GenerationLocalParameters.java b/src/main/java/org/terasology/gf/util/GenerationLocalParameters.java new file mode 100644 index 0000000..afe9db2 --- /dev/null +++ b/src/main/java/org/terasology/gf/util/GenerationLocalParameters.java @@ -0,0 +1,31 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + +package org.terasology.gf.util; + +import org.joml.Vector3ic; +import org.terasology.engine.world.generation.Region; +import org.terasology.engine.world.generation.facets.SurfaceHumidityFacet; +import org.terasology.engine.world.generation.facets.SurfaceTemperatureFacet; + +public class GenerationLocalParameters implements LocalParameters { + private Vector3ic location; + private SurfaceTemperatureFacet surfaceTemperatureFacet; + private SurfaceHumidityFacet surfaceHumidityFacet; + + public GenerationLocalParameters(Region chunkRegion, Vector3ic location) { + this.location = location; + surfaceTemperatureFacet = chunkRegion.getFacet(SurfaceTemperatureFacet.class); + surfaceHumidityFacet = chunkRegion.getFacet(SurfaceHumidityFacet.class); + } + + @Override + public float getTemperature() { + return surfaceTemperatureFacet.get(location.x(), location.z()); + } + + @Override + public float getHumidity() { + return surfaceHumidityFacet.get(location.x(), location.z()); + } +} diff --git a/src/main/java/org/terasology/gf/util/LocalParameters.java b/src/main/java/org/terasology/gf/util/LocalParameters.java new file mode 100644 index 0000000..ba65fb2 --- /dev/null +++ b/src/main/java/org/terasology/gf/util/LocalParameters.java @@ -0,0 +1,10 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + +package org.terasology.gf.util; + +public interface LocalParameters { + float getTemperature(); + + float getHumidity(); +} From cd46d7e9233bf8ce83f47e368c0e455ac6f915ce Mon Sep 17 00:00:00 2001 From: tolziplohu Date: Thu, 12 Aug 2021 13:54:29 -0500 Subject: [PATCH 2/6] fix: add border to tree facet --- .../terasology/gf/generator/BushProvider.java | 4 +++- .../gf/generator/FoliageProvider.java | 4 +++- .../GrowthBasedPlantSpawnDefinition.java | 18 ++++-------------- .../terasology/gf/generator/TreeProvider.java | 7 +++++-- 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/src/main/java/org/terasology/gf/generator/BushProvider.java b/src/main/java/org/terasology/gf/generator/BushProvider.java index 3dbdf9b..919db6e 100644 --- a/src/main/java/org/terasology/gf/generator/BushProvider.java +++ b/src/main/java/org/terasology/gf/generator/BushProvider.java @@ -4,6 +4,7 @@ import org.joml.Vector3ic; import org.terasology.engine.utilities.procedural.WhiteNoise; +import org.terasology.engine.world.block.BlockRegionc; import org.terasology.engine.world.generation.Facet; import org.terasology.engine.world.generation.FacetProvider; import org.terasology.engine.world.generation.GeneratingRegion; @@ -34,12 +35,13 @@ public void setSeed(long seed) { public void process(GeneratingRegion region) { BushFacet facet = new BushFacet(region.getRegion(), region.getBorderForFacet(BushFacet.class)); FloraFacet floraFacet = region.getRegionFacet(FloraFacet.class); + BlockRegionc bushRegion = facet.getWorldRegion(); for (Map.Entry positionValue : floraFacet.getWorldEntries().entrySet()) { Vector3ic pos = positionValue.getKey(); float value = positionValue.getValue(); - if (noise.noise(pos.x(), pos.y(), pos.z()) / 256f < amount) { + if (bushRegion.contains(pos) && noise.noise(pos.x(), pos.y(), pos.z()) / 256f < amount) { facet.setWorld(pos, value); } } diff --git a/src/main/java/org/terasology/gf/generator/FoliageProvider.java b/src/main/java/org/terasology/gf/generator/FoliageProvider.java index a84832e..5ea3263 100644 --- a/src/main/java/org/terasology/gf/generator/FoliageProvider.java +++ b/src/main/java/org/terasology/gf/generator/FoliageProvider.java @@ -4,6 +4,7 @@ import org.joml.Vector3ic; import org.terasology.engine.utilities.procedural.WhiteNoise; +import org.terasology.engine.world.block.BlockRegionc; import org.terasology.engine.world.generation.Facet; import org.terasology.engine.world.generation.FacetProvider; import org.terasology.engine.world.generation.GeneratingRegion; @@ -34,12 +35,13 @@ public void setSeed(long seed) { public void process(GeneratingRegion region) { FoliageFacet facet = new FoliageFacet(region.getRegion(), region.getBorderForFacet(FoliageFacet.class)); FloraFacet floraFacet = region.getRegionFacet(FloraFacet.class); + BlockRegionc foliageRegion = facet.getWorldRegion(); for (Map.Entry positionValue : floraFacet.getWorldEntries().entrySet()) { Vector3ic pos = positionValue.getKey(); float value = positionValue.getValue(); - if (noise.noise(pos.x(), pos.y(), pos.z()) / 256f < amount) { + if (foliageRegion.contains(pos) && noise.noise(pos.x(), pos.y(), pos.z()) / 256f < amount) { facet.setWorld(pos, value); } } diff --git a/src/main/java/org/terasology/gf/generator/GrowthBasedPlantSpawnDefinition.java b/src/main/java/org/terasology/gf/generator/GrowthBasedPlantSpawnDefinition.java index e30bc5d..47632b4 100644 --- a/src/main/java/org/terasology/gf/generator/GrowthBasedPlantSpawnDefinition.java +++ b/src/main/java/org/terasology/gf/generator/GrowthBasedPlantSpawnDefinition.java @@ -15,12 +15,8 @@ */ package org.terasology.gf.generator; -import com.google.common.base.Predicate; -import org.joml.Vector3i; import org.terasology.engine.registry.CoreRegistry; -import org.terasology.engine.world.block.Block; import org.terasology.engine.world.chunks.Chunk; -import org.terasology.engine.world.chunks.Chunks; import org.terasology.engine.world.generation.Region; import org.terasology.gf.PlantRegistry; import org.terasology.gf.PlantType; @@ -35,15 +31,13 @@ public abstract class GrowthBasedPlantSpawnDefinition implements PlantSpawnDefin private Name biomeId; private float rarity; private float probability; - private Predicate groundFilter; - public GrowthBasedPlantSpawnDefinition(PlantType plantType, String plantId, String biomeId, float rarity, float probability, Predicate groundFilter) { + public GrowthBasedPlantSpawnDefinition(PlantType plantType, String plantId, String biomeId, float rarity, float probability) { this.plantType = plantType; this.plantId = plantId; this.biomeId = new Name(biomeId); this.rarity = rarity; this.probability = probability; - this.groundFilter = groundFilter; } @Override @@ -73,12 +67,8 @@ public float getProbability() { @Override public void generatePlant(long seed, Chunk chunk, int x, int y, int z, Region region) { - if (chunk.getRegion().contains(x, y + 1, z) && chunk.getRegion().contains(x, y, z) - && groundFilter.apply(chunk.getBlock(Chunks.toRelative(x, y, z, new Vector3i()))) - && chunk.getBlock(Chunks.toRelative(x, y + 1, z, new Vector3i())).isPenetrable()) { - PlantRegistry plantRegistry = CoreRegistry.get(PlantRegistry.class); - PlantGrowthDefinition plantGrowthDefinition = plantRegistry.getPlantGrowthDefinition(plantId); - plantGrowthDefinition.generatePlant(seed, chunk, x, y + 1, z, region); - } + PlantRegistry plantRegistry = CoreRegistry.get(PlantRegistry.class); + PlantGrowthDefinition plantGrowthDefinition = plantRegistry.getPlantGrowthDefinition(plantId); + plantGrowthDefinition.generatePlant(seed, chunk, x, y + 1, z, region); } } diff --git a/src/main/java/org/terasology/gf/generator/TreeProvider.java b/src/main/java/org/terasology/gf/generator/TreeProvider.java index 2eb8261..de0e01d 100644 --- a/src/main/java/org/terasology/gf/generator/TreeProvider.java +++ b/src/main/java/org/terasology/gf/generator/TreeProvider.java @@ -4,7 +4,9 @@ import org.joml.Vector3ic; import org.terasology.engine.utilities.procedural.WhiteNoise; +import org.terasology.engine.world.generation.Border3D; import org.terasology.engine.world.generation.Facet; +import org.terasology.engine.world.generation.FacetBorder; import org.terasology.engine.world.generation.FacetProvider; import org.terasology.engine.world.generation.GeneratingRegion; import org.terasology.engine.world.generation.Produces; @@ -16,7 +18,7 @@ * Determines that ground that flora can be placed on */ @Produces(TreeFacet.class) -@Requires(@Facet(FloraFacet.class)) +@Requires(@Facet(value = FloraFacet.class, border = @FacetBorder(sides = 13, bottom = 35))) public class TreeProvider implements FacetProvider { private float amount; private WhiteNoise noise; @@ -32,7 +34,8 @@ public void setSeed(long seed) { @Override public void process(GeneratingRegion region) { - TreeFacet facet = new TreeFacet(region.getRegion(), region.getBorderForFacet(TreeFacet.class)); + Border3D border = region.getBorderForFacet(TreeFacet.class); + TreeFacet facet = new TreeFacet(region.getRegion(), border.extendBy(0, 35, 13)); FloraFacet floraFacet = region.getRegionFacet(FloraFacet.class); for (Map.Entry positionValue : floraFacet.getWorldEntries().entrySet()) { From efbf6d807725a4c666a7ba4d3aadcfee789ad5b1 Mon Sep 17 00:00:00 2001 From: tolziplohu Date: Mon, 16 Aug 2021 13:11:12 -0500 Subject: [PATCH 3/6] chore: distribution utilities were moved --- .../gf/generator/FloraFeatureGenerator.java | 31 +++++++++---------- .../AdvancedLSystemTreeDefinition.java | 2 +- 2 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/terasology/gf/generator/FloraFeatureGenerator.java b/src/main/java/org/terasology/gf/generator/FloraFeatureGenerator.java index d98ef3a..108e5b9 100644 --- a/src/main/java/org/terasology/gf/generator/FloraFeatureGenerator.java +++ b/src/main/java/org/terasology/gf/generator/FloraFeatureGenerator.java @@ -18,7 +18,7 @@ import org.terasology.gestalt.naming.Name; import org.terasology.gf.PlantRegistry; import org.terasology.gf.PlantType; -import org.terasology.utilities.procedural.ChanceRandomizer; +import org.terasology.engine.utilities.random.DiscreteDistribution; import java.util.Comparator; import java.util.HashMap; @@ -31,15 +31,15 @@ public class FloraFeatureGenerator implements WorldRasterizer { private Multimap treeDefinitions = TreeMultimap.create(Ordering.natural(), Comparator.comparing(PlantSpawnDefinition::getPlantId)); - private Map> treeDefinitionsCache = new HashMap<>(); + private Map> treeDefinitionsCache = new HashMap<>(); private Multimap bushDefinitions = TreeMultimap.create(Ordering.natural(), Comparator.comparing(PlantSpawnDefinition::getPlantId)); - private Map> bushDefinitionsCache = new HashMap<>(); + private Map> bushDefinitionsCache = new HashMap<>(); private Multimap foliageDefinitions = TreeMultimap.create(Ordering.natural(), Comparator.comparing(PlantSpawnDefinition::getPlantId)); - private Map> foliageDefinitionsCache = new HashMap<>(); + private Map> foliageDefinitionsCache = new HashMap<>(); public FloraFeatureGenerator() { loadPlantGrowthDefinitions(); @@ -95,8 +95,8 @@ public void generateChunk(Chunk chunk, Region chunkRegion) { long seed = Float.floatToRawIntBits(value); Random random = new FastRandom(seed); - ChanceRandomizer definitionsForBiome = getDefinitionsForBiome(biome, treeDefinitionsCache, treeDefinitions); - PlantSpawnDefinition treeDefinition = definitionsForBiome.randomizeObject(random); + DiscreteDistribution definitionsForBiome = getDefinitionsForBiome(biome, treeDefinitionsCache, treeDefinitions); + PlantSpawnDefinition treeDefinition = definitionsForBiome.sample(random); if (treeDefinition != null && random.nextFloat() < treeDefinition.getProbability()) { treeDefinition.generatePlant(seed, chunk, position.x(), position.y(), position.z(), chunkRegion); } @@ -114,8 +114,8 @@ public void generateChunk(Chunk chunk, Region chunkRegion) { long seed = Float.floatToRawIntBits(value); Random random = new FastRandom(seed); - ChanceRandomizer definitionsForBiome = getDefinitionsForBiome(biome, bushDefinitionsCache, bushDefinitions); - PlantSpawnDefinition bushDefinition = definitionsForBiome.randomizeObject(random); + DiscreteDistribution definitionsForBiome = getDefinitionsForBiome(biome, bushDefinitionsCache, bushDefinitions); + PlantSpawnDefinition bushDefinition = definitionsForBiome.sample(random); if (bushDefinition != null && random.nextFloat() < bushDefinition.getProbability()) { bushDefinition.generatePlant(seed, chunk, position.x(), position.y(), position.z(), chunkRegion); } @@ -134,8 +134,8 @@ public void generateChunk(Chunk chunk, Region chunkRegion) { long seed = Float.floatToRawIntBits(value); Random random = new FastRandom(seed); - ChanceRandomizer definitionsForBiome = getDefinitionsForBiome(biome, foliageDefinitionsCache, foliageDefinitions); - PlantSpawnDefinition foliageDefinition = definitionsForBiome.randomizeObject(random); + DiscreteDistribution definitionsForBiome = getDefinitionsForBiome(biome, foliageDefinitionsCache, foliageDefinitions); + PlantSpawnDefinition foliageDefinition = definitionsForBiome.sample(random); if (foliageDefinition != null && random.nextFloat() < foliageDefinition.getProbability()) { foliageDefinition.generatePlant(seed, chunk, position.x(), position.y(), position.z(), chunkRegion); } @@ -145,18 +145,17 @@ public void generateChunk(Chunk chunk, Region chunkRegion) { } } - private ChanceRandomizer getDefinitionsForBiome(Biome biome, Map> cache, Multimap definitions) { - ChanceRandomizer result = cache.get(biome.getId()); + private DiscreteDistribution getDefinitionsForBiome(Biome biome, Map> cache, Multimap definitions) { + DiscreteDistribution result = cache.get(biome.getId()); if (result != null) { return result; } - result = new ChanceRandomizer<>(100); + result = new DiscreteDistribution<>(); for (PlantSpawnDefinition floraDefinition : definitions.get(biome.getId())) { - result.addChance(floraDefinition.getRarity(), floraDefinition); + result.add(floraDefinition, floraDefinition.getRarity()); } - result.initialize(); cache.put(biome.getId(), result); return result; } diff --git a/src/main/java/org/terasology/gf/tree/lsystem/AdvancedLSystemTreeDefinition.java b/src/main/java/org/terasology/gf/tree/lsystem/AdvancedLSystemTreeDefinition.java index a529f28..93ddccb 100644 --- a/src/main/java/org/terasology/gf/tree/lsystem/AdvancedLSystemTreeDefinition.java +++ b/src/main/java/org/terasology/gf/tree/lsystem/AdvancedLSystemTreeDefinition.java @@ -33,7 +33,7 @@ import org.terasology.engine.world.chunks.Chunks; import org.terasology.gf.LivingPlantComponent; import org.terasology.gestalt.naming.Name; -import org.terasology.utilities.procedural.PDist; +import org.terasology.engine.utilities.random.PDist; import java.util.Collection; import java.util.Collections; From f5e9cea80c87d6fc4ea50f1795d84ebe16a7e169 Mon Sep 17 00:00:00 2001 From: tolziplohu Date: Mon, 16 Aug 2021 16:17:04 -0500 Subject: [PATCH 4/6] refactor: make ClimateConditions dependency optional --- module.txt | 3 +- .../org/terasology/gf/PlantGrowingSystem.java | 5 ++-- .../gf/SaplingInitializeSystem.java | 3 +- .../gf/generator/PlantGrowthDefinition.java | 14 ++++----- .../grass/AdvancedStagesGrowthDefinition.java | 22 ++++++-------- .../grass/ReplaceBlockGrowthDefinition.java | 29 +++++++++---------- .../LSystemBasedTreeGrowthDefinition.java | 8 ++--- 7 files changed, 41 insertions(+), 43 deletions(-) diff --git a/module.txt b/module.txt index f51ca94..37e9fbb 100644 --- a/module.txt +++ b/module.txt @@ -11,7 +11,8 @@ }, { "id": "ClimateConditions", - "minVersion": "1.0.0" + "minVersion": "1.0.0", + "optional": "true" }, { "id": "CoreAssets", diff --git a/src/main/java/org/terasology/gf/PlantGrowingSystem.java b/src/main/java/org/terasology/gf/PlantGrowingSystem.java index f6566bc..614cbf0 100644 --- a/src/main/java/org/terasology/gf/PlantGrowingSystem.java +++ b/src/main/java/org/terasology/gf/PlantGrowingSystem.java @@ -33,6 +33,7 @@ import org.terasology.engine.world.WorldProvider; import org.terasology.engine.world.block.BlockComponent; import org.terasology.gf.generator.PlantGrowthDefinition; +import org.terasology.gf.util.EnvironmentLocalParameters; import org.terasology.randomUpdate.RandomUpdateEvent; /** @@ -64,7 +65,7 @@ public void updatePlant(DelayedActionTriggeredEvent event, EntityRef plant, Livi PerformanceMonitor.startActivity("GrowingFlora - Updating plant"); try { PlantGrowthDefinition plantDefinition = plantRegistry.getPlantGrowthDefinition(plantComponent.type); - Long updateDelay = plantDefinition.requestedUpdatePlant(worldProvider, environmentSystem, blockEntityRegistry, plant); + Long updateDelay = plantDefinition.requestedUpdatePlant(worldProvider, new EnvironmentLocalParameters(environmentSystem, blockComponent.getPosition()), blockEntityRegistry, plant); if (updateDelay != null) { delayManager.addDelayedAction(plant, UPDATE_PLANT_ACTION_ID, updateDelay); } @@ -79,7 +80,7 @@ public void randomPlantUpdate(RandomUpdateEvent event, EntityRef plant, LivingPl PerformanceMonitor.startActivity("GrowingFlora - Updating plant"); try { PlantGrowthDefinition plantDefinition = plantRegistry.getPlantGrowthDefinition(plantComponent.type); - if (plantDefinition.randomUpdatePlant(worldProvider, environmentSystem, blockEntityRegistry, plant)) { + if (plantDefinition.randomUpdatePlant(worldProvider, new EnvironmentLocalParameters(environmentSystem, blockComponent.getPosition()), blockEntityRegistry, plant)) { if (delayManager.hasDelayedAction(plant, UPDATE_PLANT_ACTION_ID)) { delayManager.cancelDelayedAction(plant, UPDATE_PLANT_ACTION_ID); } diff --git a/src/main/java/org/terasology/gf/SaplingInitializeSystem.java b/src/main/java/org/terasology/gf/SaplingInitializeSystem.java index 0c5d873..6cf8690 100644 --- a/src/main/java/org/terasology/gf/SaplingInitializeSystem.java +++ b/src/main/java/org/terasology/gf/SaplingInitializeSystem.java @@ -33,6 +33,7 @@ import org.terasology.engine.world.WorldProvider; import org.terasology.engine.world.block.BlockComponent; import org.terasology.gf.generator.PlantGrowthDefinition; +import org.terasology.gf.util.EnvironmentLocalParameters; /** * @author Marcin Sciesinski @@ -72,7 +73,7 @@ public void plantedSapling(OnAddedComponent event, EntityRef sapling, LivingPlan Vector3i blockLocation = blockComponent.getPosition(new Vector3i()); String saplingType = livingPlant.type; PlantGrowthDefinition plantDefinition = plantRegistry.getPlantGrowthDefinition(saplingType); - Long updateDelay = plantDefinition.initializePlantedPlant(worldProvider, climateConditionsSystem, blockEntityRegistry, sapling); + Long updateDelay = plantDefinition.initializePlantedPlant(worldProvider, new EnvironmentLocalParameters(climateConditionsSystem, blockLocation), blockEntityRegistry, sapling); EntityRef blockEntity = blockEntityRegistry.getBlockEntityAt(blockLocation); if (blockEntity.hasComponent(PlantedSaplingComponent.class)) { blockEntity.removeComponent(PlantedSaplingComponent.class); diff --git a/src/main/java/org/terasology/gf/generator/PlantGrowthDefinition.java b/src/main/java/org/terasology/gf/generator/PlantGrowthDefinition.java index e66fcf8..ddc0cfc 100644 --- a/src/main/java/org/terasology/gf/generator/PlantGrowthDefinition.java +++ b/src/main/java/org/terasology/gf/generator/PlantGrowthDefinition.java @@ -15,13 +15,13 @@ */ package org.terasology.gf.generator; -import org.terasology.climateConditions.ClimateConditionsSystem; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.world.BlockEntityRegistry; import org.terasology.engine.world.WorldProvider; import org.terasology.engine.world.chunks.Chunk; import org.terasology.engine.world.generation.Region; import org.terasology.engine.world.generator.plugin.WorldGeneratorPlugin; +import org.terasology.gf.util.LocalParameters; /** * @author Marcin Sciesinski @@ -45,31 +45,31 @@ public interface PlantGrowthDefinition extends WorldGeneratorPlugin { * Returns how long to next update (if any). If null is returned, it's considered that the sapling was not initialized. * * @param worldProvider - * @param environmentSystem + * @param localParameters * @param blockEntityRegistry * @param plant @return */ - Long initializePlantedPlant(WorldProvider worldProvider, ClimateConditionsSystem environmentSystem, BlockEntityRegistry blockEntityRegistry, EntityRef plant); + Long initializePlantedPlant(WorldProvider worldProvider, LocalParameters localParameters, BlockEntityRegistry blockEntityRegistry, EntityRef plant); /** * Returns how long to next update (if any). If null is returned, it's considered this plant requires no more updates. * * @param worldProvider - * @param environmentSystem + * @param localParameters * @param blockEntityRegistry * @param plant @return * @return */ - Long requestedUpdatePlant(WorldProvider worldProvider, ClimateConditionsSystem environmentSystem, BlockEntityRegistry blockEntityRegistry, EntityRef plant); + Long requestedUpdatePlant(WorldProvider worldProvider, LocalParameters localParameters, BlockEntityRegistry blockEntityRegistry, EntityRef plant); /** * Called randomly on a plant. If true is returned - this plant will no longer receive requested updates. * * @param worldProvider - * @param environmentSystem + * @param localParameters * @param blockEntityRegistry * @param plant * @return */ - boolean randomUpdatePlant(WorldProvider worldProvider, ClimateConditionsSystem environmentSystem, BlockEntityRegistry blockEntityRegistry, EntityRef plant); + boolean randomUpdatePlant(WorldProvider worldProvider, LocalParameters localParameters, BlockEntityRegistry blockEntityRegistry, EntityRef plant); } diff --git a/src/main/java/org/terasology/gf/grass/AdvancedStagesGrowthDefinition.java b/src/main/java/org/terasology/gf/grass/AdvancedStagesGrowthDefinition.java index 1ee3534..8f07206 100644 --- a/src/main/java/org/terasology/gf/grass/AdvancedStagesGrowthDefinition.java +++ b/src/main/java/org/terasology/gf/grass/AdvancedStagesGrowthDefinition.java @@ -5,10 +5,8 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import org.joml.Vector3i; -import org.terasology.gf.util.EnvironmentLocalParameters; import org.terasology.gf.util.GenerationLocalParameters; import org.terasology.gf.util.LocalParameters; -import org.terasology.climateConditions.ClimateConditionsSystem; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.registry.CoreRegistry; import org.terasology.engine.world.BlockEntityRegistry; @@ -68,19 +66,17 @@ public Long initializeGeneratedPlant(WorldProvider worldProvider, BlockEntityReg } @Override - public Long initializePlantedPlant(WorldProvider worldProvider, ClimateConditionsSystem environmentSystem, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { - BlockComponent block = plant.getComponent(BlockComponent.class); - Vector3i position = block.getPosition(new Vector3i()); - return growthTimeFunction.apply(new EnvironmentLocalParameters(environmentSystem, position)); + public Long initializePlantedPlant(WorldProvider worldProvider, LocalParameters localParameters, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { + return growthTimeFunction.apply(localParameters); } @Override - public Long requestedUpdatePlant(WorldProvider worldProvider, ClimateConditionsSystem environmentSystem, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { + public Long requestedUpdatePlant(WorldProvider worldProvider, LocalParameters localParameters, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { BlockManager blockManager = CoreRegistry.get(BlockManager.class); BlockComponent block = plant.getComponent(BlockComponent.class); Vector3i position = block.getPosition(new Vector3i()); - if (shouldDie(environmentSystem, position)) { + if (shouldDie(localParameters)) { replaceBlock(worldProvider, blockManager, plant, position, deadPlantBlock, true); return null; @@ -94,7 +90,7 @@ public Long requestedUpdatePlant(WorldProvider worldProvider, ClimateConditionsS replaceBlock(worldProvider, blockManager, plant, position, nextStage, !hasMoreStages); if (hasMoreStages) { - return growthTimeFunction.apply(new EnvironmentLocalParameters(environmentSystem, position)); + return growthTimeFunction.apply(localParameters); } else { // Entered the last phase return null; @@ -103,12 +99,12 @@ public Long requestedUpdatePlant(WorldProvider worldProvider, ClimateConditionsS } @Override - public boolean randomUpdatePlant(WorldProvider worldProvider, ClimateConditionsSystem environmentSystem, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { + public boolean randomUpdatePlant(WorldProvider worldProvider, LocalParameters localParameters, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { BlockManager blockManager = CoreRegistry.get(BlockManager.class); BlockComponent block = plant.getComponent(BlockComponent.class); Vector3i position = block.getPosition(new Vector3i()); - if (shouldDie(environmentSystem, position)) { + if (shouldDie(localParameters)) { replaceBlock(worldProvider, blockManager, plant, position, deadPlantBlock, true); return true; @@ -120,7 +116,7 @@ protected void replaceBlock(WorldProvider worldProvider, BlockManager blockManag worldProvider.setBlock(position, blockManager.getBlock(nextStage)); } - private boolean shouldDie(ClimateConditionsSystem environmentSystem, Vector3i position) { - return deathCondition != null && deathCondition.apply(new EnvironmentLocalParameters(environmentSystem, position)); + private boolean shouldDie(LocalParameters localParameters) { + return deathCondition != null && deathCondition.apply(localParameters); } } diff --git a/src/main/java/org/terasology/gf/grass/ReplaceBlockGrowthDefinition.java b/src/main/java/org/terasology/gf/grass/ReplaceBlockGrowthDefinition.java index 8929de1..9d06f8c 100644 --- a/src/main/java/org/terasology/gf/grass/ReplaceBlockGrowthDefinition.java +++ b/src/main/java/org/terasology/gf/grass/ReplaceBlockGrowthDefinition.java @@ -5,10 +5,9 @@ import com.google.common.base.Function; import com.google.common.base.Predicate; import org.joml.Vector3i; -import org.terasology.gf.util.EnvironmentLocalParameters; +import org.joml.Vector3ic; import org.terasology.gf.util.GenerationLocalParameters; import org.terasology.gf.util.LocalParameters; -import org.terasology.climateConditions.ClimateConditionsSystem; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.registry.CoreRegistry; import org.terasology.engine.utilities.random.FastRandom; @@ -91,7 +90,7 @@ public Long initializeGeneratedPlant(WorldProvider worldProvider, BlockEntityReg } @Override - public Long initializePlantedPlant(WorldProvider worldProvider, ClimateConditionsSystem environmentSystem, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { + public Long initializePlantedPlant(WorldProvider worldProvider, LocalParameters localParameters, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { if (growthIntervals.size() > 0) { return growthIntervals.get(0); } else { @@ -100,19 +99,19 @@ public Long initializePlantedPlant(WorldProvider worldProvider, ClimateCondition } @Override - public Long requestedUpdatePlant(WorldProvider worldProvider, ClimateConditionsSystem environmentSystem, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { + public Long requestedUpdatePlant(WorldProvider worldProvider, LocalParameters localParameters, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { BlockManager blockManager = CoreRegistry.get(BlockManager.class); BlockComponent block = plant.getComponent(BlockComponent.class); - Vector3i position = block.getPosition(new Vector3i()); + Vector3ic position = block.getPosition(); - if (shouldDie(environmentSystem, position)) { + if (shouldDie(localParameters)) { replaceBlock(worldProvider, blockManager, plant, position, deadPlantBlock, true); return null; } else { int currentIndex = plantStages.indexOf(block.getBlock().getURI()); - if (shouldGrow(plant, environmentSystem, position)) { + if (shouldGrow(plant, localParameters)) { int nextIndex = currentIndex + 1; BlockUri nextStage = plantStages.get(nextIndex); final boolean hasMoreStages = nextIndex < plantStages.size() - 1; @@ -131,12 +130,12 @@ public Long requestedUpdatePlant(WorldProvider worldProvider, ClimateConditionsS } @Override - public boolean randomUpdatePlant(WorldProvider worldProvider, ClimateConditionsSystem environmentSystem, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { + public boolean randomUpdatePlant(WorldProvider worldProvider, LocalParameters localParameters, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { BlockManager blockManager = CoreRegistry.get(BlockManager.class); BlockComponent block = plant.getComponent(BlockComponent.class); - Vector3i position = block.getPosition(new Vector3i()); + Vector3ic position = block.getPosition(); - if (shouldDie(environmentSystem, position)) { + if (shouldDie(localParameters)) { replaceBlock(worldProvider, blockManager, plant, position, deadPlantBlock, true); return true; @@ -144,18 +143,18 @@ public boolean randomUpdatePlant(WorldProvider worldProvider, ClimateConditionsS return false; } - protected void replaceBlock(WorldProvider worldProvider, BlockManager blockManager, EntityRef plant, Vector3i position, BlockUri nextStage, boolean isLast) { + protected void replaceBlock(WorldProvider worldProvider, BlockManager blockManager, EntityRef plant, Vector3ic position, BlockUri nextStage, boolean isLast) { worldProvider.setBlock(position, blockManager.getBlock(nextStage)); } - private boolean shouldDie(ClimateConditionsSystem environmentSystem, Vector3i position) { - return deathCondition != null && deathCondition.apply(new EnvironmentLocalParameters(environmentSystem, position)); + private boolean shouldDie(LocalParameters localParameters) { + return deathCondition != null && deathCondition.apply(localParameters); } - private boolean shouldGrow(EntityRef plant, ClimateConditionsSystem environmentSystem, Vector3i position) { + private boolean shouldGrow(EntityRef plant, LocalParameters localParameters) { float chance = 1f; if (growthChance != null) { - chance = growthChance.apply(new EnvironmentLocalParameters(environmentSystem, position)); + chance = growthChance.apply(localParameters); } GetGrowthChance event = new GetGrowthChance(chance); plant.send(event); diff --git a/src/main/java/org/terasology/gf/tree/lsystem/LSystemBasedTreeGrowthDefinition.java b/src/main/java/org/terasology/gf/tree/lsystem/LSystemBasedTreeGrowthDefinition.java index f27c7b0..97f0ef7 100644 --- a/src/main/java/org/terasology/gf/tree/lsystem/LSystemBasedTreeGrowthDefinition.java +++ b/src/main/java/org/terasology/gf/tree/lsystem/LSystemBasedTreeGrowthDefinition.java @@ -3,13 +3,13 @@ package org.terasology.gf.tree.lsystem; import org.joml.Vector3i; -import org.terasology.climateConditions.ClimateConditionsSystem; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.world.BlockEntityRegistry; import org.terasology.engine.world.WorldProvider; import org.terasology.engine.world.chunks.Chunk; import org.terasology.engine.world.generation.Region; import org.terasology.gf.generator.ConnectedPlantGrowthDefinition; +import org.terasology.gf.util.LocalParameters; import java.util.Collection; @@ -29,17 +29,17 @@ public final Long initializeGeneratedPlant(WorldProvider worldProvider, BlockEnt } @Override - public Long initializePlantedPlant(WorldProvider worldProvider, ClimateConditionsSystem environmentSystem, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { + public Long initializePlantedPlant(WorldProvider worldProvider, LocalParameters localParameters, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { return getTreeDefinition().setupPlantedSapling(plant); } @Override - public final Long requestedUpdatePlant(WorldProvider worldProvider, ClimateConditionsSystem environmentSystem, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { + public final Long requestedUpdatePlant(WorldProvider worldProvider, LocalParameters localParameters, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { return getTreeDefinition().updateTree(worldProvider, blockEntityRegistry, plant); } @Override - public boolean randomUpdatePlant(WorldProvider worldProvider, ClimateConditionsSystem environmentSystem, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { + public boolean randomUpdatePlant(WorldProvider worldProvider, LocalParameters localParameters, BlockEntityRegistry blockEntityRegistry, EntityRef plant) { // Do nothing on random update return false; } From 6f5e8ffe4ca18e0a7b18dac8756a99942c7ba476 Mon Sep 17 00:00:00 2001 From: tolziplohu Date: Tue, 17 Aug 2021 15:57:46 -0500 Subject: [PATCH 5/6] chore: increase use of Vector3ic --- .../gf/SaplingInitializeSystem.java | 4 +- .../ConnectedPlantGrowthDefinition.java | 6 +- .../gf/tree/TreeDestructionSystem.java | 18 +-- .../AdvancedLSystemTreeDefinition.java | 130 ++++++++---------- .../LSystemBasedTreeGrowthDefinition.java | 6 +- 5 files changed, 73 insertions(+), 91 deletions(-) diff --git a/src/main/java/org/terasology/gf/SaplingInitializeSystem.java b/src/main/java/org/terasology/gf/SaplingInitializeSystem.java index 6cf8690..afced6a 100644 --- a/src/main/java/org/terasology/gf/SaplingInitializeSystem.java +++ b/src/main/java/org/terasology/gf/SaplingInitializeSystem.java @@ -15,7 +15,7 @@ */ package org.terasology.gf; -import org.joml.Vector3i; +import org.joml.Vector3ic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.climateConditions.ClimateConditionsSystem; @@ -95,7 +95,7 @@ public void delayedInitialization(DelayedActionTriggeredEvent event, EntityRef s PerformanceMonitor.startActivity("GrowingFlora - Initializing sapling"); processingEvent = true; try { - Vector3i blockLocation = blockComponent.getPosition(new Vector3i()); + Vector3ic blockLocation = blockComponent.getPosition(); String saplingType = generatedSapling.type; PlantGrowthDefinition plantDefinition = plantRegistry.getPlantGrowthDefinition(saplingType); Long updateDelay = plantDefinition.initializeGeneratedPlant(worldProvider, blockEntityRegistry, sapling); diff --git a/src/main/java/org/terasology/gf/generator/ConnectedPlantGrowthDefinition.java b/src/main/java/org/terasology/gf/generator/ConnectedPlantGrowthDefinition.java index 234e7af..349e389 100644 --- a/src/main/java/org/terasology/gf/generator/ConnectedPlantGrowthDefinition.java +++ b/src/main/java/org/terasology/gf/generator/ConnectedPlantGrowthDefinition.java @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 package org.terasology.gf.generator; -import org.joml.Vector3i; +import org.joml.Vector3ic; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.world.BlockEntityRegistry; import org.terasology.engine.world.WorldProvider; @@ -22,7 +22,7 @@ public interface ConnectedPlantGrowthDefinition extends PlantGrowthDefinition { * @param plant * @return */ - boolean isBlockOwnedByPlant(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, Vector3i block, EntityRef plant); + boolean isBlockOwnedByPlant(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, Vector3ic block, EntityRef plant); /** * Returns a collection of locations that are dependand on existance of this block in this plant. @@ -34,5 +34,5 @@ public interface ConnectedPlantGrowthDefinition extends PlantGrowthDefinition { * @param plant * @return */ - Collection getBlocksConnectedTo(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, Vector3i block, EntityRef plant); + Collection getBlocksConnectedTo(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, Vector3ic block, EntityRef plant); } diff --git a/src/main/java/org/terasology/gf/tree/TreeDestructionSystem.java b/src/main/java/org/terasology/gf/tree/TreeDestructionSystem.java index e54ac09..650b210 100644 --- a/src/main/java/org/terasology/gf/tree/TreeDestructionSystem.java +++ b/src/main/java/org/terasology/gf/tree/TreeDestructionSystem.java @@ -3,7 +3,7 @@ package org.terasology.gf.tree; import org.joml.Vector3f; -import org.joml.Vector3i; +import org.joml.Vector3ic; import org.terasology.engine.entitySystem.entity.EntityManager; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.entitySystem.event.ReceiveEvent; @@ -55,21 +55,21 @@ public void onTreePartDestroyed(BeforeDestroyEvent beforeDestroyEvent, EntityRef if (!processingDestruction) { processingDestruction = true; try { - Vector3i position = component.getPosition(new Vector3i()); + Vector3ic position = component.getPosition(); for (EntityRef testedTree : entityManager.getEntitiesWith(LSystemTreeComponent.class)) { BlockComponent blockComponent = testedTree.getComponent(BlockComponent.class); if (blockComponent != null) { - Vector3i testedPosition = blockComponent.getPosition(new Vector3i()); + Vector3ic testedPosition = blockComponent.getPosition(); - double distance = Math.sqrt((testedPosition.x - position.x) * (testedPosition.x - position.x) - + (testedPosition.z - position.z) * (testedPosition.z - position.z)); + double distance = Math.sqrt((testedPosition.x() - position.x()) * (testedPosition.x() - position.x()) + + (testedPosition.z() - position.z()) * (testedPosition.z() - position.z())); if (distance < Math.sqrt(512)) { String type = testedTree.getComponent(LivingPlantComponent.class).type; PlantGrowthDefinition plantGrowthDefinition = plantRegistry.getPlantGrowthDefinition(type); if (plantGrowthDefinition instanceof ConnectedPlantGrowthDefinition) { ConnectedPlantGrowthDefinition plantDef = (ConnectedPlantGrowthDefinition) plantGrowthDefinition; - Collection blocksConnectedTo = plantDef.getBlocksConnectedTo(worldProvider, blockEntityRegistry, position, testedTree); + Collection blocksConnectedTo = plantDef.getBlocksConnectedTo(worldProvider, blockEntityRegistry, position, testedTree); if (blocksConnectedTo != null) { destroyTheConnectedBlocksAndGatherItems(position, blocksConnectedTo); } @@ -83,7 +83,7 @@ public void onTreePartDestroyed(BeforeDestroyEvent beforeDestroyEvent, EntityRef } } - private void destroyTheConnectedBlocksAndGatherItems(Vector3i position, Collection blocksConnectedTo) { + private void destroyTheConnectedBlocksAndGatherItems(Vector3ic position, Collection blocksConnectedTo) { EntityRef worldEntity = worldProvider.getWorldEntity(); worldEntity.send(new LargeBlockUpdateStarting()); try { @@ -93,8 +93,8 @@ private void destroyTheConnectedBlocksAndGatherItems(Vector3i position, Collecti tempInventoryEntity.addComponent(inventory); Prefab damagePrefab = prefabManager.getPrefab("GrowingFlora:TreeCutDamage"); - for (Vector3i vector3i : blocksConnectedTo) { - blockEntityRegistry.getEntityAt(vector3i).send( + for (Vector3ic blockPosition : blocksConnectedTo) { + blockEntityRegistry.getEntityAt(blockPosition).send( new DestroyEvent(tempInventoryEntity, EntityRef.NULL, damagePrefab)); } diff --git a/src/main/java/org/terasology/gf/tree/lsystem/AdvancedLSystemTreeDefinition.java b/src/main/java/org/terasology/gf/tree/lsystem/AdvancedLSystemTreeDefinition.java index 93ddccb..ad8d392 100644 --- a/src/main/java/org/terasology/gf/tree/lsystem/AdvancedLSystemTreeDefinition.java +++ b/src/main/java/org/terasology/gf/tree/lsystem/AdvancedLSystemTreeDefinition.java @@ -79,13 +79,13 @@ public void generateTree(long seed, String saplingBlock, Chunk chunk, int x, int LSystemTreeComponent treeComponent = createNewTreeComponent(seed, worldPos); // Block locations in world coordinates - Map treeBlocks = generateTreeFromAxion(worldPos, treeComponent.axion, treeComponent.branchAngle, treeComponent.rotationAngle) + Map treeBlocks = generateTreeFromAxion(worldPos, treeComponent.axion, treeComponent.branchAngle, treeComponent.rotationAngle) .gatherBlockDefinitions(); BlockManager blockManager = CoreRegistry.get(BlockManager.class); - for (Map.Entry treeBlock : treeBlocks.entrySet()) { - Vector3i blockLocation = treeBlock.getKey(); + for (Map.Entry treeBlock : treeBlocks.entrySet()) { + Vector3ic blockLocation = treeBlock.getKey(); // Do not set the base block - it will have to be initialized from the sapling if (!blockLocation.equals(worldPos)) { @@ -104,7 +104,7 @@ public void generateTree(long seed, String saplingBlock, Chunk chunk, int x, int } public Long setupTreeBaseBlock(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, EntityRef sapling) { - Vector3i location = sapling.getComponent(BlockComponent.class).getPosition(new Vector3i()); + Vector3ic location = sapling.getComponent(BlockComponent.class).getPosition(); LSystemTreeComponent treeComponent = createNewTreeComponent(worldProvider.getSeed().hashCode(), location); @@ -115,7 +115,7 @@ public Long setupTreeBaseBlock(WorldProvider worldProvider, BlockEntityRegistry int growthWait = rand.nextInt(growthInterval); treeComponent.lastGrowthTime = time - growthWait; - Map treeBlocks = generateTreeFromAxion(location, treeComponent.axion, treeComponent.branchAngle, treeComponent.rotationAngle) + Map treeBlocks = generateTreeFromAxion(location, treeComponent.axion, treeComponent.branchAngle, treeComponent.rotationAngle) .gatherBlockDefinitions(); BlockManager blockManager = CoreRegistry.get(BlockManager.class); @@ -176,7 +176,7 @@ public Long updateTree(WorldProvider worldProvider, BlockEntityRegistry blockEnt return (long) growthInterval; } else { - Vector3i treeLocation = treeRef.getComponent(BlockComponent.class).getPosition(new Vector3i()); + Vector3ic treeLocation = treeRef.getComponent(BlockComponent.class).getPosition(); TreeStructure oldTreeStructure = generateTreeFromAxion(treeLocation, lSystemTree.axion, lSystemTree.branchAngle, lSystemTree.rotationAngle); if (isWholeTreeSpaceLoaded(worldProvider, oldTreeStructure)) { FastRandom rand = new FastRandom(); @@ -199,7 +199,7 @@ public Long updateTree(WorldProvider worldProvider, BlockEntityRegistry blockEnt } } - private Long checkForDeathAndSetupComponents(BlockEntityRegistry blockEntityRegistry, Random random, Vector3i location, LSystemTreeComponent treeComponent) { + private Long checkForDeathAndSetupComponents(BlockEntityRegistry blockEntityRegistry, Random random, Vector3ic location, LSystemTreeComponent treeComponent) { EntityRef entity = blockEntityRegistry.getBlockEntityAt(location); if (entity.hasComponent(LSystemTreeComponent.class)) { entity.saveComponent(treeComponent); @@ -227,11 +227,11 @@ private boolean checkForDeath(int generation, float random) { if (generation < treeLongevity.getMin()) { return false; } - double deathChance = Math.pow(1f * (treeLongevity.getMax() - generation) / treeLongevity.range, 0.2); + double deathChance = Math.pow((treeLongevity.getMax() - generation) / treeLongevity.range, 0.2); return (deathChance < random); } - private Block getBlock(BlockManager blockManager, TreeBlockDefinition block, Vector3i location, Collection treeBlocks) { + private Block getBlock(BlockManager blockManager, TreeBlockDefinition block, Vector3ic location, Collection treeBlocks) { BlockUri blockFamilyUri = new BlockUri(block.getBlockUri()); if (block.isBranchBlock()) { byte connections = 0; @@ -250,18 +250,18 @@ private Block getBlock(BlockManager blockManager, TreeBlockDefinition block, Vec } private boolean updateTreeInGame(WorldProvider worldProvider, - Map currentTree, Map nextTree) { + Map currentTree, Map nextTree) { BlockManager blockManager = CoreRegistry.get(BlockManager.class); Block air = blockManager.getBlock(BlockManager.AIR_ID); int replaceCount = 0; - Map blocksToReplaceExistingTreeBlocks = new HashMap<>(); - Map blocksToPlaceInNewPlaces = new HashMap<>(); + Map blocksToReplaceExistingTreeBlocks = new HashMap<>(); + Map blocksToPlaceInNewPlaces = new HashMap<>(); EntityRef worldEntity = worldProvider.getWorldEntity(); - for (Map.Entry newTreeBlock : nextTree.entrySet()) { - Vector3i location = newTreeBlock.getKey(); + for (Map.Entry newTreeBlock : nextTree.entrySet()) { + Vector3ic location = newTreeBlock.getKey(); TreeBlockDefinition oldBlock = currentTree.remove(location); TreeBlockDefinition newBlock = newTreeBlock.getValue(); @@ -272,7 +272,7 @@ private boolean updateTreeInGame(WorldProvider worldProvider, replaceCount++; } else if (oldBlock == null) { if (worldProvider.getBlock(location).isReplacementAllowed()) { - blocksToPlaceInNewPlaces.put(location, resultBlock); + blocksToPlaceInNewPlaces.put(new Vector3i(location), resultBlock); replaceCount++; } } @@ -284,13 +284,13 @@ private boolean updateTreeInGame(WorldProvider worldProvider, worldProvider.getWorldEntity().send(placeBlocks); if (!placeBlocks.isConsumed()) { - for (Vector3i location : currentTree.keySet()) { + for (Vector3ic location : currentTree.keySet()) { // Remove the old block of tree blocksToReplaceExistingTreeBlocks.put(location, air); replaceCount++; } - for (Map.Entry blockLocation : blocksToReplaceExistingTreeBlocks.entrySet()) { + for (Map.Entry blockLocation : blocksToReplaceExistingTreeBlocks.entrySet()) { worldProvider.setBlock(blockLocation.getKey(), blockLocation.getValue()); } @@ -321,7 +321,7 @@ private String generateNextAxion(Random rand, String currentAxion) { return result.toString(); } - private TreeStructure generateTreeFromAxion(Vector3i location, String currentAxion, float angle, float treeRotation) { + private TreeStructure generateTreeFromAxion(Vector3ic location, String currentAxion, float angle, float treeRotation) { TreeStructure treeStructure = new TreeStructure(); Deque stackPosition = Queues.newArrayDeque(); @@ -331,7 +331,7 @@ private TreeStructure generateTreeFromAxion(Vector3i location, String currentAxi BranchLocation branchLocation = treeStructure.getRootBranch(); Vector3f position = new Vector3f(location); //TODO: use Quaternionf directly, as in https://github.com/Terasology/CoreWorlds/commit/6484ebc671bf27511a7eebceeb67e19968d7f33c - Matrix4f rotation = new Matrix4f().translationRotateScale(new Vector3f(),new Quaternionf().setAngleAxis(treeRotation,0,1,0), 1.0f); + Matrix4f rotation = new Matrix4f().translationRotateScale(new Vector3f(), new Quaternionf().setAngleAxis(treeRotation, 0, 1, 0), 1.0f); Callback callback = new Callback(position, rotation); callback.setBranchLocation(branchLocation); @@ -421,32 +421,32 @@ private static List parseAxions(String axionString) { return result; } - public boolean isBlockOwnedByPlant(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, Vector3i block, EntityRef treeRef) { + public boolean isBlockOwnedByPlant(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, Vector3ic block, EntityRef treeRef) { LSystemTreeComponent lSystemTree = treeRef.getComponent(LSystemTreeComponent.class); if (lSystemTree == null) { return false; } - Vector3i location = treeRef.getComponent(BlockComponent.class).getPosition(new Vector3i()); + Vector3ic location = treeRef.getComponent(BlockComponent.class).getPosition(); - Map treeBlockMap = generateTreeFromAxion(location, lSystemTree.axion, lSystemTree.branchAngle, lSystemTree.rotationAngle) + Map treeBlockMap = generateTreeFromAxion(location, lSystemTree.axion, lSystemTree.branchAngle, lSystemTree.rotationAngle) .gatherBlockDefinitions(); - return treeBlockMap.containsKey(new Vector3i(block.x - location.x, block.y - location.y, block.z - location.z)); + return treeBlockMap.containsKey(new Vector3i(block).sub(location)); } - public Collection getBlocksConnectedTo(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, Vector3i block, EntityRef treeRef) { + public Collection getBlocksConnectedTo(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, Vector3ic block, EntityRef treeRef) { // Is it a tree at all LSystemTreeComponent lSystemTree = treeRef.getComponent(LSystemTreeComponent.class); if (lSystemTree == null) { return null; } - Vector3i treeRootLocation = treeRef.getComponent(BlockComponent.class).getPosition(new Vector3i()); + Vector3ic treeRootLocation = treeRef.getComponent(BlockComponent.class).getPosition(); // Does this tree have a block defined at that coordinate TreeStructure treeStructure = generateTreeFromAxion(treeRootLocation, lSystemTree.axion, lSystemTree.branchAngle, lSystemTree.rotationAngle); - Map treeBlockMap = treeStructure.gatherBlockDefinitions(); + Map treeBlockMap = treeStructure.gatherBlockDefinitions(); TreeBlockDefinition expectedBlockDefinition = treeBlockMap.get(block); if (expectedBlockDefinition == null) { return null; @@ -465,33 +465,33 @@ public Collection getBlocksConnectedTo(WorldProvider worldProvider, Bl private final class TreeStructure { private BranchLocation rootBranch = new BranchLocation(0); - private Map blockDefinitionsCache; + private Map blockDefinitionsCache; public BranchLocation getRootBranch() { return rootBranch; } - public Map gatherBlockDefinitions() { + public Map gatherBlockDefinitions() { if (blockDefinitionsCache != null) { return blockDefinitionsCache; } - Map result = new LinkedHashMap<>(); + Map result = new LinkedHashMap<>(); rootBranch.fillBlockDefinitions(result); blockDefinitionsCache = result; return result; } - public Collection getBlocksConnectedTo(WorldProvider worldProvider, Vector3i block) { + public Collection getBlocksConnectedTo(WorldProvider worldProvider, Vector3ic block) { PositionOfBlock pob = rootBranch.getPositionOfBlock(block); if (pob == null) { return Collections.emptySet(); } - Map blockDefinitionsBeforeTrim = gatherBlockDefinitions(); + Map blockDefinitionsBeforeTrim = gatherBlockDefinitions(); - Map connected = new LinkedHashMap<>(blockDefinitionsBeforeTrim); - Iterator> blockIterator = connected.entrySet().iterator(); + Map connected = new LinkedHashMap<>(blockDefinitionsBeforeTrim); + Iterator> blockIterator = connected.entrySet().iterator(); while (blockIterator.hasNext()) { - Map.Entry blockAtLocation = blockIterator.next(); + Map.Entry blockAtLocation = blockIterator.next(); Block blockInWorld = worldProvider.getBlock(blockAtLocation.getKey()); BlockUri familyUri = blockInWorld.getBlockFamily().getURI(); @@ -503,9 +503,9 @@ public Collection getBlocksConnectedTo(WorldProvider worldProvider, Ve pob.branchLocation.trimEverythingAfter(pob.axionIndex); blockDefinitionsCache = null; - Map blockDefinitionsAfterTrim = gatherBlockDefinitions(); + Map blockDefinitionsAfterTrim = gatherBlockDefinitions(); - for (Vector3i location : blockDefinitionsAfterTrim.keySet()) { + for (Vector3ic location : blockDefinitionsAfterTrim.keySet()) { connected.remove(location); } @@ -520,13 +520,13 @@ public BlockRegion getTreeRegion() { int maxY = Integer.MIN_VALUE; int maxZ = Integer.MIN_VALUE; - for (Vector3i block : gatherBlockDefinitions().keySet()) { - minX = Math.min(minX, block.x); - minY = Math.min(minY, block.y); - minZ = Math.min(minZ, block.z); - maxX = Math.max(maxX, block.x); - maxY = Math.max(maxY, block.y); - maxZ = Math.max(maxZ, block.z); + for (Vector3ic block : gatherBlockDefinitions().keySet()) { + minX = Math.min(minX, block.x()); + minY = Math.min(minY, block.y()); + minZ = Math.min(minZ, block.z()); + maxX = Math.max(maxX, block.x()); + maxY = Math.max(maxY, block.y()); + maxZ = Math.max(maxZ, block.z()); } return new BlockRegion(minX, minY, minZ, maxX, maxY, maxZ); } @@ -534,8 +534,8 @@ public BlockRegion getTreeRegion() { private final class BranchLocation { private int startIndex; - private Map mainBlocks = new LinkedHashMap<>(); - private Map> indexBlocks = new LinkedHashMap<>(); + private Map mainBlocks = new LinkedHashMap<>(); + private Map> indexBlocks = new LinkedHashMap<>(); private List branches = new LinkedList<>(); @@ -549,18 +549,12 @@ public BranchLocation addBranch(int branchStartIndex) { return result; } - public void setMainBlock(int index, Vector3i vector) { - if (mainBlocks.get(vector) == null) { - mainBlocks.put(vector, index); - } + public void setMainBlock(int index, Vector3ic vector) { + mainBlocks.putIfAbsent(vector, index); } - public void addTreeBlock(int index, Vector3i vector, TreeBlockDefinition blockDefinition) { - Map blockAtPositions = indexBlocks.get(index); - if (blockAtPositions == null) { - blockAtPositions = new LinkedHashMap<>(); - indexBlocks.put(index, blockAtPositions); - } + public void addTreeBlock(int index, Vector3ic vector, TreeBlockDefinition blockDefinition) { + Map blockAtPositions = indexBlocks.computeIfAbsent(index, k -> new LinkedHashMap<>()); putDefinitionIfMoreImportant(vector, blockDefinition, blockAtPositions); } @@ -569,33 +563,21 @@ public int getStartIndex() { } public void trimEverythingAfter(int index) { - Iterator>> axiomElements = indexBlocks.entrySet().iterator(); - while (axiomElements.hasNext()) { - Map.Entry> axiomElement = axiomElements.next(); - if (axiomElement.getKey() > index) { - axiomElements.remove(); - } - } + indexBlocks.entrySet().removeIf(axiomElement -> axiomElement.getKey() > index); - Iterator branchesIterator = branches.iterator(); - while (branchesIterator.hasNext()) { - BranchLocation branch = branchesIterator.next(); - if (branch.getStartIndex() > index) { - branchesIterator.remove(); - } - } + branches.removeIf(branch -> branch.getStartIndex() > index); } - private void putDefinitionIfMoreImportant(Vector3i vector, TreeBlockDefinition blockDefinition, Map blockAtPositions) { + private void putDefinitionIfMoreImportant(Vector3ic vector, TreeBlockDefinition blockDefinition, Map blockAtPositions) { TreeBlockDefinition oldDefinition = blockAtPositions.get(vector); if (oldDefinition == null || oldDefinition.getTreePart().getPriority() < blockDefinition.getTreePart().getPriority()) { blockAtPositions.put(vector, blockDefinition); } } - public void fillBlockDefinitions(Map result) { - for (Map blockDefinitions : indexBlocks.values()) { - for (Map.Entry blockDefinition : blockDefinitions.entrySet()) { + public void fillBlockDefinitions(Map result) { + for (Map blockDefinitions : indexBlocks.values()) { + for (Map.Entry blockDefinition : blockDefinitions.entrySet()) { putDefinitionIfMoreImportant(blockDefinition.getKey(), blockDefinition.getValue(), result); } } @@ -605,7 +587,7 @@ public void fillBlockDefinitions(Map result) { } } - public PositionOfBlock getPositionOfBlock(Vector3i block) { + public PositionOfBlock getPositionOfBlock(Vector3ic block) { Integer result = mainBlocks.get(block); if (result != null) { return new PositionOfBlock(result, this); diff --git a/src/main/java/org/terasology/gf/tree/lsystem/LSystemBasedTreeGrowthDefinition.java b/src/main/java/org/terasology/gf/tree/lsystem/LSystemBasedTreeGrowthDefinition.java index 97f0ef7..f8c4a28 100644 --- a/src/main/java/org/terasology/gf/tree/lsystem/LSystemBasedTreeGrowthDefinition.java +++ b/src/main/java/org/terasology/gf/tree/lsystem/LSystemBasedTreeGrowthDefinition.java @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 package org.terasology.gf.tree.lsystem; -import org.joml.Vector3i; +import org.joml.Vector3ic; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.world.BlockEntityRegistry; import org.terasology.engine.world.WorldProvider; @@ -45,12 +45,12 @@ public boolean randomUpdatePlant(WorldProvider worldProvider, LocalParameters lo } @Override - public boolean isBlockOwnedByPlant(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, Vector3i block, EntityRef plant) { + public boolean isBlockOwnedByPlant(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, Vector3ic block, EntityRef plant) { return getTreeDefinition().isBlockOwnedByPlant(worldProvider, blockEntityRegistry, block, plant); } @Override - public Collection getBlocksConnectedTo(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, Vector3i block, EntityRef plant) { + public Collection getBlocksConnectedTo(WorldProvider worldProvider, BlockEntityRegistry blockEntityRegistry, Vector3ic block, EntityRef plant) { return getTreeDefinition().getBlocksConnectedTo(worldProvider, blockEntityRegistry, block, plant); } } From d11aa62814783215844fbdbe94eb268aa340a277 Mon Sep 17 00:00:00 2001 From: tolziplohu Date: Tue, 17 Aug 2021 15:59:52 -0500 Subject: [PATCH 6/6] fix: make ClimateConditions completely optional --- .../gf/EnvironmentParametersSystem.java | 24 +++++++++++++++++++ .../org/terasology/gf/PlantGrowingSystem.java | 19 +++++++++++---- .../gf/SaplingInitializeSystem.java | 18 ++++++++++---- .../gf/util/StaticLocalParameters.java | 17 +++++++++++++ 4 files changed, 68 insertions(+), 10 deletions(-) create mode 100644 src/main/java/org/terasology/gf/EnvironmentParametersSystem.java create mode 100644 src/main/java/org/terasology/gf/util/StaticLocalParameters.java diff --git a/src/main/java/org/terasology/gf/EnvironmentParametersSystem.java b/src/main/java/org/terasology/gf/EnvironmentParametersSystem.java new file mode 100644 index 0000000..552ce27 --- /dev/null +++ b/src/main/java/org/terasology/gf/EnvironmentParametersSystem.java @@ -0,0 +1,24 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + +package org.terasology.gf; + +import org.joml.Vector3ic; +import org.terasology.climateConditions.ClimateConditionsSystem; +import org.terasology.engine.entitySystem.systems.BaseComponentSystem; +import org.terasology.engine.entitySystem.systems.RegisterSystem; +import org.terasology.engine.registry.In; +import org.terasology.engine.registry.Share; +import org.terasology.gf.util.EnvironmentLocalParameters; +import org.terasology.gf.util.LocalParameters; + +@RegisterSystem +@Share(EnvironmentParametersSystem.class) +public class EnvironmentParametersSystem extends BaseComponentSystem { + @In + private ClimateConditionsSystem climateConditionsSystem; + + public LocalParameters createLocalParameters(Vector3ic position) { + return new EnvironmentLocalParameters(climateConditionsSystem, position); + } +} diff --git a/src/main/java/org/terasology/gf/PlantGrowingSystem.java b/src/main/java/org/terasology/gf/PlantGrowingSystem.java index 614cbf0..bc3635e 100644 --- a/src/main/java/org/terasology/gf/PlantGrowingSystem.java +++ b/src/main/java/org/terasology/gf/PlantGrowingSystem.java @@ -15,9 +15,9 @@ */ package org.terasology.gf; +import org.joml.Vector3ic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.terasology.climateConditions.ClimateConditionsSystem; import org.terasology.engine.core.Time; import org.terasology.engine.entitySystem.entity.EntityManager; import org.terasology.engine.entitySystem.entity.EntityRef; @@ -33,7 +33,8 @@ import org.terasology.engine.world.WorldProvider; import org.terasology.engine.world.block.BlockComponent; import org.terasology.gf.generator.PlantGrowthDefinition; -import org.terasology.gf.util.EnvironmentLocalParameters; +import org.terasology.gf.util.LocalParameters; +import org.terasology.gf.util.StaticLocalParameters; import org.terasology.randomUpdate.RandomUpdateEvent; /** @@ -57,7 +58,15 @@ public class PlantGrowingSystem extends BaseComponentSystem { @In private DelayManager delayManager; @In - private ClimateConditionsSystem environmentSystem; + private EnvironmentParametersSystem environmentSystem; + + private LocalParameters createLocalParameters(Vector3ic position) { + if (environmentSystem != null) { + return environmentSystem.createLocalParameters(position); + } else { + return new StaticLocalParameters(); + } + } @ReceiveEvent public void updatePlant(DelayedActionTriggeredEvent event, EntityRef plant, LivingPlantComponent plantComponent, BlockComponent blockComponent) { @@ -65,7 +74,7 @@ public void updatePlant(DelayedActionTriggeredEvent event, EntityRef plant, Livi PerformanceMonitor.startActivity("GrowingFlora - Updating plant"); try { PlantGrowthDefinition plantDefinition = plantRegistry.getPlantGrowthDefinition(plantComponent.type); - Long updateDelay = plantDefinition.requestedUpdatePlant(worldProvider, new EnvironmentLocalParameters(environmentSystem, blockComponent.getPosition()), blockEntityRegistry, plant); + Long updateDelay = plantDefinition.requestedUpdatePlant(worldProvider, createLocalParameters(blockComponent.getPosition()), blockEntityRegistry, plant); if (updateDelay != null) { delayManager.addDelayedAction(plant, UPDATE_PLANT_ACTION_ID, updateDelay); } @@ -80,7 +89,7 @@ public void randomPlantUpdate(RandomUpdateEvent event, EntityRef plant, LivingPl PerformanceMonitor.startActivity("GrowingFlora - Updating plant"); try { PlantGrowthDefinition plantDefinition = plantRegistry.getPlantGrowthDefinition(plantComponent.type); - if (plantDefinition.randomUpdatePlant(worldProvider, new EnvironmentLocalParameters(environmentSystem, blockComponent.getPosition()), blockEntityRegistry, plant)) { + if (plantDefinition.randomUpdatePlant(worldProvider, createLocalParameters(blockComponent.getPosition()), blockEntityRegistry, plant)) { if (delayManager.hasDelayedAction(plant, UPDATE_PLANT_ACTION_ID)) { delayManager.cancelDelayedAction(plant, UPDATE_PLANT_ACTION_ID); } diff --git a/src/main/java/org/terasology/gf/SaplingInitializeSystem.java b/src/main/java/org/terasology/gf/SaplingInitializeSystem.java index afced6a..ad3e321 100644 --- a/src/main/java/org/terasology/gf/SaplingInitializeSystem.java +++ b/src/main/java/org/terasology/gf/SaplingInitializeSystem.java @@ -18,7 +18,6 @@ import org.joml.Vector3ic; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.terasology.climateConditions.ClimateConditionsSystem; import org.terasology.engine.entitySystem.entity.EntityRef; import org.terasology.engine.entitySystem.entity.lifecycleEvents.OnAddedComponent; import org.terasology.engine.entitySystem.event.ReceiveEvent; @@ -33,7 +32,8 @@ import org.terasology.engine.world.WorldProvider; import org.terasology.engine.world.block.BlockComponent; import org.terasology.gf.generator.PlantGrowthDefinition; -import org.terasology.gf.util.EnvironmentLocalParameters; +import org.terasology.gf.util.LocalParameters; +import org.terasology.gf.util.StaticLocalParameters; /** * @author Marcin Sciesinski @@ -52,7 +52,15 @@ public class SaplingInitializeSystem extends BaseComponentSystem { @In private DelayManager delayManager; @In - private ClimateConditionsSystem climateConditionsSystem; + private EnvironmentParametersSystem environmentSystem; + + private LocalParameters createLocalParameters(Vector3ic position) { + if (environmentSystem != null) { + return environmentSystem.createLocalParameters(position); + } else { + return new StaticLocalParameters(); + } + } // To avoid stack overflow private boolean processingEvent; @@ -70,10 +78,10 @@ public void plantedSapling(OnAddedComponent event, EntityRef sapling, LivingPlan if (!processingEvent) { processingEvent = true; try { - Vector3i blockLocation = blockComponent.getPosition(new Vector3i()); + Vector3ic blockLocation = blockComponent.getPosition(); String saplingType = livingPlant.type; PlantGrowthDefinition plantDefinition = plantRegistry.getPlantGrowthDefinition(saplingType); - Long updateDelay = plantDefinition.initializePlantedPlant(worldProvider, new EnvironmentLocalParameters(climateConditionsSystem, blockLocation), blockEntityRegistry, sapling); + Long updateDelay = plantDefinition.initializePlantedPlant(worldProvider, createLocalParameters(blockLocation), blockEntityRegistry, sapling); EntityRef blockEntity = blockEntityRegistry.getBlockEntityAt(blockLocation); if (blockEntity.hasComponent(PlantedSaplingComponent.class)) { blockEntity.removeComponent(PlantedSaplingComponent.class); diff --git a/src/main/java/org/terasology/gf/util/StaticLocalParameters.java b/src/main/java/org/terasology/gf/util/StaticLocalParameters.java new file mode 100644 index 0000000..0de2a33 --- /dev/null +++ b/src/main/java/org/terasology/gf/util/StaticLocalParameters.java @@ -0,0 +1,17 @@ +// Copyright 2021 The Terasology Foundation +// SPDX-License-Identifier: Apache-2.0 + +package org.terasology.gf.util; + +public class StaticLocalParameters implements LocalParameters { + + @Override + public float getTemperature() { + return 0.5f; + } + + @Override + public float getHumidity() { + return 0.5f; + } +}