probably a good idea to actually register variables

This commit is contained in:
dfsek
2020-11-27 14:32:31 -07:00
parent 538000ed32
commit 2f9f89042c
6 changed files with 147 additions and 11 deletions
@@ -28,6 +28,7 @@ import com.dfsek.terra.registry.StructureRegistry;
import com.dfsek.terra.util.ConfigUtil; import com.dfsek.terra.util.ConfigUtil;
import org.polydev.gaea.biome.Biome; import org.polydev.gaea.biome.Biome;
import org.polydev.gaea.world.palette.Palette; import org.polydev.gaea.world.palette.Palette;
import parsii.eval.Scope;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
@@ -35,6 +36,7 @@ import java.io.FileNotFoundException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.logging.Level; import java.util.logging.Level;
@@ -49,6 +51,8 @@ public class ConfigPack {
private final CarverRegistry carverRegistry = new CarverRegistry(); private final CarverRegistry carverRegistry = new CarverRegistry();
private final PaletteRegistry paletteRegistry = new PaletteRegistry(); private final PaletteRegistry paletteRegistry = new PaletteRegistry();
private final Scope varScope;
public ConfigPack(File folder) throws ConfigException { public ConfigPack(File folder) throws ConfigException {
long l = System.nanoTime(); long l = System.nanoTime();
@@ -63,6 +67,11 @@ public class ConfigPack {
throw new FileMissingException("No pack.yml file found in " + folder.getAbsolutePath(), e); throw new FileMissingException("No pack.yml file found in " + folder.getAbsolutePath(), e);
} }
varScope = new Scope();
for(Map.Entry<String, Double> var : template.getVariables().entrySet()) {
varScope.create(var.getKey()).setValue(var.getValue());
}
AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader();
abstractConfigLoader abstractConfigLoader
@@ -91,7 +100,7 @@ public class ConfigPack {
}); });
List<BiomeTemplate> biomeTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "biomes").toPath()), () -> new BiomeTemplate(this)); List<BiomeTemplate> biomeTemplates = abstractConfigLoader.load(ConfigUtil.loadFromPath(new File(folder, "biomes").toPath()), () -> new BiomeTemplate(this));
BiomeFactory biomeFactory = new BiomeFactory(); BiomeFactory biomeFactory = new BiomeFactory(this);
biomeTemplates.forEach(biome -> { biomeTemplates.forEach(biome -> {
biomeRegistry.add(biome.getID(), biomeFactory.build(biome)); biomeRegistry.add(biome.getID(), biomeFactory.build(biome));
Debug.info("Loaded biome " + biome.getID()); Debug.info("Loaded biome " + biome.getID());
@@ -146,4 +155,8 @@ public class ConfigPack {
public ConfigPackTemplate getTemplate() { public ConfigPackTemplate getTemplate() {
return template; return template;
} }
public Scope getVarScope() {
return varScope;
}
} }
@@ -1,12 +1,19 @@
package com.dfsek.terra.config.factories; package com.dfsek.terra.config.factories;
import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.builder.GeneratorBuilder; import com.dfsek.terra.config.builder.GeneratorBuilder;
import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.generation.UserDefinedDecorator; import com.dfsek.terra.generation.UserDefinedDecorator;
import org.polydev.gaea.math.ProbabilityCollection; import org.polydev.gaea.math.ProbabilityCollection;
public class BiomeFactory implements TerraFactory<BiomeTemplate, UserDefinedBiome> { public class BiomeFactory implements TerraFactory<BiomeTemplate, UserDefinedBiome> {
private final ConfigPack pack;
public BiomeFactory(ConfigPack pack) {
this.pack = pack;
}
@Override @Override
public UserDefinedBiome build(BiomeTemplate template) { public UserDefinedBiome build(BiomeTemplate template) {
UserDefinedDecorator decorator = new UserDefinedDecorator(new ProbabilityCollection<>(), new ProbabilityCollection<>(), 0, 0); UserDefinedDecorator decorator = new UserDefinedDecorator(new ProbabilityCollection<>(), new ProbabilityCollection<>(), 0, 0);
@@ -16,6 +23,7 @@ public class BiomeFactory implements TerraFactory<BiomeTemplate, UserDefinedBiom
generatorBuilder.setNoiseBuilderMap(template.getPack().getTemplate().getNoiseBuilderMap()); generatorBuilder.setNoiseBuilderMap(template.getPack().getTemplate().getNoiseBuilderMap());
generatorBuilder.setPalettes(template.getPalette()); generatorBuilder.setPalettes(template.getPalette());
generatorBuilder.setSlantPalettes(template.getSlantPalette()); generatorBuilder.setSlantPalettes(template.getSlantPalette());
generatorBuilder.setVarScope(pack.getVarScope());
return new UserDefinedBiome(template.getVanilla(), decorator, generatorBuilder, template.isErodible(), template); return new UserDefinedBiome(template.getVanilla(), decorator, generatorBuilder, template.isErodible(), template);
@@ -4,10 +4,10 @@ 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.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.config.ConfigTemplate;
import com.dfsek.terra.biome.palette.PaletteHolder;
import com.google.common.collect.Sets; import com.google.common.collect.Sets;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.polydev.gaea.world.palette.Palette;
import java.util.Set; import java.util.Set;
@@ -27,7 +27,7 @@ public class FloraTemplate implements ConfigTemplate {
@Value("layers") @Value("layers")
@Abstractable @Abstractable
private Palette<BlockData> floraPalette; private PaletteHolder floraPalette;
@Value("physics") @Value("physics")
@Abstractable @Abstractable
@@ -51,7 +51,7 @@ public class FloraTemplate implements ConfigTemplate {
return id; return id;
} }
public Palette<BlockData> getFloraPalette() { public PaletteHolder getFloraPalette() {
return floraPalette; return floraPalette;
} }
@@ -1,21 +1,80 @@
package com.dfsek.terra.generation.items; package com.dfsek.terra.generation.items;
import net.jafama.FastMath;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.BlockData;
import org.polydev.gaea.math.Range; import org.polydev.gaea.math.Range;
import org.polydev.gaea.world.Flora; import org.polydev.gaea.world.Flora;
import org.polydev.gaea.world.palette.Palette;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Set;
public class TerraFlora implements Flora { public class TerraFlora implements Flora {
@Override private final Palette<BlockData> floraPalette;
public List<Block> getValidSpawnsAt(Chunk chunk, int i, int i1, Range range) { private final boolean physics;
return null; private final boolean ceiling;
private final Set<Material> irrigable;
private final Set<Material> spawnable;
private final Set<Material> replaceable;
public TerraFlora(Palette<BlockData> floraPalette, boolean physics, boolean ceiling, Set<Material> irrigable, Set<Material> spawnable, Set<Material> replaceable) {
this.floraPalette = floraPalette;
this.physics = physics;
this.ceiling = ceiling;
this.irrigable = irrigable;
this.spawnable = spawnable;
this.replaceable = replaceable;
} }
@Override
public List<Block> getValidSpawnsAt(Chunk chunk, int x, int z, Range range) {
int size = floraPalette.getSize();
Block current = chunk.getBlock(x, range.getMin(), z);
List<Block> blocks = new ArrayList<>();
for(int y : range) {
if(y > 255 || y < 0) continue;
current = current.getRelative(BlockFace.UP);
if(spawnable.contains(current.getType()) && isIrrigated(current) && valid(size, current)) {
blocks.add(current);
}
}
return blocks;
}
private boolean valid(int size, Block block) {
for(int i = 0; i < size; i++) { // Down if ceiling, up if floor
if(block.getY() + 1 > 255 || block.getY() < 0) return false;
block = block.getRelative(ceiling ? BlockFace.DOWN : BlockFace.UP);
if(!replaceable.contains(block.getType())) return false;
}
return true;
}
private boolean isIrrigated(Block b) {
if(irrigable == null) return true;
return irrigable.contains(b.getRelative(BlockFace.NORTH).getType())
|| irrigable.contains(b.getRelative(BlockFace.SOUTH).getType())
|| irrigable.contains(b.getRelative(BlockFace.EAST).getType())
|| irrigable.contains(b.getRelative(BlockFace.WEST).getType());
}
@Override @Override
public boolean plant(Location location) { public boolean plant(Location location) {
return false; int size = floraPalette.getSize();
int c = ceiling ? -1 : 1;
for(int i = 0; FastMath.abs(i) < size; i += c) { // Down if ceiling, up if floor
int lvl = (FastMath.abs(i));
location.clone().add(0, i + c, 0).getBlock().setBlockData(floraPalette.get((ceiling ? lvl : size - lvl - 1), location.getBlockX(), location.getBlockZ()), physics);
}
return true;
} }
} }
@@ -1,14 +1,66 @@
package com.dfsek.terra.generation.items; package com.dfsek.terra.generation.items;
import com.dfsek.terra.procgen.math.Vector2;
import com.dfsek.terra.structure.Rotation;
import com.dfsek.terra.structure.Structure;
import com.dfsek.terra.structure.StructureContainedBlock;
import com.dfsek.terra.structure.StructureInfo;
import com.dfsek.terra.util.structure.RotationUtil;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.polydev.gaea.math.ProbabilityCollection;
import org.polydev.gaea.tree.Tree; import org.polydev.gaea.tree.Tree;
import java.util.Random; import java.util.Random;
import java.util.Set;
public class TerraTree implements Tree { public class TerraTree implements Tree {
private final Set<Material> spawnable;
private final String id;
private final int yOffset;
private final ProbabilityCollection<Structure> structure;
public TerraTree(Set<Material> spawnable, String id, int yOffset, ProbabilityCollection<Structure> structure) {
this.spawnable = spawnable;
this.id = id;
this.yOffset = yOffset;
this.structure = structure;
}
@Override @Override
public boolean plant(Location location, Random random, JavaPlugin javaPlugin) { public boolean plant(Location location, Random random, JavaPlugin javaPlugin) {
return false; location.subtract(0, 1, 0);
Location mut = location.clone().subtract(0, yOffset, 0);
if(!spawnable.contains(location.getBlock().getType())) return false;
Structure struc = structure.get(random);
Rotation rotation = Rotation.fromDegrees(random.nextInt(4) * 90);
if(!struc.checkSpawns(mut, rotation)) return false;
struc.paste(mut, rotation);
return true;
}
public boolean plantBlockCheck(Location location, Random random) {
location.subtract(0, 1, 0);
Location mut = location.clone().subtract(0, yOffset, 0);
if(!spawnable.contains(location.getBlock().getType())) return false;
Structure struc = structure.get(random);
Rotation rotation = Rotation.fromDegrees(random.nextInt(4) * 90);
StructureInfo info = struc.getStructureInfo();
for(StructureContainedBlock spawn : struc.getSpawns()) {
Vector2 rot = RotationUtil.getRotatedCoords(new Vector2(spawn.getX() - info.getCenterX(), spawn.getZ() - info.getCenterZ()), rotation);
int x = (int) rot.getX();
int z = (int) rot.getZ();
switch(spawn.getRequirement()) {
case AIR:
if(!mut.clone().add(x, spawn.getY() - 1, z).getBlock().isPassable()) return false;
break;
case LAND:
if(!mut.clone().add(x, spawn.getY() - 1, z).getBlock().getType().isSolid()) return false;
break;
}
}
struc.paste(mut, rotation);
return true;
} }
} }
@@ -1,5 +1,6 @@
package com.dfsek.terra.registry; package com.dfsek.terra.registry;
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;
@@ -14,8 +15,11 @@ public abstract class TerraRegistry<T> implements TypeLoader<T> {
private final Map<String, T> objects = new HashMap<>(); private final Map<String, T> objects = new HashMap<>();
@Override @Override
public T load(Type type, Object o, ConfigLoader configLoader) { public T load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
return get((String) o); T obj = get((String) o);
if(obj == null)
throw new LoadException("No such " + type + " matching \"" + o + "\" was found in this registry.");
return obj;
} }
/** /**