From 4e11d5c1cf37e06cd19d750a489fb4f4539b4221 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 28 Nov 2020 18:05:19 -0700 Subject: [PATCH] implement ores, sort of --- .../dfsek/terra/carving/CarverPalette.java | 2 +- .../dfsek/terra/config/base/ConfigPack.java | 21 +++++++-- .../terra/config/factories/OreFactory.java | 21 +++++++++ .../terra/config/templates/BiomeTemplate.java | 6 +-- .../templates/{ore => }/OreTemplate.java | 44 ++++++++++++++++--- .../ore/DeformedSphereOreTemplate.java | 37 ---------------- .../templates/ore/VanillaOreTemplate.java | 16 ------- .../items/ores/DeformedSphereOre.java | 6 +-- .../terra/generation/items/ores/Ore.java | 4 +- .../generation/items/ores/VanillaOre.java | 23 ++++------ .../dfsek/terra/population/OrePopulator.java | 13 +++--- .../com/dfsek/terra/registry/OreRegistry.java | 4 +- .../dfsek/terra/registry/TerraRegistry.java | 2 +- 13 files changed, 106 insertions(+), 93 deletions(-) create mode 100644 src/main/java/com/dfsek/terra/config/factories/OreFactory.java rename src/main/java/com/dfsek/terra/config/templates/{ore => }/OreTemplate.java (52%) delete mode 100644 src/main/java/com/dfsek/terra/config/templates/ore/DeformedSphereOreTemplate.java delete mode 100644 src/main/java/com/dfsek/terra/config/templates/ore/VanillaOreTemplate.java diff --git a/src/main/java/com/dfsek/terra/carving/CarverPalette.java b/src/main/java/com/dfsek/terra/carving/CarverPalette.java index a1ba152a1..75f33ed04 100644 --- a/src/main/java/com/dfsek/terra/carving/CarverPalette.java +++ b/src/main/java/com/dfsek/terra/carving/CarverPalette.java @@ -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 replace; diff --git a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index a16e5a6b8..be91c9b17 100644 --- a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -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 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 floraTemplates = new ArrayList<>(); new FolderLoader(new File(folder, "flora").toPath()) .then(streams -> floraTemplates.addAll(abstractConfigLoader.load(streams, FloraTemplate::new))) diff --git a/src/main/java/com/dfsek/terra/config/factories/OreFactory.java b/src/main/java/com/dfsek/terra/config/factories/OreFactory.java new file mode 100644 index 000000000..459f6ee6b --- /dev/null +++ b/src/main/java/com/dfsek/terra/config/factories/OreFactory.java @@ -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 { + @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; + } +} 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 860436e43..53e6474b4 100644 --- a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -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 ores = new HashMap<>(); @Value("ocean.level") @Abstractable diff --git a/src/main/java/com/dfsek/terra/config/templates/ore/OreTemplate.java b/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java similarity index 52% rename from src/main/java/com/dfsek/terra/config/templates/ore/OreTemplate.java rename to src/main/java/com/dfsek/terra/config/templates/OreTemplate.java index 170b03838..8c8a6fe1e 100644 --- a/src/main/java/com/dfsek/terra/config/templates/ore/OreTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java @@ -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 replaceable; + private List 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 getReplaceable() { - return replaceable; + public Set getReplaceable() { + return new HashSet<>(replaceable); } public boolean doPhysics() { return physics; } - public String getId() { + public String getID() { return id; } + + public Ore.Type getType() { + return oreType; + } } 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 deleted file mode 100644 index 1544152bf..000000000 --- a/src/main/java/com/dfsek/terra/config/templates/ore/DeformedSphereOreTemplate.java +++ /dev/null @@ -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; - } -} 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 deleted file mode 100644 index 5d5e80ea3..000000000 --- a/src/main/java/com/dfsek/terra/config/templates/ore/VanillaOreTemplate.java +++ /dev/null @@ -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; - } -} 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 b553d69aa..a9180e58b 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 @@ -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)) { 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 2cc11b778..c6c25cd13 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 @@ -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; 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 c9198200e..7bec83a99 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 @@ -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 replaceable, boolean applyGravity, double size) { + public VanillaOre(BlockData material, Set 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()); } diff --git a/src/main/java/com/dfsek/terra/population/OrePopulator.java b/src/main/java/com/dfsek/terra/population/OrePopulator.java index 6a33ba69f..6d2cc93d3 100644 --- a/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -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); + } }); } } diff --git a/src/main/java/com/dfsek/terra/registry/OreRegistry.java b/src/main/java/com/dfsek/terra/registry/OreRegistry.java index 744a9262c..69091898a 100644 --- a/src/main/java/com/dfsek/terra/registry/OreRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/OreRegistry.java @@ -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 { +public class OreRegistry extends TerraRegistry { } diff --git a/src/main/java/com/dfsek/terra/registry/TerraRegistry.java b/src/main/java/com/dfsek/terra/registry/TerraRegistry.java index 2284320ee..26f955b83 100644 --- a/src/main/java/com/dfsek/terra/registry/TerraRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/TerraRegistry.java @@ -18,7 +18,7 @@ public abstract class TerraRegistry implements TypeLoader { 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; }