begin work on ores

This commit is contained in:
dfsek
2020-11-28 02:34:43 -07:00
parent 4ddace2a92
commit 282bfe9c5d
13 changed files with 175 additions and 112 deletions

View File

@@ -0,0 +1,21 @@
package com.dfsek.terra.config.loaders;
import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.generation.items.ores.OreConfig;
import org.polydev.gaea.math.Range;
import java.lang.reflect.Type;
import java.util.Map;
@SuppressWarnings("unchecked")
public class OreConfigLoader implements TypeLoader<OreConfig> {
@Override
public OreConfig load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
Map<String, Integer> map = (Map<String, Integer>) o;
Range amount = new Range(map.get("min"), map.get("max"));
Range height = new Range(map.get("min-height"), map.get("max-height"));
return new OreConfig(amount, height);
}
}

View File

@@ -0,0 +1,15 @@
package com.dfsek.terra.config.loaders;
import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.generation.items.ores.Ore;
import java.lang.reflect.Type;
public class OreTypeLoader implements TypeLoader<Ore.Type> {
@Override
public Ore.Type load(Type type, Object o, ConfigLoader configLoader) throws LoadException {
return Ore.Type.valueOf((String) o);
}
}

View File

@@ -10,6 +10,7 @@ import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.generation.items.flora.FloraLayer;
import com.dfsek.terra.generation.items.ores.Ore;
import com.dfsek.terra.generation.items.ores.OreConfig;
import com.dfsek.terra.structure.TerraStructure;
import org.bukkit.Material;
import org.bukkit.block.Biome;
@@ -52,10 +53,10 @@ public class BiomeTemplate implements ConfigTemplate {
@Value("noise-equation")
@Abstractable
private String noiseEquation;
//@Value("ores")
//@Abstractable
//@Default
private List<Ore> ores = new GlueList<>();
@Value("ores")
@Abstractable
@Default
private Map<Ore, OreConfig> ores = new HashMap<>();
@Value("ocean.level")
@Abstractable
@Default
@@ -174,7 +175,7 @@ public class BiomeTemplate implements ConfigTemplate {
return noiseEquation;
}
public List<Ore> getOres() {
public Map<Ore, OreConfig> getOres() {
return ores;
}

View File

@@ -0,0 +1,37 @@
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,9 +1,10 @@
package com.dfsek.terra.config.templates;
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 com.dfsek.terra.generation.items.ores.Ore;
import org.bukkit.block.data.BlockData;
import java.util.List;
@@ -17,23 +18,10 @@ public class OreTemplate implements ConfigTemplate {
@Abstractable
private BlockData material;
@Value("radius.min")
@Abstractable
private double minRadius;
@Value("radius.max")
@Abstractable
private double maxRadius;
@Value("deform")
@Value("type")
@Abstractable
@Default
private double deform = 0.75D;
@Value("deform-frequency")
@Abstractable
@Default
private double deformFrequency = 0.1D;
private Ore.Type oreType = Ore.Type.VANILLA;
@Value("replace")
@Abstractable
@@ -48,22 +36,6 @@ public class OreTemplate implements ConfigTemplate {
return material;
}
public double getDeform() {
return deform;
}
public double getDeformFrequency() {
return deformFrequency;
}
public double getMaxRadius() {
return maxRadius;
}
public double getMinRadius() {
return minRadius;
}
public List<BlockData> getReplaceable() {
return replaceable;
}

View File

@@ -0,0 +1,16 @@
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,34 +0,0 @@
package com.dfsek.terra.event;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.generation.items.ores.Ore;
import org.bukkit.Location;
import org.bukkit.event.Cancellable;
public class OreVeinGenerateEvent extends TerraWorldEvent implements Cancellable {
private boolean cancelled;
private Ore ore;
public OreVeinGenerateEvent(TerraWorld tw, Location l, Ore ore) {
super(tw, l);
this.ore = ore;
}
public Ore getConfig() {
return ore;
}
public void setOre(Ore ore) {
this.ore = ore;
}
@Override
public boolean isCancelled() {
return cancelled;
}
@Override
public void setCancelled(boolean cancel) {
this.cancelled = cancel;
}
}

View File

@@ -3,19 +3,46 @@ 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;
import org.bukkit.util.Vector;
import org.polydev.gaea.math.FastNoiseLite;
import org.polydev.gaea.math.Range;
import java.util.Random;
import java.util.Set;
public class DeformedSphereOre extends Ore {
public DeformedSphereOre(Range height, Range amount, BlockData material, Set<Material> replaceable, boolean applyGravity) {
super(height, amount, material, replaceable, applyGravity);
private final double deform;
private final double deformFrequency;
private final Range size;
public DeformedSphereOre(BlockData material, Set<Material> replaceable, boolean applyGravity, double deform, double deformFrequency, Range size) {
super(material, replaceable, applyGravity);
this.deform = deform;
this.deformFrequency = deformFrequency;
this.size = size;
}
public void generate(Location origin, Chunk c, Random r) {
// TODO: implementation
FastNoiseLite ore = new FastNoiseLite(r.nextInt());
ore.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
ore.setFrequency(deformFrequency);
int rad = size.get(r);
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));
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)) {
Block b = c.getBlock(oreLoc.getBlockX(), oreLoc.getBlockY(), oreLoc.getBlockZ());
if(getReplaceable().contains(b.getType()) && b.getLocation().getY() >= 0)
b.setBlockData(getMaterial(), isApplyGravity());
}
}
}
}
}
}

View File

@@ -4,21 +4,18 @@ import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import org.polydev.gaea.math.Range;
import java.util.Random;
import java.util.Set;
public abstract class Ore {
private final Range height;
private final Range amount;
private final BlockData material;
private final Set<Material> replaceable;
private final boolean applyGravity;
public Ore(Range height, Range amount, BlockData material, Set<Material> replaceable, boolean applyGravity) {
this.height = height;
this.amount = amount;
public Ore(BlockData material, Set<Material> replaceable, boolean applyGravity) {
this.material = material;
this.replaceable = replaceable;
this.applyGravity = applyGravity;
@@ -26,14 +23,6 @@ public abstract class Ore {
public abstract void generate(Location origin, Chunk c, Random r);
public Range getHeight() {
return height;
}
public Range getAmount() {
return amount;
}
public BlockData getMaterial() {
return material;
}
@@ -45,4 +34,8 @@ public abstract class Ore {
public boolean isApplyGravity() {
return applyGravity;
}
public enum Type {
VANILLA, SPHERE
}
}

View File

@@ -0,0 +1,21 @@
package com.dfsek.terra.generation.items.ores;
import org.polydev.gaea.math.Range;
public class OreConfig {
private final Range amount;
private final Range height;
public OreConfig(Range amount, Range height) {
this.amount = amount;
this.height = height;
}
public Range getAmount() {
return amount;
}
public Range getHeight() {
return height;
}
}

View File

@@ -6,7 +6,6 @@ import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.polydev.gaea.math.Range;
import java.util.Random;
import java.util.Set;
@@ -15,8 +14,8 @@ import java.util.Set;
public class VanillaOre extends Ore {
private final double size;
public VanillaOre(Range height, Range amount, BlockData material, Set<Material> replaceable, boolean applyGravity, double size) {
super(height, amount, material, replaceable, applyGravity);
public VanillaOre(BlockData material, Set<Material> replaceable, boolean applyGravity, double size) {
super(material, replaceable, applyGravity);
this.size = size;
}

View File

@@ -4,13 +4,9 @@ import com.dfsek.terra.TerraProfiler;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.event.OreVeinGenerateEvent;
import com.dfsek.terra.generation.items.ores.Ore;
import org.bukkit.Bukkit;
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;
@@ -28,23 +24,16 @@ public class OrePopulator extends GaeaBlockPopulator {
if(!tw.isSafe()) return;
for(int cx = -1; cx <= 1; cx++) {
for(int cz = -1; cz <= 1; cz++) {
Biome b = TerraWorld.getWorld(world).getGrid().getBiome(((chunk.getX() + cx) << 4) + 8, ((chunk.getZ() + cz) << 4) + 8, GenerationPhase.POPULATE);
int originX = ((chunk.getX() + cx) << 4);
int originZ = ((chunk.getZ() + cz) << 4);
Biome b = TerraWorld.getWorld(world).getGrid().getBiome(originX + 8, originZ + 8, GenerationPhase.POPULATE);
BiomeTemplate config = ((UserDefinedBiome) b).getConfig();
for(Ore ore : config.getOres()) {
int num = ore.getAmount().get(r);
for(int i = 0; i < num; i++) {
int x = r.nextInt(16) + cx * 16;
int z = r.nextInt(16) + cz * 16;
int y = ore.getHeight().get(r);
Vector v = new Vector(x, y, z);
OreVeinGenerateEvent event = new OreVeinGenerateEvent(tw, v.toLocation(world), ore);
Bukkit.getPluginManager().callEvent(event);
if(!event.isCancelled()) {
ore.generate(new Location(world, x, y, z), chunk, r);
}
}
}
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);
});
}
}
}

View File

@@ -8,6 +8,8 @@ import com.dfsek.terra.config.loaders.BlockDataLoader;
import com.dfsek.terra.config.loaders.FloraLayerLoader;
import com.dfsek.terra.config.loaders.GridSpawnLoader;
import com.dfsek.terra.config.loaders.MaterialLoader;
import com.dfsek.terra.config.loaders.OreConfigLoader;
import com.dfsek.terra.config.loaders.OreTypeLoader;
import com.dfsek.terra.config.loaders.PaletteHolderLoader;
import com.dfsek.terra.config.loaders.PaletteLayerLoader;
import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader;
@@ -15,6 +17,8 @@ import com.dfsek.terra.config.loaders.RangeLoader;
import com.dfsek.terra.config.loaders.VanillaBiomeLoader;
import com.dfsek.terra.config.loaders.base.CarverPaletteLoader;
import com.dfsek.terra.generation.items.flora.FloraLayer;
import com.dfsek.terra.generation.items.ores.Ore;
import com.dfsek.terra.generation.items.ores.OreConfig;
import com.dfsek.terra.procgen.GridSpawn;
import org.bukkit.Material;
import org.bukkit.block.Biome;
@@ -66,6 +70,8 @@ public final class ConfigUtil {
.registerLoader(Biome.class, new VanillaBiomeLoader())
.registerLoader(BlockData.class, new BlockDataLoader())
.registerLoader(Material.class, new MaterialLoader())
.registerLoader(FloraLayer.class, new FloraLayerLoader());
.registerLoader(FloraLayer.class, new FloraLayerLoader())
.registerLoader(Ore.Type.class, new OreTypeLoader())
.registerLoader(OreConfig.class, new OreConfigLoader());
}
}