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; + } +}