mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-04-05 07:16:10 +00:00
begin work on ores
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user