mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-02-16 10:30:42 +00:00
implement ores, sort of
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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)))
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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)) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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> {
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user