Skip to content

Commit

Permalink
added feature appender/prepender for simple adds
Browse files Browse the repository at this point in the history
  • Loading branch information
dags- committed Jun 20, 2020
1 parent 95307b3 commit a3943cc
Show file tree
Hide file tree
Showing 5 changed files with 92 additions and 11 deletions.
8 changes: 6 additions & 2 deletions src/main/java/com/terraforged/fm/FeatureManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,11 @@
package com.terraforged.fm;

import com.terraforged.fm.biome.BiomeFeatures;
import com.terraforged.fm.data.DataManager;
import com.terraforged.fm.modifier.FeatureModifierLoader;
import com.terraforged.fm.modifier.FeatureModifiers;
import com.terraforged.fm.modifier.ModifierSet;
import com.terraforged.fm.template.TemplateManager;
import com.terraforged.fm.data.DataManager;
import net.minecraft.world.IWorld;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.gen.GenerationStage;
Expand Down Expand Up @@ -108,12 +108,16 @@ public static FeatureManager create(IWorld world, FeatureModifiers modifiers) {
private static BiomeFeatures compute(Biome biome, FeatureModifiers modifiers) {
BiomeFeatures.Builder builder = BiomeFeatures.builder();
for (GenerationStage.Decoration stage : GenerationStage.Decoration.values()) {
builder.add(stage, modifiers.getPrependers(stage, biome));

for (ConfiguredFeature<?, ?> feature : biome.getFeatures(stage)) {
ModifierSet modifierSet = modifiers.getFeature(biome, feature);
ModifierSet modifierSet = modifiers.getFeature(stage, biome, feature);
builder.add(stage, modifierSet.before);
builder.add(stage, modifierSet.feature);
builder.add(stage, modifierSet.after);
}

builder.add(stage, modifiers.getPrependers(stage, biome));
}
return builder.build();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,18 @@
package com.terraforged.fm.modifier;

import com.google.gson.JsonObject;
import com.terraforged.fm.transformer.FeatureInjector;
import com.terraforged.fm.transformer.FeatureParser;
import com.terraforged.fm.transformer.FeatureReplacer;
import com.terraforged.fm.transformer.FeatureTransformer;
import com.terraforged.fm.FeatureManager;
import com.terraforged.fm.data.DataManager;
import com.terraforged.fm.matcher.BiomeFeatureMatcher;
import com.terraforged.fm.matcher.biome.BiomeMatcher;
import com.terraforged.fm.matcher.biome.BiomeMatcherParser;
import com.terraforged.fm.matcher.feature.FeatureMatcher;
import com.terraforged.fm.matcher.feature.FeatureMatcherParser;
import com.terraforged.fm.transformer.FeatureAppender;
import com.terraforged.fm.transformer.FeatureInjector;
import com.terraforged.fm.transformer.FeatureParser;
import com.terraforged.fm.transformer.FeatureReplacer;
import com.terraforged.fm.transformer.FeatureTransformer;
import net.minecraft.util.ResourceLocation;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.MarkerManager;
Expand Down Expand Up @@ -69,6 +70,13 @@ private static boolean load(ResourceLocation location, JsonObject root, FeatureM
return false;
}

Optional<FeatureAppender> appender = FeatureParser.parseAppender(root);
if (appender.isPresent()) {
BiomeFeatureMatcher biomeFeatureMatcher = new BiomeFeatureMatcher(biome.get(), FeatureMatcher.ANY);
modifiers.getAppenders().add(biomeFeatureMatcher, appender.get());
return true;
}

Optional<FeatureMatcher> matcher = FeatureMatcherParser.parse(root);
if (!matcher.isPresent()) {
FeatureManager.LOG.error(LOAD, " Invalid FeatureMatcher in: {}", location);
Expand Down
45 changes: 40 additions & 5 deletions src/main/java/com/terraforged/fm/modifier/FeatureModifiers.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,17 +26,20 @@
package com.terraforged.fm.modifier;

import com.google.gson.JsonElement;
import com.terraforged.fm.predicate.FeaturePredicate;
import com.terraforged.fm.transformer.FeatureInjector;
import com.terraforged.fm.transformer.FeatureReplacer;
import com.terraforged.fm.transformer.FeatureTransformer;
import com.terraforged.fm.FeatureManager;
import com.terraforged.fm.FeatureSerializer;
import com.terraforged.fm.biome.BiomeFeature;
import com.terraforged.fm.matcher.dynamic.DynamicList;
import com.terraforged.fm.matcher.dynamic.DynamicPredicate;
import com.terraforged.fm.predicate.BiomePredicate;
import com.terraforged.fm.predicate.FeaturePredicate;
import com.terraforged.fm.transformer.FeatureAppender;
import com.terraforged.fm.transformer.FeatureInjector;
import com.terraforged.fm.transformer.FeatureReplacer;
import com.terraforged.fm.transformer.FeatureTransformer;
import com.terraforged.fm.util.FeatureDebugger;
import net.minecraft.world.biome.Biome;
import net.minecraft.world.gen.GenerationStage;
import net.minecraft.world.gen.feature.ConfiguredFeature;
import net.minecraftforge.eventbus.api.Event;

Expand All @@ -49,6 +52,7 @@ public class FeatureModifiers extends Event {
private final DynamicList dynamics = new DynamicList();
private final ModifierList<FeatureReplacer> replacers = new ModifierList<>();
private final ModifierList<FeatureInjector> injectors = new ModifierList<>();
private final ModifierList<FeatureAppender> appenders = new ModifierList<>();
private final ModifierList<FeaturePredicate> predicates = new ModifierList<>();
private final ModifierList<FeatureTransformer> transformers = new ModifierList<>();

Expand All @@ -64,6 +68,10 @@ public ModifierList<FeatureInjector> getInjectors() {
return injectors;
}

public ModifierList<FeatureAppender> getAppenders() {
return appenders;
}

public ModifierList<FeaturePredicate> getPredicates() {
return predicates;
}
Expand All @@ -78,7 +86,15 @@ public void sort() {
transformers.sort();
}

public ModifierSet getFeature(Biome biome, ConfiguredFeature<?, ?> feature) {
public List<BiomeFeature> getPrependers(GenerationStage.Decoration stage, Biome biome) {
return getAppenders(stage, FeatureInjector.Type.BEFORE, biome);
}

public List<BiomeFeature> getAppenders(GenerationStage.Decoration stage, Biome biome) {
return getAppenders(stage, FeatureInjector.Type.AFTER, biome);
}

public ModifierSet getFeature(GenerationStage.Decoration stage, Biome biome, ConfiguredFeature<?, ?> feature) {
try {
JsonElement element = FeatureSerializer.serialize(feature);
ConfiguredFeature<?, ?> result = getFeature(biome, feature, element);
Expand Down Expand Up @@ -155,6 +171,25 @@ private List<BiomeFeature> getInjectors(Biome biome, FeaturePredicate predicate,
return result;
}

private List<BiomeFeature> getAppenders(GenerationStage.Decoration stage, FeatureInjector.Type type, Biome biome) {
List<BiomeFeature> result = Collections.emptyList();
for (Modifier<FeatureAppender> modifier : getAppenders()) {
if (modifier.getModifier().getType() != type) {
continue;
}
if (modifier.getModifier().getStage() != stage) {
continue;
}
if (modifier.getMatcher().getBiomeMatcher().test(biome)) {
if (result.isEmpty()) {
result = new ArrayList<>();
}
result.add(new BiomeFeature(BiomePredicate.ALLOW, modifier.getModifier().getFeature()));
}
}
return result;
}

private FeaturePredicate getPredicate(ConfiguredFeature<?, ?> feature) {
for (DynamicPredicate predicate : dynamics) {
if (predicate.getMatcher().test(feature)) {
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/com/terraforged/fm/transformer/FeatureAppender.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.terraforged.fm.transformer;

import net.minecraft.world.gen.GenerationStage;
import net.minecraft.world.gen.feature.ConfiguredFeature;

public class FeatureAppender extends FeatureInjector {

private final GenerationStage.Decoration stage;

public FeatureAppender(ConfiguredFeature<?, ?> feature, Type type, GenerationStage.Decoration stage) {
super(feature, type);
this.stage = stage;
}

public GenerationStage.Decoration getStage() {
return stage;
}
}
16 changes: 16 additions & 0 deletions src/main/java/com/terraforged/fm/transformer/FeatureParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.terraforged.fm.FeatureSerializer;
import net.minecraft.world.gen.GenerationStage;

import java.util.Map;
import java.util.Optional;
Expand All @@ -54,6 +55,21 @@ public static Optional<FeatureInjector> parseInjector(JsonObject root) {
return Optional.empty();
}

public static Optional<FeatureAppender> parseAppender(JsonObject root) {
if (root.has("stage")) {
GenerationStage.Decoration stage = GenerationStage.Decoration.valueOf(root.get("stage").getAsString());
if (root.has("prepend")) {
return FeatureSerializer.deserialize(root.get("prepend"))
.map(feature -> new FeatureAppender(feature, FeatureInjector.Type.BEFORE, stage));
}
if (root.has("append")) {
return FeatureSerializer.deserialize(root.get("append"))
.map(feature -> new FeatureAppender(feature, FeatureInjector.Type.AFTER, stage));
}
}
return Optional.empty();
}

public static Optional<FeatureTransformer> parseTransformer(JsonObject root) {
if (root.has("transform")) {
return parseTransform(root.get("transform"));
Expand Down

0 comments on commit a3943cc

Please sign in to comment.