diff --git a/src/main/java/com/dfsek/terra/config/loaders/OreConfigLoader.java b/src/main/java/com/dfsek/terra/config/loaders/OreConfigLoader.java new file mode 100644 index 000000000..33ca13595 --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/loaders/OreConfigLoader.java @@ -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 { + @Override + public OreConfig load(Type type, Object o, ConfigLoader configLoader) throws LoadException { + Map map = (Map) 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); + } +} diff --git a/src/main/java/com/dfsek/terra/config/loaders/OreTypeLoader.java b/src/main/java/com/dfsek/terra/config/loaders/OreTypeLoader.java new file mode 100644 index 000000000..5ba1f5bae --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/loaders/OreTypeLoader.java @@ -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 { + @Override + public Ore.Type load(Type type, Object o, ConfigLoader configLoader) throws LoadException { + return Ore.Type.valueOf((String) o); + } +} diff --git a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index c3f2e7bf8..53e6474b4 100644 --- a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -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 ores = new GlueList<>(); + @Value("ores") + @Abstractable + @Default + private Map ores = new HashMap<>(); @Value("ocean.level") @Abstractable @Default @@ -174,7 +175,7 @@ public class BiomeTemplate implements ConfigTemplate { return noiseEquation; } - public List getOres() { + public Map getOres() { return ores; } diff --git a/src/main/java/com/dfsek/terra/config/templates/ore/DeformedSphereOreTemplate.java b/src/main/java/com/dfsek/terra/config/templates/ore/DeformedSphereOreTemplate.java new file mode 100644 index 000000000..1544152bf --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/templates/ore/DeformedSphereOreTemplate.java @@ -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; + } +} diff --git a/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java b/src/main/java/com/dfsek/terra/config/templates/ore/OreTemplate.java similarity index 60% rename from src/main/java/com/dfsek/terra/config/templates/OreTemplate.java rename to src/main/java/com/dfsek/terra/config/templates/ore/OreTemplate.java index 026a6e16a..170b03838 100644 --- a/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/ore/OreTemplate.java @@ -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 getReplaceable() { return replaceable; } diff --git a/src/main/java/com/dfsek/terra/config/templates/ore/VanillaOreTemplate.java b/src/main/java/com/dfsek/terra/config/templates/ore/VanillaOreTemplate.java new file mode 100644 index 000000000..5d5e80ea3 --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/templates/ore/VanillaOreTemplate.java @@ -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; + } +} diff --git a/src/main/java/com/dfsek/terra/event/OreVeinGenerateEvent.java b/src/main/java/com/dfsek/terra/event/OreVeinGenerateEvent.java deleted file mode 100644 index 03db6e7aa..000000000 --- a/src/main/java/com/dfsek/terra/event/OreVeinGenerateEvent.java +++ /dev/null @@ -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; - } -} diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java b/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java index a084595e5..b553d69aa 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java +++ b/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java @@ -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 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 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()); + } + } + } + } } } diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java b/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java index b3e300b95..2cc11b778 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java +++ b/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java @@ -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 replaceable; private final boolean applyGravity; - public Ore(Range height, Range amount, BlockData material, Set replaceable, boolean applyGravity) { - this.height = height; - this.amount = amount; + public Ore(BlockData material, Set 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 + } } diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java b/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java new file mode 100644 index 000000000..305ca5785 --- /dev/null +++ b/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java @@ -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; + } +} diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java b/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java index fbffe54dc..c9198200e 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java +++ b/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java @@ -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 replaceable, boolean applyGravity, double size) { - super(height, amount, material, replaceable, applyGravity); + public VanillaOre(BlockData material, Set replaceable, boolean applyGravity, double size) { + super(material, replaceable, applyGravity); this.size = size; } diff --git a/src/main/java/com/dfsek/terra/population/OrePopulator.java b/src/main/java/com/dfsek/terra/population/OrePopulator.java index 09eefc0f7..6a33ba69f 100644 --- a/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -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); + }); } } } diff --git a/src/main/java/com/dfsek/terra/util/ConfigUtil.java b/src/main/java/com/dfsek/terra/util/ConfigUtil.java index 0889ac73f..cba109bb4 100644 --- a/src/main/java/com/dfsek/terra/util/ConfigUtil.java +++ b/src/main/java/com/dfsek/terra/util/ConfigUtil.java @@ -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()); } }