commit -- amend me.

Signed-off-by: solonovamax <solonovamax@12oclockpoint.com>
This commit is contained in:
solonovamax committed 2020-11-14 14:32:03 -05:00
1 parent ca1531c7ab
commit 176e1133f3
7 files changed
+497 -119

No files matched your search

@@ -1,24 +1,37 @@
package com.dfsek.terra.config; package com.dfsek.terra.config;
import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPack;
import org.bukkit.Color;
import org.bukkit.Location;
import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.configuration.serialization.ConfigurationSerializable;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.util.List;
import java.util.Map;
import java.util.Set;
public abstract class TerraConfig extends YamlConfiguration { @SuppressWarnings("unused")
public abstract class TerraConfig {
private final ConfigPack config; private final ConfigPack config;
private final YamlConfiguration yaml;
public TerraConfig(File file, ConfigPack config) throws IOException, InvalidConfigurationException { public TerraConfig(File file, ConfigPack config) throws IOException, InvalidConfigurationException {
load(file); yaml = new YamlConfiguration();
yaml.load(file);
this.config = config; this.config = config;
} }
public TerraConfig(InputStream stream, ConfigPack config) throws IOException, InvalidConfigurationException { public TerraConfig(InputStream stream, ConfigPack config) throws IOException, InvalidConfigurationException {
load(new InputStreamReader(stream)); yaml = new YamlConfiguration();
yaml.load(new InputStreamReader(stream));
this.config = config; this.config = config;
} }
@@ -27,4 +40,244 @@ public abstract class TerraConfig extends YamlConfiguration {
} }
public abstract String getID(); public abstract String getID();
public @NotNull Set<String> getKeys(boolean deep) {
return yaml.getKeys(deep);
}
public @NotNull Map<String, Object> getValues(boolean deep) {
return yaml.getValues(deep);
}
public boolean contains(@NotNull String path) {
return yaml.contains(path);
}
public boolean contains(@NotNull String path, boolean ignoreDefault) {
return yaml.contains(path, ignoreDefault);
}
public boolean isSet(@NotNull String path) {
return yaml.isSet(path);
}
public @Nullable Object get(@NotNull String path) {
return yaml.get(path);
}
public @Nullable Object get(@NotNull String path, @Nullable Object def) {
return yaml.get(path, def);
}
public @Nullable String getString(@NotNull String path) {
return yaml.getString(path);
}
public @Nullable String getString(@NotNull String path, @Nullable String def) {
return yaml.getString(path, def);
}
public boolean isString(@NotNull String path) {
return yaml.isString(path);
}
public int getInt(@NotNull String path) {
return yaml.getInt(path);
}
public int getInt(@NotNull String path, int def) {
return yaml.getInt(path, def);
}
public boolean isInt(@NotNull String path) {
return yaml.isInt(path);
}
public boolean getBoolean(@NotNull String path) {
return yaml.getBoolean(path);
}
public boolean getBoolean(@NotNull String path, boolean def) {
return yaml.getBoolean(path, def);
}
public boolean isBoolean(@NotNull String path) {
return yaml.isBoolean(path);
}
public double getDouble(@NotNull String path) {
return yaml.getDouble(path);
}
public double getDouble(@NotNull String path, double def) {
return yaml.getDouble(path, def);
}
public boolean isDouble(@NotNull String path) {
return yaml.isDouble(path);
}
public long getLong(@NotNull String path) {
return yaml.getLong(path);
}
public long getLong(@NotNull String path, long def) {
return yaml.getLong(path, def);
}
public boolean isLong(@NotNull String path) {
return yaml.isLong(path);
}
public @Nullable List<?> getList(@NotNull String path) {
return yaml.getList(path);
}
public @Nullable List<?> getList(@NotNull String path, @Nullable List<?> def) {
return yaml.getList(path, def);
}
public boolean isList(@NotNull String path) {
return yaml.isList(path);
}
public @NotNull List<String> getStringList(@NotNull String path) {
return yaml.getStringList(path);
}
public @NotNull List<Integer> getIntegerList(@NotNull String path) {
return yaml.getIntegerList(path);
}
public @NotNull List<Boolean> getBooleanList(@NotNull String path) {
return yaml.getBooleanList(path);
}
public @NotNull List<Double> getDoubleList(@NotNull String path) {
return yaml.getDoubleList(path);
}
public @NotNull List<Float> getFloatList(@NotNull String path) {
return yaml.getFloatList(path);
}
public @NotNull List<Long> getLongList(@NotNull String path) {
return yaml.getLongList(path);
}
public @NotNull List<Byte> getByteList(@NotNull String path) {
return yaml.getByteList(path);
}
public @NotNull List<Character> getCharacterList(@NotNull String path) {
return yaml.getCharacterList(path);
}
public @NotNull List<Short> getShortList(@NotNull String path) {
return yaml.getShortList(path);
}
public @NotNull List<Map<?, ?>> getMapList(@NotNull String path) {
return yaml.getMapList(path);
}
public <T> @Nullable T getObject(@NotNull String path, @NotNull Class<T> clazz) {
return yaml.getObject(path, clazz);
}
public <T> @Nullable T getObject(@NotNull String path, @NotNull Class<T> clazz, @Nullable T def) {
return yaml.getObject(path, clazz, def);
}
public <T extends ConfigurationSerializable> @Nullable T getSerializable(@NotNull String path, @NotNull Class<T> clazz) {
return yaml.getSerializable(path, clazz);
}
public <T extends ConfigurationSerializable> @Nullable T getSerializable(@NotNull String path, @NotNull Class<T> clazz, @Nullable T def) {
return yaml.getSerializable(path, clazz, def);
}
public @Nullable ItemStack getItemStack(@NotNull String path) {
return yaml.getItemStack(path);
}
public @Nullable ItemStack getItemStack(@NotNull String path, @Nullable ItemStack def) {
return yaml.getItemStack(path, def);
}
public boolean isItemStack(@NotNull String path) {
return yaml.isItemStack(path);
}
public @Nullable Color getColor(@NotNull String path) {
return yaml.getColor(path);
}
public @Nullable Color getColor(@NotNull String path, @Nullable Color def) {
return yaml.getColor(path, def);
}
public boolean isColor(@NotNull String path) {
return yaml.isColor(path);
}
public @Nullable Location getLocation(@NotNull String path) {
return yaml.getLocation(path);
}
public @Nullable Location getLocation(@NotNull String path, @Nullable Location def) {
return yaml.getLocation(path, def);
}
public boolean isLocation(@NotNull String path) {
return yaml.isLocation(path);
}
} }
@@ -40,7 +40,7 @@ import java.util.stream.Collectors;
/** /**
* Represents a Terra configuration pack. * Represents a Terra configuration pack.
*/ */
public class ConfigPack extends YamlConfiguration { public class ConfigPack {
private static final Map<String, ConfigPack> configs = new HashMap<>(); private static final Map<String, ConfigPack> configs = new HashMap<>();
public final List<String> biomeList; public final List<String> biomeList;
public final double zoneFreq; public final double zoneFreq;
@@ -61,8 +61,8 @@ public class ConfigPack extends YamlConfiguration {
public final boolean vanillaDecoration; public final boolean vanillaDecoration;
public final boolean vanillaMobs; public final boolean vanillaMobs;
public final boolean preventSaplingOverride; public final boolean preventSaplingOverride;
public final Map<StructureTypeEnum, StructureConfig> locatable = new HashMap<>(); public final Map<StructureTypeEnum, StructureConfig> locatable = new HashMap<>();
private final YamlConfiguration yaml;
private final Map<String, OreConfig> ores; private final Map<String, OreConfig> ores;
private final Map<String, PaletteConfig> palettes; private final Map<String, PaletteConfig> palettes;
private final Map<String, CarverConfig> carvers; private final Map<String, CarverConfig> carvers;
@@ -77,12 +77,14 @@ public class ConfigPack extends YamlConfiguration {
private final String id; private final String id;
public ConfigPack(File file) throws IOException, InvalidConfigurationException { public ConfigPack(File file) throws IOException, InvalidConfigurationException {
yaml = new YamlConfiguration();
yaml.load(new File(file, "pack.yml"));
long l = System.nanoTime(); long l = System.nanoTime();
load(new File(file, "pack.yml"));
dataFolder = file; dataFolder = file;
if(!contains("id")) throw new ConfigException("No ID specified!", "null"); if(!yaml.contains("id")) throw new ConfigException("No ID specified!", "null");
this.id = getString("id"); this.id = yaml.getString("id");
ores = ConfigLoader.load(new File(file, "ores").toPath(), this, OreConfig.class); ores = ConfigLoader.load(new File(file, "ores").toPath(), this, OreConfig.class);
@@ -107,37 +109,37 @@ public class ConfigPack extends YamlConfiguration {
grids = ConfigLoader.load(new File(file, "grids").toPath(), this, BiomeGridConfig.class); grids = ConfigLoader.load(new File(file, "grids").toPath(), this, BiomeGridConfig.class);
zoneFreq = 1f / getInt("frequencies.zone", 1536); zoneFreq = 1f / yaml.getInt("frequencies.zone", 1536);
freq1 = 1f / getInt("frequencies.grid-x", 256); freq1 = 1f / yaml.getInt("frequencies.grid-x", 256);
freq2 = 1f / getInt("frequencies.grid-z", 512); freq2 = 1f / yaml.getInt("frequencies.grid-z", 512);
biomeBlend = getBoolean("blend.enable", false); biomeBlend = yaml.getBoolean("blend.enable", false);
blendAmp = getInt("blend.amplitude", 8); blendAmp = yaml.getInt("blend.amplitude", 8);
blendFreq = getDouble("blend.frequency", 0.01); blendFreq = yaml.getDouble("blend.frequency", 0.01);
erosionEnable = getBoolean("erode.enable", false); erosionEnable = yaml.getBoolean("erode.enable", false);
erosionFreq = getDouble("erode.frequency", 0.01); erosionFreq = yaml.getDouble("erode.frequency", 0.01);
erosionThresh = getDouble("erode.threshold", 0.04); erosionThresh = yaml.getDouble("erode.threshold", 0.04);
erosionOctaves = getInt("erode.octaves", 3); erosionOctaves = yaml.getInt("erode.octaves", 3);
octaves = getInt("noise.octaves", 4); octaves = yaml.getInt("noise.octaves", 4);
frequency = getDouble("noise.frequency", 1f / 96); frequency = yaml.getDouble("noise.frequency", 1f / 96);
erosionName = getString("erode.grid"); erosionName = yaml.getString("erode.grid");
vanillaCaves = getBoolean("vanilla.caves", false); vanillaCaves = yaml.getBoolean("vanilla.caves", false);
vanillaStructures = getBoolean("vanilla.structures", false); vanillaStructures = yaml.getBoolean("vanilla.structures", false);
vanillaDecoration = getBoolean("vanilla.decorations", false); vanillaDecoration = yaml.getBoolean("vanilla.decorations", false);
vanillaMobs = getBoolean("vanilla.mobs", false); vanillaMobs = yaml.getBoolean("vanilla.mobs", false);
preventSaplingOverride = getBoolean("prevent-sapling-override", false); preventSaplingOverride = yaml.getBoolean("prevent-sapling-override", false);
if(vanillaMobs || vanillaDecoration || vanillaStructures || vanillaCaves) { if(vanillaMobs || vanillaDecoration || vanillaStructures || vanillaCaves) {
Terra.getInstance().getLogger().warning("WARNING: Vanilla features have been enabled! These features may not work properly, and are not officially supported! Use at your own risk!"); Terra.getInstance().getLogger().warning("WARNING: Vanilla features have been enabled! These features may not work properly, and are not officially supported! Use at your own risk!");
} }
// Load BiomeGrids from BiomeZone // Load BiomeGrids from BiomeZone
biomeList = getStringList("grids"); biomeList = yaml.getStringList("grids");
for(String biome : biomeList) { for(String biome : biomeList) {
if(getBiomeGrid(biome) == null) { if(getBiomeGrid(biome) == null) {
@@ -152,7 +154,7 @@ public class ConfigPack extends YamlConfiguration {
allStructures.addAll(b.getStructures()); allStructures.addAll(b.getStructures());
} }
ConfigurationSection st = getConfigurationSection("locatable"); ConfigurationSection st = yaml.getConfigurationSection("locatable");
if(st != null) { if(st != null) {
Map<String, Object> strucLocatable = st.getValues(false); Map<String, Object> strucLocatable = st.getValues(false);
for(Map.Entry<String, Object> e : strucLocatable.entrySet()) { for(Map.Entry<String, Object> e : strucLocatable.entrySet()) {
@@ -169,6 +171,10 @@ public class ConfigPack extends YamlConfiguration {
LangUtil.log("config-pack.loaded", Level.INFO, getID(), String.valueOf((System.nanoTime() - l) / 1000000D)); LangUtil.log("config-pack.loaded", Level.INFO, getID(), String.valueOf((System.nanoTime() - l) / 1000000D));
} }
public BiomeGridConfig getBiomeGrid(String id) {
return grids.get(id);
}
public String getID() { public String getID() {
return id; return id;
} }
@@ -181,10 +187,6 @@ public class ConfigPack extends YamlConfiguration {
return structures.get(id); return structures.get(id);
} }
public BiomeGridConfig getBiomeGrid(String id) {
return grids.get(id);
}
public static synchronized void loadAll(JavaPlugin main) { public static synchronized void loadAll(JavaPlugin main) {
configs.clear(); configs.clear();
File file = new File(main.getDataFolder(), "packs"); File file = new File(main.getDataFolder(), "packs");
@@ -24,7 +24,6 @@ public class BiomeGridConfig extends TerraConfig {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public BiomeGridConfig(File file, ConfigPack config) throws IOException, InvalidConfigurationException { public BiomeGridConfig(File file, ConfigPack config) throws IOException, InvalidConfigurationException {
super(file, config); super(file, config);
load(file);
if(!contains("id")) throw new ConfigException("Grid ID unspecified!", "null"); if(!contains("id")) throw new ConfigException("Grid ID unspecified!", "null");
this.gridID = getString("id"); this.gridID = getString("id");
if(!contains("grid")) throw new ConfigException("Grid key not found!", getID()); if(!contains("grid")) throw new ConfigException("Grid key not found!", getID());
@@ -0,0 +1,63 @@
package com.dfsek.terra.generation.entities;
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.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;
import org.polydev.gaea.math.FastNoiseLite;
import org.polydev.gaea.population.ChunkCoordinate;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Set;
public class MultiChunkOre extends Ore {
protected final int min;
protected final int max;
public MultiChunkOre(BlockData oreData, int min, int max, double deform, double deformFrequency, String id,
boolean update, int chunkEdgeOffset, Set<Material> replaceable) {
super(oreData, deform, deformFrequency, id, update, chunkEdgeOffset, replaceable);
this.min = min;
this.max = max;
}
@Override
public void generate(Location location, Random random, JavaPlugin plugin) {
FastNoiseLite noise = new FastNoiseLite(random.nextInt());
noise.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
noise.setFrequency(deformFrequency);
Chunk chunk = location.getChunk();
int rad = randomInRange(random, min, max);
Map<ChunkCoordinate, Chunk> chunks = new HashMap<>(); // Cache chunks to prevent re-loading chunks every time one is needed.
chunks.put(new ChunkCoordinate(chunk), chunk);
for(int x = -rad; x <= rad; x++) {
for(int y = -rad; y <= rad; y++) {
for(int z = -rad; z <= rad; z++) {
Vector origin = location.toVector();
Vector source = origin.clone().add(new Vector(x, y, z));
Vector orig = new Vector(location.getBlockX() + (chunk.getX() << 4), location.getBlockY(), location.getBlockZ() + (chunk.getZ() << 4));
Vector oreLocation = orig.clone().add(new Vector(x, y, z));
if(oreLocation.getBlockY() > 255 || oreLocation.getBlockY() < 0)
continue;
if(source.distance(origin) < (rad + 0.5) * ((noise.getNoise(x, y, z) + 1) * deform)) {
ChunkCoordinate coord = new ChunkCoordinate(Math.floorDiv(oreLocation.getBlockX(), 16), Math.floorDiv(oreLocation.getBlockZ(), 16), chunk.getWorld().getUID());
Block block = chunks.computeIfAbsent(coord, k -> chunk.getWorld().getChunkAt(oreLocation.toLocation(chunk.getWorld())))
.getBlock(Math.floorMod(source.getBlockX(), 16), source.getBlockY(), Math.floorMod(source.getBlockZ(), 16)); // Chunk caching conditional computation
if(replaceable.contains(block.getType()) && block.getLocation().getY() >= 0)
block.setBlockData(oreData, update);
}
}
}
}
}
}
@@ -1,53 +1,36 @@
package com.dfsek.terra.generation.entities; package com.dfsek.terra.generation.entities;
import org.bukkit.Chunk;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData; import org.bukkit.block.data.BlockData;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;
import org.polydev.gaea.math.FastNoiseLite;
import org.polydev.gaea.population.ChunkCoordinate;
import java.util.HashMap;
import java.util.Map;
import java.util.Random; import java.util.Random;
import java.util.Set; import java.util.Set;
public class Ore implements GenerationEntity { public abstract class Ore implements GenerationEntity {
private final BlockData oreData; protected final BlockData oreData;
private final int min; protected final double deform;
private final int max; protected final double deformFrequency;
private final double deform; protected final String id;
private final double deformFrequency; protected final boolean update;
private final String id; protected final int chunkEdgeOffset;
private final boolean update; protected final Set<Material> replaceable;
private final boolean crossChunks;
private final int chunkEdgeOffset;
Set<Material> replaceable;
public Ore(BlockData oreData, int min, int max, double deform, double deformFrequency, String id, boolean update, boolean crossChunks, public Ore(BlockData oreData, double deform, double deformFrequency, String id, boolean update,
int chunkEdgeOffset, Set<Material> replaceable) { int chunkEdgeOffset, Set<Material> replaceable) {
this.oreData = oreData; this.oreData = oreData;
this.min = min;
this.max = max;
this.deform = deform; this.deform = deform;
this.deformFrequency = deformFrequency; this.deformFrequency = deformFrequency;
this.id = id; this.id = id;
this.update = update; this.update = update;
this.crossChunks = crossChunks;
this.chunkEdgeOffset = chunkEdgeOffset; this.chunkEdgeOffset = chunkEdgeOffset;
this.replaceable = replaceable; this.replaceable = replaceable;
} }
@Override // @Override
public void generate(Location location, Random random, JavaPlugin plugin) { // public abstract void generate(Location location, Random random, JavaPlugin plugin);
if(crossChunks)
doVeinMulti(location, random);
else
doVeinSingle(location, random);
}
@Override @Override
public boolean isValidLocation(Location location, JavaPlugin plugin) { public boolean isValidLocation(Location location, JavaPlugin plugin) {
@@ -55,64 +38,7 @@ public class Ore implements GenerationEntity {
return (replaceable.contains(block.getType()) && (block.getLocation().getY() >= 0)); return (replaceable.contains(block.getType()) && (block.getLocation().getY() >= 0));
} }
@SuppressWarnings("DuplicatedCode") protected int randomInRange(Random r, int min, int max) {
private void doVeinMulti(Location location, Random random) {
FastNoiseLite ore = new FastNoiseLite(random.nextInt());
Chunk chunk = location.getChunk();
ore.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
ore.setFrequency(deformFrequency);
int rad = randomInRange(random);
Map<ChunkCoordinate, Chunk> chunks = new HashMap<>(); // Cache chunks to prevent re-loading chunks every time one is needed.
chunks.put(new ChunkCoordinate(chunk), chunk);
for(int x = -rad; x <= rad; x++) {
for(int y = -rad; y <= rad; y++) {
for(int z = -rad; z <= rad; z++) {
Vector origin = location.toVector();
Vector source = origin.clone().add(new Vector(x, y, z));
Vector orig = new Vector(location.getBlockX() + (chunk.getX() << 4), location.getBlockY(), location.getBlockZ() + (chunk.getZ() << 4));
Vector oreLocation = orig.clone().add(new Vector(x, y, z));
if(oreLocation.getBlockY() > 255 || oreLocation.getBlockY() < 0) continue;
if(source.distance(origin) < (rad + 0.5) * ((ore.getNoise(x, y, z) + 1) * deform)) {
ChunkCoordinate coord = new ChunkCoordinate(Math.floorDiv(oreLocation.getBlockX(), 16), Math.floorDiv(oreLocation.getBlockZ(), 16), chunk.getWorld().getUID());
Block block = chunks.computeIfAbsent(coord, k -> chunk.getWorld().getChunkAt(oreLocation.toLocation(chunk.getWorld())))
.getBlock(Math.floorMod(source.getBlockX(), 16), source.getBlockY(), Math.floorMod(source.getBlockZ(), 16)); // Chunk caching conditional computation
if(replaceable.contains(block.getType()) && block.getLocation().getY() >= 0)
block.setBlockData(oreData, update);
}
}
}
}
}
@SuppressWarnings("DuplicatedCode")
private void doVeinSingle(Location location, Random random) {
FastNoiseLite ore = new FastNoiseLite(random.nextInt());
Chunk chunk = location.getChunk();
ore.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
ore.setFrequency(deformFrequency);
int rad = randomInRange(random);
for(int x = -rad; x <= rad; x++) {
for(int y = -rad; y <= rad; y++) {
for(int z = -rad; z <= rad; z++) {
Vector oreLoc = location.toVector().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(location.toVector()) < (rad + 0.5) * ((ore.getNoise(x, y, z) + 1) * deform)) {
Block b = chunk.getBlock(oreLoc.getBlockX(), oreLoc.getBlockY(), oreLoc.getBlockZ());
if(replaceable.contains(b.getType()) && b.getLocation().getY() >= 0)
b.setBlockData(oreData, update);
}
}
}
}
}
private int randomInRange(Random r) {
return r.nextInt(max - min + 1) + min; return r.nextInt(max - min + 1) + min;
} }
} }
@@ -0,0 +1,50 @@
package com.dfsek.terra.generation.entities;
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.plugin.java.JavaPlugin;
import org.bukkit.util.Vector;
import org.polydev.gaea.math.FastNoiseLite;
import java.util.Random;
import java.util.Set;
public class SingleChunkOre extends Ore {
protected final int min;
protected final int max;
public SingleChunkOre(BlockData oreData, int min, int max, double deform, double deformFrequency, String id,
boolean update, int chunkEdgeOffset, Set<Material> replaceable) {
super(oreData, deform, deformFrequency, id, update, chunkEdgeOffset, replaceable);
this.min = min;
this.max = max;
}
@Override
public void generate(Location location, Random random, JavaPlugin plugin) {
FastNoiseLite noise = new FastNoiseLite(random.nextInt());
noise.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
noise.setFrequency(deformFrequency);
Chunk chunk = location.getChunk();
int rad = randomInRange(random, min, max);
for(int x = -rad; x <= rad; x++) {
for(int y = -rad; y <= rad; y++) {
for(int z = -rad; z <= rad; z++) {
Vector oreLoc = location.toVector().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(location.toVector()) < (rad + 0.5) * ((noise.getNoise(x, y, z) + 1) * deform)) {
Block b = chunk.getBlock(oreLoc.getBlockX(), oreLoc.getBlockY(), oreLoc.getBlockZ());
if(replaceable.contains(b.getType()) && b.getLocation().getY() >= 0)
b.setBlockData(oreData, update);
}
}
}
}
}
}
@@ -0,0 +1,85 @@
package com.dfsek.terra.generation.entities;
import net.royawesome.jlibnoise.MathHelper;
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.plugin.java.JavaPlugin;
import java.util.Random;
import java.util.Set;
public class VanillaOre extends Ore {
private final int size;
public VanillaOre(BlockData oreData, int size, double deform, double deformFrequency, String id,
boolean update,
int chunkEdgeOffset, Set<Material> replaceable) {
super(oreData, deform, deformFrequency, id, update, chunkEdgeOffset, replaceable);
this.size = size;
}
/**
* TODO: what the fuck does half of this do?
*
* @param location
* @param random
* @param plugin
*/
@Override
public void generate(Location location, Random random, JavaPlugin plugin) {
Chunk chunk = location.getChunk();
int centerX = location.getBlockX();
int centerZ = location.getBlockZ();
int centerY = location.getBlockY();
float f = random.nextFloat() * (float) Math.PI;
double d1 = centerX + 8 + MathHelper.sin(f) * size / 8.0F;
double d2 = centerX + 8 - MathHelper.sin(f) * size / 8.0F;
double d3 = centerZ + 8 + MathHelper.cos(f) * size / 8.0F;
double d4 = centerZ + 8 - MathHelper.cos(f) * size / 8.0F;
double d5 = centerY + random.nextInt(3) - 2;
double d6 = centerY + random.nextInt(3) - 2;
for(int i = 0; i < size; i++) {
float iFactor = (float) i / (float) size;
double d10 = random.nextDouble() * size / 16.0D;
double d11 = (MathHelper.sin((float) Math.PI * iFactor) + 1.0) * d10 + 1.0;
double d12 = (MathHelper.sin((float) Math.PI * iFactor) + 1.0) * d10 + 1.0;
int xStart = MathHelper.floor(d1 + (d2 - d1) * iFactor - d11 / 2.0D);
int yStart = MathHelper.floor(d5 + (d6 - d5) * iFactor - d12 / 2.0D);
int zStart = MathHelper.floor(d3 + (d4 - d3) * iFactor - d11 / 2.0D);
int xEnd = MathHelper.floor(d1 + (d2 - d1) * iFactor + d11 / 2.0D);
int yEnd = MathHelper.floor(d5 + (d6 - d5) * iFactor + d12 / 2.0D);
int zEnd = MathHelper.floor(d3 + (d4 - d3) * iFactor + d11 / 2.0D);
for(int x = xStart; x <= xEnd; x++) {
double d13 = (x + 0.5D - (d1 + (d2 - d1) * iFactor)) / (d11 / 2.0D);
if(d13 * d13 < 1.0D) {
for(int y = yStart; y <= yEnd; y++) {
double d14 = (y + 0.5D - (d5 + (d6 - d5) * iFactor)) / (d12 / 2.0D);
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);
Block block = chunk.getBlock(x, y, z);
if((d13 * d13 + d14 * d14 + d15 * d15 < 1.0D) && replaceable.contains(block.getType())) {
block.setBlockData(oreData, update);
}
}
}
}
}
}
}
}
}