Clean up imports

This commit is contained in:
dfsek
2020-10-26 10:58:28 -07:00
parent f198b371e0
commit 224dfbe638
109 changed files with 833 additions and 637 deletions

View File

@@ -13,6 +13,7 @@ public class Debug {
public static void info(String message) {
if(ConfigUtil.debug) main.getLogger().info(message);
}
public static void warn(String message) {
if(ConfigUtil.debug) main.getLogger().warning(message);
}

View File

@@ -21,6 +21,7 @@ public class EventListener implements Listener {
public EventListener(GaeaPlugin main) {
this.main = main;
}
@EventHandler(priority = EventPriority.NORMAL)
public void onEnderEye(EntitySpawnEvent e) {
Entity entity = e.getEntity();
@@ -29,21 +30,25 @@ public class EventListener implements Listener {
TerraWorld tw = TerraWorld.getWorld(e.getEntity().getWorld());
EnderSignal signal = (EnderSignal) entity;
StructureConfig config = tw.getConfig().getLocatable().get(StructureTypeEnum.STRONGHOLD);
if(config!= null) {
if(config != null) {
Debug.info("Overriding Ender Signal...");
AsyncStructureFinder finder = new AsyncStructureFinder(tw.getGrid(), config, e.getLocation(), 0, 500, location -> {
if(location != null) signal.setTargetLocation(location.toLocation(signal.getWorld()));
Debug.info("Location: " + location);
});
finder.run(); // Do this synchronously so eye doesn't change direction several ticks after spawning.
} else main.getLogger().warning("No overrides are defined for Strongholds. Ender Signals will not work correctly.");
} else
main.getLogger().warning("No overrides are defined for Strongholds. Ender Signals will not work correctly.");
}
}
@EventHandler
public void onCartographerChange(VillagerAcquireTradeEvent e) {
if(!(e.getEntity() instanceof Villager)) return;
if(((Villager) e.getEntity()).getProfession().equals(Villager.Profession.CARTOGRAPHER)) e.setCancelled(true); // Cancel leveling if the villager is a Cartographer, to prevent crashing server.
if(! (e.getEntity() instanceof Villager)) return;
if(((Villager) e.getEntity()).getProfession().equals(Villager.Profession.CARTOGRAPHER))
e.setCancelled(true); // Cancel leveling if the villager is a Cartographer, to prevent crashing server.
}
@EventHandler
public void onCartographerLevel(VillagerCareerChangeEvent e) {
if(e.getProfession().equals(Villager.Profession.CARTOGRAPHER)) {

View File

@@ -8,10 +8,8 @@ import com.dfsek.terra.generation.TerraChunkGenerator;
import com.dfsek.terra.util.PaperUtil;
import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.command.PluginCommand;
import org.bukkit.generator.ChunkGenerator;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.polydev.gaea.GaeaPlugin;
@@ -19,10 +17,8 @@ import org.polydev.gaea.generation.GaeaChunkGenerator;
import org.polydev.gaea.lang.Language;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
public class Terra extends GaeaPlugin {
private static Terra instance;

View File

@@ -11,6 +11,7 @@ import java.util.Map;
public class TerraProfiler extends WorldProfiler {
private static final Map<World, TerraProfiler> profilerMap = new HashMap<>();
public TerraProfiler(World w) {
super(w);
this
@@ -23,6 +24,7 @@ public class TerraProfiler extends WorldProfiler {
.addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "CaveBlockUpdate");
profilerMap.put(w, this);
}
public static TerraProfiler fromWorld(World w) {
if(w.getGenerator() instanceof TerraChunkGenerator) {
if(profilerMap.containsKey(w)) return profilerMap.get(w);

View File

@@ -5,9 +5,7 @@ import com.dfsek.terra.biome.TerraBiomeGrid;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.UserDefinedGrid;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.base.ConfigUtil;
import com.dfsek.terra.config.base.WorldConfig;
import com.dfsek.terra.config.exception.ConfigException;
import com.dfsek.terra.config.genconfig.BiomeGridConfig;
import org.bukkit.Bukkit;
import org.bukkit.World;

View File

@@ -39,7 +39,8 @@ public class AsyncBiomeFinder implements Runnable {
int z = centerZ;
int run = 1;
boolean toggle = true;
main: for(int i = startRadius; i < maxRadius; i++) {
main:
for(int i = startRadius; i < maxRadius; i++) {
for(int j = 0; j < run; j++) {
if(checkBiome(x, z).equals(target)) break main;
if(toggle) x++;
@@ -51,7 +52,7 @@ public class AsyncBiomeFinder implements Runnable {
else z--;
}
run++;
toggle = !toggle;
toggle = ! toggle;
}
if(p.isOnline()) {
if(checkBiome(x, z).equals(target)) {
@@ -67,6 +68,7 @@ public class AsyncBiomeFinder implements Runnable {
/**
* Helper method to get biome at location
*
* @param x X coordinate
* @param z Z coordinate
* @return Biome at coordinates

View File

@@ -9,7 +9,6 @@ import com.dfsek.terra.structure.Structure;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
import org.bukkit.util.Vector;
import java.util.Random;
@@ -46,15 +45,16 @@ public class AsyncStructureFinder implements Runnable {
int x = centerX;
int z = centerZ;
final int wid = target.getSpawn().getWidth() + 2*target.getSpawn().getSeparation();
x/=wid;
z/=wid;
final int wid = target.getSpawn().getWidth() + 2 * target.getSpawn().getSeparation();
x /= wid;
z /= wid;
int run = 1;
boolean toggle = true;
boolean found = false;
Vector spawn = null;
main: for(int i = startRadius; i < maxRadius; i++) {
main:
for(int i = startRadius; i < maxRadius; i++) {
for(int j = 0; j < run; j++) {
spawn = target.getSpawn().getChunkSpawn(x, z, seed);
if(isValidSpawn(spawn.getBlockX(), spawn.getBlockZ())) {
@@ -74,26 +74,28 @@ public class AsyncStructureFinder implements Runnable {
else z -= 1;
}
run++;
toggle = !toggle;
toggle = ! toggle;
}
final Vector finalSpawn = found ? spawn: null;
final Vector finalSpawn = found ? spawn : null;
Bukkit.getScheduler().runTask(Terra.getInstance(), () -> callback.accept(finalSpawn));
}
/**
* Check if coordinate pair is a valid structure spawn
*
* @param x X coordinate
* @param z Z coordinate
* @return Whether location is a valid spawn for StructureConfig
*/
private boolean isValidSpawn(int x, int z) {
Location spawn = target.getSpawn().getNearestSpawn(x, z, world.getSeed()).toLocation(world);
if(! TerraWorld.getWorld(world).getConfig().getBiome((UserDefinedBiome) grid.getBiome(spawn)).getStructures().contains(target)) return false;
if(! TerraWorld.getWorld(world).getConfig().getBiome((UserDefinedBiome) grid.getBiome(spawn)).getStructures().contains(target))
return false;
Random r2 = new Random(spawn.hashCode());
Structure struc = target.getStructure(r2);
Structure.Rotation rotation = Structure.Rotation.fromDegrees(r2.nextInt(4) * 90);
for(int y = target.getSearchStart().get(r2); y > 0; y--) {
if(!target.getBound().isInRange(y)) return false;
if(! target.getBound().isInRange(y)) return false;
spawn.setY(y);
if(! struc.checkSpawns(spawn, rotation)) continue;
return true;

View File

@@ -22,7 +22,7 @@ public class BiomeZone {
private final ImageLoader.Channel channel;
public BiomeZone(World w, WorldConfig wc, BiomeGrid[] grids) {
this.noise = new FastNoiseLite((int) w.getSeed()+2);
this.noise = new FastNoiseLite((int) w.getSeed() + 2);
this.noise.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
this.noise.setFractalType(FastNoiseLite.FractalType.FBm);
this.noise.setFractalOctaves(4);
@@ -35,6 +35,7 @@ public class BiomeZone {
/**
* Get BiomeGrid at location
*
* @param x X coordinate
* @param z Z coordinate
* @return BiomeGrid at coordinates.
@@ -45,6 +46,7 @@ public class BiomeZone {
/**
* Get the number of BiomeGrids this BiomeZone holds.
*
* @return Number of grids
*/
public int getSize() {
@@ -53,6 +55,7 @@ public class BiomeZone {
/**
* Get the normalized grid noise at location
*
* @param x X coordinate
* @param z Z coordinate
* @return Normalized noise at coordinates
@@ -63,6 +66,7 @@ public class BiomeZone {
/**
* Get raw grid noise at location
*
* @param x X coordinate
* @param z Z coordinate
* @return Raw noise at coordinates

View File

@@ -13,15 +13,16 @@ public class CoordinatePerturb {
/**
* Create a CoordinatePerturb object with a given frequency, amplitude, and seed.
*
* @param frequency Noise frequency
* @param amplitude Offset amplitude
* @param seed Noise seed
* @param seed Noise seed
*/
public CoordinatePerturb(float frequency, int amplitude, long seed) {
perturbX = new FastNoiseLite((int) seed);
perturbX.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
perturbX.setFrequency(frequency);
perturbZ = new FastNoiseLite((int) seed+1);
perturbZ = new FastNoiseLite((int) seed + 1);
perturbZ.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
perturbZ.setFrequency(frequency);
this.amplitude = amplitude;
@@ -29,11 +30,12 @@ public class CoordinatePerturb {
/**
* Offset a coordinate pair
*
* @param x X coordinate
* @param z Z coordinate
* @return Vector2 containing offset coordinates
*/
public Vector2 getShiftedCoords(int x, int z) {
return new Vector2(perturbX.getNoise(x, z)*amplitude+x, perturbZ.getNoise(x, z)*amplitude+z);
return new Vector2(perturbX.getNoise(x, z) * amplitude + x, perturbZ.getNoise(x, z) * amplitude + z);
}
}

View File

@@ -8,8 +8,9 @@ import org.polydev.gaea.math.FastNoiseLite;
public class ErosionNoise {
private final double thresh;
private final FastNoiseLite noise;
public ErosionNoise(float freq1, double thresh, int octaves, long seed) {
FastNoiseLite main = new FastNoiseLite((int) (seed+1));
FastNoiseLite main = new FastNoiseLite((int) (seed + 1));
main.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
main.setFractalType(FastNoiseLite.FractalType.FBm);
main.setFractalOctaves(octaves);
@@ -20,6 +21,7 @@ public class ErosionNoise {
/**
* Get whether a location is eroded
*
* @param x X coordinate
* @param z Z coordinate
* @return Whether location is eroded

View File

@@ -47,7 +47,8 @@ public class TerraBiomeGrid extends BiomeGrid {
b = (UserDefinedBiome) zone.getGrid(xp, zp).getBiome(xp, zp, phase);
} catch(NullPointerException e) {
if(ConfigUtil.debug) e.printStackTrace();
if(failNum % 256 == 0) LangUtil.log("error.severe-config", Level.SEVERE, String.valueOf(x), String.valueOf(z));
if(failNum % 256 == 0)
LangUtil.log("error.severe-config", Level.SEVERE, String.valueOf(x), String.valueOf(z));
failNum++;
return ConfigUtil.failType.fail();
}

View File

@@ -3,8 +3,8 @@ package com.dfsek.terra.biome;
import com.dfsek.terra.generation.UserDefinedDecorator;
import com.dfsek.terra.generation.UserDefinedGenerator;
import org.polydev.gaea.biome.Biome;
import org.polydev.gaea.biome.Generator;
import org.polydev.gaea.biome.Decorator;
import org.polydev.gaea.biome.Generator;
import org.polydev.gaea.structures.features.Feature;
import java.util.List;

View File

@@ -14,6 +14,7 @@ public class UserDefinedGrid extends BiomeGrid {
private final boolean fromImage;
private final ImageLoader.Channel channelX;
private final ImageLoader.Channel channelZ;
public UserDefinedGrid(World w, float freq1, float freq2, UserDefinedBiome[][] b, WorldConfig c) {
super(w, freq1, freq2, b.length, b[0].length);
super.setGrid(b);

View File

@@ -26,8 +26,8 @@ public enum FailType {
},
/**
* Returns null, hard crashing the server, but not generating any corrupted terrain.<br>
* This option is <br>NOT</br> stable, but it has the least risk of blank chunks being generated.
* However, it has the highest risk of corruption!
* This option is <br>NOT</br> stable, but it has the least risk of blank chunks being generated.
* However, it has the highest risk of corruption!
*/
CRASH {
@Override
@@ -53,6 +53,7 @@ public enum FailType {
/**
* Performs the action specified by the enum type to occur on failure of terrain generation.
*
* @return Failover biome, if specified, null if not.
*/
public abstract Biome fail();

View File

@@ -2,8 +2,6 @@ package com.dfsek.terra.biome.failsafe;
import com.dfsek.terra.generation.UserDefinedDecorator;
import org.polydev.gaea.math.ProbabilityCollection;
import org.polydev.gaea.tree.Tree;
import org.polydev.gaea.world.Flora;
public final class FailoverDecorator extends UserDefinedDecorator {
public FailoverDecorator() {

View File

@@ -13,9 +13,11 @@ import java.util.TreeMap;
public final class FailoverGenerator extends UserDefinedGenerator {
private static final TreeMap<Integer, Palette<BlockData>> palette = new TreeMap<>();
static {
palette.put(255, new RandomPalette<BlockData>(new Random(2403)).add(Material.STONE.createBlockData(), 1));
}
public FailoverGenerator() throws ParseException {
super("0", Collections.emptyList(), palette, false);
}

View File

@@ -9,40 +9,44 @@ import org.bukkit.World;
import org.bukkit.util.Vector;
import org.polydev.gaea.math.FastNoiseLite;
import org.polydev.gaea.math.MathUtil;
import org.polydev.gaea.world.carving.CarvingData;
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 Random(seedC);
Vector org = node.getNodeLocation((chunkX << 4)+8, (chunkZ << 4)+8).clone().setY(chunk.nextInt(128));
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));
carve.merge(new DeformedSphere(org.clone(), chunk.nextInt(4) + 3, 0.75, smpl));
Vector _00 = new Vector(org.getX()+16, new Random(MathUtil.getCarverChunkSeed(chunkX+1, chunkZ, seed)).nextInt(128), org.getZ());
Vector _00 = new Vector(org.getX() + 16, new Random(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);
public Node(World w) {
this.seed = w.getSeed();
}
public Vector getNodeLocation(int x, int z) {
return spawn.getNearestSpawn(x, z, seed);
}

View File

@@ -14,7 +14,8 @@ public class SimplexCarver extends Carver {
private final FastNoiseLite height;
private final FastNoiseLite column;
private final FastNoiseLite hasCaves;
private final double root2inverse = 1D/Math.sqrt(2);
private final double root2inverse = 1D / Math.sqrt(2);
public SimplexCarver(int minY, int maxY) {
super(minY, maxY);
noise = new FastNoiseLite(2403);
@@ -53,19 +54,19 @@ public class SimplexCarver extends Carver {
CarvingData c = new CarvingData(chunkX, chunkZ);
int ox = chunkX << 4;
int oz = chunkZ << 4;
for(int x = ox; x < ox+16; x++) {
for(int z = oz; z < oz+16; z++) {
for(int x = ox; x < ox + 16; x++) {
for(int z = oz; z < oz + 16; z++) {
double heightNoise = height.getNoise(x, z);
double mainNoise = noise.getNoise(x, z)*2;
double columnNoise = Math.pow(Math.max(column.getNoise(x, z), 0)*2, 3);
double hc = (acot(16*(hasCaves.getNoise(x, z)-0.2))/Math.PI)-0.1;
double mainNoise = noise.getNoise(x, z) * 2;
double columnNoise = Math.pow(Math.max(column.getNoise(x, z), 0) * 2, 3);
double hc = (acot(16 * (hasCaves.getNoise(x, z) - 0.2)) / Math.PI) - 0.1;
CarvingData.CarvingType type = CarvingData.CarvingType.BOTTOM;
double simplex = (Math.pow(mainNoise + root2inverse, 3)/2 + columnNoise) * hc;
double simplex = (Math.pow(mainNoise + root2inverse, 3) / 2 + columnNoise) * hc;
for(int y = 0; y < 64; y++) {
double finalNoise = (-0.05*Math.abs(y-(heightNoise*16 + 24))+1 - simplex) * hc;
double finalNoise = (- 0.05 * Math.abs(y - (heightNoise * 16 + 24)) + 1 - simplex) * hc;
if(finalNoise > 0.5) {
c.carve(x-ox, y, z-oz, type);
double finalNoiseUp = (-0.05*Math.abs((y+1)-(heightNoise*16 + 24))+1 - simplex) * hc;
c.carve(x - ox, y, z - oz, type);
double finalNoiseUp = (- 0.05 * Math.abs((y + 1) - (heightNoise * 16 + 24)) + 1 - simplex) * hc;
if(finalNoiseUp > 0.5) {
type = CarvingData.CarvingType.CENTER;
} else type = CarvingData.CarvingType.TOP;

View File

@@ -1,12 +1,12 @@
package com.dfsek.terra.carving;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.config.base.ConfigPack;
import org.polydev.gaea.math.Range;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.config.base.ConfigPack;
import org.bukkit.World;
import org.bukkit.util.Vector;
import org.polydev.gaea.generation.GenerationPhase;
import org.polydev.gaea.math.Range;
import org.polydev.gaea.world.carving.Carver;
import org.polydev.gaea.world.carving.Worm;
@@ -36,37 +36,38 @@ public class UserDefinedCarver extends Carver {
@Override
public Worm getWorm(long l, Vector vector) {
Random r = new Random(l+hash);
return new UserDefinedWorm((int) (length.get(r)/2), r, vector, radius.getMax(), topCut, bottomCut);
Random r = new Random(l + hash);
return new UserDefinedWorm((int) (length.get(r) / 2), r, vector, radius.getMax(), topCut, bottomCut);
}
@Override
public boolean isChunkCarved(World w, int chunkX, int chunkZ, Random random) {
ConfigPack c = TerraWorld.getWorld(w).getConfig();
return new Random(random.nextLong()+hash).nextInt(100) < c.getBiome((UserDefinedBiome) TerraWorld.getWorld(w).getGrid().getBiome(chunkX << 4, chunkZ << 4, GenerationPhase.POPULATE)).getCarverChance(this);
return new Random(random.nextLong() + hash).nextInt(100) < c.getBiome((UserDefinedBiome) TerraWorld.getWorld(w).getGrid().getBiome(chunkX << 4, chunkZ << 4, GenerationPhase.POPULATE)).getCarverChance(this);
}
private class UserDefinedWorm extends Worm {
private final Vector direction;
private final int maxRad;
private double runningRadius;
public UserDefinedWorm(int length, Random r, Vector origin, int maxRad, int topCut, int bottomCut) {
super(length, r, origin);
super.setTopCut(topCut);
super.setBottomCut(bottomCut);
runningRadius = radius.get(r);
this.maxRad = maxRad;
direction = new Vector((r.nextDouble()-0.5D)*start[0], (r.nextDouble()-0.5D)*start[1], (r.nextDouble()-0.5D)*start[2]).normalize().multiply(2);
direction = new Vector((r.nextDouble() - 0.5D) * start[0], (r.nextDouble() - 0.5D) * start[1], (r.nextDouble() - 0.5D) * start[2]).normalize().multiply(2);
}
@Override
public void step() {
setRadius(new int[] {(int) (runningRadius*radiusMultiplier[0]), (int) (runningRadius*radiusMultiplier[1]), (int) (runningRadius*radiusMultiplier[2])});
runningRadius += (getRandom().nextDouble()-0.5)*mutate[3];
setRadius(new int[] {(int) (runningRadius * radiusMultiplier[0]), (int) (runningRadius * radiusMultiplier[1]), (int) (runningRadius * radiusMultiplier[2])});
runningRadius += (getRandom().nextDouble() - 0.5) * mutate[3];
runningRadius = Math.max(Math.min(runningRadius, maxRad), 1);
direction.rotateAroundX(Math.toRadians(getRandom().nextDouble()*mutate[0]*2));
direction.rotateAroundY(Math.toRadians(getRandom().nextDouble()*mutate[1]*2));
direction.rotateAroundZ(Math.toRadians(getRandom().nextDouble()*mutate[2]*2));
direction.rotateAroundX(Math.toRadians(getRandom().nextDouble() * mutate[0] * 2));
direction.rotateAroundY(Math.toRadians(getRandom().nextDouble() * mutate[1] * 2));
direction.rotateAroundZ(Math.toRadians(getRandom().nextDouble() * mutate[2] * 2));
getRunning().add(direction);
}
}

View File

@@ -3,7 +3,6 @@ package com.dfsek.terra.command;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.config.genconfig.OreConfig;
import com.dfsek.terra.config.lang.LangUtil;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.command.Command;

View File

@@ -73,7 +73,7 @@ public class BiomeInfoCommand extends WorldCommand {
compHeight = i;
}
}
if(!changed) {
if(! changed) {
snowMessage.append("Y=0")
.append("-255")
.append(": ")
@@ -104,9 +104,11 @@ public class BiomeInfoCommand extends WorldCommand {
@Override
public List<String> getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) {
if(!(sender instanceof Player) || !(((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator)) return Collections.emptyList();
if(! (sender instanceof Player) || ! (((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator))
return Collections.emptyList();
List<String> ids = TerraWorld.getWorld(((Player) sender).getWorld()).getConfig().getBiomeIDs();
if(args.length == 1) return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList());
if(args.length == 1)
return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList());
return Collections.emptyList();
}
}

View File

@@ -20,10 +20,12 @@ import java.util.stream.Collectors;
public class BiomeLocateCommand extends WorldCommand {
private final boolean tp;
public BiomeLocateCommand(org.polydev.gaea.command.Command parent, boolean teleport) {
super(parent);
this.tp = teleport;
}
@Override
public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) {
String id = args[0];
@@ -62,9 +64,11 @@ public class BiomeLocateCommand extends WorldCommand {
@Override
public List<String> getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) {
if(!(sender instanceof Player) || !(((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator)) return Collections.emptyList();
if(! (sender instanceof Player) || ! (((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator))
return Collections.emptyList();
List<String> ids = TerraWorld.getWorld(((Player) sender).getWorld()).getConfig().getBiomeIDs();
if(args.length == 1) return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList());
if(args.length == 1)
return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList());
return Collections.emptyList();
}
}

View File

@@ -2,9 +2,9 @@ package com.dfsek.terra.command.structure;
import com.dfsek.terra.Terra;
import com.dfsek.terra.config.lang.LangUtil;
import com.dfsek.terra.util.structure.WorldEditUtil;
import com.dfsek.terra.structure.Structure;
import com.dfsek.terra.structure.InitializationException;
import com.dfsek.terra.structure.Structure;
import com.dfsek.terra.util.structure.WorldEditUtil;
import org.bukkit.Location;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;

View File

@@ -22,10 +22,12 @@ import java.util.stream.Collectors;
public class LocateCommand extends WorldCommand {
private final boolean tp;
public LocateCommand(org.polydev.gaea.command.Command parent, boolean tp) {
super(parent);
this.tp = tp;
}
@Override
public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) {
String id = args[0];
@@ -52,8 +54,7 @@ public class LocateCommand extends WorldCommand {
int finalZ = location.getBlockZ();
Bukkit.getScheduler().runTask(Terra.getInstance(), () -> sender.teleport(new Location(sender.getWorld(), finalX, sender.getLocation().getY(), finalZ)));
}
}
else sender.sendMessage("Unable to locate structure. ");
} else sender.sendMessage("Unable to locate structure. ");
}
}));
return true;
@@ -76,9 +77,11 @@ public class LocateCommand extends WorldCommand {
@Override
public List<String> getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) {
if(!(sender instanceof Player) || !(((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator)) return Collections.emptyList();
if(! (sender instanceof Player) || ! (((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator))
return Collections.emptyList();
List<String> ids = TerraWorld.getWorld(((Player) sender).getWorld()).getConfig().getStructureIDs();
if(args.length == 1) return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList());
if(args.length == 1)
return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList());
return Collections.emptyList();
}
}

View File

@@ -19,18 +19,19 @@ import java.util.logging.Level;
import java.util.stream.Stream;
public class ConfigLoader {
public static <T extends TerraConfig> Map<String, T> load(Path file, ConfigPack config, Class<T> clazz) {
public static <T extends TerraConfig> Map<String, T> load(Path file, ConfigPack config, Class<T> clazz) {
long l = System.nanoTime();
Map<String, T> configs = new HashMap<>();
file.toFile().mkdirs();
List<String> ids = new ArrayList<>();
try (Stream<Path> paths = Files.walk(file)) {
try(Stream<Path> paths = Files.walk(file)) {
paths.filter(path -> FilenameUtils.wildcardMatch(path.toFile().getName(), "*.yml"))
.forEach(path -> {
try {
Constructor<T> c = clazz.getConstructor(File.class, ConfigPack.class);
T o = c.newInstance(path.toFile(), config);
if(ids.contains(o.getID())) LangUtil.log("config.error.duplicate", Level.SEVERE, path.toString());
if(ids.contains(o.getID()))
LangUtil.log("config.error.duplicate", Level.SEVERE, path.toString());
ids.add(o.getID());
configs.put(o.getID(), o);
LangUtil.log("config.loaded", Level.INFO, o.toString(), path.toString());

View File

@@ -9,6 +9,7 @@ import java.io.IOException;
public abstract class TerraConfig extends YamlConfiguration {
private final ConfigPack config;
public TerraConfig(File file, ConfigPack config) throws IOException, InvalidConfigurationException {
load(file);
this.config = config;

View File

@@ -4,9 +4,11 @@ import org.jetbrains.annotations.NotNull;
public abstract class TerraConfigSection {
private final TerraConfig parent;
public TerraConfigSection(@NotNull TerraConfig parent) {
this.parent = parent;
}
@NotNull
public TerraConfig getParent() {
return parent;

View File

@@ -5,19 +5,17 @@ import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.config.ConfigLoader;
import com.dfsek.terra.config.exception.ConfigException;
import com.dfsek.terra.config.exception.NotFoundException;
import com.dfsek.terra.config.genconfig.TreeConfig;
import com.dfsek.terra.config.genconfig.biome.AbstractBiomeConfig;
import com.dfsek.terra.config.genconfig.biome.BiomeConfig;
import com.dfsek.terra.config.genconfig.BiomeGridConfig;
import com.dfsek.terra.config.genconfig.CarverConfig;
import com.dfsek.terra.config.genconfig.FloraConfig;
import com.dfsek.terra.config.genconfig.OreConfig;
import com.dfsek.terra.config.genconfig.PaletteConfig;
import com.dfsek.terra.config.genconfig.StructureConfig;
import com.dfsek.terra.config.genconfig.TreeConfig;
import com.dfsek.terra.config.genconfig.biome.AbstractBiomeConfig;
import com.dfsek.terra.config.genconfig.biome.BiomeConfig;
import com.dfsek.terra.config.lang.LangUtil;
import com.dfsek.terra.util.StructureTypeEnum;
import org.bukkit.Bukkit;
import org.bukkit.StructureType;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
@@ -83,7 +81,7 @@ public class ConfigPack extends YamlConfiguration {
load(new File(file, "pack.yml"));
dataFolder = file;
if(!contains("id")) throw new ConfigException("No ID specified!", "null");
if(! contains("id")) throw new ConfigException("No ID specified!", "null");
this.id = getString("id");
ores = ConfigLoader.load(new File(file, "ores").toPath(), this, OreConfig.class);
@@ -104,9 +102,9 @@ public class ConfigPack extends YamlConfiguration {
grids = ConfigLoader.load(new File(file, "grids").toPath(), this, BiomeGridConfig.class);
zoneFreq = 1f/getInt("frequencies.zone", 1536);
freq1 = 1f/getInt("frequencies.grid-x", 256);
freq2 = 1f/getInt("frequencies.grid-z", 512);
zoneFreq = 1f / getInt("frequencies.zone", 1536);
freq1 = 1f / getInt("frequencies.grid-x", 256);
freq2 = 1f / getInt("frequencies.grid-z", 512);
biomeBlend = getBoolean("blend.enable", false);
blendAmp = getInt("blend.amplitude", 8);
@@ -118,7 +116,7 @@ public class ConfigPack extends YamlConfiguration {
erosionOctaves = getInt("erode.octaves", 3);
octaves = getInt("noise.octaves", 4);
frequency = (float) getDouble("noise.frequency", 1f/96);
frequency = (float) getDouble("noise.frequency", 1f / 96);
erosionName = getString("erode.grid");
@@ -152,7 +150,7 @@ 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 Map<StructureTypeEnum, StructureConfig> getLocatable() {

View File

@@ -31,6 +31,7 @@ public final class ConfigUtil {
public static long dataSave; // Period of population data saving, in ticks.
public static boolean masterDisableCaves;
public static FailType failType;
public static void loadConfig(JavaPlugin main) {
main.saveDefaultConfig();
main.reloadConfig();
@@ -38,7 +39,7 @@ public final class ConfigUtil {
LangUtil.load(config.getString("language", "en_us"), main);
debug = config.getBoolean("debug", false);
dataSave = Duration.parse(Objects.requireNonNull(config.getString("data-save", "PT6M"))).toMillis()/20L;
dataSave = Duration.parse(Objects.requireNonNull(config.getString("data-save", "PT6M"))).toMillis() / 20L;
masterDisableCaves = config.getBoolean("master-disable.caves", false);
if(config.getBoolean("dump-default", true)) {
@@ -70,7 +71,8 @@ public final class ConfigUtil {
Set<Material> bl = new HashSet<>();
for(String s : list) {
try {
if(bl.contains(Bukkit.createBlockData(s).getMaterial())) Bukkit.getLogger().warning("Duplicate material in " + phase + " list: " + s);
if(bl.contains(Bukkit.createBlockData(s).getMaterial()))
Bukkit.getLogger().warning("Duplicate material in " + phase + " list: " + s);
bl.add(Bukkit.createBlockData(s).getMaterial());
} catch(NullPointerException | IllegalArgumentException e) {
throw new ConfigException("Could not load BlockData data for \"" + s + "\"", id);

View File

@@ -3,15 +3,12 @@ package com.dfsek.terra.config.base;
import com.dfsek.terra.Debug;
import com.dfsek.terra.config.exception.ConfigException;
import com.dfsek.terra.config.lang.LangUtil;
import com.dfsek.terra.debug.gui.DebugGUI;
import com.dfsek.terra.image.ImageLoader;
import org.apache.commons.io.FileUtils;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin;
import org.polydev.gaea.GaeaPlugin;
import java.io.File;
@@ -51,7 +48,8 @@ public class WorldConfig {
FileConfiguration config = new YamlConfiguration();
Debug.info("Loading config " + configID + " for world " + worldID);
try { // Load/create world config file
if(configID == null || configID.equals("")) throw new ConfigException("Config pack unspecified in bukkit.yml!", worldID);
if(configID == null || configID.equals(""))
throw new ConfigException("Config pack unspecified in bukkit.yml!", worldID);
File configFile = new File(main.getDataFolder() + File.separator + "worlds", worldID + ".yml");
if(! configFile.exists()) {
configFile.getParentFile().mkdirs();
@@ -65,7 +63,8 @@ public class WorldConfig {
tConfig = ConfigPack.fromID(configID);
if(tConfig == null) throw new ConfigException("No such config pack: \"" + configID + "\". This pack either does not exist, or failed to load due to configuration errors.", worldID);
if(tConfig == null)
throw new ConfigException("No such config pack: \"" + configID + "\". This pack either does not exist, or failed to load due to configuration errors.", worldID);
// Load image stuff
try {

View File

@@ -8,6 +8,7 @@ import org.bukkit.configuration.InvalidConfigurationException;
public class ConfigException extends InvalidConfigurationException {
private final String message;
private final String id;
public ConfigException(String message, String id) {
this.message = message;
this.id = id;
@@ -16,6 +17,6 @@ public class ConfigException extends InvalidConfigurationException {
@Override
public String getMessage() {
String ex = getStackTrace()[0].getClassName();
return "Configuration error for " + ex.substring(ex.lastIndexOf(".")+1) + " with ID \"" + id + "\": \n\n" + message;
return "Configuration error for " + ex.substring(ex.lastIndexOf(".") + 1) + " with ID \"" + id + "\": \n\n" + message;
}
}

View File

@@ -2,8 +2,8 @@ package com.dfsek.terra.config.genconfig;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.biome.UserDefinedGrid;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.TerraConfig;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.base.WorldConfig;
import com.dfsek.terra.config.exception.ConfigException;
import com.dfsek.terra.config.exception.NotFoundException;
@@ -25,9 +25,9 @@ public class BiomeGridConfig extends TerraConfig {
public BiomeGridConfig(File file, ConfigPack config) throws IOException, InvalidConfigurationException {
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");
if(!contains("grid")) throw new ConfigException("Grid key not found!", getID());
if(! contains("grid")) throw new ConfigException("Grid key not found!", getID());
this.sizeX = Objects.requireNonNull(getList("grid")).size();
this.sizeZ = ((List<List<String>>) Objects.requireNonNull(getList("grid"))).get(0).size();
gridRaw = new UserDefinedBiome[sizeX][sizeZ];
@@ -37,11 +37,11 @@ public class BiomeGridConfig extends TerraConfig {
try {
gridRaw[x][z] = config.getBiome(((List<List<String>>) Objects.requireNonNull(getList("grid"))).get(x).get(z)).getBiome();
} catch(NullPointerException e) {
throw new NotFoundException("Biome",((List<List<String>>) Objects.requireNonNull(getList("grid"))).get(x).get(z), getID());
throw new NotFoundException("Biome", ((List<List<String>>) Objects.requireNonNull(getList("grid"))).get(x).get(z), getID());
}
}
}
} catch(ClassCastException |NullPointerException e) {
} catch(ClassCastException | NullPointerException e) {
throw new ConfigException("Malformed grid! Ensure all dimensions are correct.", getID());
}
}

View File

@@ -2,8 +2,8 @@ package com.dfsek.terra.config.genconfig;
import com.dfsek.terra.Debug;
import com.dfsek.terra.carving.UserDefinedCarver;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.TerraConfig;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.base.ConfigUtil;
import com.dfsek.terra.config.exception.ConfigException;
import org.bukkit.Bukkit;
@@ -46,7 +46,7 @@ public class CarverConfig extends TerraConfig {
public CarverConfig(File file, ConfigPack config) throws IOException, InvalidConfigurationException {
super(file, config);
load(file);
if(!contains("id")) throw new ConfigException("No ID specified for Carver!", "null");
if(! contains("id")) throw new ConfigException("No ID specified for Carver!", "null");
id = getString("id");
inner = getBlocks("palette.inner.layers");
@@ -105,7 +105,7 @@ public class CarverConfig extends TerraConfig {
@SuppressWarnings("unchecked")
private Map<Integer, ProbabilityCollection<BlockData>> getBlocks(String key) throws InvalidConfigurationException {
if(!contains(key)) throw new ConfigException("Missing Carver Palette!", getID());
if(! contains(key)) throw new ConfigException("Missing Carver Palette!", getID());
Map<Integer, ProbabilityCollection<BlockData>> result = new TreeMap<>();
for(Map<?, ?> m : getMapList(key)) {
try {
@@ -133,56 +133,56 @@ public class CarverConfig extends TerraConfig {
public boolean isReplaceableInner(Material m) {
if(replaceIsBlacklistInner) {
return !replaceableInner.contains(m);
return ! replaceableInner.contains(m);
}
return replaceableInner.contains(m);
}
public boolean isReplaceableOuter(Material m) {
if(replaceIsBlacklistOuter) {
return !replaceableOuter.contains(m);
return ! replaceableOuter.contains(m);
}
return replaceableOuter.contains(m);
}
public boolean isReplaceableTop(Material m) {
if(replaceIsBlacklistTop) {
return !replaceableTop.contains(m);
return ! replaceableTop.contains(m);
}
return replaceableTop.contains(m);
}
public boolean isReplaceableBottom(Material m) {
if(replaceIsBlacklistBottom) {
return !replaceableBottom.contains(m);
return ! replaceableBottom.contains(m);
}
return replaceableBottom.contains(m);
}
public ProbabilityCollection<BlockData> getPaletteInner(int y) {
for(Map.Entry<Integer, ProbabilityCollection<BlockData>> e : inner.entrySet()) {
if(e.getKey() >= y ) return e.getValue();
if(e.getKey() >= y) return e.getValue();
}
return null;
}
public ProbabilityCollection<BlockData> getPaletteOuter(int y) {
for(Map.Entry<Integer, ProbabilityCollection<BlockData>> e : outer.entrySet()) {
if(e.getKey() >= y ) return e.getValue();
if(e.getKey() >= y) return e.getValue();
}
return null;
}
public ProbabilityCollection<BlockData> getPaletteBottom(int y) {
for(Map.Entry<Integer, ProbabilityCollection<BlockData>> e : bottom.entrySet()) {
if(e.getKey() >= y ) return e.getValue();
if(e.getKey() >= y) return e.getValue();
}
return null;
}
public ProbabilityCollection<BlockData> getPaletteTop(int y) {
for(Map.Entry<Integer, ProbabilityCollection<BlockData>> e : top.entrySet()) {
if(e.getKey() >= y ) return e.getValue();
if(e.getKey() >= y) return e.getValue();
}
return null;
}

View File

@@ -1,7 +1,7 @@
package com.dfsek.terra.config.genconfig;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.TerraConfig;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.base.ConfigUtil;
import com.dfsek.terra.config.exception.ConfigException;
import org.bukkit.Chunk;
@@ -27,17 +27,17 @@ public class FloraConfig extends TerraConfig implements Flora {
private final String id;
private final boolean physics;
private final boolean ceiling;
Set<Material> spawnable;
Set<Material> replaceable;
public FloraConfig(File file, ConfigPack config) throws IOException, InvalidConfigurationException {
super(file, config);
load(file);
if(!contains("id")) throw new ConfigException("Flora ID unspecified!", "null");
if(! contains("id")) throw new ConfigException("Flora ID unspecified!", "null");
this.id = getString("id");
if(!contains("layers")) throw new ConfigException("No blocks defined in custom flora!", getID());
if(!contains("spawnable")) throw new ConfigException("Flora spawnable blocks unspecified!", getID());
if(! contains("layers")) throw new ConfigException("No blocks defined in custom flora!", getID());
if(! contains("spawnable")) throw new ConfigException("Flora spawnable blocks unspecified!", getID());
spawnable = ConfigUtil.toBlockData(getStringList("spawnable"), "spawnable", getID());
replaceable = ConfigUtil.toBlockData(getStringList("replaceable"), "replaceable", getID());
@@ -46,7 +46,7 @@ public class FloraConfig extends TerraConfig implements Flora {
Palette<BlockData> p = new RandomPalette<>(new Random(getInt("seed", 4)));
floraPalette = PaletteConfig.getPalette(getMapList("layers"), p);
floraPalette = PaletteConfig.getPalette(getMapList("layers"), p);
}
public String getID() {
@@ -59,14 +59,15 @@ public class FloraConfig extends TerraConfig implements Flora {
if(ceiling) for(int y : range) {
if(y > 255 || y < 1) continue;
Block check = chunk.getBlock(x, y, z);
Block other = chunk.getBlock(x, y-1, z);
Block other = chunk.getBlock(x, y - 1, z);
if(spawnable.contains(check.getType()) && replaceable.contains(other.getType())) {
blocks.add(check);
}
} else for(int y : range) {
}
else for(int y : range) {
if(y > 254 || y < 0) continue;
Block check = chunk.getBlock(x, y, z);
Block other = chunk.getBlock(x, y+1, z);
Block other = chunk.getBlock(x, y + 1, z);
if(spawnable.contains(check.getType()) && replaceable.contains(other.getType())) {
blocks.add(check);
}
@@ -77,14 +78,14 @@ public class FloraConfig extends TerraConfig implements Flora {
@Override
public boolean plant(Location location) {
int size = floraPalette.getSize();
int c = ceiling ? -1 : 1;
for(int i = 0; Math.abs(i) < size; i+= c) { // Down if ceiling, up if floor
if(i+1 > 255) return false;
if(!replaceable.contains(location.clone().add(0, i+c, 0).getBlock().getType())) return false;
int c = ceiling ? - 1 : 1;
for(int i = 0; Math.abs(i) < size; i += c) { // Down if ceiling, up if floor
if(i + 1 > 255) return false;
if(! replaceable.contains(location.clone().add(0, i + c, 0).getBlock().getType())) return false;
}
for(int i = 0; Math.abs(i) < size; i+=c) { // Down if ceiling, up if floor
for(int i = 0; Math.abs(i) < size; i += c) { // Down if ceiling, up if floor
int lvl = (Math.abs(i));
location.clone().add(0, i+c, 0).getBlock().setBlockData(floraPalette.get((ceiling ? lvl : size-lvl-1), location.getBlockX(), location.getBlockZ()), physics);
location.clone().add(0, i + c, 0).getBlock().setBlockData(floraPalette.get((ceiling ? lvl : size - lvl - 1), location.getBlockX(), location.getBlockZ()), physics);
}
return true;
}

View File

@@ -1,12 +1,11 @@
package com.dfsek.terra.config.genconfig;
import com.dfsek.terra.config.TerraConfig;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.base.ConfigUtil;
import com.dfsek.terra.config.TerraConfig;
import com.dfsek.terra.config.exception.ConfigException;
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.data.BlockData;
@@ -34,13 +33,14 @@ public class OreConfig extends TerraConfig {
private final boolean crossChunks;
private final int chunkEdgeOffset;
Set<Material> replaceable;
public OreConfig(File file, ConfigPack config) throws IOException, InvalidConfigurationException {
super(file, config);
if(!contains("id")) throw new ConfigException("Ore ID not found!", "null");
if(! contains("id")) throw new ConfigException("Ore ID not found!", "null");
this.id = getString("id");
if(!contains("material")) throw new ConfigException("Ore material not found!", getID());
if(!contains("deform")) throw new ConfigException("Ore vein deformation not found!", getID());
if(!contains("replace")) throw new ConfigException("Ore replaceable materials not found!", getID());
if(! contains("material")) throw new ConfigException("Ore material not found!", getID());
if(! contains("deform")) throw new ConfigException("Ore vein deformation not found!", getID());
if(! contains("replace")) throw new ConfigException("Ore replaceable materials not found!", getID());
min = getInt("radius.min", 1);
max = getInt("radius.max", 1);
deform = getDouble("deform", 0.75);
@@ -49,7 +49,8 @@ public class OreConfig extends TerraConfig {
crossChunks = getBoolean("cross-chunks", true);
chunkEdgeOffset = getInt("edge-offset", 1);
if(chunkEdgeOffset > 7 || chunkEdgeOffset < 0) throw new ConfigException("Edge offset is too high/low!", getID());
if(chunkEdgeOffset > 7 || chunkEdgeOffset < 0)
throw new ConfigException("Edge offset is too high/low!", getID());
replaceable = ConfigUtil.toBlockData(getStringList("replace"), "replaceable", getID());
@@ -61,8 +62,9 @@ public class OreConfig extends TerraConfig {
}
private int randomInRange(Random r) {
return r.nextInt(max-min+1)+min;
return r.nextInt(max - min + 1) + min;
}
public void doVein(Vector l, Chunk chunk, Random r) {
FastNoiseLite ore = new FastNoiseLite(r.nextInt());
ore.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
@@ -71,35 +73,39 @@ public class OreConfig extends TerraConfig {
Map<ChunkCoordinate, Chunk> chunks = new HashMap<>(); // Cache chunks to prevent re-loading chunks every time one is needed.
chunks.put(new ChunkCoordinate(chunk), chunk);
Vector orig = new Vector(l.getBlockX() + (chunk.getX() << 4), l.getBlockY(), l.getBlockZ() + (chunk.getZ() << 4));
for(int x = -rad; x <= rad; x++) {
for(int y = -rad; y <= rad; y++) {
for(int z = -rad; z <= rad; z++) {
for(int x = - rad; x <= rad; x++) {
for(int y = - rad; y <= rad; y++) {
for(int z = - rad; z <= rad; z++) {
Vector oreLoc = orig.clone().add(new Vector(x, y, z));
Vector source = l.clone().add(new Vector(x, y, z));
if(oreLoc.getBlockY() > 255 || oreLoc.getBlockY() < 0) continue;
if(source.distance(l) < (rad + 0.5) * ((ore.getNoise(x, y, z)+1)*deform)) {
if(source.distance(l) < (rad + 0.5) * ((ore.getNoise(x, y, z) + 1) * deform)) {
ChunkCoordinate coord = new ChunkCoordinate(Math.floorDiv(oreLoc.getBlockX(), 16), Math.floorDiv(oreLoc.getBlockZ(), 16), chunk.getWorld().getUID());
Block b = chunks.computeIfAbsent(coord, k -> chunk.getWorld().getChunkAt(oreLoc.toLocation(chunk.getWorld())))
.getBlock(Math.floorMod(source.getBlockX(), 16), source.getBlockY(), Math.floorMod(source.getBlockZ(), 16)); // Chunk caching conditional computation
if(replaceable.contains(b.getType()) && b.getLocation().getY() >= 0) b.setBlockData(oreData, update);
if(replaceable.contains(b.getType()) && b.getLocation().getY() >= 0)
b.setBlockData(oreData, update);
}
}
}
}
}
public void doVeinSingle(Vector l, Chunk chunk, Random r) {
FastNoiseLite ore = new FastNoiseLite(r.nextInt());
ore.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2);
ore.setFrequency((float) deformFrequency);
int rad = randomInRange(r);
for(int x = -rad; x <= rad; x++) {
for(int y = -rad; y <= rad; y++) {
for(int z = -rad; z <= rad; z++) {
for(int x = - rad; x <= rad; x++) {
for(int y = - rad; y <= rad; y++) {
for(int z = - rad; z <= rad; z++) {
Vector oreLoc = l.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(l) < (rad + 0.5) * ((ore.getNoise(x, y, z)+1)*deform)) {
if(oreLoc.getBlockX() > 15 || oreLoc.getBlockZ() > 15 || oreLoc.getBlockY() > 255 || oreLoc.getBlockX() < 0 || oreLoc.getBlockZ() < 0 || oreLoc.getBlockY() < 0)
continue;
if(oreLoc.distance(l) < (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);
if(replaceable.contains(b.getType()) && b.getLocation().getY() >= 0)
b.setBlockData(oreData, update);
}
}
}

View File

@@ -1,8 +1,8 @@
package com.dfsek.terra.config.genconfig;
import com.dfsek.terra.Debug;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.TerraConfig;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.exception.ConfigException;
import org.bukkit.Bukkit;
import org.bukkit.block.data.BlockData;
@@ -23,9 +23,10 @@ public class PaletteConfig extends TerraConfig {
private final Palette<BlockData> palette;
private final String paletteID;
private boolean useNoise = false;
public PaletteConfig(File file, ConfigPack config) throws IOException, InvalidConfigurationException {
super(file, config);
if(!contains("id")) throw new ConfigException("Palette ID unspecified!", "null");
if(! contains("id")) throw new ConfigException("Palette ID unspecified!", "null");
this.paletteID = getString("id");
Palette<BlockData> pal;
if(getBoolean("simplex", false)) {
@@ -63,7 +64,7 @@ public class PaletteConfig extends TerraConfig {
} else {
Debug.info("One-block palette layer!");
String data = "null";
for(Map.Entry<?, ?> e: map.get(0).entrySet()) {
for(Map.Entry<?, ?> e : map.get(0).entrySet()) {
data = (String) e.getKey();
}
p.add(Bukkit.createBlockData(data), (Integer) m.get("layers"));

View File

@@ -1,8 +1,8 @@
package com.dfsek.terra.config.genconfig;
import com.dfsek.terra.Debug;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.TerraConfig;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.base.ConfigUtil;
import com.dfsek.terra.config.exception.ConfigException;
import com.dfsek.terra.config.exception.NotFoundException;
@@ -32,11 +32,12 @@ public class StructureConfig extends TerraConfig {
private final Range bound;
private final Map<Integer, LootTable> loot = new HashMap<>();
StructurePopulator.SearchType type;
public StructureConfig(File file, ConfigPack config) throws IOException, InvalidConfigurationException {
super(file, config);
if(!contains("id")) throw new ConfigException("No ID specified!", "null");
if(! contains("id")) throw new ConfigException("No ID specified!", "null");
id = getString("id");
if(!contains("files")) throw new ConfigException("No files specified!", getID());
if(! contains("files")) throw new ConfigException("No files specified!", getID());
try {
for(Map.Entry<String, Object> e : Objects.requireNonNull(getConfigurationSection("files")).getValues(false).entrySet()) {
try {

View File

@@ -27,12 +27,13 @@ public class TreeConfig extends TerraConfig implements Tree {
private final String id;
private final int yOffset;
private final ProbabilityCollection<Structure> structure = new ProbabilityCollection<>();
public TreeConfig(File file, ConfigPack config) throws IOException, InvalidConfigurationException {
super(file, config);
spawnable = ConfigUtil.toBlockData(getStringList("spawnable"), "spawnable", getID());
if(!contains("id")) throw new ConfigException("No ID specified!", "null");
if(! contains("id")) throw new ConfigException("No ID specified!", "null");
id = getString("id");
if(!contains("files")) throw new ConfigException("No files specified!", getID());
if(! contains("files")) throw new ConfigException("No files specified!", getID());
yOffset = getInt("y-offset", 0);
try {
for(Map.Entry<String, Object> e : Objects.requireNonNull(getConfigurationSection("files")).getValues(false).entrySet()) {
@@ -64,10 +65,10 @@ public class TreeConfig extends TerraConfig implements Tree {
public boolean plant(Location location, Random random, JavaPlugin javaPlugin) {
location.subtract(0, 1, 0);
Location mut = location.clone().subtract(0, yOffset, 0);
if(!spawnable.contains(location.getBlock().getType())) return false;
if(! spawnable.contains(location.getBlock().getType())) return false;
Structure struc = structure.get(random);
Structure.Rotation rotation = Structure.Rotation.fromDegrees(random.nextInt(4) * 90);
if(!struc.checkSpawns(mut, rotation)) return false;
if(! struc.checkSpawns(mut, rotation)) return false;
struc.paste(mut, rotation);
return true;
}

View File

@@ -1,14 +1,13 @@
package com.dfsek.terra.config.genconfig.biome;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.TerraConfig;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.exception.ConfigException;
import org.bukkit.configuration.InvalidConfigurationException;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Map;
public class AbstractBiomeConfig extends TerraConfig {
private final String biomeID;
@@ -27,7 +26,7 @@ public class AbstractBiomeConfig extends TerraConfig {
public AbstractBiomeConfig(File file, ConfigPack config) throws IOException, InvalidConfigurationException {
super(file, config);
load(file);
if(!contains("id")) throw new ConfigException("Abstract Biome ID unspecified!", "null");
if(! contains("id")) throw new ConfigException("Abstract Biome ID unspecified!", "null");
this.biomeID = getString("id");
equation = getString("noise-equation");

View File

@@ -14,6 +14,7 @@ import java.util.Map;
public class BiomeCarverConfig extends TerraConfigSection {
private final Map<CarverConfig, Integer> carvers = new HashMap<>();
public BiomeCarverConfig(TerraConfig parent) throws InvalidConfigurationException {
super(parent);
ConfigurationSection configurationSection = parent.getConfigurationSection("carving");

View File

@@ -43,7 +43,7 @@ public class BiomeConfig extends TerraConfig {
super(file, config);
load(file);
this.config = config;
if(!contains("id")) throw new ConfigException("Biome ID unspecified!", "null");
if(! contains("id")) throw new ConfigException("Biome ID unspecified!", "null");
this.biomeID = getString("id");
AbstractBiomeConfig abstractBiome = null;
@@ -76,7 +76,8 @@ public class BiomeConfig extends TerraConfig {
} else palette = new BiomePaletteConfig(this);
// Palette must not be null
if(palette.getPaletteMap() == null) throw new ConfigException("No Palette specified in biome or super biome.", getID());
if(palette.getPaletteMap() == null)
throw new ConfigException("No Palette specified in biome or super biome.", getID());
// Check if carving should be handled by super biome.
if(extending && abstractBiome.getCarving() != null && ! contains("carving")) {
@@ -103,7 +104,7 @@ public class BiomeConfig extends TerraConfig {
} else ore = new BiomeOreConfig(this);
// Get slab stuff
if(extending && abstractBiome.getSlabs() != null && !contains("slabs")) {
if(extending && abstractBiome.getSlabs() != null && ! contains("slabs")) {
slab = abstractBiome.getSlabs();
Debug.info("Using super slabs");
} else slab = new BiomeSlabConfig(this);
@@ -121,7 +122,8 @@ public class BiomeConfig extends TerraConfig {
} else snow = new BiomeSnowConfig(this);
//Make sure equation is non-null
if(eq == null || eq.equals("")) throw new ConfigException("Could not find noise equation! Biomes must include a noise equation, or extend an abstract biome with one.", getID());
if(eq == null || eq.equals(""))
throw new ConfigException("Could not find noise equation! Biomes must include a noise equation, or extend an abstract biome with one.", getID());
// Create decorator for this config.
UserDefinedDecorator dec = new UserDefinedDecorator(flora.getFlora(), tree.getTrees(), flora.getFloraChance(), tree.getTreeDensity());
@@ -129,7 +131,7 @@ public class BiomeConfig extends TerraConfig {
// Get Vanilla biome, throw exception if it is invalid/unspecified.
org.bukkit.block.Biome vanillaBiome;
try {
if(!contains("vanilla")) throw new ConfigException("Vanilla Biome unspecified!", getID());
if(! contains("vanilla")) throw new ConfigException("Vanilla Biome unspecified!", getID());
vanillaBiome = org.bukkit.block.Biome.valueOf(getString("vanilla"));
} catch(IllegalArgumentException e) {
throw new ConfigException("Invalid Vanilla biome: \"" + getString("vanilla") + "\"", getID());
@@ -138,7 +140,8 @@ public class BiomeConfig extends TerraConfig {
// Structure stuff
structures = new ArrayList<>();
List<String> st = new ArrayList<>();
if(abstractBiome != null && abstractBiome.getStructureConfigs() != null) st = abstractBiome.getStructureConfigs();
if(abstractBiome != null && abstractBiome.getStructureConfigs() != null)
st = abstractBiome.getStructureConfigs();
if(contains("structures")) st = getStringList("structures");
for(String s : st) {
try {
@@ -170,7 +173,7 @@ public class BiomeConfig extends TerraConfig {
}
public Range getFloraHeights(Flora f) {
return flora.getFloraHeights().computeIfAbsent(f, input -> new Range(-1, -1));
return flora.getFloraHeights().computeIfAbsent(f, input -> new Range(- 1, - 1));
}
@Override
@@ -199,7 +202,7 @@ public class BiomeConfig extends TerraConfig {
}
public Range getTreeRange(Tree t) {
return tree.getTreeHeights().getOrDefault(t, new Range(-1, -1));
return tree.getTreeHeights().getOrDefault(t, new Range(- 1, - 1));
}
public BiomeSnowConfig getSnow() {

View File

@@ -24,6 +24,7 @@ public class BiomeFloraConfig extends TerraConfigSection {
private int floraChance;
private boolean floraSimplex;
private FastNoiseLite floraNoise;
public BiomeFloraConfig(TerraConfig parent) throws InvalidConfigurationException {
super(parent);
ConfigurationSection cfg = parent.getConfigurationSection("flora.items");

View File

@@ -19,6 +19,7 @@ public class BiomeOceanConfig extends TerraConfigSection {
private final Palette<BlockData> ocean;
private final int seaLevel;
private static final Palette<BlockData> oceanDefault = new RandomPalette<BlockData>(new Random(0)).add(Material.WATER.createBlockData(), 1);
public BiomeOceanConfig(@NotNull TerraConfig parent) throws InvalidConfigurationException {
super(parent);
seaLevel = parent.getInt("ocean.level", 62);

View File

@@ -16,6 +16,7 @@ import java.util.Map;
public class BiomeOreConfig extends TerraConfigSection {
private final Map<OreConfig, Range> ores = new HashMap<>();
private final Map<OreConfig, Range> oreHeights = new HashMap<>();
public BiomeOreConfig(TerraConfig parent) throws InvalidConfigurationException {
super(parent);
ConfigurationSection c = parent.getConfigurationSection("ores");
@@ -25,8 +26,8 @@ public class BiomeOreConfig extends TerraConfigSection {
for(Map.Entry<String, Object> m : cfg.entrySet()) {
OreConfig ore = parent.getConfig().getOre(m.getKey());
if(ore == null) throw new NotFoundException("Ore", m.getKey(), parent.getID());
ores.put(ore, new Range(((ConfigurationSection) m.getValue()).getInt("min"), ((ConfigurationSection) m.getValue()).getInt("max")));
oreHeights.put(ore, new Range(((ConfigurationSection) m.getValue()).getInt("min-height"), ((ConfigurationSection) m.getValue()).getInt("max-height")));
ores.put(ore, new Range(((ConfigurationSection) m.getValue()).getInt("min"), ((ConfigurationSection) m.getValue()).getInt("max")));
oreHeights.put(ore, new Range(((ConfigurationSection) m.getValue()).getInt("min-height"), ((ConfigurationSection) m.getValue()).getInt("max-height")));
}
} catch(ClassCastException e) {
if(ConfigUtil.debug) e.printStackTrace();

View File

@@ -6,7 +6,6 @@ import com.dfsek.terra.config.exception.ConfigException;
import com.dfsek.terra.config.exception.NotFoundException;
import org.bukkit.Bukkit;
import org.bukkit.block.data.BlockData;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.InvalidConfigurationException;
import org.polydev.gaea.math.ProbabilityCollection;
import org.polydev.gaea.world.palette.Palette;
@@ -19,6 +18,7 @@ import java.util.TreeMap;
public class BiomePaletteConfig extends TerraConfigSection {
private TreeMap<Integer, Palette<BlockData>> paletteMap;
@SuppressWarnings("unchecked")
public BiomePaletteConfig(TerraConfig parent) throws InvalidConfigurationException {
super(parent);
@@ -34,8 +34,7 @@ public class BiomePaletteConfig extends TerraConfigSection {
} catch(IllegalArgumentException ex) {
throw new ConfigException("BlockData " + entry.getKey() + " is invalid! (Palettes)", parent.getID());
}
}
else {
} else {
try {
paletteMap.put((Integer) entry.getValue(), parent.getConfig().getPalette((String) entry.getKey()).getPalette());
} catch(NullPointerException ex) {

View File

@@ -23,6 +23,7 @@ public class BiomeSlabConfig extends TerraConfigSection {
private final Map<Material, Palette<BlockData>> slabs;
private final Map<Material, Palette<BlockData>> stairs;
private double slabThreshold;
public BiomeSlabConfig(@NotNull TerraConfig parent) throws InvalidConfigurationException {
super(parent);
slabThreshold = parent.getDouble("slabs.threshold", 0.1D);
@@ -31,6 +32,7 @@ public class BiomeSlabConfig extends TerraConfigSection {
stairs = getSlabPalettes(parent.getMapList("slabs.stair-palettes"));
} else stairs = new HashMap<>();
}
protected Map<Material, Palette<BlockData>> getSlabPalettes(List<Map<?, ?>> paletteConfigSection) throws InvalidConfigurationException {
Map<Material, Palette<BlockData>> paletteMap = new HashMap<>();
@@ -47,7 +49,8 @@ public class BiomeSlabConfig extends TerraConfigSection {
} else {
try {
Palette<BlockData> p = getParent().getConfig().getPalette((String) entry.getValue()).getPalette();
if(p.getSize() != 1) throw new InvalidConfigurationException("Slab palette must hold only one layer. Palette " + entry.getValue() + " is too large/small");
if(p.getSize() != 1)
throw new InvalidConfigurationException("Slab palette must hold only one layer. Palette " + entry.getValue() + " is too large/small");
paletteMap.put(Bukkit.createBlockData((String) entry.getKey()).getMaterial(), p);
} catch(NullPointerException ex) {
throw new NotFoundException("Slab Palette", (String) entry.getValue(), getParent().getConfig().getID());

View File

@@ -1,27 +1,19 @@
package com.dfsek.terra.config.genconfig.biome;
import com.dfsek.terra.Debug;
import com.dfsek.terra.config.TerraConfig;
import com.dfsek.terra.config.TerraConfigSection;
import com.dfsek.terra.config.base.ConfigUtil;
import com.dfsek.terra.config.exception.ConfigException;
import com.dfsek.terra.config.exception.NotFoundException;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.InvalidConfigurationException;
import org.jetbrains.annotations.NotNull;
import org.polydev.gaea.math.FastNoiseLite;
import org.polydev.gaea.math.ProbabilityCollection;
import org.polydev.gaea.math.Range;
import org.polydev.gaea.world.Flora;
import org.polydev.gaea.world.FloraType;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BiomeSnowConfig extends TerraConfigSection {
private final int[] snowHeights;
private boolean doSnow = false;
public BiomeSnowConfig(TerraConfig parent) throws InvalidConfigurationException {
super(parent);
snowHeights = new int[256];

View File

@@ -9,7 +9,6 @@ import org.polydev.gaea.math.ProbabilityCollection;
import org.polydev.gaea.math.Range;
import org.polydev.gaea.tree.Tree;
import org.polydev.gaea.tree.TreeType;
import org.polydev.gaea.world.Flora;
import java.util.HashMap;
import java.util.Map;
@@ -19,6 +18,7 @@ public class BiomeTreeConfig extends TerraConfigSection {
private final ProbabilityCollection<Tree> trees = new ProbabilityCollection<>();
private final Map<Tree, Range> treeHeights = new HashMap<>();
private int treeDensity;
public BiomeTreeConfig(TerraConfig parent) throws InvalidConfigurationException {
super(parent);
ConfigurationSection c = parent.getConfigurationSection("trees.items");

View File

@@ -19,6 +19,7 @@ import static org.polydev.gaea.util.JarUtil.copyResourcesToDirectory;
public final class LangUtil {
private static Language language;
private static Logger logger;
public static void load(String langID, JavaPlugin main) {
logger = main.getLogger();
File file = new File(main.getDataFolder(), "lang");
@@ -45,6 +46,7 @@ public final class LangUtil {
public static void log(String messageID, Level level, String... args) {
language.getMessage(messageID).log(logger, level, args);
}
public static void send(String messageID, CommandSender sender, String... args) {
language.getMessage(messageID).send(sender, args);
}

View File

@@ -1,8 +1,8 @@
package com.dfsek.terra.debug.gui;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.generation.TerraChunkGenerator;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.generation.TerraChunkGenerator;
import com.dfsek.terra.image.ImageLoader;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
@@ -18,6 +18,7 @@ public class DebugFrame extends JFrame implements ActionListener {
private final int x;
private final int z;
private final BufferedImage img;
public DebugFrame(BufferedImage image, String s) {
super(s);
this.x = image.getWidth();

View File

@@ -7,9 +7,11 @@ import java.awt.image.BufferedImage;
public class DebugGUI extends Thread {
private final BufferedImage img;
public DebugGUI(BufferedImage img) {
this.img = img;
}
@Override
public void run() {
DebugFrame frame = new DebugFrame(img, "Image2Map Debug GUI");

View File

@@ -9,7 +9,7 @@ public class OreVeinGenerateEvent extends TerraWorldEvent implements Cancellable
private boolean cancelled;
private OreConfig config;
public OreVeinGenerateEvent(TerraWorld tw, Location l, OreConfig config) {
public OreVeinGenerateEvent(TerraWorld tw, Location l, OreConfig config) {
super(tw, l);
this.config = config;
}

View File

@@ -1,7 +1,6 @@
package com.dfsek.terra.event;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.config.genconfig.TreeConfig;
import org.bukkit.Location;
import org.bukkit.event.Cancellable;
import org.polydev.gaea.tree.Tree;

View File

@@ -68,7 +68,7 @@ public class TerraChunkGenerator extends GaeaChunkGenerator {
StructureSpawnRequirement.putNoise(world, fastNoise); // Assign noise to world to be used for structures.
ChunkData chunk = createChunkData(world);
TerraWorld tw = TerraWorld.getWorld(world);
if(!tw.isSafe()) return chunk;
if(! tw.isSafe()) return chunk;
ConfigPack config = tw.getConfig();
int xOrig = (chunkX << 4);
int zOrig = (chunkZ << 4);
@@ -77,22 +77,22 @@ public class TerraChunkGenerator extends GaeaChunkGenerator {
int paletteLevel = 0;
int cx = xOrig + x;
int cz = zOrig + z;
Biome orig = getBiomeGrid(world).getBiome(xOrig+x, zOrig+z, GenerationPhase.BASE);
Biome b = getBiomeGrid(world).getBiome(xOrig+x, zOrig+z, GenerationPhase.PALETTE_APPLY);
Biome orig = getBiomeGrid(world).getBiome(xOrig + x, zOrig + z, GenerationPhase.BASE);
Biome b = getBiomeGrid(world).getBiome(xOrig + x, zOrig + z, GenerationPhase.PALETTE_APPLY);
BiomeConfig c = config.getBiome((UserDefinedBiome) b);
BiomeSlabConfig slab = c.getSlabs();
int sea = config.getBiome((UserDefinedBiome) orig).getOcean().getSeaLevel();
Palette<BlockData> seaPalette = c.getOcean().getOcean();
for(int y = world.getMaxHeight()-1; y >= 0; y--) {
for(int y = world.getMaxHeight() - 1; y >= 0; y--) {
if(super.getInterpolatedNoise(x, y, z) > 0) {
BlockData data = b.getGenerator().getPalette(y).get(paletteLevel, cx, cz);
chunk.setBlock(x, y, z, data);
if(paletteLevel == 0 && c.getSlabs() != null && y < 255) {
prepareBlockPart(data, chunk.getBlockData(x, y+1, z), chunk, new Vector(x, y+1, z), slab.getSlabs(), slab.getStairs(), slab.getSlabThreshold());
prepareBlockPart(data, chunk.getBlockData(x, y + 1, z), chunk, new Vector(x, y + 1, z), slab.getSlabs(), slab.getStairs(), slab.getSlabThreshold());
}
paletteLevel++;
} else if(y <= sea) {
chunk.setBlock(x, y, z, seaPalette.get(sea-y, x+xOrig, z+zOrig));
chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, z + zOrig));
paletteLevel = 0;
} else paletteLevel = 0;
}
@@ -159,7 +159,7 @@ public class TerraChunkGenerator extends GaeaChunkGenerator {
}
public static synchronized void fixChunk(Chunk c) {
if(!(c.getWorld().getGenerator() instanceof TerraChunkGenerator)) throw new IllegalArgumentException();
if(! (c.getWorld().getGenerator() instanceof TerraChunkGenerator)) throw new IllegalArgumentException();
popMap.get(c.getWorld()).checkNeighbors(c.getX(), c.getZ(), c.getWorld());
}
@@ -167,6 +167,7 @@ public class TerraChunkGenerator extends GaeaChunkGenerator {
public int getNoiseOctaves(World world) {
return octaves;
}
@Override
public float getNoiseFrequency(World world) {
return frequency;

View File

@@ -51,6 +51,7 @@ public class UserDefinedGenerator extends Generator {
this.noiseExp = p.parse(equation, s);
this.preventSmooth = preventSmooth;
}
/**
* Gets the 2D noise at a pair of coordinates using the provided FastNoiseLite instance.
*

View File

@@ -8,18 +8,17 @@ import com.dfsek.terra.debug.gui.DebugGUI;
import org.bukkit.World;
import org.polydev.gaea.biome.NormalizationUtil;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ImageLoader {
private final BufferedImage image;
private final Align align;
double inverseRoot2 = 0.7071067811865475;
public ImageLoader(File file, Align align) throws IOException {
image = ImageIO.read(file);
this.align = align;
@@ -30,21 +29,27 @@ public class ImageLoader {
int rgb;
rgb = align.getRGB(image, x, y);
switch(channel) {
case RED: return rgb >> 16 & 0xff;
case GREEN: return rgb >> 8 & 0xff;
case BLUE: return rgb & 0xff;
case ALPHA: return rgb >> 32 & 0xff;
default: throw new IllegalArgumentException();
case RED:
return rgb >> 16 & 0xff;
case GREEN:
return rgb >> 8 & 0xff;
case BLUE:
return rgb & 0xff;
case ALPHA:
return rgb >> 32 & 0xff;
default:
throw new IllegalArgumentException();
}
}
public static void debugWorld(boolean genStep, World w) {
if(!ConfigUtil.debug) return;
if(! ConfigUtil.debug) return;
BufferedImage newImg = new WorldImageGenerator(w, 1024, 1024).drawWorld(0, 0).getDraw();
if(genStep) newImg = redrawStepped(newImg, w, Align.CENTER);
DebugGUI debugGUI = new DebugGUI(newImg);
debugGUI.start();
}
private static BufferedImage redrawStepped(BufferedImage original, World w, Align align) {
BufferedImage newImg = copyImage(original);
TerraBiomeGrid tb = TerraWorld.getWorld(w).getGrid();
@@ -52,7 +57,8 @@ public class ImageLoader {
for(int x = 0; x < newImg.getWidth(); x++) {
for(int y = 0; y < newImg.getHeight(); y++) {
float[] noise;
if(align.equals(Align.CENTER)) noise = tb.getGrid(x - original.getWidth()/2, y - original.getHeight()/2).getRawNoise(x - original.getWidth()/2, y - original.getHeight()/2);
if(align.equals(Align.CENTER))
noise = tb.getGrid(x - original.getWidth() / 2, y - original.getHeight() / 2).getRawNoise(x - original.getWidth() / 2, y - original.getHeight() / 2);
else noise = tb.getGrid(x, y).getRawNoise(x, y);
newImg.setRGB(x, y, new Color((int) (NormalizationUtil.normalize(noise[0], tb.getGrid(x, y).getSizeX(), 4) * ((double) 255 / tb.getGrid(x, y).getSizeX())),
(int) (NormalizationUtil.normalize(noise[1], tb.getGrid(x, y).getSizeZ(), 4) * ((double) 255 / tb.getGrid(x, y).getSizeZ())),
@@ -64,7 +70,7 @@ public class ImageLoader {
}
public void debug(boolean genStep, World w) {
if(!ConfigUtil.debug) return;
if(! ConfigUtil.debug) return;
BufferedImage newImg = copyImage(image);
if(genStep) {
newImg = redrawStepped(image, w, align);
@@ -74,8 +80,9 @@ public class ImageLoader {
}
public double getNoiseVal(int x, int y, Channel channel) {
return ((double) (getChannel(x, y, channel) - 128)/128)*inverseRoot2;
return ((double) (getChannel(x, y, channel) - 128) / 128) * inverseRoot2;
}
private static BufferedImage copyImage(BufferedImage source) {
BufferedImage b = new BufferedImage(source.getWidth(), source.getHeight(), source.getType());
Graphics g = b.getGraphics();
@@ -91,11 +98,12 @@ public class ImageLoader {
public enum Channel {
RED, GREEN, BLUE, ALPHA
}
public enum Align {
CENTER {
@Override
public int getRGB(BufferedImage image, int x, int y) {
return Align.getRGBNoAlign(image, x-(image.getWidth()/2), y-(image.getHeight()/2));
return Align.getRGBNoAlign(image, x - (image.getWidth() / 2), y - (image.getHeight() / 2));
}
},
NONE {
@@ -104,7 +112,9 @@ public class ImageLoader {
return image.getRGB(Math.floorMod(x, image.getWidth()), Math.floorMod(y, image.getHeight()));
}
};
public abstract int getRGB(BufferedImage image, int x, int y);
private static int getRGBNoAlign(BufferedImage image, int x, int y) {
return image.getRGB(Math.floorMod(x, image.getWidth()), Math.floorMod(y, image.getHeight()));
}

View File

@@ -1,9 +1,7 @@
package com.dfsek.terra.image;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.biome.BiomeZone;
import com.dfsek.terra.biome.TerraBiomeGrid;
import com.dfsek.terra.config.base.WorldConfig;
import org.bukkit.World;
import org.polydev.gaea.biome.NormalizationUtil;
@@ -16,17 +14,19 @@ import java.io.IOException;
public class WorldImageGenerator {
private final World w;
private final BufferedImage draw;
public WorldImageGenerator(World w, int width, int height) {
draw = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
this.w = w;
}
public WorldImageGenerator drawWorld(int centerX, int centerZ) {
TerraWorld tw = TerraWorld.getWorld(w);
TerraBiomeGrid tb = tw.getGrid();
int imY = 0;
for(int y = centerZ - (draw.getHeight()/2); y < centerZ + (draw.getHeight()/2); y++) {
for(int y = centerZ - (draw.getHeight() / 2); y < centerZ + (draw.getHeight() / 2); y++) {
int imX = 0;
for(int x = centerX - (draw.getWidth()/2); x < centerX + (draw.getWidth()/2); x++) {
for(int x = centerX - (draw.getWidth() / 2); x < centerX + (draw.getWidth() / 2); x++) {
int zone = NormalizationUtil.normalize(tw.getZone().getRawNoise(x, y), 256, 4);
float[] noise = tb.getGrid(x, y).getRawNoise(x, y);
Color c = new Color(NormalizationUtil.normalize(noise[0], 256, 4), NormalizationUtil.normalize(noise[1], 256, 4), zone);

View File

@@ -8,6 +8,7 @@ import java.util.List;
public class NoiseFunction3 implements Function {
private FastNoiseLite gen;
@Override
public int getNumberOfArguments() {
return 3;

View File

@@ -2,11 +2,9 @@ package com.dfsek.terra.population;
import com.dfsek.terra.TerraProfiler;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.carving.SimplexCarver;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.base.ConfigUtil;
import com.dfsek.terra.config.genconfig.CarverConfig;
import com.dfsek.terra.structure.StructureSpawnRequirement;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.Material;
@@ -29,12 +27,13 @@ import java.util.Set;
public class CavePopulator extends BlockPopulator {
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();
@Override
public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) {
if(ConfigUtil.masterDisableCaves) return;
try(ProfileFuture ignored = TerraProfiler.fromWorld(world).measure("CaveTime")) {
TerraWorld tw = TerraWorld.getWorld(world);
if(!tw.isSafe()) return;
if(! tw.isSafe()) return;
ConfigPack config = tw.getConfig();
for(CarverConfig c : config.getCarvers().values()) {
@@ -75,7 +74,8 @@ public class CavePopulator extends BlockPopulator {
if(c.getShiftedBlocks().get(shiftCandidate.get(l)).contains(mut.getBlock().getType())) {
mut.getBlock().setBlockData(shiftStorage.computeIfAbsent(shiftCandidate.get(l), Material::createBlockData), false);
}
} catch(NullPointerException ignore) {}
} catch(NullPointerException ignore) {
}
}
try(ProfileFuture ignore = TerraProfiler.fromWorld(world).measure("CaveBlockUpdate")) {
for(Block b : updateNeeded) {
@@ -100,6 +100,7 @@ public class CavePopulator extends BlockPopulator {
}
}
private boolean borderingOcean(Block b) {
return b.getRelative(BlockFace.UP).getType().equals(Material.WATER) || b.getType().equals(Material.LAVA);
}

View File

@@ -9,14 +9,12 @@ import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.genconfig.biome.BiomeConfig;
import com.dfsek.terra.config.genconfig.biome.BiomeFloraConfig;
import com.dfsek.terra.event.TreeGenerateEvent;
import com.dfsek.terra.generation.UserDefinedDecorator;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.jetbrains.annotations.NotNull;
import org.polydev.gaea.biome.Biome;
import org.polydev.gaea.generation.GenerationPhase;
import org.polydev.gaea.math.Range;
import org.polydev.gaea.population.GaeaBlockPopulator;
@@ -34,9 +32,9 @@ import java.util.Random;
public class FloraPopulator extends GaeaBlockPopulator {
@Override
public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) {
try (ProfileFuture ignored = TerraProfiler.fromWorld(world).measure("FloraTime")) {
try(ProfileFuture ignored = TerraProfiler.fromWorld(world).measure("FloraTime")) {
TerraWorld tw = TerraWorld.getWorld(world);
if(!tw.isSafe()) return;
if(! tw.isSafe()) return;
int originX = chunk.getX() << 4;
int originZ = chunk.getZ() << 4;
TerraBiomeGrid grid = tw.getGrid();
@@ -58,40 +56,46 @@ public class FloraPopulator extends GaeaBlockPopulator {
BiomeFloraConfig f = c.getFlora();
for(int i = 0; i < f.getFloraAttempts(); i++) {
Flora item;
if(f.isFloraSimplex()) item = biome.getDecorator().getFlora().get(f.getFloraNoise(), originX + x, originZ + z);
if(f.isFloraSimplex())
item = biome.getDecorator().getFlora().get(f.getFloraNoise(), originX + x, originZ + z);
else item = biome.getDecorator().getFlora().get(random);
for(Block highest : item.getValidSpawnsAt(chunk, x, z, c.getFloraHeights(item))) {
if(random.nextInt(100) < biome.getDecorator().getFloraChance())
item.plant(highest.getLocation());
}
}
} catch(NullPointerException ignore) {}
} catch(NullPointerException ignore) {
}
}
}
}
}
private static boolean doTrees(@NotNull UserDefinedBiome biome, TerraWorld world, @NotNull Random random, @NotNull Chunk chunk, int x, int z) {
private static boolean doTrees(@NotNull UserDefinedBiome biome, TerraWorld world, @NotNull Random random, @NotNull Chunk chunk, int x, int z) {
for(Block block : getValidTreeSpawnsAt(chunk, x, z, new Range(0, 254))) {
Tree tree = biome.getDecorator().getTrees().get(random);
Range range = world.getConfig().getBiome(biome).getTreeRange(tree);
if(!range.isInRange(block.getY())) continue;
if(! range.isInRange(block.getY())) continue;
try {
Location l = block.getLocation();
TreeGenerateEvent event = new TreeGenerateEvent(world, l, tree);
Bukkit.getPluginManager().callEvent(event);
if(!event.isCancelled()) tree.plant(l, random, Terra.getInstance());
} catch(NullPointerException ignore) {}
if(! event.isCancelled()) tree.plant(l, random, Terra.getInstance());
} catch(NullPointerException ignore) {
}
}
return false;
}
private static int offset(Random r, int i) {
return Math.min(Math.max(i + r.nextInt(3)-1, 0), 15);
return Math.min(Math.max(i + r.nextInt(3) - 1, 0), 15);
}
public static List<Block> getValidTreeSpawnsAt(Chunk chunk, int x, int z, Range check) {
List<Block> blocks = new ArrayList<>();
for(int y : check) {
if(chunk.getBlock(x, y, z).getType().isSolid() && chunk.getBlock(x, y + 1, z).getType().isAir()) {
blocks.add(chunk.getBlock(x, y+1, z));
blocks.add(chunk.getBlock(x, y + 1, z));
}
}
return blocks;

View File

@@ -1,20 +1,20 @@
package com.dfsek.terra.population;
import com.dfsek.terra.TerraProfiler;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.genconfig.OreConfig;
import com.dfsek.terra.config.genconfig.biome.BiomeOreConfig;
import com.dfsek.terra.event.OreVeinGenerateEvent;
import org.bukkit.Bukkit;
import org.bukkit.util.Vector;
import org.polydev.gaea.math.Range;
import com.dfsek.terra.TerraProfiler;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.config.genconfig.OreConfig;
import org.bukkit.Chunk;
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;
import org.polydev.gaea.math.Range;
import org.polydev.gaea.population.GaeaBlockPopulator;
import org.polydev.gaea.profiler.ProfileFuture;
@@ -24,19 +24,19 @@ import java.util.Random;
public class OrePopulator extends GaeaBlockPopulator {
@Override
public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) {
try (ProfileFuture ignored = TerraProfiler.fromWorld(world).measure("OreTime")) {
try(ProfileFuture ignored = TerraProfiler.fromWorld(world).measure("OreTime")) {
TerraWorld tw = TerraWorld.getWorld(world);
if(!tw.isSafe()) return;
if(! tw.isSafe()) return;
ConfigPack config = tw.getConfig();
Biome b = TerraWorld.getWorld(world).getGrid().getBiome((chunk.getX() << 4)+8, (chunk.getZ() << 4) + 8, GenerationPhase.POPULATE);
Biome b = TerraWorld.getWorld(world).getGrid().getBiome((chunk.getX() << 4) + 8, (chunk.getZ() << 4) + 8, GenerationPhase.POPULATE);
BiomeOreConfig ores = config.getBiome((UserDefinedBiome) b).getOres();
for(Map.Entry<OreConfig, Range> e : ores.getOres().entrySet()) {
int num = e.getValue().get(random);
OreConfig ore = e.getKey();
int edgeOffset = ore.getChunkEdgeOffset();
for(int i = 0; i < num; i++) {
int x = random.nextInt(16 - edgeOffset*2) + edgeOffset;
int z = random.nextInt(16 - edgeOffset*2) + edgeOffset;
int x = random.nextInt(16 - edgeOffset * 2) + edgeOffset;
int z = random.nextInt(16 - edgeOffset * 2) + edgeOffset;
int y = ores.getOreHeights().get(ore).get(random);
Vector v = new Vector(x, y, z);

View File

@@ -4,7 +4,6 @@ import com.dfsek.terra.TerraProfiler;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.biome.TerraBiomeGrid;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.config.base.ConfigPack;
import com.dfsek.terra.config.base.ConfigUtil;
import com.dfsek.terra.config.genconfig.biome.BiomeConfig;
import com.dfsek.terra.util.DataUtil;
@@ -13,7 +12,6 @@ import org.bukkit.Chunk;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.block.data.BlockData;
import org.jetbrains.annotations.NotNull;
import org.polydev.gaea.generation.GenerationPhase;
import org.polydev.gaea.population.GaeaBlockPopulator;
@@ -25,6 +23,7 @@ import java.util.Set;
public class SnowPopulator extends GaeaBlockPopulator {
private static final Set<Material> blacklistSpawn = new HashSet<>();
static {
for(Material m : Material.values()) {
String name = m.toString().toLowerCase();
@@ -44,9 +43,10 @@ public class SnowPopulator extends GaeaBlockPopulator {
if(ConfigUtil.debug)
Bukkit.getLogger().info("Added " + blacklistSpawn.size() + " materials to snow blacklist");
}
@Override
public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) {
try (ProfileFuture ignored = TerraProfiler.fromWorld(world).measure("SnowTime")) {
try(ProfileFuture ignored = TerraProfiler.fromWorld(world).measure("SnowTime")) {
int origX = chunk.getX() << 4;
int origZ = chunk.getZ() << 4;
TerraWorld w = TerraWorld.getWorld(world);
@@ -55,7 +55,7 @@ public class SnowPopulator extends GaeaBlockPopulator {
for(int x = 0; x < 16; x++) {
for(int z = 0; z < 16; z++) {
BiomeConfig biome = w.getConfig().getBiome((UserDefinedBiome) g.getBiome(origX + x, origZ + z, GenerationPhase.PALETTE_APPLY));
if(!biome.getSnow().doSnow()) continue;
if(! biome.getSnow().doSnow()) continue;
int y;
Block b = null;
for(y = 254; y > 0; y--) {

View File

@@ -30,17 +30,18 @@ public class StructurePopulator extends BlockPopulator {
int cx = (chunk.getX() << 4);
int cz = (chunk.getZ() << 4);
TerraWorld tw = TerraWorld.getWorld(world);
if(!tw.isSafe()) return;
if(! tw.isSafe()) return;
TerraBiomeGrid grid = tw.getGrid();
ConfigPack config = tw.getConfig();
structure: for(StructureConfig conf : config.getAllStructures()) {
structure:
for(StructureConfig conf : config.getAllStructures()) {
Location spawn = conf.getSpawn().getNearestSpawn(cx + 8, cz + 8, world.getSeed()).toLocation(world);
if(!config.getBiome((UserDefinedBiome) grid.getBiome(spawn)).getStructures().contains(conf)) continue;
if(! config.getBiome((UserDefinedBiome) grid.getBiome(spawn)).getStructures().contains(conf)) continue;
Random r2 = new Random(spawn.hashCode());
Structure struc = conf.getStructure(r2);
Structure.Rotation rotation = Structure.Rotation.fromDegrees(r2.nextInt(4) * 90);
for(int y = conf.getSearchStart().get(r2); y > 0; y--) {
if(!conf.getBound().isInRange(y)) continue structure;
if(! conf.getBound().isInRange(y)) continue structure;
spawn.setY(y);
if(! struc.checkSpawns(spawn, rotation)) continue;
double horizontal = struc.getStructureInfo().getMaxHorizontal();
@@ -73,6 +74,7 @@ public class StructurePopulator extends BlockPopulator {
}
}
}
public enum SearchType {
UP, DOWN
}

View File

@@ -13,6 +13,7 @@ import java.util.Random;
public class GridSpawn {
private final int separation;
private final int width;
public GridSpawn(int width, int separation) {
this.separation = separation;
this.width = width;
@@ -20,17 +21,18 @@ public class GridSpawn {
/**
* Get nearest spawn point
* @param x X coordinate
* @param z Z coordinate
*
* @param x X coordinate
* @param z Z coordinate
* @param seed Seed for RNG
* @return Vector representing nearest spawnpoint
*/
public Vector getNearestSpawn(int x, int z, long seed) {
int structureChunkX = x / (width + 2*separation);
int structureChunkZ = z / (width + 2*separation);
int structureChunkX = x / (width + 2 * separation);
int structureChunkZ = z / (width + 2 * separation);
List<Vector> zones = new ArrayList<>();
for(int xi = structureChunkX-1; xi <= structureChunkX+1; xi++) {
for(int zi = structureChunkZ-1; zi <= structureChunkZ+1; zi++) {
for(int xi = structureChunkX - 1; xi <= structureChunkX + 1; xi++) {
for(int zi = structureChunkZ - 1; zi <= structureChunkZ + 1; zi++) {
zones.add(getChunkSpawn(xi, zi, seed));
}
}
@@ -44,17 +46,18 @@ public class GridSpawn {
/**
* Get the X/Z coordinates of the spawn point in the nearest Chunk (not Minecraft chunk)
*
* @param structureChunkX Chunk X coordinate
* @param structureChunkZ Chunk Z coordinate
* @param seed Seed for RNG
* @param seed Seed for RNG
* @return Vector representing spawnpoint
*/
public Vector getChunkSpawn(int structureChunkX, int structureChunkZ, long seed) {
Random r = new Random(MathUtil.getCarverChunkSeed(structureChunkX, structureChunkZ, seed));
int offsetX = r.nextInt(width);
int offsetZ = r.nextInt(width);
int sx = structureChunkX * (width + 2*separation) + offsetX;
int sz = structureChunkZ * (width + 2*separation) + offsetZ;
int sx = structureChunkX * (width + 2 * separation) + offsetX;
int sz = structureChunkZ * (width + 2 * separation) + offsetZ;
return new Vector(sx, 0, sz);
}

View File

@@ -1,7 +1,5 @@
package com.dfsek.terra.procgen.math;
import org.bukkit.util.Vector;
/**
* oh yeah
*/
@@ -11,6 +9,7 @@ public class Vector2 implements Cloneable {
/**
* Create a vector with a given X and Z component
*
* @param x X component
* @param z Z component
*/
@@ -21,6 +20,7 @@ public class Vector2 implements Cloneable {
/**
* Get X component
*
* @return X component
*/
public double getX() {
@@ -29,6 +29,7 @@ public class Vector2 implements Cloneable {
/**
* Get Z component
*
* @return Z component
*/
public double getZ() {
@@ -37,36 +38,40 @@ public class Vector2 implements Cloneable {
/**
* Multiply X and Z components by a value.
*
* @param m Value to multiply
* @return Mutated vector, for chaining.
*/
public Vector2 multiply(double m) {
x*=m;
z*=m;
x *= m;
z *= m;
return this;
}
/**
* Divide X and Z components by a value.
*
* @param d Divisor
* @return Mutated vector, for chaining.
*/
public Vector2 divide(double d) {
x/=d;
z/=d;
x /= d;
z /= d;
return this;
}
/**
* Get the squared length of this Vector
*
* @return squared length
*/
public double lengthSquared() {
return x*x+z*z;
return x * x + z * z;
}
/**
* Get the length of this Vector
*
* @return length
*/
public double length() {
@@ -75,28 +80,31 @@ public class Vector2 implements Cloneable {
/**
* Add this vector to another.
*
* @param other Vector to add
* @return Mutated vector, for chaining.
*/
public Vector2 add(Vector2 other) {
x+=other.x;
z+=other.z;
x += other.x;
z += other.z;
return this;
}
/**
* Subtract a vector from this vector,
*
* @param other Vector to subtract
* @return Mutated vector, for chaining.
*/
public Vector2 subtract(Vector2 other) {
x-=other.x;
z-=other.z;
x -= other.x;
z -= other.z;
return this;
}
/**
* Normalize this vector to length 1
*
* @return Mutated vector, for chaining.
*/
public Vector2 normalize() {
@@ -106,6 +114,7 @@ public class Vector2 implements Cloneable {
/**
* Get the distance from this vector to another.
*
* @param other Another vector
* @return Distance between vectors
*/
@@ -115,6 +124,7 @@ public class Vector2 implements Cloneable {
/**
* Get the squared distance between 2 vectors.
*
* @param other Another vector
* @return Squared distance
*/
@@ -126,7 +136,7 @@ public class Vector2 implements Cloneable {
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Vector2)) {
if(! (obj instanceof Vector2)) {
return false;
}
Vector2 other = (Vector2) obj;
@@ -150,7 +160,7 @@ public class Vector2 implements Cloneable {
public Vector2 clone() {
try {
return (Vector2) super.clone();
} catch (CloneNotSupportedException e) {
} catch(CloneNotSupportedException e) {
throw new Error(e);
}
}

View File

@@ -2,6 +2,6 @@ package com.dfsek.terra.procgen.pixel;
public class Distribution {
public Distribution(Rectangle bound, int numPoints, double minRad) {
}
}

View File

@@ -8,10 +8,13 @@ import java.util.Set;
public class Rectangle extends Polygon {
private Vector2 min;
private Vector2 max;
public Rectangle(Vector2 min, Vector2 max) {
this.max = new Vector2(Math.min(min.getX(), max.getX()), Math.min(min.getZ(), max.getZ()));
this.min = new Vector2(Math.max(min.getX(), max.getX()), Math.max(min.getZ(), max.getZ()));;
this.min = new Vector2(Math.max(min.getX(), max.getX()), Math.max(min.getZ(), max.getZ()));
;
}
public Rectangle(Vector2 center, double xRadius, double zRadius) {
Vector2 rad = new Vector2(xRadius, zRadius);
this.min = center.clone().subtract(rad);

View File

@@ -1,16 +1,15 @@
package com.dfsek.terra.procgen.voxel;
import org.bukkit.block.Block;
import org.bukkit.util.Vector;
import org.polydev.gaea.math.FastNoiseLite;
public class DeformedSphere extends VoxelGeometry {
public DeformedSphere(Vector start, int rad, double deform, FastNoiseLite noise) {
for(int x = -rad; x <= rad; x++) {
for(int y = -rad; y <= rad; y++) {
for(int z = -rad; z <= rad; z++) {
for(int x = - rad; x <= rad; x++) {
for(int y = - rad; y <= rad; y++) {
for(int z = - rad; z <= rad; z++) {
Vector c = new Vector(x, y, z);
if(c.length() < (rad + 0.5) * ((noise.getNoise(x, y, z)+1)*deform)) {
if(c.length() < (rad + 0.5) * ((noise.getNoise(x, y, z) + 1) * deform)) {
addVector(c.add(start));
}
}

View File

@@ -1,13 +1,12 @@
package com.dfsek.terra.procgen.voxel;
import org.bukkit.util.Vector;
import org.polydev.gaea.math.FastNoiseLite;
public class Sphere extends VoxelGeometry {
public Sphere(Vector start, int rad) {
for(int x = -rad; x <= rad; x++) {
for(int y = -rad; y <= rad; y++) {
for(int z = -rad; z <= rad; z++) {
for(int x = - rad; x <= rad; x++) {
for(int y = - rad; y <= rad; y++) {
for(int z = - rad; z <= rad; z++) {
Vector c = new Vector(x, y, z);
if(c.length() < rad + 0.5) {
addVector(c.add(start));

View File

@@ -19,7 +19,9 @@ public abstract class VoxelGeometry {
public void merge(VoxelGeometry other) {
geometry.addAll(other.geometry);
}
public static VoxelGeometry getBlank() {
return new VoxelGeometry() {};
return new VoxelGeometry() {
};
}
}

View File

@@ -5,9 +5,10 @@ import org.jetbrains.annotations.Nullable;
public class InitializationException extends Exception {
private final Location worldLoc;
public InitializationException(String message, @Nullable Location worldLoc) {
super(message);
this.worldLoc = worldLoc == null ? null :worldLoc.clone();
this.worldLoc = worldLoc == null ? null : worldLoc.clone();
}
@Override

View File

@@ -2,7 +2,6 @@ package com.dfsek.terra.structure;
import com.dfsek.terra.Debug;
import com.dfsek.terra.procgen.math.Vector2;
import com.dfsek.terra.util.structure.RotationUtil;
import org.bukkit.Bukkit;
import org.bukkit.Chunk;
import org.bukkit.Location;
@@ -10,7 +9,6 @@ import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.block.Container;
import org.bukkit.block.Sign;
import org.bukkit.block.data.BlockData;
import org.bukkit.block.data.Directional;
@@ -21,7 +19,6 @@ import org.bukkit.block.data.Rotatable;
import org.bukkit.block.data.type.RedstoneWire;
import org.bukkit.inventory.BlockInventoryHolder;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.polydev.gaea.math.Range;
import java.io.File;
@@ -32,10 +29,8 @@ import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.UUID;
@@ -44,7 +39,7 @@ import java.util.function.Consumer;
import static com.dfsek.terra.util.structure.RotationUtil.*;
public class Structure implements Serializable {
public static final long serialVersionUID = -6664585217063842035L;
public static final long serialVersionUID = - 6664585217063842035L;
private final StructureContainedBlock[][][] structure;
private final StructureInfo structureInfo;
private final String id;
@@ -62,16 +57,17 @@ public class Structure implements Serializable {
}
public Structure(@NotNull Location l1, @NotNull Location l2, @NotNull String id) throws InitializationException {
int centerX = -1, centerZ = -1;
int centerX = - 1, centerZ = - 1;
this.id = id;
this.uuid = UUID.randomUUID();
this.spawns = new HashSet<>();
this.inventories = new HashSet<>();
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++) {
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++) {
Block b = Objects.requireNonNull(l1.getWorld()).getBlockAt(l1.clone().add(x, y, z));
BlockState state = b.getState();
BlockData d = b.getBlockData();
@@ -121,17 +117,18 @@ public class Structure implements Serializable {
if(state instanceof BlockInventoryHolder) {
inventories.add(new StructureContainedInventory(((BlockInventoryHolder) state).getInventory(), block));
}
if(!requirement.equals(StructureSpawnRequirement.BLANK)) spawns.add(block);
if(! requirement.equals(StructureSpawnRequirement.BLANK)) spawns.add(block);
structure[x][z][y] = block;
}
}
}
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));
structureInfo = new StructureInfo(l2.getBlockX() - l1.getBlockX() + 1, l2.getBlockY() - l1.getBlockY() + 1, l2.getBlockZ() - l1.getBlockZ() + 1, new Vector2(centerX, centerZ));
}
/**
* Get GaeaStructureInfo object
*
* @return Structure Info
*/
@NotNull
@@ -141,8 +138,9 @@ public class Structure implements Serializable {
/**
* Paste the structure at a Location, ignoring chunk boundaries.
*
* @param origin Origin location
* @param r Rotation
* @param r Rotation
*/
public void paste(@NotNull Location origin, Rotation r) {
Range xRange = getRange(Axis.X, r);
@@ -152,8 +150,9 @@ public class Structure implements Serializable {
public boolean checkSpawns(Location origin, Rotation r) {
for(StructureContainedBlock b : spawns) {
Vector2 rot = getRotatedCoords(new Vector2(b.getX()-structureInfo.getCenterX(), b.getZ()-structureInfo.getCenterZ()), r);
if(!b.getRequirement().matches(origin.getWorld(), (int) rot.getX()+origin.getBlockX(), origin.getBlockY()+b.getY(), (int) rot.getZ()+origin.getBlockZ())) return false;
Vector2 rot = getRotatedCoords(new Vector2(b.getX() - structureInfo.getCenterX(), b.getZ() - structureInfo.getCenterZ()), r);
if(! b.getRequirement().matches(origin.getWorld(), (int) rot.getX() + origin.getBlockX(), origin.getBlockY() + b.getY(), (int) rot.getZ() + origin.getBlockZ()))
return false;
}
return true;
}
@@ -164,15 +163,16 @@ public class Structure implements Serializable {
/**
* Paste structure at an origin location, confined to a single chunk.
*
* @param origin Origin location
* @param chunk Chunk to confine pasting to
* @param r Rotation
* @param chunk Chunk to confine pasting to
* @param r Rotation
*/
public void paste(Location origin, Chunk chunk, Rotation r) {
int xOr = (chunk.getX() << 4);
int zOr = (chunk.getZ() << 4);
Range intersectX = new Range(xOr, xOr+16).sub(origin.getBlockX() - structureInfo.getCenterX());
Range intersectZ = new Range(zOr, zOr+16).sub(origin.getBlockZ() - structureInfo.getCenterZ());
Range intersectX = new Range(xOr, xOr + 16).sub(origin.getBlockX() - structureInfo.getCenterX());
Range intersectZ = new Range(zOr, zOr + 16).sub(origin.getBlockZ() - structureInfo.getCenterZ());
if(intersectX == null || intersectZ == null) return;
executeForBlocksInRange(intersectX, getRange(Axis.Y, r), intersectZ, block -> pasteBlock(block, origin, r), r);
Debug.info(intersectX.toString() + " : " + intersectZ.toString());
@@ -180,17 +180,19 @@ public class Structure implements Serializable {
/**
* Paste a single StructureDefinedBlock at an origin location, offset by its coordinates.
* @param block The block to paste
*
* @param block The block to paste
* @param origin The origin location
* @param r The rotation of the structure
* @param r The rotation of the structure
*/
private void pasteBlock(StructureContainedBlock block, Location origin, Rotation r) {
BlockData data = block.getBlockData().clone();
if(!data.getMaterial().equals(Material.STRUCTURE_VOID)) {
if(! data.getMaterial().equals(Material.STRUCTURE_VOID)) {
Location loc = origin.clone().add(block.getX(), block.getY(), block.getZ());
Block worldBlock = loc.getBlock();
main: while(worldBlock.isEmpty()) {
main:
while(worldBlock.isEmpty()) {
if(loc.getBlockY() > 255 || loc.getBlockY() < 0) return;
if(block.getPull() == null) break;
switch(block.getPull()) {
@@ -200,12 +202,14 @@ public class Structure implements Serializable {
case DOWN:
worldBlock = worldBlock.getRelative(BlockFace.DOWN);
break;
default: break main;
default:
break main;
}
}
int offset = block.getPullOffset();
if(offset != 0) worldBlock = worldBlock.getRelative((offset > 0) ? BlockFace.UP : BlockFace.DOWN, Math.abs(offset));
if(offset != 0)
worldBlock = worldBlock.getRelative((offset > 0) ? BlockFace.UP : BlockFace.DOWN, Math.abs(offset));
if(data instanceof Rotatable) {
BlockFace rt = getRotatedFace(((Rotatable) data).getRotation(), r);
@@ -247,17 +251,18 @@ public class Structure implements Serializable {
/**
* Execute a Consumer for all blocks in a cuboid region defined by 3 Ranges, accounting for rotation.
* @param xM X Range
* @param yM Y Range
* @param zM Z Range
*
* @param xM X Range
* @param yM Y Range
* @param zM Z Range
* @param exec Consumer to execute for each block.
* @param r Rotation
* @param r Rotation
*/
private void executeForBlocksInRange(Range xM, Range yM, Range zM, Consumer<StructureContainedBlock> exec, Rotation r) {
for(int x : xM) {
for(int y : yM) {
for(int z : zM) {
Vector2 c = getRotatedCoords(new Vector2(x-structureInfo.getCenterX(), z-structureInfo.getCenterZ()), r);
Vector2 c = getRotatedCoords(new Vector2(x - structureInfo.getCenterX(), z - structureInfo.getCenterZ()), r);
c.add(new Vector2(structureInfo.getCenterX(), structureInfo.getCenterZ()));
if(isInStructure((int) c.getX(), y, (int) c.getZ())) {
StructureContainedBlock b = structure[(int) c.getX()][(int) c.getZ()][y];
@@ -270,6 +275,7 @@ public class Structure implements Serializable {
/**
* Test whether a set of coordinates is within the current structure
*
* @param x X coordinate
* @param y Y coordinate
* @param z Z coordinate
@@ -281,6 +287,7 @@ public class Structure implements Serializable {
/**
* From an origin location (First bound) fetch the second bound.
*
* @param origin Origin location
* @return Other bound location
*/
@@ -290,6 +297,7 @@ public class Structure implements Serializable {
/**
* Save the structure to a file
*
* @param f File to save to
* @throws IOException If file access error occurs
*/
@@ -299,9 +307,10 @@ public class Structure implements Serializable {
/**
* Load a structure from a file.
*
* @param f File to load from
* @return The structure loaded
* @throws IOException If file access error occurs
* @throws IOException If file access error occurs
* @throws ClassNotFoundException If structure data is invalid.
*/
@NotNull
@@ -345,8 +354,10 @@ public class Structure implements Serializable {
Vector2 min = getRotatedCoords(new Vector2(x.getMin(), z.getMin()).subtract(center), r.inverse()).add(center);
Vector2 max = getRotatedCoords(new Vector2(x.getMax(), z.getMax()).subtract(center), r.inverse()).add(center);
if(a.equals(Axis.X)) return new Range((int) Math.floor(Math.min(min.getX(), max.getX())), (int) Math.ceil(Math.max(min.getX(), max.getX())) + 1);
else return new Range((int) Math.floor(Math.min(min.getZ(), max.getZ())), (int) Math.ceil(Math.max(min.getZ(), max.getZ())) + 1);
if(a.equals(Axis.X))
return new Range((int) Math.floor(Math.min(min.getX(), max.getX())), (int) Math.ceil(Math.max(min.getX(), max.getX())) + 1);
else
return new Range((int) Math.floor(Math.min(min.getZ(), max.getZ())), (int) Math.ceil(Math.max(min.getZ(), max.getZ())) + 1);
}
@NotNull
@@ -358,16 +369,19 @@ public class Structure implements Serializable {
return new Range(0, structureInfo.getSizeY());
case Z:
return new Range(0, structureInfo.getSizeZ());
default: throw new IllegalArgumentException();
default:
throw new IllegalArgumentException();
}
}
public enum Axis {
X, Y, Z
}
public enum Rotation {
CW_90(90), CW_180(180), CCW_90(270), NONE(0);
private final int degrees;
Rotation(int degrees) {
this.degrees = degrees;
}
@@ -375,22 +389,34 @@ public class Structure implements Serializable {
public int getDegrees() {
return degrees;
}
public static Rotation fromDegrees(int deg) {
switch(Math.floorMod(deg, 360)) {
case 0: return Rotation.NONE;
case 90: return Rotation.CW_90;
case 180: return Rotation.CW_180;
case 270: return Rotation.CCW_90;
default: throw new IllegalArgumentException();
case 0:
return Rotation.NONE;
case 90:
return Rotation.CW_90;
case 180:
return Rotation.CW_180;
case 270:
return Rotation.CCW_90;
default:
throw new IllegalArgumentException();
}
}
public Rotation inverse() {
switch(this) {
case NONE: return NONE;
case CCW_90: return CW_90;
case CW_90: return CCW_90;
case CW_180: return CW_180;
default: throw new IllegalArgumentException();
case NONE:
return NONE;
case CCW_90:
return CW_90;
case CW_90:
return CCW_90;
case CW_180:
return CW_180;
default:
throw new IllegalArgumentException();
}
}
}

View File

@@ -25,15 +25,16 @@ public class StructureContainedBlock implements Serializable {
private final int z;
private final SerializableBlockState state;
private final StructureSpawnRequirement requirement;
public StructureContainedBlock(int x, int y, int z, BlockState state, BlockData d, StructureSpawnRequirement spawn, Pull pull, int pullOffset) {
if(state instanceof Sign) {
Debug.info("Sign at (" + x + ", " + y + ", " + z + ").");
Debug.info("Sign at (" + x + ", " + y + ", " + z + ").");
this.state = new SerializableSign((org.bukkit.block.Sign) state);
} else if(state instanceof CreatureSpawner) {
Debug.info("Monster Spawner at (" + x + ", " + y + ", " + z + ").");
Debug.info("Monster Spawner at (" + x + ", " + y + ", " + z + ").");
this.state = new SerializableMonsterCage((CreatureSpawner) state);
} else if(state instanceof Banner) {
Debug.info("Banner at (" + x + ", " + y + ", " + z + ").");
Debug.info("Banner at (" + x + ", " + y + ", " + z + ").");
this.state = new SerializableBanner((Banner) state);
} else this.state = null;
this.x = x;
@@ -44,6 +45,7 @@ public class StructureContainedBlock implements Serializable {
this.pull = pull;
this.pullOffset = pullOffset;
}
public StructureContainedBlock(int x, int y, int z, SerializableBlockState state, BlockData d, StructureSpawnRequirement spawn, Pull pull, int pullOffset) {
this.state = state;
this.x = x;

View File

@@ -6,9 +6,10 @@ import org.bukkit.inventory.ItemStack;
import java.io.Serializable;
public class StructureContainedInventory implements Serializable {
public static final long serialVersionUID = -175339605585943678L;
public static final long serialVersionUID = - 175339605585943678L;
private final int uid;
private final int x, y, z;
public StructureContainedInventory(Inventory orig, StructureContainedBlock link) {
ItemStack stack = orig.getItem(0);
x = link.getX();

View File

@@ -1,17 +1,17 @@
package com.dfsek.terra.structure;
import com.dfsek.terra.procgen.math.Vector2;
import org.bukkit.util.Vector;
import java.io.Serializable;
public class StructureInfo implements Serializable {
public static final long serialVersionUID = -175639605885943678L;
public static final long serialVersionUID = - 175639605885943678L;
private final int sizeX;
private final int sizeY;
private final int sizeZ;
private final int centerX;
private final int centerZ;
public StructureInfo(int sizeX, int sizeY, int sizeZ, Vector2 center) {
this.sizeX = sizeX;
this.sizeY = sizeY;

View File

@@ -3,7 +3,6 @@ package com.dfsek.terra.structure;
import com.dfsek.terra.TerraWorld;
import com.dfsek.terra.biome.UserDefinedBiome;
import com.dfsek.terra.config.genconfig.biome.BiomeConfig;
import org.bukkit.Location;
import org.bukkit.World;
import org.polydev.gaea.generation.GenerationPhase;
import org.polydev.gaea.math.FastNoiseLite;
@@ -41,12 +40,15 @@ public enum StructureSpawnRequirement implements Serializable {
return true;
}
};
private static final long serialVersionUID = -175639605885943679L;
private static final long serialVersionUID = - 175639605885943679L;
private static final transient Map<World, FastNoiseLite> noiseMap = new HashMap<>();
public abstract boolean matches(World w, int x, int y, int z);
public static void putNoise(World w, FastNoiseLite noise) {
noiseMap.putIfAbsent(w, noise);
}
private static FastNoiseLite getNoise(World w) {
return noiseMap.get(w);
}

View File

@@ -8,9 +8,11 @@ import java.io.Serializable;
public class SerializableBlockData implements Serializable {
public static final long serialVersionUID = 5298928608478640008L;
private final String data;
public SerializableBlockData(BlockData d) {
this.data = d.getAsString(false);
}
public BlockData getData() {
return Bukkit.createBlockData(data);
}

View File

@@ -3,8 +3,6 @@ package com.dfsek.terra.structure.serialize.block;
import org.bukkit.DyeColor;
import org.bukkit.block.Banner;
import org.bukkit.block.BlockState;
import org.bukkit.block.Sign;
import org.bukkit.block.banner.Pattern;
import org.bukkit.block.banner.PatternType;
import java.io.Serializable;
@@ -24,7 +22,7 @@ public class SerializableBanner implements SerializableBlockState {
@Override
public BlockState getState(BlockState orig) {
if(!(orig instanceof Banner)) throw new IllegalArgumentException("Provided BlockState is not a banner.");
if(! (orig instanceof Banner)) throw new IllegalArgumentException("Provided BlockState is not a banner.");
Banner banner = (Banner) orig;
banner.setBaseColor(base);
for(Pattern pattern : patterns) {
@@ -32,9 +30,11 @@ public class SerializableBanner implements SerializableBlockState {
}
return banner;
}
private static final class Pattern implements Serializable {
private final DyeColor color;
private final PatternType type;
public Pattern(PatternType type, DyeColor color) {
this.color = color;
this.type = type;

View File

@@ -6,5 +6,6 @@ import java.io.Serializable;
public interface SerializableBlockState extends Serializable {
long serialVersionUID = 5298928608478640000L;
BlockState getState(BlockState orig);
}

View File

@@ -3,9 +3,6 @@ package com.dfsek.terra.structure.serialize.block;
import org.bukkit.block.BlockState;
import org.bukkit.block.CreatureSpawner;
import org.bukkit.entity.EntityType;
import org.polydev.gaea.math.Range;
import java.util.Random;
public class SerializableMonsterCage implements SerializableBlockState {
public static final long serialVersionUID = 529892860847864007L;
@@ -16,6 +13,7 @@ public class SerializableMonsterCage implements SerializableBlockState {
private final int playerRange;
private final int delay;
private final int count;
public SerializableMonsterCage(CreatureSpawner orig) {
this.type = orig.getSpawnedType();
this.minDelay = orig.getMinSpawnDelay();
@@ -25,9 +23,11 @@ public class SerializableMonsterCage implements SerializableBlockState {
this.delay = orig.getDelay();
this.count = orig.getSpawnCount();
}
@Override
public BlockState getState(BlockState orig) {
if(!(orig instanceof CreatureSpawner)) throw new IllegalArgumentException("BlockState is not a Monster Spawner!");
if(! (orig instanceof CreatureSpawner))
throw new IllegalArgumentException("BlockState is not a Monster Spawner!");
CreatureSpawner spawner = (CreatureSpawner) orig;
spawner.setSpawnedType(type);
spawner.setMinSpawnDelay(minDelay);

View File

@@ -7,13 +7,15 @@ public class SerializableSign implements SerializableBlockState {
public static final long serialVersionUID = 5298928608478640001L;
private final String[] text;
private final boolean isEditable;
public SerializableSign(Sign orig) {
text = orig.getLines();
this.isEditable = orig.isEditable();
}
@Override
public BlockState getState(BlockState orig) {
if(!(orig instanceof Sign)) throw new IllegalArgumentException("Provided BlockState is not a sign.");
if(! (orig instanceof Sign)) throw new IllegalArgumentException("Provided BlockState is not a sign.");
Sign sign = (Sign) orig;
for(int i = 0; i < text.length; i++) {
sign.setLine(i, text[i]);
@@ -25,6 +27,7 @@ public class SerializableSign implements SerializableBlockState {
public String[] getLines() {
return text;
}
public String getLine(int index) {
return text[index];
}

View File

@@ -10,7 +10,7 @@ import java.util.logging.Level;
public final class PaperUtil {
public static void checkPaper(JavaPlugin main) {
Bukkit.getScheduler().scheduleSyncDelayedTask(main, () -> {
if(!PaperLib.isPaper()) {
if(! PaperLib.isPaper()) {
LangUtil.log("use-paper", Level.WARNING);
}
}, 100L);

View File

@@ -24,6 +24,7 @@ public enum StructureTypeEnum {
NETHER_FOSSIL(StructureType.NETHER_FOSSIL),
RUINED_PORTAL(StructureType.RUINED_PORTAL),
BASTION_REMNANT(StructureType.BASTION_REMNANT);
StructureTypeEnum(StructureType type) {
this.type = type;
}

View File

@@ -8,21 +8,22 @@ import org.bukkit.block.data.Rail;
public final class RotationUtil {
/**
* Rotate and mirror a coordinate pair.
*
* @param orig Vector to rotate.
* @param r Rotation
* @param r Rotation
* @return Rotated coordinate pair
*/
public static Vector2 getRotatedCoords(Vector2 orig, Structure.Rotation r) {
Vector2 copy = orig.clone();
switch(r) {
case CW_90:
copy.setX(orig.getZ()).setZ(-orig.getX());
copy.setX(orig.getZ()).setZ(- orig.getX());
break;
case CCW_90:
copy.setX(-orig.getZ()).setZ(orig.getX());
copy.setX(- orig.getZ()).setZ(orig.getX());
break;
case CW_180:
copy.multiply(-1);
copy.multiply(- 1);
break;
}
return copy;
@@ -30,16 +31,17 @@ public final class RotationUtil {
/**
* Get the BlockFace with rotation and mirrors applied to it
*
* @param f BlockFace to apply rotation to
* @param r Rotation
* @return Rotated BlockFace
*/
public static BlockFace getRotatedFace(BlockFace f, Structure.Rotation r) {
BlockFace n = f;
int rotateNum = r.getDegrees()/90;
int rotateNum = r.getDegrees() / 90;
int rn = faceRotation(f);
if(rn >= 0) {
n = fromRotation(faceRotation(n) + 4*rotateNum);
n = fromRotation(faceRotation(n) + 4 * rotateNum);
}
return n;
}
@@ -61,50 +63,81 @@ public final class RotationUtil {
/**
* Method to rotate the incredibly obnoxious Rail.Shape enum
*
* @param orig Original shape
* @param r Rotate
* @param r Rotate
* @return Rotated/mirrored shape
*/
public static Rail.Shape getRotatedRail(Rail.Shape orig, Structure.Rotation r) {
switch(r) {
case CCW_90:
switch(orig) {
case NORTH_WEST: return Rail.Shape.SOUTH_WEST;
case NORTH_SOUTH: return Rail.Shape.EAST_WEST;
case SOUTH_WEST: return Rail.Shape.SOUTH_EAST;
case SOUTH_EAST: return Rail.Shape.NORTH_EAST;
case EAST_WEST: return Rail.Shape.NORTH_SOUTH;
case NORTH_EAST: return Rail.Shape.NORTH_WEST;
case ASCENDING_EAST: return Rail.Shape.ASCENDING_NORTH;
case ASCENDING_WEST: return Rail.Shape.ASCENDING_SOUTH;
case ASCENDING_NORTH: return Rail.Shape.ASCENDING_WEST;
case ASCENDING_SOUTH: return Rail.Shape.ASCENDING_EAST;
case NORTH_WEST:
return Rail.Shape.SOUTH_WEST;
case NORTH_SOUTH:
return Rail.Shape.EAST_WEST;
case SOUTH_WEST:
return Rail.Shape.SOUTH_EAST;
case SOUTH_EAST:
return Rail.Shape.NORTH_EAST;
case EAST_WEST:
return Rail.Shape.NORTH_SOUTH;
case NORTH_EAST:
return Rail.Shape.NORTH_WEST;
case ASCENDING_EAST:
return Rail.Shape.ASCENDING_NORTH;
case ASCENDING_WEST:
return Rail.Shape.ASCENDING_SOUTH;
case ASCENDING_NORTH:
return Rail.Shape.ASCENDING_WEST;
case ASCENDING_SOUTH:
return Rail.Shape.ASCENDING_EAST;
}
case CW_90:
switch(orig) {
case NORTH_WEST: return Rail.Shape.NORTH_EAST;
case NORTH_SOUTH: return Rail.Shape.EAST_WEST;
case SOUTH_WEST: return Rail.Shape.NORTH_WEST;
case SOUTH_EAST: return Rail.Shape.SOUTH_WEST;
case EAST_WEST: return Rail.Shape.NORTH_SOUTH;
case NORTH_EAST: return Rail.Shape.SOUTH_EAST;
case ASCENDING_EAST: return Rail.Shape.ASCENDING_SOUTH;
case ASCENDING_WEST: return Rail.Shape.ASCENDING_NORTH;
case ASCENDING_NORTH: return Rail.Shape.ASCENDING_EAST;
case ASCENDING_SOUTH: return Rail.Shape.ASCENDING_WEST;
case NORTH_WEST:
return Rail.Shape.NORTH_EAST;
case NORTH_SOUTH:
return Rail.Shape.EAST_WEST;
case SOUTH_WEST:
return Rail.Shape.NORTH_WEST;
case SOUTH_EAST:
return Rail.Shape.SOUTH_WEST;
case EAST_WEST:
return Rail.Shape.NORTH_SOUTH;
case NORTH_EAST:
return Rail.Shape.SOUTH_EAST;
case ASCENDING_EAST:
return Rail.Shape.ASCENDING_SOUTH;
case ASCENDING_WEST:
return Rail.Shape.ASCENDING_NORTH;
case ASCENDING_NORTH:
return Rail.Shape.ASCENDING_EAST;
case ASCENDING_SOUTH:
return Rail.Shape.ASCENDING_WEST;
}
case CW_180:
switch(orig) {
case NORTH_WEST: return Rail.Shape.SOUTH_EAST;
case NORTH_SOUTH: return Rail.Shape.NORTH_SOUTH;
case SOUTH_WEST: return Rail.Shape.NORTH_EAST;
case SOUTH_EAST: return Rail.Shape.NORTH_WEST;
case EAST_WEST: return Rail.Shape.EAST_WEST;
case NORTH_EAST: return Rail.Shape.SOUTH_WEST;
case ASCENDING_EAST: return Rail.Shape.ASCENDING_WEST;
case ASCENDING_WEST: return Rail.Shape.ASCENDING_EAST;
case ASCENDING_NORTH: return Rail.Shape.ASCENDING_SOUTH;
case ASCENDING_SOUTH: return Rail.Shape.ASCENDING_NORTH;
case NORTH_WEST:
return Rail.Shape.SOUTH_EAST;
case NORTH_SOUTH:
return Rail.Shape.NORTH_SOUTH;
case SOUTH_WEST:
return Rail.Shape.NORTH_EAST;
case SOUTH_EAST:
return Rail.Shape.NORTH_WEST;
case EAST_WEST:
return Rail.Shape.EAST_WEST;
case NORTH_EAST:
return Rail.Shape.SOUTH_WEST;
case ASCENDING_EAST:
return Rail.Shape.ASCENDING_WEST;
case ASCENDING_WEST:
return Rail.Shape.ASCENDING_EAST;
case ASCENDING_NORTH:
return Rail.Shape.ASCENDING_SOUTH;
case ASCENDING_SOUTH:
return Rail.Shape.ASCENDING_NORTH;
}
}
return orig;
@@ -112,55 +145,91 @@ public final class RotationUtil {
/**
* Get an integer representation of a BlockFace, to perform math on.
*
* @param f BlockFace to get integer for
* @return integer representation of BlockFace
*/
public static int faceRotation(BlockFace f) {
switch(f) {
case NORTH: return 0;
case NORTH_NORTH_EAST: return 1;
case NORTH_EAST: return 2;
case EAST_NORTH_EAST: return 3;
case EAST: return 4;
case EAST_SOUTH_EAST: return 5;
case SOUTH_EAST: return 6;
case SOUTH_SOUTH_EAST: return 7;
case SOUTH: return 8;
case SOUTH_SOUTH_WEST: return 9;
case SOUTH_WEST: return 10;
case WEST_SOUTH_WEST: return 11;
case WEST: return 12;
case WEST_NORTH_WEST: return 13;
case NORTH_WEST: return 14;
case NORTH_NORTH_WEST: return 15;
default: return -1;
case NORTH:
return 0;
case NORTH_NORTH_EAST:
return 1;
case NORTH_EAST:
return 2;
case EAST_NORTH_EAST:
return 3;
case EAST:
return 4;
case EAST_SOUTH_EAST:
return 5;
case SOUTH_EAST:
return 6;
case SOUTH_SOUTH_EAST:
return 7;
case SOUTH:
return 8;
case SOUTH_SOUTH_WEST:
return 9;
case SOUTH_WEST:
return 10;
case WEST_SOUTH_WEST:
return 11;
case WEST:
return 12;
case WEST_NORTH_WEST:
return 13;
case NORTH_WEST:
return 14;
case NORTH_NORTH_WEST:
return 15;
default:
return - 1;
}
}
/**
* Convert integer to BlockFace representation
*
* @param r integer to get BlockFace for
* @return BlockFace represented by integer.
*/
public static BlockFace fromRotation(int r) {
switch(Math.floorMod(r, 16)) {
case 0: return BlockFace.NORTH;
case 1: return BlockFace.NORTH_NORTH_EAST;
case 2: return BlockFace.NORTH_EAST;
case 3: return BlockFace.EAST_NORTH_EAST;
case 4: return BlockFace.EAST;
case 5: return BlockFace.EAST_SOUTH_EAST;
case 6: return BlockFace.SOUTH_EAST;
case 7: return BlockFace.SOUTH_SOUTH_EAST;
case 8: return BlockFace.SOUTH;
case 9: return BlockFace.SOUTH_SOUTH_WEST;
case 10: return BlockFace.SOUTH_WEST;
case 11: return BlockFace.WEST_SOUTH_WEST;
case 12: return BlockFace.WEST;
case 13: return BlockFace.WEST_NORTH_WEST;
case 14: return BlockFace.NORTH_WEST;
case 15: return BlockFace.NORTH_NORTH_WEST;
default: throw new IllegalArgumentException();
case 0:
return BlockFace.NORTH;
case 1:
return BlockFace.NORTH_NORTH_EAST;
case 2:
return BlockFace.NORTH_EAST;
case 3:
return BlockFace.EAST_NORTH_EAST;
case 4:
return BlockFace.EAST;
case 5:
return BlockFace.EAST_SOUTH_EAST;
case 6:
return BlockFace.SOUTH_EAST;
case 7:
return BlockFace.SOUTH_SOUTH_EAST;
case 8:
return BlockFace.SOUTH;
case 9:
return BlockFace.SOUTH_SOUTH_WEST;
case 10:
return BlockFace.SOUTH_WEST;
case 11:
return BlockFace.WEST_SOUTH_WEST;
case 12:
return BlockFace.WEST;
case 13:
return BlockFace.WEST_NORTH_WEST;
case 14:
return BlockFace.NORTH_WEST;
case 15:
return BlockFace.NORTH_NORTH_WEST;
default:
throw new IllegalArgumentException();
}
}
}

View File

@@ -14,10 +14,11 @@ import org.bukkit.plugin.Plugin;
public final class WorldEditUtil {
public static WorldEditPlugin getWorldEdit() {
Plugin p = Bukkit.getServer().getPluginManager().getPlugin("WorldEdit");
if (p instanceof WorldEditPlugin) return (WorldEditPlugin) p;
if(p instanceof WorldEditPlugin) return (WorldEditPlugin) p;
Bukkit.getLogger().severe("[Terra] a command requiring WorldEdit was executed, but WorldEdit was not detected!");
return null;
}
public static Location[] getSelectionLocations(Player sender) {
WorldEditPlugin we = WorldEditUtil.getWorldEdit();
if(we == null) {
@@ -27,7 +28,7 @@ public final class WorldEditUtil {
Region selection;
try {
selection = we.getSession(sender).getSelection(BukkitAdapter.adapt(sender.getWorld()));
} catch(IncompleteRegionException |ClassCastException e) {
} catch(IncompleteRegionException | ClassCastException e) {
sender.sendMessage("Invalid/incomplete selection!");
return null;
}
@@ -41,6 +42,7 @@ public final class WorldEditUtil {
Location l2 = new Location(sender.getWorld(), max.getBlockX(), max.getBlockY(), max.getBlockZ());
return new Location[] {l1, l2};
}
public static Location[] getSelectionPositions(Player sender) {
WorldEditPlugin we = WorldEditUtil.getWorldEdit();
if(we == null) {
@@ -50,7 +52,7 @@ public final class WorldEditUtil {
CuboidRegion selection;
try {
selection = (CuboidRegion) we.getSession(sender).getSelection(BukkitAdapter.adapt(sender.getWorld()));
} catch(IncompleteRegionException |ClassCastException e) {
} catch(IncompleteRegionException | ClassCastException e) {
sender.sendMessage("Invalid/incomplete selection!");
return null;
}

View File

@@ -33,4 +33,4 @@ trees:
flora:
chance: 0
attempts: 0
items: {}
items: { }

View File

@@ -33,4 +33,4 @@ trees:
flora:
chance: 0
attempts: 0
items: {}
items: { }

View File

@@ -33,4 +33,4 @@ trees:
flora:
chance: 0
attempts: 0
items: {}
items: { }

View File

@@ -34,33 +34,33 @@ palette:
- "minecraft:bedrock"
- "minecraft:ice"
layers:
- materials: {"minecraft:air": 1}
- materials: { "minecraft:air": 1 }
y: 255
- materials: {"minecraft:lava": 1}
- materials: { "minecraft:lava": 1 }
y: 8
outer:
replace-blacklist: false
replace: []
replace: [ ]
layers:
- materials: { "minecraft:stone": 1 }
y: 255
top:
replace-blacklist: false
replace: []
replace: [ ]
layers:
- materials: { "minecraft:stone": 1 }
y: 255
bottom:
replace-blacklist: false
replace: []
replace: [ ]
layers:
- materials: { "minecraft:stone": 1 }
y: 255
shift:
"minecraft:grass_block": ["minecraft:dirt"]
"minecraft:podzol": ["minecraft:dirt"]
"minecraft:gravel": ["minecraft:dirt"]
"minecraft:sand": ["minecraft:dirt"]
"minecraft:coarse_dirt": ["minecraft:dirt"]
"minecraft:grass_block": [ "minecraft:dirt" ]
"minecraft:podzol": [ "minecraft:dirt" ]
"minecraft:gravel": [ "minecraft:dirt" ]
"minecraft:sand": [ "minecraft:dirt" ]
"minecraft:coarse_dirt": [ "minecraft:dirt" ]
update: []
update: [ ]

View File

@@ -36,11 +36,11 @@ palette:
layers:
- materials: { "minecraft:air": 1 }
y: 255
- materials: {"minecraft:water": 1}
- materials: { "minecraft:water": 1 }
y: 62
- materials: { "minecraft:lava": 1 }
y: 7
- materials: {"minecraft:obsidian": 19, "minecraft:magma_block": 1}
- materials: { "minecraft:obsidian": 19, "minecraft:magma_block": 1 }
y: 8
outer:
replace-blacklist: false
@@ -64,10 +64,10 @@ palette:
- materials: { "minecraft:stone": 1 }
y: 255
shift:
"minecraft:grass_block": ["minecraft:dirt"]
"minecraft:podzol": ["minecraft:dirt"]
"minecraft:gravel": ["minecraft:dirt"]
"minecraft:sand": ["minecraft:dirt"]
"minecraft:coarse_dirt": ["minecraft:dirt"]
"minecraft:grass_block": [ "minecraft:dirt" ]
"minecraft:podzol": [ "minecraft:dirt" ]
"minecraft:gravel": [ "minecraft:dirt" ]
"minecraft:sand": [ "minecraft:dirt" ]
"minecraft:coarse_dirt": [ "minecraft:dirt" ]
update: []
update: [ ]

View File

@@ -36,11 +36,11 @@ palette:
layers:
- materials: { "minecraft:air": 1 }
y: 255
- materials: {"minecraft:water": 1}
- materials: { "minecraft:water": 1 }
y: 48
- materials: { "minecraft:lava": 1 }
y: 7
- materials: {"minecraft:obsidian": 19, "minecraft:magma_block": 1}
- materials: { "minecraft:obsidian": 19, "minecraft:magma_block": 1 }
y: 8
outer:
replace-blacklist: false
@@ -51,7 +51,7 @@ palette:
y: 255
- materials: { "minecraft:stone": 23, "minecraft:spruce_wood": 1, "minecraft:dark_oak_wood": 1 }
y: 48
- materials: { "minecraft:stone": 1}
- materials: { "minecraft:stone": 1 }
y: 18
top:
replace-blacklist: false
@@ -77,9 +77,9 @@ palette:
y: 18
shift:
"minecraft:grass_block": ["minecraft:dirt"]
"minecraft:podzol": ["minecraft:dirt"]
"minecraft:gravel": ["minecraft:dirt"]
"minecraft:sand": ["minecraft:dirt"]
"minecraft:coarse_dirt": ["minecraft:dirt"]
update: []
"minecraft:grass_block": [ "minecraft:dirt" ]
"minecraft:podzol": [ "minecraft:dirt" ]
"minecraft:gravel": [ "minecraft:dirt" ]
"minecraft:sand": [ "minecraft:dirt" ]
"minecraft:coarse_dirt": [ "minecraft:dirt" ]
update: [ ]

View File

@@ -43,14 +43,14 @@ palette:
replace:
- "minecraft:stone"
layers:
- materials: { "minecraft:stone": 1, "minecraft:cobblestone": 1,"minecraft:snow_block": 1}
- materials: { "minecraft:stone": 1, "minecraft:cobblestone": 1,"minecraft:snow_block": 1 }
y: 255
outer:
replace-blacklist: false
replace:
- "minecraft:stone"
layers:
- materials: { "minecraft:packed_ice": 1,"minecraft:snow_block": 1, "minecraft:stone": 2}
- materials: { "minecraft:packed_ice": 1,"minecraft:snow_block": 1, "minecraft:stone": 2 }
y: 255
- materials: { "minecraft:stone": 1 }
y: 18
@@ -59,15 +59,15 @@ palette:
replace:
- "minecraft:stone"
layers:
- materials: { "minecraft:packed_ice": 4}
- materials: { "minecraft:packed_ice": 4 }
y: 255
- materials: { "minecraft:stone": 1 }
y: 18
shift:
"minecraft:grass_block": ["minecraft:dirt"]
"minecraft:podzol": ["minecraft:dirt"]
"minecraft:gravel": ["minecraft:dirt"]
"minecraft:sand": ["minecraft:dirt"]
"minecraft:coarse_dirt": ["minecraft:dirt"]
update: []
"minecraft:grass_block": [ "minecraft:dirt" ]
"minecraft:podzol": [ "minecraft:dirt" ]
"minecraft:gravel": [ "minecraft:dirt" ]
"minecraft:sand": [ "minecraft:dirt" ]
"minecraft:coarse_dirt": [ "minecraft:dirt" ]
update: [ ]

View File

@@ -34,13 +34,13 @@ palette:
- "minecraft:bedrock"
- "minecraft:ice"
layers:
- materials: {"minecraft:air": 1}
- materials: { "minecraft:air": 1 }
y: 255
- materials: {"minecraft:lava": 1}
- materials: { "minecraft:lava": 1 }
y: 8
outer:
replace-blacklist: false
replace: []
replace: [ ]
layers:
- materials: { "minecraft:stone": 1 }
y: 255
@@ -57,10 +57,10 @@ palette:
- materials: { "minecraft:stone": 1 }
y: 255
shift:
"minecraft:grass_block": ["minecraft:dirt"]
"minecraft:podzol": ["minecraft:dirt"]
"minecraft:gravel": ["minecraft:dirt"]
"minecraft:sand": ["minecraft:dirt"]
"minecraft:coarse_dirt": ["minecraft:dirt"]
"minecraft:grass_block": [ "minecraft:dirt" ]
"minecraft:podzol": [ "minecraft:dirt" ]
"minecraft:gravel": [ "minecraft:dirt" ]
"minecraft:sand": [ "minecraft:dirt" ]
"minecraft:coarse_dirt": [ "minecraft:dirt" ]
update: []
update: [ ]

View File

@@ -34,13 +34,13 @@ palette:
- "minecraft:bedrock"
- "minecraft:ice"
layers:
- materials: {"minecraft:air": 1}
- materials: { "minecraft:air": 1 }
y: 255
- materials: {"minecraft:lava": 1}
- materials: { "minecraft:lava": 1 }
y: 8
outer:
replace-blacklist: false
replace: []
replace: [ ]
layers:
- materials: { "minecraft:stone": 1 }
y: 255
@@ -57,10 +57,10 @@ palette:
- materials: { "minecraft:stone": 1 }
y: 255
shift:
"minecraft:grass_block": ["minecraft:dirt"]
"minecraft:podzol": ["minecraft:dirt"]
"minecraft:gravel": ["minecraft:dirt"]
"minecraft:sand": ["minecraft:dirt"]
"minecraft:coarse_dirt": ["minecraft:dirt"]
"minecraft:grass_block": [ "minecraft:dirt" ]
"minecraft:podzol": [ "minecraft:dirt" ]
"minecraft:gravel": [ "minecraft:dirt" ]
"minecraft:sand": [ "minecraft:dirt" ]
"minecraft:coarse_dirt": [ "minecraft:dirt" ]
update: []
update: [ ]

View File

@@ -7,7 +7,7 @@ layers:
- "minecraft:cobblestone_wall": 1
layers: 1
- materials:
- "minecraft:cobblestone_wall": 1
- "minecraft:cobblestone_wall": 1
layers: 1
id: "STALAGMITE"

View File

@@ -1,13 +1,13 @@
grid:
- ["FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "BEACH", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH"]
- ["FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "BEACH", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH"]
- ["FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "BEACH", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH"]
- ["FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "BEACH", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH"]
- ["FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "BEACH", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH"]
- ["FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "BEACH", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH"]
- ["FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "BEACH", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH"]
- ["FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "SWAMP", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH"]
- ["FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "SWAMP", "SWAMP", "SWAMP", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH"]
- ["FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "SWAMP", "SWAMP", "SWAMP", "SWAMP", "WARM_BEACH", "WARM_BEACH"]
- ["FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "SWAMP", "SWAMP", "SWAMP", "SWAMP", "WARM_BEACH", "WARM_BEACH"]
- [ "FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "BEACH", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH" ]
- [ "FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "BEACH", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH" ]
- [ "FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "BEACH", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH" ]
- [ "FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "BEACH", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH" ]
- [ "FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "BEACH", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH" ]
- [ "FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "BEACH", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH" ]
- [ "FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "BEACH", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH" ]
- [ "FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "SWAMP", "BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH" ]
- [ "FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "SWAMP", "SWAMP", "SWAMP", "WARM_BEACH", "WARM_BEACH", "WARM_BEACH" ]
- [ "FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "SWAMP", "SWAMP", "SWAMP", "SWAMP", "WARM_BEACH", "WARM_BEACH" ]
- [ "FROZEN_BEACH", "FROZEN_BEACH", "COLD_BEACH", "COLD_BEACH", "BEACH", "SWAMP", "SWAMP", "SWAMP", "SWAMP", "WARM_BEACH", "WARM_BEACH" ]
id: "BEACH"

View File

@@ -1,13 +1,13 @@
grid:
- ["TUNDRA", "TUNDRA", "TAIGA", "PLAINS", "PLAINS", "SAVANNA", "SAVANNA", "DESERT", "DESERT", "MESA", "MESA"]
- ["TUNDRA", "TUNDRA", "TAIGA", "PLAINS", "PLAINS", "SAVANNA", "SAVANNA", "DESERT", "DESERT", "MESA", "MESA"]
- ["TUNDRA", "TUNDRA", "TAIGA", "PLAINS", "PLAINS", "SAVANNA", "SAVANNA", "DESERT", "DESERT", "MESA", "MESA"]
- ["TUNDRA", "TUNDRA", "TAIGA", "PLAINS", "PLAINS", "SAVANNA", "SAVANNA", "DESERT", "DESERT", "DESERT", "DESERT"]
- ["TUNDRA", "TUNDRA", "TAIGA", "PLAINS", "PLAINS", "SAVANNA", "SAVANNA", "DESERT", "DESERT", "DESERT", "DESERT"]
- ["SNOWY_TAIGA", "SNOWY_TAIGA", "TAIGA", "PLAINS", "PLAINS", "PLAINS", "PLAINS", "SAVANNA", "SAVANNA", "SAVANNA", "SAVANNA"]
- ["SNOWY_TAIGA", "SNOWY_TAIGA", "TAIGA", "PLAINS", "PLAINS", "PLAINS", "PLAINS", "PLAINS", "PLAINS", "PLAINS", "PLAINS"]
- ["SNOWY_TAIGA", "SNOWY_TAIGA", "TAIGA", "DARK_FOREST", "DARK_FOREST", "FOREST", "FOREST", "JUNGLE", "JUNGLE", "JUNGLE", "JUNGLE"]
- ["SNOWY_TAIGA", "SNOWY_TAIGA", "TAIGA", "DARK_FOREST", "DARK_FOREST", "FOREST", "FOREST", "FOREST", "JUNGLE", "JUNGLE", "JUNGLE"]
- ["SNOWY_TAIGA", "SNOWY_TAIGA", "TAIGA", "DARK_FOREST", "DARK_FOREST", "FOREST", "FOREST", "JUNGLE", "JUNGLE", "JUNGLE", "JUNGLE"]
- ["SNOWY_TAIGA", "SNOWY_TAIGA", "TAIGA", "DARK_FOREST", "DARK_FOREST", "FOREST", "FOREST", "JUNGLE", "JUNGLE", "JUNGLE", "JUNGLE"]
- [ "TUNDRA", "TUNDRA", "TAIGA", "PLAINS", "PLAINS", "SAVANNA", "SAVANNA", "DESERT", "DESERT", "MESA", "MESA" ]
- [ "TUNDRA", "TUNDRA", "TAIGA", "PLAINS", "PLAINS", "SAVANNA", "SAVANNA", "DESERT", "DESERT", "MESA", "MESA" ]
- [ "TUNDRA", "TUNDRA", "TAIGA", "PLAINS", "PLAINS", "SAVANNA", "SAVANNA", "DESERT", "DESERT", "MESA", "MESA" ]
- [ "TUNDRA", "TUNDRA", "TAIGA", "PLAINS", "PLAINS", "SAVANNA", "SAVANNA", "DESERT", "DESERT", "DESERT", "DESERT" ]
- [ "TUNDRA", "TUNDRA", "TAIGA", "PLAINS", "PLAINS", "SAVANNA", "SAVANNA", "DESERT", "DESERT", "DESERT", "DESERT" ]
- [ "SNOWY_TAIGA", "SNOWY_TAIGA", "TAIGA", "PLAINS", "PLAINS", "PLAINS", "PLAINS", "SAVANNA", "SAVANNA", "SAVANNA", "SAVANNA" ]
- [ "SNOWY_TAIGA", "SNOWY_TAIGA", "TAIGA", "PLAINS", "PLAINS", "PLAINS", "PLAINS", "PLAINS", "PLAINS", "PLAINS", "PLAINS" ]
- [ "SNOWY_TAIGA", "SNOWY_TAIGA", "TAIGA", "DARK_FOREST", "DARK_FOREST", "FOREST", "FOREST", "JUNGLE", "JUNGLE", "JUNGLE", "JUNGLE" ]
- [ "SNOWY_TAIGA", "SNOWY_TAIGA", "TAIGA", "DARK_FOREST", "DARK_FOREST", "FOREST", "FOREST", "FOREST", "JUNGLE", "JUNGLE", "JUNGLE" ]
- [ "SNOWY_TAIGA", "SNOWY_TAIGA", "TAIGA", "DARK_FOREST", "DARK_FOREST", "FOREST", "FOREST", "JUNGLE", "JUNGLE", "JUNGLE", "JUNGLE" ]
- [ "SNOWY_TAIGA", "SNOWY_TAIGA", "TAIGA", "DARK_FOREST", "DARK_FOREST", "FOREST", "FOREST", "JUNGLE", "JUNGLE", "JUNGLE", "JUNGLE" ]
id: "LAND"

View File

@@ -1,13 +1,13 @@
grid:
- ["MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS"]
- ["MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS"]
- ["MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS"]
- ["MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS"]
- ["MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS"]
- ["MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS"]
- ["MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0"]
- ["MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1"]
- ["MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE"]
- ["MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE"]
- ["MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE"]
- [ "MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS" ]
- [ "MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS" ]
- [ "MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS" ]
- [ "MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS" ]
- [ "MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS" ]
- [ "MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS", "ARID_MOUNTAINS" ]
- [ "MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0" ]
- [ "MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1" ]
- [ "MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE" ]
- [ "MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE" ]
- [ "MOUNTAINS_STONE", "MOUNTAINS_STONE", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_PRETTY", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE", "MOUNTAINS_JUNGLE" ]
id: "MOUNTAIN"

View File

@@ -1,13 +1,13 @@
grid:
- ["MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0"]
- ["MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0"]
- ["MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0"]
- ["MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0"]
- ["MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0"]
- ["MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0"]
- ["MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0"]
- ["MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0"]
- ["MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0"]
- ["MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0"]
- ["MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0"]
- [ "MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0" ]
- [ "MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0" ]
- [ "MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0" ]
- [ "MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0" ]
- [ "MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0" ]
- [ "MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0", "ARID_MOUNTAINS_0" ]
- [ "MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0" ]
- [ "MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0" ]
- [ "MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0" ]
- [ "MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0" ]
- [ "MOUNTAINS_STONE_0", "MOUNTAINS_STONE_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0", "MOUNTAINS_JUNGLE_0" ]
id: "MOUNTAIN_0"

View File

@@ -1,13 +1,13 @@
grid:
- ["MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1"]
- ["MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1"]
- ["MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1"]
- ["MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1"]
- ["MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1"]
- ["MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1"]
- ["MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0"]
- ["MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1"]
- ["MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1"]
- ["MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1"]
- ["MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1"]
- [ "MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1" ]
- [ "MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1" ]
- [ "MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1" ]
- [ "MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1" ]
- [ "MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1" ]
- [ "MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1", "ARID_MOUNTAINS_1" ]
- [ "MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_0" ]
- [ "MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1" ]
- [ "MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1" ]
- [ "MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1" ]
- [ "MOUNTAINS_STONE_1", "MOUNTAINS_STONE_1", "MOUNTAINS_PRETTY_0", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_PRETTY_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1", "MOUNTAINS_JUNGLE_1" ]
id: "MOUNTAIN_1"

Some files were not shown because too many files have changed in this diff Show More