Implementation go brrrr

This commit is contained in:
dfsek
2020-12-10 20:39:55 -07:00
parent 560fdf17fa
commit dbf4b4dd3b
49 changed files with 276 additions and 253 deletions

View File

@@ -1,9 +1,12 @@
package com.dfsek.terra.api.bukkit;
import com.dfsek.terra.api.bukkit.generator.BukkitChunkGenerator;
import com.dfsek.terra.api.bukkit.world.block.BukkitBlock;
import com.dfsek.terra.api.generic.generator.ChunkGenerator;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.vector.Location;
import java.io.File;
import java.util.UUID;
@@ -32,27 +35,37 @@ public class BukkitWorld implements World {
@Override
public String getName() {
return null;
return delegate.getName();
}
@Override
public UUID getUID() {
return null;
return delegate.getUID();
}
@Override
public boolean isChunkGenerated(int x, int z) {
return false;
return delegate.isChunkGenerated(x, z);
}
@Override
public Chunk getChunkAt(int x, int z) {
return null;
return new BukkitChunk(delegate.getChunkAt(x, z));
}
@Override
public File getWorldFolder() {
return null;
return delegate.getWorldFolder();
}
@Override
public Block getBlockAt(int x, int y, int z) {
return new BukkitBlock(delegate.getBlockAt(x, y, z));
}
@Override
public Block getBlockAt(Location l) {
return new BukkitBlock(delegate.getBlockAt(l.getBlockX(), l.getBlockY(), l.getBlockZ()));
}
@Override

View File

@@ -137,6 +137,7 @@ public class TerraBukkitPlugin extends GaeaPlugin implements TerraPlugin {
}
@NotNull
@Override
public PluginConfig getTerraConfig() {
return config;
}

View File

@@ -1,11 +0,0 @@
package com.dfsek.terra.api.gaea.population;
import org.bukkit.Chunk;
import org.bukkit.World;
import org.jetbrains.annotations.NotNull;
import java.util.Random;
public abstract class GaeaBlockPopulator {
public abstract void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk);
}

View File

@@ -7,7 +7,7 @@ import com.dfsek.terra.api.gaea.util.FastRandom;
import com.dfsek.terra.api.gaea.util.GlueList;
import com.dfsek.terra.api.gaea.util.SerializationUtil;
import com.dfsek.terra.api.generic.TerraPlugin;
import com.dfsek.terra.api.generic.generator.BlockPopulator;
import com.dfsek.terra.api.generic.generator.TerraBlockPopulator;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.World;
import org.jetbrains.annotations.NotNull;
@@ -18,22 +18,22 @@ import java.util.HashSet;
import java.util.List;
import java.util.Random;
public class PopulationManager implements BlockPopulator {
private final List<BlockPopulator> attachedPopulators = new GlueList<>();
public class PopulationManager implements TerraBlockPopulator {
private final List<TerraBlockPopulator> attachedPopulators = new GlueList<>();
private final HashSet<ChunkCoordinate> needsPop = new HashSet<>();
private final TerraPlugin main;
private final Object popLock = new Object();
private WorldProfiler profiler;
public PopulationManager(TerraPlugin main) {
this.main = main;
}
public void attach(BlockPopulator populator) {
public void attach(TerraBlockPopulator populator) {
this.attachedPopulators.add(populator);
}
@Override
@SuppressWarnings("try")
public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) {
try(ProfileFuture ignored = measure()) {
needsPop.add(new ChunkCoordinate(chunk));
@@ -85,7 +85,7 @@ public class PopulationManager implements BlockPopulator {
long zRand = (random.nextLong() / 2L << 1L) + 1L;
random.setSeed((long) x * xRand + (long) z * zRand ^ w.getSeed());
Chunk currentChunk = w.getChunkAt(x, z);
for(BlockPopulator r : attachedPopulators) {
for(TerraBlockPopulator r : attachedPopulators) {
r.populate(w, random, currentChunk);
}
needsPop.remove(c);

View File

@@ -1,7 +1,8 @@
package com.dfsek.terra.api.gaea.tree;
import org.bukkit.Location;
import org.bukkit.Material;
import com.dfsek.terra.api.generic.world.block.MaterialData;
import com.dfsek.terra.api.generic.world.vector.Location;
import java.util.Random;
import java.util.Set;
@@ -9,5 +10,5 @@ import java.util.Set;
public interface Tree {
boolean plant(Location l, Random r);
Set<Material> getSpawnable();
Set<MaterialData> getSpawnable();
}

View File

@@ -1,9 +1,9 @@
package com.dfsek.terra.api.gaea.world;
import com.dfsek.terra.api.gaea.math.Range;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.block.Block;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.vector.Location;
import java.util.List;

View File

@@ -4,6 +4,7 @@ import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.api.LoaderRegistrar;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.WorldHandle;
import com.dfsek.terra.config.base.PluginConfig;
import java.util.logging.Logger;
@@ -15,4 +16,6 @@ public interface TerraPlugin extends LoaderRegistrar {
TerraWorld getWorld(World world);
Logger getLogger();
PluginConfig getTerraConfig();
}

View File

@@ -0,0 +1,10 @@
package com.dfsek.terra.api.generic.generator;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.World;
import java.util.Random;
public interface TerraBlockPopulator {
void populate(World world, Random random, Chunk chunk);
}

View File

@@ -11,7 +11,6 @@ public interface BiomeGrid extends Handle {
* @param x - 0-15
* @param z - 0-15
* @return Biome value
* @deprecated biomes are now 3-dimensional
*/
@NotNull
Biome getBiome(int x, int z);
@@ -33,7 +32,6 @@ public interface BiomeGrid extends Handle {
* @param x - 0-15
* @param z - 0-15
* @param bio - Biome value
* @deprecated biomes are now 3-dimensional
*/
void setBiome(int x, int z, @NotNull Biome bio);

View File

@@ -1,6 +1,7 @@
package com.dfsek.terra.api.generic.world;
import com.dfsek.terra.api.generic.Handle;
import com.dfsek.terra.api.generic.world.block.Block;
public interface Chunk extends Handle {
int getX();
@@ -8,4 +9,6 @@ public interface Chunk extends Handle {
int getZ();
World getWorld();
Block getBlock(int x, int y, int z);
}

View File

@@ -2,6 +2,8 @@ package com.dfsek.terra.api.generic.world;
import com.dfsek.terra.api.generic.Handle;
import com.dfsek.terra.api.generic.generator.ChunkGenerator;
import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.vector.Location;
import java.io.File;
import java.util.UUID;
@@ -22,4 +24,8 @@ public interface World extends Handle {
Chunk getChunkAt(int x, int z);
File getWorldFolder();
Block getBlockAt(int x, int y, int z);
Block getBlockAt(Location l);
}

View File

@@ -1,9 +1,8 @@
package com.dfsek.terra.api.generic.world;
import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.MaterialData;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
/**
* Interface to be implemented for world manipulation.
@@ -13,9 +12,9 @@ public interface WorldHandle {
BlockData getBlockData(Block block);
Material getType(Block block);
MaterialData getType(Block block);
com.dfsek.terra.api.generic.world.block.BlockData createBlockData(String data);
BlockData createBlockData(String data);
MaterialData createMaterialData(String data);
}

View File

@@ -1,9 +1,26 @@
package com.dfsek.terra.api.generic.world.block;
import com.dfsek.terra.api.generic.Handle;
import com.dfsek.terra.api.generic.world.vector.Location;
public interface Block extends Handle {
void setBlockData(BlockData data, boolean physics);
BlockData getBlockData();
Block getRelative(BlockFace face);
Block getRelative(BlockFace face, int len);
boolean isEmpty();
Location getLocation();
MaterialData getType();
int getX();
int getZ();
int getY();
}

View File

@@ -2,8 +2,10 @@ package com.dfsek.terra.api.generic.world.block;
import com.dfsek.terra.api.generic.Handle;
public interface BlockData extends Handle, Cloneable {
public interface BlockData extends Cloneable, Handle {
MaterialData getMaterial();
boolean matches(MaterialData materialData);
BlockData clone();
}

View File

@@ -7,4 +7,5 @@ public interface MaterialData extends Handle {
boolean matches(BlockData other);
boolean isSolid();
}

View File

@@ -0,0 +1,12 @@
package com.dfsek.terra.api.generic.world.block.data;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.BlockFace;
import java.util.Set;
public interface MultipleFacing extends BlockData {
Set<BlockFace> getFaces();
void setFace(BlockFace face, boolean facing);
}

View File

@@ -0,0 +1,10 @@
package com.dfsek.terra.api.generic.world.block.data;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.BlockFace;
public interface Rotatable extends BlockData {
BlockFace getRotation();
void setRotation(BlockFace face);
}

View File

@@ -1,6 +1,7 @@
package com.dfsek.terra.api.generic.world.vector;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.block.Block;
public class Location implements Cloneable {
private final World world;
@@ -36,4 +37,44 @@ public class Location implements Cloneable {
public int getBlockZ() {
return vector.getBlockZ();
}
public double getY() {
return vector.getY();
}
public Location setY(double y) {
vector.setY(y);
return this;
}
public double getX() {
return vector.getX();
}
public Location setX(double x) {
vector.setX(x);
return this;
}
public double getZ() {
return vector.getZ();
}
public Location setZ(double z) {
vector.setZ(z);
return this;
}
public World getWorld() {
return world;
}
public Location add(double x, double y, double z) {
vector.add(x, y, z);
return this;
}
public Block getBlock() {
return world.getBlockAt(this);
}
}

View File

@@ -1,12 +1,12 @@
package com.dfsek.terra.carving;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.biome.Biome;
import com.dfsek.terra.api.gaea.generation.GenerationPhase;
import com.dfsek.terra.api.gaea.math.MathUtil;
import com.dfsek.terra.api.gaea.util.FastRandom;
import com.dfsek.terra.api.gaea.util.GlueList;
import com.dfsek.terra.api.gaea.world.carving.Worm;
import com.dfsek.terra.api.generic.TerraPlugin;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.vector.Vector3;
import com.dfsek.terra.biome.UserDefinedBiome;
@@ -21,9 +21,9 @@ public class CarverCache {
private final World w;
private final Map<Long, List<Worm.WormPoint>> carvers = new HashMap<>();
private final TerraBukkitPlugin main;
private final TerraPlugin main;
public CarverCache(World w, TerraBukkitPlugin main) {
public CarverCache(World w, TerraPlugin main) {
this.w = w;
this.main = main;
}

View File

@@ -1,55 +0,0 @@
package com.dfsek.terra.carving;
import com.dfsek.terra.api.gaea.math.FastNoiseLite;
import com.dfsek.terra.api.gaea.math.MathUtil;
import com.dfsek.terra.api.gaea.util.FastRandom;
import com.dfsek.terra.procgen.GridSpawn;
import com.dfsek.terra.procgen.voxel.DeformedSphere;
import com.dfsek.terra.procgen.voxel.Tube;
import com.dfsek.terra.procgen.voxel.VoxelGeometry;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.util.Vector;
import java.util.Random;
public class Cavern {
private final Node node;
private final long seed;
public Cavern(World w) {
this.node = new Node(w);
this.seed = w.getSeed();
}
public VoxelGeometry carveChunk(int chunkX, int chunkZ) {
long seedC = MathUtil.getCarverChunkSeed(chunkX, chunkZ, seed);
Random chunk = new FastRandom(seedC);
Vector org = node.getNodeLocation((chunkX << 4) + 8, (chunkZ << 4) + 8).clone().setY(chunk.nextInt(128));
VoxelGeometry carve = VoxelGeometry.getBlank();
FastNoiseLite smpl = new FastNoiseLite((int) seedC);
smpl.setFrequency(0.01f);
smpl.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
Bukkit.getLogger().info("Cavern: " + org.toString());
carve.merge(new DeformedSphere(org.clone(), chunk.nextInt(4) + 3, 0.75, smpl));
Vector _00 = new Vector(org.getX() + 16, new FastRandom(MathUtil.getCarverChunkSeed(chunkX + 1, chunkZ, seed)).nextInt(128), org.getZ());
carve.merge(new Tube(org, _00, 4));
return carve;
}
public static class Node {
private final long seed;
private final GridSpawn spawn = new GridSpawn(16, 0, 0);
public Node(World w) {
this.seed = w.getSeed();
}
public Vector getNodeLocation(int x, int z) {
return spawn.getNearestSpawn(x, z, seed);
}
}
}

View File

@@ -1,11 +1,11 @@
package com.dfsek.terra.carving;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.generation.GenerationPhase;
import com.dfsek.terra.api.gaea.math.Range;
import com.dfsek.terra.api.gaea.util.FastRandom;
import com.dfsek.terra.api.gaea.world.carving.Carver;
import com.dfsek.terra.api.gaea.world.carving.Worm;
import com.dfsek.terra.api.generic.TerraPlugin;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.vector.Vector3;
import com.dfsek.terra.biome.UserDefinedBiome;
@@ -43,9 +43,9 @@ public class UserDefinedCarver extends Carver {
private double step = 2;
private Range recalc = new Range(8, 10);
private double recalcMagnitude = 3;
private final TerraBukkitPlugin main;
private final TerraPlugin main;
public UserDefinedCarver(Range height, Range length, double[] start, double[] mutate, List<String> radii, Scope parent, long hash, int topCut, int bottomCut, CarverTemplate config, TerraBukkitPlugin main) throws ParseException {
public UserDefinedCarver(Range height, Range length, double[] start, double[] mutate, List<String> radii, Scope parent, long hash, int topCut, int bottomCut, CarverTemplate config, TerraPlugin main) throws ParseException {
super(height.getMin(), height.getMax());
this.length = length;
this.start = start;

View File

@@ -1,11 +1,11 @@
package com.dfsek.terra.config.factories;
import com.dfsek.terra.api.generic.TerraPlugin;
import com.dfsek.terra.api.generic.world.block.BlockData;
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

View File

@@ -3,6 +3,7 @@ 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.api.generic.world.block.MaterialData;
import com.dfsek.terra.util.MaterialSet;
import org.bukkit.Material;
@@ -19,7 +20,7 @@ public class MaterialSetLoader implements TypeLoader<MaterialSet> {
for(String string : stringData) {
try {
if(string.startsWith("#")) set.addTag(string.substring(1));
else set.add((Material) configLoader.loadType(Material.class, string));
else set.add((MaterialData) configLoader.loadType(Material.class, string));
} catch(NullPointerException e) {
throw new LoadException("Invalid data identifier \"" + string + "\"", e);
}

View File

@@ -4,10 +4,10 @@ import com.dfsek.tectonic.exception.LoadException;
import com.dfsek.tectonic.loading.ConfigLoader;
import com.dfsek.tectonic.loading.TypeLoader;
import com.dfsek.terra.api.gaea.world.palette.Palette;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.biome.palette.PaletteHolder;
import com.dfsek.terra.biome.palette.PaletteHolderBuilder;
import com.dfsek.terra.config.loaders.Types;
import org.bukkit.block.data.BlockData;
import java.lang.reflect.Type;
import java.util.List;

View File

@@ -4,9 +4,9 @@ import com.dfsek.tectonic.annotations.Abstractable;
import com.dfsek.tectonic.annotations.Default;
import com.dfsek.tectonic.annotations.Value;
import com.dfsek.terra.api.gaea.math.Range;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.generation.items.ores.Ore;
import com.dfsek.terra.util.MaterialSet;
import org.bukkit.block.data.BlockData;
@SuppressWarnings({"unused", "FieldMayBeFinal"})
public class OreTemplate extends AbstractableTemplate {

View File

@@ -95,6 +95,7 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato
@Override
@SuppressWarnings({"deprecation", "try"})
public void generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome, ChunkGenerator.ChunkData chunk) {
TerraWorld tw = main.getWorld(world);
com.dfsek.terra.api.gaea.biome.BiomeGrid grid = tw.getGrid();
@@ -165,6 +166,7 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato
int cx = xOrig + (x << 2);
int cz = zOrig + (z << 2);
Biome b = grid.getBiome(cx, cz, GenerationPhase.PALETTE_APPLY);
biome.setBiome(x << 2, z << 2, b.getVanillaBiome());
}
}

View File

@@ -3,8 +3,8 @@ package com.dfsek.terra.generation.items;
import com.dfsek.terra.api.gaea.math.FastNoiseLite;
import com.dfsek.terra.api.gaea.math.ProbabilityCollection;
import com.dfsek.terra.api.gaea.math.Range;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.vector.Vector2;
import org.bukkit.Chunk;
import java.util.Random;

View File

@@ -3,11 +3,11 @@ package com.dfsek.terra.generation.items.flora;
import com.dfsek.terra.api.gaea.math.Range;
import com.dfsek.terra.api.gaea.util.GlueList;
import com.dfsek.terra.api.gaea.world.Flora;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.BlockData;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.BlockFace;
import com.dfsek.terra.api.generic.world.vector.Location;
import java.util.List;
@@ -38,7 +38,7 @@ public class BlockFlora implements Flora {
@Override
public boolean plant(Location location) {
location.add(0, 1, 0).getBlock().setBlockData(data);
location.add(0, 1, 0).getBlock().setBlockData(data, true);
return true;
}
}

View File

@@ -4,9 +4,9 @@ import com.dfsek.terra.api.gaea.math.FastNoiseLite;
import com.dfsek.terra.api.gaea.math.ProbabilityCollection;
import com.dfsek.terra.api.gaea.math.Range;
import com.dfsek.terra.api.gaea.world.Flora;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.vector.Vector2;
import com.dfsek.terra.generation.items.PlaceableLayer;
import org.bukkit.Chunk;
import java.util.Random;
@@ -20,6 +20,7 @@ public class FloraLayer extends PlaceableLayer<Flora> {
return density;
}
@Override
public void place(Chunk chunk, Vector2 coords, Random random) {
Flora item = noise == null ? layer.get(random) : layer.get(noise, (chunk.getX() << 4) + coords.getX(), (chunk.getZ() << 4) + coords.getZ());
item.getValidSpawnsAt(chunk, (int) coords.getX(), (int) coords.getZ(), level).forEach(block -> item.plant(block.getLocation()));

View File

@@ -1,22 +1,22 @@
package com.dfsek.terra.generation.items.flora;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.math.Range;
import com.dfsek.terra.api.gaea.util.FastRandom;
import com.dfsek.terra.api.gaea.util.GlueList;
import com.dfsek.terra.api.gaea.world.Flora;
import com.dfsek.terra.api.gaea.world.palette.Palette;
import com.dfsek.terra.api.generic.TerraPlugin;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.WorldHandle;
import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.BlockFace;
import com.dfsek.terra.api.generic.world.block.data.Directional;
import com.dfsek.terra.api.generic.world.block.data.MultipleFacing;
import com.dfsek.terra.api.generic.world.block.data.Rotatable;
import com.dfsek.terra.api.generic.world.vector.Location;
import com.dfsek.terra.util.MaterialSet;
import net.jafama.FastMath;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.Directional;
import org.bukkit.block.data.MultipleFacing;
import org.bukkit.block.data.Rotatable;
import java.util.ArrayList;
import java.util.List;
@@ -41,9 +41,9 @@ public class TerraFlora implements Flora {
private final int irrigableOffset;
private final TerraBukkitPlugin main;
private final TerraPlugin main;
public TerraFlora(Palette<BlockData> floraPalette, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, TerraBukkitPlugin main) {
public TerraFlora(Palette<BlockData> floraPalette, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, TerraPlugin main) {
this.floraPalette = floraPalette;
this.physics = physics;
this.testRotation = testRotation;

View File

@@ -1,14 +1,14 @@
package com.dfsek.terra.generation.items.ores;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.math.FastNoiseLite;
import com.dfsek.terra.api.gaea.math.Range;
import com.dfsek.terra.api.generic.TerraPlugin;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.WorldHandle;
import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.vector.Vector3;
import com.dfsek.terra.util.MaterialSet;
import org.bukkit.Chunk;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.bukkit.util.Vector;
import java.util.Random;
@@ -17,7 +17,7 @@ public class DeformedSphereOre extends Ore {
private final double deformFrequency;
private final Range size;
public DeformedSphereOre(BlockData material, MaterialSet replaceable, boolean applyGravity, double deform, double deformFrequency, Range size, TerraBukkitPlugin main) {
public DeformedSphereOre(BlockData material, MaterialSet replaceable, boolean applyGravity, double deform, double deformFrequency, Range size, TerraPlugin main) {
super(material, replaceable, applyGravity, main);
this.deform = deform;
this.deformFrequency = deformFrequency;
@@ -26,7 +26,7 @@ public class DeformedSphereOre extends Ore {
@Override
public void generate(Vector origin, Chunk c, Random r) {
public void generate(Vector3 origin, Chunk c, Random r) {
WorldHandle handle = main.getHandle();
FastNoiseLite ore = new FastNoiseLite(r.nextInt());
ore.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
@@ -35,7 +35,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++) {
Vector oreLoc = origin.clone().add(new Vector(x, y, z));
Vector3 oreLoc = origin.clone().add(new Vector3(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)) {

View File

@@ -1,10 +1,10 @@
package com.dfsek.terra.generation.items.ores;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.generic.TerraPlugin;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.vector.Vector3;
import com.dfsek.terra.util.MaterialSet;
import org.bukkit.Chunk;
import org.bukkit.block.data.BlockData;
import org.bukkit.util.Vector;
import java.util.Random;
@@ -13,9 +13,9 @@ public abstract class Ore {
private final BlockData material;
private final MaterialSet replaceable;
private final boolean applyGravity;
protected TerraBukkitPlugin main;
protected TerraPlugin main;
public Ore(BlockData material, MaterialSet replaceable, boolean applyGravity, TerraBukkitPlugin main) {
public Ore(BlockData material, MaterialSet replaceable, boolean applyGravity, TerraPlugin main) {
this.material = material;
this.replaceable = replaceable;
@@ -23,7 +23,7 @@ public abstract class Ore {
this.main = main;
}
public abstract void generate(Vector origin, Chunk c, Random r);
public abstract void generate(Vector3 origin, Chunk c, Random r);
public BlockData getMaterial() {
return material;

View File

@@ -1,14 +1,14 @@
package com.dfsek.terra.generation.items.ores;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.math.Range;
import com.dfsek.terra.api.generic.TerraPlugin;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.WorldHandle;
import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.vector.Vector3;
import com.dfsek.terra.util.MaterialSet;
import net.jafama.FastMath;
import org.bukkit.Chunk;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.bukkit.util.Vector;
import java.util.Random;
@@ -16,13 +16,13 @@ import java.util.Random;
public class VanillaOre extends Ore {
private final Range sizeRange;
public VanillaOre(BlockData material, MaterialSet replaceable, boolean applyGravity, Range size, TerraBukkitPlugin main) {
public VanillaOre(BlockData material, MaterialSet replaceable, boolean applyGravity, Range size, TerraPlugin main) {
super(material, replaceable, applyGravity, main);
this.sizeRange = size;
}
@Override
public void generate(Vector location, Chunk chunk, Random random) {
public void generate(Vector3 location, Chunk chunk, Random random) {
WorldHandle handle = main.getHandle();
double size = sizeRange.get(random);

View File

@@ -5,11 +5,11 @@ import com.dfsek.terra.api.gaea.math.ProbabilityCollection;
import com.dfsek.terra.api.gaea.math.Range;
import com.dfsek.terra.api.gaea.tree.Tree;
import com.dfsek.terra.api.gaea.tree.TreeType;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.block.Block;
import com.dfsek.terra.api.generic.world.block.BlockFace;
import com.dfsek.terra.api.generic.world.vector.Vector2;
import com.dfsek.terra.generation.items.PlaceableLayer;
import org.bukkit.Chunk;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import java.util.Random;

View File

@@ -1,32 +1,20 @@
package com.dfsek.terra.population;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.profiler.ProfileFuture;
import com.dfsek.terra.api.generic.world.WorldHandle;
import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.templates.CarverTemplate;
import com.dfsek.terra.util.PopulationUtil;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.bukkit.generator.BlockPopulator;
import com.dfsek.terra.api.generic.generator.TerraBlockPopulator;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.MaterialData;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Random;
import java.util.Set;
public class CavePopulator extends BlockPopulator {
public class CavePopulator implements TerraBlockPopulator {
private final TerraBukkitPlugin main;
private static final Map<Material, BlockData> shiftStorage = new HashMap<>(); // Persist BlockData created for shifts, to avoid re-calculating each time.
private static final BlockData AIR = Material.AIR.createBlockData();
private static final Map<MaterialData, BlockData> shiftStorage = new HashMap<>(); // Persist BlockData created for shifts, to avoid re-calculating each time.
public CavePopulator(TerraBukkitPlugin main) {
this.main = main;
@@ -35,6 +23,7 @@ public class CavePopulator extends BlockPopulator {
@SuppressWarnings("try")
@Override
public void populate(@NotNull World world, @NotNull Random r, @NotNull Chunk chunk) {
/*
TerraWorld tw = main.getWorld(world);
WorldHandle handle = main.getHandle();
try(ProfileFuture ignored = tw.getProfiler().measure("CaveTime")) {
@@ -44,11 +33,11 @@ public class CavePopulator extends BlockPopulator {
for(UserDefinedCarver c : config.getCarvers()) {
CarverTemplate template = c.getConfig();
Map<Location, Material> shiftCandidate = new HashMap<>();
Map<Location, BlockData> shiftCandidate = new HashMap<>();
Set<Block> updateNeeded = new HashSet<>();
c.carve(chunk.getX(), chunk.getZ(), world, (v, type) -> {
Block b = chunk.getBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ());
Material m = handle.getType(b);
MaterialData m = handle.getType(b);
switch(type) {
case CENTER:
if(template.getInner().canReplace(m)) {
@@ -101,5 +90,7 @@ public class CavePopulator extends BlockPopulator {
}
}
*/
}
}

View File

@@ -3,14 +3,14 @@ package com.dfsek.terra.population;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.generation.GenerationPhase;
import com.dfsek.terra.api.gaea.population.GaeaBlockPopulator;
import com.dfsek.terra.api.gaea.profiler.ProfileFuture;
import com.dfsek.terra.api.generic.generator.TerraBlockPopulator;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.vector.Vector2;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.generation.items.flora.FloraLayer;
import org.bukkit.Chunk;
import org.bukkit.World;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
@@ -21,7 +21,7 @@ import java.util.Random;
/**
* Populates Flora and Trees
*/
public class FloraPopulator extends GaeaBlockPopulator {
public class FloraPopulator implements TerraBlockPopulator {
private final TerraBukkitPlugin main;
public FloraPopulator(TerraBukkitPlugin main) {

View File

@@ -5,19 +5,19 @@ import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.biome.Biome;
import com.dfsek.terra.api.gaea.generation.GenerationPhase;
import com.dfsek.terra.api.gaea.math.MathUtil;
import com.dfsek.terra.api.gaea.population.GaeaBlockPopulator;
import com.dfsek.terra.api.gaea.profiler.ProfileFuture;
import com.dfsek.terra.api.gaea.util.FastRandom;
import com.dfsek.terra.api.generic.generator.TerraBlockPopulator;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.vector.Vector3;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.config.templates.BiomeTemplate;
import org.bukkit.Chunk;
import org.bukkit.World;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
import java.util.Random;
public class OrePopulator extends GaeaBlockPopulator {
public class OrePopulator implements TerraBlockPopulator {
private final TerraBukkitPlugin main;
public OrePopulator(TerraBukkitPlugin main) {
@@ -42,7 +42,7 @@ public class OrePopulator extends GaeaBlockPopulator {
config.getOreHolder().forEach((ore, oreConfig) -> {
int amount = oreConfig.getAmount().get(random);
for(int i = 0; i < amount; i++) {
Vector location = new Vector(random.nextInt(16) + 16 * finalCx, oreConfig.getHeight().get(random), random.nextInt(16) + 16 * finalCz);
Vector3 location = new Vector3(random.nextInt(16) + 16 * finalCx, oreConfig.getHeight().get(random), random.nextInt(16) + 16 * finalCz);
ore.generate(location, chunk, random);
}
});

View File

@@ -1,33 +1,14 @@
package com.dfsek.terra.population;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.profiler.ProfileFuture;
import com.dfsek.terra.api.gaea.structures.loot.LootTable;
import com.dfsek.terra.api.gaea.util.FastRandom;
import com.dfsek.terra.api.generic.world.vector.Vector2;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.debug.Debug;
import com.dfsek.terra.generation.items.TerraStructure;
import com.dfsek.terra.structure.Rotation;
import com.dfsek.terra.structure.Structure;
import com.dfsek.terra.structure.StructureContainedInventory;
import com.dfsek.terra.structure.features.Feature;
import com.dfsek.terra.util.PopulationUtil;
import com.dfsek.terra.util.structure.RotationUtil;
import net.jafama.FastMath;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.generator.BlockPopulator;
import org.bukkit.inventory.BlockInventoryHolder;
import com.dfsek.terra.api.generic.generator.TerraBlockPopulator;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.World;
import org.jetbrains.annotations.NotNull;
import java.util.Random;
public class StructurePopulator extends BlockPopulator {
public class StructurePopulator implements TerraBlockPopulator {
private final TerraBukkitPlugin main;
public StructurePopulator(TerraBukkitPlugin main) {
@@ -37,6 +18,7 @@ public class StructurePopulator extends BlockPopulator {
@SuppressWarnings("try")
@Override
public void populate(@NotNull World world, @NotNull Random r, @NotNull Chunk chunk) {
/*
TerraWorld tw = main.getWorld(world);
try(ProfileFuture ignored = tw.getProfiler().measure("StructureTime")) {
Random random = PopulationUtil.getRandom(chunk);
@@ -80,5 +62,7 @@ public class StructurePopulator extends BlockPopulator {
}
}
}
*/
}
}

View File

@@ -3,21 +3,21 @@ package com.dfsek.terra.population;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.generation.GenerationPhase;
import com.dfsek.terra.api.gaea.population.GaeaBlockPopulator;
import com.dfsek.terra.api.gaea.profiler.ProfileFuture;
import com.dfsek.terra.api.generic.generator.TerraBlockPopulator;
import com.dfsek.terra.api.generic.world.Chunk;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.api.generic.world.vector.Vector2;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.grid.master.TerraBiomeGrid;
import com.dfsek.terra.generation.items.tree.TreeLayer;
import net.jafama.FastMath;
import org.bukkit.Chunk;
import org.bukkit.World;
import org.jetbrains.annotations.NotNull;
import java.util.Random;
public class TreePopulator extends GaeaBlockPopulator {
public class TreePopulator implements TerraBlockPopulator {
private final TerraBukkitPlugin main;
public TreePopulator(TerraBukkitPlugin main) {

View File

@@ -3,7 +3,7 @@ package com.dfsek.terra.procgen;
import com.dfsek.terra.api.gaea.math.MathUtil;
import com.dfsek.terra.api.gaea.util.FastRandom;
import com.dfsek.terra.api.gaea.util.GlueList;
import org.bukkit.util.Vector;
import com.dfsek.terra.api.generic.world.vector.Vector3;
import java.util.List;
import java.util.Random;
@@ -30,18 +30,18 @@ public class GridSpawn {
* @param seed Seed for RNG
* @return Vector representing nearest spawnpoint
*/
public Vector getNearestSpawn(int x, int z, long seed) {
public Vector3 getNearestSpawn(int x, int z, long seed) {
int structureChunkX = x / (width + 2 * separation);
int structureChunkZ = z / (width + 2 * separation);
List<Vector> zones = new GlueList<>();
List<Vector3> zones = new GlueList<>();
for(int xi = structureChunkX - 1; xi <= structureChunkX + 1; xi++) {
for(int zi = structureChunkZ - 1; zi <= structureChunkZ + 1; zi++) {
zones.add(getChunkSpawn(xi, zi, seed + seedOffset));
}
}
Vector shortest = zones.get(0);
Vector compare = new Vector(x, 0, z);
for(Vector v : zones) {
Vector3 shortest = zones.get(0);
Vector3 compare = new Vector3(x, 0, z);
for(Vector3 v : zones) {
if(compare.distanceSquared(shortest) > compare.distanceSquared(v)) shortest = v.clone();
}
return shortest;
@@ -55,13 +55,13 @@ public class GridSpawn {
* @param seed Seed for RNG
* @return Vector representing spawnpoint
*/
public Vector getChunkSpawn(int structureChunkX, int structureChunkZ, long seed) {
public Vector3 getChunkSpawn(int structureChunkX, int structureChunkZ, long seed) {
Random r = new FastRandom(MathUtil.getCarverChunkSeed(structureChunkX, structureChunkZ, seed + seedOffset));
int offsetX = r.nextInt(width);
int offsetZ = r.nextInt(width);
int sx = structureChunkX * (width + 2 * separation) + offsetX;
int sz = structureChunkZ * (width + 2 * separation) + offsetZ;
return new Vector(sx, 0, sz);
return new Vector3(sx, 0, sz);
}
public int getWidth() {

View File

@@ -3,20 +3,11 @@ package com.dfsek.terra.structure;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.math.Range;
import com.dfsek.terra.api.generic.world.WorldHandle;
import com.dfsek.terra.api.generic.world.vector.Location;
import com.dfsek.terra.api.generic.world.vector.Vector2;
import com.dfsek.terra.debug.Debug;
import com.dfsek.terra.util.structure.RotationUtil;
import net.jafama.FastMath;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
import org.bukkit.block.data.BlockData;
import org.bukkit.inventory.BlockInventoryHolder;
import org.jetbrains.annotations.NotNull;
import java.io.File;
@@ -28,7 +19,6 @@ import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Objects;
import java.util.UUID;
import java.util.function.Consumer;
@@ -53,6 +43,7 @@ public class Structure implements Serializable {
if(l1.getX() > l2.getX() || l1.getY() > l2.getY() || l1.getZ() > l2.getZ())
throw new IllegalArgumentException("Invalid locations provided!");
structure = new StructureContainedBlock[l2.getBlockX() - l1.getBlockX() + 1][l2.getBlockZ() - l1.getBlockZ() + 1][l2.getBlockY() - l1.getBlockY() + 1];
/*
for(int x = 0; x <= l2.getBlockX() - l1.getBlockX(); x++) {
for(int z = 0; z <= l2.getBlockZ() - l1.getBlockZ(); z++) {
for(int y = 0; y <= l2.getBlockY() - l1.getBlockY(); y++) {
@@ -110,6 +101,8 @@ public class Structure implements Serializable {
}
}
}
*/
if(centerX < 0 || centerZ < 0) throw new InitializationException("No structure center specified.", null);
structureInfo = new StructureInfo(l2.getBlockX() - l1.getBlockX() + 1, l2.getBlockY() - l1.getBlockY() + 1, l2.getBlockZ() - l1.getBlockZ() + 1, new Vector2(centerX, centerZ));
}
@@ -177,6 +170,7 @@ public class Structure implements Serializable {
* @param r The rotation of the structure
*/
private void pasteBlock(StructureContainedBlock block, Location origin, Rotation r, WorldHandle handle) {
/*
BlockData data = block.getBlockData().clone();
if(!data.getMaterial().equals(Material.STRUCTURE_VOID)) {
@@ -209,6 +203,8 @@ public class Structure implements Serializable {
block.getState().getState(worldBlock.getState()).update(true, false);
}
}
*/
}
/**
@@ -287,12 +283,16 @@ public class Structure implements Serializable {
}
public boolean checkSpawns(Location origin, Rotation r, TerraBukkitPlugin main) {
/*
for(StructureContainedBlock b : spawns) {
Vector2 rot = getRotatedCoords(new Vector2(b.getX() - structureInfo.getCenterX(), b.getZ() - structureInfo.getCenterZ()), r);
if(!b.getRequirement().getInstance(origin.getWorld(), main).matches((int) rot.getX() + origin.getBlockX(), origin.getBlockY() + b.getY(), (int) rot.getZ() + origin.getBlockZ()))
return false;
}
return true;
return true;
*/
return false;
}
public HashSet<StructureContainedBlock> getSpawns() {

View File

@@ -1,12 +1,12 @@
package com.dfsek.terra.structure;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.structure.spawn.AirSpawn;
import com.dfsek.terra.structure.spawn.BlankSpawn;
import com.dfsek.terra.structure.spawn.LandSpawn;
import com.dfsek.terra.structure.spawn.OceanSpawn;
import com.dfsek.terra.structure.spawn.Requirement;
import org.bukkit.World;
import java.io.Serializable;

View File

@@ -3,10 +3,10 @@ package com.dfsek.terra.structure.spawn;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.generation.GenerationPhase;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.generation.config.WorldGenerator;
import org.bukkit.World;
public class AirSpawn extends Requirement {
public AirSpawn(World world, TerraBukkitPlugin main) {
@@ -20,6 +20,6 @@ public class AirSpawn extends Requirement {
BiomeTemplate c = b.getConfig();
if(y <= c.getSeaLevel()) return false;
double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z);
return b.getGenerator().getNoise(getNoise(), world, x, y, z) + elevation <= 0;
return b.getGenerator().getNoise(world, x, y, z) + elevation <= 0;
}
}

View File

@@ -3,9 +3,9 @@ package com.dfsek.terra.structure.spawn;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.generation.GenerationPhase;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.generation.config.WorldGenerator;
import org.bukkit.World;
public class LandSpawn extends Requirement {
public LandSpawn(World world, TerraBukkitPlugin main) {
@@ -17,6 +17,6 @@ public class LandSpawn extends Requirement {
TerraWorld tw = main.getWorld(world);
UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE);
double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z);
return b.getGenerator().getNoise(getNoise(), world, x, y, z) + elevation > 0;
return b.getGenerator().getNoise(world, x, y, z) + elevation > 0;
}
}

View File

@@ -3,10 +3,10 @@ package com.dfsek.terra.structure.spawn;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.generation.GenerationPhase;
import com.dfsek.terra.api.generic.world.World;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.config.templates.BiomeTemplate;
import com.dfsek.terra.generation.config.WorldGenerator;
import org.bukkit.World;
public class OceanSpawn extends Requirement {
public OceanSpawn(World world, TerraBukkitPlugin main) {
@@ -20,6 +20,6 @@ public class OceanSpawn extends Requirement {
BiomeTemplate c = b.getConfig();
if(y > c.getSeaLevel()) return false;
double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z);
return b.getGenerator().getNoise(getNoise(), world, x, y, z) + elevation <= 0;
return b.getGenerator().getNoise(world, x, y, z) + elevation <= 0;
}
}

View File

@@ -1,10 +1,7 @@
package com.dfsek.terra.structure.spawn;
import com.dfsek.terra.api.bukkit.TerraBukkitPlugin;
import com.dfsek.terra.api.gaea.math.FastNoiseLite;
import org.bukkit.World;
import java.util.Objects;
import com.dfsek.terra.api.generic.world.World;
public abstract class Requirement {
protected final World world;
@@ -17,9 +14,6 @@ public abstract class Requirement {
public abstract boolean matches(int x, int y, int z);
protected FastNoiseLite getNoise() {
return ((TerraChunkGenerator) Objects.requireNonNull(world.getGenerator())).getNoiseGenerator();
}
public World getWorld() {
return world;

View File

@@ -1,21 +1,21 @@
package com.dfsek.terra.util;
import org.bukkit.Material;
import org.bukkit.block.data.BlockData;
import com.dfsek.terra.api.generic.world.block.BlockData;
import com.dfsek.terra.api.generic.world.block.MaterialData;
import java.util.Arrays;
import java.util.HashSet;
public class MaterialSet extends HashSet<Material> {
public class MaterialSet extends HashSet<MaterialData> {
private static final long serialVersionUID = 3056512763631017301L;
public static MaterialSet singleton(Material material) {
public static MaterialSet singleton(MaterialData material) {
MaterialSet set = new MaterialSet();
set.add(material);
return set;
}
public static MaterialSet get(Material... materials) {
public static MaterialSet get(MaterialData... materials) {
MaterialSet set = new MaterialSet();
set.addAll(Arrays.asList(materials));
return set;

View File

@@ -21,8 +21,8 @@ public final class SlabUtil {
if(stairs != null) {
Palette<BlockData> stairPalette = stairs.get(down.getMaterial());
if(stairPalette != null) {
BlockData stair = stairPalette.get(0, block.getBlockX(), block.getBlockZ());
Stairs stairNew = (Stairs) stair.clone();
BlockData stair = stairPalette.get(0, block.getBlockX(), block.getBlockZ()).clone();
Stairs stairNew = (Stairs) stair;
if(placeStair(orig, chunk, block, thresh, sampler, stairNew)) return; // Successfully placed part.
}
}

View File

@@ -1,14 +1,10 @@
package com.dfsek.terra.util;
import com.dfsek.terra.api.generic.world.block.MaterialData;
import com.dfsek.terra.debug.Debug;
import org.bukkit.Material;
import org.bukkit.Tag;
import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
@@ -17,12 +13,13 @@ import java.util.stream.Stream;
@SuppressWarnings("unchecked")
public final class TagUtil {
private static final Map<String, Set<Material>> tagMap;
private static final Map<String, Set<MaterialData>> tagMap;
static {
Debug.info("Loading tags...");
tagMap = new HashMap<>();
/*
Field[] tags = Tag.class.getFields(); // Add Bukkit tags
for(Field field : tags) {
if(Modifier.isStatic(field.getModifiers())) {
@@ -61,18 +58,20 @@ public final class TagUtil {
Debug.info("Added " + snow.size() + " materials to snow blacklist");
Debug.info("Added " + solid.size() + " materials to solid list");
Debug.info("Loaded " + tagMap.size() + " tags.");
*/
}
private static Set<Material> getSet(Material... materials) {
private static Set<MaterialData> getSet(MaterialData... materials) {
return Stream.of(materials).collect(Collectors.toSet());
}
private static void putCustomSet(String key, Material... materials) {
private static void putCustomSet(String key, MaterialData... materials) {
tagMap.put(key, getSet(materials));
}
@NotNull
public static Set<Material> getTag(String tag) {
public static Set<MaterialData> getTag(String tag) {
return Objects.requireNonNull(tagMap.get(tag));
}
}