diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/StructureFeatureLoader.java b/src/main/java/com/dfsek/terra/config/loaders/config/StructureFeatureLoader.java index ea39d70a4..35acae3ee 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/config/StructureFeatureLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/config/StructureFeatureLoader.java @@ -3,13 +3,30 @@ package com.dfsek.terra.config.loaders.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.structure.features.EntityFeature; import com.dfsek.terra.structure.features.Feature; +import com.dfsek.terra.util.MaterialSet; +import org.bukkit.entity.EntityType; +import org.polydev.gaea.math.Range; import java.lang.reflect.Type; +import java.util.Map; +@SuppressWarnings({"unchecked", "SwitchStatementWithTooFewBranches"}) // We will do more features laterTM public class StructureFeatureLoader implements TypeLoader { @Override public Feature load(Type type, Object o, ConfigLoader configLoader) throws LoadException { - return null; + Map map = (Map) o; + switch((String) map.get("type")) { + case "ENTITY_FEATURE": + MaterialSet stand = (MaterialSet) configLoader.loadType(MaterialSet.class, map.get("spawnable-on")); + MaterialSet in = (MaterialSet) configLoader.loadType(MaterialSet.class, map.get("spawnable-in")); + Range amount = (Range) configLoader.loadType(Range.class, map.get("amount")); + EntityType entityType = (EntityType) configLoader.loadType(EntityType.class, map.get("entity")); + Integer height = (Integer) configLoader.loadType(Integer.class, map.get("in-height")); + return new EntityFeature(entityType, amount, stand, in, height); + default: + throw new LoadException("Invalid feature type: \"" + map.get("type") + "\""); + } } } diff --git a/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java b/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java index 3f1887cf8..ebcf1ed45 100644 --- a/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java @@ -1,13 +1,17 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; +import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.procgen.GridSpawn; import com.dfsek.terra.structure.Structure; +import com.dfsek.terra.structure.features.Feature; import org.polydev.gaea.math.ProbabilityCollection; import org.polydev.gaea.math.Range; import org.polydev.gaea.structures.loot.LootTable; +import org.polydev.gaea.util.GlueList; +import java.util.List; import java.util.Map; @SuppressWarnings("unused") @@ -36,6 +40,11 @@ public class StructureTemplate extends AbstractableTemplate { @Abstractable private Map loot; + @Value("features") + @Abstractable + @Default + private final List features = new GlueList<>(); + public Map getLoot() { return loot; } @@ -56,6 +65,9 @@ public class StructureTemplate extends AbstractableTemplate { return bound; } + public List getFeatures() { + return features; + } public GridSpawn getSpawn() { return spawn; diff --git a/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/src/main/java/com/dfsek/terra/population/StructurePopulator.java index a3c892e04..921e6f2b0 100644 --- a/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -11,6 +11,7 @@ import com.dfsek.terra.procgen.math.Vector2; import com.dfsek.terra.structure.Rotation; import com.dfsek.terra.structure.Structure; import com.dfsek.terra.structure.StructureContainedInventory; +import com.dfsek.terra.structure.features.Feature; import com.dfsek.terra.util.PopulationUtil; import com.dfsek.terra.util.structure.RotationUtil; import net.jafama.FastMath; @@ -72,8 +73,7 @@ public class StructurePopulator extends BlockPopulator { Debug.stack(e); } } - //for(Feature f : conf.getFeatures()) f.apply(struc, rotation, spawn, chunk); // Apply features. - // TODO: features + for(Feature f : conf.getTemplate().getFeatures()) f.apply(struc, rotation, spawn, chunk); // Apply features. break; } } diff --git a/src/main/java/com/dfsek/terra/util/ConfigUtil.java b/src/main/java/com/dfsek/terra/util/ConfigUtil.java index 5e4b89360..959275a3b 100644 --- a/src/main/java/com/dfsek/terra/util/ConfigUtil.java +++ b/src/main/java/com/dfsek/terra/util/ConfigUtil.java @@ -12,6 +12,7 @@ import com.dfsek.terra.config.loaders.config.GridSpawnLoader; import com.dfsek.terra.config.loaders.config.NoiseBuilderLoader; import com.dfsek.terra.config.loaders.config.OreConfigLoader; import com.dfsek.terra.config.loaders.config.OreHolderLoader; +import com.dfsek.terra.config.loaders.config.StructureFeatureLoader; import com.dfsek.terra.config.loaders.config.TreeLayerLoader; import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader; import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader; @@ -24,10 +25,12 @@ import com.dfsek.terra.generation.items.ores.OreConfig; import com.dfsek.terra.generation.items.ores.OreHolder; import com.dfsek.terra.generation.items.tree.TreeLayer; import com.dfsek.terra.procgen.GridSpawn; +import com.dfsek.terra.structure.features.Feature; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; +import org.bukkit.entity.EntityType; import org.polydev.gaea.math.ProbabilityCollection; import org.polydev.gaea.math.Range; @@ -54,6 +57,8 @@ public final class ConfigUtil { .registerLoader(TreeLayer.class, new TreeLayerLoader()) .registerLoader(MaterialSet.class, new MaterialSetLoader()) .registerLoader(OreHolder.class, new OreHolderLoader()) + .registerLoader(Feature.class, new StructureFeatureLoader()) + .registerLoader(EntityType.class, (t, o, l) -> EntityType.valueOf((String) o)) .registerLoader(StructureTypeEnum.class, (t, o, l) -> StructureTypeEnum.valueOf((String) o)) .registerLoader(TerraFlora.Search.class, (t, o, l) -> TerraFlora.Search.valueOf((String) o)); }