implement ores, sort of

This commit is contained in:
dfsek
2020-11-28 18:05:19 -07:00
parent 155b293b61
commit 4e11d5c1cf
13 changed files with 106 additions and 93 deletions

View File

@@ -8,7 +8,7 @@ import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
@SuppressWarnings("unchecked")
@SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"})
public class CarverPalette {
private final boolean blacklist;
private final Set<Material> replace;

View File

@@ -12,6 +12,7 @@ import com.dfsek.terra.config.factories.BiomeFactory;
import com.dfsek.terra.config.factories.BiomeGridFactory;
import com.dfsek.terra.config.factories.CarverFactory;
import com.dfsek.terra.config.factories.FloraFactory;
import com.dfsek.terra.config.factories.OreFactory;
import com.dfsek.terra.config.factories.PaletteFactory;
import com.dfsek.terra.config.files.FolderLoader;
import com.dfsek.terra.config.lang.LangUtil;
@@ -20,9 +21,11 @@ import com.dfsek.terra.config.templates.BiomeGridTemplate;
import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.config.templates.CarverTemplate;
import com.dfsek.terra.config.templates.FloraTemplate;
import com.dfsek.terra.config.templates.OreTemplate;
import com.dfsek.terra.config.templates.PaletteTemplate;
import com.dfsek.terra.config.templates.StructureTemplate;
import com.dfsek.terra.generation.config.NoiseBuilder;
import com.dfsek.terra.generation.items.ores.Ore;
import com.dfsek.terra.registry.BiomeGridRegistry;
import com.dfsek.terra.registry.BiomeRegistry;
import com.dfsek.terra.registry.CarverRegistry;
@@ -59,15 +62,15 @@ public class ConfigPack {
private final FloraRegistry floraRegistry = new FloraRegistry();
private final OreRegistry oreRegistry = new OreRegistry();
private final AbstractConfigLoader abstractConfigLoader;
private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader();
{
abstractConfigLoader = new AbstractConfigLoader();
abstractConfigLoader
.registerLoader(Palette.class, paletteRegistry)
.registerLoader(Biome.class, biomeRegistry)
.registerLoader(UserDefinedCarver.class, carverRegistry)
.registerLoader(Flora.class, floraRegistry);
.registerLoader(Flora.class, floraRegistry)
.registerLoader(Ore.class, oreRegistry);
ConfigUtil.registerAllLoaders(abstractConfigLoader);
}
@@ -104,6 +107,18 @@ public class ConfigPack {
Debug.info("Loaded palette " + palette.getID());
});
List<OreTemplate> oreTemplates = new ArrayList<>();
new FolderLoader(new File(folder, "ores").toPath())
.then(streams -> oreTemplates.addAll(abstractConfigLoader.load(streams, OreTemplate::new)))
.close();
OreFactory oreFactory = new OreFactory();
oreTemplates.forEach(ore -> {
oreRegistry.add(ore.getID(), oreFactory.build(ore));
Debug.info("Loaded ore " + ore.getID());
});
List<FloraTemplate> floraTemplates = new ArrayList<>();
new FolderLoader(new File(folder, "flora").toPath())
.then(streams -> floraTemplates.addAll(abstractConfigLoader.load(streams, FloraTemplate::new)))

View File

@@ -0,0 +1,21 @@
package com.dfsek.terra.config.factories;
import com.dfsek.terra.config.templates.OreTemplate;
import com.dfsek.terra.generation.items.ores.DeformedSphereOre;
import com.dfsek.terra.generation.items.ores.Ore;
import com.dfsek.terra.generation.items.ores.VanillaOre;
import org.bukkit.block.data.BlockData;
public class OreFactory implements TerraFactory<OreTemplate, Ore> {
@Override
public Ore build(OreTemplate config) {
BlockData m = config.getMaterial();
switch(config.getType()) {
case SPHERE:
return new DeformedSphereOre(m, config.getReplaceable(), config.doPhysics(), config.getDeform(), config.getDeformFrequency(), config.getSize());
case VANILLA:
return new VanillaOre(m, config.getReplaceable(), config.doPhysics(), config.getSize());
}
return null;
}
}

View File

@@ -53,9 +53,9 @@ public class BiomeTemplate implements ConfigTemplate {
@Value("noise-equation")
@Abstractable
private String noiseEquation;
//@Value("ores")
//@Abstractable
//@Default
@Value("ores")
@Abstractable
@Default
private Map<Ore, OreConfig> ores = new HashMap<>();
@Value("ocean.level")
@Abstractable

View File

@@ -1,13 +1,17 @@
package com.dfsek.terra.config.templates.ore;
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.tectonic.config.ConfigTemplate;
import com.dfsek.terra.generation.items.ores.Ore;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.polydev.gaea.math.Range;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@SuppressWarnings({"unused", "FieldMayBeFinal"})
public class OreTemplate implements ConfigTemplate {
@@ -25,26 +29,56 @@ public class OreTemplate implements ConfigTemplate {
@Value("replace")
@Abstractable
private List<BlockData> replaceable;
private List<Material> replaceable;
@Value("physics")
@Abstractable
@Default
private boolean physics = false;
@Value("size")
@Abstractable
private Range size;
@Value("deform")
@Abstractable
@Default
private double deform = 0.75D;
@Value("deform-frequency")
@Abstractable
@Default
private double deformFrequency = 0.1D;
public double getDeform() {
return deform;
}
public double getDeformFrequency() {
return deformFrequency;
}
public Range getSize() {
return size;
}
public BlockData getMaterial() {
return material;
}
public List<BlockData> getReplaceable() {
return replaceable;
public Set<Material> getReplaceable() {
return new HashSet<>(replaceable);
}
public boolean doPhysics() {
return physics;
}
public String getId() {
public String getID() {
return id;
}
public Ore.Type getType() {
return oreType;
}
}

View File

@@ -1,37 +0,0 @@
package com.dfsek.terra.config.templates.ore;
import com.dfsek.tectonic.annotations.Abstractable;
import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.tectonic.config.ConfigTemplate;
import org.polydev.gaea.math.Range;
@SuppressWarnings({"FieldMayBeFinal", "unused"})
public class DeformedSphereOreTemplate implements ConfigTemplate {
@Value("radius.min")
@Abstractable
private Range size;
@Value("deform")
@Abstractable
@Default
private double deform = 0.75D;
@Value("deform-frequency")
@Abstractable
@Default
private double deformFrequency = 0.1D;
public double getDeform() {
return deform;
}
public double getDeformFrequency() {
return deformFrequency;
}
public Range getSize() {
return size;
}
}

View File

@@ -1,16 +0,0 @@
package com.dfsek.terra.config.templates.ore;
import com.dfsek.tectonic.annotations.Abstractable;
import com.dfsek.tectonic.annotations.Value;
import org.polydev.gaea.math.Range;
@SuppressWarnings("unused")
public class VanillaOreTemplate {
@Value("size")
@Abstractable
private Range size;
public Range getSize() {
return size;
}
}

View File

@@ -1,7 +1,6 @@
package com.dfsek.terra.generation.items.ores;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
@@ -25,7 +24,8 @@ public class DeformedSphereOre extends Ore {
}
public void generate(Location origin, Chunk c, Random r) {
@Override
public void generate(Vector origin, Chunk c, Random r) {
FastNoiseLite ore = new FastNoiseLite(r.nextInt());
ore.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
ore.setFrequency(deformFrequency);
@@ -33,7 +33,7 @@ public class DeformedSphereOre extends Ore {
for(int x = -rad; x <= rad; x++) {
for(int y = -rad; y <= rad; y++) {
for(int z = -rad; z <= rad; z++) {
Location oreLoc = origin.clone().add(new Vector(x, y, z));
Vector oreLoc = origin.clone().add(new Vector(x, y, z));
if(oreLoc.getBlockX() > 15 || oreLoc.getBlockZ() > 15 || oreLoc.getBlockY() > 255 || oreLoc.getBlockX() < 0 || oreLoc.getBlockZ() < 0 || oreLoc.getBlockY() < 0)
continue;
if(oreLoc.distance(origin) < (rad + 0.5) * ((ore.getNoise(x, y, z) + 1) * deform)) {

View File

@@ -1,9 +1,9 @@
package com.dfsek.terra.generation.items.ores;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.bukkit.util.Vector;
import java.util.Random;
import java.util.Set;
@@ -21,7 +21,7 @@ public abstract class Ore {
this.applyGravity = applyGravity;
}
public abstract void generate(Location origin, Chunk c, Random r);
public abstract void generate(Vector origin, Chunk c, Random r);
public BlockData getMaterial() {
return material;

View File

@@ -2,29 +2,27 @@ package com.dfsek.terra.generation.items.ores;
import net.jafama.FastMath;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.bukkit.util.Vector;
import org.polydev.gaea.math.Range;
import java.util.Random;
import java.util.Set;
public class VanillaOre extends Ore {
private final double size;
private final Range sizeRange;
public VanillaOre(BlockData material, Set<Material> replaceable, boolean applyGravity, double size) {
public VanillaOre(BlockData material, Set<Material> replaceable, boolean applyGravity, Range size) {
super(material, replaceable, applyGravity);
this.size = size;
this.sizeRange = size;
}
public void generate(Location location, Chunk chunk, Random random) {
int chunkBoundx1 = chunk.getX() << 4;
int chunkBoundx2 = chunk.getX() << 4 + 15;
int chunkBoundz1 = chunk.getZ() << 4;
int chunkBoundz2 = chunk.getZ() << 4 + 15;
@Override
public void generate(Vector location, Chunk chunk, Random random) {
double size = sizeRange.get(random);
int centerX = location.getBlockX();
int centerZ = location.getBlockZ();
@@ -65,11 +63,8 @@ public class VanillaOre extends Ore {
if(d13 * d13 + d14 * d14 < 1.0D) {
for(int z = zStart; z <= zEnd; z++) {
double d15 = (z + 0.5D - (d3 + (d4 - d3) * iFactor)) / (d11 / 2.0D);
if(x > 15 || z > 15 || y > 255 || x < 0 || z < 0 || y < 0) continue;
Block block = chunk.getBlock(x, y, z);
if((block.getX() <= chunkBoundx1 || block.getX() >= chunkBoundx2) &&
(block.getZ() <= chunkBoundz1 || block.getZ() >= chunkBoundz2) &&
block.getY() <= 255)
continue;
if((d13 * d13 + d14 * d14 + d15 * d15 < 1.0D) && getReplaceable().contains(block.getType())) {
block.setBlockData(getMaterial(), isApplyGravity());
}

View File

@@ -5,8 +5,8 @@ import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.config.templates.BiomeTemplate;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import org.polydev.gaea.biome.Biome;
import org.polydev.gaea.generation.GenerationPhase;
@@ -18,7 +18,7 @@ import java.util.Random;
public class OrePopulator extends GaeaBlockPopulator {
@SuppressWarnings("try")
@Override
public void populate(@NotNull World world, @NotNull Random r, @NotNull Chunk chunk) {
public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) {
try(ProfileFuture ignored = TerraProfiler.fromWorld(world).measure("OreTime")) {
TerraWorld tw = TerraWorld.getWorld(world);
if(!tw.isSafe()) return;
@@ -29,10 +29,11 @@ public class OrePopulator extends GaeaBlockPopulator {
Biome b = TerraWorld.getWorld(world).getGrid().getBiome(originX + 8, originZ + 8, GenerationPhase.POPULATE);
BiomeTemplate config = ((UserDefinedBiome) b).getConfig();
config.getOres().forEach((ore, oreConfig) -> {
int amount = oreConfig.getAmount().get(r);
int h = oreConfig.getHeight().get(r);
for(int i = 0; i < amount; i++)
ore.generate(new Location(world, originX + r.nextInt(16), h, originZ + r.nextInt(16)), chunk, r);
int amount = oreConfig.getAmount().get(random);
for(int i = 0; i < amount; i++) {
Vector location = new Vector(random.nextInt(16), oreConfig.getHeight().get(random), random.nextInt(16));
ore.generate(location, chunk, random);
}
});
}
}

View File

@@ -1,6 +1,6 @@
package com.dfsek.terra.registry;
import com.dfsek.terra.generation.items.ores.DeformedSphereOre;
import com.dfsek.terra.generation.items.ores.Ore;
public class OreRegistry extends TerraRegistry<DeformedSphereOre> {
public class OreRegistry extends TerraRegistry<Ore> {
}

View File

@@ -18,7 +18,7 @@ public abstract class TerraRegistry<T> implements TypeLoader<T> {
public T load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
T obj = get((String) o);
if(obj == null)
throw new LoadException("No such " + type + " matching \"" + o + "\" was found in this registry.");
throw new LoadException("No such " + type.getTypeName() + " matching \"" + o + "\" was found in this registry.");
return obj;
}