implement SELF biome without horrible null impl

This commit is contained in:
dfsek
2021-12-07 20:51:56 -07:00
parent 163129e245
commit f0385e4096
7 changed files with 63 additions and 18 deletions
@@ -26,6 +26,7 @@ import com.dfsek.terra.addons.biome.pipeline.source.BiomeSource;
import com.dfsek.terra.addons.manifest.api.AddonInitializer; import com.dfsek.terra.addons.manifest.api.AddonInitializer;
import com.dfsek.terra.api.Platform; import com.dfsek.terra.api.Platform;
import com.dfsek.terra.api.addon.BaseAddon; import com.dfsek.terra.api.addon.BaseAddon;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent;
import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent;
import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.event.functional.FunctionalEventHandler;
import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.inject.annotations.Inject;
@@ -76,10 +77,13 @@ public class BiomePipelineAddon implements AddonInitializer {
stageRegistry.register("BORDER", BorderMutatorTemplate::new); stageRegistry.register("BORDER", BorderMutatorTemplate::new);
stageRegistry.register("BORDER_LIST", BorderListMutatorTemplate::new); stageRegistry.register("BORDER_LIST", BorderListMutatorTemplate::new);
}) })
.then(event -> {
Registry<Biome> biomeRegistry = event.getPack().getOrCreateRegistry(Biome.class);
event.getPack().applyLoader(BiomeDelegate.class, new BiomeDelegateLoader(biomeRegistry));
})
.failThrough(); .failThrough();
platform.getEventManager()
.getHandler(FunctionalEventHandler.class)
.register(addon, ConfigPackPostLoadEvent.class)
.then(event -> {
Registry<Biome> biomeRegistry = event.getPack().getRegistry(Biome.class);
event.getPack().applyLoader(BiomeDelegate.class, new BiomeDelegateLoader(biomeRegistry));
});
} }
} }
@@ -16,6 +16,10 @@ public interface BiomeDelegate extends StringIdentifiable {
return false; return false;
} }
default boolean isSelf() {
return false;
}
static BiomeDelegate ephemeral(String id) { static BiomeDelegate ephemeral(String id) {
return new BiomeDelegate() { return new BiomeDelegate() {
private final Set<String> tags = Collections.singleton(id); private final Set<String> tags = Collections.singleton(id);
@@ -59,4 +63,33 @@ public interface BiomeDelegate extends StringIdentifiable {
} }
}; };
} }
static BiomeDelegate self() {
return new BiomeDelegate() {
@Override
public Biome getBiome() {
throw new UnsupportedOperationException("Cannot get biome from self delegate");
}
@Override
public boolean isSelf() {
return true;
}
@Override
public boolean isEphemeral() {
return true;
}
@Override
public Set<String> getTags() {
return Collections.emptySet();
}
@Override
public String getID() {
return "SELF";
}
};
}
} }
@@ -21,6 +21,7 @@ public class BiomeDelegateLoader implements TypeLoader<BiomeDelegate> {
@Override @Override
public BiomeDelegate load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader) throws LoadException { public BiomeDelegate load(@NotNull AnnotatedType t, @NotNull Object c, @NotNull ConfigLoader loader) throws LoadException {
if(c == "SELF") return BiomeDelegate.self();
return biomeRegistry return biomeRegistry
.get((String) c) .get((String) c)
.map(BiomeDelegate::from) .map(BiomeDelegate::from)
@@ -11,6 +11,7 @@ import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.function.Predicate;
import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate; import com.dfsek.terra.addons.biome.pipeline.api.BiomeDelegate;
import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator; import com.dfsek.terra.addons.biome.pipeline.api.stage.type.BiomeMutator;
@@ -42,14 +43,13 @@ public class BorderListMutator implements BiomeMutator {
for(int zi = -1; zi <= 1; zi++) { for(int zi = -1; zi <= 1; zi++) {
if(xi == 0 && zi == 0) continue; if(xi == 0 && zi == 0) continue;
BiomeDelegate current = viewPoint.getBiome(xi, zi); BiomeDelegate current = viewPoint.getBiome(xi, zi);
if(current == null) continue;
if(current.getTags().contains(border)) { if(current.getTags().contains(border)) {
if(replace.containsKey(origin)) { if(replace.containsKey(origin)) {
BiomeDelegate biome = replace.get(origin).get(noiseSampler, x, z, seed); BiomeDelegate biome = replace.get(origin).get(noiseSampler, x, z, seed);
return biome == null ? origin : biome; return biome.isSelf() ? origin : biome;
} }
BiomeDelegate biome = replaceDefault.get(noiseSampler, x, z, seed); BiomeDelegate biome = replaceDefault.get(noiseSampler, x, z, seed);
return biome == null ? origin : biome; return biome.isSelf() ? origin : biome;
} }
} }
} }
@@ -61,7 +61,7 @@ public class BorderListMutator implements BiomeMutator {
public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) { public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
Set<BiomeDelegate> biomeSet = new HashSet<>(); Set<BiomeDelegate> biomeSet = new HashSet<>();
biomes.forEach(biomeSet::add); biomes.forEach(biomeSet::add);
biomeSet.addAll(replaceDefault.getContents().stream().filter(Objects::nonNull).toList()); biomeSet.addAll(replaceDefault.getContents().stream().filter(Predicate.not(BiomeDelegate::isSelf)).toList());
replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents())); replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents()));
return biomeSet; return biomeSet;
} }
@@ -13,8 +13,8 @@ import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.collection.ProbabilityCollection; import com.dfsek.terra.api.util.collection.ProbabilityCollection;
import java.util.HashSet; import java.util.HashSet;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.function.Predicate;
public class BorderMutator implements BiomeMutator { public class BorderMutator implements BiomeMutator {
@@ -38,10 +38,9 @@ public class BorderMutator implements BiomeMutator {
for(int zi = -1; zi <= 1; zi++) { for(int zi = -1; zi <= 1; zi++) {
if(xi == 0 && zi == 0) continue; if(xi == 0 && zi == 0) continue;
BiomeDelegate current = viewPoint.getBiome(xi, zi); BiomeDelegate current = viewPoint.getBiome(xi, zi);
if(current == null) continue;
if(current.getTags().contains(border)) { if(current.getTags().contains(border)) {
BiomeDelegate biome = replace.get(noiseSampler, x, z, seed); BiomeDelegate biome = replace.get(noiseSampler, x, z, seed);
return biome == null ? origin : biome; return biome.isSelf() ? origin : biome;
} }
} }
} }
@@ -53,7 +52,15 @@ public class BorderMutator implements BiomeMutator {
public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) { public Iterable<BiomeDelegate> getBiomes(Iterable<BiomeDelegate> biomes) {
Set<BiomeDelegate> biomeSet = new HashSet<>(); Set<BiomeDelegate> biomeSet = new HashSet<>();
biomes.forEach(biomeSet::add); biomes.forEach(biomeSet::add);
biomeSet.addAll(replace.getContents().stream().filter(Objects::nonNull).toList()); biomeSet.addAll(
replace
.getContents()
.stream()
.filter(
Predicate.not(BiomeDelegate::isSelf)
)
.toList()
);
return biomeSet; return biomeSet;
} }
} }
@@ -37,11 +37,11 @@ public class ReplaceListMutator implements BiomeMutator {
BiomeDelegate center = viewPoint.getBiome(0, 0); BiomeDelegate center = viewPoint.getBiome(0, 0);
if(replace.containsKey(center)) { if(replace.containsKey(center)) {
BiomeDelegate biome = replace.get(center).get(sampler, x, z, seed); BiomeDelegate biome = replace.get(center).get(sampler, x, z, seed);
return biome == null ? viewPoint.getBiome(0, 0) : biome; return biome.isSelf() ? viewPoint.getBiome(0, 0) : biome;
} }
if(viewPoint.getBiome(0, 0).getTags().contains(defaultTag)) { if(viewPoint.getBiome(0, 0).getTags().contains(defaultTag)) {
BiomeDelegate biome = replaceDefault.get(sampler, x, z, seed); BiomeDelegate biome = replaceDefault.get(sampler, x, z, seed);
return biome == null ? viewPoint.getBiome(0, 0) : biome; return biome.isSelf() ? viewPoint.getBiome(0, 0) : biome;
} }
return center; return center;
} }
@@ -60,11 +60,11 @@ public class ReplaceListMutator implements BiomeMutator {
} }
}); });
biomeSet.addAll(replaceDefault.getContents().stream().flatMap(terraBiome -> { biomeSet.addAll(replaceDefault.getContents().stream().flatMap(terraBiome -> {
if(terraBiome == null) return reject.stream(); if(terraBiome.isSelf()) return reject.stream();
return Stream.of(terraBiome); return Stream.of(terraBiome);
}).toList()); }).toList());
replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents().stream().map(terraBiome -> { replace.forEach((biome, collection) -> biomeSet.addAll(collection.getContents().stream().map(terraBiome -> {
if(terraBiome == null) return biome; if(terraBiome.isSelf()) return biome;
return terraBiome; return terraBiome;
}).toList())); }).toList()));
return biomeSet; return biomeSet;
@@ -32,7 +32,7 @@ public class ReplaceMutator implements BiomeMutator {
public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) { public BiomeDelegate mutate(ViewPoint viewPoint, double x, double z, long seed) {
if(viewPoint.getBiome(0, 0).getTags().contains(replaceableTag)) { if(viewPoint.getBiome(0, 0).getTags().contains(replaceableTag)) {
BiomeDelegate biome = replace.get(sampler, x, z, seed); BiomeDelegate biome = replace.get(sampler, x, z, seed);
return biome == null ? viewPoint.getBiome(0, 0) : biome; return biome.isSelf() ? viewPoint.getBiome(0, 0) : biome;
} }
return viewPoint.getBiome(0, 0); return viewPoint.getBiome(0, 0);
} }
@@ -49,7 +49,7 @@ public class ReplaceMutator implements BiomeMutator {
} }
}); });
biomeSet.addAll(replace.getContents().stream().flatMap(terraBiome -> { biomeSet.addAll(replace.getContents().stream().flatMap(terraBiome -> {
if(terraBiome == null) return reject.stream(); if(terraBiome.isSelf()) return reject.stream();
return Stream.of(terraBiome); return Stream.of(terraBiome);
}).toList()); }).toList());
return biomeSet; return biomeSet;