fabric pass 2

This commit is contained in:
dfsek
2021-06-23 15:35:52 -07:00
parent d4d2b659dc
commit 2906a4f891
28 changed files with 96 additions and 68 deletions
@@ -3,6 +3,7 @@ package com.dfsek.terra.api.structures.loot;
import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.inventory.ItemStack; import com.dfsek.terra.api.inventory.ItemStack;
import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.util.GlueList;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
import net.jafama.FastMath; import net.jafama.FastMath;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
@@ -17,7 +18,7 @@ import java.util.Random;
public class Pool { public class Pool {
private final int max; private final int max;
private final int min; private final int min;
private final ProbabilityCollectionImpl<Entry> entries; private final ProbabilityCollection<Entry> entries;
/** /**
* Instantiates a Pool from a JSON representation. * Instantiates a Pool from a JSON representation.
@@ -2,22 +2,23 @@ package com.dfsek.terra.api.world.palette.holder;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.block.BlockData; import com.dfsek.terra.api.block.BlockData;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
public class PaletteLayerHolder { public class PaletteLayerHolder {
private final ProbabilityCollectionImpl<BlockData> layer; private final ProbabilityCollection<BlockData> layer;
private final NoiseSampler sampler; private final NoiseSampler sampler;
private final int size; private final int size;
public PaletteLayerHolder(@NotNull ProbabilityCollectionImpl<BlockData> layer, NoiseSampler sampler, int size) { public PaletteLayerHolder(@NotNull ProbabilityCollection<BlockData> layer, NoiseSampler sampler, int size) {
this.layer = layer; this.layer = layer;
this.sampler = sampler; this.sampler = sampler;
this.size = size; this.size = size;
} }
@NotNull @NotNull
public ProbabilityCollectionImpl<BlockData> getLayer() { public ProbabilityCollection<BlockData> getLayer() {
return layer; return layer;
} }
@@ -2,6 +2,7 @@ package com.dfsek.terra.carving;
import com.dfsek.terra.api.block.BlockData; import com.dfsek.terra.api.block.BlockData;
import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.BlockType;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.collections.MaterialSet; import com.dfsek.terra.api.util.collections.MaterialSet;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
import net.jafama.FastMath; import net.jafama.FastMath;
@@ -13,8 +14,8 @@ import java.util.TreeMap;
public class CarverPalette { public class CarverPalette {
private final boolean blacklist; private final boolean blacklist;
private final MaterialSet replace; private final MaterialSet replace;
private final TreeMap<Integer, ProbabilityCollectionImpl<BlockData>> map = new TreeMap<>(); private final TreeMap<Integer, ProbabilityCollection<BlockData>> map = new TreeMap<>();
private ProbabilityCollectionImpl<BlockData>[] layers; private ProbabilityCollection<BlockData>[] layers;
private int offset = 0; private int offset = 0;
public CarverPalette(MaterialSet replaceable, boolean blacklist) { public CarverPalette(MaterialSet replaceable, boolean blacklist) {
@@ -22,12 +23,12 @@ public class CarverPalette {
this.replace = replaceable; this.replace = replaceable;
} }
public CarverPalette add(ProbabilityCollectionImpl<BlockData> collection, int y) { public CarverPalette add(ProbabilityCollection<BlockData> collection, int y) {
map.put(y, collection); map.put(y, collection);
return this; return this;
} }
public ProbabilityCollectionImpl<BlockData> get(int y) { public ProbabilityCollection<BlockData> get(int y) {
int index = y + offset; int index = y + offset;
return index >= 0 return index >= 0
? index < layers.length ? index < layers.length
@@ -47,10 +48,10 @@ public class CarverPalette {
int min = FastMath.min(map.keySet().stream().min(Integer::compareTo).orElse(0), 0); int min = FastMath.min(map.keySet().stream().min(Integer::compareTo).orElse(0), 0);
int max = FastMath.max(map.keySet().stream().max(Integer::compareTo).orElse(255), 255); int max = FastMath.max(map.keySet().stream().max(Integer::compareTo).orElse(255), 255);
layers = new ProbabilityCollectionImpl[map.lastKey() + 1 - min]; layers = new ProbabilityCollection[map.lastKey() + 1 - min];
for(int y = min; y <= FastMath.max(map.lastKey(), max); y++) { for(int y = min; y <= FastMath.max(map.lastKey(), max); y++) {
ProbabilityCollectionImpl<BlockData> d = null; ProbabilityCollection<BlockData> d = null;
for(Map.Entry<Integer, ProbabilityCollectionImpl<BlockData>> e : map.entrySet()) { for(Map.Entry<Integer, ProbabilityCollection<BlockData>> e : map.entrySet()) {
if(e.getKey() >= y) { if(e.getKey() >= y) {
d = e.getValue(); d = e.getValue();
break; break;
@@ -4,19 +4,17 @@ import com.dfsek.tectonic.loading.TypeRegistry;
import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.LoaderRegistrar;
import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.addon.TerraAddon; import com.dfsek.terra.api.addon.TerraAddon;
import com.dfsek.terra.api.math.GridSpawn;
import com.dfsek.terra.api.math.range.ConstantRange;
import com.dfsek.terra.noise.samplers.ImageSampler;
import com.dfsek.terra.noise.samplers.noise.CellularSampler;
import com.dfsek.terra.api.block.BlockType; import com.dfsek.terra.api.block.BlockType;
import com.dfsek.terra.api.math.GridSpawn;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.util.collections.MaterialSet; import com.dfsek.terra.api.util.collections.MaterialSet;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
import com.dfsek.terra.api.util.seeded.SourceSeeded; import com.dfsek.terra.api.util.seeded.SourceSeeded;
import com.dfsek.terra.api.util.seeded.StageSeeded; import com.dfsek.terra.api.util.seeded.StageSeeded;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.biome.generation.pipeline.BiomeSource; import com.dfsek.terra.api.world.biome.generation.pipeline.BiomeSource;
import com.dfsek.terra.api.world.biome.pipeline.stages.ExpanderStage; import com.dfsek.terra.api.world.biome.pipeline.stages.ExpanderStage;
import com.dfsek.terra.api.world.biome.pipeline.stages.MutatorStage; import com.dfsek.terra.api.world.biome.pipeline.stages.MutatorStage;
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
import com.dfsek.terra.api.world.biome.provider.ImageBiomeProvider; import com.dfsek.terra.api.world.biome.provider.ImageBiomeProvider;
import com.dfsek.terra.api.world.palette.holder.PaletteHolder; import com.dfsek.terra.api.world.palette.holder.PaletteHolder;
import com.dfsek.terra.api.world.palette.holder.PaletteLayerHolder; import com.dfsek.terra.api.world.palette.holder.PaletteLayerHolder;
@@ -51,6 +49,8 @@ import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader;
import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader; import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader;
import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader; import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader;
import com.dfsek.terra.config.loaders.palette.slant.SlantHolderLoader; import com.dfsek.terra.config.loaders.palette.slant.SlantHolderLoader;
import com.dfsek.terra.noise.samplers.ImageSampler;
import com.dfsek.terra.noise.samplers.noise.CellularSampler;
import com.dfsek.terra.world.population.items.flora.FloraLayer; import com.dfsek.terra.world.population.items.flora.FloraLayer;
import com.dfsek.terra.world.population.items.flora.TerraFlora; import com.dfsek.terra.world.population.items.flora.TerraFlora;
import com.dfsek.terra.world.population.items.ores.Ore; import com.dfsek.terra.world.population.items.ores.Ore;
@@ -69,8 +69,8 @@ public class GenericLoaders implements LoaderRegistrar {
@Override @Override
public void register(TypeRegistry registry) { public void register(TypeRegistry registry) {
registry.registerLoader(ProbabilityCollectionImpl.class, new ProbabilityCollectionLoader()) registry.registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader())
.registerLoader(ConstantRange.class, new RangeLoader()) .registerLoader(Range.class, new RangeLoader())
.registerLoader(GridSpawn.class, new GridSpawnLoader()) .registerLoader(GridSpawn.class, new GridSpawnLoader())
.registerLoader(PaletteHolder.class, new PaletteHolderLoader()) .registerLoader(PaletteHolder.class, new PaletteHolderLoader())
.registerLoader(PaletteLayerHolder.class, new PaletteLayerLoader()) .registerLoader(PaletteLayerHolder.class, new PaletteLayerLoader())
@@ -1,5 +1,6 @@
package com.dfsek.terra.config.builder; package com.dfsek.terra.config.builder;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.Biome;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
import com.dfsek.terra.api.util.seeded.SeededBuilder; import com.dfsek.terra.api.util.seeded.SeededBuilder;
@@ -7,7 +8,7 @@ import com.dfsek.terra.api.world.biome.TerraBiome;
import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.BiomeTemplate;
public interface BiomeBuilder extends SeededBuilder<TerraBiome> { public interface BiomeBuilder extends SeededBuilder<TerraBiome> {
ProbabilityCollectionImpl<Biome> getVanillaBiomes(); ProbabilityCollection<Biome> getVanillaBiomes();
BiomeTemplate getTemplate(); BiomeTemplate getTemplate();
} }
@@ -3,6 +3,7 @@ package com.dfsek.terra.config.builder;
import com.dfsek.paralithic.eval.parser.Scope; import com.dfsek.paralithic.eval.parser.Scope;
import com.dfsek.paralithic.eval.tokenizer.ParseException; import com.dfsek.paralithic.eval.tokenizer.ParseException;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.noise.samplers.ExpressionSampler; import com.dfsek.terra.noise.samplers.ExpressionSampler;
import com.dfsek.terra.noise.samplers.noise.ConstantSampler; import com.dfsek.terra.noise.samplers.noise.ConstantSampler;
import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.Biome;
@@ -63,7 +64,7 @@ public class UserDefinedBiomeBuilder implements BiomeBuilder {
} }
@Override @Override
public ProbabilityCollectionImpl<Biome> getVanillaBiomes() { public ProbabilityCollection<Biome> getVanillaBiomes() {
return template.getVanilla(); return template.getVanilla();
} }
@@ -3,6 +3,7 @@ package com.dfsek.terra.config.loaders;
import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
@@ -11,10 +12,10 @@ import java.util.List;
import java.util.Map; import java.util.Map;
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public class ProbabilityCollectionLoader implements TypeLoader<ProbabilityCollectionImpl<Object>> { public class ProbabilityCollectionLoader implements TypeLoader<ProbabilityCollection<Object>> {
@Override @Override
public ProbabilityCollectionImpl<Object> load(Type type, Object o, ConfigLoader configLoader) throws LoadException { public ProbabilityCollection<Object> load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
ProbabilityCollectionImpl<Object> collection = new ProbabilityCollectionImpl<>(); ProbabilityCollection<Object> collection = new ProbabilityCollectionImpl<>();
if(type instanceof ParameterizedType) { if(type instanceof ParameterizedType) {
ParameterizedType pType = (ParameterizedType) type; ParameterizedType pType = (ParameterizedType) type;
@@ -1,6 +1,7 @@
package com.dfsek.terra.config.loaders; package com.dfsek.terra.config.loaders;
import com.dfsek.terra.api.block.BlockData; import com.dfsek.terra.api.block.BlockData;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.world.Tree; import com.dfsek.terra.api.world.Tree;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
import com.dfsek.terra.api.world.biome.TerraBiome; import com.dfsek.terra.api.world.biome.TerraBiome;
@@ -28,11 +29,11 @@ public final class Types {
TERRA_BIOME_TERRA_BIOME_PROBABILITY_COLLECTION_MAP = getType("terraBiomeProbabilityCollectionMap"); TERRA_BIOME_TERRA_BIOME_PROBABILITY_COLLECTION_MAP = getType("terraBiomeProbabilityCollectionMap");
} }
private ProbabilityCollectionImpl<BlockData> blockDataProbabilityCollection; private ProbabilityCollection<BlockData> blockDataProbabilityCollection;
private ProbabilityCollectionImpl<Flora> floraProbabilityCollection; private ProbabilityCollection<Flora> floraProbabilityCollection;
private ProbabilityCollectionImpl<Tree> treeProbabilityCollection; private ProbabilityCollection<Tree> treeProbabilityCollection;
private ProbabilityCollectionImpl<TerraBiome> terraBiomeProbabilityCollection; private ProbabilityCollection<TerraBiome> terraBiomeProbabilityCollection;
private Map<TerraBiome, ProbabilityCollectionImpl<TerraBiome>> terraBiomeProbabilityCollectionMap; private Map<TerraBiome, ProbabilityCollection<TerraBiome>> terraBiomeProbabilityCollectionMap;
private static Type getType(String dummyFieldName) { private static Type getType(String dummyFieldName) {
try { try {
@@ -5,6 +5,8 @@ import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.api.math.range.ConstantRange; import com.dfsek.terra.api.math.range.ConstantRange;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.noise.samplers.noise.random.WhiteNoiseSampler; import com.dfsek.terra.noise.samplers.noise.random.WhiteNoiseSampler;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.util.seeded.NoiseSeeded;
@@ -21,9 +23,9 @@ public class FloraLayerLoader implements TypeLoader<FloraLayer> {
public FloraLayer load(Type type, Object o, ConfigLoader configLoader) throws LoadException { public FloraLayer load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
Map<String, Object> map = (Map<String, Object>) o; Map<String, Object> map = (Map<String, Object>) o;
double density = ((Number) map.get("density")).doubleValue(); double density = ((Number) map.get("density")).doubleValue();
ConstantRange range = configLoader.loadClass(ConstantRange.class, map.get("y")); Range range = configLoader.loadClass(Range.class, map.get("y"));
if(range == null) throw new LoadException("Flora range unspecified"); if(range == null) throw new LoadException("Flora range unspecified");
ProbabilityCollectionImpl<Flora> items = (ProbabilityCollectionImpl<Flora>) configLoader.loadType(Types.FLORA_PROBABILITY_COLLECTION_TYPE, map.get("items")); ProbabilityCollection<Flora> items = (ProbabilityCollection<Flora>) configLoader.loadType(Types.FLORA_PROBABILITY_COLLECTION_TYPE, map.get("items"));
NoiseSeeded sampler; NoiseSeeded sampler;
if(map.containsKey("distribution")) { if(map.containsKey("distribution")) {
@@ -4,6 +4,8 @@ import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.api.math.range.ConstantRange; import com.dfsek.terra.api.math.range.ConstantRange;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.noise.samplers.noise.random.WhiteNoiseSampler; import com.dfsek.terra.noise.samplers.noise.random.WhiteNoiseSampler;
import com.dfsek.terra.api.world.Tree; import com.dfsek.terra.api.world.Tree;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
@@ -20,9 +22,9 @@ public class TreeLayerLoader implements TypeLoader<TreeLayer> {
public TreeLayer load(Type type, Object o, ConfigLoader configLoader) throws LoadException { public TreeLayer load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
Map<String, Object> map = (Map<String, Object>) o; Map<String, Object> map = (Map<String, Object>) o;
double density = ((Number) map.get("density")).doubleValue(); double density = ((Number) map.get("density")).doubleValue();
ConstantRange range = configLoader.loadClass(ConstantRange.class, map.get("y")); Range range = configLoader.loadClass(Range.class, map.get("y"));
if(range == null) throw new LoadException("Tree range unspecified"); if(range == null) throw new LoadException("Tree range unspecified");
ProbabilityCollectionImpl<Tree> items = (ProbabilityCollectionImpl<Tree>) configLoader.loadType(Types.TREE_PROBABILITY_COLLECTION_TYPE, map.get("items")); ProbabilityCollection<Tree> items = (ProbabilityCollection<Tree>) configLoader.loadType(Types.TREE_PROBABILITY_COLLECTION_TYPE, map.get("items"));
if(map.containsKey("distribution")) { if(map.containsKey("distribution")) {
NoiseSeeded noise = configLoader.loadClass(NoiseSeeded.class, map.get("distribution")); NoiseSeeded noise = configLoader.loadClass(NoiseSeeded.class, map.get("distribution"));
@@ -17,7 +17,7 @@ public class ReplaceListMutatorTemplate extends MutatorStageTemplate {
private String defaultFrom; private String defaultFrom;
@Value("default-to") @Value("default-to")
private ProbabilityCollectionImpl<BiomeBuilder> defaultTo; private ProbabilityCollection<BiomeBuilder> defaultTo;
@Value("to") @Value("to")
private Map<BiomeBuilder, ProbabilityCollection<BiomeBuilder>> replace; private Map<BiomeBuilder, ProbabilityCollection<BiomeBuilder>> replace;
@@ -5,6 +5,7 @@ import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.api.block.BlockData; import com.dfsek.terra.api.block.BlockData;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.collections.MaterialSet; import com.dfsek.terra.api.util.collections.MaterialSet;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.carving.CarverPalette;
@@ -24,7 +25,7 @@ public class CarverPaletteLoader implements TypeLoader<CarverPalette> {
CarverPalette palette = new CarverPalette((MaterialSet) configLoader.loadType(MaterialSet.class, configuration.get("replace")), (Boolean) configuration.get("replace-blacklist")); CarverPalette palette = new CarverPalette((MaterialSet) configLoader.loadType(MaterialSet.class, configuration.get("replace")), (Boolean) configuration.get("replace-blacklist"));
for(Map<String, Object> map : (List<Map<String, Object>>) configuration.get("layers")) { for(Map<String, Object> map : (List<Map<String, Object>>) configuration.get("layers")) {
ProbabilityCollectionImpl<BlockData> layer = (ProbabilityCollectionImpl<BlockData>) configLoader.loadType(Types.BLOCK_DATA_PROBABILITY_COLLECTION_TYPE, map.get("materials")); ProbabilityCollection<BlockData> layer = (ProbabilityCollection<BlockData>) configLoader.loadType(Types.BLOCK_DATA_PROBABILITY_COLLECTION_TYPE, map.get("materials"));
palette.add(layer, (Integer) map.get("y")); palette.add(layer, (Integer) map.get("y"));
} }
palette.build(); palette.build();
@@ -20,7 +20,7 @@ public class PaletteHolderLoader implements TypeLoader<PaletteHolder> {
PaletteHolderBuilder builder = new PaletteHolderBuilder(); PaletteHolderBuilder builder = new PaletteHolderBuilder();
for(Map<String, Integer> layer : palette) { for(Map<String, Integer> layer : palette) {
for(Map.Entry<String, Integer> entry : layer.entrySet()) { for(Map.Entry<String, Integer> entry : layer.entrySet()) {
builder.add(entry.getValue(), (Palette) configLoader.loadType(PaletteImpl.class, entry.getKey())); builder.add(entry.getValue(), (Palette) configLoader.loadType(Palette.class, entry.getKey()));
} }
} }
return builder.build(); return builder.build();
@@ -5,6 +5,7 @@ import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.block.BlockData; import com.dfsek.terra.api.block.BlockData;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.api.world.palette.holder.PaletteLayerHolder; import com.dfsek.terra.api.world.palette.holder.PaletteLayerHolder;
@@ -18,7 +19,7 @@ public class PaletteLayerLoader implements TypeLoader<PaletteLayerHolder> {
@Override @Override
public PaletteLayerHolder load(Type type, Object o, ConfigLoader configLoader) throws LoadException { public PaletteLayerHolder load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
Map<String, Object> map = (Map<String, Object>) o; Map<String, Object> map = (Map<String, Object>) o;
ProbabilityCollectionImpl<BlockData> collection = (ProbabilityCollectionImpl<BlockData>) configLoader.loadType(Types.BLOCK_DATA_PROBABILITY_COLLECTION_TYPE, map.get("materials")); ProbabilityCollection<BlockData> collection = (ProbabilityCollection<BlockData>) configLoader.loadType(Types.BLOCK_DATA_PROBABILITY_COLLECTION_TYPE, map.get("materials"));
NoiseSampler sampler = null; NoiseSampler sampler = null;
if(map.containsKey("noise")) { if(map.containsKey("noise")) {
@@ -231,7 +231,7 @@ public class ConfigPackImpl implements ConfigPack {
}).close().open("structures/loot", ".json").thenEntries(entries -> { }).close().open("structures/loot", ".json").thenEntries(entries -> {
for(Map.Entry<String, InputStream> entry : entries) { for(Map.Entry<String, InputStream> entry : entries) {
try { try {
getOpenRegistry(LootTableImpl.class).add(entry.getKey(), new LootTableImpl(IOUtils.toString(entry.getValue(), StandardCharsets.UTF_8), main)); getOpenRegistry(LootTable.class).add(entry.getKey(), new LootTableImpl(IOUtils.toString(entry.getValue(), StandardCharsets.UTF_8), main));
} catch(ParseException | IOException | NullPointerException e) { } catch(ParseException | IOException | NullPointerException e) {
throw new LoadException("Unable to load loot table \"" + entry.getKey() + "\"", e); throw new LoadException("Unable to load loot table \"" + entry.getKey() + "\"", e);
} }
@@ -11,6 +11,7 @@ import com.dfsek.tectonic.exception.ValidationException;
import com.dfsek.terra.api.TerraPlugin; import com.dfsek.terra.api.TerraPlugin;
import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.config.ConfigPack;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.noise.samplers.noise.ConstantSampler; import com.dfsek.terra.noise.samplers.noise.ConstantSampler;
import com.dfsek.terra.api.math.paralithic.BlankFunction; import com.dfsek.terra.api.math.paralithic.BlankFunction;
import com.dfsek.terra.api.math.paralithic.defined.UserDefinedFunction; import com.dfsek.terra.api.math.paralithic.defined.UserDefinedFunction;
@@ -76,7 +77,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
@Value("vanilla") @Value("vanilla")
@Abstractable @Abstractable
private ProbabilityCollectionImpl<Biome> vanilla; private ProbabilityCollection<Biome> vanilla;
@Value("biome-noise") @Value("biome-noise")
@Default @Default
@@ -303,7 +304,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf
return trees; return trees;
} }
public ProbabilityCollectionImpl<Biome> getVanilla() { public ProbabilityCollection<Biome> getVanilla() {
return vanilla; return vanilla;
} }
@@ -7,6 +7,7 @@ import com.dfsek.tectonic.config.ConfigTemplate;
import com.dfsek.terra.api.math.GridSpawn; import com.dfsek.terra.api.math.GridSpawn;
import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.util.GlueList;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
@@ -19,7 +20,7 @@ public class StructureTemplate extends AbstractableTemplate implements ConfigTem
@Value("scripts") @Value("scripts")
@Abstractable @Abstractable
private ProbabilityCollectionImpl<Structure> structure; private ProbabilityCollection<Structure> structure;
@Value("spawn.start") @Value("spawn.start")
@Abstractable @Abstractable
@@ -38,7 +39,7 @@ public class StructureTemplate extends AbstractableTemplate implements ConfigTem
return id; return id;
} }
public ProbabilityCollectionImpl<Structure> getStructures() { public ProbabilityCollection<Structure> getStructures() {
return structure; return structure;
} }
@@ -4,6 +4,7 @@ import com.dfsek.tectonic.annotations.Abstractable;
import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.collections.MaterialSet; import com.dfsek.terra.api.util.collections.MaterialSet;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
@@ -11,7 +12,7 @@ import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
public class TreeTemplate extends AbstractableTemplate { public class TreeTemplate extends AbstractableTemplate {
@Value("scripts") @Value("scripts")
@Abstractable @Abstractable
private ProbabilityCollectionImpl<Structure> structure; private ProbabilityCollection<Structure> structure;
@Value("id") @Value("id")
private String id; private String id;
@@ -25,7 +26,7 @@ public class TreeTemplate extends AbstractableTemplate {
@Abstractable @Abstractable
private MaterialSet spawnable; private MaterialSet spawnable;
public ProbabilityCollectionImpl<Structure> getStructures() { public ProbabilityCollection<Structure> getStructures() {
return structure; return structure;
} }
@@ -1,19 +1,19 @@
package com.dfsek.terra.world.population.items; package com.dfsek.terra.world.population.items;
import com.dfsek.terra.api.math.range.ConstantRange;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.world.Chunk; import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
public abstract class PlaceableLayer<T> { public abstract class PlaceableLayer<T> {
protected final double density; protected final double density;
protected final ConstantRange level; protected final Range level;
protected final ProbabilityCollectionImpl<T> layer; protected final ProbabilityCollection<T> layer;
protected final NoiseSampler noise; protected final NoiseSampler noise;
public PlaceableLayer(double density, ConstantRange level, ProbabilityCollectionImpl<T> layer, NoiseSampler noise) { public PlaceableLayer(double density, Range level, ProbabilityCollection<T> layer, NoiseSampler noise) {
this.density = density; this.density = density;
this.level = level; this.level = level;
this.layer = layer; this.layer = layer;
@@ -32,7 +32,7 @@ public abstract class PlaceableLayer<T> {
return level; return level;
} }
public ProbabilityCollectionImpl<T> getLayer() { public ProbabilityCollection<T> getLayer() {
return layer; return layer;
} }
@@ -2,17 +2,18 @@ package com.dfsek.terra.world.population.items;
import com.dfsek.terra.api.math.GridSpawn; import com.dfsek.terra.api.math.GridSpawn;
import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.config.templates.StructureTemplate;
public class TerraStructure { public class TerraStructure {
private final ProbabilityCollectionImpl<Structure> structure; private final ProbabilityCollection<Structure> structure;
private final Range spawnStart; private final Range spawnStart;
private final GridSpawn spawn; private final GridSpawn spawn;
private final StructureTemplate template; private final StructureTemplate template;
public TerraStructure(ProbabilityCollectionImpl<Structure> structures, Range spawnStart, GridSpawn spawn, StructureTemplate template) { public TerraStructure(ProbabilityCollection<Structure> structures, Range spawnStart, GridSpawn spawn, StructureTemplate template) {
this.structure = structures; this.structure = structures;
this.spawnStart = spawnStart; this.spawnStart = spawnStart;
this.spawn = spawn; this.spawn = spawn;
@@ -23,7 +24,7 @@ public class TerraStructure {
return template; return template;
} }
public ProbabilityCollectionImpl<Structure> getStructure() { public ProbabilityCollection<Structure> getStructure() {
return structure; return structure;
} }
@@ -2,6 +2,8 @@ package com.dfsek.terra.world.population.items.flora;
import com.dfsek.terra.api.math.range.ConstantRange; import com.dfsek.terra.api.math.range.ConstantRange;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.world.Chunk; import com.dfsek.terra.api.world.Chunk;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
@@ -10,7 +12,7 @@ import com.dfsek.terra.world.population.items.PlaceableLayer;
public class FloraLayer extends PlaceableLayer<Flora> { public class FloraLayer extends PlaceableLayer<Flora> {
public FloraLayer(double density, ConstantRange level, ProbabilityCollectionImpl<Flora> layer, NoiseSampler noise) { public FloraLayer(double density, Range level, ProbabilityCollection<Flora> layer, NoiseSampler noise) {
super(density, level, layer, noise); super(density, level, layer, noise);
} }
@@ -1,6 +1,7 @@
package com.dfsek.terra.world.population.items.tree; package com.dfsek.terra.world.population.items.tree;
import com.dfsek.terra.api.structure.Structure; import com.dfsek.terra.api.structure.Structure;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.vector.Location; import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.vector.LocationImpl; import com.dfsek.terra.vector.LocationImpl;
import com.dfsek.terra.api.world.Tree; import com.dfsek.terra.api.world.Tree;
@@ -13,9 +14,9 @@ import java.util.Random;
public class TerraTree implements Tree { public class TerraTree implements Tree {
private final MaterialSet spawnable; private final MaterialSet spawnable;
private final int yOffset; private final int yOffset;
private final ProbabilityCollectionImpl<Structure> structure; private final ProbabilityCollection<Structure> structure;
public TerraTree(MaterialSet spawnable, int yOffset, ProbabilityCollectionImpl<Structure> structure) { public TerraTree(MaterialSet spawnable, int yOffset, ProbabilityCollection<Structure> structure) {
this.spawnable = spawnable; this.spawnable = spawnable;
this.yOffset = yOffset; this.yOffset = yOffset;
this.structure = structure; this.structure = structure;
@@ -2,6 +2,8 @@ package com.dfsek.terra.world.population.items.tree;
import com.dfsek.terra.api.math.range.ConstantRange; import com.dfsek.terra.api.math.range.ConstantRange;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.Range;
import com.dfsek.terra.api.vector.Vector2; import com.dfsek.terra.api.vector.Vector2;
import com.dfsek.terra.api.block.Block; import com.dfsek.terra.api.block.Block;
import com.dfsek.terra.api.block.BlockFace; import com.dfsek.terra.api.block.BlockFace;
@@ -13,7 +15,7 @@ import com.dfsek.terra.world.population.items.PlaceableLayer;
public class TreeLayer extends PlaceableLayer<Tree> { public class TreeLayer extends PlaceableLayer<Tree> {
public TreeLayer(double density, ConstantRange level, ProbabilityCollectionImpl<Tree> layer, NoiseSampler noise) { public TreeLayer(double density, Range level, ProbabilityCollection<Tree> layer, NoiseSampler noise) {
super(density, level, layer, noise); super(density, level, layer, noise);
} }
@@ -3,6 +3,7 @@ package noise;
import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.ConfigException;
import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.terra.api.noise.NoiseSampler; import com.dfsek.terra.api.noise.NoiseSampler;
import com.dfsek.terra.api.util.ProbabilityCollection;
import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl; import com.dfsek.terra.api.util.collections.ProbabilityCollectionImpl;
import com.dfsek.terra.api.util.seeded.NoiseSeeded; import com.dfsek.terra.api.util.seeded.NoiseSeeded;
import com.dfsek.terra.config.GenericLoaders; import com.dfsek.terra.config.GenericLoaders;
@@ -99,7 +100,7 @@ public class NoiseTool {
ConfigLoader loader = new ConfigLoader(); ConfigLoader loader = new ConfigLoader();
loader.registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(new NoiseRegistry())) loader.registerLoader(NoiseSeeded.class, new NoiseSamplerBuilderLoader(new NoiseRegistry()))
.registerLoader(BufferedImage.class, new BufferedImageLoader(folderLoader)) .registerLoader(BufferedImage.class, new BufferedImageLoader(folderLoader))
.registerLoader(ProbabilityCollectionImpl.class, new ProbabilityCollectionLoader()); .registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader());
new GenericLoaders(null).register(loader); new GenericLoaders(null).register(loader);
NoiseConfigTemplate template = new NoiseConfigTemplate(); NoiseConfigTemplate template = new NoiseConfigTemplate();
@@ -1,10 +1,11 @@
package com.dfsek.terra.fabric.mixin.implementations; package com.dfsek.terra.fabric.mixin.implementations;
import com.dfsek.terra.vector.LocationImpl; import com.dfsek.terra.api.block.BlockType;
import com.dfsek.terra.api.world.Tree;
import com.dfsek.terra.api.util.collections.MaterialSet;
import com.dfsek.terra.fabric.TerraFabricPlugin;
import com.dfsek.terra.api.profiler.ProfileFrame; import com.dfsek.terra.api.profiler.ProfileFrame;
import com.dfsek.terra.api.util.collections.MaterialSet;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.api.world.Tree;
import com.dfsek.terra.fabric.TerraFabricPlugin;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.BuiltinRegistries;
import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.StructureWorldAccess;
@@ -17,6 +18,7 @@ import org.spongepowered.asm.mixin.Shadow;
import java.util.Locale; import java.util.Locale;
import java.util.Random; import java.util.Random;
import java.util.Set;
@Mixin(ConfiguredFeature.class) @Mixin(ConfiguredFeature.class)
@Implements(@Interface(iface = Tree.class, prefix = "terra$", remap = Interface.Remap.NONE)) @Implements(@Interface(iface = Tree.class, prefix = "terra$", remap = Interface.Remap.NONE))
@@ -25,7 +27,7 @@ public abstract class ConfiguredFeatureMixin {
public abstract boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos); public abstract boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos);
@SuppressWarnings({"ConstantConditions", "try"}) @SuppressWarnings({"ConstantConditions", "try"})
public boolean terra$plant(LocationImpl l, Random r) { public boolean terra$plant(Location l, Random r) {
String id = BuiltinRegistries.CONFIGURED_FEATURE.getId((ConfiguredFeature<?, ?>) (Object) this).toString(); String id = BuiltinRegistries.CONFIGURED_FEATURE.getId((ConfiguredFeature<?, ?>) (Object) this).toString();
try(ProfileFrame ignore = TerraFabricPlugin.getInstance().getProfiler().profile("fabric_tree:" + id.toLowerCase(Locale.ROOT))) { try(ProfileFrame ignore = TerraFabricPlugin.getInstance().getProfiler().profile("fabric_tree:" + id.toLowerCase(Locale.ROOT))) {
StructureWorldAccess fabricWorldAccess = ((StructureWorldAccess) l.getWorld()); StructureWorldAccess fabricWorldAccess = ((StructureWorldAccess) l.getWorld());
@@ -34,7 +36,7 @@ public abstract class ConfiguredFeatureMixin {
} }
} }
public MaterialSet terra$getSpawnable() { public Set<BlockType> terra$getSpawnable() {
return MaterialSet.get(TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:grass_block"), return MaterialSet.get(TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:grass_block"),
TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:podzol"), TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:podzol"),
TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:mycelium")); TerraFabricPlugin.getInstance().getWorldHandle().createBlockData("minecraft:mycelium"));
@@ -1,5 +1,6 @@
package com.dfsek.terra.fabric.mixin.implementations.entity; package com.dfsek.terra.fabric.mixin.implementations.entity;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.vector.LocationImpl; import com.dfsek.terra.vector.LocationImpl;
import com.dfsek.terra.api.world.World; import com.dfsek.terra.api.world.World;
import com.dfsek.terra.fabric.util.FabricAdapter; import com.dfsek.terra.fabric.util.FabricAdapter;
@@ -35,11 +36,11 @@ public abstract class EntityMixin {
return this; return this;
} }
public LocationImpl terra$getLocation() { public Location terra$getLocation() {
return new LocationImpl((World) world, FabricAdapter.adapt(blockPos)); return new LocationImpl((World) world, FabricAdapter.adapt(blockPos));
} }
public void terra$setLocation(LocationImpl location) { public void terra$setLocation(Location location) {
teleport(location.getX(), location.getY(), location.getZ()); teleport(location.getX(), location.getY(), location.getZ());
} }
@@ -1,5 +1,6 @@
package com.dfsek.terra.fabric.mixin.implementations.world; package com.dfsek.terra.fabric.mixin.implementations.world;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.vector.LocationImpl; import com.dfsek.terra.vector.LocationImpl;
import com.dfsek.terra.api.block.Block; import com.dfsek.terra.api.block.Block;
import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.entity.Entity;
@@ -51,7 +52,7 @@ public abstract class ChunkRegionMixin {
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public Entity terra$spawnEntity(LocationImpl location, EntityType entityType) { public Entity terra$spawnEntity(Location location, EntityType entityType) {
net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType<?>) entityType).create(((ChunkRegion) (Object) this).toServerWorld()); net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType<?>) entityType).create(((ChunkRegion) (Object) this).toServerWorld());
entity.setPos(location.getX(), location.getY(), location.getZ()); entity.setPos(location.getX(), location.getY(), location.getZ());
((ChunkRegion) (Object) this).spawnEntity(entity); ((ChunkRegion) (Object) this).spawnEntity(entity);
@@ -1,5 +1,6 @@
package com.dfsek.terra.fabric.mixin.implementations.world; package com.dfsek.terra.fabric.mixin.implementations.world;
import com.dfsek.terra.api.vector.Location;
import com.dfsek.terra.vector.LocationImpl; import com.dfsek.terra.vector.LocationImpl;
import com.dfsek.terra.api.block.Block; import com.dfsek.terra.api.block.Block;
import com.dfsek.terra.api.entity.Entity; import com.dfsek.terra.api.entity.Entity;
@@ -42,7 +43,7 @@ public abstract class ServerWorldMixin {
return new FabricBlock(new BlockPos(x, y, z), ((ServerWorld) (Object) this)); return new FabricBlock(new BlockPos(x, y, z), ((ServerWorld) (Object) this));
} }
public Entity terra$spawnEntity(LocationImpl location, EntityType entityType) { public Entity terra$spawnEntity(Location location, EntityType entityType) {
net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType<?>) entityType).create(((ServerWorld) (Object) this)); net.minecraft.entity.Entity entity = ((net.minecraft.entity.EntityType<?>) entityType).create(((ServerWorld) (Object) this));
entity.setPos(location.getX(), location.getY(), location.getZ()); entity.setPos(location.getX(), location.getY(), location.getZ());
((ServerWorld) (Object) this).spawnEntity(entity); ((ServerWorld) (Object) this).spawnEntity(entity);