From 8f58ba17a8f1e487f0a0bccabbd6704eadcdf7f7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 01:26:39 -0700 Subject: [PATCH 001/210] Begin work on tokenizer --- .../dfsek/terra/structure/v2/Function.java | 5 ++ .../com/dfsek/terra/structure/v2/Parser.java | 4 + .../terra/structure/v2/tokenizer/Char.java | 35 ++++++++ .../structure/v2/tokenizer/Lookahead.java | 83 +++++++++++++++++++ .../structure/v2/tokenizer/Tokenizer.java | 11 +++ .../terra/structure/v2/tokenizer/Tokens.java | 5 ++ src/test/java/structure/LookaheadTest.java | 20 +++++ 7 files changed, 163 insertions(+) create mode 100644 src/main/java/com/dfsek/terra/structure/v2/Function.java create mode 100644 src/main/java/com/dfsek/terra/structure/v2/Parser.java create mode 100644 src/main/java/com/dfsek/terra/structure/v2/tokenizer/Char.java create mode 100644 src/main/java/com/dfsek/terra/structure/v2/tokenizer/Lookahead.java create mode 100644 src/main/java/com/dfsek/terra/structure/v2/tokenizer/Tokenizer.java create mode 100644 src/main/java/com/dfsek/terra/structure/v2/tokenizer/Tokens.java create mode 100644 src/test/java/structure/LookaheadTest.java diff --git a/src/main/java/com/dfsek/terra/structure/v2/Function.java b/src/main/java/com/dfsek/terra/structure/v2/Function.java new file mode 100644 index 000000000..71c008edc --- /dev/null +++ b/src/main/java/com/dfsek/terra/structure/v2/Function.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.structure.v2; + +public interface Function { + void apply(); +} diff --git a/src/main/java/com/dfsek/terra/structure/v2/Parser.java b/src/main/java/com/dfsek/terra/structure/v2/Parser.java new file mode 100644 index 000000000..82ef17732 --- /dev/null +++ b/src/main/java/com/dfsek/terra/structure/v2/Parser.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.structure.v2; + +public class Parser { +} diff --git a/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Char.java b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Char.java new file mode 100644 index 000000000..82b8c68a2 --- /dev/null +++ b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Char.java @@ -0,0 +1,35 @@ +package com.dfsek.terra.structure.v2.tokenizer; + +public class Char { + private final char character; + private final int index; + private final int line; + + + public Char(char character, int index, int line) { + this.character = character; + this.index = index; + this.line = line; + } + + public char getCharacter() { + return character; + } + + public int getIndex() { + return index; + } + + public int getLine() { + return line; + } + + public boolean is(char... tests) { + for(char test : tests) { + if(test == character && test != '\0') { + return true; + } + } + return false; + } +} diff --git a/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Lookahead.java b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Lookahead.java new file mode 100644 index 000000000..6e88fd046 --- /dev/null +++ b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Lookahead.java @@ -0,0 +1,83 @@ +package com.dfsek.terra.structure.v2.tokenizer; + +import org.polydev.gaea.util.GlueList; + +import java.io.IOException; +import java.io.Reader; +import java.util.List; + +public class Lookahead { + private final List buffer = new GlueList<>(); + private final Reader input; + private int index = 0; + private int line = 0; + private boolean end = false; + + public Lookahead(Reader r) { + this.input = r; + } + + public Char current() { + return next(0); + } + + public Char consume() { + Char consumed = current(); + consume(1); + return consumed; + } + + /** + * Fetch and consume the next character. + * + * @return Next character + */ + private Char fetch() { + try { + int c = input.read(); + if(c == -1) return null; + if(c == '\n') { + line++; + index = 0; + } + index++; + return new Char((char) c, line, index); + } catch(IOException e) { + e.printStackTrace(); + return null; + } + } + + /** + * Fetch a future character without consuming it. + * + * @param ahead Distance ahead to peek + * @return Character + */ + public Char next(int ahead) { + if(ahead < 0) throw new IllegalArgumentException(); + + while(buffer.size() <= ahead && !end) { + Char item = fetch(); + if(item != null) { + buffer.add(item); + } else end = true; + } + + if(ahead >= buffer.size()) { + return null; + } else return buffer.get(ahead); + } + + public void consume(int amount) { + if(amount < 0) throw new IllegalArgumentException(); + while(amount-- > 0) { + if(!buffer.isEmpty()) buffer.remove(0); // Remove top item from buffer. + else { + if(end) return; + Char item = fetch(); + if(item == null) end = true; + } + } + } +} diff --git a/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Tokenizer.java b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Tokenizer.java new file mode 100644 index 000000000..95c9df378 --- /dev/null +++ b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Tokenizer.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.structure.v2.tokenizer; + +import java.io.StringReader; + +public class Tokenizer { + private final Lookahead reader; + + public Tokenizer(String data) { + reader = new Lookahead(new StringReader(data)); + } +} diff --git a/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Tokens.java b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Tokens.java new file mode 100644 index 000000000..92b4e8566 --- /dev/null +++ b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Tokens.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.structure.v2.tokenizer; + +public enum Tokens { + FUNCTION, SEPARATOR, ARGUMENT +} diff --git a/src/test/java/structure/LookaheadTest.java b/src/test/java/structure/LookaheadTest.java new file mode 100644 index 000000000..a3c84d493 --- /dev/null +++ b/src/test/java/structure/LookaheadTest.java @@ -0,0 +1,20 @@ +package structure; + +import com.dfsek.terra.structure.v2.tokenizer.Lookahead; +import org.junit.jupiter.api.Test; + +import java.io.StringReader; + +public class LookaheadTest { + @Test + public void lookahead() { + Lookahead lookahead = new Lookahead(new StringReader("Test string...")); + + for(int i = 0; lookahead.next(i) != null; i++) { + System.out.print(lookahead.next(i).getCharacter()); + } + while(lookahead.next(0) != null) { + System.out.print(lookahead.consume().getCharacter()); + } + } +} From 26228d2c71b6342245279217f4c9a08e487ae20d Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 09:49:46 -0700 Subject: [PATCH 002/210] Tokenizer stuff --- .../structure/v2/tokenizer/Lookahead.java | 20 ++++++++++++++++++- .../structure/v2/tokenizer/Position.java | 11 ++++++++++ .../terra/structure/v2/tokenizer/Token.java | 4 ++++ .../structure/v2/tokenizer/Tokenizer.java | 1 + .../exceptions/TokenizerException.java | 4 ++++ 5 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/dfsek/terra/structure/v2/tokenizer/Position.java create mode 100644 src/main/java/com/dfsek/terra/structure/v2/tokenizer/Token.java create mode 100644 src/main/java/com/dfsek/terra/structure/v2/tokenizer/exceptions/TokenizerException.java diff --git a/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Lookahead.java b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Lookahead.java index 6e88fd046..5e41bfd37 100644 --- a/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Lookahead.java +++ b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Lookahead.java @@ -6,6 +6,9 @@ import java.io.IOException; import java.io.Reader; import java.util.List; +/** + * Stream-like data structure that allows viewing future elements without consuming current. + */ public class Lookahead { private final List buffer = new GlueList<>(); private final Reader input; @@ -17,10 +20,20 @@ public class Lookahead { this.input = r; } + /** + * Get the current character without consuming it. + * + * @return + */ public Char current() { return next(0); } + /** + * Consume and return one character. + * + * @return Character that was consumed. + */ public Char consume() { Char consumed = current(); consume(1); @@ -28,7 +41,7 @@ public class Lookahead { } /** - * Fetch and consume the next character. + * Fetch the next character. * * @return Next character */ @@ -69,6 +82,11 @@ public class Lookahead { } else return buffer.get(ahead); } + /** + * Consume an amount of characters + * + * @param amount Number of characters to consume + */ public void consume(int amount) { if(amount < 0) throw new IllegalArgumentException(); while(amount-- > 0) { diff --git a/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Position.java b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Position.java new file mode 100644 index 000000000..2d1f70257 --- /dev/null +++ b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Position.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.structure.v2.tokenizer; + +public class Position { + private final int line; + private final int index; + + public Position(int line, int index) { + this.line = line; + this.index = index; + } +} diff --git a/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Token.java b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Token.java new file mode 100644 index 000000000..5fca5ed00 --- /dev/null +++ b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Token.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.structure.v2.tokenizer; + +public class Token { +} diff --git a/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Tokenizer.java b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Tokenizer.java index 95c9df378..ca9061cf3 100644 --- a/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Tokenizer.java +++ b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/Tokenizer.java @@ -7,5 +7,6 @@ public class Tokenizer { public Tokenizer(String data) { reader = new Lookahead(new StringReader(data)); + } } diff --git a/src/main/java/com/dfsek/terra/structure/v2/tokenizer/exceptions/TokenizerException.java b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/exceptions/TokenizerException.java new file mode 100644 index 000000000..e3f0e9c0b --- /dev/null +++ b/src/main/java/com/dfsek/terra/structure/v2/tokenizer/exceptions/TokenizerException.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.structure.v2.tokenizer.exceptions; + +public abstract class TokenizerException extends Exception { +} From 392ba59741454d3d411fbaa7079787e4935279a8 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 10:19:16 -0700 Subject: [PATCH 003/210] Begin reimplementing agnostic versions of Bukkit classes with delegate implementations --- .../dfsek/terra/api/bukkit/BukkitChunk.java | 21 ++++ .../dfsek/terra/api/bukkit/BukkitWorld.java | 16 +++ .../api/generic/generator/BlockPopulator.java | 10 ++ .../api/generic/generator/ChunkGenerator.java | 4 + .../dfsek/terra/api/generic/world/Block.java | 4 + .../dfsek/terra/api/generic/world/Chunk.java | 7 ++ .../dfsek/terra/api/generic/world/World.java | 5 + .../api/generic/world/vector/Location.java | 27 +++++ .../generic/world/vector}/Vector2.java | 2 +- .../api/generic/world/vector/Vector3.java | 104 ++++++++++++++++++ .../grid/master/TerraRadialBiomeGrid.java | 2 +- .../grid/master/TerraStandardBiomeGrid.java | 2 +- .../postprocessing/CoordinatePerturb.java | 2 +- .../generation/items/PlaceableLayer.java | 2 +- .../generation/items/flora/FloraLayer.java | 2 +- .../generation/items/tree/TerraTree.java | 2 +- .../generation/items/tree/TreeLayer.java | 2 +- .../dfsek/terra/population/CavePopulator.java | 5 - .../terra/population/FloraPopulator.java | 2 +- .../terra/population/StructurePopulator.java | 2 +- .../dfsek/terra/population/TreePopulator.java | 2 +- .../dfsek/terra/procgen/pixel/Polygon.java | 2 +- .../dfsek/terra/procgen/pixel/Rectangle.java | 2 +- .../com/dfsek/terra/structure/Structure.java | 2 +- .../dfsek/terra/structure/StructureInfo.java | 2 +- .../terra/util/structure/RotationUtil.java | 2 +- 26 files changed, 214 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/Block.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/Chunk.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/World.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java rename src/main/java/com/dfsek/terra/{procgen/math => api/generic/world/vector}/Vector2.java (98%) create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java new file mode 100644 index 000000000..269d27707 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.api.bukkit; + +import com.dfsek.terra.api.generic.world.Chunk; + +public class BukkitChunk implements Chunk { + private final org.bukkit.Chunk delegate; + + public BukkitChunk(org.bukkit.Chunk delegate) { + this.delegate = delegate; + } + + @Override + public int getX() { + return delegate.getX(); + } + + @Override + public int getZ() { + return delegate.getZ(); + } +} diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java new file mode 100644 index 000000000..94e3ae4c3 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.api.bukkit; + +import com.dfsek.terra.api.generic.world.World; + +public class BukkitWorld implements World { + private final org.bukkit.World delegate; + + public BukkitWorld(org.bukkit.World delegate) { + this.delegate = delegate; + } + + @Override + public long getSeed() { + return delegate.getSeed(); + } +} diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java b/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java new file mode 100644 index 000000000..a205ff579 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.generic.generator; + +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; + +import java.util.Random; + +public abstract class BlockPopulator { + public abstract void populate(World world, Random random, Chunk chunk); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java new file mode 100644 index 000000000..4ad035b34 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.generic.generator; + +public abstract class ChunkGenerator { +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/Block.java b/src/main/java/com/dfsek/terra/api/generic/world/Block.java new file mode 100644 index 000000000..e3ec7fe64 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/Block.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.generic.world; + +public interface Block { +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java b/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java new file mode 100644 index 000000000..1c8370131 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.api.generic.world; + +public interface Chunk { + int getX(); + + int getZ(); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/World.java b/src/main/java/com/dfsek/terra/api/generic/world/World.java new file mode 100644 index 000000000..2b834ce54 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/World.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.api.generic.world; + +public interface World { + long getSeed(); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java b/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java new file mode 100644 index 000000000..7c82c96f4 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.api.generic.world.vector; + +import com.dfsek.terra.api.generic.world.World; + +public class Location implements Cloneable { + private final World world; + private final Vector3 vector; + + public Location(World w, double x, double y, double z) { + this.world = w; + this.vector = new Vector3(x, y, z); + } + + public Location(World w, Vector3 vector) { + this.world = w; + this.vector = vector; + } + + @Override + public Location clone() { + try { + return (Location) super.clone(); + } catch(CloneNotSupportedException e) { + throw new Error(e); + } + } +} diff --git a/src/main/java/com/dfsek/terra/procgen/math/Vector2.java b/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector2.java similarity index 98% rename from src/main/java/com/dfsek/terra/procgen/math/Vector2.java rename to src/main/java/com/dfsek/terra/api/generic/world/vector/Vector2.java index 6ec295b17..f98c2fb7a 100644 --- a/src/main/java/com/dfsek/terra/procgen/math/Vector2.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector2.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.procgen.math; +package com.dfsek.terra.api.generic.world.vector; import net.jafama.FastMath; diff --git a/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java b/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java new file mode 100644 index 000000000..48e38ebec --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java @@ -0,0 +1,104 @@ +package com.dfsek.terra.api.generic.world.vector; + +import com.dfsek.terra.api.generic.world.World; +import net.jafama.FastMath; + +public class Vector3 implements Cloneable { + private double x; + private double y; + private double z; + + public Vector3(double x, double y, double z) { + this.x = x; + this.y = y; + this.z = z; + } + + public double getZ() { + return z; + } + + public Vector3 setZ(double z) { + this.z = z; + return this; + } + + public double getX() { + return x; + } + + public Vector3 setX(double x) { + this.x = x; + return this; + } + + public double getY() { + return y; + } + + public Vector3 setY(double y) { + this.y = y; + return this; + } + + public int getBlockX() { + return FastMath.floorToInt(x); + } + + public int getBlockY() { + return FastMath.floorToInt(y); + } + + public int getBlockZ() { + return FastMath.floorToInt(z); + } + + public Vector3 multiply(int m) { + x *= m; + y *= m; + z *= m; + return this; + } + + public Vector3 add(double x, double y, double z) { + this.x += x; + this.y += y; + this.z += z; + return this; + } + + public Vector3 add(Vector3 other) { + this.x += other.getX(); + this.y += other.getY(); + this.z += other.getZ(); + return this; + } + + public Vector3 add(Vector2 other) { + this.x += other.getX(); + this.z += other.getZ(); + return this; + } + + public double lengthSq() { + return x * x + y * y + z * z; + } + + public double length() { + return FastMath.sqrt(lengthSq()); + } + + @Override + public Vector3 clone() { + try { + return (Vector3) super.clone(); + } catch(CloneNotSupportedException e) { + throw new Error(e); + } + } + + public Location toLocation(World world) { + return new Location(world, this.clone()); + } + +} diff --git a/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java b/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java index 85fbc414a..8d23c72c0 100644 --- a/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java +++ b/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java @@ -1,5 +1,6 @@ package com.dfsek.terra.biome.grid.master; +import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.UserDefinedGrid; @@ -7,7 +8,6 @@ import com.dfsek.terra.biome.postprocessing.CoordinatePerturb; import com.dfsek.terra.biome.postprocessing.ErosionNoise; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; -import com.dfsek.terra.procgen.math.Vector2; import net.jafama.FastMath; import org.bukkit.Location; import org.bukkit.World; diff --git a/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java b/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java index 3ade9babf..9c82b4e02 100644 --- a/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java +++ b/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java @@ -1,5 +1,6 @@ package com.dfsek.terra.biome.grid.master; +import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.UserDefinedGrid; @@ -7,7 +8,6 @@ import com.dfsek.terra.biome.postprocessing.CoordinatePerturb; import com.dfsek.terra.biome.postprocessing.ErosionNoise; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; -import com.dfsek.terra.procgen.math.Vector2; import org.bukkit.Location; import org.bukkit.World; import org.polydev.gaea.biome.Biome; diff --git a/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java b/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java index 334caefea..ce1ecdcd4 100644 --- a/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java +++ b/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.postprocessing; -import com.dfsek.terra.procgen.math.Vector2; +import com.dfsek.terra.api.generic.world.vector.Vector2; import org.polydev.gaea.math.FastNoiseLite; /** diff --git a/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java b/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java index f688b63b1..3285fa71c 100644 --- a/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java +++ b/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation.items; -import com.dfsek.terra.procgen.math.Vector2; +import com.dfsek.terra.api.generic.world.vector.Vector2; import org.bukkit.Chunk; import org.polydev.gaea.math.FastNoiseLite; import org.polydev.gaea.math.ProbabilityCollection; diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java b/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java index 2f8198000..29d2f462f 100644 --- a/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java +++ b/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java @@ -1,7 +1,7 @@ package com.dfsek.terra.generation.items.flora; +import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.generation.items.PlaceableLayer; -import com.dfsek.terra.procgen.math.Vector2; import org.bukkit.Chunk; import org.polydev.gaea.math.FastNoiseLite; import org.polydev.gaea.math.ProbabilityCollection; diff --git a/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index 54dfe5829..615510842 100644 --- a/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -1,7 +1,7 @@ package com.dfsek.terra.generation.items.tree; import com.dfsek.terra.Terra; -import com.dfsek.terra.procgen.math.Vector2; +import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.structure.Rotation; import com.dfsek.terra.structure.Structure; import com.dfsek.terra.structure.StructureContainedBlock; diff --git a/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java b/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java index bcc24f7c6..75edd2672 100644 --- a/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java +++ b/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java @@ -1,7 +1,7 @@ package com.dfsek.terra.generation.items.tree; +import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.generation.items.PlaceableLayer; -import com.dfsek.terra.procgen.math.Vector2; import org.bukkit.Chunk; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; diff --git a/src/main/java/com/dfsek/terra/population/CavePopulator.java b/src/main/java/com/dfsek/terra/population/CavePopulator.java index cae23efbc..9a32c1035 100644 --- a/src/main/java/com/dfsek/terra/population/CavePopulator.java +++ b/src/main/java/com/dfsek/terra/population/CavePopulator.java @@ -12,7 +12,6 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import org.bukkit.block.data.BlockData; import org.bukkit.generator.BlockPopulator; import org.jetbrains.annotations.NotNull; @@ -103,8 +102,4 @@ public class CavePopulator extends BlockPopulator { } } - - private boolean borderingOcean(Block b) { - return b.getRelative(BlockFace.UP).getType().equals(Material.WATER) || b.getType().equals(Material.LAVA); - } } diff --git a/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/src/main/java/com/dfsek/terra/population/FloraPopulator.java index 779e7d106..0327d641c 100644 --- a/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -2,10 +2,10 @@ package com.dfsek.terra.population; import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.items.flora.FloraLayer; -import com.dfsek.terra.procgen.math.Vector2; import org.bukkit.Chunk; import org.bukkit.World; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/src/main/java/com/dfsek/terra/population/StructurePopulator.java index 7185f7e1e..a08ca9428 100644 --- a/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -2,12 +2,12 @@ package com.dfsek.terra.population; import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.items.TerraStructure; -import com.dfsek.terra.procgen.math.Vector2; import com.dfsek.terra.structure.Rotation; import com.dfsek.terra.structure.Structure; import com.dfsek.terra.structure.StructureContainedInventory; diff --git a/src/main/java/com/dfsek/terra/population/TreePopulator.java b/src/main/java/com/dfsek/terra/population/TreePopulator.java index b2b2a95fe..f2524eec5 100644 --- a/src/main/java/com/dfsek/terra/population/TreePopulator.java +++ b/src/main/java/com/dfsek/terra/population/TreePopulator.java @@ -2,10 +2,10 @@ package com.dfsek.terra.population; import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.items.tree.TreeLayer; -import com.dfsek.terra.procgen.math.Vector2; import net.jafama.FastMath; import org.bukkit.Chunk; import org.bukkit.World; diff --git a/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java b/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java index fde36b4f0..5988a3295 100644 --- a/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java +++ b/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java @@ -1,6 +1,6 @@ package com.dfsek.terra.procgen.pixel; -import com.dfsek.terra.procgen.math.Vector2; +import com.dfsek.terra.api.generic.world.vector.Vector2; import java.util.Set; diff --git a/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java b/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java index fb2df4824..019ddb912 100644 --- a/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java +++ b/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java @@ -1,6 +1,6 @@ package com.dfsek.terra.procgen.pixel; -import com.dfsek.terra.procgen.math.Vector2; +import com.dfsek.terra.api.generic.world.vector.Vector2; import net.jafama.FastMath; import java.util.HashSet; diff --git a/src/main/java/com/dfsek/terra/structure/Structure.java b/src/main/java/com/dfsek/terra/structure/Structure.java index 7b541b19d..d42800441 100644 --- a/src/main/java/com/dfsek/terra/structure/Structure.java +++ b/src/main/java/com/dfsek/terra/structure/Structure.java @@ -2,8 +2,8 @@ package com.dfsek.terra.structure; import com.dfsek.terra.Terra; import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.procgen.math.Vector2; import com.dfsek.terra.util.structure.RotationUtil; import net.jafama.FastMath; import org.bukkit.Bukkit; diff --git a/src/main/java/com/dfsek/terra/structure/StructureInfo.java b/src/main/java/com/dfsek/terra/structure/StructureInfo.java index e08fddcbf..0cff30ca6 100644 --- a/src/main/java/com/dfsek/terra/structure/StructureInfo.java +++ b/src/main/java/com/dfsek/terra/structure/StructureInfo.java @@ -1,6 +1,6 @@ package com.dfsek.terra.structure; -import com.dfsek.terra.procgen.math.Vector2; +import com.dfsek.terra.api.generic.world.vector.Vector2; import net.jafama.FastMath; import java.io.Serializable; diff --git a/src/main/java/com/dfsek/terra/util/structure/RotationUtil.java b/src/main/java/com/dfsek/terra/util/structure/RotationUtil.java index c83661315..cd563e73e 100644 --- a/src/main/java/com/dfsek/terra/util/structure/RotationUtil.java +++ b/src/main/java/com/dfsek/terra/util/structure/RotationUtil.java @@ -1,6 +1,6 @@ package com.dfsek.terra.util.structure; -import com.dfsek.terra.procgen.math.Vector2; +import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.structure.Rotation; import com.google.common.collect.Sets; import net.jafama.FastMath; From 95e39324c71d95edea8e2cb64e10549b4dff15dc Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 10:46:56 -0700 Subject: [PATCH 004/210] Dump Gaea into Terra. --- build.gradle.kts | 9 +- src/main/java/com/dfsek/terra/Terra.java | 10 +- .../java/com/dfsek/terra/TerraProfiler.java | 6 +- src/main/java/com/dfsek/terra/TerraWorld.java | 2 +- .../java/com/dfsek/terra/api/gaea/Debug.java | 26 + .../java/com/dfsek/terra/api/gaea/Gaea.java | 19 + .../com/dfsek/terra/api/gaea/GaeaPlugin.java | 11 + .../com/dfsek/terra/api/gaea/biome/Biome.java | 40 + .../dfsek/terra/api/gaea/biome/BiomeGrid.java | 121 + .../dfsek/terra/api/gaea/biome/Decorator.java | 22 + .../dfsek/terra/api/gaea/biome/Generator.java | 52 + .../api/gaea/biome/NormalizationUtil.java | 48 + .../dfsek/terra/api/gaea/command/Command.java | 111 + .../terra/api/gaea/command/DebugCommand.java | 8 + .../terra/api/gaea/command/PlayerCommand.java | 49 + .../terra/api/gaea/command/WorldCommand.java | 54 + .../gaea/generation/GaeaChunkGenerator.java | 86 + .../api/gaea/generation/GenerationPhase.java | 8 + .../gaea/generation/GenerationPopulator.java | 11 + .../dfsek/terra/api/gaea/lang/Language.java | 40 + .../dfsek/terra/api/gaea/lang/Message.java | 12 + .../terra/api/gaea/lang/MultiLineMessage.java | 34 + .../api/gaea/lang/SingleLineMessage.java | 29 + .../api/gaea/math/ChunkInterpolator.java | 32 + .../api/gaea/math/ChunkInterpolator2.java | 72 + .../api/gaea/math/ChunkInterpolator3.java | 137 + .../terra/api/gaea/math/FastNoiseLite.java | 2599 +++++++++++++++++ .../terra/api/gaea/math/Interpolator.java | 61 + .../terra/api/gaea/math/Interpolator3.java | 40 + .../dfsek/terra/api/gaea/math/MathUtil.java | 58 + .../api/gaea/math/ProbabilityCollection.java | 49 + .../com/dfsek/terra/api/gaea/math/Range.java | 123 + .../api/gaea/population/ChunkCoordinate.java | 49 + .../gaea/population/GaeaBlockPopulator.java | 11 + .../gaea/population/PopulationManager.java | 94 + .../terra/api/gaea/profiler/DataHolder.java | 45 + .../terra/api/gaea/profiler/DataType.java | 24 + .../dfsek/terra/api/gaea/profiler/Desire.java | 36 + .../terra/api/gaea/profiler/Measurement.java | 94 + .../api/gaea/profiler/ProfileFuture.java | 18 + .../api/gaea/profiler/WorldProfiler.java | 88 + .../gaea/serial/MovedObjectInputStream.java | 50 + .../terra/api/gaea/structures/loot/Entry.java | 101 + .../api/gaea/structures/loot/LootTable.java | 77 + .../terra/api/gaea/structures/loot/Pool.java | 57 + .../loot/functions/AmountFunction.java | 37 + .../loot/functions/DamageFunction.java | 42 + .../functions/EnchantWithLevelsFunction.java | 61 + .../structures/loot/functions/Function.java | 19 + .../terra/api/gaea/tree/CustomTreeType.java | 66 + .../com/dfsek/terra/api/gaea/tree/Tree.java | 14 + .../dfsek/terra/api/gaea/tree/TreeType.java | 105 + .../gaea/tree/fractal/EntitySpawnHolder.java | 31 + .../api/gaea/tree/fractal/FractalTree.java | 112 + .../api/gaea/tree/fractal/TreeGeometry.java | 66 + .../api/gaea/tree/fractal/TreeGetter.java | 9 + .../api/gaea/tree/fractal/trees/Cactus.java | 28 + .../api/gaea/tree/fractal/trees/IceSpike.java | 47 + .../api/gaea/tree/fractal/trees/OakTree.java | 59 + .../api/gaea/tree/fractal/trees/Rock.java | 47 + .../tree/fractal/trees/ShatteredPillar.java | 52 + .../tree/fractal/trees/ShatteredTree.java | 66 + .../fractal/trees/SmallShatteredPillar.java | 28 + .../fractal/trees/SmallShatteredTree.java | 66 + .../gaea/tree/fractal/trees/SpruceTree.java | 46 + .../dfsek/terra/api/gaea/util/FastRandom.java | 64 + .../dfsek/terra/api/gaea/util/GlueList.java | 1048 +++++++ .../dfsek/terra/api/gaea/util/JarUtil.java | 38 + .../api/gaea/util/SerializationUtil.java | 26 + .../dfsek/terra/api/gaea/util/WorldUtil.java | 46 + .../com/dfsek/terra/api/gaea/world/Flora.java | 14 + .../dfsek/terra/api/gaea/world/FloraType.java | 86 + .../com/dfsek/terra/api/gaea/world/Ore.java | 21 + .../terra/api/gaea/world/carving/Carver.java | 59 + .../terra/api/gaea/world/carving/Worm.java | 119 + .../terra/api/gaea/world/palette/Palette.java | 116 + .../api/gaea/world/palette/RandomPalette.java | 20 + .../gaea/world/palette/SimplexPalette.java | 21 + .../api/generic/generator/ChunkGenerator.java | 23 + .../dfsek/terra/async/AsyncBiomeFinder.java | 4 +- .../terra/async/AsyncStructureFinder.java | 2 +- .../java/com/dfsek/terra/biome/BiomeZone.java | 6 +- .../dfsek/terra/biome/UserDefinedBiome.java | 18 +- .../terra/biome/grid/SingleBiomeGrid.java | 6 +- .../terra/biome/grid/UserDefinedGrid.java | 8 +- .../biome/grid/master/TerraBiomeGrid.java | 2 +- .../grid/master/TerraRadialBiomeGrid.java | 6 +- .../grid/master/TerraStandardBiomeGrid.java | 4 +- .../terra/biome/palette/PaletteHolder.java | 2 +- .../biome/palette/PaletteHolderBuilder.java | 2 +- .../terra/biome/palette/PaletteLayer.java | 2 +- .../terra/biome/palette/SinglePalette.java | 2 +- .../postprocessing/CoordinatePerturb.java | 2 +- .../biome/postprocessing/ErosionNoise.java | 2 +- .../com/dfsek/terra/carving/CarverCache.java | 12 +- .../dfsek/terra/carving/CarverPalette.java | 2 +- .../java/com/dfsek/terra/carving/Cavern.java | 6 +- .../terra/carving/UserDefinedCarver.java | 10 +- .../dfsek/terra/command/FixChunkCommand.java | 6 +- .../com/dfsek/terra/command/OreCommand.java | 6 +- .../com/dfsek/terra/command/PacksCommand.java | 2 +- .../dfsek/terra/command/ReloadCommand.java | 4 +- .../dfsek/terra/command/SaveDataCommand.java | 4 +- .../com/dfsek/terra/command/TerraCommand.java | 4 +- .../dfsek/terra/command/VersionCommand.java | 2 +- .../terra/command/biome/BiomeCommand.java | 8 +- .../terra/command/biome/BiomeInfoCommand.java | 6 +- .../command/biome/BiomeLocateCommand.java | 6 +- .../geometry/DeformedSphereCommand.java | 8 +- .../command/geometry/GeometryCommand.java | 8 +- .../terra/command/geometry/SphereCommand.java | 6 +- .../terra/command/geometry/TubeCommand.java | 6 +- .../terra/command/image/ImageCommand.java | 6 +- .../terra/command/image/RenderCommand.java | 6 +- .../terra/command/image/gui/GUICommand.java | 8 +- .../command/image/gui/RawGUICommand.java | 6 +- .../command/image/gui/StepGUICommand.java | 6 +- .../terra/command/profile/ProfileCommand.java | 6 +- .../terra/command/profile/QueryCommand.java | 8 +- .../terra/command/profile/ResetCommand.java | 8 +- .../terra/command/profile/StartCommand.java | 8 +- .../terra/command/profile/StopCommand.java | 8 +- .../command/structure/ExportCommand.java | 6 +- .../command/structure/LocateCommand.java | 6 +- .../terra/command/structure/SpawnCommand.java | 8 +- .../command/structure/StructureCommand.java | 6 +- .../command/structure/load/LoadCommand.java | 8 +- .../structure/load/LoadFullCommand.java | 6 +- .../structure/load/LoadRawCommand.java | 6 +- .../dfsek/terra/config/base/ConfigPack.java | 10 +- .../dfsek/terra/config/base/PluginConfig.java | 4 +- .../builder/biomegrid/BiomeGridBuilder.java | 2 +- .../builder/biomegrid/SingleGridBuilder.java | 2 +- .../biomegrid/UserDefinedGridBuilder.java | 2 +- .../terra/config/factories/BiomeFactory.java | 2 +- .../config/factories/BiomeGridFactory.java | 2 +- .../terra/config/factories/CarverFactory.java | 2 +- .../terra/config/factories/FloraFactory.java | 8 +- .../config/factories/PaletteFactory.java | 10 +- .../terra/config/factories/TreeFactory.java | 2 +- .../com/dfsek/terra/config/lang/LangUtil.java | 4 +- .../terra/config/loaders/LootTableLoader.java | 2 +- .../loaders/ProbabilityCollectionLoader.java | 2 +- .../terra/config/loaders/RangeLoader.java | 2 +- .../com/dfsek/terra/config/loaders/Types.java | 8 +- .../loaders/config/FloraLayerLoader.java | 8 +- .../loaders/config/NoiseBuilderLoader.java | 2 +- .../loaders/config/OreConfigLoader.java | 2 +- .../config/StructureFeatureLoader.java | 2 +- .../loaders/config/TreeLayerLoader.java | 10 +- .../loaders/palette/CarverPaletteLoader.java | 2 +- .../loaders/palette/PaletteHolderLoader.java | 2 +- .../loaders/palette/PaletteLayerLoader.java | 2 +- .../config/templates/BiomeGridTemplate.java | 2 +- .../terra/config/templates/BiomeTemplate.java | 4 +- .../config/templates/CarverTemplate.java | 2 +- .../terra/config/templates/OreTemplate.java | 2 +- .../config/templates/StructureTemplate.java | 8 +- .../terra/config/templates/TreeTemplate.java | 2 +- .../com/dfsek/terra/debug/gui/DebugFrame.java | 2 +- .../generation/ElevationInterpolator.java | 4 +- .../com/dfsek/terra/generation/Sampler.java | 2 +- .../terra/generation/TerraChunkGenerator.java | 22 +- .../generation/UserDefinedDecorator.java | 8 +- .../terra/generation/config/NoiseBuilder.java | 2 +- .../generation/config/WorldGenerator.java | 8 +- .../generation/items/PlaceableLayer.java | 6 +- .../generation/items/TerraStructure.java | 6 +- .../generation/items/flora/BlockFlora.java | 6 +- .../generation/items/flora/FloraLayer.java | 8 +- .../generation/items/flora/TerraFlora.java | 10 +- .../items/ores/DeformedSphereOre.java | 4 +- .../generation/items/ores/OreConfig.java | 2 +- .../generation/items/ores/OreHolder.java | 2 +- .../generation/items/ores/VanillaOre.java | 2 +- .../generation/items/tree/TerraTree.java | 4 +- .../generation/items/tree/TreeLayer.java | 12 +- .../com/dfsek/terra/image/ImageLoader.java | 2 +- .../terra/image/WorldImageGenerator.java | 2 +- .../dfsek/terra/listeners/EventListener.java | 6 +- .../com/dfsek/terra/math/NoiseFunction2.java | 2 +- .../com/dfsek/terra/math/NoiseFunction3.java | 2 +- .../com/dfsek/terra/math/RandomFunction.java | 4 +- .../dfsek/terra/population/CavePopulator.java | 2 +- .../terra/population/FloraPopulator.java | 6 +- .../dfsek/terra/population/OrePopulator.java | 12 +- .../terra/population/StructurePopulator.java | 6 +- .../dfsek/terra/population/TreePopulator.java | 6 +- .../com/dfsek/terra/procgen/GridSpawn.java | 6 +- .../terra/procgen/voxel/DeformedSphere.java | 2 +- .../terra/procgen/voxel/VoxelGeometry.java | 2 +- .../dfsek/terra/registry/FloraRegistry.java | 4 +- .../dfsek/terra/registry/PaletteRegistry.java | 2 +- .../dfsek/terra/registry/TreeRegistry.java | 4 +- .../com/dfsek/terra/structure/Structure.java | 2 +- .../structure/features/EntityFeature.java | 8 +- .../dfsek/terra/structure/spawn/AirSpawn.java | 2 +- .../terra/structure/spawn/LandSpawn.java | 2 +- .../terra/structure/spawn/OceanSpawn.java | 2 +- .../terra/structure/spawn/Requirement.java | 2 +- .../com/dfsek/terra/util/PaletteUtil.java | 6 +- .../com/dfsek/terra/util/PopulationUtil.java | 4 +- .../java/com/dfsek/terra/util/SlabUtil.java | 2 +- src/test/java/DistributionTest.java | 2 +- src/test/java/LookupGenerator.java | 4 +- .../java/NoiseInstancePerformanceTest.java | 2 +- src/test/java/RangeTest.java | 2 +- 207 files changed, 7719 insertions(+), 330 deletions(-) create mode 100644 src/main/java/com/dfsek/terra/api/gaea/Debug.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/Gaea.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/GaeaPlugin.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/biome/Decorator.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/biome/NormalizationUtil.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/command/Command.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/command/DebugCommand.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/command/PlayerCommand.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/command/WorldCommand.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/generation/GaeaChunkGenerator.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPhase.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPopulator.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/lang/Language.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/lang/Message.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator2.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/math/FastNoiseLite.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/math/Interpolator.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/math/Interpolator3.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/math/MathUtil.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/math/Range.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/population/GaeaBlockPopulator.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/profiler/DataHolder.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/profiler/DataType.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/profiler/Measurement.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/profiler/ProfileFuture.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/serial/MovedObjectInputStream.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/EnchantWithLevelsFunction.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java create mode 100755 src/main/java/com/dfsek/terra/api/gaea/tree/CustomTreeType.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGetter.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Rock.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/util/FastRandom.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/util/GlueList.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/util/JarUtil.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/util/WorldUtil.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/world/Flora.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java create mode 100755 src/main/java/com/dfsek/terra/api/gaea/world/Ore.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/world/palette/Palette.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/world/palette/RandomPalette.java create mode 100644 src/main/java/com/dfsek/terra/api/gaea/world/palette/SimplexPalette.java diff --git a/build.gradle.kts b/build.gradle.kts index 01ddba7bc..b84e53fba 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -18,6 +18,7 @@ repositories { maven { url = uri("http://maven.enginehub.org/repo/") } maven { url = uri("https://repo.codemc.org/repository/maven-public") } maven { url = uri("https://papermc.io/repo/repository/maven-public/") } + maven { url = uri("https://repo.aikar.co/content/groups/aikar/") } } java { @@ -30,9 +31,9 @@ val versionObj = Version("2", "2", "0", true) version = versionObj dependencies { - val gaeaVersion = "1.15.0" - compileOnly("org.polydev.gaea:Gaea:${gaeaVersion}") - testImplementation("org.polydev.gaea:Gaea:${gaeaVersion}") + implementation("org.apache.commons:commons-rng-core:1.3") + implementation("net.jafama:jafama:2.3.2") + implementation("co.aikar:taskchain-bukkit:3.7.2") compileOnly("org.jetbrains:annotations:20.1.0") @@ -100,6 +101,8 @@ tasks.named("shadowJar") { relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") relocate("net.jafama", "com.dfsek.terra.lib.jafama") relocate("com.dfsek.tectonic", "com.dfsek.terra.lib.tectonic") + relocate("net.jafama", "com.dfsek.terra.lib.jafama") + relocate("co.aikar.taskchain", "com.dfsek.terra.lib.taskchain") minimize() } diff --git a/src/main/java/com/dfsek/terra/Terra.java b/src/main/java/com/dfsek/terra/Terra.java index 6a1203ed2..7abcf65b2 100644 --- a/src/main/java/com/dfsek/terra/Terra.java +++ b/src/main/java/com/dfsek/terra/Terra.java @@ -2,6 +2,11 @@ package com.dfsek.terra; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.bukkit.BukkitWorldHandle; +import com.dfsek.terra.api.gaea.GaeaPlugin; +import com.dfsek.terra.api.gaea.generation.GaeaChunkGenerator; +import com.dfsek.terra.api.gaea.lang.Language; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; @@ -56,11 +61,6 @@ import org.bukkit.entity.EntityType; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.polydev.gaea.GaeaPlugin; -import org.polydev.gaea.generation.GaeaChunkGenerator; -import org.polydev.gaea.lang.Language; -import org.polydev.gaea.math.ProbabilityCollection; -import org.polydev.gaea.math.Range; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/dfsek/terra/TerraProfiler.java b/src/main/java/com/dfsek/terra/TerraProfiler.java index a0b03a9e0..34a17cccd 100644 --- a/src/main/java/com/dfsek/terra/TerraProfiler.java +++ b/src/main/java/com/dfsek/terra/TerraProfiler.java @@ -1,9 +1,9 @@ package com.dfsek.terra; +import com.dfsek.terra.api.gaea.profiler.DataType; +import com.dfsek.terra.api.gaea.profiler.Measurement; +import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import org.bukkit.World; -import org.polydev.gaea.profiler.DataType; -import org.polydev.gaea.profiler.Measurement; -import org.polydev.gaea.profiler.WorldProfiler; public class TerraProfiler extends WorldProfiler { public TerraProfiler(World w) { diff --git a/src/main/java/com/dfsek/terra/TerraWorld.java b/src/main/java/com/dfsek/terra/TerraWorld.java index 8d2fa9d92..8e9812f84 100644 --- a/src/main/java/com/dfsek/terra/TerraWorld.java +++ b/src/main/java/com/dfsek/terra/TerraWorld.java @@ -1,5 +1,6 @@ package com.dfsek.terra; +import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.biome.grid.master.TerraRadialBiomeGrid; @@ -11,7 +12,6 @@ import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.TerraChunkGenerator; import org.bukkit.Bukkit; import org.bukkit.World; -import org.polydev.gaea.biome.BiomeGrid; public class TerraWorld { private final TerraBiomeGrid grid; diff --git a/src/main/java/com/dfsek/terra/api/gaea/Debug.java b/src/main/java/com/dfsek/terra/api/gaea/Debug.java new file mode 100644 index 000000000..38fa01148 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/Debug.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.api.gaea; + +import org.bukkit.plugin.java.JavaPlugin; + +public class Debug { + public static JavaPlugin main; + + public static void setMain(JavaPlugin main) { + Debug.main = main; + } + + public static void info(String message) { + if(Gaea.isDebug()) main.getLogger().info(message); + } + public static void warn(String message) { + if(Gaea.isDebug()) main.getLogger().warning(message); + } + + public static void error(String message) { + if(Gaea.isDebug()) main.getLogger().severe(message); + } + + public static void stack(Exception e) { + if(Gaea.isDebug()) e.printStackTrace(); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/Gaea.java b/src/main/java/com/dfsek/terra/api/gaea/Gaea.java new file mode 100644 index 000000000..50623d482 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/Gaea.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.api.gaea; + +import org.bukkit.World; + +import java.io.File; + +public class Gaea { + private static boolean debug; + + public static File getGaeaFolder(World w) { + File f = new File(w.getWorldFolder(), "gaea"); + f.mkdirs(); + return f; + } + + public static boolean isDebug() { + return debug; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/GaeaPlugin.java b/src/main/java/com/dfsek/terra/api/gaea/GaeaPlugin.java new file mode 100644 index 000000000..f835ac2ca --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/GaeaPlugin.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.gaea; + +import com.dfsek.terra.api.gaea.generation.GaeaChunkGenerator; +import com.dfsek.terra.api.gaea.lang.Language; +import org.bukkit.plugin.java.JavaPlugin; + +public abstract class GaeaPlugin extends JavaPlugin { + public abstract boolean isDebug(); + public abstract Class getGeneratorClass(); + public abstract Language getLanguage(); +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java b/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java new file mode 100644 index 000000000..12e0a7b6d --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.api.gaea.biome; + +import org.bukkit.World; + +/** + * Interface to be implemented by a custom generator's Biome enum.
+ * Represents a custom biome, and contains methods to retrieve information about each type. + */ +public interface Biome { + + /** + * Gets the Vanilla biome to represent the custom biome. + * + * @return Biome - The Vanilla biome. + */ + org.bukkit.block.Biome getVanillaBiome(); + + /** + * Gets the BiomeTerrain instance used to generate the biome. + * + * @return BiomeTerrain - The terrain generation instance. + */ + Generator getGenerator(); + + /** + * Returns the Decorator instance containing information about the population in the biome. + * + * @return Decorator - the Decorator instance. + */ + Decorator getDecorator(); + + /** + * Gets the BiomeTerrain instance used to generate the biome in this world. + * + * @return BiomeTerrain - The terrain generation instance. + */ + default Generator getGenerator(World w) { + return getGenerator(); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java b/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java new file mode 100644 index 000000000..f166570ab --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java @@ -0,0 +1,121 @@ +package com.dfsek.terra.api.gaea.biome; + +import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import org.bukkit.Location; +import org.bukkit.World; + +public abstract class BiomeGrid { + private final FastNoiseLite noiseX; + private final FastNoiseLite noiseZ; + private final World world; + private final int sizeX; + private final int sizeZ; + private Biome[][] grid; + + + public BiomeGrid(World w, double freq1, double freq2, int sizeX, int sizeZ) { + this.sizeX = sizeX; + this.sizeZ = sizeZ; + this.world = w; + this.noiseX = new FastNoiseLite((int) w.getSeed()); + this.noiseZ = new FastNoiseLite((int) w.getSeed() + 1); + this.noiseX.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); + this.noiseX.setFractalType(FastNoiseLite.FractalType.FBm); + this.noiseX.setFractalOctaves(4); + this.noiseZ.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); + this.noiseZ.setFractalType(FastNoiseLite.FractalType.FBm); + this.noiseZ.setFractalOctaves(4); + this.noiseX.setFrequency(freq1); + this.noiseZ.setFrequency(freq2); + } + + + /** + * Gets the biome at a pair of coordinates. + * + * @param x - X-coordinate at which to fetch biome + * @param z - Z-coordinate at which to fetch biome + * @return Biome - Biome at the given coordinates. + */ + public Biome getBiome(int x, int z, GenerationPhase phase) { + return grid[getBiomeNoiseX(x, z)][getBiomeNoiseZ(x, z)]; + } + + /** + * Gets the biome at a location. + * + * @param l - The location at which to fetch the biome. + * @return Biome - Biome at the given coordinates. + */ + public Biome getBiome(Location l) { + return getBiome(l, GenerationPhase.POST_GEN); + } + + public double[] getRawNoise(int x, int z) { + return new double[] {noiseX.getNoise(x, z), noiseZ.getNoise(x, z)}; + } + + /** + * Get the raw X-noise for coordinates in the Grid. + * + * @param x X coordinate + * @param z Z coordinate + * @return Normalized noise + */ + public int getBiomeNoiseX(int x, int z) { + return normalize(noiseX.getNoise(x, z), sizeX); + } + + /** + * Get the raw Z-noise for coordinates in the Grid. + * + * @param x X coordinate + * @param z Z coordinate + * @return Normalized noise + */ + public int getBiomeNoiseZ(int x, int z) { + return normalize(noiseZ.getNoise(x, z), sizeZ); + } + + public Biome[][] getGrid() { + return grid; + } + + public void setGrid(Biome[][] grid) { + if(grid.length != sizeX) throw new IllegalArgumentException("Invalid length for grid, expected " + sizeX + ", got " + grid.length); + for(Biome[] gridLayer : grid) { + if(gridLayer.length != sizeZ) throw new IllegalArgumentException("Invalid length for grid layer, expected " + sizeZ + ", got " + gridLayer.length); + } + this.grid = grid; + } + + public Biome getBiome(Location l, GenerationPhase phase) { + double biomeNoise = noiseX.getNoise(l.getBlockX(), l.getBlockZ()); + double climateNoise = noiseZ.getNoise(l.getBlockX(), l.getBlockZ()); + return grid[normalize(biomeNoise, sizeX)][normalize(climateNoise, sizeZ)]; + } + + public World getWorld() { + return world; + } + + public int getSizeX() { + return sizeX; + } + + public int getSizeZ() { + return sizeZ; + } + + /** + * Takes a noise input and normalizes it to a value between 0 and 15 inclusive. + * + * @param i - The noise value to normalize. + * @return int - The normalized value. + */ + protected int normalize(double i, int range) { + return NormalizationUtil.normalize(i, range, 4); + } + +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/biome/Decorator.java b/src/main/java/com/dfsek/terra/api/gaea/biome/Decorator.java new file mode 100644 index 000000000..b4353cc85 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/biome/Decorator.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.api.gaea.biome; + +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.tree.Tree; +import com.dfsek.terra.api.gaea.world.Flora; + +public abstract class Decorator { + + + public abstract ProbabilityCollection getTrees(); + + public abstract int getTreeDensity(); + + public abstract boolean overrideStructureChance(); + + public abstract org.bukkit.block.Biome getVanillaBiome(); + + public abstract ProbabilityCollection getFlora(); + + public abstract int getFloraChance(); + +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java b/src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java new file mode 100644 index 000000000..a878a2253 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.api.gaea.biome; + +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.math.Interpolator; +import com.dfsek.terra.api.gaea.world.palette.Palette; +import org.bukkit.World; +import org.bukkit.block.data.BlockData; + +public abstract class Generator { + /** + * Gets the 2D noise at a pair of coordinates using the provided FastNoiseLite instance. + * + * @param gen - The FastNoiseLite instance to use. + * @param x - The x coordinate. + * @param z - The z coordinate. + * @return double - Noise value at the specified coordinates. + */ + public abstract double getNoise(FastNoiseLite gen, World w, int x, int z); + + /** + * Gets the 3D noise at a pair of coordinates using the provided FastNoiseLite instance. + * + * @param gen - The FastNoiseLite instance to use. + * @param x - The x coordinate. + * @param y - The y coordinate. + * @param z - The z coordinate. + * @return double - Noise value at the specified coordinates. + */ + public abstract double getNoise(FastNoiseLite gen, World w, int x, int y, int z); + + /** + * Gets the BlocPalette to generate the biome with. + * + * @return BlocPalette - The biome's palette. + */ + public abstract Palette getPalette(int y); + + /** + * Returns true if the biome should be interpolated just once, false to use advanced interpolation + blending. + * @return Whether biome should use minimal interpolation + */ + public abstract boolean useMinimalInterpolation(); + + + /** + * Get the type of interpolation to use in this biome. + * @return Interpolation type + */ + public Interpolator.Type getInterpolationType() { + return Interpolator.Type.LINEAR; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/biome/NormalizationUtil.java b/src/main/java/com/dfsek/terra/api/gaea/biome/NormalizationUtil.java new file mode 100644 index 000000000..0943a70a9 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/biome/NormalizationUtil.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.api.gaea.biome; + +import net.jafama.FastMath; + +/** + * Ultra-fast normalization utility for pre-defined lookup table based on 160 million points of Cellular noise generated from 1-octave Simplex noise. + */ +public class NormalizationUtil { + private static final double[] normalMap4 = new double[] {- 0.5522426962852478D, - 0.5356624126434326D, - 0.5250319838523865D, - 0.5172030329704285D, - 0.5108230710029602D, - 0.5051751136779785D, - 0.5003848075866699D, - 0.496286541223526D, - 0.49219056963920593D, - 0.488725870847702D, - 0.48548242449760437D, - 0.48233601450920105D, - 0.4794590473175049D, - 0.47680431604385376D, - 0.4741802513599396D, - 0.4716983437538147D, - 0.46938973665237427D, - 0.4671768844127655D, - 0.46493932604789734D, - 0.4628496468067169D, - 0.46085309982299805D, - 0.45893776416778564D, - 0.4571230709552765D, - 0.45534923672676086D, - 0.4535684585571289D, - 0.4518905282020569D, - 0.45032820105552673D, - 0.44873151183128357D, - 0.4472157657146454D, - 0.445724755525589D, - 0.4442773759365082D, - 0.44282811880111694D, - 0.44138428568840027D, - 0.43998438119888306D, - 0.43863797187805176D, - 0.4373200237751007D, - 0.43603432178497314D, - 0.4348065257072449D, - 0.4335438907146454D, - 0.43234220147132874D, - 0.4311666488647461D, - 0.42999887466430664D, - 0.4288702607154846D, - 0.4277186393737793D, - 0.42660200595855713D, - 0.425540030002594D, - 0.42445454001426697D, - 0.42338213324546814D, - 0.42237231135368347D, - 0.4213787317276001D, - 0.42034342885017395D, - 0.41934314370155334D, - 0.41838738322257996D, - 0.41747593879699707D, - 0.4165368676185608D, - 0.41563472151756287D, - 0.41473135352134705D, - 0.41381341218948364D, - 0.412920743227005D, - 0.4120390713214874D, - 0.41113483905792236D, - 0.41027551889419556D, - 0.40940171480178833D, - 0.4085462987422943D, - 0.40771594643592834D, - 0.4068986475467682D, - 0.4060843288898468D, - 0.4052877426147461D, - 0.40450364351272583D, - 0.40370258688926697D, - 0.40295007824897766D, - 0.4022042751312256D, - 0.40143170952796936D, - 0.40068766474723816D, - 0.3999272882938385D, - 0.39916759729385376D, - 0.3984144926071167D, - 0.3977096378803253D, - 0.3969724774360657D, - 0.3962542712688446D, - 0.3955434262752533D, - 0.39482179284095764D, - 0.39413219690322876D, - 0.3934393525123596D, - 0.39274853467941284D, - 0.3920603394508362D, - 0.3913818895816803D, - 0.3907110095024109D, - 0.39001911878585815D, - 0.3893643021583557D, - 0.38873276114463806D, - 0.38809072971343994D, - 0.38744935393333435D, - 0.38681110739707947D, - 0.38617849349975586D, - 0.3855555057525635D, - 0.3849259316921234D, - 0.38428404927253723D, - 0.38368701934814453D, - 0.38305720686912537D, - 0.3824397325515747D, - 0.38183310627937317D, - 0.3812190294265747D, - 0.38061732053756714D, - 0.3800400495529175D, - 0.37945547699928284D, - 0.37887564301490784D, - 0.3783135712146759D, - 0.3777320683002472D, - 0.3771609365940094D, - 0.3765930235385895D, - 0.3760446608066559D, - 0.37546253204345703D, - 0.37489989399909973D, - 0.37433329224586487D, - 0.3737635910511017D, - 0.37320101261138916D, - 0.37265515327453613D, - 0.3721090257167816D, - 0.3715764880180359D, - 0.3710474967956543D, - 0.3705263137817383D, - 0.37000274658203125D, - 0.36946558952331543D, - 0.3689403533935547D, - 0.3684338629245758D, - 0.3679268956184387D, - 0.3674132525920868D, - 0.3668895363807678D, - 0.36637264490127563D, - 0.3658500015735626D, - 0.3653477430343628D, - 0.3648494482040405D, - 0.3643417954444885D, - 0.36385640501976013D, - 0.36335185170173645D, - 0.3628855347633362D, - 0.3624073565006256D, - 0.3619007468223572D, - 0.36142677068710327D, - 0.3609183132648468D, - 0.3604544401168823D, - 0.3599613606929779D, - 0.3594810962677002D, - 0.3590005338191986D, - 0.3585355281829834D, - 0.35805660486221313D, - 0.35758334398269653D, - 0.3571120500564575D, - 0.356632798910141D, - 0.35616397857666016D, - 0.3557022213935852D, - 0.35522621870040894D, - 0.35475999116897583D, - 0.3543040454387665D, - 0.3538462817668915D, - 0.35339656472206116D, - 0.35294967889785767D, - 0.3525013029575348D, - 0.35205140709877014D, - 0.3516044616699219D, - 0.3511776924133301D, - 0.3507419228553772D, - 0.350308358669281D, - 0.34987354278564453D, - 0.3494442403316498D, - 0.34901976585388184D, - 0.34858623147010803D, - 0.3481590747833252D, - 0.3477269113063812D, - 0.34729984402656555D, - 0.34686949849128723D, - 0.34644952416419983D, - 0.3460380733013153D, - 0.345601350069046D, - 0.3451806306838989D, - 0.34476256370544434D, - 0.3443388342857361D, - 0.34393346309661865D, - 0.3435156047344208D, - 0.34309715032577515D, - 0.34269776940345764D, - 0.34230056405067444D, - 0.34190237522125244D, - 0.3415068984031677D, - 0.3411085307598114D, - 0.3407077193260193D, - 0.3403150737285614D, - 0.3399060070514679D, - 0.3395008146762848D, - 0.33910876512527466D, - 0.3387194573879242D, - 0.3383338451385498D, - 0.3379477858543396D, - 0.33756473660469055D, - 0.33716049790382385D, - 0.336769163608551D, - 0.33637988567352295D, - 0.3360031843185425D, - 0.33561065793037415D, - 0.33522093296051025D, - 0.33484047651290894D, - 0.3344566524028778D, - 0.3340719938278198D, - 0.33369651436805725D, - 0.33331871032714844D, - 0.3329450190067291D, - 0.3325762152671814D, - 0.3321962356567383D, - 0.3318250775337219D, - 0.33146360516548157D, - 0.331096351146698D, - 0.3307240307331085D, - 0.33036690950393677D, - 0.3300083577632904D, - 0.3296314477920532D, - 0.32925838232040405D, - 0.3289034366607666D, - 0.32853060960769653D, - 0.3281768262386322D, - 0.32781481742858887D, - 0.32745665311813354D, - 0.3271014988422394D, - 0.3267449736595154D, - 0.32637742161750793D, - 0.32601433992385864D, - 0.3256617784500122D, - 0.325309157371521D, - 0.32495537400245667D, - 0.3246041238307953D, - 0.324260413646698D, - 0.32391706109046936D, - 0.32356011867523193D, - 0.3232196569442749D, - 0.3228764235973358D, - 0.3225192129611969D, - 0.3221615254878998D, - 0.32181763648986816D, - 0.32147231698036194D, - 0.32113757729530334D, - 0.3207913041114807D, - 0.3204527795314789D, - 0.3200984597206116D, - 0.31977012753486633D, - 0.3194332718849182D, - 0.31908634305000305D, - 0.3187503516674042D, - 0.3184075951576233D, - 0.3180627226829529D, - 0.3177427053451538D, - 0.31741446256637573D, - 0.31707704067230225D, - 0.316744863986969D, - 0.31642594933509827D, - 0.3161090612411499D, - 0.31578725576400757D, - 0.3154592216014862D, - 0.31513524055480957D, - 0.3148083984851837D, - 0.31448230147361755D, - 0.3141593337059021D, - 0.3138306438922882D, - 0.313511461019516D, - 0.3132011592388153D, - 0.31286999583244324D, - 0.31256046891212463D, - 0.31223684549331665D, - 0.3119199573993683D, - 0.31160062551498413D, - 0.31128641963005066D, - 0.31096261739730835D, - 0.3106483519077301D, - 0.31033560633659363D, - 0.31001248955726624D, - 0.30969613790512085D, - 0.3093807101249695D, - 0.3090643584728241D, - 0.3087562322616577D, - 0.3084530532360077D, - 0.3081410229206085D, - 0.30783092975616455D, - 0.3075273334980011D, - 0.30720987915992737D, - 0.3068995177745819D, - 0.30659666657447815D, - 0.3062874376773834D, - 0.3059786558151245D, - 0.305671364068985D, - 0.3053743839263916D, - 0.30506861209869385D, - 0.30476105213165283D, - 0.3044643998146057D, - 0.3041706383228302D, - 0.3038659393787384D, - 0.30357563495635986D, - 0.3032696545124054D, - 0.30296090245246887D, - 0.30266377329826355D, - 0.3023788034915924D, - 0.302080899477005D, - 0.3017835319042206D, - 0.3014954924583435D, - 0.3012062609195709D, - 0.30091601610183716D, - 0.3006187677383423D, - 0.30032220482826233D, - 0.3000366985797882D, - 0.29973816871643066D, - 0.2994519770145416D, - 0.29914233088493347D, - 0.2988555431365967D, - 0.29856425523757935D, - 0.2982824742794037D, - 0.29798826575279236D, - 0.2976938486099243D, - 0.29739657044410706D, - 0.29710277915000916D, - 0.29681164026260376D, - 0.29652127623558044D, - 0.29623138904571533D, - 0.29592910408973694D, - 0.2956419289112091D, - 0.29535165429115295D, - 0.29506999254226685D, - 0.29478344321250916D, - 0.2944985330104828D, - 0.2942177355289459D, - 0.29393965005874634D, - 0.2936561107635498D, - 0.29337379336357117D, - 0.2930947542190552D, - 0.29281559586524963D, - 0.29254022240638733D, - 0.29226312041282654D, - 0.2919958531856537D, - 0.29172608256340027D, - 0.291446328163147D, - 0.2911716103553772D, - 0.29089251160621643D, - 0.2906162738800049D, - 0.290350079536438D, - 0.29007789492607117D, - 0.28980758786201477D, - 0.28953540325164795D, - 0.2892584502696991D, - 0.2889859974384308D, - 0.2887132167816162D, - 0.2884424030780792D, - 0.28817737102508545D, - 0.2879084348678589D, - 0.28764015436172485D, - 0.2873786389827728D, - 0.28710025548934937D, - 0.28683197498321533D, - 0.28656822443008423D, - 0.28629666566848755D, - 0.28602135181427D, - 0.2857580780982971D, - 0.2854946255683899D, - 0.2852350175380707D, - 0.28497231006622314D, - 0.2847127616405487D, - 0.2844494581222534D, - 0.28418153524398804D, - 0.2839117646217346D, - 0.28364670276641846D, - 0.2833735942840576D, - 0.2831180989742279D, - 0.28285273909568787D, - 0.282595694065094D, - 0.28233304619789124D, - 0.28208285570144653D, - 0.28183260560035706D, - 0.28156495094299316D, - 0.2813194692134857D, - 0.28106340765953064D, - 0.2807980179786682D, - 0.2805359661579132D, - 0.2802804410457611D, - 0.28002557158470154D, - 0.27975931763648987D, - 0.2795126140117645D, - 0.27925795316696167D, - 0.27899473905563354D, - 0.278735488653183D, - 0.27847906947135925D, - 0.27822330594062805D, - 0.27796468138694763D, - 0.27770230174064636D, - 0.2774444818496704D, - 0.27718687057495117D, - 0.27694857120513916D, - 0.2766880989074707D, - 0.27643832564353943D, - 0.2761860489845276D, - 0.2759307324886322D, - 0.2756873071193695D, - 0.2754386067390442D, - 0.2751883268356323D, - 0.27494344115257263D, - 0.2746928334236145D, - 0.274436354637146D, - 0.27417975664138794D, - 0.2739262282848358D, - 0.27367040514945984D, - 0.2734193205833435D, - 0.273158460855484D, - 0.27291545271873474D, - 0.2726711928844452D, - 0.27241599559783936D, - 0.27216801047325134D, - 0.2719186842441559D, - 0.27167946100234985D, - 0.2714363932609558D, - 0.271190345287323D, - 0.2709449231624603D, - 0.2706972360610962D, - 0.27045026421546936D, - 0.27020177245140076D, - 0.26996636390686035D, - 0.2697167992591858D, - 0.2694661319255829D, - 0.2692175805568695D, - 0.2689802348613739D, - 0.2687402367591858D, - 0.2684989869594574D, - 0.2682455778121948D, - 0.2680189311504364D, - 0.26777616143226624D, - 0.267528235912323D, - 0.2672905921936035D, - 0.2670466899871826D, - 0.26680880784988403D, - 0.2665674090385437D, - 0.26632341742515564D, - 0.2660820782184601D, - 0.2658466100692749D, - 0.26560917496681213D, - 0.26536619663238525D, - 0.26512911915779114D, - 0.2648910880088806D, - 0.2646530270576477D, - 0.26441332697868347D, - 0.26417455077171326D, - 0.26393792033195496D, - 0.2637031376361847D, - 0.2634584307670593D, - 0.2632187306880951D, - 0.2629868984222412D, - 0.26276034116744995D, - 0.2625255584716797D, - 0.26228949427604675D, - 0.2620560824871063D, - 0.26182571053504944D, - 0.261595219373703D, - 0.2613618075847626D, - 0.26113298535346985D, - 0.2608985900878906D, - 0.26066386699676514D, - 0.26042836904525757D, - 0.2601918876171112D, - 0.25995346903800964D, - 0.2597239911556244D, - 0.25948530435562134D, - 0.25925174355506897D, - 0.25902727246284485D, - 0.25878533720970154D, - 0.2585568130016327D, - 0.25832033157348633D, - 0.25808852910995483D, - 0.25785645842552185D, - 0.2576303482055664D, - 0.25740429759025574D, - 0.25717857480049133D, - 0.2569526731967926D, - 0.25671908259391785D, - 0.25648829340934753D, - 0.25625646114349365D, - 0.2560245394706726D, - 0.25578436255455017D, - 0.2555571496486664D, - 0.25532659888267517D, - 0.25509998202323914D, - 0.2548714876174927D, - 0.2546450197696686D, - 0.2544119656085968D, - 0.25418850779533386D, - 0.25395628809928894D, - 0.25373202562332153D, - 0.2535029947757721D, - 0.2532775402069092D, - 0.2530599534511566D, - 0.25283512473106384D, - 0.2526094317436218D, - 0.2523849904537201D, - 0.25216206908226013D, - 0.2519350051879883D, - 0.2517090141773224D, - 0.2514895796775818D, - 0.2512630820274353D, - 0.25103917717933655D, - 0.2508082687854767D, - 0.25058355927467346D, - 0.25036174058914185D, - 0.2501283586025238D, - 0.24990904331207275D, - 0.249681293964386D, - 0.24945379793643951D, - 0.24923056364059448D, - 0.24901220202445984D, - 0.24878771603107452D, - 0.24855589866638184D, - 0.24833829700946808D, - 0.24811571836471558D, - 0.24789805710315704D, - 0.24767984449863434D, - 0.24746781587600708D, - 0.24724344909191132D, - 0.247017040848732D, - 0.24679675698280334D, - 0.24657492339611053D, - 0.2463507503271103D, - 0.24612344801425934D, - 0.2459094524383545D, - 0.24569448828697205D, - 0.2454809844493866D, - 0.2452625036239624D, - 0.24504707753658295D, - 0.2448272854089737D, - 0.24461260437965393D, - 0.2443927526473999D, - 0.24417124688625336D, - 0.243961900472641D, - 0.24374017119407654D, - 0.24352549016475677D, - 0.2433115839958191D, - 0.24308589100837708D, - 0.24287600815296173D, - 0.24265910685062408D, - 0.24244506657123566D, - 0.24222184717655182D, - 0.2420046031475067D, - 0.24178411066532135D, - 0.2415642887353897D, - 0.24134574830532074D, - 0.24113741517066956D, - 0.24092262983322144D, - 0.24071024358272552D, - 0.2404916137456894D, - 0.24028095602989197D, - 0.2400677651166916D, - 0.23985490202903748D, - 0.23963676393032074D, - 0.23942221701145172D, - 0.23919777572155D, - 0.23898695409297943D, - 0.23877480626106262D, - 0.2385605275630951D, - 0.23833821713924408D, - 0.23812562227249146D, - 0.23791590332984924D, - 0.2377057671546936D, - 0.23749561607837677D, - 0.2372775822877884D, - 0.23707041144371033D, - 0.23685894906520844D, - 0.23664598166942596D, - 0.2364351749420166D, - 0.23622725903987885D, - 0.23601093888282776D, - 0.23579688370227814D, - 0.2355896234512329D, - 0.2353767305612564D, - 0.23516340553760529D, - 0.23495911061763763D, - 0.23474349081516266D, - 0.23453089594841003D, - 0.234323650598526D, - 0.2341182678937912D, - 0.23391124606132507D, - 0.23369914293289185D, - 0.23348599672317505D, - 0.23327989876270294D, - 0.23307158052921295D, - 0.23286454379558563D, - 0.23266181349754333D, - 0.2324516326189041D, - 0.23224829137325287D, - 0.2320389449596405D, - 0.23183543980121613D, - 0.23162415623664856D, - 0.23141750693321228D, - 0.2312154620885849D, - 0.23101359605789185D, - 0.2308085411787033D, - 0.23060521483421326D, - 0.2303977906703949D, - 0.23019705712795258D, - 0.22999277710914612D, - 0.22978724539279938D, - 0.22957871854305267D, - 0.2293720841407776D, - 0.2291649729013443D, - 0.22895236313343048D, - 0.2287459373474121D, - 0.22854582965373993D, - 0.2283381223678589D, - 0.22812990844249725D, - 0.2279345691204071D, - 0.2277294397354126D, - 0.22752392292022705D, - 0.22731730341911316D, - 0.22711612284183502D, - 0.22691002488136292D, - 0.2267099916934967D, - 0.2265053242444992D, - 0.22630846500396729D, - 0.22610722482204437D, - 0.22590836882591248D, - 0.2257007658481598D, - 0.22550742328166962D, - 0.22530819475650787D, - 0.22511185705661774D, - 0.22490867972373962D, - 0.2247025966644287D, - 0.22450992465019226D, - 0.22430776059627533D, - 0.22410835325717926D, - 0.2239159643650055D, - 0.22370943427085876D, - 0.22351300716400146D, - 0.22331230342388153D, - 0.22311504185199738D, - 0.2229161113500595D, - 0.2227165549993515D, - 0.22251492738723755D, - 0.22231879830360413D, - 0.222111314535141D, - 0.2219131737947464D, - 0.22171789407730103D, - 0.22152048349380493D, - 0.221323162317276D, - 0.2211257964372635D, - 0.22093181312084198D, - 0.2207297384738922D, - 0.22052015364170074D, - 0.22031758725643158D, - 0.22012105584144592D, - 0.21992850303649902D, - 0.21972830593585968D, - 0.2195286750793457D, - 0.2193296104669571D, - 0.2191292941570282D, - 0.21894055604934692D, - 0.21874472498893738D, - 0.21854627132415771D, - 0.21834976971149445D, - 0.21815654635429382D, - 0.21795278787612915D, - 0.21775475144386292D, - 0.2175593227148056D, - 0.21736285090446472D, - 0.21716663241386414D, - 0.2169671356678009D, - 0.21677885949611664D, - 0.21658332645893097D, - 0.21638570725917816D, - 0.21619734168052673D, - 0.21600238978862762D, - 0.21581146121025085D, - 0.21561749279499054D, - 0.21542775630950928D, - 0.21523769199848175D, - 0.2150374948978424D, - 0.21483974158763885D, - 0.21464426815509796D, - 0.2144438624382019D, - 0.2142522931098938D, - 0.21405142545700073D, - 0.2138548493385315D, - 0.21365608274936676D, - 0.21346205472946167D, - 0.21327044069766998D, - 0.2130790650844574D, - 0.21289238333702087D, - 0.21269790828227997D, - 0.21250642836093903D, - 0.2123108059167862D, - 0.21211734414100647D, - 0.21193185448646545D, - 0.2117394357919693D, - 0.2115425020456314D, - 0.21135464310646057D, - 0.21115921437740326D, - 0.2109653651714325D, - 0.2107720673084259D, - 0.2105797827243805D, - 0.2103857845067978D, - 0.21019317209720612D, - 0.20999492704868317D, - 0.20980359613895416D, - 0.20961257815361023D, - 0.20942623913288116D, - 0.209233820438385D, - 0.20904646813869476D, - 0.2088536024093628D, - 0.20866578817367554D, - 0.20847372710704803D, - 0.20828045904636383D, - 0.20809443295001984D, - 0.20790085196495056D, - 0.20771846175193787D, - 0.20753352344036102D, - 0.20734763145446777D, - 0.20716027915477753D, - 0.2069670557975769D, - 0.20677906274795532D, - 0.20658759772777557D, - 0.20640024542808533D, - 0.20621001720428467D, - 0.2060190588235855D, - 0.20582759380340576D, - 0.20564205944538116D, - 0.20544962584972382D, - 0.2052612006664276D, - 0.2050696611404419D, - 0.2048760950565338D, - 0.2046886533498764D, - 0.20449654757976532D, - 0.20430676639080048D, - 0.2041216492652893D, - 0.20393186807632446D, - 0.20373943448066711D, - 0.20355398952960968D, - 0.20336341857910156D, - 0.20317570865154266D, - 0.20299416780471802D, - 0.2028021663427353D, - 0.20261310040950775D, - 0.20243166387081146D, - 0.20224738121032715D, - 0.20206642150878906D, - 0.20188181102275848D, - 0.20169363915920258D, - 0.2015080600976944D, - 0.2013179212808609D, - 0.20112863183021545D, - 0.20093776285648346D, - 0.20075495541095734D, - 0.2005680948495865D, - 0.2003868669271469D, - 0.20020489394664764D, - 0.20001673698425293D, - 0.19983160495758057D, - 0.1996394246816635D, - 0.19945387542247772D, - 0.19926834106445312D, - 0.19908671081066132D, - 0.1988958865404129D, - 0.19870947301387787D, - 0.19852466881275177D, - 0.19834156334400177D, - 0.19815687835216522D, - 0.19796614348888397D, - 0.19778570532798767D, - 0.19759665429592133D, - 0.19740843772888184D, - 0.19722165167331696D, - 0.19703587889671326D, - 0.19684910774230957D, - 0.19666774570941925D, - 0.1964777112007141D, - 0.19629596173763275D, - 0.19611066579818726D, - 0.1959228813648224D, - 0.19573974609375D, - 0.19555895030498505D, - 0.1953638643026352D, - 0.19518616795539856D, - 0.19500669836997986D, - 0.19482499361038208D, - 0.1946471929550171D, - 0.194466695189476D, - 0.19428104162216187D, - 0.1940973550081253D, - 0.19391575455665588D, - 0.19373083114624023D, - 0.19354969263076782D, - 0.1933702528476715D, - 0.19318976998329163D, - 0.19300931692123413D, - 0.19283118844032288D, - 0.19264520704746246D, - 0.1924607753753662D, - 0.1922810971736908D, - 0.19210171699523926D, - 0.1919163316488266D, - 0.19173482060432434D, - 0.19155943393707275D, - 0.19138532876968384D, - 0.19119767844676971D, - 0.19101446866989136D, - 0.1908339560031891D, - 0.19065433740615845D, - 0.19047808647155762D, - 0.19029070436954498D, - 0.19011610746383667D, - 0.1899399310350418D, - 0.1897595226764679D, - 0.18958213925361633D, - 0.18940195441246033D, - 0.18922074139118195D, - 0.1890474408864975D, - 0.18887129426002502D, - 0.18868793547153473D, - 0.18850910663604736D, - 0.18833401799201965D, - 0.1881609410047531D, - 0.1879805475473404D, - 0.1877983957529068D, - 0.18762242794036865D, - 0.18744400143623352D, - 0.18727153539657593D, - 0.18709038197994232D, - 0.186911940574646D, - 0.18673141300678253D, - 0.1865476816892624D, - 0.18636727333068848D, - 0.1861869841814041D, - 0.18600544333457947D, - 0.18582187592983246D, - 0.18564167618751526D, - 0.18546094000339508D, - 0.18528078496456146D, - 0.1851012110710144D, - 0.18491904437541962D, - 0.1847427636384964D, - 0.18456260859966278D, - 0.18438087403774261D, - 0.1842058300971985D, - 0.1840263456106186D, - 0.1838521808385849D, - 0.1836727261543274D, - 0.18349887430667877D, - 0.18331634998321533D, - 0.18313662707805634D, - 0.18296116590499878D, - 0.18278826773166656D, - 0.1826159507036209D, - 0.18243756890296936D, - 0.18226413428783417D, - 0.18208879232406616D, - 0.18189701437950134D, - 0.1817188709974289D, - 0.18154506385326385D, - 0.18136811256408691D, - 0.18119221925735474D, - 0.18101762235164642D, - 0.18084242939949036D, - 0.18066288530826569D, - 0.18048758804798126D, - 0.1803077757358551D, - 0.1801341325044632D, - 0.1799568086862564D, - 0.17978443205356598D, - 0.17961187660694122D, - 0.17943669855594635D, - 0.17925851047039032D, - 0.17908446490764618D, - 0.17891113460063934D, - 0.17873777449131012D, - 0.17856022715568542D, - 0.17838963866233826D, - 0.17821721732616425D, - 0.17804166674613953D, - 0.1778649091720581D, - 0.17769235372543335D, - 0.17751924693584442D, - 0.17734745144844055D, - 0.1771826446056366D, - 0.1770143061876297D, - 0.17684297263622284D, - 0.17666888236999512D, - 0.1764875054359436D, - 0.17631016671657562D, - 0.1761368215084076D, - 0.17596030235290527D, - 0.1757875680923462D, - 0.17561489343643188D, - 0.17543856799602509D, - 0.175258606672287D, - 0.17508889734745026D, - 0.1749197393655777D, - 0.17475321888923645D, - 0.17457622289657593D, - 0.17440469563007355D, - 0.17423614859580994D, - 0.17406317591667175D, - 0.1738888919353485D, - 0.17371085286140442D, - 0.17354506254196167D, - 0.1733754277229309D, - 0.17320691049098969D, - 0.17303411662578583D, - 0.17286333441734314D, - 0.1726849228143692D, - 0.17251433432102203D, - 0.1723429262638092D, - 0.17217423021793365D, - 0.17199841141700745D, - 0.17183169722557068D, - 0.17165900766849518D, - 0.17149260640144348D, - 0.1713184118270874D, - 0.17114870250225067D, - 0.17097310721874237D, - 0.17080703377723694D, - 0.1706410050392151D, - 0.17047066986560822D, - 0.17030231654644012D, - 0.17013415694236755D, - 0.16996319591999054D, - 0.1697862595319748D, - 0.16962021589279175D, - 0.1694522649049759D, - 0.16928495466709137D, - 0.1691145896911621D, - 0.16894133388996124D, - 0.16877424716949463D, - 0.1686055213212967D, - 0.16844305396080017D, - 0.16827253997325897D, - 0.16810156404972076D, - 0.16793574392795563D, - 0.16776280105113983D, - 0.16759483516216278D, - 0.16742615401744843D, - 0.16726046800613403D, - 0.16708528995513916D, - 0.16691190004348755D, - 0.16673815250396729D, - 0.16657349467277527D, - 0.16640760004520416D, - 0.1662367582321167D, - 0.16606061160564423D, - 0.16588932275772095D, - 0.16572310030460358D, - 0.16555465757846832D, - 0.16538579761981964D, - 0.16521978378295898D, - 0.16504855453968048D, - 0.16488133370876312D, - 0.1647077053785324D, - 0.16454964876174927D, - 0.16438791155815125D, - 0.16421759128570557D, - 0.16404742002487183D, - 0.16388101875782013D, - 0.16371379792690277D, - 0.16355162858963013D, - 0.1633833944797516D, - 0.16321513056755066D, - 0.16304640471935272D, - 0.1628739833831787D, - 0.16270378232002258D, - 0.16253381967544556D, - 0.16236473619937897D, - 0.16219766438007355D, - 0.1620299369096756D, - 0.1618584245443344D, - 0.16168925166130066D, - 0.16151995956897736D, - 0.16134582459926605D, - 0.1611795872449875D, - 0.16101405024528503D, - 0.1608451008796692D, - 0.16068188846111298D, - 0.1605166792869568D, - 0.16034835577011108D, - 0.16018332540988922D, - 0.16001814603805542D, - 0.15985408425331116D, - 0.15968838334083557D, - 0.15952043235301971D, - 0.1593540459871292D, - 0.1591864973306656D, - 0.15901817381381989D, - 0.15885035693645477D, - 0.1586897224187851D, - 0.15852101147174835D, - 0.15835918486118317D, - 0.15819862484931946D, - 0.15802861750125885D, - 0.1578657180070877D, - 0.15770186483860016D, - 0.157541885972023D, - 0.15737460553646088D, - 0.15719760954380035D, - 0.15703265368938446D, - 0.15686756372451782D, - 0.15670160949230194D, - 0.15654122829437256D, - 0.15637557208538055D, - 0.15620650351047516D, - 0.15603956580162048D, - 0.15587256848812103D, - 0.15570658445358276D, - 0.1555391401052475D, - 0.15537893772125244D, - 0.15521250665187836D, - 0.15504445135593414D, - 0.1548793762922287D, - 0.15472041070461273D, - 0.15455928444862366D, - 0.1543930172920227D, - 0.15422186255455017D, - 0.15405680239200592D, - 0.15389008820056915D, - 0.15371909737586975D, - 0.15355190634727478D, - 0.1533874124288559D, - 0.15322037041187286D, - 0.15305693447589874D, - 0.15288913249969482D, - 0.15272565186023712D, - 0.15255971252918243D, - 0.15239514410495758D, - 0.15223248302936554D, - 0.15206488966941833D, - 0.15189997851848602D, - 0.1517343968153D, - 0.15157388150691986D, - 0.15141001343727112D, - 0.15124376118183136D, - 0.1510799080133438D, - 0.15091581642627716D, - 0.15075315535068512D, - 0.1505943238735199D, - 0.15042626857757568D, - 0.15026342868804932D, - 0.15009838342666626D, - 0.14992687106132507D, - 0.14975950121879578D, - 0.14959338307380676D, - 0.1494319885969162D, - 0.14927686750888824D, - 0.1491170972585678D, - 0.1489545851945877D, - 0.1487915962934494D, - 0.14862462878227234D, - 0.14846675097942352D, - 0.1482943892478943D, - 0.14813122153282166D, - 0.14796608686447144D, - 0.1478019803762436D, - 0.14763972163200378D, - 0.14748099446296692D, - 0.1473177820444107D, - 0.14715023338794708D, - 0.14698868989944458D, - 0.14682012796401978D, - 0.14665497839450836D, - 0.14649364352226257D, - 0.14632706344127655D, - 0.14616291224956512D, - 0.14600065350532532D, - 0.1458369493484497D, - 0.14567570388317108D, - 0.14551441371440887D, - 0.1453484296798706D, - 0.14518843591213226D, - 0.14502838253974915D, - 0.1448645293712616D, - 0.14470131695270538D, - 0.14454562962055206D, - 0.144387349486351D, - 0.14422045648097992D, - 0.14406554400920868D, - 0.14389978349208832D, - 0.14373210072517395D, - 0.14357031881809235D, - 0.14340740442276D, - 0.1432454138994217D, - 0.1430845707654953D, - 0.14292079210281372D, - 0.1427599936723709D, - 0.14259862899780273D, - 0.14243145287036896D, - 0.142270028591156D, - 0.1421079933643341D, - 0.1419392079114914D, - 0.1417788565158844D, - 0.14161263406276703D, - 0.14144699275493622D, - 0.1412813663482666D, - 0.14111489057540894D, - 0.14095115661621094D, - 0.140792116522789D, - 0.14062824845314026D, - 0.1404629498720169D, - 0.14029960334300995D, - 0.14013166725635529D, - 0.13997189700603485D, - 0.13981026411056519D, - 0.13965271413326263D, - 0.13948722183704376D, - 0.1393279731273651D, - 0.13916252553462982D, - 0.13900236785411835D, - 0.1388358473777771D, - 0.13866667449474335D, - 0.13850988447666168D, - 0.13835175335407257D, - 0.138188436627388D, - 0.13802814483642578D, - 0.13786524534225464D, - 0.1377078741788864D, - 0.13754159212112427D, - 0.1373801976442337D, - 0.1372184306383133D, - 0.13705679774284363D, - 0.13689808547496796D, - 0.13673967123031616D, - 0.13657420873641968D, - 0.13640782237052917D, - 0.13624517619609833D, - 0.13608133792877197D, - 0.13591967523097992D, - 0.13575933873653412D, - 0.13559971749782562D, - 0.13544517755508423D, - 0.1352863609790802D, - 0.13513325154781342D, - 0.13497786223888397D, - 0.13481275737285614D, - 0.13465309143066406D, - 0.13449665904045105D, - 0.13433897495269775D, - 0.1341773420572281D, - 0.13402383029460907D, - 0.1338663548231125D, - 0.1337081789970398D, - 0.13354714214801788D, - 0.13338331878185272D, - 0.13322538137435913D, - 0.13306425511837006D, - 0.13290470838546753D, - 0.13275213539600372D, - 0.13259844481945038D, - 0.1324356645345688D, - 0.13227884471416473D, - 0.1321146935224533D, - 0.1319541037082672D, - 0.131797656416893D, - 0.13164083659648895D, - 0.13147978484630585D, - 0.13131381571292877D, - 0.13115201890468597D, - 0.13099059462547302D, - 0.1308245062828064D, - 0.1306670606136322D, - 0.1305040717124939D, - 0.13035070896148682D, - 0.13019300997257233D, - 0.1300356239080429D, - 0.1298762559890747D, - 0.1297183632850647D, - 0.12956057488918304D, - 0.12940144538879395D, - 0.12924081087112427D, - 0.12908275425434113D, - 0.1289270669221878D, - 0.12876754999160767D, - 0.12860682606697083D, - 0.12844565510749817D, - 0.12828676402568817D, - 0.12812906503677368D, - 0.12797008454799652D, - 0.12781330943107605D, - 0.12765750288963318D, - 0.12749481201171875D, - 0.127337247133255D, - 0.1271742433309555D, - 0.1270153522491455D, - 0.12685935199260712D, - 0.1267004907131195D, - 0.12653754651546478D, - 0.12637701630592346D, - 0.1262156367301941D, - 0.12606389820575714D, - 0.12590430676937103D, - 0.12574836611747742D, - 0.12559638917446136D, - 0.12544165551662445D, - 0.1252770870923996D, - 0.1251228302717209D, - 0.12496986985206604D, - 0.12481474876403809D, - 0.1246587485074997D, - 0.12450014054775238D, - 0.1243380680680275D, - 0.12417808920145035D, - 0.12401260435581207D, - 0.12385917454957962D, - 0.12369806319475174D, - 0.12354270368814468D, - 0.12338215857744217D, - 0.12322761118412018D, - 0.12307074666023254D, - 0.12291423231363297D, - 0.12275463342666626D, - 0.12259893864393234D, - 0.12243746966123581D, - 0.12228085845708847D, - 0.12212485074996948D, - 0.12196937203407288D, - 0.12180796265602112D, - 0.12165087461471558D, - 0.12149342894554138D, - 0.12132823467254639D, - 0.12117192149162292D, - 0.12100870162248611D, - 0.12084946036338806D, - 0.12069331109523773D, - 0.12053768336772919D, - 0.12037955224514008D, - 0.1202208548784256D, - 0.12006158381700516D, - 0.11990135163068771D, - 0.11974664032459259D, - 0.11959299445152283D, - 0.11944324523210526D, - 0.11928992718458176D, - 0.11913513392210007D, - 0.11898119002580643D, - 0.11882483214139938D, - 0.1186707392334938D, - 0.11851347982883453D, - 0.11835876107215881D, - 0.11820124834775925D, - 0.11804813891649246D, - 0.11789484322071075D, - 0.11773931980133057D, - 0.11758462339639664D, - 0.117423877120018D, - 0.11726968735456467D, - 0.11711079627275467D, - 0.11694814264774323D, - 0.11679580062627792D, - 0.11663621664047241D, - 0.11648730933666229D, - 0.11632833629846573D, - 0.11617368459701538D, - 0.11601484566926956D, - 0.1158570870757103D, - 0.11570281535387039D, - 0.11555135250091553D, - 0.11539247632026672D, - 0.11523469537496567D, - 0.11507617682218552D, - 0.11491613835096359D, - 0.11476139724254608D, - 0.11460647732019424D, - 0.11445080488920212D, - 0.11429022997617722D, - 0.11413708329200745D, - 0.11397743970155716D, - 0.11382514238357544D, - 0.11366745084524155D, - 0.11351797729730606D, - 0.11336144059896469D, - 0.11320804059505463D, - 0.11305557936429977D, - 0.11289967596530914D, - 0.11274378001689911D, - 0.11258506029844284D, - 0.11242981255054474D, - 0.11227528750896454D, - 0.11211802810430527D, - 0.11196192353963852D, - 0.11180936545133591D, - 0.1116519570350647D, - 0.11149086058139801D, - 0.11133705824613571D, - 0.11118285357952118D, - 0.11102371662855148D, - 0.11086839437484741D, - 0.11070949584245682D, - 0.11055301874876022D, - 0.11039435863494873D, - 0.11024358123540878D, - 0.11008933931589127D, - 0.10994099080562592D, - 0.10978744924068451D, - 0.1096331849694252D, - 0.1094803735613823D, - 0.10932327806949615D, - 0.1091662347316742D, - 0.10901220887899399D, - 0.10886164009571075D, - 0.10870997607707977D, - 0.1085532084107399D, - 0.10839588195085526D, - 0.10824001580476761D, - 0.10808181017637253D, - 0.10793018341064453D, - 0.10777948796749115D, - 0.10762609541416168D, - 0.10746936500072479D, - 0.10731363296508789D, - 0.10715664178133011D, - 0.10699828714132309D, - 0.1068406030535698D, - 0.10668957233428955D, - 0.106535904109478D, - 0.1063794493675232D, - 0.1062263771891594D, - 0.10607559233903885D, - 0.1059180200099945D, - 0.1057700365781784D, - 0.1056135967373848D, - 0.10546034574508667D, - 0.10531051456928253D, - 0.10515706241130829D, - 0.10500892251729965D, - 0.10485366731882095D, - 0.10469770431518555D, - 0.1045420691370964D, - 0.10438660532236099D, - 0.10423186421394348D, - 0.10408131033182144D, - 0.10392504185438156D, - 0.103775754570961D, - 0.10362043231725693D, - 0.10346867889165878D, - 0.1033216342329979D, - 0.10317199677228928D, - 0.1030234843492508D, - 0.1028713583946228D, - 0.102719247341156D, - 0.10256177186965942D, - 0.10241074860095978D, - 0.1022588387131691D, - 0.10210096091032028D, - 0.10195054113864899D, - 0.10179688781499863D, - 0.10164371132850647D, - 0.10149170458316803D, - 0.10133637487888336D, - 0.1011854037642479D, - 0.10102973878383636D, - 0.10087919235229492D, - 0.10073055326938629D, - 0.10058251768350601D, - 0.10042925179004669D, - 0.10028298944234848D, - 0.10012997686862946D, - 0.09998201578855515D, - 0.09982899576425552D, - 0.0996730700135231D, - 0.09951788932085037D, - 0.09936707466840744D, - 0.09921209514141083D, - 0.09906535595655441D, - 0.09891849011182785D, - 0.0987686887383461D, - 0.0986199602484703D, - 0.09847044944763184D, - 0.09832371026277542D, - 0.09816580265760422D, - 0.09800924360752106D, - 0.09785451740026474D, - 0.0977015420794487D, - 0.09754469245672226D, - 0.0973912850022316D, - 0.09723710268735886D, - 0.09708409756422043D, - 0.09692969173192978D, - 0.09677083045244217D, - 0.09661783277988434D, - 0.09646695107221603D, - 0.09631767868995667D, - 0.09616906195878983D, - 0.0960221216082573D, - 0.09587518125772476D, - 0.09572049975395203D, - 0.09557510167360306D, - 0.09542537480592728D, - 0.09527473896741867D, - 0.09512560814619064D, - 0.09497389942407608D, - 0.09482252597808838D, - 0.09466812759637833D, - 0.0945177897810936D, - 0.09436610341072083D, - 0.0942160040140152D, - 0.09406259655952454D, - 0.09391862154006958D, - 0.09376517683267593D, - 0.09361439198255539D, - 0.09346404671669006D, - 0.09330684691667557D, - 0.09315872937440872D, - 0.09300410747528076D, - 0.09285490214824677D, - 0.09270570427179337D, - 0.09255209565162659D, - 0.09239742159843445D, - 0.09224936366081238D, - 0.09209839254617691D, - 0.09194477647542953D, - 0.09178774058818817D, - 0.09163559973239899D, - 0.09148869663476944D, - 0.09133746474981308D, - 0.09118695557117462D, - 0.09104108810424805D, - 0.09089026600122452D, - 0.09074579924345016D, - 0.09059691429138184D, - 0.0904451310634613D, - 0.09029250591993332D, - 0.09014249593019485D, - 0.08999146521091461D, - 0.08984044194221497D, - 0.0896981805562973D, - 0.08955065906047821D, - 0.08939830958843231D, - 0.08925025165081024D, - 0.08909676969051361D, - 0.0889468863606453D, - 0.0888008326292038D, - 0.08865290880203247D, - 0.08850424736738205D, - 0.08835210651159286D, - 0.08819899708032608D, - 0.08805057406425476D, - 0.08789926767349243D, - 0.0877542570233345D, - 0.08760009706020355D, - 0.08745313435792923D, - 0.08730407804250717D, - 0.08714929223060608D, - 0.08699973672628403D, - 0.08685608208179474D, - 0.08670856803655624D, - 0.08656258881092072D, - 0.08641660213470459D, - 0.086270771920681D, - 0.08612503111362457D, - 0.08597104996442795D, - 0.08581869304180145D, - 0.08567001670598984D, - 0.08551899343729019D, - 0.08536837995052338D, - 0.08521687984466553D, - 0.0850711539387703D, - 0.08492837101221085D, - 0.08477798104286194D, - 0.08462752401828766D, - 0.08447655290365219D, - 0.08432706445455551D, - 0.08418617397546768D, - 0.08403434604406357D, - 0.08388318866491318D, - 0.0837327241897583D, - 0.08358580619096756D, - 0.08344066143035889D, - 0.08329291641712189D, - 0.08314470201730728D, - 0.08299455791711807D, - 0.08284270763397217D, - 0.08269276469945908D, - 0.08254578709602356D, - 0.08239870518445969D, - 0.08224755525588989D, - 0.08210334926843643D, - 0.08195140957832336D, - 0.08179952949285507D, - 0.08164890855550766D, - 0.08149830996990204D, - 0.08135122805833817D, - 0.08120505511760712D, - 0.08105988055467606D, - 0.08091382682323456D, - 0.08076044917106628D, - 0.0806116908788681D, - 0.08046256750822067D, - 0.08032169938087463D, - 0.0801742672920227D, - 0.08002588152885437D, - 0.079876609146595D, - 0.07973120361566544D, - 0.07958308607339859D, - 0.07943569868803024D, - 0.0792907252907753D, - 0.07914266735315323D, - 0.07899928838014603D, - 0.0788513645529747D, - 0.07870672643184662D, - 0.07855851948261261D, - 0.07841243594884872D, - 0.07826675474643707D, - 0.07811979949474335D, - 0.07797133177518845D, - 0.07782232016324997D, - 0.07767399400472641D, - 0.07752782851457596D, - 0.0773797407746315D, - 0.0772305428981781D, - 0.07708588242530823D, - 0.07694590836763382D, - 0.07679516822099686D, - 0.07664846628904343D, - 0.07649309933185577D, - 0.07634805887937546D, - 0.07619959115982056D, - 0.07605158537626266D, - 0.07590463012456894D, - 0.07575789093971252D, - 0.0756126120686531D, - 0.0754665955901146D, - 0.07531381398439407D, - 0.07516654580831528D, - 0.07501640915870667D, - 0.07486724108457565D, - 0.07472105324268341D, - 0.07457690685987473D, - 0.07442717999219894D, - 0.07427489012479782D, - 0.07413031905889511D, - 0.0739874318242073D, - 0.07384069263935089D, - 0.07369356602430344D, - 0.07354933023452759D, - 0.07339967787265778D, - 0.07325538247823715D, - 0.07310646027326584D, - 0.072956882417202D, - 0.0728110745549202D, - 0.07266359776258469D, - 0.0725211426615715D, - 0.07237620651721954D, - 0.07222937792539597D, - 0.07207916676998138D, - 0.07193435728549957D, - 0.07179314643144608D, - 0.07164552807807922D, - 0.07149890810251236D, - 0.07135166227817535D, - 0.07120280712842941D, - 0.07105418294668198D, - 0.07091175019741058D, - 0.07076039910316467D, - 0.07061431556940079D, - 0.07047049701213837D, - 0.07032421231269836D, - 0.07017634063959122D, - 0.07002970576286316D, - 0.06988793611526489D, - 0.06974132359027863D, - 0.06959310919046402D, - 0.06945087015628815D, - 0.06930480152368546D, - 0.06915923953056335D, - 0.06900786608457565D, - 0.0688617154955864D, - 0.06871413439512253D, - 0.06856607645750046D, - 0.06841415911912918D, - 0.06826581805944443D, - 0.06812670081853867D, - 0.06798086315393448D, - 0.06783780455589294D, - 0.06768807768821716D, - 0.06754382699728012D, - 0.06739568710327148D, - 0.06724487990140915D, - 0.06709926575422287D, - 0.06695383787155151D, - 0.06680747866630554D, - 0.06665907055139542D, - 0.06651457399129868D, - 0.06636756658554077D, - 0.06622058898210526D, - 0.06607180833816528D, - 0.06592177599668503D, - 0.06577412784099579D, - 0.0656253919005394D, - 0.06547900289297104D, - 0.0653318390250206D, - 0.06518644094467163D, - 0.06504128873348236D, - 0.06489810347557068D, - 0.06475608795881271D, - 0.06460591405630112D, - 0.06446024030447006D, - 0.064316026866436D, - 0.06417583674192429D, - 0.06403206288814545D, - 0.06388941407203674D, - 0.06374424695968628D, - 0.06360013782978058D, - 0.0634584054350853D, - 0.06331267207860947D, - 0.0631692036986351D, - 0.06302201002836227D, - 0.06288087368011475D, - 0.06273243576288223D, - 0.06258194893598557D, - 0.06243429332971573D, - 0.06229083240032196D, - 0.06214556843042374D, - 0.062002599239349365D, - 0.06185929477214813D, - 0.061716437339782715D, - 0.061570484191179276D, - 0.06142384186387062D, - 0.06127782538533211D, - 0.061132557690143585D, - 0.060989513993263245D, - 0.060844529420137405D, - 0.06069890409708023D, - 0.06055354326963425D, - 0.060405682772397995D, - 0.06026533991098404D, - 0.06011749058961868D, - 0.059968482702970505D, - 0.05982600525021553D, - 0.059680480509996414D, - 0.059535522013902664D, - 0.059390582144260406D, - 0.05924614518880844D, - 0.05910341069102287D, - 0.05896386876702309D, - 0.05881671980023384D, - 0.05867418646812439D, - 0.05852854624390602D, - 0.05838187783956528D, - 0.05823810026049614D, - 0.05809527635574341D, - 0.057948093861341476D, - 0.0578012652695179D, - 0.05765361711382866D, - 0.05750838667154312D, - 0.05736393481492996D, - 0.057217638939619064D, - 0.05706694349646568D, - 0.05692378431558609D, - 0.05678245425224304D, - 0.05663757398724556D, - 0.05649363622069359D, - 0.05634985491633415D, - 0.056205663830041885D, - 0.05606226995587349D, - 0.05592307448387146D, - 0.05577968433499336D, - 0.05563392862677574D, - 0.05549056455492973D, - 0.05534479022026062D, - 0.055201154202222824D, - 0.05505699664354324D, - 0.0549137219786644D, - 0.05476832762360573D, - 0.05462126433849335D, - 0.05447656661272049D, - 0.05434228852391243D, - 0.05420103296637535D, - 0.05406308174133301D, - 0.05391890928149223D, - 0.0537768192589283D, - 0.05362963303923607D, - 0.0534859336912632D, - 0.05334062874317169D, - 0.05319816619157791D, - 0.05305417627096176D, - 0.0529022179543972D, - 0.0527631975710392D, - 0.05261426791548729D, - 0.05247179791331291D, - 0.05232933536171913D, - 0.05218454450368881D, - 0.05203909054398537D, - 0.05189083516597748D, - 0.05174766480922699D, - 0.05160299316048622D, - 0.051458291709423065D, - 0.051309190690517426D, - 0.05115984380245209D, - 0.05101843550801277D, - 0.05087246745824814D, - 0.05072947219014168D, - 0.05057992786169052D, - 0.05043843761086464D, - 0.05029204860329628D, - 0.05014629662036896D, - 0.05000283941626549D, - 0.049857232719659805D, - 0.049713216722011566D, - 0.04957091435790062D, - 0.04942091554403305D, - 0.04927506670355797D, - 0.04913335666060448D, - 0.048989035189151764D, - 0.048844993114471436D, - 0.0487007237970829D, - 0.048562195152044296D, - 0.048413559794425964D, - 0.048270318657159805D, - 0.04812940955162048D, - 0.04798140004277229D, - 0.0478396899998188D, - 0.047694046050310135D, - 0.047547876834869385D, - 0.04740189015865326D, - 0.04726110398769379D, - 0.04712127149105072D, - 0.046977218240499496D, - 0.04683265835046768D, - 0.046689197421073914D, - 0.04654806852340698D, - 0.046403829008340836D, - 0.046261515468358994D, - 0.04611881449818611D, - 0.04596831649541855D, - 0.04582914337515831D, - 0.04568442329764366D, - 0.04553995281457901D, - 0.04539845883846283D, - 0.04524900019168854D, - 0.045108482241630554D, - 0.04496757686138153D, - 0.04482390731573105D, - 0.04467904940247536D, - 0.04453316330909729D, - 0.044389624148607254D, - 0.04424721747636795D, - 0.04410555958747864D, - 0.043958716094493866D, - 0.04381263256072998D, - 0.04366842657327652D, - 0.04352462291717529D, - 0.04338620603084564D, - 0.04324391856789589D, - 0.043100159615278244D, - 0.04295606166124344D, - 0.042808517813682556D, - 0.04266786947846413D, - 0.04252271726727486D, - 0.04237944632768631D, - 0.042232923209667206D, - 0.042089663445949554D, - 0.0419427864253521D, - 0.041796110570430756D, - 0.04165620356798172D, - 0.04151580110192299D, - 0.04137476161122322D, - 0.04122743010520935D, - 0.04108310863375664D, - 0.0409451425075531D, - 0.04079899191856384D, - 0.0406576506793499D, - 0.04051866754889488D, - 0.04037083312869072D, - 0.04022456333041191D, - 0.040080901235342026D, - 0.03993881866335869D, - 0.03979869186878204D, - 0.039654675871133804D, - 0.03950592130422592D, - 0.039364293217659D, - 0.03922411799430847D, - 0.039080843329429626D, - 0.038942210376262665D, - 0.038799673318862915D, - 0.03865673393011093D, - 0.038515783846378326D, - 0.03837844729423523D, - 0.03823413327336311D, - 0.0380907878279686D, - 0.03794614225625992D, - 0.037802569568157196D, - 0.0376591794192791D, - 0.03751154989004135D, - 0.037371594458818436D, - 0.03723229467868805D, - 0.0370887815952301D, - 0.03694836050271988D, - 0.036804623901844025D, - 0.036663684993982315D, - 0.03652269020676613D, - 0.03638038784265518D, - 0.03623593971133232D, - 0.03609330207109451D, - 0.03595142811536789D, - 0.03580619767308235D, - 0.035664405673742294D, - 0.03552398458123207D, - 0.03537818789482117D, - 0.035238854587078094D, - 0.03509785979986191D, - 0.03495733439922333D, - 0.034811608493328094D, - 0.034666016697883606D, - 0.034524593502283096D, - 0.034383177757263184D, - 0.03424632549285889D, - 0.03410206362605095D, - 0.03395908698439598D, - 0.03381533920764923D, - 0.03367502987384796D, - 0.03353389352560043D, - 0.0333939865231514D, - 0.0332530252635479D, - 0.0331089124083519D, - 0.03296489268541336D, - 0.03281978890299797D, - 0.03268205374479294D, - 0.032543547451496124D, - 0.03239939734339714D, - 0.03225564956665039D, - 0.03211319074034691D, - 0.031970299780368805D, - 0.03183053806424141D, - 0.031690504401922226D, - 0.0315515473484993D, - 0.03140871226787567D, - 0.03127032518386841D, - 0.03113543428480625D, - 0.03099132515490055D, - 0.03084556572139263D, - 0.030708063393831253D, - 0.030564403161406517D, - 0.03042270988225937D, - 0.030277878046035767D, - 0.030134053900837898D, - 0.0299934484064579D, - 0.029853519052267075D, - 0.02970750257372856D, - 0.02956370636820793D, - 0.029423074796795845D, - 0.029277591034770012D, - 0.02913256548345089D, - 0.028991548344492912D, - 0.028849191963672638D, - 0.028712045401334763D, - 0.028571665287017822D, - 0.028429850935935974D, - 0.028289183974266052D, - 0.028145452961325645D, - 0.02800772339105606D, - 0.027868105098605156D, - 0.027727505192160606D, - 0.027587590739130974D, - 0.027444127947092056D, - 0.02730259671807289D, - 0.027155976742506027D, - 0.027012743055820465D, - 0.026867320761084557D, - 0.02672656998038292D, - 0.026584992185235023D, - 0.026440242305397987D, - 0.026296602562069893D, - 0.026151999831199646D, - 0.02601231448352337D, - 0.025870999321341515D, - 0.025728831067681313D, - 0.025589263066649437D, - 0.0254491176456213D, - 0.025309832766652107D, - 0.025158962234854698D, - 0.02501760981976986D, - 0.024877915158867836D, - 0.024732133373618126D, - 0.024590589106082916D, - 0.024444540962576866D, - 0.02430100180208683D, - 0.02415304444730282D, - 0.02401198446750641D, - 0.023868655785918236D, - 0.023721497505903244D, - 0.023579789325594902D, - 0.023435594514012337D, - 0.023291146382689476D, - 0.02314934879541397D, - 0.023010551929473877D, - 0.0228724405169487D, - 0.02272932231426239D, - 0.0225907564163208D, - 0.022446082904934883D, - 0.02230372652411461D, - 0.022165967151522636D, - 0.022024204954504967D, - 0.021882086992263794D, - 0.02174002304673195D, - 0.02160024642944336D, - 0.021454278379678726D, - 0.02131497487425804D, - 0.02117258496582508D, - 0.021028701215982437D, - 0.02088312990963459D, - 0.020745303481817245D, - 0.020600121468305588D, - 0.020457785576581955D, - 0.0203145369887352D, - 0.020174575969576836D, - 0.020029140636324883D, - 0.019890660420060158D, - 0.01975022256374359D, - 0.01960756629705429D, - 0.019467037171125412D, - 0.019320420920848846D, - 0.019179683178663254D, - 0.01904134452342987D, - 0.018906118348240852D, - 0.01876520924270153D, - 0.018623512238264084D, - 0.018482543528079987D, - 0.01834135875105858D, - 0.01820279471576214D, - 0.018056906759738922D, - 0.017920710146427155D, - 0.01777799427509308D, - 0.01763162389397621D, - 0.017489714547991753D, - 0.017347203567624092D, - 0.017202477902173996D, - 0.017058173194527626D, - 0.01691833697259426D, - 0.01677481085062027D, - 0.016630994156003D, - 0.016491299495100975D, - 0.016348596662282944D, - 0.01620868779718876D, - 0.016068479046225548D, - 0.015927160158753395D, - 0.015780296176671982D, - 0.015641076490283012D, - 0.01549579482525587D, - 0.015356827527284622D, - 0.015214596875011921D, - 0.015070712193846703D, - 0.014923106878995895D, - 0.014777173288166523D, - 0.014636659994721413D, - 0.014497545547783375D, - 0.01435788907110691D, - 0.014213880524039268D, - 0.014070038683712482D, - 0.013929210603237152D, - 0.013789304532110691D, - 0.013650632463395596D, - 0.013506708666682243D, - 0.013362940400838852D, - 0.013227197341620922D, - 0.01308612059801817D, - 0.012950407341122627D, - 0.012812728062272072D, - 0.012670092284679413D, - 0.012525119818747044D, - 0.012382328510284424D, - 0.012240074574947357D, - 0.012100824154913425D, - 0.011954340152442455D, - 0.011809084564447403D, - 0.011668648570775986D, - 0.011526428163051605D, - 0.011384048499166965D, - 0.011242672801017761D, - 0.011099583469331264D, - 0.010958466678857803D, - 0.010816705413162708D, - 0.010674509219825268D, - 0.01053413562476635D, - 0.010388684459030628D, - 0.010249142535030842D, - 0.01011234987527132D, - 0.009969789534807205D, - 0.009829124435782433D, - 0.009690780192613602D, - 0.00955201406031847D, - 0.009414111264050007D, - 0.009270462207496166D, - 0.009133466519415379D, - 0.008997434750199318D, - 0.008857715874910355D, - 0.008718002587556839D, - 0.00857506226748228D, - 0.008436493575572968D, - 0.0082900645211339D, - 0.008144848048686981D, - 0.008006873540580273D, - 0.007865924388170242D, - 0.007721261121332645D, - 0.00757999112829566D, - 0.007438249886035919D, - 0.0072948825545609D, - 0.007154085673391819D, - 0.007011679001152515D, - 0.00687157129868865D, - 0.00673050107434392D, - 0.006592079531401396D, - 0.006459984928369522D, - 0.006322549190372229D, - 0.006178436800837517D, - 0.0060307616367936134D, - 0.005891833920031786D, - 0.005752726923674345D, - 0.005611956585198641D, - 0.0054701571352779865D, - 0.005323751829564571D, - 0.0051832739263772964D, - 0.005041905678808689D, - 0.00490262545645237D, - 0.004762133117765188D, - 0.004622789565473795D, - 0.004480161238461733D, - 0.004337271209806204D, - 0.004192086402326822D, - 0.004049763083457947D, - 0.003913718741387129D, - 0.0037738564424216747D, - 0.0036340609658509493D, - 0.003496516030281782D, - 0.0033569824881851673D, - 0.0032230240758508444D, - 0.003080387134104967D, - 0.002938604447990656D, - 0.002798959845677018D, - 0.0026581448037177324D, - 0.0025131211150437593D, - 0.002374080941081047D, - 0.0022358258720487356D, - 0.002095262985676527D, - 0.0019611597526818514D, - 0.0018215921008959413D, - 0.001680250046774745D, - 0.0015372197376564145D, - 0.0014027993893250823D, - 0.0012627525720745325D, - 0.0011206334456801414D, - 9.801845299080014E-4D, - 8.360585197806358E-4D, - 6.988595123402774E-4D, - 5.616724956780672E-4D, - 4.2402747203595936E-4D, - 2.863466797862202E-4D, - 1.5011828509159386E-4D, - 1.1911492038052529E-5D, 1.0044277587439865E-4D, 2.4089615908451378E-4D, 3.8259042776189744E-4D, 5.168318748474121E-4D, 6.586313829757273E-4D, 7.998387445695698E-4D, 9.450495708733797E-4D, 0.0010857662418857217D, 0.0012270103907212615D, 0.0013727317564189434D, 0.0015129010425880551D, 0.0016575645422562957D, 0.0017949064495041966D, 0.0019364129984751344D, 0.0020784020889550447D, 0.0022141814697533846D, 0.002355905482545495D, 0.0024919311981648207D, 0.0026356957387179136D, 0.002776813693344593D, 0.002913307398557663D, 0.0030520898289978504D, 0.0031952024437487125D, 0.003334963461384177D, 0.0034765605814754963D, 0.0036186855286359787D, 0.003756078891456127D, 0.003890153020620346D, 0.00403519906103611D, 0.004175015725195408D, 0.004315280355513096D, 0.004453583620488644D, 0.004600624553859234D, 0.004738769959658384D, 0.0048819067887961864D, 0.00502460403367877D, 0.005163980647921562D, 0.00530367624014616D, 0.0054444135166704655D, 0.005587113089859486D, 0.005727327894419432D, 0.005868169944733381D, 0.006005023140460253D, 0.006145890802145004D, 0.006285244598984718D, 0.006429470144212246D, 0.006562682334333658D, 0.006704656407237053D, 0.006846507545560598D, 0.006985656917095184D, 0.007125002332031727D, 0.0072641754522919655D, 0.007406939286738634D, 0.007548102177679539D, 0.007690674625337124D, 0.007831089198589325D, 0.007975874468684196D, 0.008120712824165821D, 0.008261434733867645D, 0.008401445113122463D, 0.008544900454580784D, 0.008687532506883144D, 0.008825301192700863D, 0.008967659436166286D, 0.00910977553576231D, 0.009249896742403507D, 0.009386919438838959D, 0.009527354501187801D, 0.009668641723692417D, 0.009810841642320156D, 0.009948905557394028D, 0.010086851194500923D, 0.010232945904135704D, 0.010377375409007072D, 0.010519984178245068D, 0.01066502183675766D, 0.010805521160364151D, 0.01095004752278328D, 0.011089478619396687D, 0.011232255026698112D, 0.011374537833034992D, 0.011516883037984371D, 0.011656570248305798D, 0.01180147286504507D, 0.011942529119551182D, 0.012080904096364975D, 0.012226544320583344D, 0.012367763556540012D, 0.01251029223203659D, 0.012649907730519772D, 0.012789136730134487D, 0.012928737327456474D, 0.01306520588696003D, 0.01320936344563961D, 0.013349758461117744D, 0.01349073089659214D, 0.01362910307943821D, 0.013771780766546726D, 0.013916674070060253D, 0.014057740569114685D, 0.014193498529493809D, 0.014332176186144352D, 0.014474655501544476D, 0.014616861939430237D, 0.01476175058633089D, 0.014896937645971775D, 0.015033396892249584D, 0.015173542313277721D, 0.015313568525016308D, 0.015453768894076347D, 0.01559944823384285D, 0.015740878880023956D, 0.0158759206533432D, 0.016010040417313576D, 0.01614815928041935D, 0.016291707754135132D, 0.01642908714711666D, 0.016571102663874626D, 0.0167134590446949D, 0.016856668516993523D, 0.01699613407254219D, 0.017135608941316605D, 0.017271164804697037D, 0.017408248037099838D, 0.017549676820635796D, 0.017692318186163902D, 0.01783503033220768D, 0.017975015565752983D, 0.018124109134078026D, 0.018262648954987526D, 0.01840408705174923D, 0.01854878105223179D, 0.01869070902466774D, 0.01883384957909584D, 0.01896996609866619D, 0.019111407920718193D, 0.019254807382822037D, 0.01939486153423786D, 0.019534043967723846D, 0.019675271585583687D, 0.01981993578374386D, 0.0199629794806242D, 0.020102735608816147D, 0.02024231106042862D, 0.02038371004164219D, 0.02052323706448078D, 0.020661482587456703D, 0.02080468460917473D, 0.020946234464645386D, 0.021089831367135048D, 0.021232876926660538D, 0.021373441442847252D, 0.021513110026717186D, 0.021651804447174072D, 0.021792175248265266D, 0.02193247526884079D, 0.02207680605351925D, 0.022216327488422394D, 0.022360535338521004D, 0.022502677515149117D, 0.022643806412816048D, 0.022783884778618813D, 0.022923531010746956D, 0.023063546046614647D, 0.023204835131764412D, 0.02334384247660637D, 0.0234853345900774D, 0.023626044392585754D, 0.023764535784721375D, 0.023903118446469307D, 0.024048229679465294D, 0.024190595373511314D, 0.024332139641046524D, 0.024473512545228004D, 0.024614179506897926D, 0.02475305274128914D, 0.02489588037133217D, 0.025042027235031128D, 0.02518259361386299D, 0.02532017230987549D, 0.025456052273511887D, 0.025593649595975876D, 0.02572823315858841D, 0.025868959724903107D, 0.026007654145359993D, 0.026148367673158646D, 0.0262919794768095D, 0.026437588036060333D, 0.02657989040017128D, 0.02672424539923668D, 0.02686365135014057D, 0.027008309960365295D, 0.02714969776570797D, 0.0272962786257267D, 0.027433041483163834D, 0.027577880769968033D, 0.027716439217329025D, 0.02785547636449337D, 0.02799663133919239D, 0.028138086199760437D, 0.028283756226301193D, 0.02842445857822895D, 0.028564687818288803D, 0.02871151641011238D, 0.028853772208094597D, 0.028992416337132454D, 0.029137132689356804D, 0.02927905134856701D, 0.02942042425274849D, 0.029561731964349747D, 0.02970500849187374D, 0.029843736439943314D, 0.029985306784510612D, 0.030128538608551025D, 0.030271068215370178D, 0.030412210151553154D, 0.030556289479136467D, 0.030699994415044785D, 0.030839497223496437D, 0.030983222648501396D, 0.031125547364354134D, 0.03126153349876404D, 0.03140360862016678D, 0.03154664859175682D, 0.03168836608529091D, 0.03183047100901604D, 0.031973324716091156D, 0.032119471579790115D, 0.032263923436403275D, 0.03240408003330231D, 0.03255024179816246D, 0.03268946334719658D, 0.032828912138938904D, 0.03296731039881706D, 0.033110037446022034D, 0.0332510732114315D, 0.033393360674381256D, 0.03353823721408844D, 0.03368401527404785D, 0.033826667815446854D, 0.03397251293063164D, 0.03411085903644562D, 0.03425149992108345D, 0.03439020738005638D, 0.03453071042895317D, 0.03467126935720444D, 0.03481120616197586D, 0.03495373949408531D, 0.03510218858718872D, 0.03524219989776611D, 0.03538297861814499D, 0.03552223742008209D, 0.03566665202379227D, 0.035811614245176315D, 0.03595492243766785D, 0.036098580807447433D, 0.03623691946268082D, 0.036375124007463455D, 0.03651357814669609D, 0.03665870800614357D, 0.03680017217993736D, 0.03694377467036247D, 0.03708707168698311D, 0.03722917661070824D, 0.03737087547779083D, 0.03751356527209282D, 0.037658076733350754D, 0.03780198469758034D, 0.03794156014919281D, 0.03808009997010231D, 0.038226112723350525D, 0.03837020695209503D, 0.03851321339607239D, 0.03865883871912956D, 0.038796741515398026D, 0.0389384850859642D, 0.039080578833818436D, 0.039222534745931625D, 0.03936350718140602D, 0.03950297087430954D, 0.039649803191423416D, 0.03979025036096573D, 0.03993142768740654D, 0.04007851704955101D, 0.04022213816642761D, 0.04036031663417816D, 0.04050862044095993D, 0.04065130278468132D, 0.04079713299870491D, 0.04093990474939346D, 0.04108305647969246D, 0.041225969791412354D, 0.041370511054992676D, 0.04151448979973793D, 0.041656360030174255D, 0.04179975762963295D, 0.0419391430914402D, 0.04208112135529518D, 0.042221635580062866D, 0.04236719012260437D, 0.04251044988632202D, 0.042655352503061295D, 0.04279865324497223D, 0.04294498264789581D, 0.04309157654643059D, 0.0432388074696064D, 0.043379221111536026D, 0.04352143779397011D, 0.0436660498380661D, 0.043809980154037476D, 0.043953701853752136D, 0.04409695789217949D, 0.044244274497032166D, 0.04439061880111694D, 0.04453623667359352D, 0.044679705053567886D, 0.04482024908065796D, 0.044966381043195724D, 0.04511309415102005D, 0.04525725916028023D, 0.04540384188294411D, 0.04554888978600502D, 0.04569651558995247D, 0.045842498540878296D, 0.04599529504776001D, 0.04613592103123665D, 0.04628181457519531D, 0.04642462357878685D, 0.046567466109991074D, 0.04671074077486992D, 0.04685356095433235D, 0.04699184000492096D, 0.04713955894112587D, 0.047283634543418884D, 0.04742766171693802D, 0.047572653740644455D, 0.04771960899233818D, 0.04786102473735809D, 0.048005830496549606D, 0.04814976453781128D, 0.04828828200697899D, 0.04843548312783241D, 0.04858119785785675D, 0.048723604530096054D, 0.048864372074604034D, 0.049006760120391846D, 0.04914587363600731D, 0.049290046095848083D, 0.04943503066897392D, 0.0495775006711483D, 0.04972691833972931D, 0.04986768960952759D, 0.05001039057970047D, 0.050152115523815155D, 0.05029670521616936D, 0.050433799624443054D, 0.05058044195175171D, 0.05072341486811638D, 0.050868451595306396D, 0.05100876837968826D, 0.05115212872624397D, 0.05129583179950714D, 0.051437895745038986D, 0.051578447222709656D, 0.05172283574938774D, 0.05186808481812477D, 0.05201121047139168D, 0.052156444638967514D, 0.05230209603905678D, 0.05244390666484833D, 0.05258335545659065D, 0.052733324468135834D, 0.052873220294713974D, 0.053014714270830154D, 0.053156204521656036D, 0.05330459401011467D, 0.05344386771321297D, 0.05358799546957016D, 0.05373207479715347D, 0.05387803167104721D, 0.05401966720819473D, 0.054165832698345184D, 0.05431075394153595D, 0.05445530638098717D, 0.05459970980882645D, 0.05474735423922539D, 0.054893892258405685D, 0.055043041706085205D, 0.055188897997140884D, 0.05533526465296745D, 0.055484600365161896D, 0.055627673864364624D, 0.05576412007212639D, 0.05590971186757088D, 0.05605686828494072D, 0.056200768798589706D, 0.05634428188204765D, 0.056488286703825D, 0.05663173645734787D, 0.056780435144901276D, 0.056926608085632324D, 0.05707206204533577D, 0.05721326544880867D, 0.057361286133527756D, 0.05750444158911705D, 0.05764487013220787D, 0.0577898845076561D, 0.05793076753616333D, 0.058076728135347366D, 0.058221399784088135D, 0.05836668983101845D, 0.0585147961974144D, 0.05866195634007454D, 0.058808885514736176D, 0.05895547941327095D, 0.05910357087850571D, 0.05925220251083374D, 0.059399936348199844D, 0.059544846415519714D, 0.0596906840801239D, 0.05983436480164528D, 0.059979792684316635D, 0.06012662872672081D, 0.06027741730213165D, 0.060420021414756775D, 0.06056952476501465D, 0.06071772798895836D, 0.06086060404777527D, 0.06100845709443092D, 0.06115204840898514D, 0.06129597872495651D, 0.061436720192432404D, 0.06158551573753357D, 0.061730656772851944D, 0.061872199177742004D, 0.062023792415857315D, 0.06216789036989212D, 0.062311336398124695D, 0.06245182454586029D, 0.06259559094905853D, 0.06274344027042389D, 0.06288424134254456D, 0.06303341686725616D, 0.06318292021751404D, 0.06332501769065857D, 0.0634644404053688D, 0.06361117213964462D, 0.06375652551651001D, 0.06389967352151871D, 0.06404681503772736D, 0.06419290602207184D, 0.06433777511119843D, 0.06448273360729218D, 0.06462704390287399D, 0.06476743519306183D, 0.06491541117429733D, 0.06506048142910004D, 0.06520365178585052D, 0.06535018980503082D, 0.06549554318189621D, 0.06563982367515564D, 0.06578198075294495D, 0.06592462956905365D, 0.06607501208782196D, 0.06622092425823212D, 0.06637339293956757D, 0.06651996076107025D, 0.06666484475135803D, 0.06681187450885773D, 0.06696231663227081D, 0.06711585819721222D, 0.06726408004760742D, 0.06741142272949219D, 0.06756040453910828D, 0.06770794093608856D, 0.06785459071397781D, 0.06800307333469391D, 0.0681459829211235D, 0.06829492747783661D, 0.06843948364257812D, 0.06858658790588379D, 0.06873581558465958D, 0.06887979060411453D, 0.06902722269296646D, 0.06917352229356766D, 0.06932160258293152D, 0.06947020441293716D, 0.06961338222026825D, 0.0697583258152008D, 0.06990432739257812D, 0.07005196064710617D, 0.07020289450883865D, 0.07034890353679657D, 0.0704943984746933D, 0.07064209878444672D, 0.07078889012336731D, 0.07093801349401474D, 0.07108846306800842D, 0.07123790681362152D, 0.0713827982544899D, 0.07153139263391495D, 0.07167878746986389D, 0.0718243345618248D, 0.07197458297014236D, 0.0721186175942421D, 0.07226993888616562D, 0.07241969555616379D, 0.07256375253200531D, 0.07271335273981094D, 0.0728621557354927D, 0.07300735265016556D, 0.07315520942211151D, 0.0733007937669754D, 0.07344561070203781D, 0.07359104603528976D, 0.07373455911874771D, 0.07388798892498016D, 0.07403958588838577D, 0.07419036328792572D, 0.07433661073446274D, 0.07448694854974747D, 0.07463737577199936D, 0.07478373497724533D, 0.07492654025554657D, 0.07507633417844772D, 0.07522371411323547D, 0.07537233084440231D, 0.07551730424165726D, 0.07567018270492554D, 0.07581793516874313D, 0.07596828043460846D, 0.07611866295337677D, 0.07626424729824066D, 0.07641275972127914D, 0.07655782997608185D, 0.07670912891626358D, 0.07685425132513046D, 0.0769948735833168D, 0.07714076340198517D, 0.07728724926710129D, 0.07743407785892487D, 0.07758434861898422D, 0.07773226499557495D, 0.07788585126399994D, 0.07802983373403549D, 0.07818049192428589D, 0.07832662761211395D, 0.0784769281744957D, 0.07862069457769394D, 0.07877039164304733D, 0.07891900837421417D, 0.07907077670097351D, 0.07921970635652542D, 0.07936611026525497D, 0.07951349020004272D, 0.07966248691082001D, 0.07980795949697495D, 0.07995842397212982D, 0.08010289818048477D, 0.08025183528661728D, 0.08040019869804382D, 0.0805511549115181D, 0.08069602400064468D, 0.08084388077259064D, 0.08099634200334549D, 0.08114219456911087D, 0.08129317313432693D, 0.08143977075815201D, 0.08159446716308594D, 0.08174245059490204D, 0.08189191669225693D, 0.08204131573438644D, 0.08219429105520248D, 0.08234331756830215D, 0.08249454945325851D, 0.08264464884996414D, 0.08279923349618912D, 0.08295143395662308D, 0.08310498297214508D, 0.08325477689504623D, 0.08341126888990402D, 0.08355995267629623D, 0.08371108770370483D, 0.0838567465543747D, 0.0840054377913475D, 0.08415643125772476D, 0.0843018889427185D, 0.08445502817630768D, 0.08460331708192825D, 0.08475178480148315D, 0.08490157872438431D, 0.0850466936826706D, 0.08519754558801651D, 0.08534461259841919D, 0.08549437671899796D, 0.08564329892396927D, 0.08579885959625244D, 0.08595023304224014D, 0.08609388023614883D, 0.08624261617660522D, 0.08639498800039291D, 0.08654710650444031D, 0.08670050650835037D, 0.08685077726840973D, 0.08700422197580338D, 0.08715102076530457D, 0.0872977003455162D, 0.08744174242019653D, 0.08759422600269318D, 0.08774594217538834D, 0.08788730204105377D, 0.0880391076207161D, 0.08819255977869034D, 0.08835027366876602D, 0.08849414438009262D, 0.08864499628543854D, 0.08879048377275467D, 0.0889355018734932D, 0.08908633887767792D, 0.08923996984958649D, 0.08938561379909515D, 0.08953885734081268D, 0.08968373388051987D, 0.08983418345451355D, 0.0899851843714714D, 0.09013000875711441D, 0.09028015285730362D, 0.09042900800704956D, 0.09057943522930145D, 0.09072867780923843D, 0.09087312966585159D, 0.0910261869430542D, 0.09117311239242554D, 0.09132302552461624D, 0.09147395193576813D, 0.09162616729736328D, 0.09177488088607788D, 0.09192109853029251D, 0.09207016974687576D, 0.09221813082695007D, 0.09237463772296906D, 0.09252386540174484D, 0.0926787331700325D, 0.09283152222633362D, 0.0929817333817482D, 0.09312929958105087D, 0.09328164160251617D, 0.09343400597572327D, 0.09358806163072586D, 0.09373386949300766D, 0.09388978779315948D, 0.09403824061155319D, 0.09419355541467667D, 0.09434627741575241D, 0.09449343383312225D, 0.09464648365974426D, 0.09479928016662598D, 0.0949493870139122D, 0.09509287029504776D, 0.09524017572402954D, 0.09539571404457092D, 0.0955447256565094D, 0.09569557756185532D, 0.0958479791879654D, 0.09600166976451874D, 0.09614894539117813D, 0.0962982177734375D, 0.09644953906536102D, 0.09659972786903381D, 0.09674496948719025D, 0.09690061956644058D, 0.09705154597759247D, 0.09720408916473389D, 0.09735329449176788D, 0.09750240296125412D, 0.09765297919511795D, 0.09780307859182358D, 0.09795534610748291D, 0.09811047464609146D, 0.09826676547527313D, 0.09841451048851013D, 0.09856410324573517D, 0.09871689975261688D, 0.09886790066957474D, 0.099018894135952D, 0.09916773438453674D, 0.09932077676057816D, 0.09947634488344193D, 0.09962969273328781D, 0.09978242218494415D, 0.09993064403533936D, 0.10008084774017334D, 0.10023438930511475D, 0.10038559883832932D, 0.10053691267967224D, 0.10068517923355103D, 0.1008366048336029D, 0.10099314153194427D, 0.10114269703626633D, 0.10129916667938232D, 0.10144601762294769D, 0.10159671306610107D, 0.10175005346536636D, 0.10190296918153763D, 0.10205913335084915D, 0.10221262276172638D, 0.10236292332410812D, 0.10252030938863754D, 0.10267956554889679D, 0.10282602161169052D, 0.10297860950231552D, 0.10312694311141968D, 0.10327927768230438D, 0.10343994200229645D, 0.10359508544206619D, 0.10374914109706879D, 0.10390400141477585D, 0.10405304282903671D, 0.10420652478933334D, 0.10436088591814041D, 0.10451732575893402D, 0.10467734932899475D, 0.1048327088356018D, 0.10498455911874771D, 0.10513525456190109D, 0.10528642684221268D, 0.1054416224360466D, 0.10559043288230896D, 0.10574282705783844D, 0.10589909553527832D, 0.10605556517839432D, 0.10620948672294617D, 0.10636616498231888D, 0.10651878267526627D, 0.10667099058628082D, 0.1068253219127655D, 0.10697854310274124D, 0.10713843256235123D, 0.10728807747364044D, 0.10744231194257736D, 0.10759419202804565D, 0.1077449843287468D, 0.10790048539638519D, 0.1080583855509758D, 0.10821515321731567D, 0.1083710640668869D, 0.10852231085300446D, 0.10867666453123093D, 0.10882777720689774D, 0.10898458957672119D, 0.10913711041212082D, 0.10929664224386215D, 0.10945430397987366D, 0.10961125046014786D, 0.10976684093475342D, 0.10992513597011566D, 0.11008249223232269D, 0.11024082452058792D, 0.1103985533118248D, 0.11054976284503937D, 0.11070134490728378D, 0.1108558252453804D, 0.11100988835096359D, 0.11115804314613342D, 0.11131478101015091D, 0.11147209256887436D, 0.11162741482257843D, 0.11178641021251678D, 0.11193942278623581D, 0.1120971292257309D, 0.11224858462810516D, 0.11240638792514801D, 0.11256378889083862D, 0.11272016912698746D, 0.11287200450897217D, 0.11303041875362396D, 0.11318613588809967D, 0.11333518475294113D, 0.11348620057106018D, 0.11363913863897324D, 0.11379265785217285D, 0.11394768208265305D, 0.1140977144241333D, 0.11425047367811203D, 0.1144118458032608D, 0.11457011848688126D, 0.11472522467374802D, 0.11488304287195206D, 0.11503463238477707D, 0.11518769711256027D, 0.11534227430820465D, 0.11550097167491913D, 0.11565592885017395D, 0.11581210047006607D, 0.11596544831991196D, 0.11612154543399811D, 0.11628284305334091D, 0.11644155532121658D, 0.11660086363554001D, 0.11675584316253662D, 0.1169113963842392D, 0.11706878989934921D, 0.11722639948129654D, 0.11737873405218124D, 0.11753018200397491D, 0.11769700050354004D, 0.1178499087691307D, 0.11800309270620346D, 0.11816198378801346D, 0.1183200553059578D, 0.11847332119941711D, 0.11863360553979874D, 0.1187887191772461D, 0.11894822865724564D, 0.11911315470933914D, 0.11926519870758057D, 0.11942169815301895D, 0.11957871168851852D, 0.11973323673009872D, 0.11989237368106842D, 0.12004467844963074D, 0.12020543962717056D, 0.12036484479904175D, 0.1205243393778801D, 0.12068185210227966D, 0.12084473669528961D, 0.12100447714328766D, 0.12115930765867233D, 0.12131694704294205D, 0.1214812844991684D, 0.12163779884576797D, 0.12179568409919739D, 0.12195295840501785D, 0.12211063504219055D, 0.12226805835962296D, 0.12242195755243301D, 0.12257634848356247D, 0.12273655086755753D, 0.12289784848690033D, 0.12306149303913116D, 0.1232261061668396D, 0.12338338792324066D, 0.12354311347007751D, 0.12370559573173523D, 0.12387170642614365D, 0.12403009831905365D, 0.12418466806411743D, 0.12434112280607224D, 0.1244964450597763D, 0.12465308606624603D, 0.12481117248535156D, 0.12496909499168396D, 0.12512359023094177D, 0.12528195977210999D, 0.12543469667434692D, 0.12559561431407928D, 0.12575115263462067D, 0.12590746581554413D, 0.12606586515903473D, 0.12622293829917908D, 0.12637664377689362D, 0.12653762102127075D, 0.12669754028320312D, 0.12685619294643402D, 0.1270214170217514D, 0.12718062102794647D, 0.12733519077301025D, 0.12749606370925903D, 0.12765872478485107D, 0.12782463431358337D, 0.12798020243644714D, 0.1281414031982422D, 0.1283019781112671D, 0.12846773862838745D, 0.1286260485649109D, 0.12878255546092987D, 0.12894503772258759D, 0.1291048526763916D, 0.12926606833934784D, 0.12942789494991302D, 0.12959156930446625D, 0.12974515557289124D, 0.12989819049835205D, 0.1300552934408188D, 0.13021644949913025D, 0.13037624955177307D, 0.13053417205810547D, 0.13069522380828857D, 0.13085974752902985D, 0.13101573288440704D, 0.1311684399843216D, 0.13133539259433746D, 0.13149294257164001D, 0.13164502382278442D, 0.13180053234100342D, 0.1319563388824463D, 0.13211700320243835D, 0.1322767436504364D, 0.13244172930717468D, 0.1325972080230713D, 0.13275986909866333D, 0.13291573524475098D, 0.1330719292163849D, 0.1332334727048874D, 0.13339528441429138D, 0.13355481624603271D, 0.1337166279554367D, 0.13387836515903473D, 0.13404130935668945D, 0.13420721888542175D, 0.1343671977519989D, 0.1345280408859253D, 0.1346929669380188D, 0.13485346734523773D, 0.13500912487506866D, 0.13516193628311157D, 0.13532406091690063D, 0.13548418879508972D, 0.13564568758010864D, 0.135810986161232D, 0.13597291707992554D, 0.13613833487033844D, 0.1363004446029663D, 0.13646268844604492D, 0.1366201788187027D, 0.13678020238876343D, 0.13693927228450775D, 0.13709722459316254D, 0.1372576802968979D, 0.13741405308246613D, 0.13756953179836273D, 0.13772514462471008D, 0.13788801431655884D, 0.13804712891578674D, 0.13820964097976685D, 0.13837288320064545D, 0.13853824138641357D, 0.13870278000831604D, 0.13886971771717072D, 0.13903354108333588D, 0.13919901847839355D, 0.13936829566955566D, 0.13953237235546112D, 0.13969917595386505D, 0.1398545652627945D, 0.14002016186714172D, 0.14017291367053986D, 0.1403316706418991D, 0.14050057530403137D, 0.14065955579280853D, 0.14082512259483337D, 0.1409870684146881D, 0.14115603268146515D, 0.14131535589694977D, 0.14147478342056274D, 0.14164136350154877D, 0.14179907739162445D, 0.14195680618286133D, 0.14212191104888916D, 0.14228470623493195D, 0.14245115220546722D, 0.14261163771152496D, 0.14276936650276184D, 0.14292646944522858D, 0.14308787882328033D, 0.14325685799121857D, 0.14342321455478668D, 0.14359009265899658D, 0.1437581181526184D, 0.14392387866973877D, 0.14408327639102936D, 0.14425180852413177D, 0.14441044628620148D, 0.14458023011684418D, 0.1447472721338272D, 0.14490540325641632D, 0.14506784081459045D, 0.14523136615753174D, 0.14539727568626404D, 0.14555899798870087D, 0.1457156389951706D, 0.14588384330272675D, 0.146047443151474D, 0.14621107280254364D, 0.14637504518032074D, 0.14653868973255157D, 0.14670564234256744D, 0.1468755155801773D, 0.14703933894634247D, 0.14720577001571655D, 0.14737312495708466D, 0.14753885567188263D, 0.14770390093326569D, 0.14786669611930847D, 0.14803257584571838D, 0.14819718897342682D, 0.14836236834526062D, 0.14852797985076904D, 0.14869222044944763D, 0.14885452389717102D, 0.1490185558795929D, 0.14917722344398499D, 0.1493404656648636D, 0.14950552582740784D, 0.14966335892677307D, 0.14982236921787262D, 0.14998695254325867D, 0.1501506268978119D, 0.15031972527503967D, 0.1504816859960556D, 0.15064984560012817D, 0.15081049501895905D, 0.1509808599948883D, 0.15114429593086243D, 0.151309534907341D, 0.15147188305854797D, 0.15163883566856384D, 0.1517990082502365D, 0.15196684002876282D, 0.15213605761528015D, 0.1523030698299408D, 0.15247197449207306D, 0.1526411473751068D, 0.1528036892414093D, 0.15297077596187592D, 0.15313620865345D, 0.1533014178276062D, 0.1534666270017624D, 0.153630793094635D, 0.15379439294338226D, 0.15396162867546082D, 0.15412606298923492D, 0.15429098904132843D, 0.15445642173290253D, 0.15462461113929749D, 0.1547926366329193D, 0.15496547520160675D, 0.15512865781784058D, 0.15529468655586243D, 0.15546265244483948D, 0.1556297242641449D, 0.1557958573102951D, 0.1559613198041916D, 0.15613020956516266D, 0.15629254281520844D, 0.15645910799503326D, 0.15662696957588196D, 0.15679779648780823D, 0.1569603830575943D, 0.1571267694234848D, 0.15729504823684692D, 0.15745952725410461D, 0.15762628614902496D, 0.15778855979442596D, 0.15795747935771942D, 0.1581190824508667D, 0.15828733146190643D, 0.15845201909542084D, 0.15861950814723969D, 0.1587860882282257D, 0.1589500457048416D, 0.15911708772182465D, 0.15928740799427032D, 0.1594506800174713D, 0.1596156507730484D, 0.1597830355167389D, 0.15995223820209503D, 0.1601230353116989D, 0.16028858721256256D, 0.16046783328056335D, 0.16063354909420013D, 0.16080449521541595D, 0.16097332537174225D, 0.16114337742328644D, 0.16131465137004852D, 0.161483496427536D, 0.1616491973400116D, 0.16181625425815582D, 0.1619846075773239D, 0.16215431690216064D, 0.16232497990131378D, 0.16249686479568481D, 0.1626671552658081D, 0.16284231841564178D, 0.16301144659519196D, 0.16317616403102875D, 0.1633453667163849D, 0.1635095179080963D, 0.1636842042207718D, 0.1638593226671219D, 0.16402937471866608D, 0.16418977081775665D, 0.1643621176481247D, 0.16453686356544495D, 0.1647082269191742D, 0.16487736999988556D, 0.16504469513893127D, 0.16521750390529633D, 0.16538292169570923D, 0.16555410623550415D, 0.16572774946689606D, 0.16590924561023712D, 0.1660730093717575D, 0.16624289751052856D, 0.16641287505626678D, 0.16657964885234833D, 0.1667483001947403D, 0.16692405939102173D, 0.16709285974502563D, 0.16726498305797577D, 0.1674390435218811D, 0.1676134467124939D, 0.16778451204299927D, 0.16795344650745392D, 0.16812381148338318D, 0.16829201579093933D, 0.1684664785861969D, 0.1686391979455948D, 0.16881050169467926D, 0.16898894309997559D, 0.16915665566921234D, 0.16932551562786102D, 0.16949592530727386D, 0.1696702241897583D, 0.16984823346138D, 0.17002031207084656D, 0.1701897382736206D, 0.17036403715610504D, 0.17053993046283722D, 0.17071034014225006D, 0.1708792746067047D, 0.1710500866174698D, 0.17121891677379608D, 0.17139190435409546D, 0.17156367003917694D, 0.17173637449741364D, 0.17190755903720856D, 0.1720849573612213D, 0.17225277423858643D, 0.17242112755775452D, 0.17259423434734344D, 0.17276640236377716D, 0.17293871939182281D, 0.17311054468154907D, 0.17328397929668427D, 0.17345906794071198D, 0.17363303899765015D, 0.1738104373216629D, 0.17397917807102203D, 0.17414800822734833D, 0.17431917786598206D, 0.17449432611465454D, 0.17466172575950623D, 0.1748395413160324D, 0.17501668632030487D, 0.17519143223762512D, 0.17536838352680206D, 0.1755412071943283D, 0.17571064829826355D, 0.17589080333709717D, 0.17606942355632782D, 0.176247239112854D, 0.17641842365264893D, 0.17658698558807373D, 0.17676332592964172D, 0.176935613155365D, 0.17710785567760468D, 0.17728090286254883D, 0.17745928466320038D, 0.1776321828365326D, 0.17780578136444092D, 0.17798294126987457D, 0.17815785109996796D, 0.17833979427814484D, 0.17851093411445618D, 0.1786835491657257D, 0.17886051535606384D, 0.1790376603603363D, 0.17921648919582367D, 0.17939159274101257D, 0.17957083880901337D, 0.1797502636909485D, 0.17992530763149261D, 0.1801026463508606D, 0.18028408288955688D, 0.18045489490032196D, 0.1806340366601944D, 0.1808105707168579D, 0.18098872900009155D, 0.1811632215976715D, 0.18134437501430511D, 0.18152523040771484D, 0.18170255422592163D, 0.18187786638736725D, 0.18205541372299194D, 0.18223069608211517D, 0.18240229785442352D, 0.1825835108757019D, 0.18276111781597137D, 0.18293944001197815D, 0.18311530351638794D, 0.18329167366027832D, 0.18346892297267914D, 0.1836460679769516D, 0.1838228851556778D, 0.18399597704410553D, 0.18417446315288544D, 0.1843516230583191D, 0.184530109167099D, 0.18470726907253265D, 0.18488577008247375D, 0.18506748974323273D, 0.185249924659729D, 0.18543273210525513D, 0.1856096237897873D, 0.18578913807868958D, 0.1859683245420456D, 0.18614578247070312D, 0.18632252514362335D, 0.1864963322877884D, 0.18667510151863098D, 0.1868581920862198D, 0.18703486025333405D, 0.18721888959407806D, 0.18739253282546997D, 0.18757246434688568D, 0.1877577155828476D, 0.18793287873268127D, 0.18811465799808502D, 0.1882943958044052D, 0.18847425282001495D, 0.18864761292934418D, 0.18882161378860474D, 0.18899816274642944D, 0.18917573988437653D, 0.18935945630073547D, 0.18953947722911835D, 0.189716637134552D, 0.18990230560302734D, 0.19007518887519836D, 0.19025564193725586D, 0.1904321163892746D, 0.19061104953289032D, 0.19078995287418365D, 0.190964937210083D, 0.19114817678928375D, 0.19132809340953827D, 0.19151580333709717D, 0.19169238209724426D, 0.19187597930431366D, 0.19205956161022186D, 0.19224511086940765D, 0.19242414832115173D, 0.19260457158088684D, 0.19278565049171448D, 0.19296668469905853D, 0.19314511120319366D, 0.193329855799675D, 0.19351661205291748D, 0.1937016248703003D, 0.19387923181056976D, 0.1940610557794571D, 0.194246307015419D, 0.19443221390247345D, 0.19460652768611908D, 0.19479267299175262D, 0.1949712485074997D, 0.1951516568660736D, 0.19533394277095795D, 0.1955246925354004D, 0.19570086896419525D, 0.19588221609592438D, 0.19606895744800568D, 0.19625340402126312D, 0.19644010066986084D, 0.19662165641784668D, 0.1968076378107071D, 0.19699516892433167D, 0.1971805989742279D, 0.1973554939031601D, 0.1975409835577011D, 0.1977252960205078D, 0.19790977239608765D, 0.1980927288532257D, 0.19827796518802643D, 0.19846612215042114D, 0.19864800572395325D, 0.19883641600608826D, 0.19901731610298157D, 0.1992063969373703D, 0.19938835501670837D, 0.1995694637298584D, 0.19975224137306213D, 0.19993893802165985D, 0.20012065768241882D, 0.20030593872070312D, 0.20049719512462616D, 0.20067352056503296D, 0.20086051523685455D, 0.20104587078094482D, 0.2012348473072052D, 0.20142585039138794D, 0.20161063969135284D, 0.20179665088653564D, 0.20198526978492737D, 0.20217211544513702D, 0.20235659182071686D, 0.20254142582416534D, 0.20272696018218994D, 0.20291101932525635D, 0.20309440791606903D, 0.20328234136104584D, 0.20347049832344055D, 0.20365656912326813D, 0.203854501247406D, 0.20404016971588135D, 0.2042284607887268D, 0.20441436767578125D, 0.20460355281829834D, 0.20478859543800354D, 0.2049754112958908D, 0.20516854524612427D, 0.20535217225551605D, 0.20553888380527496D, 0.20573171973228455D, 0.20591837167739868D, 0.20610769093036652D, 0.2063007354736328D, 0.20649467408657074D, 0.2066875845193863D, 0.20687413215637207D, 0.2070641964673996D, 0.2072521448135376D, 0.20743364095687866D, 0.20761997997760773D, 0.20781198143959045D, 0.20800599455833435D, 0.20819956064224243D, 0.2083868831396103D, 0.2085733562707901D, 0.20876942574977875D, 0.20896922051906586D, 0.20915867388248444D, 0.2093524932861328D, 0.20954589545726776D, 0.2097388058900833D, 0.20992672443389893D, 0.21011590957641602D, 0.21031244099140167D, 0.21050217747688293D, 0.21069328486919403D, 0.2108885496854782D, 0.21107973158359528D, 0.21127483248710632D, 0.21146471798419952D, 0.21166469156742096D, 0.21185675263404846D, 0.2120511382818222D, 0.21224676072597504D, 0.2124384641647339D, 0.21262727677822113D, 0.2128206193447113D, 0.21302452683448792D, 0.2132214456796646D, 0.2134128361940384D, 0.21360456943511963D, 0.2137957513332367D, 0.21398882567882538D, 0.21418625116348267D, 0.21438726782798767D, 0.21458405256271362D, 0.21478569507598877D, 0.2149859517812729D, 0.2151806354522705D, 0.21538639068603516D, 0.21557798981666565D, 0.2157720923423767D, 0.21596337854862213D, 0.21616080403327942D, 0.2163562923669815D, 0.21655449271202087D, 0.2167525738477707D, 0.21694263815879822D, 0.21713177859783173D, 0.21732954680919647D, 0.21752935647964478D, 0.21772217750549316D, 0.21791480481624603D, 0.21811674535274506D, 0.21831247210502625D, 0.21851235628128052D, 0.21870890259742737D, 0.2189081758260727D, 0.21910427510738373D, 0.21930015087127686D, 0.21949778497219086D, 0.21969933807849884D, 0.21990087628364563D, 0.22009927034378052D, 0.22029325366020203D, 0.22049371898174286D, 0.22069047391414642D, 0.22089248895645142D, 0.22109095752239227D, 0.22129462659358978D, 0.22148814797401428D, 0.22169452905654907D, 0.2218969613313675D, 0.22209632396697998D, 0.22230185568332672D, 0.22250638902187347D, 0.2227063924074173D, 0.22290310263633728D, 0.22311145067214966D, 0.2233133167028427D, 0.22350966930389404D, 0.2237071990966797D, 0.22390885651111603D, 0.2241075336933136D, 0.22431014478206635D, 0.22450794279575348D, 0.22470755875110626D, 0.22491036355495453D, 0.22511586546897888D, 0.2253158539533615D, 0.22551269829273224D, 0.2257266342639923D, 0.22592762112617493D, 0.22613157331943512D, 0.22633376717567444D, 0.22653743624687195D, 0.22674024105072021D, 0.2269410938024521D, 0.22714996337890625D, 0.22734971344470978D, 0.22755438089370728D, 0.22775733470916748D, 0.22795677185058594D, 0.22816292941570282D, 0.22837083041667938D, 0.22858299314975739D, 0.2287832796573639D, 0.2289920300245285D, 0.22919484972953796D, 0.2293976992368698D, 0.22960828244686127D, 0.22981193661689758D, 0.2300211489200592D, 0.23022563755512238D, 0.2304365634918213D, 0.2306395173072815D, 0.23084834218025208D, 0.23105144500732422D, 0.2312522679567337D, 0.23145829141139984D, 0.23166124522686005D, 0.23187236487865448D, 0.23208360373973846D, 0.23229150474071503D, 0.23250751197338104D, 0.2327122539281845D, 0.23292763531208038D, 0.23313376307487488D, 0.23334120213985443D, 0.23354649543762207D, 0.23375554382801056D, 0.23396620154380798D, 0.23417723178863525D, 0.2343829721212387D, 0.23458978533744812D, 0.23479892313480377D, 0.23500783741474152D, 0.2352222204208374D, 0.2354322373867035D, 0.23564279079437256D, 0.23585160076618195D, 0.23605337738990784D, 0.23626479506492615D, 0.23648226261138916D, 0.2366953194141388D, 0.23690584301948547D, 0.23711639642715454D, 0.23733076453208923D, 0.23753586411476135D, 0.23774738609790802D, 0.23796023428440094D, 0.23817838728427887D, 0.2383866310119629D, 0.23860763013362885D, 0.23882152140140533D, 0.23903527855873108D, 0.23924735188484192D, 0.23945917189121246D, 0.23966942727565765D, 0.23988419771194458D, 0.2400980293750763D, 0.24030447006225586D, 0.240516796708107D, 0.24073119461536407D, 0.24094410240650177D, 0.24115683138370514D, 0.24137572944164276D, 0.24158714711666107D, 0.24180005490779877D, 0.2420184463262558D, 0.24223656952381134D, 0.24244916439056396D, 0.24266721308231354D, 0.2428855299949646D, 0.24310968816280365D, 0.243327334523201D, 0.2435457706451416D, 0.24375973641872406D, 0.2439749389886856D, 0.24419187009334564D, 0.24440546333789825D, 0.2446216642856598D, 0.24483764171600342D, 0.24505628645420074D, 0.2452733963727951D, 0.24548429250717163D, 0.24571490287780762D, 0.2459365725517273D, 0.24615846574306488D, 0.2463839054107666D, 0.2465975135564804D, 0.24682526290416718D, 0.24704609811306D, 0.24726620316505432D, 0.24748526513576508D, 0.24770237505435944D, 0.24791458249092102D, 0.24813757836818695D, 0.24836552143096924D, 0.24859130382537842D, 0.2488095611333847D, 0.24903202056884766D, 0.2492518126964569D, 0.24946889281272888D, 0.2496860921382904D, 0.2499072104692459D, 0.25012969970703125D, 0.25036224722862244D, 0.2505870461463928D, 0.2508128881454468D, 0.2510356307029724D, 0.25126001238822937D, 0.25148099660873413D, 0.25170382857322693D, 0.25192201137542725D, 0.2521439790725708D, 0.25237786769866943D, 0.25259867310523987D, 0.2528284192085266D, 0.2530532777309418D, 0.25327783823013306D, 0.25350385904312134D, 0.2537325918674469D, 0.2539677619934082D, 0.2541946470737457D, 0.2544255256652832D, 0.2546565532684326D, 0.25487953424453735D, 0.25510382652282715D, 0.25533539056777954D, 0.2555716931819916D, 0.25579825043678284D, 0.2560243308544159D, 0.25624626874923706D, 0.2564801275730133D, 0.2567085325717926D, 0.2569340765476227D, 0.2571656405925751D, 0.25739872455596924D, 0.2576286792755127D, 0.25786054134368896D, 0.2580936551094055D, 0.2583216726779938D, 0.25856003165245056D, 0.2587873339653015D, 0.25902122259140015D, 0.2592563033103943D, 0.2594849765300751D, 0.2597160339355469D, 0.25995558500289917D, 0.2601858973503113D, 0.2604183256626129D, 0.2606464922428131D, 0.26088303327560425D, 0.2611151337623596D, 0.26134592294692993D, 0.2615800201892853D, 0.2618105709552765D, 0.2620517909526825D, 0.2622908055782318D, 0.26252609491348267D, 0.2627618610858917D, 0.262994647026062D, 0.26323479413986206D, 0.26346999406814575D, 0.26371172070503235D, 0.26394981145858765D, 0.2641925811767578D, 0.26443660259246826D, 0.2646687924861908D, 0.26490625739097595D, 0.26514482498168945D, 0.2653883397579193D, 0.2656254470348358D, 0.26586461067199707D, 0.2660968005657196D, 0.26632776856422424D, 0.2665672302246094D, 0.2668079137802124D, 0.2670527696609497D, 0.26729103922843933D, 0.26753705739974976D, 0.267774760723114D, 0.2680116295814514D, 0.2682532072067261D, 0.2684982419013977D, 0.26874080300331116D, 0.26898348331451416D, 0.2692258656024933D, 0.26946553587913513D, 0.26971226930618286D, 0.26995396614074707D, 0.2702105641365051D, 0.2704511284828186D, 0.2706947326660156D, 0.2709454596042633D, 0.27119338512420654D, 0.2714472711086273D, 0.271695613861084D, 0.2719452679157257D, 0.2721904516220093D, 0.272445946931839D, 0.2727034091949463D, 0.27296075224876404D, 0.2732025980949402D, 0.27344566583633423D, 0.2736923396587372D, 0.273937851190567D, 0.2741943597793579D, 0.2744433581829071D, 0.2747053802013397D, 0.2749590575695038D, 0.27520620822906494D, 0.2754532992839813D, 0.27570030093193054D, 0.27594417333602905D, 0.2761920094490051D, 0.27644631266593933D, 0.2766968309879303D, 0.2769581079483032D, 0.277214914560318D, 0.2774685323238373D, 0.27772653102874756D, 0.2779829204082489D, 0.2782370150089264D, 0.2784930467605591D, 0.27874892950057983D, 0.2790064215660095D, 0.2792629301548004D, 0.2795135974884033D, 0.27977338433265686D, 0.28003010153770447D, 0.2802872657775879D, 0.2805541753768921D, 0.28081098198890686D, 0.28106915950775146D, 0.2813355028629303D, 0.2816014885902405D, 0.28186270594596863D, 0.28211551904678345D, 0.28238385915756226D, 0.28264784812927246D, 0.2829170227050781D, 0.28318625688552856D, 0.28344595432281494D, 0.2837064266204834D, 0.2839750647544861D, 0.28424525260925293D, 0.2845102846622467D, 0.2847710847854614D, 0.28503847122192383D, 0.285302072763443D, 0.2855624556541443D, 0.28583529591560364D, 0.28610533475875854D, 0.2863694727420807D, 0.28663894534111023D, 0.28690820932388306D, 0.2871835231781006D, 0.2874460816383362D, 0.28770965337753296D, 0.28797629475593567D, 0.28824037313461304D, 0.2885114252567291D, 0.28877952694892883D, 0.28905394673347473D, 0.2893272340297699D, 0.2896009385585785D, 0.2898753881454468D, 0.2901516556739807D, 0.29043030738830566D, 0.2906986474990845D, 0.2909756600856781D, 0.2912502586841583D, 0.2915216088294983D, 0.2917991578578949D, 0.2920747995376587D, 0.29235514998435974D, 0.29263055324554443D, 0.29290643334388733D, 0.29318350553512573D, 0.2934582233428955D, 0.2937442362308502D, 0.29402175545692444D, 0.2943044602870941D, 0.29458490014076233D, 0.294856458902359D, 0.29513412714004517D, 0.2954207956790924D, 0.2957027554512024D, 0.29599303007125854D, 0.2962748110294342D, 0.29655298590660095D, 0.29684072732925415D, 0.2971268594264984D, 0.297414630651474D, 0.29770198464393616D, 0.2979874312877655D, 0.2982670068740845D, 0.2985551059246063D, 0.2988506555557251D, 0.29913589358329773D, 0.29941803216934204D, 0.29970577359199524D, 0.2999911904335022D, 0.30029740929603577D, 0.30059298872947693D, 0.30088740587234497D, 0.30117687582969666D, 0.3014709949493408D, 0.3017614483833313D, 0.3020592927932739D, 0.3023589253425598D, 0.30265122652053833D, 0.3029458820819855D, 0.3032380938529968D, 0.3035353124141693D, 0.3038356900215149D, 0.30413827300071716D, 0.3044430613517761D, 0.3047422170639038D, 0.30505242943763733D, 0.3053557276725769D, 0.3056688904762268D, 0.30598193407058716D, 0.3062831461429596D, 0.3065822124481201D, 0.3068911135196686D, 0.3071833848953247D, 0.30748212337493896D, 0.30779045820236206D, 0.30809691548347473D, 0.30840522050857544D, 0.30872541666030884D, 0.30904072523117065D, 0.30936363339424133D, 0.3096707761287689D, 0.3099910020828247D, 0.31029611825942993D, 0.3106105327606201D, 0.31092625856399536D, 0.3112245798110962D, 0.3115399479866028D, 0.3118637800216675D, 0.31218570470809937D, 0.31249749660491943D, 0.3128180205821991D, 0.3131491243839264D, 0.3134590685367584D, 0.3137769103050232D, 0.31409183144569397D, 0.31440991163253784D, 0.3147423267364502D, 0.315074622631073D, 0.31538769602775574D, 0.3157178461551666D, 0.31604892015457153D, 0.3163736164569855D, 0.31670817732810974D, 0.31702810525894165D, 0.317355751991272D, 0.31768372654914856D, 0.31801432371139526D, 0.31834226846694946D, 0.31866806745529175D, 0.31899839639663696D, 0.31932738423347473D, 0.3196604251861572D, 0.32000088691711426D, 0.3203379511833191D, 0.32066595554351807D, 0.32100751996040344D, 0.3213508725166321D, 0.3216894865036011D, 0.322036474943161D, 0.322383314371109D, 0.32273414731025696D, 0.323082834482193D, 0.32343026995658875D, 0.3237669765949249D, 0.32412171363830566D, 0.3244626522064209D, 0.32481491565704346D, 0.32516875863075256D, 0.3255179226398468D, 0.325869619846344D, 0.3262259066104889D, 0.32658839225769043D, 0.3269360065460205D, 0.32728952169418335D, 0.3276480734348297D, 0.3280147612094879D, 0.3283637762069702D, 0.32871752977371216D, 0.32907935976982117D, 0.32943716645240784D, 0.3297964036464691D, 0.3301599621772766D, 0.33051931858062744D, 0.3308880627155304D, 0.3312579095363617D, 0.33161529898643494D, 0.3319781720638275D, 0.3323523998260498D, 0.3327375650405884D, 0.33311545848846436D, 0.33348867297172546D, 0.3338663876056671D, 0.3342553377151489D, 0.33464017510414124D, 0.33502036333084106D, 0.335401713848114D, 0.3357864320278168D, 0.3361833691596985D, 0.3365689218044281D, 0.33695119619369507D, 0.3373405933380127D, 0.33773842453956604D, 0.3381268084049225D, 0.3385128974914551D, 0.33890458941459656D, 0.3392952084541321D, 0.33968889713287354D, 0.3400922119617462D, 0.34048500657081604D, 0.3408714830875397D, 0.3412691354751587D, 0.34166914224624634D, 0.34207582473754883D, 0.3424929678440094D, 0.3428908586502075D, 0.3432921767234802D, 0.34369343519210815D, 0.3441072404384613D, 0.34452903270721436D, 0.3449375331401825D, 0.34534019231796265D, 0.3457581698894501D, 0.3461754322052002D, 0.3465886414051056D, 0.34700435400009155D, 0.34742265939712524D, 0.34784501791000366D, 0.34826958179473877D, 0.34871307015419006D, 0.3491317629814148D, 0.3495660424232483D, 0.3500021994113922D, 0.35043758153915405D, 0.35088497400283813D, 0.3513285517692566D, 0.3517633378505707D, 0.35219472646713257D, 0.3526288568973541D, 0.35309097170829773D, 0.35355913639068604D, 0.35399898886680603D, 0.35447028279304504D, 0.3549261689186096D, 0.35538268089294434D, 0.3558322489261627D, 0.3562908172607422D, 0.35675758123397827D, 0.35722026228904724D, 0.3576938509941101D, 0.35815972089767456D, 0.35862985253334045D, 0.35909539461135864D, 0.35957416892051697D, 0.36005738377571106D, 0.36053022742271423D, 0.36100655794143677D, 0.36148983240127563D, 0.3619798719882965D, 0.3624771535396576D, 0.36297959089279175D, 0.36347851157188416D, 0.3639810383319855D, 0.36445868015289307D, 0.36495158076286316D, 0.36546313762664795D, 0.3659844994544983D, 0.36649754643440247D, 0.36702680587768555D, 0.3675394356250763D, 0.3680706322193146D, 0.36859145760536194D, 0.3691083490848541D, 0.3696277141571045D, 0.3701637089252472D, 0.3707152307033539D, 0.37122446298599243D, 0.37175998091697693D, 0.3722837269306183D, 0.3728159964084625D, 0.3733748495578766D, 0.37392672896385193D, 0.37447816133499146D, 0.37505069375038147D, 0.375622421503067D, 0.3761715888977051D, 0.37675145268440247D, 0.37734055519104004D, 0.3779241442680359D, 0.3785025477409363D, 0.3791196346282959D, 0.37970981001853943D, 0.38029128313064575D, 0.3808829188346863D, 0.38146936893463135D, 0.3820830285549164D, 0.3827105760574341D, 0.3833059072494507D, 0.38394442200660706D, 0.3845558762550354D, 0.3851664662361145D, 0.38580548763275146D, 0.3864295184612274D, 0.3870803415775299D, 0.38771069049835205D, 0.3883456885814667D, 0.38899171352386475D, 0.38965052366256714D, 0.3903161883354187D, 0.3909873962402344D, 0.39163389801979065D, 0.3923026919364929D, 0.3929727375507355D, 0.3936687409877777D, 0.39436736702919006D, 0.395059734582901D, 0.395771861076355D, 0.3964758813381195D, 0.3972088098526001D, 0.39794230461120605D, 0.39865103363990784D, 0.39939573407173157D, 0.4001447558403015D, 0.4009042978286743D, 0.40168482065200806D, 0.40247029066085815D, 0.4032696485519409D, 0.4040483832359314D, 0.4048703610897064D, 0.40569815039634705D, 0.4065134525299072D, 0.4073511064052582D, 0.4082093834877014D, 0.40910643339157104D, 0.40995070338249207D, 0.4108522832393646D, 0.4117118716239929D, 0.41257336735725403D, 0.4134874641895294D, 0.41438743472099304D, 0.41531622409820557D, 0.4162694215774536D, 0.4172126054763794D, 0.41816097497940063D, 0.41914936900138855D, 0.42015671730041504D, 0.4211525321006775D, 0.4221918284893036D, 0.42320090532302856D, 0.4242560863494873D, 0.4253188669681549D, 0.4263918697834015D, 0.42751896381378174D, 0.42864561080932617D, 0.4297972321510315D, 0.4309712052345276D, 0.43211647868156433D, 0.43333739042282104D, 0.43459197878837585D, 0.4358139634132385D, 0.43709370493888855D, 0.43841537833213806D, 0.43972235918045044D, 0.4410899579524994D, 0.44247907400131226D, 0.44390785694122314D, 0.4453846514225006D, 0.44687512516975403D, 0.44836026430130005D, 0.4498823583126068D, 0.45146554708480835D, 0.4531130790710449D, 0.45482560992240906D, 0.4566359221935272D, 0.45852598547935486D, 0.4604836702346802D, 0.46249786019325256D, 0.4645693302154541D, 0.4668006896972656D, 0.46896860003471375D, 0.4712623059749603D, 0.473666787147522D, 0.4763219356536865D, 0.4791247844696045D, 0.48207300901412964D, 0.4851433336734772D, 0.48835480213165283D, 0.49189335107803345D, 0.49576520919799805D, 0.500032901763916D, 0.5047979354858398D, 0.510280966758728D, 0.5167609453201294D, 0.5248829126358032D, 0.5349445343017578D, 0.550952136516571D, 0.6102362275123596D}; + private static final double[] normalMap1 = new double[] {-0.993981122970581D, -0.9867534041404724D, -0.9814018607139587D, -0.9777977466583252D, -0.9740672707557678D, -0.9704886674880981D, -0.9673173427581787D, -0.964655876159668D, -0.9624447226524353D, -0.9604035019874573D, -0.9586348533630371D, -0.956900417804718D, -0.955359697341919D, -0.9537981152534485D, -0.9522461891174316D, -0.9506949186325073D, -0.9491915702819824D, -0.947837233543396D, -0.9465093612670898D, -0.9452851414680481D, -0.9440163969993591D, -0.9427854418754578D, -0.9415590167045593D, -0.9404380321502686D, -0.9392384886741638D, -0.9381521344184875D, -0.9370340704917908D, -0.9359375238418579D, -0.9349455237388611D, -0.9338868260383606D, -0.9328497648239136D, -0.931911826133728D, -0.9309902191162109D, -0.9300264716148376D, -0.9290929436683655D, -0.9282076954841614D, -0.9272778034210205D, -0.9263636469841003D, -0.9254574179649353D, -0.9245976209640503D, -0.9237018823623657D, -0.9228191375732422D, -0.9219982624053955D, -0.921193540096283D, -0.9204187393188477D, -0.9196520447731018D, -0.918891191482544D, -0.91814786195755D, -0.9173845052719116D, -0.9166402816772461D, -0.9158709645271301D, -0.9151347875595093D, -0.9144362807273865D, -0.9137468338012695D, -0.9130550622940063D, -0.9123724102973938D, -0.9117192029953003D, -0.9110715389251709D, -0.9104556441307068D, -0.9098379611968994D, -0.9092051982879639D, -0.908571720123291D, -0.9079737067222595D, -0.9073951840400696D, -0.906777024269104D, -0.9061700701713562D, -0.9055814743041992D, -0.9050177335739136D, -0.9044249057769775D, -0.903881847858429D, -0.9033547043800354D, -0.9028249979019165D, -0.902289092540741D, -0.9017468094825745D, -0.9012556672096252D, -0.9007599353790283D, -0.9002755880355835D, -0.8997661471366882D, -0.8992534279823303D, -0.8987354636192322D, -0.8982405066490173D, -0.8977617621421814D, -0.8972391486167908D, -0.8967417478561401D, -0.896254301071167D, -0.8957591652870178D, -0.895301878452301D, -0.8948580026626587D, -0.8943824768066406D, -0.8938983082771301D, -0.8934217095375061D, -0.8929500579833984D, -0.8924669027328491D, -0.8919958472251892D, -0.8915202021598816D, -0.8910564184188843D, -0.8906219005584717D, -0.8901892304420471D, -0.8897593021392822D, -0.8893160820007324D, -0.888887882232666D, -0.8884394764900208D, -0.8880050778388977D, -0.8875910043716431D, -0.8871419429779053D, -0.8867276906967163D, -0.8862883448600769D, -0.8858384490013123D, -0.8854177594184875D, -0.8849796652793884D, -0.8845346570014954D, -0.8840920925140381D, -0.8836329579353333D, -0.8831575512886047D, -0.882702112197876D, -0.8822483420372009D, -0.8818038105964661D, -0.8813790082931519D, -0.8809268474578857D, -0.8804680705070496D, -0.8800069093704224D, -0.8795323967933655D, -0.879081666469574D, -0.8786211013793945D, -0.8781455159187317D, -0.8776878714561462D, -0.8772246241569519D, -0.8767819404602051D, -0.876311182975769D, -0.8758470416069031D, -0.8753729462623596D, -0.8749485611915588D, -0.8744806051254272D, -0.8740207552909851D, -0.873558521270752D, -0.8731053471565247D, -0.8726766705513D, -0.8722361326217651D, -0.8717890977859497D, -0.8713359832763672D, -0.8708965182304382D, -0.8704631924629211D, -0.8700135350227356D, -0.8695434331893921D, -0.8690747022628784D, -0.8685927987098694D, -0.8681243062019348D, -0.8676489591598511D, -0.8671760559082031D, -0.8667223453521729D, -0.8662542700767517D, -0.8658044338226318D, -0.8653705716133118D, -0.8648831844329834D, -0.8644269108772278D, -0.863974392414093D, -0.8635271787643433D, -0.8630731105804443D, -0.8626294136047363D, -0.8622041344642639D, -0.8617463707923889D, -0.8612802624702454D, -0.8608363270759583D, -0.8603652715682983D, -0.8599016666412354D, -0.8594528436660767D, -0.8590061068534851D, -0.8585623502731323D, -0.8581123352050781D, -0.8576651215553284D, -0.8571998476982117D, -0.8567615151405334D, -0.8563039898872375D, -0.855833113193512D, -0.8553852438926697D, -0.8549563884735107D, -0.8545076251029968D, -0.854032576084137D, -0.8535919189453125D, -0.8531304597854614D, -0.8526818156242371D, -0.8522078990936279D, -0.8517653942108154D, -0.8513281345367432D, -0.8508611917495728D, -0.8504223227500916D, -0.8499665260314941D, -0.849520206451416D, -0.849053680896759D, -0.8485954403877258D, -0.8481417298316956D, -0.847692608833313D, -0.8472627401351929D, -0.8468097448348999D, -0.8463746905326843D, -0.8459068536758423D, -0.8454430103302002D, -0.8449950814247131D, -0.8445459604263306D, -0.8440717458724976D, -0.8435981273651123D, -0.8431227803230286D, -0.8426408767700195D, -0.8421630859375D, -0.8417009711265564D, -0.8412379026412964D, -0.8407769799232483D, -0.8403106331825256D, -0.8398558497428894D, -0.8393968343734741D, -0.8389428853988647D, -0.8384616374969482D, -0.8379984498023987D, -0.8375331163406372D, -0.8370792865753174D, -0.8366209864616394D, -0.8361372947692871D, -0.8356479406356812D, -0.8351752161979675D, -0.8347142934799194D, -0.8342487812042236D, -0.8338004350662231D, -0.8333517909049988D, -0.8328940272331238D, -0.8324223756790161D, -0.831952691078186D, -0.8314595222473145D, -0.8309986591339111D, -0.8305644392967224D, -0.8301018476486206D, -0.8296616077423096D, -0.8291927576065063D, -0.8287414312362671D, -0.8282740116119385D, -0.8278439044952393D, -0.8274041414260864D, -0.82695072889328D, -0.8264832496643066D, -0.8260218501091003D, -0.8255581855773926D, -0.8250904679298401D, -0.824647068977356D, -0.8241927623748779D, -0.823721170425415D, -0.8232881426811218D, -0.8228266835212708D, -0.8223466277122498D, -0.8218891024589539D, -0.8214482665061951D, -0.8209536075592041D, -0.8205164074897766D, -0.8200206160545349D, -0.8195541501045227D, -0.8191131353378296D, -0.8186835050582886D, -0.8182293772697449D, -0.8177539706230164D, -0.8172938227653503D, -0.8168179988861084D, -0.8163681626319885D, -0.8159137964248657D, -0.8154714703559875D, -0.8150300979614258D, -0.8145816922187805D, -0.8141164183616638D, -0.8136304020881653D, -0.813171923160553D, -0.812709391117096D, -0.8122345805168152D, -0.8117756247520447D, -0.8113128542900085D, -0.810836672782898D, -0.8103585243225098D, -0.8099002838134766D, -0.809456467628479D, -0.808990478515625D, -0.8085386157035828D, -0.8080651164054871D, -0.8075961470603943D, -0.807146430015564D, -0.8066928386688232D, -0.8062372207641602D, -0.8057619333267212D, -0.8053189516067505D, -0.8048828840255737D, -0.804431676864624D, -0.803987979888916D, -0.803577184677124D, -0.8031604290008545D, -0.8027421832084656D, -0.8023148775100708D, -0.8018929958343506D, -0.8014708757400513D, -0.8010631799697876D, -0.8006236553192139D, -0.8002043962478638D, -0.7997668385505676D, -0.7993491888046265D, -0.7989336252212524D, -0.7984876036643982D, -0.7980768084526062D, -0.7976296544075012D, -0.7971917390823364D, -0.7967548966407776D, -0.7962918877601624D, -0.7958443760871887D, -0.795405387878418D, -0.7949764728546143D, -0.7945268154144287D, -0.7940919399261475D, -0.7936583161354065D, -0.7932078838348389D, -0.7927955389022827D, -0.7923596501350403D, -0.7919219136238098D, -0.7914819121360779D, -0.791064441204071D, -0.7906320691108704D, -0.79017174243927D, -0.7897169589996338D, -0.7892693281173706D, -0.7888533473014832D, -0.788398802280426D, -0.7879447340965271D, -0.7875177264213562D, -0.7870922088623047D, -0.7866427302360535D, -0.7862313985824585D, -0.7857956290245056D, -0.7853496670722961D, -0.7849026918411255D, -0.7844541072845459D, -0.7840293645858765D, -0.7835724353790283D, -0.7831109166145325D, -0.7826611399650574D, -0.7821875214576721D, -0.7817301154136658D, -0.7812873721122742D, -0.7808514833450317D, -0.7803935408592224D, -0.7799123525619507D, -0.7794713377952576D, -0.7790182828903198D, -0.7785621881484985D, -0.7781559228897095D, -0.7776877880096436D, -0.7772501707077026D, -0.7768174409866333D, -0.7763848900794983D, -0.7759107351303101D, -0.7754525542259216D, -0.7749996185302734D, -0.7745270133018494D, -0.7740670442581177D, -0.7736034989356995D, -0.773161768913269D, -0.7726963758468628D, -0.7722465395927429D, -0.7717506289482117D, -0.7712973952293396D, -0.7708300352096558D, -0.7703608274459839D, -0.7698842287063599D, -0.7694273591041565D, -0.768983006477356D, -0.7685385942459106D, -0.76810622215271D, -0.7676629424095154D, -0.7671942710876465D, -0.7667547464370728D, -0.7662950754165649D, -0.7658786773681641D, -0.7654168605804443D, -0.76496821641922D, -0.764512300491333D, -0.7640527486801147D, -0.7636140584945679D, -0.7631645798683167D, -0.7627111077308655D, -0.7622628808021545D, -0.7618300914764404D, -0.7613887190818787D, -0.7609382271766663D, -0.760509729385376D, -0.7600770592689514D, -0.7596333622932434D, -0.7592030763626099D, -0.758743941783905D, -0.7582821846008301D, -0.7578146457672119D, -0.7573472261428833D, -0.7569139003753662D, -0.7564945220947266D, -0.7560456991195679D, -0.7555922865867615D, -0.7551515698432922D, -0.7547208070755005D, -0.7542534470558167D, -0.7538049221038818D, -0.7533339262008667D, -0.752889096736908D, -0.7524533867835999D, -0.7520151734352112D, -0.7515751719474792D, -0.7511124014854431D, -0.7506847381591797D, -0.7502515912055969D, -0.7498141527175903D, -0.7493629455566406D, -0.7488939762115479D, -0.7484484314918518D, -0.7480183243751526D, -0.7475797533988953D, -0.7471202611923218D, -0.7466857433319092D, -0.746245265007019D, -0.7458525896072388D, -0.7454100847244263D, -0.7449892163276672D, -0.744547426700592D, -0.7441168427467346D, -0.7436603903770447D, -0.7432155609130859D, -0.7427309155464172D, -0.7422654032707214D, -0.7418230175971985D, -0.7413456439971924D, -0.7408867478370667D, -0.7404426336288452D, -0.7399845719337463D, -0.7395214438438416D, -0.7390555739402771D, -0.7385861277580261D, -0.738116443157196D, -0.7376468777656555D, -0.7371915578842163D, -0.7367280721664429D, -0.7362213730812073D, -0.7357624769210815D, -0.735304057598114D, -0.7348542809486389D, -0.7343930006027222D, -0.7338942885398865D, -0.7334224581718445D, -0.7329620122909546D, -0.7324798703193665D, -0.7320289611816406D, -0.7315279245376587D, -0.7310631275177002D, -0.7305946350097656D, -0.7301591634750366D, -0.7297176718711853D, -0.7292467951774597D, -0.7288281321525574D, -0.7283647060394287D, -0.7278772592544556D, -0.727400541305542D, -0.7269569039344788D, -0.7264780402183533D, -0.7260096669197083D, -0.725562334060669D, -0.7250648140907288D, -0.7245859503746033D, -0.7241119146347046D, -0.723630428314209D, -0.7231666445732117D, -0.7227104902267456D, -0.7222658395767212D, -0.7217769622802734D, -0.7213007211685181D, -0.7208353877067566D, -0.720391571521759D, -0.7199460864067078D, -0.7194427847862244D, -0.7189367413520813D, -0.7185240983963013D, -0.7180306911468506D, -0.7175722718238831D, -0.7170929908752441D, -0.7166170477867126D, -0.7161218523979187D, -0.7156761288642883D, -0.7152342200279236D, -0.7147595882415771D, -0.7143203020095825D, -0.7138813734054565D, -0.7134413123130798D, -0.7129658460617065D, -0.712531566619873D, -0.7120937705039978D, -0.7116792798042297D, -0.7112746238708496D, -0.7108534574508667D, -0.7104528546333313D, -0.7100372314453125D, -0.7095867395401001D, -0.7091600298881531D, -0.7087348103523254D, -0.7083083987236023D, -0.7078754305839539D, -0.7074360251426697D, -0.7070069313049316D, -0.7065709233283997D, -0.7061734199523926D, -0.7057405710220337D, -0.7053127288818359D, -0.7048872113227844D, -0.7044483423233032D, -0.7040207386016846D, -0.7036097049713135D, -0.7031928896903992D, -0.7027456164360046D, -0.7023111581802368D, -0.7018752694129944D, -0.7014437317848206D, -0.7010111808776855D, -0.7005510926246643D, -0.7001100778579712D, -0.6996980905532837D, -0.6992843747138977D, -0.6988713145256042D, -0.6983832716941833D, -0.6979185938835144D, -0.6974824666976929D, -0.6970443725585938D, -0.6965860724449158D, -0.6961517333984375D, -0.6956964135169983D, -0.6952543258666992D, -0.6948185563087463D, -0.6944015622138977D, -0.6939572691917419D, -0.6935084462165833D, -0.6930390000343323D, -0.6925643086433411D, -0.6920949816703796D, -0.6916420459747314D, -0.6911906003952026D, -0.6907227039337158D, -0.690259575843811D, -0.6897680163383484D, -0.6892983913421631D, -0.6888791918754578D, -0.6883915066719055D, -0.6879323124885559D, -0.6874868869781494D, -0.6870161294937134D, -0.6865673065185547D, -0.6861105561256409D, -0.685651421546936D, -0.6852194666862488D, -0.6847624778747559D, -0.6842747330665588D, -0.6838182210922241D, -0.6833785176277161D, -0.6829265356063843D, -0.6824387311935425D, -0.6819712519645691D, -0.6814887523651123D, -0.6810264587402344D, -0.6805755496025085D, -0.6800896525382996D, -0.6796098947525024D, -0.6791496276855469D, -0.6786936521530151D, -0.6782419085502625D, -0.677756130695343D, -0.6773126125335693D, -0.6768563389778137D, -0.6764082908630371D, -0.6759566068649292D, -0.6755016446113586D, -0.6750813722610474D, -0.6746301651000977D, -0.6741729974746704D, -0.6736992001533508D, -0.6732316613197327D, -0.6727883815765381D, -0.6723057627677917D, -0.6718435287475586D, -0.6713894009590149D, -0.6709365844726562D, -0.6704763770103455D, -0.6700304746627808D, -0.6695900559425354D, -0.6691245436668396D, -0.6686742305755615D, -0.668216347694397D, -0.6677833199501038D, -0.6673141717910767D, -0.6668790578842163D, -0.6664288640022278D, -0.6659941673278809D, -0.6655833125114441D, -0.6651661396026611D, -0.6647082567214966D, -0.6642827391624451D, -0.6638473868370056D, -0.6633561253547668D, -0.6628942489624023D, -0.6624237298965454D, -0.6619466543197632D, -0.6615045666694641D, -0.661072850227356D, -0.6605978608131409D, -0.6601710915565491D, -0.6597480773925781D, -0.6592699885368347D, -0.6588332056999207D, -0.658392608165741D, -0.6579496264457703D, -0.657446026802063D, -0.656986653804779D, -0.6565669775009155D, -0.6561056971549988D, -0.6556894779205322D, -0.6552327275276184D, -0.6548108458518982D, -0.6544176936149597D, -0.6539667248725891D, -0.6535317897796631D, -0.6530807018280029D, -0.6526519060134888D, -0.6522371768951416D, -0.6518018841743469D, -0.6513494849205017D, -0.6508753299713135D, -0.6504021883010864D, -0.6499971151351929D, -0.6495323181152344D, -0.6490973234176636D, -0.6486873626708984D, -0.6482400894165039D, -0.6477917432785034D, -0.6473706364631653D, -0.646914541721344D, -0.6464476585388184D, -0.645993173122406D, -0.6455405950546265D, -0.6450999975204468D, -0.64466792345047D, -0.6442462205886841D, -0.6438097357749939D, -0.6433576941490173D, -0.6429150700569153D, -0.6425103545188904D, -0.6420614719390869D, -0.6415934562683105D, -0.6411587595939636D, -0.6407563090324402D, -0.6403141617774963D, -0.6398285031318665D, -0.6393874287605286D, -0.638950526714325D, -0.6384929418563843D, -0.6380735039710999D, -0.6376455426216125D, -0.6371946334838867D, -0.6367603540420532D, -0.6363311409950256D, -0.6358823180198669D, -0.63546222448349D, -0.6350165605545044D, -0.6345629692077637D, -0.6341010332107544D, -0.6336252689361572D, -0.6331813335418701D, -0.63270503282547D, -0.6322590708732605D, -0.6318042278289795D, -0.6313715577125549D, -0.6309155225753784D, -0.630476176738739D, -0.6300145387649536D, -0.6295765042304993D, -0.6291170716285706D, -0.6286421418190002D, -0.6281881332397461D, -0.6277390122413635D, -0.6272373795509338D, -0.6267513632774353D, -0.6262896656990051D, -0.6258484721183777D, -0.6253910064697266D, -0.6249442100524902D, -0.6244901418685913D, -0.6240485310554504D, -0.6236206889152527D, -0.6231616139411926D, -0.6226596832275391D, -0.6221743226051331D, -0.6217489242553711D, -0.621291995048523D, -0.6208148002624512D, -0.6203911900520325D, -0.6199749112129211D, -0.6195303797721863D, -0.6190845370292664D, -0.6185699701309204D, -0.6181412935256958D, -0.6176934242248535D, -0.6172602772712708D, -0.6167842149734497D, -0.6163712739944458D, -0.6158850789070129D, -0.6154088377952576D, -0.6149631142616272D, -0.6145434379577637D, -0.6141135692596436D, -0.6136382222175598D, -0.6131902933120728D, -0.612743079662323D, -0.6123250126838684D, -0.6118547916412354D, -0.6114357113838196D, -0.6109917163848877D, -0.6105717420578003D, -0.6101329922676086D, -0.6097121834754944D, -0.6092851161956787D, -0.6088412404060364D, -0.6084098815917969D, -0.6079666614532471D, -0.607525646686554D, -0.6070682406425476D, -0.6065964102745056D, -0.6061907410621643D, -0.6057188510894775D, -0.605266809463501D, -0.6048122048377991D, -0.604347288608551D, -0.6038910746574402D, -0.6034500002861023D, -0.6030161380767822D, -0.6025460362434387D, -0.6021080017089844D, -0.6016576290130615D, -0.6012001037597656D, -0.6007413864135742D, -0.6002840399742126D, -0.5998591184616089D, -0.5994294881820679D, -0.5989652276039124D, -0.5984882712364197D, -0.5980018973350525D, -0.5975683331489563D, -0.5971066951751709D, -0.5966431498527527D, -0.59619140625D, -0.5958024859428406D, -0.5953621864318848D, -0.5949565172195435D, -0.5945692658424377D, -0.5941520929336548D, -0.5936878323554993D, -0.5932301878929138D, -0.5927911996841431D, -0.5923627018928528D, -0.5918761491775513D, -0.5914469957351685D, -0.5909724831581116D, -0.5905429720878601D, -0.5900884866714478D, -0.5896493792533875D, -0.5892290472984314D, -0.5887760519981384D, -0.5883501768112183D, -0.5878588557243347D, -0.58735191822052D, -0.5868979692459106D, -0.586448073387146D, -0.5860018730163574D, -0.5855519771575928D, -0.5850552916526794D, -0.5845991969108582D, -0.5841348767280579D, -0.5837119221687317D, -0.5832936763763428D, -0.5828707218170166D, -0.5824082493782043D, -0.5820251703262329D, -0.5815789699554443D, -0.5810984969139099D, -0.5806310176849365D, -0.5801907777786255D, -0.5797252058982849D, -0.5792809724807739D, -0.5788083076477051D, -0.5783213973045349D, -0.5778913497924805D, -0.5774275660514832D, -0.5769709348678589D, -0.5765695571899414D, -0.5761199593544006D, -0.5756808519363403D, -0.5751828551292419D, -0.574739396572113D, -0.5742871761322021D, -0.5738288164138794D, -0.5733629465103149D, -0.5729423761367798D, -0.572485089302063D, -0.5720058679580688D, -0.5715680122375488D, -0.5710999965667725D, -0.5706731081008911D, -0.5702232718467712D, -0.56974858045578D, -0.5693201422691345D, -0.568897545337677D, -0.5684503316879272D, -0.5680347084999084D, -0.5675626397132874D, -0.5670663714408875D, -0.5666159987449646D, -0.5661755204200745D, -0.5656933784484863D, -0.5652275681495667D, -0.5647632479667664D, -0.5643265247344971D, -0.5638944506645203D, -0.5634651184082031D, -0.5630204677581787D, -0.5625607967376709D, -0.5621016621589661D, -0.5616597533226013D, -0.5612028241157532D, -0.5607337355613708D, -0.5603100657463074D, -0.5598271489143372D, -0.5593815445899963D, -0.5589413046836853D, -0.5584782958030701D, -0.5580465197563171D, -0.5575783848762512D, -0.5571232438087463D, -0.5566560626029968D, -0.5562322735786438D, -0.555738627910614D, -0.5552665591239929D, -0.554823637008667D, -0.5543604493141174D, -0.5538782477378845D, -0.5534418225288391D, -0.5529850721359253D, -0.5525240898132324D, -0.5520437359809875D, -0.5515938997268677D, -0.5511279106140137D, -0.5506861209869385D, -0.550226628780365D, -0.5497331619262695D, -0.549257218837738D, -0.5488153100013733D, -0.5483522415161133D, -0.5478795170783997D, -0.5474520921707153D, -0.5469785332679749D, -0.5465142130851746D, -0.546062171459198D, -0.54566890001297D, -0.5452328324317932D, -0.5447759628295898D, -0.5443392395973206D, -0.5438827872276306D, -0.5434367656707764D, -0.5430113077163696D, -0.5425428152084351D, -0.5420520305633545D, -0.5415939092636108D, -0.5411363840103149D, -0.5407477617263794D, -0.5402787923812866D, -0.5398295521736145D, -0.5393424034118652D, -0.5388583540916443D, -0.5384265184402466D, -0.5379411578178406D, -0.5374878644943237D, -0.5370199084281921D, -0.5365350842475891D, -0.5360611081123352D, -0.5355649590492249D, -0.5351121425628662D, -0.5345990657806396D, -0.5341669321060181D, -0.5337467789649963D, -0.5333049297332764D, -0.5328750014305115D, -0.5324127078056335D, -0.5319854617118835D, -0.5315192937850952D, -0.5310415029525757D, -0.5306323766708374D, -0.5301699042320251D, -0.5297111868858337D, -0.5292492508888245D, -0.5287858843803406D, -0.5283259153366089D, -0.5278311967849731D, -0.5273903608322144D, -0.526936948299408D, -0.5265194773674011D, -0.5260910391807556D, -0.5256368517875671D, -0.5252177119255066D, -0.5247905254364014D, -0.5243833065032959D, -0.5239353775978088D, -0.5234636068344116D, -0.5229857563972473D, -0.5225380659103394D, -0.5220516920089722D, -0.5216032266616821D, -0.5211589932441711D, -0.5207035541534424D, -0.5202432870864868D, -0.519791841506958D, -0.5193343162536621D, -0.5189166069030762D, -0.5184645056724548D, -0.5180600881576538D, -0.5176355838775635D, -0.5171905755996704D, -0.516732394695282D, -0.5162793397903442D, -0.5158212184906006D, -0.5153780579566956D, -0.5149728059768677D, -0.5145182013511658D, -0.5140626430511475D, -0.5135531425476074D, -0.5130990147590637D, -0.5126319527626038D, -0.5121858716011047D, -0.5117676258087158D, -0.5113520622253418D, -0.5108791589736938D, -0.5104767084121704D, -0.5100153088569641D, -0.5095524191856384D, -0.5091241002082825D, -0.5086731314659119D, -0.5082252025604248D, -0.5077710151672363D, -0.507340133190155D, -0.5068773031234741D, -0.5063926577568054D, -0.5059119462966919D, -0.5054774880409241D, -0.505023717880249D, -0.5045510530471802D, -0.5040978193283081D, -0.503696858882904D, -0.5032621622085571D, -0.5028178095817566D, -0.502354085445404D, -0.50189208984375D, -0.5014151334762573D, -0.5009788870811462D, -0.5005399584770203D, -0.5000848770141602D, -0.4996296167373657D, -0.49916690587997437D, -0.49872907996177673D, -0.49828365445137024D, -0.49784278869628906D, -0.4973927140235901D, -0.4969747066497803D, -0.496499627828598D, -0.49605849385261536D, -0.49562790989875793D, -0.49520403146743774D, -0.49475109577178955D, -0.49428069591522217D, -0.4938359260559082D, -0.4933910667896271D, -0.49294254183769226D, -0.4924793839454651D, -0.49202969670295715D, -0.49162542819976807D, -0.4911677837371826D, -0.49067744612693787D, -0.49027812480926514D, -0.48984992504119873D, -0.4894086420536041D, -0.48893997073173523D, -0.48848411440849304D, -0.48805075883865356D, -0.4876094460487366D, -0.4871782958507538D, -0.4867188334465027D, -0.486240416765213D, -0.4857710599899292D, -0.4853622615337372D, -0.484923779964447D, -0.48443329334259033D, -0.4839499890804291D, -0.48351210355758667D, -0.4830566346645355D, -0.48261359333992004D, -0.48216360807418823D, -0.4817146360874176D, -0.4812493324279785D, -0.48077741265296936D, -0.48034119606018066D, -0.4799092411994934D, -0.4794424772262573D, -0.4789618253707886D, -0.47851404547691345D, -0.47807857394218445D, -0.47761446237564087D, -0.47712457180023193D, -0.47667333483695984D, -0.47622331976890564D, -0.4757482409477234D, -0.4752673804759979D, -0.4748130440711975D, -0.47434619069099426D, -0.47390732169151306D, -0.47345981001853943D, -0.4729853868484497D, -0.4725019633769989D, -0.47202643752098083D, -0.47158005833625793D, -0.47112029790878296D, -0.47066575288772583D, -0.47026416659355164D, -0.46979641914367676D, -0.4693371057510376D, -0.4688774645328522D, -0.46840471029281616D, -0.46793320775032043D, -0.4674986004829407D, -0.46702343225479126D, -0.46656137704849243D, -0.4661322236061096D, -0.46566006541252136D, -0.46519672870635986D, -0.46473783254623413D, -0.46439436078071594D, -0.46398577094078064D, -0.46354690194129944D, -0.46305525302886963D, -0.46262606978416443D, -0.4621753990650177D, -0.4616986811161041D, -0.46126776933670044D, -0.4608273208141327D, -0.4603559076786041D, -0.4598826467990875D, -0.4594634771347046D, -0.45901820063591003D, -0.45853206515312195D, -0.45805060863494873D, -0.4576207399368286D, -0.45715758204460144D, -0.4567049443721771D, -0.45628368854522705D, -0.45583370327949524D, -0.45539772510528564D, -0.45492687821388245D, -0.4544738233089447D, -0.4540203809738159D, -0.45354411005973816D, -0.45309826731681824D, -0.4526641070842743D, -0.4522310495376587D, -0.45176005363464355D, -0.45129984617233276D, -0.4508618116378784D, -0.450420081615448D, -0.4499739110469818D, -0.449531227350235D, -0.44908884167671204D, -0.4486551284790039D, -0.4482029676437378D, -0.4477347731590271D, -0.4472775161266327D, -0.44681406021118164D, -0.4463559091091156D, -0.44590938091278076D, -0.44546636939048767D, -0.44499215483665466D, -0.4445340037345886D, -0.4440937936306D, -0.4436649680137634D, -0.44318997859954834D, -0.44273874163627625D, -0.4422561824321747D, -0.44178012013435364D, -0.44134721159935D, -0.44089630246162415D, -0.4404234290122986D, -0.4399433732032776D, -0.43953943252563477D, -0.4390520751476288D, -0.43859511613845825D, -0.43811362981796265D, -0.43765103816986084D, -0.4372456967830658D, -0.43681710958480835D, -0.4363972842693329D, -0.4359303414821625D, -0.43546876311302185D, -0.43497487902641296D, -0.43451398611068726D, -0.4340492784976959D, -0.43363693356513977D, -0.4331943094730377D, -0.4327276945114136D, -0.43224164843559265D, -0.4318208396434784D, -0.43134722113609314D, -0.43084287643432617D, -0.4303792715072632D, -0.429912805557251D, -0.4294090270996094D, -0.42893385887145996D, -0.42844635248184204D, -0.42798569798469543D, -0.42753586173057556D, -0.4270614683628082D, -0.4265874922275543D, -0.4261167347431183D, -0.4256487786769867D, -0.42519906163215637D, -0.4247068464756012D, -0.4242536425590515D, -0.42379605770111084D, -0.42333462834358215D, -0.42286252975463867D, -0.4224444329738617D, -0.4219934046268463D, -0.4215393364429474D, -0.4210718274116516D, -0.42061617970466614D, -0.4201585054397583D, -0.41968807578086853D, -0.41920599341392517D, -0.4187593162059784D, -0.4182948172092438D, -0.41779500246047974D, -0.4173271656036377D, -0.41686588525772095D, -0.41638249158859253D, -0.41590481996536255D, -0.4154355227947235D, -0.4149766266345978D, -0.41452762484550476D, -0.4140367805957794D, -0.4136026203632355D, -0.4131450653076172D, -0.41266801953315735D, -0.41221460700035095D, -0.4117613732814789D, -0.4112788140773773D, -0.41078534722328186D, -0.41030487418174744D, -0.40985924005508423D, -0.40937814116477966D, -0.4089410901069641D, -0.40847721695899963D, -0.408033549785614D, -0.40757739543914795D, -0.40711915493011475D, -0.4066314697265625D, -0.4061741828918457D, -0.4056779444217682D, -0.4052165448665619D, -0.404753714799881D, -0.4042343497276306D, -0.4037852883338928D, -0.40332233905792236D, -0.402822881937027D, -0.4023677110671997D, -0.40190503001213074D, -0.4014160633087158D, -0.400924414396286D, -0.4004696011543274D, -0.3999839723110199D, -0.3995433449745178D, -0.39907631278038025D, -0.398613303899765D, -0.39813822507858276D, -0.3976576626300812D, -0.3971708416938782D, -0.3967016339302063D, -0.3961956202983856D, -0.3957078456878662D, -0.395264208316803D, -0.3948236107826233D, -0.3943391442298889D, -0.39385995268821716D, -0.39338982105255127D, -0.39291146397590637D, -0.39242783188819885D, -0.3919692933559418D, -0.39151468873023987D, -0.3910646140575409D, -0.39060062170028687D, -0.3901495039463043D, -0.38966214656829834D, -0.3891756236553192D, -0.3887067139148712D, -0.388319730758667D, -0.38788723945617676D, -0.3874429166316986D, -0.3869704306125641D, -0.38652777671813965D, -0.3860969543457031D, -0.38564804196357727D, -0.3851816952228546D, -0.3847781717777252D, -0.38431960344314575D, -0.38389864563941956D, -0.3834582567214966D, -0.383012592792511D, -0.3825145661830902D, -0.38205742835998535D, -0.3816487789154053D, -0.3812359869480133D, -0.38080450892448425D, -0.3803378641605377D, -0.3799078166484833D, -0.3794780373573303D, -0.3790120482444763D, -0.3785163164138794D, -0.37803179025650024D, -0.37758001685142517D, -0.37714439630508423D, -0.37673377990722656D, -0.3762897551059723D, -0.375853031873703D, -0.3754011392593384D, -0.37497463822364807D, -0.3745007812976837D, -0.37405502796173096D, -0.37361258268356323D, -0.3731582462787628D, -0.3727110028266907D, -0.3722643256187439D, -0.3717980980873108D, -0.37136033177375793D, -0.370922327041626D, -0.3704998791217804D, -0.3700500428676605D, -0.36958378553390503D, -0.36913618445396423D, -0.36870965361595154D, -0.368268221616745D, -0.3678186535835266D, -0.36736854910850525D, -0.3669017553329468D, -0.36642682552337646D, -0.3659965991973877D, -0.3655521273612976D, -0.3650961220264435D, -0.36464881896972656D, -0.36418700218200684D, -0.3637397885322571D, -0.3632592260837555D, -0.3628367483615875D, -0.36235979199409485D, -0.36191582679748535D, -0.3614809513092041D, -0.3609961271286011D, -0.36047661304473877D, -0.36004626750946045D, -0.3595779836177826D, -0.35911795496940613D, -0.35861992835998535D, -0.35819077491760254D, -0.35775429010391235D, -0.3572559058666229D, -0.3567827641963959D, -0.356319397687912D, -0.35587993264198303D, -0.3554006516933441D, -0.3549196124076843D, -0.35444262623786926D, -0.354030966758728D, -0.35353973507881165D, -0.35312512516975403D, -0.3526640236377716D, -0.3521788716316223D, -0.3517155945301056D, -0.35133352875709534D, -0.3508608043193817D, -0.3503953516483307D, -0.3499474823474884D, -0.34947678446769714D, -0.34898048639297485D, -0.3484885096549988D, -0.3480057716369629D, -0.34755030274391174D, -0.3470558226108551D, -0.34659838676452637D, -0.346110999584198D, -0.3456391990184784D, -0.34520697593688965D, -0.34475353360176086D, -0.34428736567497253D, -0.3437964916229248D, -0.3433292508125305D, -0.3428596258163452D, -0.34236952662467957D, -0.3418951630592346D, -0.3414383828639984D, -0.34095871448516846D, -0.3404501676559448D, -0.33999693393707275D, -0.3395421802997589D, -0.33909496665000916D, -0.3386416435241699D, -0.3381812274456024D, -0.33769848942756653D, -0.3371901512145996D, -0.33668965101242065D, -0.33621102571487427D, -0.3357529044151306D, -0.3353078067302704D, -0.33485859632492065D, -0.33441001176834106D, -0.3339252173900604D, -0.3334873914718628D, -0.33301955461502075D, -0.3325522541999817D, -0.33208945393562317D, -0.33160969614982605D, -0.3311447203159332D, -0.3306768536567688D, -0.3301656246185303D, -0.32972973585128784D, -0.3292653560638428D, -0.32879796624183655D, -0.3283538818359375D, -0.3278607130050659D, -0.32736411690711975D, -0.3268917202949524D, -0.3264242112636566D, -0.32594919204711914D, -0.3254433870315552D, -0.324996680021286D, -0.3245857357978821D, -0.32412344217300415D, -0.32368534803390503D, -0.32324400544166565D, -0.32283321022987366D, -0.3223881423473358D, -0.32192009687423706D, -0.32143840193748474D, -0.32099202275276184D, -0.3204992711544037D, -0.3200390934944153D, -0.31957361102104187D, -0.31912466883659363D, -0.3186745047569275D, -0.31821349263191223D, -0.3178000748157501D, -0.3173747658729553D, -0.3168794810771942D, -0.3164204955101013D, -0.31596946716308594D, -0.31547701358795166D, -0.3150102198123932D, -0.3145200312137604D, -0.31411561369895935D, -0.3136584758758545D, -0.31319522857666016D, -0.3127117455005646D, -0.31223630905151367D, -0.31175631284713745D, -0.31128260493278503D, -0.31085309386253357D, -0.31039923429489136D, -0.30996254086494446D, -0.3094765543937683D, -0.3090311288833618D, -0.30857518315315247D, -0.3081330358982086D, -0.3076905608177185D, -0.30722951889038086D, -0.3068021237850189D, -0.3063276410102844D, -0.3058644235134125D, -0.3054058253765106D, -0.30498620867729187D, -0.3045206069946289D, -0.30405446887016296D, -0.3035971522331238D, -0.3031606376171112D, -0.30267849564552307D, -0.30223074555397034D, -0.3017795979976654D, -0.30132225155830383D, -0.30085089802742004D, -0.3004004657268524D, -0.2999022901058197D, -0.2994162440299988D, -0.2989705502986908D, -0.2984963655471802D, -0.29802581667900085D, -0.2975752055644989D, -0.29712194204330444D, -0.2966841459274292D, -0.2962263226509094D, -0.29578348994255066D, -0.2953060269355774D, -0.2948493957519531D, -0.2943715751171112D, -0.2939140200614929D, -0.2934216856956482D, -0.29297780990600586D, -0.2924797832965851D, -0.2920304834842682D, -0.29154303669929504D, -0.2910688817501068D, -0.29058271646499634D, -0.2901535928249359D, -0.2897447347640991D, -0.28926438093185425D, -0.28879716992378235D, -0.28835800290107727D, -0.2878970801830292D, -0.28745236992836D, -0.28701406717300415D, -0.28658148646354675D, -0.2860986292362213D, -0.2856302857398987D, -0.28513821959495544D, -0.2846760153770447D, -0.28417059779167175D, -0.28370192646980286D, -0.28323373198509216D, -0.28278112411499023D, -0.2823112905025482D, -0.2818357050418854D, -0.28138846158981323D, -0.2808930575847626D, -0.28043779730796814D, -0.27998489141464233D, -0.27951040863990784D, -0.2790610194206238D, -0.27859342098236084D, -0.27810347080230713D, -0.2776254117488861D, -0.27716052532196045D, -0.2767277657985687D, -0.2762927711009979D, -0.2758132815361023D, -0.27532944083213806D, -0.27486521005630493D, -0.27437639236450195D, -0.27392253279685974D, -0.2734636664390564D, -0.2730155289173126D, -0.27252086997032166D, -0.27201488614082336D, -0.2715776860713959D, -0.27112340927124023D, -0.2706716060638428D, -0.27024176716804504D, -0.2697767913341522D, -0.2693377435207367D, -0.2688935697078705D, -0.2684306800365448D, -0.2679275572299957D, -0.26745349168777466D, -0.2669237554073334D, -0.2665085792541504D, -0.26604485511779785D, -0.26556864380836487D, -0.2651185989379883D, -0.2646579146385193D, -0.2641691565513611D, -0.26368823647499084D, -0.2632249593734741D, -0.2627500593662262D, -0.2623361349105835D, -0.2618766725063324D, -0.2614266276359558D, -0.26093974709510803D, -0.2604479491710663D, -0.2599739730358124D, -0.2594825029373169D, -0.2590617537498474D, -0.25859859585762024D, -0.25814205408096313D, -0.25771430134773254D, -0.25722840428352356D, -0.25672265887260437D, -0.25625374913215637D, -0.2558176815509796D, -0.25536519289016724D, -0.25488874316215515D, -0.2544580101966858D, -0.2539685368537903D, -0.25348523259162903D, -0.253075510263443D, -0.25262975692749023D, -0.2521655261516571D, -0.2516859173774719D, -0.2512474060058594D, -0.25079748034477234D, -0.25033846497535706D, -0.24987804889678955D, -0.2494303584098816D, -0.24893410503864288D, -0.24847693741321564D, -0.24801473319530487D, -0.2475225180387497D, -0.24707607924938202D, -0.24662980437278748D, -0.24618923664093018D, -0.24574166536331177D, -0.24528750777244568D, -0.24482272565364838D, -0.24436645209789276D, -0.24388155341148376D, -0.24341869354248047D, -0.24293887615203857D, -0.24248577654361725D, -0.24203507602214813D, -0.24156378209590912D, -0.2410905808210373D, -0.2406443953514099D, -0.24019907414913177D, -0.23976480960845947D, -0.23933319747447968D, -0.2388959676027298D, -0.23842927813529968D, -0.23793959617614746D, -0.23746173083782196D, -0.23699915409088135D, -0.23651842772960663D, -0.23605220019817352D, -0.235618457198143D, -0.23517906665802002D, -0.23475384712219238D, -0.23428522050380707D, -0.23381267488002777D, -0.23333056271076202D, -0.23285725712776184D, -0.232443168759346D, -0.23195216059684753D, -0.23147986829280853D, -0.2310148924589157D, -0.23055219650268555D, -0.23004120588302612D, -0.22958838939666748D, -0.2291288524866104D, -0.22862781584262848D, -0.22818373143672943D, -0.2277383655309677D, -0.22724731266498566D, -0.2267656922340393D, -0.2263106256723404D, -0.22584769129753113D, -0.22541046142578125D, -0.2249441146850586D, -0.22448818385601044D, -0.22402751445770264D, -0.22359701991081238D, -0.22311480343341827D, -0.2226535975933075D, -0.22214914858341217D, -0.2217063307762146D, -0.22119589149951935D, -0.2207522839307785D, -0.22028227150440216D, -0.2198103964328766D, -0.21932831406593323D, -0.2188776433467865D, -0.21837788820266724D, -0.21794435381889343D, -0.2174680083990097D, -0.2170126587152481D, -0.21653933823108673D, -0.2160915583372116D, -0.21563227474689484D, -0.21518409252166748D, -0.21474571526050568D, -0.2142743170261383D, -0.21381691098213196D, -0.21334433555603027D, -0.21288271248340607D, -0.2123873084783554D, -0.21193847060203552D, -0.2114948183298111D, -0.21100975573062897D, -0.21056903898715973D, -0.21009771525859833D, -0.20959174633026123D, -0.2091664969921112D, -0.20870351791381836D, -0.2082373946905136D, -0.2077392190694809D, -0.20726850628852844D, -0.2067907601594925D, -0.2063116431236267D, -0.20583796501159668D, -0.20534458756446838D, -0.20489037036895752D, -0.20444543659687042D, -0.2040008306503296D, -0.20351454615592957D, -0.20304752886295319D, -0.20254746079444885D, -0.2020740658044815D, -0.2015744149684906D, -0.20112964510917664D, -0.20067822933197021D, -0.200225830078125D, -0.19977039098739624D, -0.19926966726779938D, -0.19877131283283234D, -0.19831915199756622D, -0.1978578269481659D, -0.1973981410264969D, -0.19692765176296234D, -0.19644327461719513D, -0.19598513841629028D, -0.1955469399690628D, -0.19506791234016418D, -0.19460316002368927D, -0.1940772980451584D, -0.19364812970161438D, -0.1931820958852768D, -0.19273783266544342D, -0.1922660917043686D, -0.19177058339118958D, -0.1913253366947174D, -0.19083912670612335D, -0.1903299242258072D, -0.1898471564054489D, -0.18940511345863342D, -0.18894870579242706D, -0.18847599625587463D, -0.18803250789642334D, -0.18753890693187714D, -0.1870977133512497D, -0.1866195946931839D, -0.18615631759166718D, -0.1857069730758667D, -0.1852405071258545D, -0.18479567766189575D, -0.1843431293964386D, -0.1838725507259369D, -0.18344098329544067D, -0.1830095797777176D, -0.18253810703754425D, -0.18209238350391388D, -0.1816622018814087D, -0.18118171393871307D, -0.18071290850639343D, -0.180253803730011D, -0.179769366979599D, -0.1793292909860611D, -0.17883707582950592D, -0.178366020321846D, -0.1778915673494339D, -0.17741069197654724D, -0.17693915963172913D, -0.17645516991615295D, -0.17598532140254974D, -0.17547713220119476D, -0.1749715358018875D, -0.17450954020023346D, -0.1740640103816986D, -0.17359958589076996D, -0.1731225997209549D, -0.17268459498882294D, -0.1722080111503601D, -0.1717744767665863D, -0.17135664820671082D, -0.170857772231102D, -0.17039941251277924D, -0.16989468038082123D, -0.16943596303462982D, -0.16898159682750702D, -0.16854242980480194D, -0.16809329390525818D, -0.16760970652103424D, -0.16718792915344238D, -0.1666894555091858D, -0.1662272959947586D, -0.16578102111816406D, -0.16531381011009216D, -0.1648193895816803D, -0.16437332332134247D, -0.16389940679073334D, -0.1634543091058731D, -0.162981316447258D, -0.1625393033027649D, -0.16209138929843903D, -0.1616077572107315D, -0.16111062467098236D, -0.1606225222349167D, -0.16015741229057312D, -0.15968406200408936D, -0.15919706225395203D, -0.15878324210643768D, -0.1583307534456253D, -0.15784773230552673D, -0.1573367863893509D, -0.1568923145532608D, -0.15643681585788727D, -0.1559513509273529D, -0.1554512083530426D, -0.15502944588661194D, -0.15453824400901794D, -0.1541012078523636D, -0.15362413227558136D, -0.1531377136707306D, -0.152687206864357D, -0.15223318338394165D, -0.1517704725265503D, -0.1513061374425888D, -0.15085582435131073D, -0.15041625499725342D, -0.149865061044693D, -0.14939723908901215D, -0.1489189863204956D, -0.1484673172235489D, -0.14795278012752533D, -0.1475195735692978D, -0.1471049189567566D, -0.1466224193572998D, -0.14613521099090576D, -0.14566345512866974D, -0.14521154761314392D, -0.14471805095672607D, -0.14419704675674438D, -0.14375221729278564D, -0.14330840110778809D, -0.1428687870502472D, -0.14242301881313324D, -0.14195817708969116D, -0.14148111641407013D, -0.14101140201091766D, -0.14054565131664276D, -0.14008617401123047D, -0.13962242007255554D, -0.13913913071155548D, -0.1386719048023224D, -0.13822419941425323D, -0.13781346380710602D, -0.13734480738639832D, -0.1368473321199417D, -0.1363864243030548D, -0.1359218806028366D, -0.13546185195446014D, -0.13499535620212555D, -0.13451282680034637D, -0.13403449952602386D, -0.1335677057504654D, -0.13311335444450378D, -0.13265040516853333D, -0.13223102688789368D, -0.1318179965019226D, -0.13135839998722076D, -0.13091857731342316D, -0.1304430514574051D, -0.1299501210451126D, -0.12952110171318054D, -0.12904620170593262D, -0.12858985364437103D, -0.12813624739646912D, -0.12764878571033478D, -0.12717436254024506D, -0.12671279907226562D, -0.12626932561397552D, -0.1258126050233841D, -0.12532095611095428D, -0.12483920902013779D, -0.12435654550790787D, -0.12389810383319855D, -0.12345582246780396D, -0.12299700826406479D, -0.12249735742807388D, -0.1220179870724678D, -0.12155383825302124D, -0.12107869982719421D, -0.1206524446606636D, -0.12021951377391815D, -0.11980114877223969D, -0.11933659762144089D, -0.11889223009347916D, -0.11844123899936676D, -0.1179727166891098D, -0.11748640239238739D, -0.1170230507850647D, -0.11659178137779236D, -0.11614589393138885D, -0.11567246168851852D, -0.11520460993051529D, -0.1147543415427208D, -0.11429299414157867D, -0.11382859200239182D, -0.11335264891386032D, -0.11292024701833725D, -0.1124499961733818D, -0.11199361830949783D, -0.11152473092079163D, -0.11108040064573288D, -0.11064787954092026D, -0.11018948256969452D, -0.10975238680839539D, -0.10929903388023376D, -0.10885120928287506D, -0.10839029401540756D, -0.10796593129634857D, -0.1075151339173317D, -0.1070588231086731D, -0.10662193596363068D, -0.10614380240440369D, -0.10572738200426102D, -0.10525882989168167D, -0.10484708100557327D, -0.10437420755624771D, -0.10390757024288177D, -0.10347313433885574D, -0.1030469536781311D, -0.10260704159736633D, -0.10216134041547775D, -0.10169082880020142D, -0.10123983770608902D, -0.10074019432067871D, -0.10024909675121307D, -0.09978712350130081D, -0.09936016798019409D, -0.09888911992311478D, -0.09846487641334534D, -0.09800232201814651D, -0.09751661866903305D, -0.0970243439078331D, -0.09657711535692215D, -0.09613432735204697D, -0.0956689789891243D, -0.09518304467201233D, -0.09470118582248688D, -0.09423696994781494D, -0.09374787658452988D, -0.09331570565700531D, -0.09284882992506027D, -0.09236712008714676D, -0.0918976366519928D, -0.09143716841936111D, -0.09097806364297867D, -0.09050887823104858D, -0.09006129950284958D, -0.08960632979869843D, -0.08917775005102158D, -0.08866771310567856D, -0.08821896463632584D, -0.0877581313252449D, -0.08728067576885223D, -0.08678260445594788D, -0.08633118122816086D, -0.08584354817867279D, -0.0853717178106308D, -0.08489247411489487D, -0.08442585915327072D, -0.08395987749099731D, -0.08352631330490112D, -0.08305583149194717D, -0.08258084207773209D, -0.08210133016109467D, -0.08160284906625748D, -0.08113317936658859D, -0.08069101721048355D, -0.08020471036434174D, -0.07976270467042923D, -0.07930315285921097D, -0.07882215827703476D, -0.07839109003543854D, -0.07788340002298355D, -0.07738876342773438D, -0.07692108303308487D, -0.07646818459033966D, -0.07600755244493484D, -0.07554172724485397D, -0.0750839039683342D, -0.07462136447429657D, -0.07418619096279144D, -0.07369257509708405D, -0.07323087751865387D, -0.07274939864873886D, -0.07232934981584549D, -0.0718294009566307D, -0.0713631734251976D, -0.07090400904417038D, -0.07045546174049377D, -0.06996987015008926D, -0.0694737657904625D, -0.06901108473539352D, -0.06850951164960861D, -0.06804317235946655D, -0.0676044300198555D, -0.06714358180761337D, -0.06665648519992828D, -0.06620483845472336D, -0.06572776287794113D, -0.06529750674962997D, -0.06478378176689148D, -0.06431610882282257D, -0.06385191529989243D, -0.06336922943592072D, -0.0629018023610115D, -0.062440142035484314D, -0.061978090554475784D, -0.06151474267244339D, -0.061009474098682404D, -0.0605136975646019D, -0.06004589796066284D, -0.05957134813070297D, -0.059127721935510635D, -0.05862615630030632D, -0.058159153908491135D, -0.0576748289167881D, -0.05721447244286537D, -0.056762006133794785D, -0.05628581345081329D, -0.055841170251369476D, -0.0554051548242569D, -0.05493675544857979D, -0.05444927141070366D, -0.05396290495991707D, -0.05345846712589264D, -0.05297686532139778D, -0.052506621927022934D, -0.052009958773851395D, -0.051531676203012466D, -0.051076509058475494D, -0.0506112314760685D, -0.05013972148299217D, -0.04966387152671814D, -0.04918888956308365D, -0.04871213063597679D, -0.04824038967490196D, -0.04775635525584221D, -0.04728744924068451D, -0.046815820038318634D, -0.04631710797548294D, -0.04582008346915245D, -0.04536677524447441D, -0.04491899907588959D, -0.044470835477113724D, -0.04400596767663956D, -0.043535444885492325D, -0.04307795315980911D, -0.04260599613189697D, -0.042175114154815674D, -0.04172958806157112D, -0.04125590994954109D, -0.04082314670085907D, -0.04037400707602501D, -0.03990166634321213D, -0.039449382573366165D, -0.038977205753326416D, -0.03857160359621048D, -0.03812842443585396D, -0.0376502126455307D, -0.03714657574892044D, -0.03665357083082199D, -0.03620750829577446D, -0.035722747445106506D, -0.03526165336370468D, -0.03478018939495087D, -0.03431404381990433D, -0.033867765218019485D, -0.03341749310493469D, -0.03296608477830887D, -0.0324828140437603D, -0.03204398974776268D, -0.031582657247781754D, -0.031121470034122467D, -0.030629586428403854D, -0.03019966371357441D, -0.02972709760069847D, -0.029238028451800346D, -0.02879139594733715D, -0.02834215760231018D, -0.02785702981054783D, -0.027348829433321953D, -0.026903830468654633D, -0.026418806985020638D, -0.025951212272047997D, -0.02550702914595604D, -0.025065308436751366D, -0.02460712380707264D, -0.0241254810243845D, -0.02367357909679413D, -0.023214267566800117D, -0.02273659221827984D, -0.022288724780082703D, -0.021809976547956467D, -0.021356219425797462D, -0.02091222070157528D, -0.02044014073908329D, -0.019984910264611244D, -0.019542459398508072D, -0.019069962203502655D, -0.018573816865682602D, -0.018139785155653954D, -0.017709843814373016D, -0.01719387248158455D, -0.01673675887286663D, -0.01623465307056904D, -0.01578424498438835D, -0.015328689478337765D, -0.014845888130366802D, -0.014361053705215454D, -0.01387764047831297D, -0.013408266007900238D, -0.012936233542859554D, -0.012468288652598858D, -0.012004869058728218D, -0.01153097115457058D, -0.011026769876480103D, -0.01058868132531643D, -0.010118640959262848D, -0.009648044593632221D, -0.009180471301078796D, -0.00874828826636076D, -0.008231979794800282D, -0.007815088145434856D, -0.007339174393564463D, -0.006868409458547831D, -0.006415967363864183D, -0.00596375809982419D, -0.00553414411842823D, -0.005092580337077379D, -0.004615438170731068D, -0.004147601779550314D, -0.0036700163036584854D, -0.003234181785956025D, -0.002747706137597561D, -0.002275948878377676D, -0.0018008529441431165D, -0.0013390094973146915D, -9.023041930049658E-4D, -4.4535082997754216E-4D, 0.0D, 4.168656305409968E-4D, 8.610964869149029E-4D, 0.0013082061195746064D, 0.0017705500358715653D, 0.0022286938037723303D, 0.0027038094121962786D, 0.0031797823030501604D, 0.0036177479196339846D, 0.004092853982001543D, 0.00455115782096982D, 0.005024673882871866D, 0.0054508778266608715D, 0.005874452646821737D, 0.006345030386000872D, 0.006781958043575287D, 0.007221095263957977D, 0.007751896511763334D, 0.008183642290532589D, 0.008649589493870735D, 0.009099786169826984D, 0.009520403109490871D, 0.01000619400292635D, 0.01046296488493681D, 0.010907409712672234D, 0.011398875154554844D, 0.011837021447718143D, 0.012319699861109257D, 0.012789001688361168D, 0.013266430236399174D, 0.013758053071796894D, 0.014256741851568222D, 0.0147450752556324D, 0.015211586840450764D, 0.01564781181514263D, 0.016076650470495224D, 0.016586629673838615D, 0.017026731744408607D, 0.017525365576148033D, 0.01798558607697487D, 0.018427804112434387D, 0.018891869112849236D, 0.01935114525258541D, 0.019804034382104874D, 0.020264199003577232D, 0.020725706592202187D, 0.021203743293881416D, 0.021654309704899788D, 0.022142447531223297D, 0.02260545641183853D, 0.02308838628232479D, 0.023543886840343475D, 0.02397369220852852D, 0.024441862478852272D, 0.024915242567658424D, 0.025360191240906715D, 0.025840288028120995D, 0.02631484717130661D, 0.026808904483914375D, 0.02727837674319744D, 0.027765285223722458D, 0.028254829347133636D, 0.028705906122922897D, 0.029156357049942017D, 0.029635854065418243D, 0.030102955177426338D, 0.030535848811268806D, 0.03101063147187233D, 0.0314723402261734D, 0.03192717581987381D, 0.032385364174842834D, 0.03285473957657814D, 0.03331996127963066D, 0.033790718764066696D, 0.03424150124192238D, 0.03469865396618843D, 0.03515125438570976D, 0.035605255514383316D, 0.03608577698469162D, 0.03652714565396309D, 0.036979805678129196D, 0.03746131435036659D, 0.0379425548017025D, 0.038345664739608765D, 0.03882379084825516D, 0.0392477810382843D, 0.03971483185887337D, 0.0401901938021183D, 0.04066096618771553D, 0.041114721447229385D, 0.04158128425478935D, 0.0420382022857666D, 0.04248936101794243D, 0.042961087077856064D, 0.04341959208250046D, 0.043904419988393784D, 0.0443427637219429D, 0.04480225220322609D, 0.04524291679263115D, 0.04567072167992592D, 0.04613497108221054D, 0.04659995064139366D, 0.047081708908081055D, 0.04757154732942581D, 0.04803965613245964D, 0.048478204756975174D, 0.048989493399858475D, 0.049454182386398315D, 0.04991860315203667D, 0.050365593284368515D, 0.0508514903485775D, 0.05132327973842621D, 0.05179283022880554D, 0.052248794585466385D, 0.05268503352999687D, 0.053198836743831635D, 0.05368649214506149D, 0.05421089380979538D, 0.054658785462379456D, 0.05512617900967598D, 0.05555638298392296D, 0.0560036227107048D, 0.05645635724067688D, 0.05692245066165924D, 0.05738668516278267D, 0.05786433443427086D, 0.058321356773376465D, 0.05880298092961311D, 0.05926252529025078D, 0.05970615893602371D, 0.06018388643860817D, 0.06063615530729294D, 0.061135876923799515D, 0.06162475049495697D, 0.06207337975502014D, 0.06256981939077377D, 0.0630052387714386D, 0.0634310320019722D, 0.0638926699757576D, 0.06436608731746674D, 0.0648551806807518D, 0.06531759351491928D, 0.065772145986557D, 0.06625805050134659D, 0.06672851741313934D, 0.06720802187919617D, 0.06766702234745026D, 0.06809297949075699D, 0.06856777518987656D, 0.06906134635210037D, 0.0695035383105278D, 0.06995517015457153D, 0.07043462246656418D, 0.07087671756744385D, 0.07131607830524445D, 0.07179289311170578D, 0.07225023955106735D, 0.07268200069665909D, 0.07317853718996048D, 0.07361547648906708D, 0.07412286102771759D, 0.07458420842885971D, 0.07503563165664673D, 0.07551742345094681D, 0.07598724961280823D, 0.07641705870628357D, 0.07686413079500198D, 0.07736052572727203D, 0.07785376906394958D, 0.07831523567438126D, 0.07877857238054276D, 0.07922326028347015D, 0.07968610525131226D, 0.08015176653862D, 0.08060047775506973D, 0.08107147365808487D, 0.08151480555534363D, 0.08202660828828812D, 0.08250529319047928D, 0.08296989649534225D, 0.08345716446638107D, 0.08391540497541428D, 0.08433298021554947D, 0.08479931950569153D, 0.08524123579263687D, 0.08570325374603271D, 0.0861559808254242D, 0.08659818768501282D, 0.08707676082849503D, 0.08756472170352936D, 0.08801695704460144D, 0.08853187412023544D, 0.08898908644914627D, 0.08946547657251358D, 0.08992484211921692D, 0.0903463140130043D, 0.09079413115978241D, 0.09125514328479767D, 0.09171689301729202D, 0.09216631948947906D, 0.09262130409479141D, 0.09305017441511154D, 0.09349587559700012D, 0.09393535554409027D, 0.09437032788991928D, 0.09485276788473129D, 0.09533093869686127D, 0.09582594037055969D, 0.09629540890455246D, 0.09672483801841736D, 0.09716562926769257D, 0.09765120595693588D, 0.09813567996025085D, 0.0985914096236229D, 0.0990055575966835D, 0.09946183115243912D, 0.09987382590770721D, 0.10033174604177475D, 0.10079345107078552D, 0.10127578675746918D, 0.10172127932310104D, 0.10217364132404327D, 0.10263688117265701D, 0.10307306051254272D, 0.10350827872753143D, 0.10397220402956009D, 0.10442768037319183D, 0.10491803288459778D, 0.1053432822227478D, 0.10581864416599274D, 0.10627686977386475D, 0.1067519336938858D, 0.10721217095851898D, 0.10764270275831223D, 0.10811315476894379D, 0.10855291038751602D, 0.1089974045753479D, 0.10945462435483932D, 0.10991151630878448D, 0.11035595089197159D, 0.11079936474561691D, 0.11126214265823364D, 0.11171538382768631D, 0.11215132474899292D, 0.11261577159166336D, 0.11305342614650726D, 0.11349684000015259D, 0.11396090686321259D, 0.11440304666757584D, 0.1148676946759224D, 0.11534382402896881D, 0.11578971147537231D, 0.11626245826482773D, 0.11670893430709839D, 0.11717358231544495D, 0.11763584613800049D, 0.11809416860342026D, 0.1185641959309578D, 0.1190362498164177D, 0.11947569251060486D, 0.11995163559913635D, 0.12034139782190323D, 0.12079598009586334D, 0.12123335897922516D, 0.12171798199415207D, 0.12220712006092072D, 0.12266131490468979D, 0.12311149388551712D, 0.12358853965997696D, 0.12402278184890747D, 0.12447427213191986D, 0.12492292374372482D, 0.12536488473415375D, 0.1258557140827179D, 0.12631472945213318D, 0.12678931653499603D, 0.1272418200969696D, 0.1276789903640747D, 0.12812837958335876D, 0.12855777144432068D, 0.12901000678539276D, 0.1295066773891449D, 0.12997055053710938D, 0.13041932880878448D, 0.13086055219173431D, 0.13131678104400635D, 0.13173618912696838D, 0.13217733800411224D, 0.13257558643817902D, 0.13303515315055847D, 0.13347606360912323D, 0.1339293271303177D, 0.13438007235527039D, 0.1348496675491333D, 0.1352933943271637D, 0.13577623665332794D, 0.13623352348804474D, 0.13667674362659454D, 0.1371779888868332D, 0.13767582178115845D, 0.13814261555671692D, 0.13862669467926025D, 0.13910050690174103D, 0.13954664766788483D, 0.14002522826194763D, 0.1404792070388794D, 0.14095349609851837D, 0.14145132899284363D, 0.14194148778915405D, 0.14239490032196045D, 0.14285248517990112D, 0.14331306517124176D, 0.14375628530979156D, 0.14420928061008453D, 0.14471451938152313D, 0.1451774686574936D, 0.14563149213790894D, 0.14607255160808563D, 0.14652425050735474D, 0.1469966620206833D, 0.14742255210876465D, 0.14784209430217743D, 0.14830715954303741D, 0.14879651367664337D, 0.149237722158432D, 0.14971013367176056D, 0.15021756291389465D, 0.15068085491657257D, 0.15116679668426514D, 0.15161839127540588D, 0.152106374502182D, 0.1525515913963318D, 0.15302610397338867D, 0.15346159040927887D, 0.15394625067710876D, 0.15438704192638397D, 0.15487033128738403D, 0.1553371548652649D, 0.15580454468727112D, 0.156284898519516D, 0.15671078860759735D, 0.15717515349388123D, 0.15761828422546387D, 0.15807723999023438D, 0.15852780640125275D, 0.15896621346473694D, 0.1594497412443161D, 0.15990334749221802D, 0.1603526622056961D, 0.16084396839141846D, 0.16133654117584229D, 0.16182120144367218D, 0.16228310763835907D, 0.16274477541446686D, 0.1631993055343628D, 0.16370509564876556D, 0.16416113078594208D, 0.16461949050426483D, 0.16509303450584412D, 0.16555249691009521D, 0.16599228978157043D, 0.16644693911075592D, 0.16691160202026367D, 0.1673542857170105D, 0.16779595613479614D, 0.16828018426895142D, 0.16872042417526245D, 0.16914832592010498D, 0.1696404069662094D, 0.17009416222572327D, 0.17058154940605164D, 0.17106236517429352D, 0.17150871455669403D, 0.17193780839443207D, 0.1723848581314087D, 0.17284345626831055D, 0.17332123219966888D, 0.17382800579071045D, 0.17429354786872864D, 0.17473028600215912D, 0.1752118319272995D, 0.17569267749786377D, 0.17617307603359222D, 0.17664162814617157D, 0.17711058259010315D, 0.177546888589859D, 0.17802934348583221D, 0.17847880721092224D, 0.17895878851413727D, 0.17944811284542084D, 0.17991696298122406D, 0.18034568428993225D, 0.18083885312080383D, 0.18134140968322754D, 0.1817953884601593D, 0.18224695324897766D, 0.1827344000339508D, 0.18319717049598694D, 0.18362371623516083D, 0.18408402800559998D, 0.1845383197069168D, 0.18500585854053497D, 0.18543913960456848D, 0.18589206039905548D, 0.18638618290424347D, 0.18683254718780518D, 0.18729357421398163D, 0.1877458542585373D, 0.1881948709487915D, 0.18867141008377075D, 0.1891425997018814D, 0.1896383911371231D, 0.19008977711200714D, 0.19059477746486664D, 0.1910955309867859D, 0.19154046475887299D, 0.1920085996389389D, 0.1924976259469986D, 0.19297999143600464D, 0.19346415996551514D, 0.1938929706811905D, 0.19440758228302002D, 0.1948833465576172D, 0.1953524500131607D, 0.19580426812171936D, 0.19628435373306274D, 0.19678011536598206D, 0.1972467005252838D, 0.19772139191627502D, 0.19817455112934113D, 0.19861629605293274D, 0.19908666610717773D, 0.19956916570663452D, 0.20003587007522583D, 0.2004714459180832D, 0.20093294978141785D, 0.2013975977897644D, 0.20189401507377625D, 0.20238760113716125D, 0.20286208391189575D, 0.203344464302063D, 0.2038167268037796D, 0.20429755747318268D, 0.20473958551883698D, 0.20518158376216888D, 0.2056620866060257D, 0.20609739422798157D, 0.2065676748752594D, 0.20705540478229523D, 0.2075486183166504D, 0.2080535888671875D, 0.20851968228816986D, 0.20897184312343597D, 0.20944087207317352D, 0.20993351936340332D, 0.2104172706604004D, 0.210901141166687D, 0.2113402634859085D, 0.21182526648044586D, 0.21224695444107056D, 0.2126944214105606D, 0.21317575871944427D, 0.21366049349308014D, 0.2141040563583374D, 0.21457503736019135D, 0.2150408923625946D, 0.2154938280582428D, 0.2159576565027237D, 0.21639752388000488D, 0.2168862372636795D, 0.2173519879579544D, 0.2177966684103012D, 0.21821701526641846D, 0.21873435378074646D, 0.21923255920410156D, 0.21964925527572632D, 0.22016601264476776D, 0.22062964737415314D, 0.22109317779541016D, 0.22157219052314758D, 0.22205998003482819D, 0.22250258922576904D, 0.22299329936504364D, 0.22346089780330658D, 0.22386358678340912D, 0.22431528568267822D, 0.22480542957782745D, 0.2252291440963745D, 0.2257033735513687D, 0.2261507213115692D, 0.22663995623588562D, 0.227098748087883D, 0.22758157551288605D, 0.2280273586511612D, 0.2284591943025589D, 0.22891086339950562D, 0.2293635904788971D, 0.22981512546539307D, 0.2303115725517273D, 0.2307835817337036D, 0.2312321662902832D, 0.23169724643230438D, 0.23218663036823273D, 0.23266419768333435D, 0.23312914371490479D, 0.233600914478302D, 0.23405154049396515D, 0.23452113568782806D, 0.23498238623142242D, 0.2354474514722824D, 0.23587417602539062D, 0.23632276058197021D, 0.2367987036705017D, 0.23725953698158264D, 0.23771677911281586D, 0.23819883167743683D, 0.23865287005901337D, 0.23909300565719604D, 0.23953081667423248D, 0.23997336626052856D, 0.24042324721813202D, 0.24086444079875946D, 0.2413105070590973D, 0.24174147844314575D, 0.24222896993160248D, 0.24265654385089874D, 0.24309583008289337D, 0.2435549646615982D, 0.2439824342727661D, 0.24444152414798737D, 0.2448790967464447D, 0.24534952640533447D, 0.24579569697380066D, 0.24623432755470276D, 0.24664406478405D, 0.24708445370197296D, 0.24750955402851105D, 0.24798931181430817D, 0.24846124649047852D, 0.2489023059606552D, 0.24936534464359283D, 0.24984745681285858D, 0.2503180503845215D, 0.25077712535858154D, 0.25124165415763855D, 0.25171688199043274D, 0.25217753648757935D, 0.25262942910194397D, 0.2530757188796997D, 0.25351011753082275D, 0.25398433208465576D, 0.2544580101966858D, 0.2548938989639282D, 0.25534236431121826D, 0.25578323006629944D, 0.2562248408794403D, 0.2566409409046173D, 0.2571069300174713D, 0.25757265090942383D, 0.2580459415912628D, 0.25851020216941833D, 0.25894230604171753D, 0.25939860939979553D, 0.2598321735858917D, 0.26028236746788025D, 0.26076990365982056D, 0.26125451922416687D, 0.2616814374923706D, 0.2621334493160248D, 0.26258885860443115D, 0.2630382478237152D, 0.2634872794151306D, 0.2639560103416443D, 0.26442626118659973D, 0.26490315794944763D, 0.26534172892570496D, 0.2657735347747803D, 0.26625367999076843D, 0.26668620109558105D, 0.26711753010749817D, 0.26758676767349243D, 0.2680959403514862D, 0.26854223012924194D, 0.26900240778923035D, 0.2694344222545624D, 0.2698785364627838D, 0.2703325152397156D, 0.27079638838768005D, 0.27121323347091675D, 0.27164754271507263D, 0.2721148729324341D, 0.27261990308761597D, 0.2730520963668823D, 0.2735033929347992D, 0.27395889163017273D, 0.2744174897670746D, 0.2749277353286743D, 0.2753666937351227D, 0.27583181858062744D, 0.2762593924999237D, 0.27671781182289124D, 0.2771632969379425D, 0.27762773633003235D, 0.27808821201324463D, 0.2785561978816986D, 0.2790210247039795D, 0.2794676721096039D, 0.27997758984565735D, 0.2804442048072815D, 0.2809334099292755D, 0.2814132869243622D, 0.2819100320339203D, 0.2823738157749176D, 0.2828632891178131D, 0.2832971513271332D, 0.2837606370449066D, 0.2842257022857666D, 0.284706175327301D, 0.28517892956733704D, 0.2856413722038269D, 0.28612804412841797D, 0.2866162955760956D, 0.2870566248893738D, 0.28752243518829346D, 0.28795307874679565D, 0.2884029150009155D, 0.28882715106010437D, 0.2893234193325043D, 0.28977981209754944D, 0.29021215438842773D, 0.29065024852752686D, 0.29114648699760437D, 0.29163259267807007D, 0.29209470748901367D, 0.29254150390625D, 0.29303133487701416D, 0.29347801208496094D, 0.2939077317714691D, 0.29437002539634705D, 0.2948186695575714D, 0.2952706217765808D, 0.29571935534477234D, 0.29619288444519043D, 0.29662781953811646D, 0.2970706522464752D, 0.2975059449672699D, 0.2979780435562134D, 0.2984209656715393D, 0.2989175319671631D, 0.29936090111732483D, 0.29983457922935486D, 0.30030179023742676D, 0.3007870316505432D, 0.30124491453170776D, 0.3017134666442871D, 0.30218929052352905D, 0.30264225602149963D, 0.3031245768070221D, 0.30356884002685547D, 0.3040228486061096D, 0.3044879138469696D, 0.30492523312568665D, 0.30536073446273804D, 0.30580392479896545D, 0.3062219023704529D, 0.30666860938072205D, 0.3070964515209198D, 0.30755335092544556D, 0.30799052119255066D, 0.3084643483161926D, 0.3089260160923004D, 0.3093597888946533D, 0.3098238706588745D, 0.31024208664894104D, 0.31071120500564575D, 0.3111429512500763D, 0.31156468391418457D, 0.3120630085468292D, 0.31250911951065063D, 0.3129652738571167D, 0.3134596645832062D, 0.31389009952545166D, 0.3142957389354706D, 0.314715176820755D, 0.31520751118659973D, 0.3156639337539673D, 0.3161354660987854D, 0.31650006771087646D, 0.31700363755226135D, 0.3174765706062317D, 0.3179265558719635D, 0.31831637024879456D, 0.31879016757011414D, 0.3192623555660248D, 0.3196816146373749D, 0.32012230157852173D, 0.32058221101760864D, 0.32105132937431335D, 0.3214877247810364D, 0.321958065032959D, 0.3224197030067444D, 0.32287776470184326D, 0.3232984244823456D, 0.32375460863113403D, 0.32420462369918823D, 0.3246663212776184D, 0.3250793516635895D, 0.32551777362823486D, 0.32601094245910645D, 0.32646849751472473D, 0.3269194960594177D, 0.327384352684021D, 0.32789483666419983D, 0.32835909724235535D, 0.32883167266845703D, 0.3293091654777527D, 0.32977598905563354D, 0.330209881067276D, 0.3306809663772583D, 0.3311329483985901D, 0.33160221576690674D, 0.33207982778549194D, 0.3325675427913666D, 0.3330262303352356D, 0.3335005044937134D, 0.33391913771629333D, 0.33441251516342163D, 0.3348396420478821D, 0.3353181481361389D, 0.3357672095298767D, 0.33621659874916077D, 0.3367024064064026D, 0.3371727168560028D, 0.3376167416572571D, 0.3381151854991913D, 0.33856678009033203D, 0.339025616645813D, 0.33946481347084045D, 0.33994701504707336D, 0.3403969705104828D, 0.3408898115158081D, 0.34135758876800537D, 0.3418196737766266D, 0.34231361746788025D, 0.3427829146385193D, 0.3432021141052246D, 0.343667596578598D, 0.34414032101631165D, 0.34463152289390564D, 0.34506839513778687D, 0.3455321788787842D, 0.3459724187850952D, 0.3464416563510895D, 0.3468835651874542D, 0.3473498225212097D, 0.34777554869651794D, 0.34825536608695984D, 0.34872201085090637D, 0.3492021858692169D, 0.34968751668930054D, 0.35015514492988586D, 0.3506210446357727D, 0.35111862421035767D, 0.3515591323375702D, 0.35197773575782776D, 0.35246777534484863D, 0.35293281078338623D, 0.3533059060573578D, 0.35381144285202026D, 0.3542632758617401D, 0.35472649335861206D, 0.35519418120384216D, 0.3557141423225403D, 0.3561652600765228D, 0.3566296100616455D, 0.35712379217147827D, 0.35762926936149597D, 0.3580913543701172D, 0.35853779315948486D, 0.3590478003025055D, 0.3594883680343628D, 0.3599258363246918D, 0.3603578805923462D, 0.3608366549015045D, 0.36130017042160034D, 0.3617651164531708D, 0.3622173070907593D, 0.3626740574836731D, 0.36311766505241394D, 0.3635890483856201D, 0.36403384804725647D, 0.36449429392814636D, 0.3649645745754242D, 0.36542847752571106D, 0.3658938407897949D, 0.366346538066864D, 0.3668064475059509D, 0.3672544062137604D, 0.3676927983760834D, 0.3681465983390808D, 0.368583083152771D, 0.3690279722213745D, 0.36952367424964905D, 0.3699638843536377D, 0.370394766330719D, 0.3708454668521881D, 0.3712919354438782D, 0.3717401921749115D, 0.37220123410224915D, 0.37264400720596313D, 0.37307944893836975D, 0.37358567118644714D, 0.37402620911598206D, 0.3744513988494873D, 0.37491515278816223D, 0.37531962990760803D, 0.3757742941379547D, 0.3762052357196808D, 0.37664008140563965D, 0.37707191705703735D, 0.3775149881839752D, 0.3779565095901489D, 0.3784351944923401D, 0.3788757920265198D, 0.37933775782585144D, 0.37975525856018066D, 0.38018184900283813D, 0.3806290328502655D, 0.3810517489910126D, 0.3814375102519989D, 0.3818727433681488D, 0.3823419213294983D, 0.3828076124191284D, 0.3832823932170868D, 0.3837049901485443D, 0.3841449022293091D, 0.3846031129360199D, 0.3850502371788025D, 0.385475754737854D, 0.38596659898757935D, 0.3864104151725769D, 0.38683876395225525D, 0.3873252868652344D, 0.3877384662628174D, 0.388178288936615D, 0.3885806202888489D, 0.3890480697154999D, 0.3895305395126343D, 0.3900220990180969D, 0.39047881960868835D, 0.39091551303863525D, 0.39139822125434875D, 0.39183932542800903D, 0.392275869846344D, 0.392767995595932D, 0.3932383060455322D, 0.3937053978443146D, 0.3941604793071747D, 0.3946269154548645D, 0.39507585763931274D, 0.39548471570014954D, 0.3959529995918274D, 0.39645472168922424D, 0.39692774415016174D, 0.39741259813308716D, 0.39785870909690857D, 0.3983263075351715D, 0.3988035321235657D, 0.39925169944763184D, 0.3996838927268982D, 0.4001287519931793D, 0.4006178677082062D, 0.4010898768901825D, 0.4015604555606842D, 0.40202707052230835D, 0.40245679020881653D, 0.40293094515800476D, 0.4034392535686493D, 0.4039093255996704D, 0.4043821692466736D, 0.40486443042755127D, 0.4053739905357361D, 0.4058074355125427D, 0.40630874037742615D, 0.4067918658256531D, 0.4072363078594208D, 0.40767401456832886D, 0.4081343412399292D, 0.4085795283317566D, 0.4090270400047302D, 0.4094325006008148D, 0.4099096357822418D, 0.4103759229183197D, 0.4108376204967499D, 0.4113309681415558D, 0.4117901027202606D, 0.41226187348365784D, 0.41273775696754456D, 0.41322728991508484D, 0.4136919677257538D, 0.41412317752838135D, 0.4145846366882324D, 0.415062814950943D, 0.415499746799469D, 0.41598421335220337D, 0.4164329767227173D, 0.4168729782104492D, 0.4173301160335541D, 0.41776272654533386D, 0.4181908071041107D, 0.4186636209487915D, 0.4190938472747803D, 0.4195532202720642D, 0.4200260639190674D, 0.4205058813095093D, 0.4209406077861786D, 0.42138221859931946D, 0.421817421913147D, 0.4222801923751831D, 0.4227195084095001D, 0.4231964647769928D, 0.4236719608306885D, 0.42410510778427124D, 0.42456895112991333D, 0.42507311701774597D, 0.4255290925502777D, 0.4260011315345764D, 0.42646899819374084D, 0.42692455649375916D, 0.4274055063724518D, 0.42785710096359253D, 0.42829200625419617D, 0.4287801682949066D, 0.4292578399181366D, 0.4297063946723938D, 0.4301692843437195D, 0.430625319480896D, 0.4311210811138153D, 0.4315798580646515D, 0.4320110082626343D, 0.43246930837631226D, 0.4329104423522949D, 0.4333850145339966D, 0.43380045890808105D, 0.4342290759086609D, 0.43472087383270264D, 0.4351579248905182D, 0.4356578290462494D, 0.4361093044281006D, 0.43657541275024414D, 0.4369976818561554D, 0.43740877509117126D, 0.43785667419433594D, 0.4383409023284912D, 0.4387859106063843D, 0.4392130672931671D, 0.4396638870239258D, 0.4401101768016815D, 0.4405667185783386D, 0.4410354793071747D, 0.4415227770805359D, 0.44195571541786194D, 0.4424566924571991D, 0.44294804334640503D, 0.44344770908355713D, 0.4438609778881073D, 0.44431737065315247D, 0.4447491466999054D, 0.4451911747455597D, 0.44563400745391846D, 0.4461042881011963D, 0.4465523660182953D, 0.44701021909713745D, 0.44744202494621277D, 0.44790083169937134D, 0.44836023449897766D, 0.4487965404987335D, 0.44924411177635193D, 0.4496929347515106D, 0.45014363527297974D, 0.45060500502586365D, 0.4510105848312378D, 0.45146453380584717D, 0.4519331455230713D, 0.45240896940231323D, 0.45286038517951965D, 0.45329752564430237D, 0.4537377655506134D, 0.4542039632797241D, 0.45463576912879944D, 0.45509567856788635D, 0.4555233418941498D, 0.45594367384910583D, 0.4564257264137268D, 0.45684814453125D, 0.45732614398002625D, 0.45778998732566833D, 0.4582274556159973D, 0.4586721658706665D, 0.4591447114944458D, 0.45960500836372375D, 0.4600178301334381D, 0.46047934889793396D, 0.4609234929084778D, 0.46136897802352905D, 0.4618026316165924D, 0.462283194065094D, 0.4627189636230469D, 0.4631398916244507D, 0.4636479616165161D, 0.46408990025520325D, 0.46446308493614197D, 0.46488359570503235D, 0.4653341770172119D, 0.46579721570014954D, 0.46624305844306946D, 0.4666842520236969D, 0.4671739637851715D, 0.4676412045955658D, 0.4681183695793152D, 0.468619704246521D, 0.4690823554992676D, 0.4695432782173157D, 0.47002753615379333D, 0.47044625878334045D, 0.4709080457687378D, 0.4713667631149292D, 0.47178512811660767D, 0.4722518026828766D, 0.4727015495300293D, 0.4732007086277008D, 0.4736599624156952D, 0.47416114807128906D, 0.4746391177177429D, 0.4750903248786926D, 0.47553959488868713D, 0.4759838581085205D, 0.47645294666290283D, 0.47691580653190613D, 0.4773806631565094D, 0.47785019874572754D, 0.47835424542427063D, 0.4787907898426056D, 0.4792308509349823D, 0.47971123456954956D, 0.48016679286956787D, 0.4806031286716461D, 0.4810718894004822D, 0.4815417528152466D, 0.4820031523704529D, 0.48243653774261475D, 0.4828621745109558D, 0.4833242893218994D, 0.4837735593318939D, 0.48425227403640747D, 0.4847247004508972D, 0.48517146706581116D, 0.48558691143989563D, 0.48607468605041504D, 0.4865155518054962D, 0.48698723316192627D, 0.4874122142791748D, 0.4878520965576172D, 0.4882693886756897D, 0.4887109100818634D, 0.48919129371643066D, 0.48964065313339233D, 0.49008241295814514D, 0.49052369594573975D, 0.4909614324569702D, 0.4914078414440155D, 0.491849422454834D, 0.4922744333744049D, 0.49270620942115784D, 0.4931676983833313D, 0.49362602829933167D, 0.49406757950782776D, 0.49453216791152954D, 0.49497801065444946D, 0.4954409599304199D, 0.4958536922931671D, 0.4962973892688751D, 0.49675166606903076D, 0.49723342061042786D, 0.4976520836353302D, 0.4981245696544647D, 0.49855509400367737D, 0.49899476766586304D, 0.4994736909866333D, 0.49990856647491455D, 0.5003674030303955D, 0.50080406665802D, 0.5012417435646057D, 0.5017043948173523D, 0.5021814703941345D, 0.5026438236236572D, 0.5030980110168457D, 0.5035042762756348D, 0.503902018070221D, 0.5043559074401855D, 0.5048004388809204D, 0.5052796006202698D, 0.5057178735733032D, 0.5061670541763306D, 0.5066263675689697D, 0.5070849061012268D, 0.5075520873069763D, 0.5079953670501709D, 0.5084426999092102D, 0.5088971853256226D, 0.509351909160614D, 0.5097948312759399D, 0.5102611184120178D, 0.5107103586196899D, 0.5111591815948486D, 0.5115908980369568D, 0.5120378136634827D, 0.5124511122703552D, 0.5129324793815613D, 0.5134246945381165D, 0.5138871073722839D, 0.5143778324127197D, 0.5148214101791382D, 0.5152270793914795D, 0.5156940817832947D, 0.5161502361297607D, 0.5166060328483582D, 0.5170818567276001D, 0.517525315284729D, 0.5179942846298218D, 0.5183911919593811D, 0.5188703536987305D, 0.5193058252334595D, 0.5197564959526062D, 0.5202117562294006D, 0.5207022428512573D, 0.5211948156356812D, 0.5216438174247742D, 0.5221007466316223D, 0.5225681662559509D, 0.5230153203010559D, 0.5234923958778381D, 0.5239441990852356D, 0.5243942141532898D, 0.5248235464096069D, 0.5252488851547241D, 0.5256743431091309D, 0.526077926158905D, 0.5265212059020996D, 0.5269445180892944D, 0.5274064540863037D, 0.52787184715271D, 0.5283424854278564D, 0.5288335680961609D, 0.5292720198631287D, 0.5297167301177979D, 0.5302064418792725D, 0.5306571125984192D, 0.531088650226593D, 0.5315560102462769D, 0.5319926738739014D, 0.5324088931083679D, 0.532862663269043D, 0.5333322286605835D, 0.5337752103805542D, 0.5341958999633789D, 0.5346767902374268D, 0.5351715087890625D, 0.5356220602989197D, 0.5361113548278809D, 0.536573052406311D, 0.5370585322380066D, 0.5375128984451294D, 0.5379542112350464D, 0.538433849811554D, 0.5388942956924438D, 0.5393670201301575D, 0.5398485660552979D, 0.5402945876121521D, 0.5407204031944275D, 0.541131317615509D, 0.5416036248207092D, 0.5420829057693481D, 0.5425488948822021D, 0.5430117249488831D, 0.5434421896934509D, 0.54389888048172D, 0.5443391799926758D, 0.5447611212730408D, 0.545224130153656D, 0.545673131942749D, 0.5460936427116394D, 0.5465660691261292D, 0.5470452308654785D, 0.5475273728370667D, 0.5479429960250854D, 0.5484063625335693D, 0.5488631129264832D, 0.5493146181106567D, 0.549760639667511D, 0.5502592921257019D, 0.5507493019104004D, 0.5511957406997681D, 0.5516489744186401D, 0.5521084666252136D, 0.5525751709938049D, 0.5530290603637695D, 0.553477942943573D, 0.5539233684539795D, 0.5544093251228333D, 0.5548952221870422D, 0.5553575158119202D, 0.5558218359947205D, 0.5563178062438965D, 0.5567854642868042D, 0.5572537779808044D, 0.5577130317687988D, 0.5581837296485901D, 0.5586464405059814D, 0.5590561628341675D, 0.559502899646759D, 0.5599905848503113D, 0.5604462623596191D, 0.5608773231506348D, 0.5613529086112976D, 0.5618170499801636D, 0.5622658133506775D, 0.5627509355545044D, 0.5631857514381409D, 0.5636336207389832D, 0.5640740394592285D, 0.5644878149032593D, 0.5649570822715759D, 0.5654452443122864D, 0.5659193992614746D, 0.566391110420227D, 0.5668405294418335D, 0.5673339366912842D, 0.5678455829620361D, 0.5682653188705444D, 0.5687336325645447D, 0.5691594481468201D, 0.5696210861206055D, 0.5700470805168152D, 0.5705402493476868D, 0.5709607005119324D, 0.5714168548583984D, 0.5718520283699036D, 0.57235187292099D, 0.5728260278701782D, 0.5732724070549011D, 0.5737460255622864D, 0.574226438999176D, 0.5747095346450806D, 0.5751391649246216D, 0.5756227374076843D, 0.576072096824646D, 0.5765191316604614D, 0.5769604444503784D, 0.5774073600769043D, 0.5778785347938538D, 0.5783064365386963D, 0.5787573456764221D, 0.5792401432991028D, 0.5796770453453064D, 0.5801228880882263D, 0.580571711063385D, 0.5810607075691223D, 0.5815511345863342D, 0.5820316672325134D, 0.5824490785598755D, 0.5829075574874878D, 0.5833353400230408D, 0.583755612373352D, 0.5841545462608337D, 0.5846143960952759D, 0.5850520730018616D, 0.5855194926261902D, 0.5859699249267578D, 0.5864249467849731D, 0.5868760943412781D, 0.5873154401779175D, 0.5878191590309143D, 0.5882934927940369D, 0.5887097716331482D, 0.5891896486282349D, 0.5895995497703552D, 0.590004563331604D, 0.5904493927955627D, 0.5908958911895752D, 0.5913615226745605D, 0.5917897820472717D, 0.5922753810882568D, 0.5927274823188782D, 0.5931650400161743D, 0.5936287045478821D, 0.5940912365913391D, 0.594519317150116D, 0.5949195623397827D, 0.5953518152236938D, 0.5957903861999512D, 0.5961790680885315D, 0.5966396927833557D, 0.5971011519432068D, 0.5975552201271057D, 0.5979733467102051D, 0.5984484553337097D, 0.5989205837249756D, 0.5993812084197998D, 0.5998334288597107D, 0.6002959609031677D, 0.6007367968559265D, 0.6011759638786316D, 0.6016338467597961D, 0.6020973324775696D, 0.6025475859642029D, 0.6030203700065613D, 0.6034669876098633D, 0.6039260029792786D, 0.6043735146522522D, 0.6048296689987183D, 0.6052897572517395D, 0.6057608723640442D, 0.6062213778495789D, 0.606634259223938D, 0.6071000695228577D, 0.6075388789176941D, 0.6079697012901306D, 0.6084229946136475D, 0.608896791934967D, 0.6093420386314392D, 0.6098447442054749D, 0.6102806925773621D, 0.6107364296913147D, 0.611167311668396D, 0.6116251349449158D, 0.6120520830154419D, 0.6124976277351379D, 0.6129326224327087D, 0.613406777381897D, 0.6138620972633362D, 0.6143354177474976D, 0.6147979497909546D, 0.6152039766311646D, 0.6156638860702515D, 0.6161479353904724D, 0.6165993809700012D, 0.6170254349708557D, 0.6174780130386353D, 0.6178731918334961D, 0.6183233857154846D, 0.6187865734100342D, 0.6192396283149719D, 0.6197004318237305D, 0.6201303601264954D, 0.6205298900604248D, 0.6209881901741028D, 0.6214309930801392D, 0.6218465566635132D, 0.6223141551017761D, 0.622797966003418D, 0.6232821345329285D, 0.6237058043479919D, 0.6241947412490845D, 0.6246213912963867D, 0.6250787377357483D, 0.6255142092704773D, 0.6259811520576477D, 0.6264455914497375D, 0.6269148588180542D, 0.6274139881134033D, 0.6278729438781738D, 0.6283060908317566D, 0.6287518739700317D, 0.6292106509208679D, 0.6296188235282898D, 0.6300769448280334D, 0.6305136680603027D, 0.63094162940979D, 0.6313846707344055D, 0.6318341493606567D, 0.6322691440582275D, 0.63270103931427D, 0.6331589818000793D, 0.6335994601249695D, 0.6340522170066833D, 0.6345309615135193D, 0.6349889039993286D, 0.6354559659957886D, 0.6359289884567261D, 0.6363810896873474D, 0.6368818879127502D, 0.6373507976531982D, 0.6378063559532166D, 0.6382505893707275D, 0.6386348009109497D, 0.6391111016273499D, 0.6395545601844788D, 0.6399886608123779D, 0.6404418349266052D, 0.6408824920654297D, 0.6413149833679199D, 0.6417574882507324D, 0.6421859860420227D, 0.6426514387130737D, 0.6430553793907166D, 0.6434748768806458D, 0.6439327001571655D, 0.6443507075309753D, 0.6448029279708862D, 0.6452566385269165D, 0.6457155346870422D, 0.6461554765701294D, 0.646624743938446D, 0.6471140384674072D, 0.6475616097450256D, 0.6480266451835632D, 0.6484441757202148D, 0.6489031314849854D, 0.6492921113967896D, 0.6497485041618347D, 0.6501544713973999D, 0.6505953669548035D, 0.651073157787323D, 0.6515265703201294D, 0.6519653797149658D, 0.6524019837379456D, 0.6528423428535461D, 0.6533025503158569D, 0.6537554860115051D, 0.6541864275932312D, 0.6545959711074829D, 0.6550230979919434D, 0.6554749608039856D, 0.6558961272239685D, 0.6563379764556885D, 0.6567652225494385D, 0.6571946740150452D, 0.6576496362686157D, 0.6581230163574219D, 0.6585628390312195D, 0.6589741110801697D, 0.6594311594963074D, 0.65990149974823D, 0.6603091955184937D, 0.6607440114021301D, 0.6612043976783752D, 0.6616629362106323D, 0.6620782017707825D, 0.6625047326087952D, 0.6629456281661987D, 0.6633908152580261D, 0.6638535857200623D, 0.664313554763794D, 0.6647982597351074D, 0.6652121543884277D, 0.6656287312507629D, 0.6660541296005249D, 0.666519284248352D, 0.6669577360153198D, 0.667389452457428D, 0.6678563952445984D, 0.6683056950569153D, 0.6687613129615784D, 0.669194221496582D, 0.6696628928184509D, 0.6701160669326782D, 0.6705893874168396D, 0.671051561832428D, 0.6715012192726135D, 0.6719493865966797D, 0.6724033355712891D, 0.6728721857070923D, 0.6733037233352661D, 0.6737868189811707D, 0.6742551326751709D, 0.674736738204956D, 0.6752104759216309D, 0.6756134033203125D, 0.6760555505752563D, 0.6765036582946777D, 0.6769419312477112D, 0.6774052381515503D, 0.6778636574745178D, 0.678312361240387D, 0.6787456274032593D, 0.6792286038398743D, 0.6796970963478088D, 0.6801307201385498D, 0.6806089282035828D, 0.6810600757598877D, 0.6815366148948669D, 0.6819941997528076D, 0.6824822425842285D, 0.6829573512077332D, 0.6834262013435364D, 0.6839010715484619D, 0.6843841075897217D, 0.6848191618919373D, 0.6852960586547852D, 0.6857536435127258D, 0.6862004399299622D, 0.686630368232727D, 0.6870884299278259D, 0.6875705718994141D, 0.6880114674568176D, 0.6884872317314148D, 0.6889537572860718D, 0.6893516778945923D, 0.6898297667503357D, 0.6903215646743774D, 0.6907835602760315D, 0.6912608742713928D, 0.6916805505752563D, 0.6921491622924805D, 0.6926259398460388D, 0.693117082118988D, 0.6935994029045105D, 0.6940702795982361D, 0.6945260167121887D, 0.694933295249939D, 0.6953966617584229D, 0.695817232131958D, 0.6962674260139465D, 0.6967014074325562D, 0.6971595883369446D, 0.6976086497306824D, 0.6980371475219727D, 0.698500394821167D, 0.6989566683769226D, 0.6993935108184814D, 0.699805736541748D, 0.7002291083335876D, 0.7006635665893555D, 0.7011353373527527D, 0.7015767097473145D, 0.7020057439804077D, 0.7024185061454773D, 0.702873170375824D, 0.7033316493034363D, 0.7037590146064758D, 0.7041760683059692D, 0.7046096324920654D, 0.7050333023071289D, 0.705449640750885D, 0.7058889269828796D, 0.7063031196594238D, 0.7067270874977112D, 0.7071360945701599D, 0.7075799703598022D, 0.7080233097076416D, 0.708462119102478D, 0.7088784575462341D, 0.7093037962913513D, 0.7097235918045044D, 0.7101668119430542D, 0.710568904876709D, 0.7110000252723694D, 0.7114360928535461D, 0.7118644118309021D, 0.7122891545295715D, 0.712740421295166D, 0.7131741046905518D, 0.7136558294296265D, 0.714096188545227D, 0.7145424485206604D, 0.7150042057037354D, 0.7154485583305359D, 0.7159069776535034D, 0.7163503766059875D, 0.7168262600898743D, 0.7172953486442566D, 0.7177931666374207D, 0.7182849049568176D, 0.7187356948852539D, 0.7191860675811768D, 0.7196926474571228D, 0.7201302647590637D, 0.7206245064735413D, 0.721052885055542D, 0.7215341925621033D, 0.7220497131347656D, 0.7225143313407898D, 0.7229704260826111D, 0.7234534025192261D, 0.7239010334014893D, 0.7243943810462952D, 0.7248682379722595D, 0.7253683805465698D, 0.7258584499359131D, 0.7263447642326355D, 0.7268060445785522D, 0.727271556854248D, 0.7277473211288452D, 0.7282049059867859D, 0.7286691665649414D, 0.7291152477264404D, 0.7295757532119751D, 0.7300469875335693D, 0.7304925918579102D, 0.7309231758117676D, 0.7313723564147949D, 0.7318642139434814D, 0.7323406934738159D, 0.7328342795372009D, 0.7333183288574219D, 0.7338053584098816D, 0.7342978715896606D, 0.7347720861434937D, 0.735258936882019D, 0.7357116937637329D, 0.7361682653427124D, 0.7366530299186707D, 0.7371487617492676D, 0.7375858426094055D, 0.7380438446998596D, 0.7385260462760925D, 0.7389861345291138D, 0.7394406795501709D, 0.7399086356163025D, 0.7403405904769897D, 0.7408083081245422D, 0.7412325739860535D, 0.7416885495185852D, 0.7421688437461853D, 0.7426281571388245D, 0.7430750727653503D, 0.7435256242752075D, 0.7439917325973511D, 0.7444330453872681D, 0.7448722124099731D, 0.7452989816665649D, 0.7457219362258911D, 0.7461889982223511D, 0.7466121315956116D, 0.7470548748970032D, 0.7475171685218811D, 0.7479655742645264D, 0.7484027743339539D, 0.7488356828689575D, 0.7493087649345398D, 0.7497596144676208D, 0.7502181529998779D, 0.7506919503211975D, 0.751112699508667D, 0.7515501976013184D, 0.7520002126693726D, 0.7524545788764954D, 0.752912700176239D, 0.7533755302429199D, 0.7538471221923828D, 0.7542758584022522D, 0.7547116279602051D, 0.7551352381706238D, 0.7555804252624512D, 0.7560284733772278D, 0.7564794421195984D, 0.7569202184677124D, 0.7573555111885071D, 0.7578279376029968D, 0.7582671046257019D, 0.7587181925773621D, 0.7591692805290222D, 0.7595980763435364D, 0.760042130947113D, 0.7604596614837646D, 0.7608898282051086D, 0.7613398432731628D, 0.7617748975753784D, 0.7622143626213074D, 0.762671947479248D, 0.7631086707115173D, 0.7635783553123474D, 0.764057993888855D, 0.7645062208175659D, 0.7649529576301575D, 0.7654212713241577D, 0.765864372253418D, 0.7662825584411621D, 0.766756534576416D, 0.7671942114830017D, 0.7676814794540405D, 0.7680966854095459D, 0.7685232758522034D, 0.7689768671989441D, 0.7694152593612671D, 0.7698799967765808D, 0.7703273296356201D, 0.7707749009132385D, 0.7712304592132568D, 0.7716863751411438D, 0.7721555829048157D, 0.7726178765296936D, 0.7730773091316223D, 0.7735387086868286D, 0.77399080991745D, 0.7744596600532532D, 0.7749037146568298D, 0.7753519415855408D, 0.7757992744445801D, 0.7762538194656372D, 0.7767177820205688D, 0.7771676182746887D, 0.7776274681091309D, 0.7780811786651611D, 0.7785055637359619D, 0.778935968875885D, 0.7793811559677124D, 0.7798669338226318D, 0.7803198099136353D, 0.7807332277297974D, 0.7811895608901978D, 0.7816259860992432D, 0.7821038961410522D, 0.7825713157653809D, 0.7830300331115723D, 0.7834687829017639D, 0.7839145064353943D, 0.7843395471572876D, 0.7847908735275269D, 0.7852175235748291D, 0.7856557965278625D, 0.7861036658287048D, 0.7865192890167236D, 0.7869370579719543D, 0.7874005436897278D, 0.7878574728965759D, 0.7883076667785645D, 0.7887727618217468D, 0.7891872525215149D, 0.7896168231964111D, 0.7900912165641785D, 0.7905020713806152D, 0.7909590005874634D, 0.7913734912872314D, 0.7918078303337097D, 0.7922688722610474D, 0.792708158493042D, 0.7931526899337769D, 0.7935686707496643D, 0.7939856648445129D, 0.7944181561470032D, 0.7948570847511292D, 0.7952694892883301D, 0.7957113981246948D, 0.7961326837539673D, 0.7965633869171143D, 0.7970308065414429D, 0.7974699139595032D, 0.7978954315185547D, 0.798319399356842D, 0.798710286617279D, 0.799150288105011D, 0.799579918384552D, 0.8000137805938721D, 0.8004805445671082D, 0.8009114861488342D, 0.8013453483581543D, 0.8017767667770386D, 0.8022176027297974D, 0.8026309013366699D, 0.8030619621276855D, 0.8034893274307251D, 0.8039072751998901D, 0.8043564558029175D, 0.804783284664154D, 0.805206298828125D, 0.8056594729423523D, 0.8061367273330688D, 0.806596040725708D, 0.8070647716522217D, 0.8075343370437622D, 0.8080013394355774D, 0.8084481954574585D, 0.8088930249214172D, 0.8093382120132446D, 0.8098229169845581D, 0.8102787137031555D, 0.810730516910553D, 0.811210036277771D, 0.8116769790649414D, 0.812152624130249D, 0.8126338124275208D, 0.813092052936554D, 0.8135685324668884D, 0.8140095472335815D, 0.81447833776474D, 0.8149551749229431D, 0.8154143691062927D, 0.8158760666847229D, 0.8163301348686218D, 0.8167980313301086D, 0.817247211933136D, 0.8176859021186829D, 0.818127453327179D, 0.8185797333717346D, 0.8190116286277771D, 0.8194664716720581D, 0.8199171423912048D, 0.820368766784668D, 0.820813000202179D, 0.8212815523147583D, 0.8217201232910156D, 0.8221539855003357D, 0.822625458240509D, 0.8230755925178528D, 0.8235254287719727D, 0.823959469795227D, 0.8244135975837708D, 0.8248838186264038D, 0.8253191113471985D, 0.8257774114608765D, 0.82623690366745D, 0.8267050981521606D, 0.8271421194076538D, 0.8275777101516724D, 0.8280438184738159D, 0.828515350818634D, 0.8289567232131958D, 0.8294112086296082D, 0.8298828601837158D, 0.8303140997886658D, 0.8307706713676453D, 0.83122318983078D, 0.8316763639450073D, 0.8321682214736938D, 0.8326238393783569D, 0.8331080675125122D, 0.8335604071617126D, 0.8340092301368713D, 0.834452748298645D, 0.8349207639694214D, 0.8353868722915649D, 0.835853636264801D, 0.8363184332847595D, 0.8368146419525146D, 0.8372671604156494D, 0.8377043008804321D, 0.8381913900375366D, 0.8386459946632385D, 0.8391138911247253D, 0.8395722508430481D, 0.8400129675865173D, 0.8404837250709534D, 0.8409408330917358D, 0.8414034247398376D, 0.8418894410133362D, 0.8423717021942139D, 0.842841625213623D, 0.8433132171630859D, 0.8437666296958923D, 0.8442238569259644D, 0.8446865677833557D, 0.8451375961303711D, 0.8456094861030579D, 0.84608393907547D, 0.8465566635131836D, 0.8470044732093811D, 0.8474630117416382D, 0.8479244112968445D, 0.8483870625495911D, 0.8488436341285706D, 0.8492886424064636D, 0.8497526049613953D, 0.8502447009086609D, 0.8507117629051208D, 0.8511672616004944D, 0.8516263961791992D, 0.8520602583885193D, 0.8525027632713318D, 0.852948784828186D, 0.8534206748008728D, 0.8538854718208313D, 0.8543459177017212D, 0.8548005819320679D, 0.8552507162094116D, 0.8557122349739075D, 0.856152355670929D, 0.8566517233848572D, 0.8570873141288757D, 0.8575365543365479D, 0.857970654964447D, 0.8584120273590088D, 0.858855664730072D, 0.8592962622642517D, 0.8597331047058105D, 0.8601778149604797D, 0.8606115579605103D, 0.8610638380050659D, 0.8615244626998901D, 0.861991286277771D, 0.8624619841575623D, 0.862913191318512D, 0.8633754849433899D, 0.8638368844985962D, 0.8642979860305786D, 0.8647482395172119D, 0.8652056455612183D, 0.8656649589538574D, 0.866115927696228D, 0.8665704131126404D, 0.8670414090156555D, 0.8674944639205933D, 0.8679722547531128D, 0.8684281706809998D, 0.8689029216766357D, 0.86937415599823D, 0.8698508143424988D, 0.870283842086792D, 0.8707519769668579D, 0.8712092041969299D, 0.8716691732406616D, 0.8721535801887512D, 0.8726065158843994D, 0.8730449676513672D, 0.8734990954399109D, 0.8739246726036072D, 0.874381422996521D, 0.8748207092285156D, 0.875253438949585D, 0.875724196434021D, 0.876218318939209D, 0.8766701817512512D, 0.8771216869354248D, 0.8775990009307861D, 0.8780642747879028D, 0.8785414099693298D, 0.8790207505226135D, 0.8794875144958496D, 0.8799788355827332D, 0.880420446395874D, 0.880905270576477D, 0.881375253200531D, 0.8818048238754272D, 0.8822588920593262D, 0.8827162384986877D, 0.8831582069396973D, 0.8836075663566589D, 0.8840537667274475D, 0.8845331072807312D, 0.8850046992301941D, 0.8854608535766602D, 0.8858955502510071D, 0.8863389492034912D, 0.8867753744125366D, 0.8872137069702148D, 0.887676477432251D, 0.8881357908248901D, 0.8885685205459595D, 0.889004111289978D, 0.8894510865211487D, 0.8899015784263611D, 0.8903590440750122D, 0.890826940536499D, 0.8913052082061768D, 0.8918041586875916D, 0.8922762870788574D, 0.8927425742149353D, 0.8931938409805298D, 0.8936666250228882D, 0.894100546836853D, 0.894587516784668D, 0.8950610756874084D, 0.8955479264259338D, 0.8960167765617371D, 0.8965259790420532D, 0.896999716758728D, 0.8974786400794983D, 0.8979550004005432D, 0.8984525203704834D, 0.8989295959472656D, 0.8994243144989014D, 0.899922251701355D, 0.9004544615745544D, 0.900951087474823D, 0.9014334678649902D, 0.9019694924354553D, 0.9024796485900879D, 0.9030163288116455D, 0.9035549163818359D, 0.9041017293930054D, 0.9046435356140137D, 0.9052310585975647D, 0.905797004699707D, 0.9064053893089294D, 0.9070045351982117D, 0.9076210260391235D, 0.9082058668136597D, 0.908807635307312D, 0.9094119071960449D, 0.9100490212440491D, 0.9107301831245422D, 0.9113752245903015D, 0.9120429754257202D, 0.912749707698822D, 0.9134305119514465D, 0.9141203165054321D, 0.9147968888282776D, 0.9155049920082092D, 0.9162451028823853D, 0.9169884324073792D, 0.9177526235580444D, 0.9185255765914917D, 0.9192798137664795D, 0.9200562834739685D, 0.9208371639251709D, 0.9216248989105225D, 0.9224410653114319D, 0.9232978820800781D, 0.9241725206375122D, 0.9250988960266113D, 0.9260335564613342D, 0.9269416928291321D, 0.9278931617736816D, 0.9288076758384705D, 0.9297255873680115D, 0.9306380152702332D, 0.9316264986991882D, 0.9326559901237488D, 0.9336634874343872D, 0.9347042441368103D, 0.9357998967170715D, 0.9368151426315308D, 0.9378435015678406D, 0.9390134215354919D, 0.9402108788490295D, 0.9414093494415283D, 0.9425628185272217D, 0.9438204169273376D, 0.9450675249099731D, 0.9462559223175049D, 0.9474560022354126D, 0.9487866759300232D, 0.9501336812973022D, 0.9516785144805908D, 0.9532408714294434D, 0.9547208547592163D, 0.9561983942985535D, 0.9577432870864868D, 0.9593563675880432D, 0.9611396789550781D, 0.9630594849586487D, 0.9652234315872192D, 0.9678966403007507D, 0.9710233807563782D, 0.9745553135871887D, 0.9781689047813416D, 0.981545090675354D, 0.9869863986968994D, 0.9941355586051941D, 0.9998435378074646D}; + /** + * Normalize a double d to a value from zero to num.
+ * This assumes that the value d was generated by a FastNoiseLite instance using SimplexFractal noise type with 4 Octaves. + * + * @param d The value to be normalized. + * @param num The maximum value. + * @return The normalized value. + */ + public static int normalize(double d, int num, int octaves) { + int start = 0; + double[] normalMap; + switch(octaves) { + case 1: + normalMap = normalMap1; + break; + case 4: + normalMap = normalMap4; + break; + default: throw new IllegalArgumentException("Illegal octave amount: " + octaves); + } + + int end = normalMap.length - 1; + while(start + 1 < end) { + int mid = start + (end - start) / 2; + if(normalMap[mid] <= d) { + start = mid; + } else { + end = mid; + } + } + double left = FastMath.abs(normalMap[start] - d); + double right = FastMath.abs(normalMap[end] - d); + if(left <= right) { + return start * (num) / (normalMap.length); + } + return end * (num) / (normalMap.length); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/command/Command.java b/src/main/java/com/dfsek/terra/api/gaea/command/Command.java new file mode 100644 index 000000000..b9d831fd3 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/command/Command.java @@ -0,0 +1,111 @@ +package com.dfsek.terra.api.gaea.command; + +import com.dfsek.terra.api.gaea.GaeaPlugin; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Represents a command or subcommand, can be nested via getSubCommands. + */ +public abstract class Command implements CommandExecutor, TabCompleter { + private final GaeaPlugin main; + public Command(GaeaPlugin main) { + this.main = main; + } + public Command(com.dfsek.terra.api.gaea.command.Command parent) { + main = parent.getMain(); + } + + public GaeaPlugin getMain() { + return main; + } + + /** + * Gets the name of the command/subcommand + * @return Name of command + */ + public abstract String getName(); + + /** + * Gets a list of subcommands + * @return List of subcommands + */ + public abstract List getSubCommands(); + + /** + * Executes the given command, returning its success. + *
+ * If false is returned, then the "usage" plugin.yml entry for this command + * (if defined) will be sent to the player. + * + * @param sender Source of the command + * @param command Command which was executed + * @param label Alias of the command which was used + * @param args Passed command arguments + * @return true if a valid command, otherwise false + */ + + public abstract boolean execute(@NotNull CommandSender sender, @NotNull org.bukkit.command.Command command, @NotNull String label, @NotNull String[] args); + /** + * Gets the number of arguments + * @return Number of arguments + */ + public abstract int arguments(); + + /** + * Executes the given command, invoking subcommands if applicable and returning its success. + *
+ * If false is returned, then the "usage" plugin.yml entry for this command + * (if defined) will be sent to the player. + * + * @param sender Source of the command + * @param command Command which was executed + * @param label Alias of the command which was used + * @param args Passed command arguments + * @return true if a valid command, otherwise false + */ + @Override + public final boolean onCommand(@NotNull CommandSender sender, @NotNull org.bukkit.command.Command command, @NotNull String label, @NotNull String[] args) { + if(this instanceof DebugCommand && ! main.isDebug()) { + main.getLanguage().send("command.debug-only", sender); + return true; + } + if(args.length > 0) { + for(com.dfsek.terra.api.gaea.command.Command c : getSubCommands()) { + if(c.getName().equals(args[0])) { + return c.onCommand(sender, command, label, Arrays.stream(args, 1, args.length).toArray(String[]::new)); + } + } + if(args.length != arguments()) { + main.getLanguage().send("command.invalid", sender, String.valueOf(arguments()), String.valueOf(args.length)); + return true; + } + return execute(sender, command, label, args); + } + if(args.length != arguments()) { + main.getLanguage().send("command.invalid", sender, String.valueOf(arguments()), String.valueOf(args.length)); + return true; + } + return execute(sender, command, label, new String[] {}); + } + + public abstract List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args); + + @Override + public final @Nullable List onTabComplete(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String alias, @NotNull String[] args) { + List complete = new ArrayList<>(); + if(args.length > 0) for(com.dfsek.terra.api.gaea.command.Command c : getSubCommands()) { + if(c.getName().startsWith(args[0])) complete.add(c.getName()); + if(c.getName().equals(args[0])) return c.onTabComplete(sender, command, alias, Arrays.stream(args, 1, args.length).toArray(String[]::new)); + } + complete.addAll(getTabCompletions(sender, alias, args)); + return complete; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/command/DebugCommand.java b/src/main/java/com/dfsek/terra/api/gaea/command/DebugCommand.java new file mode 100644 index 000000000..5364a3cff --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/command/DebugCommand.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.api.gaea.command; + +/** + * Implementing this interface marks a command as debug-only. + * If a parent command implements this interface, all child commands will be considered debug commands, regardless of whether they implement DebugCommand as well. + */ +public interface DebugCommand { +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/command/PlayerCommand.java b/src/main/java/com/dfsek/terra/api/gaea/command/PlayerCommand.java new file mode 100644 index 000000000..608f46725 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/command/PlayerCommand.java @@ -0,0 +1,49 @@ +package com.dfsek.terra.api.gaea.command; + +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +/** + * A command that may only be executed by a player. If executor is not a player, a message will be displayed and no action will be performed. + */ +public abstract class PlayerCommand extends Command { + public PlayerCommand(Command parent) { + super(parent); + } + + /** + * Executes the given command, returning its success. + *
+ * If false is returned, then the "usage" plugin.yml entry for this command + * (if defined) will be sent to the player. + * + * @param sender Source of the command + * @param command Command which was executed + * @param label Alias of the command which was used + * @param args Passed command arguments + * @return true if a valid command, otherwise false + */ + @Override + public final boolean execute(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(!(sender instanceof Player)) { + getMain().getLanguage().send("command.players-only", sender); + return true; + } + Player p = (Player) sender; + return execute(p, command, label, args); + } + /** + * Executes the given command, returning its success. + *
+ * If false is returned, then the "usage" plugin.yml entry for this command + * (if defined) will be sent to the player. + * + * @param sender Player that executed command + * @param command Command which was executed + * @param label Alias of the command which was used + * @param args Passed command arguments + * @return true if a valid command, otherwise false + */ + public abstract boolean execute(@NotNull Player sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args); +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/command/WorldCommand.java b/src/main/java/com/dfsek/terra/api/gaea/command/WorldCommand.java new file mode 100644 index 000000000..2d3548c76 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/command/WorldCommand.java @@ -0,0 +1,54 @@ +package com.dfsek.terra.api.gaea.command; + +import com.dfsek.terra.api.gaea.generation.GaeaChunkGenerator; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +/** + * A command that must be executed by a player, in a Terra world. + */ +public abstract class WorldCommand extends PlayerCommand { + public WorldCommand(com.dfsek.terra.api.gaea.command.Command parent) { + super(parent); + } + + /** + * Executes the given command, returning its success. + *
+ * If false is returned, then the "usage" plugin.yml entry for this command + * (if defined) will be sent to the player. + * + * @param sender Source of the command + * @param command Command which was executed + * @param label Alias of the command which was used + * @param args Passed command arguments + * @return true if a valid command, otherwise false + */ + @Override + public final boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + Class clazz = getMain().getGeneratorClass(); + if(clazz.isInstance(sender.getWorld().getGenerator())) { + return execute(sender, command, label, args, sender.getWorld()); + } else { + getMain().getLanguage().send("command.world", sender); + } + return true; + } + + /** + * Executes the given command, returning its success. + *
+ * If false is returned, then the "usage" plugin.yml entry for this command + * (if defined) will be sent to the player. + * + * @param sender Player that executed command + * @param command Command which was executed + * @param label Alias of the command which was used + * @param args Passed command arguments + * @param world World in which command was executed + * @return true if a valid command, otherwise false + */ + public abstract boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world); +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/generation/GaeaChunkGenerator.java b/src/main/java/com/dfsek/terra/api/gaea/generation/GaeaChunkGenerator.java new file mode 100644 index 000000000..99edab779 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/generation/GaeaChunkGenerator.java @@ -0,0 +1,86 @@ +package com.dfsek.terra.api.gaea.generation; + +import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.gaea.math.ChunkInterpolator; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.profiler.ProfileFuture; +import com.dfsek.terra.api.gaea.profiler.WorldProfiler; +import org.bukkit.World; +import org.bukkit.generator.ChunkGenerator; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Random; + +public abstract class GaeaChunkGenerator extends ChunkGenerator { + private final ChunkInterpolator.InterpolationType interpolationType; + private FastNoiseLite gen; + private WorldProfiler profiler; + + public GaeaChunkGenerator(ChunkInterpolator.InterpolationType type) { + interpolationType = type; + } + + @Override + public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome) { + try(ProfileFuture ignore = measure("TotalChunkGenTime")) { + if(gen == null) { + gen = new FastNoiseLite((int) world.getSeed()); + gen.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); + gen.setFractalType(FastNoiseLite.FractalType.FBm); + gen.setFractalOctaves(getNoiseOctaves(world)); + gen.setFrequency(getNoiseFrequency(world)); + } + ChunkData chunk; + ChunkInterpolator interp; + try(ProfileFuture ignored = measure("ChunkBaseGenTime")) { + interp = interpolationType.getInstance(world, chunkX, chunkZ, this.getBiomeGrid(world), gen); + chunk = generateBase(world, random, chunkX, chunkZ, interp); + } + try(ProfileFuture ignored = measure("BiomeApplyTime")) { + com.dfsek.terra.api.gaea.biome.BiomeGrid grid = getBiomeGrid(world); + int xOrig = (chunkX << 4); + int zOrig = (chunkZ << 4); + for(byte x = 0; x < 4; x++) { + for(byte z = 0; z < 4; z++) { + int cx = xOrig + (x << 2); + int cz = zOrig + (z << 2); + Biome b = grid.getBiome(cx, cz, GenerationPhase.PALETTE_APPLY); + biome.setBiome(x << 2, z << 2, b.getVanillaBiome()); + } + } + } + for(GenerationPopulator g : getGenerationPopulators(world)) { + g.populate(world, chunk, random, chunkX, chunkZ, interp); + } + return chunk; + } + } + + public void attachProfiler(WorldProfiler p) { + this.profiler = p; + } + + public WorldProfiler getProfiler() { + return profiler; + } + + private ProfileFuture measure(String id) { + if(profiler != null) return profiler.measure(id); + return null; + } + + public abstract ChunkData generateBase(@NotNull World world, @NotNull Random random, int x, int z, ChunkInterpolator noise); + + public abstract int getNoiseOctaves(World w); + + public abstract double getNoiseFrequency(World w); + + public abstract List getGenerationPopulators(World w); + + public abstract com.dfsek.terra.api.gaea.biome.BiomeGrid getBiomeGrid(World w); + + public FastNoiseLite getNoiseGenerator() { + return gen; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPhase.java b/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPhase.java new file mode 100644 index 000000000..9ccfe22c1 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPhase.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.api.gaea.generation; + +/** + * The phase of terrain generation. Used for modifying values based on the phase of generation. + */ +public enum GenerationPhase { + BASE, POPULATE, GENERATION_POPULATE, PALETTE_APPLY, POST_GEN +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPopulator.java b/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPopulator.java new file mode 100644 index 000000000..76cab5215 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPopulator.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.gaea.generation; + +import com.dfsek.terra.api.gaea.math.ChunkInterpolator; +import org.bukkit.World; +import org.bukkit.generator.ChunkGenerator; + +import java.util.Random; + +public abstract class GenerationPopulator { + public abstract void populate(World world, ChunkGenerator.ChunkData chunk, Random r, int chunkX, int chunkZ, ChunkInterpolator interp); +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java b/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java new file mode 100644 index 000000000..8b977f65f --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.api.gaea.lang; + +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.InvalidConfigurationException; +import org.bukkit.configuration.file.YamlConfiguration; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class Language extends YamlConfiguration { + public Language(File file) throws IOException, InvalidConfigurationException { + load(file); + } + @Override + public void load(@NotNull File file) throws IOException, InvalidConfigurationException { + super.load(file); + } + @SuppressWarnings("unchecked") + public Message getMessage(String id) { + Object m = get(id); + Message temp; + if(m instanceof List) { + temp = new MultiLineMessage((List) m); + } else if(m instanceof String) { + temp = new SingleLineMessage((String) m); + } else return new SingleLineMessage("message:" + id + ":translation_undefined"); + if(temp.isEmpty()) return new SingleLineMessage("message:" + id + ":translation_undefined"); + return temp; + } + public void log(String messageID, Level level, Logger logger, String... args) { + getMessage(messageID).log(logger, level, args); + } + public void send(String messageID, CommandSender sender, String... args) { + getMessage(messageID).send(sender, args); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java b/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java new file mode 100644 index 000000000..e3b3ab66b --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.api.gaea.lang; + +import org.bukkit.command.CommandSender; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public interface Message { + void log(Logger logger, Level level, String... args); + void send(CommandSender sender, String... args); + boolean isEmpty(); +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java b/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java new file mode 100644 index 000000000..db7795cb5 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.api.gaea.lang; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import java.util.Arrays; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class MultiLineMessage implements Message { + private final List message; + public MultiLineMessage(List message) { + this.message = message; + } + @Override + public void log(Logger logger, Level level, String... args) { + for(String line: message) { + logger.log(level, ChatColor.translateAlternateColorCodes('&', String.format(line, Arrays.asList(args).toArray()))); + } + } + + @Override + public void send(CommandSender sender, String... args) { + for(String line: message) { + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', String.format(line, Arrays.asList(args).toArray()))); + } + } + + @Override + public boolean isEmpty() { + return message == null || message.isEmpty(); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java b/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java new file mode 100644 index 000000000..fdee35f8d --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.api.gaea.lang; + +import org.bukkit.ChatColor; +import org.bukkit.command.CommandSender; + +import java.util.Arrays; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class SingleLineMessage implements Message { + private final String message; + public SingleLineMessage(String message) { + this.message = message; + } + @Override + public void log(Logger logger, Level level, String... args) { + logger.log(level, ChatColor.translateAlternateColorCodes('&', String.format(message, Arrays.asList(args).toArray()))); + } + + @Override + public void send(CommandSender sender, String... args) { + sender.sendMessage(ChatColor.translateAlternateColorCodes('&', String.format(message, Arrays.asList(args).toArray()))); + } + + @Override + public boolean isEmpty() { + return message == null || message.equals(""); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator.java b/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator.java new file mode 100644 index 000000000..9f8b34a46 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.api.gaea.math; + +import com.dfsek.terra.api.gaea.biome.BiomeGrid; +import org.bukkit.World; + +public interface ChunkInterpolator { + double getNoise(double x, double z); + + double getNoise(double x, double y, double z); + + enum InterpolationType { + /** + * 2D (Bilinear) interpolation + */ + BILINEAR { + @Override + public com.dfsek.terra.api.gaea.math.ChunkInterpolator getInstance(World w, int chunkX, int chunkZ, BiomeGrid grid, FastNoiseLite noise) { + return new ChunkInterpolator2(w, chunkX, chunkZ, grid, noise); + } + }, + /** + * 3D (Trilinear) interpolation + */ + TRILINEAR { + @Override + public com.dfsek.terra.api.gaea.math.ChunkInterpolator getInstance(World w, int chunkX, int chunkZ, BiomeGrid grid, FastNoiseLite noise) { + return new ChunkInterpolator3(w, chunkX, chunkZ, grid, noise); + } + }; + public abstract com.dfsek.terra.api.gaea.math.ChunkInterpolator getInstance(World w, int chunkX, int chunkZ, BiomeGrid grid, FastNoiseLite noise); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator2.java b/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator2.java new file mode 100644 index 000000000..9191eadd0 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator2.java @@ -0,0 +1,72 @@ +package com.dfsek.terra.api.gaea.math; + +import com.dfsek.terra.api.gaea.biome.BiomeGrid; +import com.dfsek.terra.api.gaea.biome.Generator; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import org.bukkit.World; + +/** + * Class to abstract away the 16 Interpolators needed to generate a chunk.
+ * Contains method to get interpolated noise at a coordinate within the chunk. + */ +public class ChunkInterpolator2 implements ChunkInterpolator { + private final Interpolator[][] interpGrid = new Interpolator[4][4]; + + private final int xOrigin; + private final int zOrigin; + private final FastNoiseLite noise; + private final World w; + + /** + * Instantiates a ChunkInterpolator at a pair of chunk coordinates, with a BiomeGrid and FastNoiseLite instance. + * + * @param chunkX X coordinate of the chunk. + * @param chunkZ Z coordinate of the chunk. + * @param grid BiomeGrid to use for noise fetching. + * @param noise FastNoiseLite instance to use. + */ + public ChunkInterpolator2(World w, int chunkX, int chunkZ, BiomeGrid grid, FastNoiseLite noise) { + this.xOrigin = chunkX << 4; + this.zOrigin = chunkZ << 4; + this.noise = noise; + this.w = w; + Generator[][] gridTemp = new Generator[8][8]; + for(int x = - 2; x < 6; x++) { + for(int z = - 2; z < 6; z++) { + gridTemp[x + 2][z + 2] = grid.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), GenerationPhase.BASE).getGenerator(); + } + } + for(byte x = 0; x < 4; x++) { + for(byte z = 0; z < 4; z++) { + interpGrid[x][z] = new Interpolator(biomeAvg(x, z, gridTemp), + biomeAvg(x + 1, z, gridTemp), + biomeAvg(x, z + 1, gridTemp), + biomeAvg(x + 1, z + 1, gridTemp), gridTemp[x+1][z+1].getInterpolationType()); + } + } + } + + private double biomeAvg(int x, int z, Generator[][] g) { + return (g[x + 3][z + 2].getNoise(noise, w, (x << 2) + xOrigin, (z << 2) + zOrigin) + + g[x + 1][z + 2].getNoise(noise, w, (x << 2) + xOrigin, (z << 2) + zOrigin) + + g[x + 2][z + 3].getNoise(noise, w, (x << 2) + xOrigin, (z << 2) + zOrigin) + + g[x + 2][z + 1].getNoise(noise, w, (x << 2) + xOrigin, (z << 2) + zOrigin)) / 4D; + } + + /** + * Gets the noise at a pair of internal chunk coordinates. + * + * @param x The internal X coordinate (0-15). + * @param z The internal Z coordinate (0-15). + * @return double - The interpolated noise at the coordinates. + */ + @Override + public double getNoise(double x, double z) { + return interpGrid[((int) x) / 4][((int) z) / 4].bilerp((x % 4) / 4, (z % 4) / 4); + } + + @Override + public double getNoise(double x, double y, double z) { + return getNoise(x, z); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java b/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java new file mode 100644 index 000000000..9bd1d06cf --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java @@ -0,0 +1,137 @@ +package com.dfsek.terra.api.gaea.math; + +import com.dfsek.terra.api.gaea.biome.BiomeGrid; +import com.dfsek.terra.api.gaea.biome.Generator; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import net.jafama.FastMath; +import org.bukkit.World; + +/** + * Class to abstract away the 16 Interpolators needed to generate a chunk.
+ * Contains method to get interpolated noise at a coordinate within the chunk. + */ +public class ChunkInterpolator3 implements ChunkInterpolator { + private final Interpolator3[][][] interpGrid = new Interpolator3[4][64][4]; + private final Generator[][] gens = new Generator[7][7]; + private final boolean[][] needsBiomeInterp = new boolean[5][5]; + private final double[][][] noiseStorage = new double[7][7][65]; + private final FastNoiseLite noise; + private final int xOrigin; + private final int zOrigin; + private final World w; + + /** + * Instantiates a 3D ChunkInterpolator at a pair of chunk coordinates, with a BiomeGrid and FastNoiseLite instance. + * + * @param chunkX X coordinate of the chunk. + * @param chunkZ Z coordinate of the chunk. + * @param grid BiomeGrid to use for noise fetching. + * @param noise FastNoiseLite instance to use. + */ + public ChunkInterpolator3(World w, int chunkX, int chunkZ, BiomeGrid grid, FastNoiseLite noise) { + this.xOrigin = chunkX << 4; + this.zOrigin = chunkZ << 4; + this.noise = noise; + this.w = w; + + + for(int x = - 1; x < 6; x++) { + for(int z = - 1; z < 6; z++) { + gens[x + 1][z + 1] = grid.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), GenerationPhase.BASE).getGenerator(); + } + } + for(int x = 0; x < 5; x++) { + for(int z = 0; z < 5; z++) { + needsBiomeInterp[x][z] = compareGens(x+1, z+1); + } + } + + storeNoise(); + + for(byte x = 0; x < 4; x++) { + for(byte z = 0; z < 4; z++) { + for(int y = 0; y < 64; y++) { + interpGrid[x][y][z] = new Interpolator3( + biomeAvg(x, y, z), + biomeAvg(x + 1, y, z), + biomeAvg(x, y + 1, z), + biomeAvg(x + 1, y + 1, z), + biomeAvg(x, y, z + 1), + biomeAvg(x + 1, y, z + 1), + biomeAvg(x, y + 1, z + 1), + biomeAvg(x + 1, y + 1, z + 1), gens[x+1][z+1].getInterpolationType()); + } + } + } + } + + private boolean compareGens(int x, int z) { + Generator comp = gens[x][z]; + if(!comp.equals(gens[x+1][z])) return true; + + if(!comp.equals(gens[x][z+1])) return true; + + if(!comp.equals(gens[x-1][z])) return true; + + if(!comp.equals(gens[x][z-1])) return true; + + if(!comp.equals(gens[x+1][z+1])) return true; + + if(!comp.equals(gens[x-1][z-1])) return true; + + if(!comp.equals(gens[x+1][z-1])) return true; + + return !comp.equals(gens[x - 1][z + 1]); + } + private void storeNoise() { + for(byte x = - 1; x < 6; x++) { + for(byte z = - 1; z < 6; z++) { + for(int y = 0; y < 64; y++) { + noiseStorage[x + 1][z + 1][y] = gens[x + 1][z + 1].getNoise(noise, w, (x << 2) + xOrigin, y << 2, (z << 2) + zOrigin); + } + } + } + } + + private double biomeAvg(int x, int y, int z) { + if(needsBiomeInterp[x][z]) return (noiseStorage[x + 2][z + 1][y] + + noiseStorage[x][z + 1][y] + + noiseStorage[x + 1][z + 2][y] + + noiseStorage[x + 1][z][y] + + noiseStorage[x][z][y] + + noiseStorage[x + 2][z + 2][y] + + noiseStorage[x + 2][z][y] + + noiseStorage[x][z + 2][y] + + noiseStorage[x + 1][z + 1][y] + ) / 9D; + else { + if(gens[x+1][z+1].useMinimalInterpolation()) return noiseStorage[x+1][z+1][y]; + else return (noiseStorage[x + 2][z + 1][y] + + noiseStorage[x][z + 1][y] + + noiseStorage[x + 1][z + 2][y] + + noiseStorage[x + 1][z][y] + + noiseStorage[x+1][z+1][y]) / 5D; + } + } + + @Override + public double getNoise(double x, double z) { + return getNoise(x, 0, z); + } + + /** + * Gets the noise at a pair of internal chunk coordinates. + * + * @param x The internal X coordinate (0-15). + * @param z The internal Z coordinate (0-15). + * @return double - The interpolated noise at the coordinates. + */ + @Override + public double getNoise(double x, double y, double z) { + return interpGrid[reRange(((int) x) / 4, 3)][reRange(((int) y) / 4, 63)][reRange(((int) z) / 4, 3)].trilerp((x % 4) / 4, (y % 4) / 4, (z % 4) / 4); + } + + private static int reRange(int value, int high) { + return FastMath.max(FastMath.min(value, high), 0); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/FastNoiseLite.java b/src/main/java/com/dfsek/terra/api/gaea/math/FastNoiseLite.java new file mode 100644 index 000000000..9f82bee2d --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/math/FastNoiseLite.java @@ -0,0 +1,2599 @@ +package com.dfsek.terra.api.gaea.math;// MIT License + +import net.jafama.FastMath; + +/* + +Copyright(c) 2020 Jordan Peck (jordan.me2@gmail.com) +Copyright(c) 2020 Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files(the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and / or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions : + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +.'',;:cldxkO00KKXXNNWWWNNXKOkxdollcc::::::;:::ccllloooolllllllllooollc:,'... ...........',;cldxkO000Okxdlc::;;;,,;;;::cclllllll +..',;:ldxO0KXXNNNNNNNNXXK0kxdolcc::::::;;;,,,,,,;;;;;;;;;;:::cclllllc:;'.... ...........',;:ldxO0KXXXK0Okxdolc::;;;;::cllodddddo +...',:loxO0KXNNNNNXXKK0Okxdolc::;::::::::;;;,,'''''.....''',;:clllllc:;,'............''''''''',;:loxO0KXNNNNNXK0Okxdollccccllodxxxxxxd +....';:ldkO0KXXXKK00Okxdolcc:;;;;;::cclllcc:;;,''..... ....',;clooddolcc:;;;;,,;;;;;::::;;;;;;:cloxk0KXNWWWWWWNXKK0Okxddoooddxxkkkkkxx +.....';:ldxkOOOOOkxxdolcc:;;;,,,;;:cllooooolcc:;'... ..,:codxkkkxddooollloooooooollcc:::::clodkO0KXNWWWWWWNNXK00Okxxxxxxxxkkkkxxx +. ....';:cloddddo___________,,,,;;:clooddddoolc:,... ..,:ldx__00OOOkkk___kkkkkkxxdollc::::cclodkO0KXXNNNNNNXXK0OOkxxxxxxxxxxxxddd +.......',;:cccc:| |,,,;;:cclooddddoll:;'.. ..';cox| \KKK000| |KK00OOkxdocc___;::clldxxkO0KKKKK00Okkxdddddddddddddddoo +.......'',,,,,''| ________|',,;;::cclloooooolc:;'......___:ldk| \KK000| |XKKK0Okxolc| |;;::cclodxxkkkkxxdoolllcclllooodddooooo +''......''''....| | ....'',,,,;;;::cclloooollc:;,''.'| |oxk| \OOO0| |KKK00Oxdoll|___|;;;;;::ccllllllcc::;;,,;;;:cclloooooooo +;;,''.......... | |_____',,;;;____:___cllo________.___| |___| \xkk| |KK_______ool___:::;________;;;_______...'',;;:ccclllloo +c:;,''......... | |:::/ ' |lo/ | | \dx| |0/ \d| |cc/ |'/ \......',,;;:ccllo +ol:;,'..........| _____|ll/ __ |o/ ______|____ ___| | \o| |/ ___ \| |o/ ______|/ ___ \ .......'',;:clo +dlc;,...........| |::clooo| / | |x\___ \KXKKK0| |dol| |\ \| | | | | |d\___ \..| | / / ....',:cl +xoc;'... .....'| |llodddd| \__| |_____\ \KKK0O| |lc:| |'\ | |___| | |_____\ \.| |_/___/... ...',;:c +dlc;'... ....',;| |oddddddo\ | |Okkx| |::;| |..\ |\ /| | | \ |... ....',;:c +ol:,'.......',:c|___|xxxddollc\_____,___|_________/ddoll|___|,,,|___|...\_____|:\ ______/l|___|_________/...\________|'........',;::cc +c:;'.......';:codxxkkkkxxolc::;::clodxkOO0OOkkxdollc::;;,,''''',,,,''''''''''',,'''''',;:loxkkOOkxol:;,'''',,;:ccllcc:;,'''''',;::ccll +;,'.......',:codxkOO0OOkxdlc:;,,;;:cldxxkkxxdolc:;;,,''.....'',;;:::;;,,,'''''........,;cldkO0KK0Okdoc::;;::cloodddoolc:;;;;;::ccllooo +.........',;:lodxOO0000Okdoc:,,',,;:clloddoolc:;,''.......'',;:clooollc:;;,,''.......',:ldkOKXNNXX0Oxdolllloddxxxxxxdolccccccllooodddd +. .....';:cldxkO0000Okxol:;,''',,;::cccc:;,,'.......'',;:cldxxkkxxdolc:;;,'.......';coxOKXNWWWNXKOkxddddxxkkkkkkxdoollllooddxxxxkkk + ....',;:codxkO000OOxdoc:;,''',,,;;;;,''.......',,;:clodkO00000Okxolc::;,,''..',;:ldxOKXNWWWNNK0OkkkkkkkkkkkxxddooooodxxkOOOOO000 + ....',;;clodxkkOOOkkdolc:;,,,,,,,,'..........,;:clodxkO0KKXKK0Okxdolcc::;;,,,;;:codkO0XXNNNNXKK0OOOOOkkkkxxdoollloodxkO0KKKXXXXX + +VERSION: 1.0.1 +https://github.com/Auburn/FastNoise +*/ +/* +To switch between using doubles or doubles for input position, +perform a file-wide replace on the following strings (including / * FNLdouble * /) +/ *FNLdouble* / double +/ *FNLdouble* / double + +*/ +public class FastNoiseLite { + private static final double[] Gradients2D = { + 0.130526192220052f, 0.99144486137381f, 0.38268343236509f, 0.923879532511287f, 0.608761429008721f, 0.793353340291235f, + 0.793353340291235f, 0.608761429008721f, 0.923879532511287f, 0.38268343236509f, 0.99144486137381f, 0.130526192220051f, + 0.99144486137381f, -0.130526192220051f, 0.923879532511287f, -0.38268343236509f, 0.793353340291235f, -0.60876142900872f, + 0.608761429008721f, -0.793353340291235f, 0.38268343236509f, -0.923879532511287f, 0.130526192220052f, -0.99144486137381f, + -0.130526192220052f, -0.99144486137381f, -0.38268343236509f, -0.923879532511287f, -0.608761429008721f, -0.793353340291235f, + -0.793353340291235f, -0.608761429008721f, -0.923879532511287f, -0.38268343236509f, -0.99144486137381f, -0.130526192220052f, + -0.99144486137381f, 0.130526192220051f, -0.923879532511287f, 0.38268343236509f, -0.793353340291235f, 0.608761429008721f, + -0.608761429008721f, 0.793353340291235f, -0.38268343236509f, 0.923879532511287f, -0.130526192220052f, 0.99144486137381f, + 0.130526192220052f, 0.99144486137381f, 0.38268343236509f, 0.923879532511287f, 0.608761429008721f, 0.793353340291235f, + 0.793353340291235f, 0.608761429008721f, 0.923879532511287f, 0.38268343236509f, 0.99144486137381f, 0.130526192220051f, + 0.99144486137381f, -0.130526192220051f, 0.923879532511287f, -0.38268343236509f, 0.793353340291235f, -0.60876142900872f, + 0.608761429008721f, -0.793353340291235f, 0.38268343236509f, -0.923879532511287f, 0.130526192220052f, -0.99144486137381f, + -0.130526192220052f, -0.99144486137381f, -0.38268343236509f, -0.923879532511287f, -0.608761429008721f, -0.793353340291235f, + -0.793353340291235f, -0.608761429008721f, -0.923879532511287f, -0.38268343236509f, -0.99144486137381f, -0.130526192220052f, + -0.99144486137381f, 0.130526192220051f, -0.923879532511287f, 0.38268343236509f, -0.793353340291235f, 0.608761429008721f, + -0.608761429008721f, 0.793353340291235f, -0.38268343236509f, 0.923879532511287f, -0.130526192220052f, 0.99144486137381f, + 0.130526192220052f, 0.99144486137381f, 0.38268343236509f, 0.923879532511287f, 0.608761429008721f, 0.793353340291235f, + 0.793353340291235f, 0.608761429008721f, 0.923879532511287f, 0.38268343236509f, 0.99144486137381f, 0.130526192220051f, + 0.99144486137381f, -0.130526192220051f, 0.923879532511287f, -0.38268343236509f, 0.793353340291235f, -0.60876142900872f, + 0.608761429008721f, -0.793353340291235f, 0.38268343236509f, -0.923879532511287f, 0.130526192220052f, -0.99144486137381f, + -0.130526192220052f, -0.99144486137381f, -0.38268343236509f, -0.923879532511287f, -0.608761429008721f, -0.793353340291235f, + -0.793353340291235f, -0.608761429008721f, -0.923879532511287f, -0.38268343236509f, -0.99144486137381f, -0.130526192220052f, + -0.99144486137381f, 0.130526192220051f, -0.923879532511287f, 0.38268343236509f, -0.793353340291235f, 0.608761429008721f, + -0.608761429008721f, 0.793353340291235f, -0.38268343236509f, 0.923879532511287f, -0.130526192220052f, 0.99144486137381f, + 0.130526192220052f, 0.99144486137381f, 0.38268343236509f, 0.923879532511287f, 0.608761429008721f, 0.793353340291235f, + 0.793353340291235f, 0.608761429008721f, 0.923879532511287f, 0.38268343236509f, 0.99144486137381f, 0.130526192220051f, + 0.99144486137381f, -0.130526192220051f, 0.923879532511287f, -0.38268343236509f, 0.793353340291235f, -0.60876142900872f, + 0.608761429008721f, -0.793353340291235f, 0.38268343236509f, -0.923879532511287f, 0.130526192220052f, -0.99144486137381f, + -0.130526192220052f, -0.99144486137381f, -0.38268343236509f, -0.923879532511287f, -0.608761429008721f, -0.793353340291235f, + -0.793353340291235f, -0.608761429008721f, -0.923879532511287f, -0.38268343236509f, -0.99144486137381f, -0.130526192220052f, + -0.99144486137381f, 0.130526192220051f, -0.923879532511287f, 0.38268343236509f, -0.793353340291235f, 0.608761429008721f, + -0.608761429008721f, 0.793353340291235f, -0.38268343236509f, 0.923879532511287f, -0.130526192220052f, 0.99144486137381f, + 0.130526192220052f, 0.99144486137381f, 0.38268343236509f, 0.923879532511287f, 0.608761429008721f, 0.793353340291235f, + 0.793353340291235f, 0.608761429008721f, 0.923879532511287f, 0.38268343236509f, 0.99144486137381f, 0.130526192220051f, + 0.99144486137381f, -0.130526192220051f, 0.923879532511287f, -0.38268343236509f, 0.793353340291235f, -0.60876142900872f, + 0.608761429008721f, -0.793353340291235f, 0.38268343236509f, -0.923879532511287f, 0.130526192220052f, -0.99144486137381f, + -0.130526192220052f, -0.99144486137381f, -0.38268343236509f, -0.923879532511287f, -0.608761429008721f, -0.793353340291235f, + -0.793353340291235f, -0.608761429008721f, -0.923879532511287f, -0.38268343236509f, -0.99144486137381f, -0.130526192220052f, + -0.99144486137381f, 0.130526192220051f, -0.923879532511287f, 0.38268343236509f, -0.793353340291235f, 0.608761429008721f, + -0.608761429008721f, 0.793353340291235f, -0.38268343236509f, 0.923879532511287f, -0.130526192220052f, 0.99144486137381f, + 0.38268343236509f, 0.923879532511287f, 0.923879532511287f, 0.38268343236509f, 0.923879532511287f, -0.38268343236509f, + 0.38268343236509f, -0.923879532511287f, -0.38268343236509f, -0.923879532511287f, -0.923879532511287f, -0.38268343236509f, + -0.923879532511287f, 0.38268343236509f, -0.38268343236509f, 0.923879532511287f, + }; + + private static final double[] RandVecs2D = { + -0.2700222198f, -0.9628540911f, 0.3863092627f, -0.9223693152f, 0.04444859006f, -0.999011673f, -0.5992523158f, -0.8005602176f, + -0.7819280288f, 0.6233687174f, 0.9464672271f, 0.3227999196f, -0.6514146797f, -0.7587218957f, 0.9378472289f, 0.347048376f, + -0.8497875957f, -0.5271252623f, -0.879042592f, 0.4767432447f, -0.892300288f, -0.4514423508f, -0.379844434f, -0.9250503802f, + -0.9951650832f, 0.0982163789f, 0.7724397808f, -0.6350880136f, 0.7573283322f, -0.6530343002f, -0.9928004525f, -0.119780055f, + -0.0532665713f, 0.9985803285f, 0.9754253726f, -0.2203300762f, -0.7665018163f, 0.6422421394f, 0.991636706f, 0.1290606184f, + -0.994696838f, 0.1028503788f, -0.5379205513f, -0.84299554f, 0.5022815471f, -0.8647041387f, 0.4559821461f, -0.8899889226f, + -0.8659131224f, -0.5001944266f, 0.0879458407f, -0.9961252577f, -0.5051684983f, 0.8630207346f, 0.7753185226f, -0.6315704146f, + -0.6921944612f, 0.7217110418f, -0.5191659449f, -0.8546734591f, 0.8978622882f, -0.4402764035f, -0.1706774107f, 0.9853269617f, + -0.9353430106f, -0.3537420705f, -0.9992404798f, 0.03896746794f, -0.2882064021f, -0.9575683108f, -0.9663811329f, 0.2571137995f, + -0.8759714238f, -0.4823630009f, -0.8303123018f, -0.5572983775f, 0.05110133755f, -0.9986934731f, -0.8558373281f, -0.5172450752f, + 0.09887025282f, 0.9951003332f, 0.9189016087f, 0.3944867976f, -0.2439375892f, -0.9697909324f, -0.8121409387f, -0.5834613061f, + -0.9910431363f, 0.1335421355f, 0.8492423985f, -0.5280031709f, -0.9717838994f, -0.2358729591f, 0.9949457207f, 0.1004142068f, + 0.6241065508f, -0.7813392434f, 0.662910307f, 0.7486988212f, -0.7197418176f, 0.6942418282f, -0.8143370775f, -0.5803922158f, + 0.104521054f, -0.9945226741f, -0.1065926113f, -0.9943027784f, 0.445799684f, -0.8951327509f, 0.105547406f, 0.9944142724f, + -0.992790267f, 0.1198644477f, -0.8334366408f, 0.552615025f, 0.9115561563f, -0.4111755999f, 0.8285544909f, -0.5599084351f, + 0.7217097654f, -0.6921957921f, 0.4940492677f, -0.8694339084f, -0.3652321272f, -0.9309164803f, -0.9696606758f, 0.2444548501f, + 0.08925509731f, -0.996008799f, 0.5354071276f, -0.8445941083f, -0.1053576186f, 0.9944343981f, -0.9890284586f, 0.1477251101f, + 0.004856104961f, 0.9999882091f, 0.9885598478f, 0.1508291331f, 0.9286129562f, -0.3710498316f, -0.5832393863f, -0.8123003252f, + 0.3015207509f, 0.9534596146f, -0.9575110528f, 0.2883965738f, 0.9715802154f, -0.2367105511f, 0.229981792f, 0.9731949318f, + 0.955763816f, -0.2941352207f, 0.740956116f, 0.6715534485f, -0.9971513787f, -0.07542630764f, 0.6905710663f, -0.7232645452f, + -0.290713703f, -0.9568100872f, 0.5912777791f, -0.8064679708f, -0.9454592212f, -0.325740481f, 0.6664455681f, 0.74555369f, + 0.6236134912f, 0.7817328275f, 0.9126993851f, -0.4086316587f, -0.8191762011f, 0.5735419353f, -0.8812745759f, -0.4726046147f, + 0.9953313627f, 0.09651672651f, 0.9855650846f, -0.1692969699f, -0.8495980887f, 0.5274306472f, 0.6174853946f, -0.7865823463f, + 0.8508156371f, 0.52546432f, 0.9985032451f, -0.05469249926f, 0.1971371563f, -0.9803759185f, 0.6607855748f, -0.7505747292f, + -0.03097494063f, 0.9995201614f, -0.6731660801f, 0.739491331f, -0.7195018362f, -0.6944905383f, 0.9727511689f, 0.2318515979f, + 0.9997059088f, -0.0242506907f, 0.4421787429f, -0.8969269532f, 0.9981350961f, -0.061043673f, -0.9173660799f, -0.3980445648f, + -0.8150056635f, -0.5794529907f, -0.8789331304f, 0.4769450202f, 0.0158605829f, 0.999874213f, -0.8095464474f, 0.5870558317f, + -0.9165898907f, -0.3998286786f, -0.8023542565f, 0.5968480938f, -0.5176737917f, 0.8555780767f, -0.8154407307f, -0.5788405779f, + 0.4022010347f, -0.9155513791f, -0.9052556868f, -0.4248672045f, 0.7317445619f, 0.6815789728f, -0.5647632201f, -0.8252529947f, + -0.8403276335f, -0.5420788397f, -0.9314281527f, 0.363925262f, 0.5238198472f, 0.8518290719f, 0.7432803869f, -0.6689800195f, + -0.985371561f, -0.1704197369f, 0.4601468731f, 0.88784281f, 0.825855404f, 0.5638819483f, 0.6182366099f, 0.7859920446f, + 0.8331502863f, -0.553046653f, 0.1500307506f, 0.9886813308f, -0.662330369f, -0.7492119075f, -0.668598664f, 0.743623444f, + 0.7025606278f, 0.7116238924f, -0.5419389763f, -0.8404178401f, -0.3388616456f, 0.9408362159f, 0.8331530315f, 0.5530425174f, + -0.2989720662f, -0.9542618632f, 0.2638522993f, 0.9645630949f, 0.124108739f, -0.9922686234f, -0.7282649308f, -0.6852956957f, + 0.6962500149f, 0.7177993569f, -0.9183535368f, 0.3957610156f, -0.6326102274f, -0.7744703352f, -0.9331891859f, -0.359385508f, + -0.1153779357f, -0.9933216659f, 0.9514974788f, -0.3076565421f, -0.08987977445f, -0.9959526224f, 0.6678496916f, 0.7442961705f, + 0.7952400393f, -0.6062947138f, -0.6462007402f, -0.7631674805f, -0.2733598753f, 0.9619118351f, 0.9669590226f, -0.254931851f, + -0.9792894595f, 0.2024651934f, -0.5369502995f, -0.8436138784f, -0.270036471f, -0.9628500944f, -0.6400277131f, 0.7683518247f, + -0.7854537493f, -0.6189203566f, 0.06005905383f, -0.9981948257f, -0.02455770378f, 0.9996984141f, -0.65983623f, 0.751409442f, + -0.6253894466f, -0.7803127835f, -0.6210408851f, -0.7837781695f, 0.8348888491f, 0.5504185768f, -0.1592275245f, 0.9872419133f, + 0.8367622488f, 0.5475663786f, -0.8675753916f, -0.4973056806f, -0.2022662628f, -0.9793305667f, 0.9399189937f, 0.3413975472f, + 0.9877404807f, -0.1561049093f, -0.9034455656f, 0.4287028224f, 0.1269804218f, -0.9919052235f, -0.3819600854f, 0.924178821f, + 0.9754625894f, 0.2201652486f, -0.3204015856f, -0.9472818081f, -0.9874760884f, 0.1577687387f, 0.02535348474f, -0.9996785487f, + 0.4835130794f, -0.8753371362f, -0.2850799925f, -0.9585037287f, -0.06805516006f, -0.99768156f, -0.7885244045f, -0.6150034663f, + 0.3185392127f, -0.9479096845f, 0.8880043089f, 0.4598351306f, 0.6476921488f, -0.7619021462f, 0.9820241299f, 0.1887554194f, + 0.9357275128f, -0.3527237187f, -0.8894895414f, 0.4569555293f, 0.7922791302f, 0.6101588153f, 0.7483818261f, 0.6632681526f, + -0.7288929755f, -0.6846276581f, 0.8729032783f, -0.4878932944f, 0.8288345784f, 0.5594937369f, 0.08074567077f, 0.9967347374f, + 0.9799148216f, -0.1994165048f, -0.580730673f, -0.8140957471f, -0.4700049791f, -0.8826637636f, 0.2409492979f, 0.9705377045f, + 0.9437816757f, -0.3305694308f, -0.8927998638f, -0.4504535528f, -0.8069622304f, 0.5906030467f, 0.06258973166f, 0.9980393407f, + -0.9312597469f, 0.3643559849f, 0.5777449785f, 0.8162173362f, -0.3360095855f, -0.941858566f, 0.697932075f, -0.7161639607f, + -0.002008157227f, -0.9999979837f, -0.1827294312f, -0.9831632392f, -0.6523911722f, 0.7578824173f, -0.4302626911f, -0.9027037258f, + -0.9985126289f, -0.05452091251f, -0.01028102172f, -0.9999471489f, -0.4946071129f, 0.8691166802f, -0.2999350194f, 0.9539596344f, + 0.8165471961f, 0.5772786819f, 0.2697460475f, 0.962931498f, -0.7306287391f, -0.6827749597f, -0.7590952064f, -0.6509796216f, + -0.907053853f, 0.4210146171f, -0.5104861064f, -0.8598860013f, 0.8613350597f, 0.5080373165f, 0.5007881595f, -0.8655698812f, + -0.654158152f, 0.7563577938f, -0.8382755311f, -0.545246856f, 0.6940070834f, 0.7199681717f, 0.06950936031f, 0.9975812994f, + 0.1702942185f, -0.9853932612f, 0.2695973274f, 0.9629731466f, 0.5519612192f, -0.8338697815f, 0.225657487f, -0.9742067022f, + 0.4215262855f, -0.9068161835f, 0.4881873305f, -0.8727388672f, -0.3683854996f, -0.9296731273f, -0.9825390578f, 0.1860564427f, + 0.81256471f, 0.5828709909f, 0.3196460933f, -0.9475370046f, 0.9570913859f, 0.2897862643f, -0.6876655497f, -0.7260276109f, + -0.9988770922f, -0.047376731f, -0.1250179027f, 0.992154486f, -0.8280133617f, 0.560708367f, 0.9324863769f, -0.3612051451f, + 0.6394653183f, 0.7688199442f, -0.01623847064f, -0.9998681473f, -0.9955014666f, -0.09474613458f, -0.81453315f, 0.580117012f, + 0.4037327978f, -0.9148769469f, 0.9944263371f, 0.1054336766f, -0.1624711654f, 0.9867132919f, -0.9949487814f, -0.100383875f, + -0.6995302564f, 0.7146029809f, 0.5263414922f, -0.85027327f, -0.5395221479f, 0.841971408f, 0.6579370318f, 0.7530729462f, + 0.01426758847f, -0.9998982128f, -0.6734383991f, 0.7392433447f, 0.639412098f, -0.7688642071f, 0.9211571421f, 0.3891908523f, + -0.146637214f, -0.9891903394f, -0.782318098f, 0.6228791163f, -0.5039610839f, -0.8637263605f, -0.7743120191f, -0.6328039957f, + }; + + private static final double[] Gradients3D = { + 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, + 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, + 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, + 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, + 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, + 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, + 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, + 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, + 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, + 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, + 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, + 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, + 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, + 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, + 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, + 1, 1, 0, 0, 0, -1, 1, 0, -1, 1, 0, 0, 0, -1, -1, 0 + }; + + private static final double[] RandVecs3D = { + -0.7292736885f, -0.6618439697f, 0.1735581948f, 0, 0.790292081f, -0.5480887466f, -0.2739291014f, 0, 0.7217578935f, 0.6226212466f, + -0.3023380997f, 0, 0.565683137f, -0.8208298145f, -0.0790000257f, 0, 0.760049034f, -0.5555979497f, -0.3370999617f, 0, + 0.3713945616f, 0.5011264475f, 0.7816254623f, 0, -0.1277062463f, -0.4254438999f, -0.8959289049f, 0, -0.2881560924f, + -0.5815838982f, 0.7607405838f, 0, 0.5849561111f, -0.662820239f, -0.4674352136f, 0, 0.3307171178f, 0.0391653737f, 0.94291689f, 0, + 0.8712121778f, -0.4113374369f, -0.2679381538f, 0, 0.580981015f, 0.7021915846f, 0.4115677815f, 0, 0.503756873f, 0.6330056931f, + -0.5878203852f, 0, 0.4493712205f, 0.601390195f, 0.6606022552f, 0, -0.6878403724f, 0.09018890807f, -0.7202371714f, 0, + -0.5958956522f, -0.6469350577f, 0.475797649f, 0, -0.5127052122f, 0.1946921978f, -0.8361987284f, 0, -0.9911507142f, + -0.05410276466f, -0.1212153153f, 0, -0.2149721042f, 0.9720882117f, -0.09397607749f, 0, -0.7518650936f, -0.5428057603f, + 0.3742469607f, 0, 0.5237068895f, 0.8516377189f, -0.02107817834f, 0, 0.6333504779f, 0.1926167129f, -0.7495104896f, 0, + -0.06788241606f, 0.3998305789f, 0.9140719259f, 0, -0.5538628599f, -0.4729896695f, -0.6852128902f, 0, -0.7261455366f, + -0.5911990757f, 0.3509933228f, 0, -0.9229274737f, -0.1782808786f, 0.3412049336f, 0, -0.6968815002f, 0.6511274338f, + 0.3006480328f, 0, 0.9608044783f, -0.2098363234f, -0.1811724921f, 0, 0.06817146062f, -0.9743405129f, 0.2145069156f, 0, + -0.3577285196f, -0.6697087264f, -0.6507845481f, 0, -0.1868621131f, 0.7648617052f, -0.6164974636f, 0, -0.6541697588f, + 0.3967914832f, 0.6439087246f, 0, 0.6993340405f, -0.6164538506f, 0.3618239211f, 0, -0.1546665739f, 0.6291283928f, 0.7617583057f, + 0, -0.6841612949f, -0.2580482182f, -0.6821542638f, 0, 0.5383980957f, 0.4258654885f, 0.7271630328f, 0, -0.5026987823f, + -0.7939832935f, -0.3418836993f, 0, 0.3202971715f, 0.2834415347f, 0.9039195862f, 0, 0.8683227101f, -0.0003762656404f, + -0.4959995258f, 0, 0.791120031f, -0.08511045745f, 0.6057105799f, 0, -0.04011016052f, -0.4397248749f, 0.8972364289f, 0, + 0.9145119872f, 0.3579346169f, -0.1885487608f, 0, -0.9612039066f, -0.2756484276f, 0.01024666929f, 0, 0.6510361721f, + -0.2877799159f, -0.7023778346f, 0, -0.2041786351f, 0.7365237271f, 0.644859585f, 0, -0.7718263711f, 0.3790626912f, 0.5104855816f, + 0, -0.3060082741f, -0.7692987727f, 0.5608371729f, 0, 0.454007341f, -0.5024843065f, 0.7357899537f, 0, 0.4816795475f, + 0.6021208291f, -0.6367380315f, 0, 0.6961980369f, -0.3222197429f, 0.641469197f, 0, -0.6532160499f, -0.6781148932f, 0.3368515753f, + 0, 0.5089301236f, -0.6154662304f, -0.6018234363f, 0, -0.1635919754f, -0.9133604627f, -0.372840892f, 0, 0.52408019f, + -0.8437664109f, 0.1157505864f, 0, 0.5902587356f, 0.4983817807f, -0.6349883666f, 0, 0.5863227872f, 0.494764745f, 0.6414307729f, + 0, 0.6779335087f, 0.2341345225f, 0.6968408593f, 0, 0.7177054546f, -0.6858979348f, 0.120178631f, 0, -0.5328819713f, + -0.5205125012f, 0.6671608058f, 0, -0.8654874251f, -0.0700727088f, -0.4960053754f, 0, -0.2861810166f, 0.7952089234f, + 0.5345495242f, 0, -0.04849529634f, 0.9810836427f, -0.1874115585f, 0, -0.6358521667f, 0.6058348682f, 0.4781800233f, 0, + 0.6254794696f, -0.2861619734f, 0.7258696564f, 0, -0.2585259868f, 0.5061949264f, -0.8227581726f, 0, 0.02136306781f, + 0.5064016808f, -0.8620330371f, 0, 0.200111773f, 0.8599263484f, 0.4695550591f, 0, 0.4743561372f, 0.6014985084f, -0.6427953014f, + 0, 0.6622993731f, -0.5202474575f, -0.5391679918f, 0, 0.08084972818f, -0.6532720452f, 0.7527940996f, 0, -0.6893687501f, + 0.0592860349f, 0.7219805347f, 0, -0.1121887082f, -0.9673185067f, 0.2273952515f, 0, 0.7344116094f, 0.5979668656f, -0.3210532909f, + 0, 0.5789393465f, -0.2488849713f, 0.7764570201f, 0, 0.6988182827f, 0.3557169806f, -0.6205791146f, 0, -0.8636845529f, + -0.2748771249f, -0.4224826141f, 0, -0.4247027957f, -0.4640880967f, 0.777335046f, 0, 0.5257722489f, -0.8427017621f, + 0.1158329937f, 0, 0.9343830603f, 0.316302472f, -0.1639543925f, 0, -0.1016836419f, -0.8057303073f, -0.5834887393f, 0, + -0.6529238969f, 0.50602126f, -0.5635892736f, 0, -0.2465286165f, -0.9668205684f, -0.06694497494f, 0, -0.9776897119f, + -0.2099250524f, -0.007368825344f, 0, 0.7736893337f, 0.5734244712f, 0.2694238123f, 0, -0.6095087895f, 0.4995678998f, + 0.6155736747f, 0, 0.5794535482f, 0.7434546771f, 0.3339292269f, 0, -0.8226211154f, 0.08142581855f, 0.5627293636f, 0, + -0.510385483f, 0.4703667658f, 0.7199039967f, 0, -0.5764971849f, -0.07231656274f, -0.8138926898f, 0, 0.7250628871f, + 0.3949971505f, -0.5641463116f, 0, -0.1525424005f, 0.4860840828f, -0.8604958341f, 0, -0.5550976208f, -0.4957820792f, + 0.667882296f, 0, -0.1883614327f, 0.9145869398f, 0.357841725f, 0, 0.7625556724f, -0.5414408243f, -0.3540489801f, 0, + -0.5870231946f, -0.3226498013f, -0.7424963803f, 0, 0.3051124198f, 0.2262544068f, -0.9250488391f, 0, 0.6379576059f, 0.577242424f, + -0.5097070502f, 0, -0.5966775796f, 0.1454852398f, -0.7891830656f, 0, -0.658330573f, 0.6555487542f, -0.3699414651f, 0, + 0.7434892426f, 0.2351084581f, 0.6260573129f, 0, 0.5562114096f, 0.8264360377f, -0.0873632843f, 0, -0.3028940016f, -0.8251527185f, + 0.4768419182f, 0, 0.1129343818f, -0.985888439f, -0.1235710781f, 0, 0.5937652891f, -0.5896813806f, 0.5474656618f, 0, + 0.6757964092f, -0.5835758614f, -0.4502648413f, 0, 0.7242302609f, -0.1152719764f, 0.6798550586f, 0, -0.9511914166f, + 0.0753623979f, -0.2992580792f, 0, 0.2539470961f, -0.1886339355f, 0.9486454084f, 0, 0.571433621f, -0.1679450851f, -0.8032795685f, + 0, -0.06778234979f, 0.3978269256f, 0.9149531629f, 0, 0.6074972649f, 0.733060024f, -0.3058922593f, 0, -0.5435478392f, + 0.1675822484f, 0.8224791405f, 0, -0.5876678086f, -0.3380045064f, -0.7351186982f, 0, -0.7967562402f, 0.04097822706f, + -0.6029098428f, 0, -0.1996350917f, 0.8706294745f, 0.4496111079f, 0, -0.02787660336f, -0.9106232682f, -0.4122962022f, 0, + -0.7797625996f, -0.6257634692f, 0.01975775581f, 0, -0.5211232846f, 0.7401644346f, -0.4249554471f, 0, 0.8575424857f, + 0.4053272873f, -0.3167501783f, 0, 0.1045223322f, 0.8390195772f, -0.5339674439f, 0, 0.3501822831f, 0.9242524096f, -0.1520850155f, + 0, 0.1987849858f, 0.07647613266f, 0.9770547224f, 0, 0.7845996363f, 0.6066256811f, -0.1280964233f, 0, 0.09006737436f, + -0.9750989929f, -0.2026569073f, 0, -0.8274343547f, -0.542299559f, 0.1458203587f, 0, -0.3485797732f, -0.415802277f, 0.840000362f, + 0, -0.2471778936f, -0.7304819962f, -0.6366310879f, 0, -0.3700154943f, 0.8577948156f, 0.3567584454f, 0, 0.5913394901f, + -0.548311967f, -0.5913303597f, 0, 0.1204873514f, -0.7626472379f, -0.6354935001f, 0, 0.616959265f, 0.03079647928f, 0.7863922953f, + 0, 0.1258156836f, -0.6640829889f, -0.7369967419f, 0, -0.6477565124f, -0.1740147258f, -0.7417077429f, 0, 0.6217889313f, + -0.7804430448f, -0.06547655076f, 0, 0.6589943422f, -0.6096987708f, 0.4404473475f, 0, -0.2689837504f, -0.6732403169f, + -0.6887635427f, 0, -0.3849775103f, 0.5676542638f, 0.7277093879f, 0, 0.5754444408f, 0.8110471154f, -0.1051963504f, 0, + 0.9141593684f, 0.3832947817f, 0.131900567f, 0, -0.107925319f, 0.9245493968f, 0.3654593525f, 0, 0.377977089f, 0.3043148782f, + 0.8743716458f, 0, -0.2142885215f, -0.8259286236f, 0.5214617324f, 0, 0.5802544474f, 0.4148098596f, -0.7008834116f, 0, + -0.1982660881f, 0.8567161266f, -0.4761596756f, 0, -0.03381553704f, 0.3773180787f, -0.9254661404f, 0, -0.6867922841f, + -0.6656597827f, 0.2919133642f, 0, 0.7731742607f, -0.2875793547f, -0.5652430251f, 0, -0.09655941928f, 0.9193708367f, + -0.3813575004f, 0, 0.2715702457f, -0.9577909544f, -0.09426605581f, 0, 0.2451015704f, -0.6917998565f, -0.6792188003f, 0, + 0.977700782f, -0.1753855374f, 0.1155036542f, 0, -0.5224739938f, 0.8521606816f, 0.02903615945f, 0, -0.7734880599f, + -0.5261292347f, 0.3534179531f, 0, -0.7134492443f, -0.269547243f, 0.6467878011f, 0, 0.1644037271f, 0.5105846203f, -0.8439637196f, + 0, 0.6494635788f, 0.05585611296f, 0.7583384168f, 0, -0.4711970882f, 0.5017280509f, -0.7254255765f, 0, -0.6335764307f, + -0.2381686273f, -0.7361091029f, 0, -0.9021533097f, -0.270947803f, -0.3357181763f, 0, -0.3793711033f, 0.872258117f, + 0.3086152025f, 0, -0.6855598966f, -0.3250143309f, 0.6514394162f, 0, 0.2900942212f, -0.7799057743f, -0.5546100667f, 0, + -0.2098319339f, 0.85037073f, 0.4825351604f, 0, -0.4592603758f, 0.6598504336f, -0.5947077538f, 0, 0.8715945488f, 0.09616365406f, + -0.4807031248f, 0, -0.6776666319f, 0.7118504878f, -0.1844907016f, 0, 0.7044377633f, 0.312427597f, 0.637304036f, 0, + -0.7052318886f, -0.2401093292f, -0.6670798253f, 0, 0.081921007f, -0.7207336136f, -0.6883545647f, 0, -0.6993680906f, + -0.5875763221f, -0.4069869034f, 0, -0.1281454481f, 0.6419895885f, 0.7559286424f, 0, -0.6337388239f, -0.6785471501f, + -0.3714146849f, 0, 0.5565051903f, -0.2168887573f, -0.8020356851f, 0, -0.5791554484f, 0.7244372011f, -0.3738578718f, 0, + 0.1175779076f, -0.7096451073f, 0.6946792478f, 0, -0.6134619607f, 0.1323631078f, 0.7785527795f, 0, 0.6984635305f, + -0.02980516237f, -0.715024719f, 0, 0.8318082963f, -0.3930171956f, 0.3919597455f, 0, 0.1469576422f, 0.05541651717f, + -0.9875892167f, 0, 0.708868575f, -0.2690503865f, 0.6520101478f, 0, 0.2726053183f, 0.67369766f, -0.68688995f, 0, -0.6591295371f, + 0.3035458599f, -0.6880466294f, 0, 0.4815131379f, -0.7528270071f, 0.4487723203f, 0, 0.9430009463f, 0.1675647412f, -0.2875261255f, + 0, 0.434802957f, 0.7695304522f, -0.4677277752f, 0, 0.3931996188f, 0.594473625f, 0.7014236729f, 0, 0.7254336655f, -0.603925654f, + 0.3301814672f, 0, 0.7590235227f, -0.6506083235f, 0.02433313207f, 0, -0.8552768592f, -0.3430042733f, 0.3883935666f, 0, + -0.6139746835f, 0.6981725247f, 0.3682257648f, 0, -0.7465905486f, -0.5752009504f, 0.3342849376f, 0, 0.5730065677f, 0.810555537f, + -0.1210916791f, 0, -0.9225877367f, -0.3475211012f, -0.167514036f, 0, -0.7105816789f, -0.4719692027f, -0.5218416899f, 0, + -0.08564609717f, 0.3583001386f, 0.929669703f, 0, -0.8279697606f, -0.2043157126f, 0.5222271202f, 0, 0.427944023f, 0.278165994f, + 0.8599346446f, 0, 0.5399079671f, -0.7857120652f, -0.3019204161f, 0, 0.5678404253f, -0.5495413974f, -0.6128307303f, 0, + -0.9896071041f, 0.1365639107f, -0.04503418428f, 0, -0.6154342638f, -0.6440875597f, 0.4543037336f, 0, 0.1074204368f, + -0.7946340692f, 0.5975094525f, 0, -0.3595449969f, -0.8885529948f, 0.28495784f, 0, -0.2180405296f, 0.1529888965f, 0.9638738118f, + 0, -0.7277432317f, -0.6164050508f, -0.3007234646f, 0, 0.7249729114f, -0.00669719484f, 0.6887448187f, 0, -0.5553659455f, + -0.5336586252f, 0.6377908264f, 0, 0.5137558015f, 0.7976208196f, -0.3160000073f, 0, -0.3794024848f, 0.9245608561f, + -0.03522751494f, 0, 0.8229248658f, 0.2745365933f, -0.4974176556f, 0, -0.5404114394f, 0.6091141441f, 0.5804613989f, 0, + 0.8036581901f, -0.2703029469f, 0.5301601931f, 0, 0.6044318879f, 0.6832968393f, 0.4095943388f, 0, 0.06389988817f, 0.9658208605f, + -0.2512108074f, 0, 0.1087113286f, 0.7402471173f, -0.6634877936f, 0, -0.713427712f, -0.6926784018f, 0.1059128479f, 0, + 0.6458897819f, -0.5724548511f, -0.5050958653f, 0, -0.6553931414f, 0.7381471625f, 0.159995615f, 0, 0.3910961323f, 0.9188871375f, + -0.05186755998f, 0, -0.4879022471f, -0.5904376907f, 0.6429111375f, 0, 0.6014790094f, 0.7707441366f, -0.2101820095f, 0, + -0.5677173047f, 0.7511360995f, 0.3368851762f, 0, 0.7858573506f, 0.226674665f, 0.5753666838f, 0, -0.4520345543f, -0.604222686f, + -0.6561857263f, 0, 0.002272116345f, 0.4132844051f, -0.9105991643f, 0, -0.5815751419f, -0.5162925989f, 0.6286591339f, 0, + -0.03703704785f, 0.8273785755f, 0.5604221175f, 0, -0.5119692504f, 0.7953543429f, -0.3244980058f, 0, -0.2682417366f, + -0.9572290247f, -0.1084387619f, 0, -0.2322482736f, -0.9679131102f, -0.09594243324f, 0, 0.3554328906f, -0.8881505545f, + 0.2913006227f, 0, 0.7346520519f, -0.4371373164f, 0.5188422971f, 0, 0.9985120116f, 0.04659011161f, -0.02833944577f, 0, + -0.3727687496f, -0.9082481361f, 0.1900757285f, 0, 0.91737377f, -0.3483642108f, 0.1925298489f, 0, 0.2714911074f, 0.4147529736f, + -0.8684886582f, 0, 0.5131763485f, -0.7116334161f, 0.4798207128f, 0, -0.8737353606f, 0.18886992f, -0.4482350644f, 0, + 0.8460043821f, -0.3725217914f, 0.3814499973f, 0, 0.8978727456f, -0.1780209141f, -0.4026575304f, 0, 0.2178065647f, + -0.9698322841f, -0.1094789531f, 0, -0.1518031304f, -0.7788918132f, -0.6085091231f, 0, -0.2600384876f, -0.4755398075f, + -0.8403819825f, 0, 0.572313509f, -0.7474340931f, -0.3373418503f, 0, -0.7174141009f, 0.1699017182f, -0.6756111411f, 0, + -0.684180784f, 0.02145707593f, -0.7289967412f, 0, -0.2007447902f, 0.06555605789f, -0.9774476623f, 0, -0.1148803697f, + -0.8044887315f, 0.5827524187f, 0, -0.7870349638f, 0.03447489231f, 0.6159443543f, 0, -0.2015596421f, 0.6859872284f, + 0.6991389226f, 0, -0.08581082512f, -0.10920836f, -0.9903080513f, 0, 0.5532693395f, 0.7325250401f, -0.396610771f, 0, + -0.1842489331f, -0.9777375055f, -0.1004076743f, 0, 0.0775473789f, -0.9111505856f, 0.4047110257f, 0, 0.1399838409f, + 0.7601631212f, -0.6344734459f, 0, 0.4484419361f, -0.845289248f, 0.2904925424f, 0 + }; + + // Hashing + private static final int PrimeX = 501125321; + private static final int PrimeY = 1136930381; + private static final int PrimeZ = 1720413743; + + private int mSeed = 1337; + private double mFrequency = 0.01f; + private NoiseType mNoiseType = NoiseType.OpenSimplex2; + private RotationType3D mRotationType3D = RotationType3D.None; + private TransformType3D mTransformType3D = TransformType3D.DefaultOpenSimplex2; + + private FractalType mFractalType = FractalType.None; + private int mOctaves = 3; + private double mLacunarity = 2.0f; + private double mGain = 0.5f; + private double mWeightedStrength = 0.0f; + private double mPingPongStength = 2.0f; + + private double mFractalBounding = 1 / 1.75f; + + private CellularDistanceFunction mCellularDistanceFunction = CellularDistanceFunction.EuclideanSq; + private CellularReturnType mCellularReturnType = CellularReturnType.Distance; + private double mCellularJitterModifier = 1.0f; + + private DomainWarpType mDomainWarpType = DomainWarpType.OpenSimplex2; + private TransformType3D mWarpTransformType3D = TransformType3D.DefaultOpenSimplex2; + private double mDomainWarpAmp = 1.0f; + + private static final com.dfsek.terra.api.gaea.math.FastNoiseLite CELLULAR_LOOKUP_DEFAULT = new com.dfsek.terra.api.gaea.math.FastNoiseLite(); + private com.dfsek.terra.api.gaea.math.FastNoiseLite cellularNoiseLookup = CELLULAR_LOOKUP_DEFAULT; + + public com.dfsek.terra.api.gaea.math.FastNoiseLite getCellularNoiseLookup() { + return cellularNoiseLookup; + } + + public void setCellularNoiseLookup(com.dfsek.terra.api.gaea.math.FastNoiseLite cellularNoiseLookup) { + this.cellularNoiseLookup = cellularNoiseLookup; + } + + /** + * Create new FastNoise object with default seed + */ + public FastNoiseLite() { + + } + + /** + * Create new FastNoise object with specified seed + */ + public FastNoiseLite(int seed) { + setSeed(seed); + } + + /** + * Sets seed used for all noise types + *

+ * Default: 1337 + */ + public void setSeed(int seed) { + mSeed = seed; + } + + private static double FastMin(double a, double b) { + return a < b ? a : b; + } + + private static double FastMax(double a, double b) { + return a > b ? a : b; + } + + private static double FastSqrt(double f) { + return FastMath.sqrt(f); + } + + private static int FastFloor(/*FNLdouble*/ double f) { + return f >= 0 ? (int) f : (int) f - 1; + } + + private static int FastRound(/*FNLdouble*/ double f) { + return f >= 0 ? (int) (f + 0.5f) : (int) (f - 0.5f); + } + + private static double Lerp(double a, double b, double t) { + return a + t * (b - a); + } + + private static double InterpHermite(double t) { + return t * t * (3 - 2 * t); + } + + private static double InterpQuintic(double t) { + return t * t * t * (t * (t * 6 - 15) + 10); + } + + private static double CubicLerp(double a, double b, double c, double d, double t) { + double p = (d - c) - (a - b); + return t * t * t * p + t * t * ((a - b) - p) + t * (c - a) + b; + } + + private static double PingPong(double t) { + t -= (int) (t * 0.5f) << 1; + return t < 1 ? t : 2 - t; + } + + private static int Hash(int seed, int xPrimed, int yPrimed) { + int hash = seed ^ xPrimed ^ yPrimed; + + hash *= 0x27d4eb2d; + return hash; + } + + private static int Hash(int seed, int xPrimed, int yPrimed, int zPrimed) { + int hash = seed ^ xPrimed ^ yPrimed ^ zPrimed; + + hash *= 0x27d4eb2d; + return hash; + } + + private static double ValCoord(int seed, int xPrimed, int yPrimed) { + int hash = Hash(seed, xPrimed, yPrimed); + + hash *= hash; + hash ^= hash << 19; + return hash * (1 / 2147483648.0f); + } + + private static double ValCoord(int seed, int xPrimed, int yPrimed, int zPrimed) { + int hash = Hash(seed, xPrimed, yPrimed, zPrimed); + + hash *= hash; + hash ^= hash << 19; + return hash * (1 / 2147483648.0f); + } + + private static double GradCoord(int seed, int xPrimed, int yPrimed, double xd, double yd) { + int hash = Hash(seed, xPrimed, yPrimed); + hash ^= hash >> 15; + hash &= 127 << 1; + + double xg = Gradients2D[hash]; + double yg = Gradients2D[hash | 1]; + + return xd * xg + yd * yg; + } + + private static double GradCoord(int seed, int xPrimed, int yPrimed, int zPrimed, double xd, double yd, double zd) { + int hash = Hash(seed, xPrimed, yPrimed, zPrimed); + hash ^= hash >> 15; + hash &= 63 << 2; + + double xg = Gradients3D[hash]; + double yg = Gradients3D[hash | 1]; + double zg = Gradients3D[hash | 2]; + + return xd * xg + yd * yg + zd * zg; + } + + /** + * Sets frequency for all noise types + *

+ * Default: 0.01 + */ + public void setFrequency(double frequency) { + mFrequency = frequency; + } + + /** + * Sets noise algorithm used for GetNoise(...) + *

+ * Default: OpenSimplex2 + */ + public void setNoiseType(NoiseType noiseType) { + mNoiseType = noiseType; + UpdateTransformType3D(); + } + + private void UpdateTransformType3D() { + switch (mRotationType3D) { + case ImproveXYPlanes: + mTransformType3D = TransformType3D.ImproveXYPlanes; + break; + case ImproveXZPlanes: + mTransformType3D = TransformType3D.ImproveXZPlanes; + break; + default: + switch (mNoiseType) { + case OpenSimplex2: + case OpenSimplex2S: + mTransformType3D = TransformType3D.DefaultOpenSimplex2; + break; + default: + mTransformType3D = TransformType3D.None; + break; + } + break; + } + } + + /** + * Sets domain rotation type for 3D Noise and 3D DomainWarp. + * Can aid in reducing directional artifacts when sampling a 2D plane in 3D + *

+ * Default: None + */ + public void setRotationType3D(RotationType3D rotationType3D) { + mRotationType3D = rotationType3D; + UpdateTransformType3D(); + UpdateWarpTransformType3D(); + } + + private void UpdateWarpTransformType3D() { + switch (mRotationType3D) { + case ImproveXYPlanes: + mWarpTransformType3D = TransformType3D.ImproveXYPlanes; + break; + case ImproveXZPlanes: + mWarpTransformType3D = TransformType3D.ImproveXZPlanes; + break; + default: + switch (mDomainWarpType) { + case OpenSimplex2: + case OpenSimplex2Reduced: + mWarpTransformType3D = TransformType3D.DefaultOpenSimplex2; + break; + default: + mWarpTransformType3D = TransformType3D.None; + break; + } + break; + } + } + + /** + * Sets method for combining octaves in all fractal noise types + *

+ * Default: None + * Note: FractalType.DomainWarp... only affects DomainWarp(...) + */ + public void setFractalType(FractalType fractalType) { + mFractalType = fractalType; + } + + /** + * Sets octave count for all fractal noise types + *

+ * Default: 3 + */ + public void setFractalOctaves(int octaves) { + mOctaves = octaves; + CalculateFractalBounding(); + } + + private void CalculateFractalBounding() { + double gain = FastAbs(mGain); + double amp = gain; + double ampFractal = 1.0f; + for (int i = 1; i < mOctaves; i++) { + ampFractal += amp; + amp *= gain; + } + mFractalBounding = 1 / ampFractal; + } + + private static double FastAbs(double f) { + return f < 0 ? -f : f; + } + + /** + * Sets octave lacunarity for all fractal noise types + *

+ * Default: 2.0 + */ + public void setFractalLacunarity(double lacunarity) { + mLacunarity = lacunarity; + } + + /** + * Sets octave gain for all fractal noise types + *

+ * Default: 0.5 + */ + public void setFractalGain(double gain) { + mGain = gain; + CalculateFractalBounding(); + } + + /** + * Sets octave weighting for all none DomainWarp fratal types + *

+ * Default: 0.0 + * Note: Keep between 0...1 to maintain -1...1 output bounding + */ + public void setFractalWeightedStrength(double weightedStrength) { + mWeightedStrength = weightedStrength; + } + + /** + * Sets strength of the fractal ping pong effect + *

+ * Default: 2.0 + */ + public void setFractalPingPongStrength(double pingPongStrength) { + mPingPongStength = pingPongStrength; + } + + /** + * Sets distance function used in cellular noise calculations + *

+ * Default: Distance + */ + public void setCellularDistanceFunction(CellularDistanceFunction cellularDistanceFunction) { + mCellularDistanceFunction = cellularDistanceFunction; + } + + /** + * Sets return type from cellular noise calculations + *

+ * Default: EuclideanSq + */ + public void setCellularReturnType(CellularReturnType cellularReturnType) { + mCellularReturnType = cellularReturnType; + } + + /** + * Sets the maximum distance a cellular point can move from it's grid position + *

+ * Default: 1.0 + * Note: Setting this higher than 1 will cause artifacts + */ + public void setCellularJitter(double cellularJitter) { + mCellularJitterModifier = cellularJitter; + } + + /** + * Sets the warp algorithm when using DomainWarp(...) + *

+ * Default: OpenSimplex2 + */ + public void setDomainWarpType(DomainWarpType domainWarpType) { + mDomainWarpType = domainWarpType; + UpdateWarpTransformType3D(); + } + + /** + * Sets the maximum warp distance from original position when using DomainWarp(...) + *

+ * Default: 1.0 + */ + public void setDomainWarpAmp(double domainWarpAmp) { + mDomainWarpAmp = domainWarpAmp; + } + + /** + * 2D noise at given position using current settings + *

+ * Noise output bounded between -1...1 + */ + public double getNoise(/*FNLdouble*/ double x, /*FNLdouble*/ double y) { + x *= mFrequency; + y *= mFrequency; + + switch (mNoiseType) { + case OpenSimplex2: + case OpenSimplex2S: { + /*FNLdouble*/ + final /*FNLdouble*/ double SQRT3 = 1.7320508075688772935274463415059; + final /*FNLdouble*/ double F2 = 0.5f * (SQRT3 - 1); + /*FNLdouble*/ + double t = (x + y) * F2; + x += t; + y += t; + } + break; + default: + break; + } + + switch (mFractalType) { + default: + return GenNoiseSingle(mSeed, x, y); + case FBm: + return GenFractalFBm(x, y); + case Ridged: + return GenFractalRidged(x, y); + case PingPong: + return GenFractalPingPong(x, y); + } + } + + /** + * 3D noise at given position using current settings + *

+ * Noise output bounded between -1...1 + */ + public double getNoise(/*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + x *= mFrequency; + y *= mFrequency; + z *= mFrequency; + + switch (mTransformType3D) { + case ImproveXYPlanes: { + /*FNLdouble*/ + double xy = x + y; + /*FNLdouble*/ + double s2 = xy * -(/*FNLdouble*/ double) 0.211324865405187; + /*FNLdouble*/ + z *= 0.577350269189626; + x += s2 - z; + y = y + s2 - z; + /*FNLdouble*/ + z += xy * 0.577350269189626; + } + break; + case ImproveXZPlanes: { + /*FNLdouble*/ + double xz = x + z; + /*FNLdouble*/ + double s2 = xz * -(/*FNLdouble*/ double) 0.211324865405187; + /*FNLdouble*/ + y *= 0.577350269189626; + x += s2 - y; + z += s2 - y; + /*FNLdouble*/ + y += xz * 0.577350269189626; + } + break; + case DefaultOpenSimplex2: { + /*FNLdouble*/ + final /*FNLdouble*/ double R3 = 2.0 / 3.0; + /*FNLdouble*/ + double r = (x + y + z) * R3; // Rotation, not skew + x = r - x; + y = r - y; + z = r - z; + } + break; + default: + break; + } + + switch (mFractalType) { + default: + return GenNoiseSingle(mSeed, x, y, z); + case FBm: + return GenFractalFBm(x, y, z); + case Ridged: + return GenFractalRidged(x, y, z); + case PingPong: + return GenFractalPingPong(x, y, z); + } + } + + /** + * 2D warps the input position using current domain warp settings + *

+ * Example usage with GetNoise + * DomainWarp(coord) + * noise = GetNoise(x, y) + */ + public void domainWarp(Vector2 coord) { + switch (mFractalType) { + default: + DomainWarpSingle(coord); + break; + case DomainWarpProgressive: + DomainWarpFractalProgressive(coord); + break; + case DomainWarpIndependent: + DomainWarpFractalIndependent(coord); + break; + } + } + + /** + * 3D warps the input position using current domain warp settings + *

+ * Example usage with GetNoise + * DomainWarp(coord) + * noise = GetNoise(x, y, z) + */ + public void domainWarp(Vector3 coord) { + switch (mFractalType) { + default: + DomainWarpSingle(coord); + break; + case DomainWarpProgressive: + DomainWarpFractalProgressive(coord); + break; + case DomainWarpIndependent: + DomainWarpFractalIndependent(coord); + break; + } + } + + private double GenNoiseSingle(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y) { + switch (mNoiseType) { + case OpenSimplex2: + return SingleSimplex(seed, x, y); + case OpenSimplex2S: + return SingleOpenSimplex2S(seed, x, y); + case Cellular: + return SingleCellular(seed, x, y); + case Perlin: + return SinglePerlin(seed, x, y); + case ValueCubic: + return SingleValueCubic(seed, x, y); + case Value: + return SingleValue(seed, x, y); + default: + return 0; + } + } + + private double GenNoiseSingle(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + switch (mNoiseType) { + case OpenSimplex2: + return SingleOpenSimplex2(seed, x, y, z); + case OpenSimplex2S: + return SingleOpenSimplex2S(seed, x, y, z); + case Cellular: + return SingleCellular(seed, x, y, z); + case Perlin: + return SinglePerlin(seed, x, y, z); + case ValueCubic: + return SingleValueCubic(seed, x, y, z); + case Value: + return SingleValue(seed, x, y, z); + default: + return 0; + } + } + + private double GenFractalFBm(/*FNLdouble*/ double x, /*FNLdouble*/ double y) { + int seed = mSeed; + double sum = 0; + double amp = mFractalBounding; + + for (int i = 0; i < mOctaves; i++) { + double noise = GenNoiseSingle(seed++, x, y); + sum += noise * amp; + amp *= Lerp(1.0f, FastMin(noise + 1, 2) * 0.5f, mWeightedStrength); + + x *= mLacunarity; + y *= mLacunarity; + amp *= mGain; + } + + return sum; + } + + private double GenFractalFBm(/*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + int seed = mSeed; + double sum = 0; + double amp = mFractalBounding; + + for (int i = 0; i < mOctaves; i++) { + double noise = GenNoiseSingle(seed++, x, y, z); + sum += noise * amp; + amp *= Lerp(1.0f, (noise + 1) * 0.5f, mWeightedStrength); + + x *= mLacunarity; + y *= mLacunarity; + z *= mLacunarity; + amp *= mGain; + } + + return sum; + } + + private double GenFractalRidged(/*FNLdouble*/ double x, /*FNLdouble*/ double y) { + int seed = mSeed; + double sum = 0; + double amp = mFractalBounding; + + for (int i = 0; i < mOctaves; i++) { + double noise = FastAbs(GenNoiseSingle(seed++, x, y)); + sum += (noise * -2 + 1) * amp; + amp *= Lerp(1.0f, 1 - noise, mWeightedStrength); + + x *= mLacunarity; + y *= mLacunarity; + amp *= mGain; + } + + return sum; + } + + // Generic noise gen + private double GenFractalRidged(/*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + int seed = mSeed; + double sum = 0; + double amp = mFractalBounding; + + for (int i = 0; i < mOctaves; i++) { + double noise = FastAbs(GenNoiseSingle(seed++, x, y, z)); + sum += (noise * -2 + 1) * amp; + amp *= Lerp(1.0f, 1 - noise, mWeightedStrength); + + x *= mLacunarity; + y *= mLacunarity; + z *= mLacunarity; + amp *= mGain; + } + + return sum; + } + + private double GenFractalPingPong(/*FNLdouble*/ double x, /*FNLdouble*/ double y) { + int seed = mSeed; + double sum = 0; + double amp = mFractalBounding; + + for (int i = 0; i < mOctaves; i++) { + double noise = PingPong((GenNoiseSingle(seed++, x, y) + 1) * mPingPongStength); + sum += (noise - 0.5f) * 2 * amp; + amp *= Lerp(1.0f, noise, mWeightedStrength); + + x *= mLacunarity; + y *= mLacunarity; + amp *= mGain; + } + + return sum; + } + + // Noise Coordinate Transforms (frequency, and possible skew or rotation) + private double GenFractalPingPong(/*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + int seed = mSeed; + double sum = 0; + double amp = mFractalBounding; + + for (int i = 0; i < mOctaves; i++) { + double noise = PingPong((GenNoiseSingle(seed++, x, y, z) + 1) * mPingPongStength); + sum += (noise - 0.5f) * 2 * amp; + amp *= Lerp(1.0f, noise, mWeightedStrength); + + x *= mLacunarity; + y *= mLacunarity; + z *= mLacunarity; + amp *= mGain; + } + + return sum; + } + + private double SingleSimplex(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y) { + // 2D OpenSimplex2 case uses the same algorithm as ordinary Simplex. + final double SQRT3 = 1.7320508075688772935274463415059f; + final double G2 = (3 - SQRT3) / 6; + + /* + * --- Skew moved to switch statements before fractal evaluation --- + * final FNLdouble F2 = 0.5f * (SQRT3 - 1); + * FNLdouble s = (x + y) * F2; + * x += s; y += s; + */ + + int i = FastFloor(x); + int j = FastFloor(y); + double xi = x - i; + double yi = y - j; + + double t = (xi + yi) * G2; + double x0 = xi - t; + double y0 = yi - t; + + i *= PrimeX; + j *= PrimeY; + + double n0, n1, n2; + + double a = 0.5f - x0 * x0 - y0 * y0; + if (a <= 0) n0 = 0; + else { + n0 = (a * a) * (a * a) * GradCoord(seed, i, j, x0, y0); + } + + double c = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); + if (c <= 0) n2 = 0; + else { + double x2 = x0 + (2 * G2 - 1); + double y2 = y0 + (2 * G2 - 1); + n2 = (c * c) * (c * c) * GradCoord(seed, i + PrimeX, j + PrimeY, x2, y2); + } + + if (y0 > x0) { + double x1 = x0 + G2; + double y1 = y0 + (G2 - 1); + double b = 0.5f - x1 * x1 - y1 * y1; + if (b <= 0) n1 = 0; + else { + n1 = (b * b) * (b * b) * GradCoord(seed, i, j + PrimeY, x1, y1); + } + } else { + double x1 = x0 + (G2 - 1); + double y1 = y0 + G2; + double b = 0.5f - x1 * x1 - y1 * y1; + if (b <= 0) n1 = 0; + else { + n1 = (b * b) * (b * b) * GradCoord(seed, i + PrimeX, j, x1, y1); + } + } + + return (n0 + n1 + n2) * 99.83685446303647f; + } + + // Fractal FBm + private double SingleOpenSimplex2(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + // 3D OpenSimplex2 case uses two offset rotated cube grids. + /* + * --- Rotation moved to switch statements before fractal evaluation --- + * final FNLdouble R3 = (FNLdouble)(2.0 / 3.0); + * FNLdouble r = (x + y + z) * R3; // Rotation, not skew + * x = r - x; y = r - y; z = r - z; + */ + + int i = FastRound(x); + int j = FastRound(y); + int k = FastRound(z); + double x0 = x - i; + double y0 = y - j; + double z0 = z - k; + + int xNSign = (int) (-1.0f - x0) | 1; + int yNSign = (int) (-1.0f - y0) | 1; + int zNSign = (int) (-1.0f - z0) | 1; + + double ax0 = xNSign * -x0; + double ay0 = yNSign * -y0; + double az0 = zNSign * -z0; + + i *= PrimeX; + j *= PrimeY; + k *= PrimeZ; + + double value = 0; + double a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); + + for (int l = 0; ; l++) { + if (a > 0) { + value += (a * a) * (a * a) * GradCoord(seed, i, j, k, x0, y0, z0); + } + + if (ax0 >= ay0 && ax0 >= az0) { + double b = a + ax0 + ax0; + if (b > 1) { + b -= 1; + value += (b * b) * (b * b) * GradCoord(seed, i - xNSign * PrimeX, j, k, x0 + xNSign, y0, z0); + } + } else if (ay0 > ax0 && ay0 >= az0) { + double b = a + ay0 + ay0; + if (b > 1) { + b -= 1; + value += (b * b) * (b * b) * GradCoord(seed, i, j - yNSign * PrimeY, k, x0, y0 + yNSign, z0); + } + } else { + double b = a + az0 + az0; + if (b > 1) { + b -= 1; + value += (b * b) * (b * b) * GradCoord(seed, i, j, k - zNSign * PrimeZ, x0, y0, z0 + zNSign); + } + } + + if (l == 1) break; + + ax0 = 0.5f - ax0; + ay0 = 0.5f - ay0; + az0 = 0.5f - az0; + + x0 = xNSign * ax0; + y0 = yNSign * ay0; + z0 = zNSign * az0; + + a += (0.75f - ax0) - (ay0 + az0); + + i += (xNSign >> 1) & PrimeX; + j += (yNSign >> 1) & PrimeY; + k += (zNSign >> 1) & PrimeZ; + + xNSign = -xNSign; + yNSign = -yNSign; + zNSign = -zNSign; + + seed = ~seed; + } + + return value * 32.69428253173828125f; + } + + @SuppressWarnings("NumericOverflow") + private double SingleOpenSimplex2S(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y) { + // 2D OpenSimplex2S case is a modified 2D simplex noise. + /*FNLdouble*/ + final /*FNLdouble*/ double SQRT3 = 1.7320508075688772935274463415059; + final /*FNLdouble*/ double G2 = (3 - SQRT3) / 6; + + /* + * --- Skew moved to TransformNoiseCoordinate method --- + * final FNLdouble F2 = 0.5f * (SQRT3 - 1); + * FNLdouble s = (x + y) * F2; + * x += s; y += s; + */ + + int i = FastFloor(x); + int j = FastFloor(y); + double xi = x - i; + double yi = y - j; + + i *= PrimeX; + j *= PrimeY; + int i1 = i + PrimeX; + int j1 = j + PrimeY; + + double t = (xi + yi) * G2; + double x0 = xi - t; + double y0 = yi - t; + + double a0 = (2.0f / 3.0f) - x0 * x0 - y0 * y0; + double value = (a0 * a0) * (a0 * a0) * GradCoord(seed, i, j, x0, y0); + + double a1 = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a0); + double x1 = x0 - (1 - 2 * G2); + double y1 = y0 - (1 - 2 * G2); + value += (a1 * a1) * (a1 * a1) * GradCoord(seed, i1, j1, x1, y1); + + // Nested conditionals were faster than compact bit logic/arithmetic. + double xmyi = xi - yi; + if (t > G2) { + if (xi + xmyi > 1) { + double x2 = x0 + (3 * G2 - 2); + double y2 = y0 + (3 * G2 - 1); + double a2 = (2.0f / 3.0f) - x2 * x2 - y2 * y2; + if (a2 > 0) { + value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i + (PrimeX << 1), j + PrimeY, x2, y2); + } + } else { + double x2 = x0 + G2; + double y2 = y0 + (G2 - 1); + double a2 = (2.0f / 3.0f) - x2 * x2 - y2 * y2; + if (a2 > 0) { + value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i, j + PrimeY, x2, y2); + } + } + + if (yi - xmyi > 1) { + double x3 = x0 + (3 * G2 - 1); + double y3 = y0 + (3 * G2 - 2); + double a3 = (2.0f / 3.0f) - x3 * x3 - y3 * y3; + if (a3 > 0) { + value += (a3 * a3) * (a3 * a3) * GradCoord(seed, i + PrimeX, j + (PrimeY << 1), x3, y3); + } + } else { + double x3 = x0 + (G2 - 1); + double y3 = y0 + G2; + double a3 = (2.0f / 3.0f) - x3 * x3 - y3 * y3; + if (a3 > 0) { + value += (a3 * a3) * (a3 * a3) * GradCoord(seed, i + PrimeX, j, x3, y3); + } + } + } else { + if (xi + xmyi < 0) { + double x2 = x0 + (1 - G2); + double y2 = y0 - G2; + double a2 = (2.0f / 3.0f) - x2 * x2 - y2 * y2; + if (a2 > 0) { + value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i - PrimeX, j, x2, y2); + } + } else { + double x2 = x0 + (G2 - 1); + double y2 = y0 + G2; + double a2 = (2.0f / 3.0f) - x2 * x2 - y2 * y2; + if (a2 > 0) { + value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i + PrimeX, j, x2, y2); + } + } + + if (yi < xmyi) { + double x2 = x0 - G2; + double y2 = y0 - (G2 - 1); + double a2 = (2.0f / 3.0f) - x2 * x2 - y2 * y2; + if (a2 > 0) { + value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i, j - PrimeY, x2, y2); + } + } else { + double x2 = x0 + G2; + double y2 = y0 + (G2 - 1); + double a2 = (2.0f / 3.0f) - x2 * x2 - y2 * y2; + if (a2 > 0) { + value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i, j + PrimeY, x2, y2); + } + } + } + + return value * 18.24196194486065f; + } + + // Fractal Ridged + @SuppressWarnings("NumericOverflow") + private double SingleOpenSimplex2S(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + // 3D OpenSimplex2S case uses two offset rotated cube grids. + /* + * --- Rotation moved to TransformNoiseCoordinate method --- + * final FNLdouble R3 = (FNLdouble)(2.0 / 3.0); + * FNLdouble r = (x + y + z) * R3; // Rotation, not skew + * x = r - x; y = r - y; z = r - z; + */ + + int i = FastFloor(x); + int j = FastFloor(y); + int k = FastFloor(z); + double xi = x - i; + double yi = y - j; + double zi = z - k; + + i *= PrimeX; + j *= PrimeY; + k *= PrimeZ; + int seed2 = seed + 1293373; + + int xNMask = (int) (-0.5f - xi); + int yNMask = (int) (-0.5f - yi); + int zNMask = (int) (-0.5f - zi); + + double x0 = xi + xNMask; + double y0 = yi + yNMask; + double z0 = zi + zNMask; + double a0 = 0.75f - x0 * x0 - y0 * y0 - z0 * z0; + double value = (a0 * a0) * (a0 * a0) * GradCoord(seed, i + (xNMask & PrimeX), j + (yNMask & PrimeY), k + (zNMask & PrimeZ), x0, y0, + z0); + + double x1 = xi - 0.5f; + double y1 = yi - 0.5f; + double z1 = zi - 0.5f; + double a1 = 0.75f - x1 * x1 - y1 * y1 - z1 * z1; + value += (a1 * a1) * (a1 * a1) * GradCoord(seed2, i + PrimeX, j + PrimeY, k + PrimeZ, x1, y1, z1); + + double xAFlipMask0 = ((xNMask | 1) << 1) * x1; + double yAFlipMask0 = ((yNMask | 1) << 1) * y1; + double zAFlipMask0 = ((zNMask | 1) << 1) * z1; + double xAFlipMask1 = (-2 - (xNMask << 2)) * x1 - 1.0f; + double yAFlipMask1 = (-2 - (yNMask << 2)) * y1 - 1.0f; + double zAFlipMask1 = (-2 - (zNMask << 2)) * z1 - 1.0f; + + boolean skip5 = false; + double a2 = xAFlipMask0 + a0; + if (a2 > 0) { + double x2 = x0 - (xNMask | 1); + value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i + (~xNMask & PrimeX), j + (yNMask & PrimeY), k + (zNMask & PrimeZ), x2, y0, + z0); + } else { + double a3 = yAFlipMask0 + zAFlipMask0 + a0; + if (a3 > 0) { + double y3 = y0 - (yNMask | 1); + double z3 = z0 - (zNMask | 1); + value += (a3 * a3) * (a3 * a3) * GradCoord(seed, i + (xNMask & PrimeX), j + (~yNMask & PrimeY), k + (~zNMask & PrimeZ), x0, + y3, z3); + } + + double a4 = xAFlipMask1 + a1; + if (a4 > 0) { + double x4 = (xNMask | 1) + x1; + value += (a4 * a4) * (a4 * a4) * GradCoord(seed2, i + (xNMask & (PrimeX << 1)), j + PrimeY, k + PrimeZ, x4, y1, z1); + skip5 = true; + } + } + + boolean skip9 = false; + double a6 = yAFlipMask0 + a0; + if (a6 > 0) { + double y6 = y0 - (yNMask | 1); + value += (a6 * a6) * (a6 * a6) * GradCoord(seed, i + (xNMask & PrimeX), j + (~yNMask & PrimeY), k + (zNMask & PrimeZ), x0, y6, + z0); + } else { + double a7 = xAFlipMask0 + zAFlipMask0 + a0; + if (a7 > 0) { + double x7 = x0 - (xNMask | 1); + double z7 = z0 - (zNMask | 1); + value += (a7 * a7) * (a7 * a7) * GradCoord(seed, i + (~xNMask & PrimeX), j + (yNMask & PrimeY), k + (~zNMask & PrimeZ), x7, + y0, z7); + } + + double a8 = yAFlipMask1 + a1; + if (a8 > 0) { + double y8 = (yNMask | 1) + y1; + value += (a8 * a8) * (a8 * a8) * GradCoord(seed2, i + PrimeX, j + (yNMask & (PrimeY << 1)), k + PrimeZ, x1, y8, z1); + skip9 = true; + } + } + + boolean skipD = false; + double aA = zAFlipMask0 + a0; + if (aA > 0) { + double zA = z0 - (zNMask | 1); + value += (aA * aA) * (aA * aA) * GradCoord(seed, i + (xNMask & PrimeX), j + (yNMask & PrimeY), k + (~zNMask & PrimeZ), x0, y0, + zA); + } else { + double aB = xAFlipMask0 + yAFlipMask0 + a0; + if (aB > 0) { + double xB = x0 - (xNMask | 1); + double yB = y0 - (yNMask | 1); + value += (aB * aB) * (aB * aB) * GradCoord(seed, i + (~xNMask & PrimeX), j + (~yNMask & PrimeY), k + (zNMask & PrimeZ), xB, + yB, z0); + } + + double aC = zAFlipMask1 + a1; + if (aC > 0) { + double zC = (zNMask | 1) + z1; + value += (aC * aC) * (aC * aC) * GradCoord(seed2, i + PrimeX, j + PrimeY, k + (zNMask & (PrimeZ << 1)), x1, y1, zC); + skipD = true; + } + } + + if (!skip5) { + double a5 = yAFlipMask1 + zAFlipMask1 + a1; + if (a5 > 0) { + double y5 = (yNMask | 1) + y1; + double z5 = (zNMask | 1) + z1; + value += (a5 * a5) * (a5 * a5) * GradCoord(seed2, i + PrimeX, j + (yNMask & (PrimeY << 1)), k + (zNMask & (PrimeZ << 1)), + x1, y5, z5); + } + } + + if (!skip9) { + double a9 = xAFlipMask1 + zAFlipMask1 + a1; + if (a9 > 0) { + double x9 = (xNMask | 1) + x1; + double z9 = (zNMask | 1) + z1; + value += (a9 * a9) * (a9 * a9) * GradCoord(seed2, i + (xNMask & (PrimeX << 1)), j + PrimeY, k + (zNMask & (PrimeZ << 1)), x9, + y1, z9); + } + } + + if (!skipD) { + double aD = xAFlipMask1 + yAFlipMask1 + a1; + if (aD > 0) { + double xD = (xNMask | 1) + x1; + double yD = (yNMask | 1) + y1; + value += (aD * aD) * (aD * aD) * GradCoord(seed2, i + (xNMask & (PrimeX << 1)), j + (yNMask & (PrimeY << 1)), k + PrimeZ, + xD, yD, z1); + } + } + + return value * 9.046026385208288f; + } + + private double SingleCellular(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y) { + int xr = FastRound(x); + int yr = FastRound(y); + + double distance0 = Double.MAX_VALUE; + double distance1 = Double.MAX_VALUE; + int closestHash = 0; + + double cellularJitter = 0.43701595f * mCellularJitterModifier; + + int xPrimed = (xr - 1) * PrimeX; + int yPrimedBase = (yr - 1) * PrimeY; + + Vector2 center = new Vector2(x, y); + + switch(mCellularDistanceFunction) { + default: + case Euclidean: + case EuclideanSq: + for(int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for(int yi = yr - 1; yi <= yr + 1; yi++) { + int hash = Hash(seed, xPrimed, yPrimed); + int idx = hash & (255 << 1); + + double vecX = (xi - x) + RandVecs2D[idx] * cellularJitter; + double vecY = (yi - y) + RandVecs2D[idx | 1] * cellularJitter; + + double newDistance = vecX * vecX + vecY * vecY; + + distance1 = FastMax(FastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + center.x = (xi + RandVecs2D[idx] * cellularJitter) / mFrequency; + center.y = (yi + RandVecs2D[idx | 1] * cellularJitter) / mFrequency; + } + yPrimed += PrimeY; + } + xPrimed += PrimeX; + } + break; + case Manhattan: + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int hash = Hash(seed, xPrimed, yPrimed); + int idx = hash & (255 << 1); + + double vecX = (xi - x) + RandVecs2D[idx] * cellularJitter; + double vecY = (yi - y) + RandVecs2D[idx | 1] * cellularJitter; + + double newDistance = FastAbs(vecX) + FastAbs(vecY); + + distance1 = FastMax(FastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + center.x = (xi + RandVecs2D[idx] * cellularJitter) / mFrequency; + center.y = (yi + RandVecs2D[idx | 1] * cellularJitter) / mFrequency; + } + yPrimed += PrimeY; + } + xPrimed += PrimeX; + } + break; + case Hybrid: + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int hash = Hash(seed, xPrimed, yPrimed); + int idx = hash & (255 << 1); + + double vecX = (xi - x) + RandVecs2D[idx] * cellularJitter; + double vecY = (yi - y) + RandVecs2D[idx | 1] * cellularJitter; + + double newDistance = (FastAbs(vecX) + FastAbs(vecY)) + (vecX * vecX + vecY * vecY); + + distance1 = FastMax(FastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + center.x = (xi + RandVecs2D[idx] * cellularJitter) / mFrequency; + center.y = (yi + RandVecs2D[idx | 1] * cellularJitter) / mFrequency; + } + yPrimed += PrimeY; + } + xPrimed += PrimeX; + } + break; + } + + if (mCellularDistanceFunction == CellularDistanceFunction.Euclidean && mCellularReturnType != CellularReturnType.CellValue) { + distance0 = FastSqrt(distance0); + //noinspection ConstantConditions + if (mCellularReturnType != CellularReturnType.CellValue) { + distance1 = FastSqrt(distance1); + } + } + + switch (mCellularReturnType) { + case CellValue: + return closestHash * (1 / 2147483648.0f); + case Distance: + return distance0 - 1; + case Distance2: + return distance1 - 1; + case Distance2Add: + return (distance1 + distance0) * 0.5f - 1; + case Distance2Sub: + return distance1 - distance0 - 1; + case Distance2Mul: + return distance1 * distance0 * 0.5f - 1; + case Distance2Div: + return distance0 / distance1 - 1; + case NoiseLookup: + return cellularNoiseLookup.getNoise(center.x, center.y); + default: + return 0; + } + } + + // Fractal PingPong + private double SingleCellular(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + int xr = FastRound(x); + int yr = FastRound(y); + int zr = FastRound(z); + + double distance0 = Double.MAX_VALUE; + double distance1 = Double.MAX_VALUE; + int closestHash = 0; + + double cellularJitter = 0.39614353f * mCellularJitterModifier; + + int xPrimed = (xr - 1) * PrimeX; + int yPrimedBase = (yr - 1) * PrimeY; + int zPrimedBase = (zr - 1) * PrimeZ; + + Vector3 center = new Vector3(x, y, z); + + switch(mCellularDistanceFunction) { + case Euclidean: + case EuclideanSq: + for(int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for(int yi = yr - 1; yi <= yr + 1; yi++) { + int zPrimed = zPrimedBase; + + for (int zi = zr - 1; zi <= zr + 1; zi++) { + int hash = Hash(seed, xPrimed, yPrimed, zPrimed); + int idx = hash & (255 << 2); + + double vecX = (xi - x) + RandVecs3D[idx] * cellularJitter; + double vecY = (yi - y) + RandVecs3D[idx | 1] * cellularJitter; + double vecZ = (zi - z) + RandVecs3D[idx | 2] * cellularJitter; + + double newDistance = vecX * vecX + vecY * vecY + vecZ * vecZ; + + distance1 = FastMax(FastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + center.x = (xi + RandVecs3D[idx] * cellularJitter) / mFrequency; + center.y = (yi + RandVecs3D[idx | 1] * cellularJitter) / mFrequency; + center.z = (zi + RandVecs3D[idx | 2] * cellularJitter) / mFrequency; + } + zPrimed += PrimeZ; + } + yPrimed += PrimeY; + } + xPrimed += PrimeX; + } + break; + case Manhattan: + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int zPrimed = zPrimedBase; + + for (int zi = zr - 1; zi <= zr + 1; zi++) { + int hash = Hash(seed, xPrimed, yPrimed, zPrimed); + int idx = hash & (255 << 2); + + double vecX = (xi - x) + RandVecs3D[idx] * cellularJitter; + double vecY = (yi - y) + RandVecs3D[idx | 1] * cellularJitter; + double vecZ = (zi - z) + RandVecs3D[idx | 2] * cellularJitter; + + double newDistance = FastAbs(vecX) + FastAbs(vecY) + FastAbs(vecZ); + + distance1 = FastMax(FastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + center.x = (xi + RandVecs3D[idx] * cellularJitter) / mFrequency; + center.y = (yi + RandVecs3D[idx | 1] * cellularJitter) / mFrequency; + center.z = (zi + RandVecs3D[idx | 2] * cellularJitter) / mFrequency; + } + zPrimed += PrimeZ; + } + yPrimed += PrimeY; + } + xPrimed += PrimeX; + } + break; + case Hybrid: + for (int xi = xr - 1; xi <= xr + 1; xi++) { + int yPrimed = yPrimedBase; + + for (int yi = yr - 1; yi <= yr + 1; yi++) { + int zPrimed = zPrimedBase; + + for (int zi = zr - 1; zi <= zr + 1; zi++) { + int hash = Hash(seed, xPrimed, yPrimed, zPrimed); + int idx = hash & (255 << 2); + + double vecX = (xi - x) + RandVecs3D[idx] * cellularJitter; + double vecY = (yi - y) + RandVecs3D[idx | 1] * cellularJitter; + double vecZ = (zi - z) + RandVecs3D[idx | 2] * cellularJitter; + + double newDistance = (FastAbs(vecX) + FastAbs(vecY) + FastAbs(vecZ)) + + (vecX * vecX + vecY * vecY + vecZ * vecZ); + + distance1 = FastMax(FastMin(distance1, newDistance), distance0); + if (newDistance < distance0) { + distance0 = newDistance; + closestHash = hash; + center.x = (xi + RandVecs3D[idx] * cellularJitter) / mFrequency; + center.y = (yi + RandVecs3D[idx | 1] * cellularJitter) / mFrequency; + center.z = (zi + RandVecs3D[idx | 2] * cellularJitter) / mFrequency; + } + zPrimed += PrimeZ; + } + yPrimed += PrimeY; + } + xPrimed += PrimeX; + } + break; + default: + break; + } + + if (mCellularDistanceFunction == CellularDistanceFunction.Euclidean && mCellularReturnType != CellularReturnType.CellValue) { + distance0 = FastSqrt(distance0); + + //noinspection ConstantConditions + if (mCellularReturnType != CellularReturnType.CellValue) { + distance1 = FastSqrt(distance1); + } + } + + switch (mCellularReturnType) { + case CellValue: + return closestHash * (1 / 2147483648.0f); + case Distance: + return distance0 - 1; + case Distance2: + return distance1 - 1; + case Distance2Add: + return (distance1 + distance0) * 0.5f - 1; + case Distance2Sub: + return distance1 - distance0 - 1; + case Distance2Mul: + return distance1 * distance0 * 0.5f - 1; + case Distance2Div: + return distance0 / distance1 - 1; + case NoiseLookup: + return cellularNoiseLookup.getNoise(center.x, center.y, center.z); + default: + return 0; + } + } + + private double SinglePerlin(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y) { + int x0 = FastFloor(x); + int y0 = FastFloor(y); + + double xd0 = x - x0; + double yd0 = y - y0; + double xd1 = xd0 - 1; + double yd1 = yd0 - 1; + + double xs = InterpQuintic(xd0); + double ys = InterpQuintic(yd0); + + x0 *= PrimeX; + y0 *= PrimeY; + int x1 = x0 + PrimeX; + int y1 = y0 + PrimeY; + + double xf0 = Lerp(GradCoord(seed, x0, y0, xd0, yd0), GradCoord(seed, x1, y0, xd1, yd0), xs); + double xf1 = Lerp(GradCoord(seed, x0, y1, xd0, yd1), GradCoord(seed, x1, y1, xd1, yd1), xs); + + return Lerp(xf0, xf1, ys) * 1.4247691104677813f; + } + + // Simplex/OpenSimplex2 Noise + private double SinglePerlin(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + int x0 = FastFloor(x); + int y0 = FastFloor(y); + int z0 = FastFloor(z); + + double xd0 = x - x0; + double yd0 = y - y0; + double zd0 = z - z0; + double xd1 = xd0 - 1; + double yd1 = yd0 - 1; + double zd1 = zd0 - 1; + + double xs = InterpQuintic(xd0); + double ys = InterpQuintic(yd0); + double zs = InterpQuintic(zd0); + + x0 *= PrimeX; + y0 *= PrimeY; + z0 *= PrimeZ; + int x1 = x0 + PrimeX; + int y1 = y0 + PrimeY; + int z1 = z0 + PrimeZ; + + double xf00 = Lerp(GradCoord(seed, x0, y0, z0, xd0, yd0, zd0), GradCoord(seed, x1, y0, z0, xd1, yd0, zd0), xs); + double xf10 = Lerp(GradCoord(seed, x0, y1, z0, xd0, yd1, zd0), GradCoord(seed, x1, y1, z0, xd1, yd1, zd0), xs); + double xf01 = Lerp(GradCoord(seed, x0, y0, z1, xd0, yd0, zd1), GradCoord(seed, x1, y0, z1, xd1, yd0, zd1), xs); + double xf11 = Lerp(GradCoord(seed, x0, y1, z1, xd0, yd1, zd1), GradCoord(seed, x1, y1, z1, xd1, yd1, zd1), xs); + + double yf0 = Lerp(xf00, xf10, ys); + double yf1 = Lerp(xf01, xf11, ys); + + return Lerp(yf0, yf1, zs) * 0.964921414852142333984375f; + } + + private double SingleValueCubic(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y) { + int x1 = FastFloor(x); + int y1 = FastFloor(y); + + double xs = x - x1; + double ys = y - y1; + + x1 *= PrimeX; + y1 *= PrimeY; + int x0 = x1 - PrimeX; + int y0 = y1 - PrimeY; + int x2 = x1 + PrimeX; + int y2 = y1 + PrimeY; + int x3 = x1 + (PrimeX << 1); + int y3 = y1 + (PrimeY << 1); + + return CubicLerp( + CubicLerp(ValCoord(seed, x0, y0), ValCoord(seed, x1, y0), ValCoord(seed, x2, y0), ValCoord(seed, x3, y0), + xs), + CubicLerp(ValCoord(seed, x0, y1), ValCoord(seed, x1, y1), ValCoord(seed, x2, y1), ValCoord(seed, x3, y1), + xs), + CubicLerp(ValCoord(seed, x0, y2), ValCoord(seed, x1, y2), ValCoord(seed, x2, y2), ValCoord(seed, x3, y2), + xs), + CubicLerp(ValCoord(seed, x0, y3), ValCoord(seed, x1, y3), ValCoord(seed, x2, y3), ValCoord(seed, x3, y3), + xs), + ys) * (1 / (1.5f * 1.5f)); + } + + // OpenSimplex2S Noise + private double SingleValueCubic(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + int x1 = FastFloor(x); + int y1 = FastFloor(y); + int z1 = FastFloor(z); + + double xs = x - x1; + double ys = y - y1; + double zs = z - z1; + + x1 *= PrimeX; + y1 *= PrimeY; + z1 *= PrimeZ; + + int x0 = x1 - PrimeX; + int y0 = y1 - PrimeY; + int z0 = z1 - PrimeZ; + int x2 = x1 + PrimeX; + int y2 = y1 + PrimeY; + int z2 = z1 + PrimeZ; + int x3 = x1 + (PrimeX << 1); + int y3 = y1 + (PrimeY << 1); + int z3 = z1 + (PrimeZ << 1); + + return CubicLerp( + CubicLerp( + CubicLerp(ValCoord(seed, x0, y0, z0), ValCoord(seed, x1, y0, z0), ValCoord(seed, x2, y0, z0), + ValCoord(seed, x3, y0, z0), xs), + CubicLerp(ValCoord(seed, x0, y1, z0), ValCoord(seed, x1, y1, z0), ValCoord(seed, x2, y1, z0), + ValCoord(seed, x3, y1, z0), xs), + CubicLerp(ValCoord(seed, x0, y2, z0), ValCoord(seed, x1, y2, z0), ValCoord(seed, x2, y2, z0), + ValCoord(seed, x3, y2, z0), xs), + CubicLerp(ValCoord(seed, x0, y3, z0), ValCoord(seed, x1, y3, z0), ValCoord(seed, x2, y3, z0), + ValCoord(seed, x3, y3, z0), xs), + ys), + CubicLerp( + CubicLerp(ValCoord(seed, x0, y0, z1), ValCoord(seed, x1, y0, z1), ValCoord(seed, x2, y0, z1), + ValCoord(seed, x3, y0, z1), xs), + CubicLerp(ValCoord(seed, x0, y1, z1), ValCoord(seed, x1, y1, z1), ValCoord(seed, x2, y1, z1), + ValCoord(seed, x3, y1, z1), xs), + CubicLerp(ValCoord(seed, x0, y2, z1), ValCoord(seed, x1, y2, z1), ValCoord(seed, x2, y2, z1), + ValCoord(seed, x3, y2, z1), xs), + CubicLerp(ValCoord(seed, x0, y3, z1), ValCoord(seed, x1, y3, z1), ValCoord(seed, x2, y3, z1), + ValCoord(seed, x3, y3, z1), xs), + ys), + CubicLerp( + CubicLerp(ValCoord(seed, x0, y0, z2), ValCoord(seed, x1, y0, z2), ValCoord(seed, x2, y0, z2), + ValCoord(seed, x3, y0, z2), xs), + CubicLerp(ValCoord(seed, x0, y1, z2), ValCoord(seed, x1, y1, z2), ValCoord(seed, x2, y1, z2), + ValCoord(seed, x3, y1, z2), xs), + CubicLerp(ValCoord(seed, x0, y2, z2), ValCoord(seed, x1, y2, z2), ValCoord(seed, x2, y2, z2), + ValCoord(seed, x3, y2, z2), xs), + CubicLerp(ValCoord(seed, x0, y3, z2), ValCoord(seed, x1, y3, z2), ValCoord(seed, x2, y3, z2), + ValCoord(seed, x3, y3, z2), xs), + ys), + CubicLerp( + CubicLerp(ValCoord(seed, x0, y0, z3), ValCoord(seed, x1, y0, z3), ValCoord(seed, x2, y0, z3), + ValCoord(seed, x3, y0, z3), xs), + CubicLerp(ValCoord(seed, x0, y1, z3), ValCoord(seed, x1, y1, z3), ValCoord(seed, x2, y1, z3), + ValCoord(seed, x3, y1, z3), xs), + CubicLerp(ValCoord(seed, x0, y2, z3), ValCoord(seed, x1, y2, z3), ValCoord(seed, x2, y2, z3), + ValCoord(seed, x3, y2, z3), xs), + CubicLerp(ValCoord(seed, x0, y3, z3), ValCoord(seed, x1, y3, z3), ValCoord(seed, x2, y3, z3), + ValCoord(seed, x3, y3, z3), xs), + ys), + zs) * (1 / (1.5f * 1.5f * 1.5f)); + } + + private double SingleValue(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y) { + int x0 = FastFloor(x); + int y0 = FastFloor(y); + + double xs = InterpHermite(x - x0); + double ys = InterpHermite(y - y0); + + x0 *= PrimeX; + y0 *= PrimeY; + int x1 = x0 + PrimeX; + int y1 = y0 + PrimeY; + + double xf0 = Lerp(ValCoord(seed, x0, y0), ValCoord(seed, x1, y0), xs); + double xf1 = Lerp(ValCoord(seed, x0, y1), ValCoord(seed, x1, y1), xs); + + return Lerp(xf0, xf1, ys); + } + + // Cellular Noise + private double SingleValue(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + int x0 = FastFloor(x); + int y0 = FastFloor(y); + int z0 = FastFloor(z); + + double xs = InterpHermite(x - x0); + double ys = InterpHermite(y - y0); + double zs = InterpHermite(z - z0); + + x0 *= PrimeX; + y0 *= PrimeY; + z0 *= PrimeZ; + int x1 = x0 + PrimeX; + int y1 = y0 + PrimeY; + int z1 = z0 + PrimeZ; + + double xf00 = Lerp(ValCoord(seed, x0, y0, z0), ValCoord(seed, x1, y0, z0), xs); + double xf10 = Lerp(ValCoord(seed, x0, y1, z0), ValCoord(seed, x1, y1, z0), xs); + double xf01 = Lerp(ValCoord(seed, x0, y0, z1), ValCoord(seed, x1, y0, z1), xs); + double xf11 = Lerp(ValCoord(seed, x0, y1, z1), ValCoord(seed, x1, y1, z1), xs); + + double yf0 = Lerp(xf00, xf10, ys); + double yf1 = Lerp(xf01, xf11, ys); + + return Lerp(yf0, yf1, zs); + } + + private void DoSingleDomainWarp(int seed, double amp, double freq, /*FNLdouble*/ double x, /*FNLdouble*/ double y, Vector2 coord) { + switch (mDomainWarpType) { + case OpenSimplex2: + SingleDomainWarpSimplexGradient(seed, amp * 38.283687591552734375f, freq, x, y, coord, false); + break; + case OpenSimplex2Reduced: + SingleDomainWarpSimplexGradient(seed, amp * 16.0f, freq, x, y, coord, true); + break; + case BasicGrid: + SingleDomainWarpBasicGrid(seed, amp, freq, x, y, coord); + break; + } + } + + // Perlin Noise + private void DoSingleDomainWarp(int seed, double amp, double freq, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ + double z, + Vector3 coord) { + switch (mDomainWarpType) { + case OpenSimplex2: + SingleDomainWarpOpenSimplex2Gradient(seed, amp * 32.69428253173828125f, freq, x, y, z, coord, false); + break; + case OpenSimplex2Reduced: + SingleDomainWarpOpenSimplex2Gradient(seed, amp * 7.71604938271605f, freq, x, y, z, coord, true); + break; + case BasicGrid: + SingleDomainWarpBasicGrid(seed, amp, freq, x, y, z, coord); + break; + } + } + + private void DomainWarpSingle(Vector2 coord) { + int seed = mSeed; + double amp = mDomainWarpAmp * mFractalBounding; + double freq = mFrequency; + + /*FNLdouble*/ + double xs = coord.x; + /*FNLdouble*/ + double ys = coord.y; + switch (mDomainWarpType) { + case OpenSimplex2: + case OpenSimplex2Reduced: { + /*FNLdouble*/ + final /*FNLdouble*/ double SQRT3 = 1.7320508075688772935274463415059; + final /*FNLdouble*/ double F2 = 0.5f * (SQRT3 - 1); + /*FNLdouble*/ + double t = (xs + ys) * F2; + xs += t; + ys += t; + } + break; + default: + break; + } + + DoSingleDomainWarp(seed, amp, freq, xs, ys, coord); + } + + // Value Cubic Noise + private void DomainWarpSingle(Vector3 coord) { + int seed = mSeed; + double amp = mDomainWarpAmp * mFractalBounding; + double freq = mFrequency; + + /*FNLdouble*/ + double xs = coord.x; + /*FNLdouble*/ + double ys = coord.y; + /*FNLdouble*/ + double zs = coord.z; + switch (mWarpTransformType3D) { + case ImproveXYPlanes: { + /*FNLdouble*/ + double xy = xs + ys; + /*FNLdouble*/ + double s2 = xy * -(/*FNLdouble*/ double) 0.211324865405187; + /*FNLdouble*/ + zs *= 0.577350269189626; + xs += s2 - zs; + ys = ys + s2 - zs; + /*FNLdouble*/ + zs += xy * 0.577350269189626; + } + break; + case ImproveXZPlanes: { + /*FNLdouble*/ + double xz = xs + zs; + /*FNLdouble*/ + double s2 = xz * -(/*FNLdouble*/ double) 0.211324865405187; + /*FNLdouble*/ + ys *= 0.577350269189626; + xs += s2 - ys; + zs += s2 - ys; + /*FNLdouble*/ + ys += xz * 0.577350269189626; + } + break; + case DefaultOpenSimplex2: { + /*FNLdouble*/ + final /*FNLdouble*/ double R3 = 2.0 / 3.0; + /*FNLdouble*/ + double r = (xs + ys + zs) * R3; // Rotation, not skew + xs = r - xs; + ys = r - ys; + zs = r - zs; + } + break; + default: + break; + } + + DoSingleDomainWarp(seed, amp, freq, xs, ys, zs, coord); + } + + private void DomainWarpFractalProgressive(Vector2 coord) { + int seed = mSeed; + double amp = mDomainWarpAmp * mFractalBounding; + double freq = mFrequency; + + for (int i = 0; i < mOctaves; i++) { + /*FNLdouble*/ + double xs = coord.x; + /*FNLdouble*/ + double ys = coord.y; + switch (mDomainWarpType) { + case OpenSimplex2: + case OpenSimplex2Reduced: { + /*FNLdouble*/ + final /*FNLdouble*/ double SQRT3 = 1.7320508075688772935274463415059; + final /*FNLdouble*/ double F2 = 0.5f * (SQRT3 - 1); + /*FNLdouble*/ + double t = (xs + ys) * F2; + xs += t; + ys += t; + } + break; + default: + break; + } + + DoSingleDomainWarp(seed, amp, freq, xs, ys, coord); + + seed++; + amp *= mGain; + freq *= mLacunarity; + } + } + + // Value Noise + private void DomainWarpFractalProgressive(Vector3 coord) { + int seed = mSeed; + double amp = mDomainWarpAmp * mFractalBounding; + double freq = mFrequency; + + for (int i = 0; i < mOctaves; i++) { + /*FNLdouble*/ + double xs = coord.x; + /*FNLdouble*/ + double ys = coord.y; + /*FNLdouble*/ + double zs = coord.z; + switch (mWarpTransformType3D) { + case ImproveXYPlanes: { + /*FNLdouble*/ + double xy = xs + ys; + /*FNLdouble*/ + double s2 = xy * -(/*FNLdouble*/ double) 0.211324865405187; + /*FNLdouble*/ + zs *= 0.577350269189626; + xs += s2 - zs; + ys = ys + s2 - zs; + /*FNLdouble*/ + zs += xy * 0.577350269189626; + } + break; + case ImproveXZPlanes: { + /*FNLdouble*/ + double xz = xs + zs; + /*FNLdouble*/ + double s2 = xz * -(/*FNLdouble*/ double) 0.211324865405187; + /*FNLdouble*/ + ys *= 0.577350269189626; + xs += s2 - ys; + zs += s2 - ys; + /*FNLdouble*/ + ys += xz * 0.577350269189626; + } + break; + case DefaultOpenSimplex2: { + /*FNLdouble*/ + final /*FNLdouble*/ double R3 = 2.0 / 3.0; + /*FNLdouble*/ + double r = (xs + ys + zs) * R3; // Rotation, not skew + xs = r - xs; + ys = r - ys; + zs = r - zs; + } + break; + default: + break; + } + + DoSingleDomainWarp(seed, amp, freq, xs, ys, zs, coord); + + seed++; + amp *= mGain; + freq *= mLacunarity; + } + } + + // Domain Warp Fractal Independant + private void DomainWarpFractalIndependent(Vector2 coord) { + /*FNLdouble*/ + double xs = coord.x; + /*FNLdouble*/ + double ys = coord.y; + switch (mDomainWarpType) { + case OpenSimplex2: + case OpenSimplex2Reduced: { + /*FNLdouble*/ + final /*FNLdouble*/ double SQRT3 = 1.7320508075688772935274463415059; + final /*FNLdouble*/ double F2 = 0.5f * (SQRT3 - 1); + /*FNLdouble*/ + double t = (xs + ys) * F2; + xs += t; + ys += t; + } + break; + default: + break; + } + + int seed = mSeed; + double amp = mDomainWarpAmp * mFractalBounding; + double freq = mFrequency; + + for (int i = 0; i < mOctaves; i++) { + DoSingleDomainWarp(seed, amp, freq, xs, ys, coord); + + seed++; + amp *= mGain; + freq *= mLacunarity; + } + } + + // Domain Warp + private void DomainWarpFractalIndependent(Vector3 coord) { + /*FNLdouble*/ + double xs = coord.x; + /*FNLdouble*/ + double ys = coord.y; + /*FNLdouble*/ + double zs = coord.z; + switch (mWarpTransformType3D) { + case ImproveXYPlanes: { + /*FNLdouble*/ + double xy = xs + ys; + /*FNLdouble*/ + double s2 = xy * -(/*FNLdouble*/ double) 0.211324865405187; + /*FNLdouble*/ + zs *= 0.577350269189626; + xs += s2 - zs; + ys = ys + s2 - zs; + /*FNLdouble*/ + zs += xy * 0.577350269189626; + } + break; + case ImproveXZPlanes: { + /*FNLdouble*/ + double xz = xs + zs; + /*FNLdouble*/ + double s2 = xz * -(/*FNLdouble*/ double) 0.211324865405187; + /*FNLdouble*/ + ys *= 0.577350269189626; + xs += s2 - ys; + zs += s2 - ys; + /*FNLdouble*/ + ys += xz * 0.577350269189626; + } + break; + case DefaultOpenSimplex2: { + /*FNLdouble*/ + final /*FNLdouble*/ double R3 = 2.0 / 3.0; + /*FNLdouble*/ + double r = (xs + ys + zs) * R3; // Rotation, not skew + xs = r - xs; + ys = r - ys; + zs = r - zs; + } + break; + default: + break; + } + + int seed = mSeed; + double amp = mDomainWarpAmp * mFractalBounding; + double freq = mFrequency; + + for (int i = 0; i < mOctaves; i++) { + DoSingleDomainWarp(seed, amp, freq, xs, ys, zs, coord); + + seed++; + amp *= mGain; + freq *= mLacunarity; + } + } + + private void SingleDomainWarpBasicGrid(int seed, double warpAmp, double frequency, /*FNLdouble*/ double x, /*FNLdouble*/ double y, + Vector2 coord) { + /*FNLdouble*/ + double xf = x * frequency; + /*FNLdouble*/ + double yf = y * frequency; + + int x0 = FastFloor(xf); + int y0 = FastFloor(yf); + + double xs = InterpHermite(xf - x0); + double ys = InterpHermite(yf - y0); + + x0 *= PrimeX; + y0 *= PrimeY; + int x1 = x0 + PrimeX; + int y1 = y0 + PrimeY; + + int hash0 = Hash(seed, x0, y0) & (255 << 1); + int hash1 = Hash(seed, x1, y0) & (255 << 1); + + double lx0x = Lerp(RandVecs2D[hash0], RandVecs2D[hash1], xs); + double ly0x = Lerp(RandVecs2D[hash0 | 1], RandVecs2D[hash1 | 1], xs); + + hash0 = Hash(seed, x0, y1) & (255 << 1); + hash1 = Hash(seed, x1, y1) & (255 << 1); + + double lx1x = Lerp(RandVecs2D[hash0], RandVecs2D[hash1], xs); + double ly1x = Lerp(RandVecs2D[hash0 | 1], RandVecs2D[hash1 | 1], xs); + + coord.x += Lerp(lx0x, lx1x, ys) * warpAmp; + coord.y += Lerp(ly0x, ly1x, ys) * warpAmp; + } + + // Domain Warp Single Wrapper + private void SingleDomainWarpBasicGrid(int seed, double warpAmp, double frequency, /*FNLdouble*/ double x, /*FNLdouble*/ + double y, /*FNLdouble*/ double z, Vector3 coord) { + /*FNLdouble*/ + double xf = x * frequency; + /*FNLdouble*/ + double yf = y * frequency; + /*FNLdouble*/ + double zf = z * frequency; + + int x0 = FastFloor(xf); + int y0 = FastFloor(yf); + int z0 = FastFloor(zf); + + double xs = InterpHermite(xf - x0); + double ys = InterpHermite(yf - y0); + double zs = InterpHermite(zf - z0); + + x0 *= PrimeX; + y0 *= PrimeY; + z0 *= PrimeZ; + int x1 = x0 + PrimeX; + int y1 = y0 + PrimeY; + int z1 = z0 + PrimeZ; + + int hash0 = Hash(seed, x0, y0, z0) & (255 << 2); + int hash1 = Hash(seed, x1, y0, z0) & (255 << 2); + + double lx0x = Lerp(RandVecs3D[hash0], RandVecs3D[hash1], xs); + double ly0x = Lerp(RandVecs3D[hash0 | 1], RandVecs3D[hash1 | 1], xs); + double lz0x = Lerp(RandVecs3D[hash0 | 2], RandVecs3D[hash1 | 2], xs); + + hash0 = Hash(seed, x0, y1, z0) & (255 << 2); + hash1 = Hash(seed, x1, y1, z0) & (255 << 2); + + double lx1x = Lerp(RandVecs3D[hash0], RandVecs3D[hash1], xs); + double ly1x = Lerp(RandVecs3D[hash0 | 1], RandVecs3D[hash1 | 1], xs); + double lz1x = Lerp(RandVecs3D[hash0 | 2], RandVecs3D[hash1 | 2], xs); + + double lx0y = Lerp(lx0x, lx1x, ys); + double ly0y = Lerp(ly0x, ly1x, ys); + double lz0y = Lerp(lz0x, lz1x, ys); + + hash0 = Hash(seed, x0, y0, z1) & (255 << 2); + hash1 = Hash(seed, x1, y0, z1) & (255 << 2); + + lx0x = Lerp(RandVecs3D[hash0], RandVecs3D[hash1], xs); + ly0x = Lerp(RandVecs3D[hash0 | 1], RandVecs3D[hash1 | 1], xs); + lz0x = Lerp(RandVecs3D[hash0 | 2], RandVecs3D[hash1 | 2], xs); + + hash0 = Hash(seed, x0, y1, z1) & (255 << 2); + hash1 = Hash(seed, x1, y1, z1) & (255 << 2); + + lx1x = Lerp(RandVecs3D[hash0], RandVecs3D[hash1], xs); + ly1x = Lerp(RandVecs3D[hash0 | 1], RandVecs3D[hash1 | 1], xs); + lz1x = Lerp(RandVecs3D[hash0 | 2], RandVecs3D[hash1 | 2], xs); + + coord.x += Lerp(lx0y, Lerp(lx0x, lx1x, ys), zs) * warpAmp; + coord.y += Lerp(ly0y, Lerp(ly0x, ly1x, ys), zs) * warpAmp; + coord.z += Lerp(lz0y, Lerp(lz0x, lz1x, ys), zs) * warpAmp; + } + + // Domain Warp Simplex/OpenSimplex2 + private void SingleDomainWarpSimplexGradient(int seed, double warpAmp, double frequency, /*FNLdouble*/ double x, /*FNLdouble*/ double y, + Vector2 coord, boolean outGradOnly) { + final double SQRT3 = 1.7320508075688772935274463415059f; + final double G2 = (3 - SQRT3) / 6; + + x *= frequency; + y *= frequency; + + /* + * --- Skew moved to switch statements before fractal evaluation --- + * final FNLdouble F2 = 0.5f * (SQRT3 - 1); + * FNLdouble s = (x + y) * F2; + * x += s; y += s; + */ + + int i = FastFloor(x); + int j = FastFloor(y); + double xi = x - i; + double yi = y - j; + + double t = (xi + yi) * G2; + double x0 = xi - t; + double y0 = yi - t; + + i *= PrimeX; + j *= PrimeY; + + double vx, vy; + vx = vy = 0; + + double a = 0.5f - x0 * x0 - y0 * y0; + if (a > 0) { + double aaaa = (a * a) * (a * a); + double xo, yo; + if (outGradOnly) { + int hash = Hash(seed, i, j) & (255 << 1); + xo = RandVecs2D[hash]; + yo = RandVecs2D[hash | 1]; + } else { + int hash = Hash(seed, i, j); + int index1 = hash & (127 << 1); + int index2 = (hash >> 7) & (255 << 1); + double xg = Gradients2D[index1]; + double yg = Gradients2D[index1 | 1]; + double value = x0 * xg + y0 * yg; + double xgo = RandVecs2D[index2]; + double ygo = RandVecs2D[index2 | 1]; + xo = value * xgo; + yo = value * ygo; + } + vx += aaaa * xo; + vy += aaaa * yo; + } + + double c = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); + if (c > 0) { + double x2 = x0 + (2 * G2 - 1); + double y2 = y0 + (2 * G2 - 1); + double cccc = (c * c) * (c * c); + double xo, yo; + if (outGradOnly) { + int hash = Hash(seed, i + PrimeX, j + PrimeY) & (255 << 1); + xo = RandVecs2D[hash]; + yo = RandVecs2D[hash | 1]; + } else { + int hash = Hash(seed, i + PrimeX, j + PrimeY); + int index1 = hash & (127 << 1); + int index2 = (hash >> 7) & (255 << 1); + double xg = Gradients2D[index1]; + double yg = Gradients2D[index1 | 1]; + double value = x2 * xg + y2 * yg; + double xgo = RandVecs2D[index2]; + double ygo = RandVecs2D[index2 | 1]; + xo = value * xgo; + yo = value * ygo; + } + vx += cccc * xo; + vy += cccc * yo; + } + + if (y0 > x0) { + double x1 = x0 + G2; + double y1 = y0 + (G2 - 1); + double b = 0.5f - x1 * x1 - y1 * y1; + if (b > 0) { + double bbbb = (b * b) * (b * b); + double xo, yo; + if (outGradOnly) { + int hash = Hash(seed, i, j + PrimeY) & (255 << 1); + xo = RandVecs2D[hash]; + yo = RandVecs2D[hash | 1]; + } else { + int hash = Hash(seed, i, j + PrimeY); + int index1 = hash & (127 << 1); + int index2 = (hash >> 7) & (255 << 1); + double xg = Gradients2D[index1]; + double yg = Gradients2D[index1 | 1]; + double value = x1 * xg + y1 * yg; + double xgo = RandVecs2D[index2]; + double ygo = RandVecs2D[index2 | 1]; + xo = value * xgo; + yo = value * ygo; + } + vx += bbbb * xo; + vy += bbbb * yo; + } + } else { + double x1 = x0 + (G2 - 1); + double y1 = y0 + G2; + double b = 0.5f - x1 * x1 - y1 * y1; + if (b > 0) { + double bbbb = (b * b) * (b * b); + double xo, yo; + if (outGradOnly) { + int hash = Hash(seed, i + PrimeX, j) & (255 << 1); + xo = RandVecs2D[hash]; + yo = RandVecs2D[hash | 1]; + } else { + int hash = Hash(seed, i + PrimeX, j); + int index1 = hash & (127 << 1); + int index2 = (hash >> 7) & (255 << 1); + double xg = Gradients2D[index1]; + double yg = Gradients2D[index1 | 1]; + double value = x1 * xg + y1 * yg; + double xgo = RandVecs2D[index2]; + double ygo = RandVecs2D[index2 | 1]; + xo = value * xgo; + yo = value * ygo; + } + vx += bbbb * xo; + vy += bbbb * yo; + } + } + + coord.x += vx * warpAmp; + coord.y += vy * warpAmp; + } + + // Domain Warp Fractal Progressive + private void SingleDomainWarpOpenSimplex2Gradient(int seed, double warpAmp, double frequency, /*FNLdouble*/ double x, /*FNLdouble*/ + double y, /*FNLdouble*/ double z, Vector3 coord, boolean outGradOnly) { + x *= frequency; + y *= frequency; + z *= frequency; + + /* + * --- Rotation moved to switch statements before fractal evaluation --- + * final FNLdouble R3 = (FNLdouble)(2.0 / 3.0); + * FNLdouble r = (x + y + z) * R3; // Rotation, not skew + * x = r - x; y = r - y; z = r - z; + */ + + int i = FastRound(x); + int j = FastRound(y); + int k = FastRound(z); + double x0 = x - i; + double y0 = y - j; + double z0 = z - k; + + int xNSign = (int) (-x0 - 1.0f) | 1; + int yNSign = (int) (-y0 - 1.0f) | 1; + int zNSign = (int) (-z0 - 1.0f) | 1; + + double ax0 = xNSign * -x0; + double ay0 = yNSign * -y0; + double az0 = zNSign * -z0; + + i *= PrimeX; + j *= PrimeY; + k *= PrimeZ; + + double vx, vy, vz; + vx = vy = vz = 0; + + double a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); + for (int l = 0; ; l++) { + if (a > 0) { + double aaaa = (a * a) * (a * a); + double xo, yo, zo; + if (outGradOnly) { + int hash = Hash(seed, i, j, k) & (255 << 2); + xo = RandVecs3D[hash]; + yo = RandVecs3D[hash | 1]; + zo = RandVecs3D[hash | 2]; + } else { + int hash = Hash(seed, i, j, k); + int index1 = hash & (63 << 2); + int index2 = (hash >> 6) & (255 << 2); + double xg = Gradients3D[index1]; + double yg = Gradients3D[index1 | 1]; + double zg = Gradients3D[index1 | 2]; + double value = x0 * xg + y0 * yg + z0 * zg; + double xgo = RandVecs3D[index2]; + double ygo = RandVecs3D[index2 | 1]; + double zgo = RandVecs3D[index2 | 2]; + xo = value * xgo; + yo = value * ygo; + zo = value * zgo; + } + vx += aaaa * xo; + vy += aaaa * yo; + vz += aaaa * zo; + } + + double b = a; + int i1 = i; + int j1 = j; + int k1 = k; + double x1 = x0; + double y1 = y0; + double z1 = z0; + + if (ax0 >= ay0 && ax0 >= az0) { + x1 += xNSign; + b = b + ax0 + ax0; + i1 -= xNSign * PrimeX; + } else if (ay0 > ax0 && ay0 >= az0) { + y1 += yNSign; + b = b + ay0 + ay0; + j1 -= yNSign * PrimeY; + } else { + z1 += zNSign; + b = b + az0 + az0; + k1 -= zNSign * PrimeZ; + } + + if (b > 1) { + b -= 1; + double bbbb = (b * b) * (b * b); + double xo, yo, zo; + if (outGradOnly) { + int hash = Hash(seed, i1, j1, k1) & (255 << 2); + xo = RandVecs3D[hash]; + yo = RandVecs3D[hash | 1]; + zo = RandVecs3D[hash | 2]; + } else { + int hash = Hash(seed, i1, j1, k1); + int index1 = hash & (63 << 2); + int index2 = (hash >> 6) & (255 << 2); + double xg = Gradients3D[index1]; + double yg = Gradients3D[index1 | 1]; + double zg = Gradients3D[index1 | 2]; + double value = x1 * xg + y1 * yg + z1 * zg; + double xgo = RandVecs3D[index2]; + double ygo = RandVecs3D[index2 | 1]; + double zgo = RandVecs3D[index2 | 2]; + xo = value * xgo; + yo = value * ygo; + zo = value * zgo; + } + vx += bbbb * xo; + vy += bbbb * yo; + vz += bbbb * zo; + } + + if (l == 1) break; + + ax0 = 0.5f - ax0; + ay0 = 0.5f - ay0; + az0 = 0.5f - az0; + + x0 = xNSign * ax0; + y0 = yNSign * ay0; + z0 = zNSign * az0; + + a += (0.75f - ax0) - (ay0 + az0); + + i += (xNSign >> 1) & PrimeX; + j += (yNSign >> 1) & PrimeY; + k += (zNSign >> 1) & PrimeZ; + + xNSign = -xNSign; + yNSign = -yNSign; + zNSign = -zNSign; + + seed += 1293373; + } + + coord.x += vx * warpAmp; + coord.y += vy * warpAmp; + coord.z += vz * warpAmp; + } + + public enum NoiseType { + OpenSimplex2, + OpenSimplex2S, + Cellular, + Perlin, + ValueCubic, + Value + } + + + public enum RotationType3D { + None, + ImproveXYPlanes, + ImproveXZPlanes + } + + + public enum FractalType { + None, + FBm, + Ridged, + PingPong, + DomainWarpProgressive, + DomainWarpIndependent + } + + // Domain Warp Basic Grid + + + public enum CellularDistanceFunction { + Euclidean, + EuclideanSq, + Manhattan, + Hybrid + } + + + public enum CellularReturnType { + CellValue, + Distance, + Distance2, + Distance2Add, + Distance2Sub, + Distance2Mul, + Distance2Div, + NoiseLookup + } + + + public enum DomainWarpType { + OpenSimplex2, + OpenSimplex2Reduced, + BasicGrid + } + + + private enum TransformType3D { + None, + ImproveXYPlanes, + ImproveXZPlanes, + DefaultOpenSimplex2 + } + + + public static class Vector2 { + public /*FNLdouble*/ double x; + public /*FNLdouble*/ double y; + + public Vector2(/*FNLdouble*/ double x, /*FNLdouble*/ double y) { + this.x = x; + this.y = y; + } + } + + + public static class Vector3 { + public /*FNLdouble*/ double x; + public /*FNLdouble*/ double y; + public /*FNLdouble*/ double z; + + public Vector3(/*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + this.x = x; + this.y = y; + this.z = z; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator.java b/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator.java new file mode 100644 index 000000000..816db0aa8 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator.java @@ -0,0 +1,61 @@ +package com.dfsek.terra.api.gaea.math; + +import net.jafama.FastMath; + +/** + * Class for bilinear interpolation of values arranged on a unit square. + */ +public class Interpolator { + private final double v0, v1, v2, v3; + private final Type type; + + /** + * Constructs an interpolator with given values as vertices of a unit square. + * + * @param v0 - (0,0) + * @param v1 - (1,0) + * @param v2 - (0,1) + * @param v3 - (1,1) + */ + public Interpolator(double v0, double v1, double v2, double v3, Type type) { + this.v0 = v0; + this.v1 = v1; + this.v2 = v2; + this.v3 = v3; + this.type = type; + } + + /** + * 1D Linear interpolation between 2 points 1 unit apart. + * + * @param t - Distance from v0. Total distance between v0 and v1 is 1 unit. + * @param v0 - Value at v0. + * @param v1 - Value at v1. + * @return double - The interpolated value. + */ + public static double lerp(double t, double v0, double v1, Type type) { + switch(type) { + case LINEAR: return v0 + t * (v1 - v0); + case NEAREST_NEIGHBOR: return FastMath.abs(v0-t) > FastMath.abs(v1-t) ? v1 : v0; + default: throw new IllegalStateException(); + } + } + + /** + * 2D Bilinear interpolation between 4 points on a unit square. + * + * @param s - X value + * @param t - Z value + * @return double - The interpolated value. + */ + public double bilerp(double s, double t) { + double v01 = lerp(s, v0, v1, type); + double v23 = lerp(s, v2, v3, type); + double v = lerp(t, v01, v23, type); + return v; + } + + public enum Type { + LINEAR, NEAREST_NEIGHBOR + } +} \ No newline at end of file diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator3.java b/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator3.java new file mode 100644 index 000000000..9583d3634 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator3.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.api.gaea.math; + +/** + * Class for bilinear interpolation of values arranged on a unit square. + */ +public class Interpolator3 { + private final double _000, _100, _010, _110, _001, _101, _011, _111; + private final Interpolator.Type type; + + /** + * Constructs an interpolator with given values as vertices of a unit cube. + * * @param _000 The value at (t, u, v) = (0, 0, 0). + * * @param _100 The value at (t, u, v) = (1, 0, 0). + * * @param _010 The value at (t, u, v) = (0, 1, 0). + * * @param _110 The value at (t, u, v) = (1, 1, 0). + * * @param _001 The value at (t, u, v) = (0, 0, 1). + * * @param _101 The value at (t, u, v) = (1, 0, 1). + * * @param _011 The value at (t, u, v) = (0, 1, 1). + * * @param _111 The value at (t, u, v) = (1, 1, 1). + */ + public Interpolator3(double _000, double _100, + double _010, double _110, double _001, double _101, + double _011, double _111, Interpolator.Type type) { + this._000 = _000; + this._001 = _001; + this._010 = _010; + this._011 = _011; + this._100 = _100; + this._101 = _101; + this._110 = _110; + this._111 = _111; + this.type = type; + } + + public double trilerp(double x, double y, double z) { + Interpolator top = new Interpolator(_000, _010, _001, _011, type); + Interpolator bottom = new Interpolator(_100, _110, _101, _111, type); + return Interpolator.lerp(x, top.bilerp(y, z), bottom.bilerp(y, z), type); + } +} \ No newline at end of file diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/MathUtil.java b/src/main/java/com/dfsek/terra/api/gaea/math/MathUtil.java new file mode 100644 index 000000000..296f9be59 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/math/MathUtil.java @@ -0,0 +1,58 @@ +package com.dfsek.terra.api.gaea.math; + +import com.dfsek.terra.api.gaea.util.FastRandom; +import net.jafama.FastMath; + +import java.util.Random; + +/** + * Utility class for mathematical functions. + */ +public class MathUtil { + /** + * Gets the standard deviation of an array of doubles. + * + * @param numArray The array of numbers to calculate the standard deviation of. + * @return double - The standard deviation. + */ + public static double standardDeviation(double[] numArray) { + double sum = 0.0, standardDeviation = 0.0; + int length = numArray.length; + + for(double num : numArray) { + sum += num; + } + + double mean = sum / length; + + for(double num : numArray) { + standardDeviation += FastMath.pow(num - mean, 2); + } + + return FastMath.sqrt(standardDeviation / length); + } + + /** + * Gets the carver seed for a chunk. + * + * @param chunkX Chunk's X coordinate + * @param chunkZ Chunk's Z coordinate + * @param seed World seed + * @return long - The carver seed. + */ + public static long getCarverChunkSeed(int chunkX, int chunkZ, long seed) { + Random r = new FastRandom(seed); + return chunkX * r.nextLong() ^ chunkZ * r.nextLong() ^ seed; + } + + public static long hashToLong(String s) { + if(s == null) { + return 0; + } + long hash = 0; + for(char c : s.toCharArray()) { + hash = 31L * hash + c; + } + return hash; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java b/src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java new file mode 100644 index 000000000..2fd1db812 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java @@ -0,0 +1,49 @@ +package com.dfsek.terra.api.gaea.math; + +import com.dfsek.terra.api.gaea.biome.NormalizationUtil; + +import java.util.HashSet; +import java.util.Random; +import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; + +@SuppressWarnings("unchecked") +public class ProbabilityCollection { + private final Set cont = new HashSet<>(); + private Object[] array = new Object[0]; + private int size; + + public com.dfsek.terra.api.gaea.math.ProbabilityCollection add(E item, int probability) { + if(!cont.contains(item)) size++; + cont.add(item); + int oldLength = array.length; + Object[] newArray = new Object[array.length + probability]; + System.arraycopy(array, 0, newArray, 0, array.length); // Expand array. + array = newArray; + for(int i = oldLength; i < array.length; i++) array[i] = item; + return this; + } + + public E get() { + if(array.length == 0) return null; + return (E) array[ThreadLocalRandom.current().nextInt(array.length)]; + } + + public E get(Random r) { + if(array.length == 0) return null; + return (E) array[r.nextInt(array.length)]; + } + + public E get(FastNoiseLite n, double x, double z) { + if(array.length == 0) return null; + return (E) array[NormalizationUtil.normalize(n.getNoise(x, z), array.length, 1)]; + } + + public int getTotalProbability() { + return array.length; + } + + public int size() { + return size; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/Range.java b/src/main/java/com/dfsek/terra/api/gaea/math/Range.java new file mode 100644 index 000000000..a5f855716 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/math/Range.java @@ -0,0 +1,123 @@ +package com.dfsek.terra.api.gaea.math; + +import net.jafama.FastMath; +import org.jetbrains.annotations.NotNull; + +import java.util.Iterator; +import java.util.Random; + +public class Range implements Iterable { + private int min; + private int max; + + public Range(int min, int max) { + if(min > max) throw new IllegalArgumentException("Minimum must not be grater than maximum!"); + this.max = max; + this.min = min; + } + + public boolean isInRange(int test) { + return test >= min && test < max; + } + + public int getMax() { + return max; + } + + public com.dfsek.terra.api.gaea.math.Range setMax(int max) { + this.max = max; + return this; + } + + public int getMin() { + return min; + } + + public com.dfsek.terra.api.gaea.math.Range setMin(int min) { + this.min = min; + return this; + } + + public int getRange() { + return max - min; + } + + public com.dfsek.terra.api.gaea.math.Range multiply(int mult) { + min *= mult; + max *= mult; + return this; + } + + public com.dfsek.terra.api.gaea.math.Range reflect(int pt) { + return new com.dfsek.terra.api.gaea.math.Range(2 * pt - this.getMax(), 2 * pt - this.getMin()); + } + + public int get(Random r) { + return r.nextInt((max - min) + 1) + min; + } + + public com.dfsek.terra.api.gaea.math.Range intersects(com.dfsek.terra.api.gaea.math.Range other) { + try { + return new com.dfsek.terra.api.gaea.math.Range(FastMath.max(this.getMin(), other.getMin()), FastMath.min(this.getMax(), other.getMax())); + } catch(IllegalArgumentException e) { + return null; + } + } + + public com.dfsek.terra.api.gaea.math.Range add(int add) { + this.min += add; + this.max += add; + return this; + } + + public com.dfsek.terra.api.gaea.math.Range sub(int sub) { + this.min -= sub; + this.max -= sub; + return this; + } + + @Override + public String toString() { + return "Min: " + getMin() + ", Max:" + getMax(); + } + + @Override + public int hashCode() { + return min * 31 + max; + } + + @Override + public boolean equals(Object obj) { + if(! (obj instanceof com.dfsek.terra.api.gaea.math.Range)) return false; + com.dfsek.terra.api.gaea.math.Range other = (com.dfsek.terra.api.gaea.math.Range) obj; + return other.getMin() == this.getMin() && other.getMax() == this.getMax(); + } + + @NotNull + @Override + public Iterator iterator() { + return new RangeIterator(this); + } + + private static class RangeIterator implements Iterator { + private final com.dfsek.terra.api.gaea.math.Range m; + private Integer current; + + public RangeIterator(com.dfsek.terra.api.gaea.math.Range m) { + this.m = m; + current = m.getMin(); + } + + @Override + public boolean hasNext() { + return current < m.getMax(); + } + + @Override + public Integer next() { + current++; + return current - 1; + } + } +} + diff --git a/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java b/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java new file mode 100644 index 000000000..35ad222c7 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java @@ -0,0 +1,49 @@ +package com.dfsek.terra.api.gaea.population; + +import org.bukkit.Chunk; + +import java.io.Serializable; +import java.util.UUID; + +public class ChunkCoordinate implements Serializable { + public static final long serialVersionUID = 7102462856296750285L; + private final int x; + private final int z; + private final UUID worldID; + + public ChunkCoordinate(int x, int z, UUID worldID) { + this.x = x; + this.z = z; + this.worldID = worldID; + } + + public ChunkCoordinate(Chunk c) { + this.x = c.getX(); + this.z = c.getZ(); + this.worldID = c.getWorld().getUID(); + } + + public UUID getWorldID() { + return worldID; + } + + public int getX() { + return x; + } + + public int getZ() { + return z; + } + + @Override + public int hashCode() { + return x * 31 + z; + } + + @Override + public boolean equals(Object obj) { + if(! (obj instanceof com.dfsek.terra.api.gaea.population.ChunkCoordinate)) return false; + com.dfsek.terra.api.gaea.population.ChunkCoordinate other = (com.dfsek.terra.api.gaea.population.ChunkCoordinate) obj; + return other.getX() == x && other.getZ() == z; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/population/GaeaBlockPopulator.java b/src/main/java/com/dfsek/terra/api/gaea/population/GaeaBlockPopulator.java new file mode 100644 index 000000000..a074deca9 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/population/GaeaBlockPopulator.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.gaea.population; + +import org.bukkit.Chunk; +import org.bukkit.World; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + +public abstract class GaeaBlockPopulator { + public abstract void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk); +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java b/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java new file mode 100644 index 000000000..d17f1a850 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java @@ -0,0 +1,94 @@ +package com.dfsek.terra.api.gaea.population; + +import com.dfsek.terra.api.gaea.Gaea; +import com.dfsek.terra.api.gaea.profiler.ProfileFuture; +import com.dfsek.terra.api.gaea.profiler.WorldProfiler; +import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.gaea.util.SerializationUtil; +import org.bukkit.Chunk; +import org.bukkit.World; +import org.bukkit.generator.BlockPopulator; +import org.bukkit.plugin.java.JavaPlugin; +import org.jetbrains.annotations.NotNull; + +import java.io.File; +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Random; + +public class PopulationManager extends BlockPopulator { + private final List attachedPopulators = new GlueList<>(); + private final HashSet needsPop = new HashSet<>(); + private final JavaPlugin main; + private final Object popLock = new Object(); + private WorldProfiler profiler; + + public PopulationManager(JavaPlugin main) { + this.main = main; + } + + public void attach(GaeaBlockPopulator populator) { + this.attachedPopulators.add(populator); + } + + @Override + public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) { + try(ProfileFuture ignored = measure()) { + needsPop.add(new ChunkCoordinate(chunk)); + int x = chunk.getX(); + int z = chunk.getZ(); + if(main.isEnabled()) { + for(int xi = - 1; xi <= 1; xi++) { + for(int zi = - 1; zi <= 1; zi++) { + if(xi == 0 && zi == 0) continue; + if(world.isChunkGenerated(xi + x, zi + z)) checkNeighbors(xi + x, zi + z, world); + } + } + } + } + } + + private ProfileFuture measure() { + if(profiler != null) return profiler.measure("PopulationManagerTime"); + return null; + } + + public void attachProfiler(WorldProfiler p) { + this.profiler = p; + } + + @SuppressWarnings("unchecked") + public synchronized void saveBlocks(World w) throws IOException { + File f = new File(Gaea.getGaeaFolder(w), "chunks.bin"); + f.createNewFile(); + SerializationUtil.toFile((HashSet) needsPop.clone(), f); + } + + @SuppressWarnings("unchecked") + public synchronized void loadBlocks(World w) throws IOException, ClassNotFoundException { + File f = new File(Gaea.getGaeaFolder(w), "chunks.bin"); + needsPop.addAll((HashSet) SerializationUtil.fromFile(f)); + } + + + // Synchronize to prevent chunks from being queued for population multiple times. + public synchronized void checkNeighbors(int x, int z, World w) { + ChunkCoordinate c = new ChunkCoordinate(x, z, w.getUID()); + if(w.isChunkGenerated(x + 1, z) + && w.isChunkGenerated(x - 1, z) + && w.isChunkGenerated(x, z + 1) + && w.isChunkGenerated(x, z - 1) && needsPop.contains(c)) { + Random random = new FastRandom(w.getSeed()); + long xRand = (random.nextLong() / 2L << 1L) + 1L; + long zRand = (random.nextLong() / 2L << 1L) + 1L; + random.setSeed((long) x * xRand + (long) z * zRand ^ w.getSeed()); + Chunk currentChunk = w.getChunkAt(x, z); + for(GaeaBlockPopulator r : attachedPopulators) { + r.populate(w, random, currentChunk); + } + needsPop.remove(c); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/dfsek/terra/api/gaea/profiler/DataHolder.java b/src/main/java/com/dfsek/terra/api/gaea/profiler/DataHolder.java new file mode 100644 index 000000000..d6ef3f54d --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/profiler/DataHolder.java @@ -0,0 +1,45 @@ +package com.dfsek.terra.api.gaea.profiler; + +import net.jafama.FastMath; +import net.md_5.bungee.api.ChatColor; + +/** + * Class to hold a profiler data value. Contains formatting method to highlight value based on desired range. + */ +public class DataHolder { + private final long desired; + private final DataType type; + private final double desiredRangePercent; + + /** + * Constructs a DataHolder with a DataType and a desired value, including a percentage around the desired value considered acceptable + * + * @param type The type of data held in this instance. + * @param desired The desired value. This should be the average value of whatever is being measured. + * @param desiredRangePercent The percentage around the desired value to be considered acceptable. + */ + public DataHolder(DataType type, long desired, double desiredRangePercent) { + this.desired = desired; + this.type = type; + this.desiredRangePercent = desiredRangePercent; + } + + /** + * Returns a String, formatted with Bungee ChatColors.
+ * GREEN if the value is better than desired and outside of acceptable range.
+ * YELLOW if the value is better or worse than desired, and within acceptable range.
+ * RED if the value is worse than desired and outside of acceptable range.
+ * + * @param data The data to format. + * @return String - The formatted data. + */ + public String getFormattedData(long data) { + double range = desiredRangePercent * desired; + ChatColor color = ChatColor.YELLOW; + if(FastMath.abs(data - desired) > range) { + if(data > desired) color = type.getDesire().getHighColor(); + else color = type.getDesire().getLowColor(); + } + return color + type.getFormatted(data) + ChatColor.RESET; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/profiler/DataType.java b/src/main/java/com/dfsek/terra/api/gaea/profiler/DataType.java new file mode 100644 index 000000000..fe7a69204 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/profiler/DataType.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.api.gaea.profiler; + +import net.jafama.FastMath; + +public enum DataType { + PERIOD_MILLISECONDS(Desire.LOW, 1000000, "ms"), PERIOD_NANOSECONDS(Desire.LOW, 1, "ns"); + private final Desire desire; + private final long divisor; + private final String unit; + + DataType(Desire d, long divisor, String unit) { + this.desire = d; + this.divisor = divisor; + this.unit = unit; + } + + public String getFormatted(long value) { + return (double) FastMath.round(((double) value / divisor) * 100D) / 100D + unit; + } + + public Desire getDesire() { + return desire; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java b/src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java new file mode 100644 index 000000000..bde14d87f --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.api.gaea.profiler; + +import net.md_5.bungee.api.ChatColor; + +/** + * Enum to represent the "goal" of a value, whether it is desirable for the value to be high (e.g. Frequency), or low (e.g. Period) + */ +public enum Desire { + LOW(ChatColor.RED, ChatColor.GREEN), HIGH(ChatColor.GREEN, ChatColor.RED); + + private final ChatColor high; + private final ChatColor low; + + Desire(ChatColor high, ChatColor low) { + this.high = high; + this.low = low; + } + + /** + * Gets the color to display when the numerical value is higher than desired. + * + * @return ChatColor - color of the value. + */ + public ChatColor getHighColor() { + return high; + } + + /** + * Gets the color to display when the numerical value is lower than desired. + * + * @return ChatColor - color of the value. + */ + public ChatColor getLowColor() { + return low; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/profiler/Measurement.java b/src/main/java/com/dfsek/terra/api/gaea/profiler/Measurement.java new file mode 100644 index 000000000..1122f0aae --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/profiler/Measurement.java @@ -0,0 +1,94 @@ +package com.dfsek.terra.api.gaea.profiler; + +import com.dfsek.terra.api.gaea.math.MathUtil; +import com.dfsek.terra.api.gaea.util.GlueList; +import net.jafama.FastMath; +import org.bukkit.Bukkit; + +import java.math.BigInteger; +import java.util.List; + +/** + * Class to record and hold all data for a single type of measurement performed by the profiler. + */ +public class Measurement { + private final List measurements; + private final long desirable; + private final DataType type; + private long min = Long.MAX_VALUE; + private long max = Long.MIN_VALUE; + + /** + * Constructs a new Measurement with a desired value and DataType. + * + * @param desirable The desired value of the measurement. + * @param type The type of data the measurement is holding. + */ + public Measurement(long desirable, DataType type) { + this.desirable = desirable; + this.type = type; + measurements = new GlueList<>(); + } + + public void record(long value) { + max = FastMath.max(value, max); + min = FastMath.min(value, min); + if(value / 1000000 > 5000) Bukkit.getLogger().warning("Measurement took " + type.getFormatted(value)); + measurements.add(value); + } + + public int size() { + return measurements.size(); + } + + public ProfileFuture beginMeasurement() { + ProfileFuture future = new ProfileFuture(); + long current = System.nanoTime(); + future.thenRun(() -> record(System.nanoTime() - current)); + return future; + } + + public void reset() { + min = Long.MAX_VALUE; + max = Long.MIN_VALUE; + measurements.clear(); + } + + public DataHolder getDataHolder() { + return new DataHolder(type, desirable, 0.25); + } + + public long getMin() { + if(min == Long.MAX_VALUE) return 0; + return min; + } + + public long getMax() { + if(max == Long.MIN_VALUE) return 0; + return max; + } + + public long average() { + BigInteger running = new BigInteger("0"); + List mTemp = new GlueList<>(measurements); + for(Long l : mTemp) { + running = running.add(BigInteger.valueOf(l)); + } + if(measurements.size() == 0) return 0; + return running.divide(BigInteger.valueOf(measurements.size())).longValue(); + } + + public double getStdDev() { + List mTemp = new GlueList<>(measurements); + double[] vals = new double[mTemp.size()]; + for(int i = 0; i < mTemp.size(); i++) { + vals[i] = mTemp.get(i); + } + return MathUtil.standardDeviation(vals); + } + + public int entries() { + return measurements.size(); + } + +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/profiler/ProfileFuture.java b/src/main/java/com/dfsek/terra/api/gaea/profiler/ProfileFuture.java new file mode 100644 index 000000000..c23b9a9d6 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/profiler/ProfileFuture.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.api.gaea.profiler; + +import java.util.concurrent.CompletableFuture; + +public class ProfileFuture extends CompletableFuture implements AutoCloseable { + public ProfileFuture() { + super(); + } + + public boolean complete() { + return super.complete(true); + } + + @Override + public void close() { + this.complete(); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java b/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java new file mode 100644 index 000000000..eb45f26c5 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java @@ -0,0 +1,88 @@ +package com.dfsek.terra.api.gaea.profiler; + +import com.dfsek.terra.api.gaea.generation.GaeaChunkGenerator; +import com.google.common.collect.BiMap; +import com.google.common.collect.HashBiMap; +import net.jafama.FastMath; +import org.bukkit.ChatColor; +import org.bukkit.World; + +import java.util.Map; + +public class WorldProfiler { + private final BiMap measures = HashBiMap.create(); + private final World world; + private boolean isProfiling; + + public WorldProfiler(World w) { + if(! (w.getGenerator() instanceof GaeaChunkGenerator)) + throw new IllegalArgumentException("Attempted to instantiate profiler on non-Gaea managed world!"); + this.addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "TotalChunkGenTime") + .addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "ChunkBaseGenTime") + .addMeasurement(new Measurement(2000000, DataType.PERIOD_MILLISECONDS), "BiomeApplyTime") + .addMeasurement(new Measurement(2000000, DataType.PERIOD_MILLISECONDS), "PopulationManagerTime"); + isProfiling = false; + this.world = w; + ((GaeaChunkGenerator) w.getGenerator()).attachProfiler(this); + } + + public String getResultsFormatted() { + if(! isProfiling) return "Profiler is not currently running."; + StringBuilder result = new StringBuilder(ChatColor.GOLD + "Gaea World Profiler Results (Min / Avg / Max / Std Dev): \n"); + for(Map.Entry e : measures.entrySet()) { + result.append(ChatColor.GOLD) + .append(e.getKey()) + .append(": ") + .append(e.getValue().getDataHolder().getFormattedData(e.getValue().getMin())) + .append(ChatColor.GOLD) + .append(" / ") + .append(e.getValue().getDataHolder().getFormattedData(e.getValue().average())) + .append(ChatColor.GOLD) + .append(" / ") + .append(e.getValue().getDataHolder().getFormattedData(e.getValue().getMax())) + .append(ChatColor.GOLD) + .append(" / ") + .append(ChatColor.GREEN) + .append((double) FastMath.round((e.getValue().getStdDev() / 1000000) * 100D) / 100D) + .append("ms") + .append(ChatColor.GOLD).append(" (x").append(e.getValue().size()).append(")\n"); + } + return result.toString(); + } + + public void reset() { + for(Map.Entry e : measures.entrySet()) { + e.getValue().reset(); + } + } + + public com.dfsek.terra.api.gaea.profiler.WorldProfiler addMeasurement(Measurement m, String name) { + measures.put(name, m); + return this; + } + + public void setMeasurement(String id, long value) { + if(isProfiling) measures.get(id).record(value); + } + + public ProfileFuture measure(String id) { + if(isProfiling) return measures.get(id).beginMeasurement(); + else return null; + } + + public String getID(Measurement m) { + return measures.inverse().get(m); + } + + public boolean isProfiling() { + return isProfiling; + } + + public void setProfiling(boolean enabled) { + this.isProfiling = enabled; + } + + public World getWorld() { + return world; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/serial/MovedObjectInputStream.java b/src/main/java/com/dfsek/terra/api/gaea/serial/MovedObjectInputStream.java new file mode 100644 index 000000000..9297c4532 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/serial/MovedObjectInputStream.java @@ -0,0 +1,50 @@ +package com.dfsek.terra.api.gaea.serial; + +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectStreamClass; +import java.lang.reflect.Field; + +public class MovedObjectInputStream extends ObjectInputStream { + private final String oldNameSpace; + private final String newNameSpace; + + public MovedObjectInputStream(InputStream in, String oldNameSpace, String newNameSpace) throws IOException { + super(in); + this.oldNameSpace = oldNameSpace; + this.newNameSpace = newNameSpace; + } + + @Override + protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException { + ObjectStreamClass result = super.readClassDescriptor(); + try { + if (result.getName().contains(oldNameSpace)) { + String newClassName = result.getName().replace(oldNameSpace, newNameSpace); + Class localClass = Class.forName(newClassName); + + Field nameField = ObjectStreamClass.class.getDeclaredField("name"); + nameField.setAccessible(true); + nameField.set(result, newClassName); + + ObjectStreamClass localClassDescriptor = ObjectStreamClass.lookup(localClass); + Field suidField = ObjectStreamClass.class.getDeclaredField("suid"); + suidField.setAccessible(true); + suidField.set(result, localClassDescriptor.getSerialVersionUID()); + } + } catch(Exception e) { + throw new IOException("Exception when trying to replace namespace", e); + } + return result; + } + + @Override + protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { + if (desc.getName().contains(oldNameSpace)) { + String newClassName = desc.getName().replace(oldNameSpace, newNameSpace); + return Class.forName(newClassName); + } + return super.resolveClass(desc); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java new file mode 100644 index 000000000..77805b968 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java @@ -0,0 +1,101 @@ +package com.dfsek.terra.api.gaea.structures.loot; + +import com.dfsek.terra.api.gaea.structures.loot.functions.AmountFunction; +import com.dfsek.terra.api.gaea.structures.loot.functions.DamageFunction; +import com.dfsek.terra.api.gaea.structures.loot.functions.EnchantWithLevelsFunction; +import com.dfsek.terra.api.gaea.structures.loot.functions.Function; +import com.dfsek.terra.api.gaea.util.GlueList; +import net.jafama.FastMath; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.util.List; +import java.util.Random; + +/** + * Representation of a single item entry within a Loot Table pool. + */ +public class Entry { + private final Material item; + private final long weight; + private final List functions = new GlueList<>(); + + /** + * Instantiates an Entry from a JSON representation. + * + * @param entry The JSON Object to instantiate from. + */ + public Entry(JSONObject entry) { + + String id = entry.get("name").toString(); + this.item = Material.matchMaterial(id); + + long weight1; + try { + weight1 = (long) entry.get("weight"); + } catch(NullPointerException e) { + weight1 = 1; + } + + this.weight = weight1; + if(entry.containsKey("functions")) { + for(Object function : (JSONArray) entry.get("functions")) { + switch(((String) ((JSONObject) function).get("function"))) { + case "minecraft:set_count": + case "set_count": + Object loot = ((JSONObject) function).get("count"); + long max, min; + if(loot instanceof Long) { + max = (Long) loot; + min = (Long) loot; + } else { + max = (long) ((JSONObject) loot).get("max"); + min = (long) ((JSONObject) loot).get("min"); + } + functions.add(new AmountFunction(FastMath.toIntExact(min), FastMath.toIntExact(max))); + break; + case "minecraft:set_damage": + case "set_damage": + long maxDamage = (long) ((JSONObject) ((JSONObject) function).get("damage")).get("max"); + long minDamage = (long) ((JSONObject) ((JSONObject) function).get("damage")).get("min"); + functions.add(new DamageFunction(FastMath.toIntExact(minDamage), FastMath.toIntExact(maxDamage))); + break; + case "minecraft:enchant_with_levels": + case "enchant_with_levels": + long maxEnchant = (long) ((JSONObject) ((JSONObject) function).get("levels")).get("max"); + long minEnchant = (long) ((JSONObject) ((JSONObject) function).get("levels")).get("min"); + JSONArray disabled = null; + if(((JSONObject) function).containsKey("disabled_enchants")) + disabled = (JSONArray) ((JSONObject) function).get("disabled_enchants"); + functions.add(new EnchantWithLevelsFunction(FastMath.toIntExact(minEnchant), FastMath.toIntExact(maxEnchant), disabled)); + break; + } + } + } + } + + /** + * Fetches a single ItemStack from the Entry, applying all functions to it. + * + * @param r The Random instance to apply functions with + * @return ItemStack - The ItemStack with all functions applied. + */ + public ItemStack getItem(Random r) { + ItemStack item = new ItemStack(this.item, 1); + for(Function f : functions) { + item = f.apply(item, r); + } + return item; + } + + /** + * Gets the weight attribute of the Entry. + * + * @return long - The weight of the Entry. + */ + public long getWeight() { + return this.weight; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java new file mode 100644 index 000000000..facafff7b --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java @@ -0,0 +1,77 @@ +package com.dfsek.terra.api.gaea.structures.loot; + +import com.dfsek.terra.api.gaea.util.GlueList; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.ItemStack; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; + +import java.util.List; +import java.util.Random; + +/** + * Class representation of a Loot Table to populate chest loot. + */ +public class LootTable { + private final List pools = new GlueList<>(); + + /** + * Instantiates a LootTable from a JSON String. + * + * @param json The JSON String representing the loot table. + * @throws ParseException if malformed JSON is passed. + */ + public LootTable(String json) throws ParseException { + JSONParser jsonParser = new JSONParser(); + Object tableJSON = jsonParser.parse(json); + JSONArray poolArray = (JSONArray) ((JSONObject) tableJSON).get("pools"); + for(Object pool : poolArray) { + pools.add(new Pool((JSONObject) pool)); + } + } + + /** + * Fetches a list of ItemStacks from the loot table using the given Random instance. + * + * @param r The Random instance to use. + * @return List<ItemStack> - The list of loot fetched. + */ + public List getLoot(Random r) { + List itemList = new GlueList<>(); + for(Pool pool : pools) { + itemList.addAll(pool.getItems(r)); + } + return itemList; + } + + /** + * Fills an Inventory with loot. + * + * @param i The Inventory to fill. + * @param r The The Random instance to use. + */ + public void fillInventory(Inventory i, Random r) { + List loot = getLoot(r); + for(ItemStack stack : loot) { + int attempts = 0; + while(stack.getAmount() != 0 && attempts < 10) { + ItemStack newStack = stack.clone(); + newStack.setAmount(1); + int slot = r.nextInt(i.getSize()); + ItemStack slotItem = i.getItem(slot); + if(slotItem == null) { + i.setItem(slot, newStack); + stack.setAmount(stack.getAmount() - 1); + } else if(slotItem.getType() == newStack.getType()) { + ItemStack dep = newStack.clone(); + dep.setAmount(newStack.getAmount() + slotItem.getAmount()); + i.setItem(slot, dep); + stack.setAmount(stack.getAmount() - 1); + } + attempts++; + } + } + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java new file mode 100644 index 000000000..c7e698dde --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java @@ -0,0 +1,57 @@ +package com.dfsek.terra.api.gaea.structures.loot; + +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.util.GlueList; +import net.jafama.FastMath; +import org.bukkit.inventory.ItemStack; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import java.util.List; +import java.util.Random; + +/** + * Representation of a Loot Table pool, or a set of items to be fetched independently. + */ +public class Pool { + private final int max; + private final int min; + private final ProbabilityCollection entries = new ProbabilityCollection<>(); + + /** + * Instantiates a Pool from a JSON representation. + * + * @param pool The JSON Object to instantiate from. + */ + public Pool(JSONObject pool) { + Object amount = pool.get("rolls"); + if(amount instanceof Long) { + max = FastMath.toIntExact((Long) amount); + min = FastMath.toIntExact((Long) amount); + } else { + max = FastMath.toIntExact((Long) ((JSONObject) amount).get("max")); + min = FastMath.toIntExact((Long) ((JSONObject) amount).get("min")); + } + + for(Object entryJSON : (JSONArray) pool.get("entries")) { + Entry entry = new Entry((JSONObject) entryJSON); + entries.add(entry, FastMath.toIntExact(entry.getWeight())); + } + } + + /** + * Fetches a list of items from the pool using the provided Random instance. + * + * @param r The Random instance to use. + * @return List<ItemStack> - The list of items fetched. + */ + public List getItems(Random r) { + + int rolls = r.nextInt(max - min + 1) + min; + List items = new GlueList<>(); + for(int i = 0; i < rolls; i++) { + items.add(entries.get(r).getItem(r)); + } + return items; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java new file mode 100644 index 000000000..925a54bb7 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.api.gaea.structures.loot.functions; + +import org.bukkit.inventory.ItemStack; + +import java.util.Random; + +/** + * Loot Function fot setting the amount of an item. + */ +public class AmountFunction implements Function { + private final int max; + private final int min; + + /** + * Instantiates an AmountFunction. + * + * @param min Minimum amount. + * @param max Maximum amount. + */ + public AmountFunction(int min, int max) { + this.min = min; + this.max = max; + } + + /** + * Applies the function to an ItemStack. + * + * @param original The ItemStack on which to apply the function. + * @param r The Random instance to use. + * @return - ItemStack - The mutated ItemStack. + */ + @Override + public ItemStack apply(ItemStack original, Random r) { + original.setAmount(r.nextInt(max - min + 1) + min); + return original; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java new file mode 100644 index 000000000..4faa9766e --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.api.gaea.structures.loot.functions; + +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.Damageable; +import org.bukkit.inventory.meta.ItemMeta; + +import java.util.Random; + +/** + * Loot Function for setting the damage on items in Loot Tables + */ +public class DamageFunction implements Function { + private final int max; + private final int min; + + /** + * Instantiates a DamageFunction. + * + * @param min Minimum amount of damage (percentage, out of 100) + * @param max Maximum amount of damage (percentage, out of 100) + */ + public DamageFunction(int min, int max) { + this.min = min; + this.max = max; + } + + /** + * Applies the function to an ItemStack. + * + * @param original The ItemStack on which to apply the function. + * @param r The Random instance to use. + * @return - ItemStack - The mutated ItemStack. + */ + @Override + public ItemStack apply(ItemStack original, Random r) { + double itemDurability = (r.nextDouble() * (max - min)) + min; + Damageable damage = (Damageable) original.getItemMeta(); + damage.setDamage((int) (original.getType().getMaxDurability() - (itemDurability / 100) * original.getType().getMaxDurability())); + original.setItemMeta((ItemMeta) damage); + return original; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/EnchantWithLevelsFunction.java b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/EnchantWithLevelsFunction.java new file mode 100644 index 000000000..c79ee28cb --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/EnchantWithLevelsFunction.java @@ -0,0 +1,61 @@ +package com.dfsek.terra.api.gaea.structures.loot.functions; + +import com.dfsek.terra.api.gaea.util.GlueList; +import net.jafama.FastMath; +import org.bukkit.Bukkit; +import org.bukkit.enchantments.Enchantment; +import org.bukkit.inventory.ItemStack; +import org.json.simple.JSONArray; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +public class EnchantWithLevelsFunction implements Function { + private final int min; + private final int max; + private final JSONArray disabled; + + + public EnchantWithLevelsFunction(int min, int max, JSONArray disabled) { + this.max = max; + this.min = min; + this.disabled = disabled; + } + + /** + * Applies the function to an ItemStack. + * + * @param original The ItemStack on which to apply the function. + * @param r The Random instance to use. + * @return - ItemStack - The mutated ItemStack. + */ + @Override + public ItemStack apply(ItemStack original, Random r) { + double enchant = (r.nextDouble() * (max - min)) + min; + List possible = new GlueList<>(); + for(Enchantment ench : Enchantment.values()) { + if(ench.canEnchantItem(original) && (disabled == null || !this.disabled.contains(ench.getName()))) { + possible.add(ench); + } + } + int numEnchant = (r.nextInt((int) FastMath.abs(enchant)) / 10 + 1); + if(possible.size() >= numEnchant) { + Collections.shuffle(possible); + iter: + for(int i = 0; i < numEnchant; i++) { + Enchantment chosen = possible.get(i); + for(Enchantment ench : original.getEnchantments().keySet()) { + if(chosen.conflictsWith(ench)) continue iter; + } + int lvl = r.nextInt(1 + (int) (((enchant / 40 > 1) ? 1 : enchant / 40) * (chosen.getMaxLevel()))); + try { + original.addEnchantment(chosen, FastMath.max(lvl, 1)); + } catch(IllegalArgumentException e) { + Bukkit.getLogger().warning("[Gaea] Attempted to enchant " + original.getType() + " with " + chosen + " at level " + FastMath.max(lvl, 1) + ", but an unexpected exception occurred! Usually this is caused by a misbehaving enchantment plugin."); + } + } + } + return original; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java new file mode 100644 index 000000000..b58dc1b81 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.api.gaea.structures.loot.functions; + +import org.bukkit.inventory.ItemStack; + +import java.util.Random; + +/** + * Interface for mutating items in Loot Tables. + */ +public interface Function { + /** + * Applies the function to an ItemStack. + * + * @param original The ItemStack on which to apply the function. + * @param r The Random instance to use. + * @return - ItemStack - The mutated ItemStack. + */ + ItemStack apply(ItemStack original, Random r); +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/CustomTreeType.java b/src/main/java/com/dfsek/terra/api/gaea/tree/CustomTreeType.java new file mode 100755 index 000000000..429b7bd2f --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/CustomTreeType.java @@ -0,0 +1,66 @@ +package com.dfsek.terra.api.gaea.tree; + +import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import com.dfsek.terra.api.gaea.tree.fractal.TreeGetter; +import com.dfsek.terra.api.gaea.tree.fractal.trees.Cactus; +import com.dfsek.terra.api.gaea.tree.fractal.trees.IceSpike; +import com.dfsek.terra.api.gaea.tree.fractal.trees.OakTree; +import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredPillar; +import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredTree; +import com.dfsek.terra.api.gaea.tree.fractal.trees.SmallShatteredPillar; +import com.dfsek.terra.api.gaea.tree.fractal.trees.SmallShatteredTree; +import com.dfsek.terra.api.gaea.tree.fractal.trees.SpruceTree; +import org.bukkit.Location; + +import java.util.Random; + +public enum CustomTreeType implements TreeGetter { + SHATTERED_SMALL { + @Override + public FractalTree getTree(Location l, Random r) { + return new SmallShatteredTree(l, r); + } + }, + SHATTERED_LARGE { + @Override + public FractalTree getTree(Location l, Random r) { + return new ShatteredTree(l, r); + } + }, + GIANT_OAK { + @Override + public FractalTree getTree(Location l, Random r) { + return new OakTree(l, r); + } + }, + GIANT_SPRUCE { + @Override + public FractalTree getTree(Location l, Random r) { + return new SpruceTree(l, r); + } + }, + SMALL_SHATTERED_PILLAR { + @Override + public FractalTree getTree(Location l, Random r) { + return new SmallShatteredPillar(l, r); + } + }, + LARGE_SHATTERED_PILLAR { + @Override + public FractalTree getTree(Location l, Random r) { + return new ShatteredPillar(l, r); + } + }, + CACTUS { + @Override + public FractalTree getTree(Location l, Random r) { + return new Cactus(l, r); + } + }, + ICE_SPIKE { + @Override + public FractalTree getTree(Location l, Random r) { + return new IceSpike(l, r); + } + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java b/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java new file mode 100644 index 000000000..075fd58aa --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.api.gaea.tree; + +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.Random; +import java.util.Set; + +public interface Tree { + boolean plant(Location l, Random r, JavaPlugin main); + + Set getSpawnable(); +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java b/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java new file mode 100644 index 000000000..57117dec8 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java @@ -0,0 +1,105 @@ +package com.dfsek.terra.api.gaea.tree; + +import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import com.google.common.collect.Sets; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.plugin.java.JavaPlugin; + +import java.util.Collections; +import java.util.Random; +import java.util.Set; + +public enum TreeType implements Tree { + SHATTERED_SMALL(null, Collections.singleton(Material.END_STONE)), + SHATTERED_LARGE(null, Collections.singleton(Material.END_STONE)), + GIANT_OAK(null, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + GIANT_SPRUCE(null, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + SMALL_SHATTERED_PILLAR(null, Collections.singleton(Material.END_STONE)), + LARGE_SHATTERED_PILLAR(null, Collections.singleton(Material.END_STONE)), + CACTUS(null, Sets.newHashSet(Material.SAND, Material.RED_SAND)), + ICE_SPIKE(null, Sets.newHashSet(Material.SNOW_BLOCK, Material.SNOW, Material.STONE, Material.GRASS_BLOCK)), + OAK(org.bukkit.TreeType.TREE, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + LARGE_OAK(org.bukkit.TreeType.BIG_TREE, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + SPRUCE(org.bukkit.TreeType.REDWOOD, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + LARGE_SPRUCE(org.bukkit.TreeType.TALL_REDWOOD, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + MEGA_SPRUCE(org.bukkit.TreeType.MEGA_REDWOOD, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + BIRCH(org.bukkit.TreeType.BIRCH, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + CHORUS_PLANT(org.bukkit.TreeType.CHORUS_PLANT, Sets.newHashSet(Material.END_STONE)), + ACACIA(org.bukkit.TreeType.ACACIA, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + TALL_BIRCH(org.bukkit.TreeType.TALL_BIRCH, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + JUNGLE(org.bukkit.TreeType.JUNGLE, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + SMALL_JUNGLE(org.bukkit.TreeType.SMALL_JUNGLE, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + JUNGLE_COCOA(org.bukkit.TreeType.COCOA_TREE, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + JUNGLE_BUSH(org.bukkit.TreeType.JUNGLE_BUSH, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + DARK_OAK(org.bukkit.TreeType.DARK_OAK, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + BROWN_MUSHROOM(org.bukkit.TreeType.BROWN_MUSHROOM, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL, Material.MYCELIUM, Material.NETHERRACK, Material.CRIMSON_NYLIUM, Material.WARPED_NYLIUM)), + RED_MUSHROOM(org.bukkit.TreeType.RED_MUSHROOM, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL, Material.MYCELIUM, Material.NETHERRACK, Material.CRIMSON_NYLIUM, Material.WARPED_NYLIUM)), + SWAMP_OAK(org.bukkit.TreeType.SWAMP, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), + WARPED_FUNGUS(org.bukkit.TreeType.WARPED_FUNGUS, Collections.singleton(Material.WARPED_NYLIUM)), + CRIMSON_FUNGUS(org.bukkit.TreeType.CRIMSON_FUNGUS, Collections.singleton(Material.CRIMSON_NYLIUM)); + + private final org.bukkit.TreeType vanillaType; + private final Set spawnable; + + TreeType(org.bukkit.TreeType vanillaType, Set spawnable) { + this.vanillaType = vanillaType; + this.spawnable = spawnable; + } + + public static com.dfsek.terra.api.gaea.tree.TreeType fromBukkit(org.bukkit.TreeType type) { + switch(type) { + case TREE: return OAK; + case BIRCH: return BIRCH; + case ACACIA: return ACACIA; + case SWAMP: return SWAMP_OAK; + case JUNGLE: return JUNGLE; + case REDWOOD: return SPRUCE; + case BIG_TREE: return LARGE_OAK; + case DARK_OAK: return DARK_OAK; + case COCOA_TREE: return JUNGLE_COCOA; + case TALL_BIRCH: return TALL_BIRCH; + case JUNGLE_BUSH: return JUNGLE_BUSH; + case CHORUS_PLANT: return CHORUS_PLANT; + case MEGA_REDWOOD: return MEGA_SPRUCE; + case RED_MUSHROOM: return RED_MUSHROOM; + case SMALL_JUNGLE: return SMALL_JUNGLE; + case TALL_REDWOOD: return LARGE_SPRUCE; + case WARPED_FUNGUS: return WARPED_FUNGUS; + case BROWN_MUSHROOM: return BROWN_MUSHROOM; + case CRIMSON_FUNGUS: return CRIMSON_FUNGUS; + default: throw new IllegalArgumentException(); + } + } + + public boolean isCustom() { + return this.vanillaType == null; + } + + public org.bukkit.TreeType getVanillaTreeType() { + return vanillaType; + } + + public CustomTreeType getCustomTreeType() { + if(getVanillaTreeType() != null) return null; + return CustomTreeType.valueOf(this.toString()); + } + + public boolean plant(Location l, Random r, JavaPlugin main) { + if(this.getVanillaTreeType() == null) { + if(!spawnable.contains(l.subtract(0, 1, 0).getBlock().getType())) return false; + FractalTree tree = getCustomTreeType().getTree(l, r); + if(main.isEnabled()) co.aikar.taskchain.BukkitTaskChainFactory.create(main).newChain() + .async(tree::grow) + .sync(tree::plant) + .execute(); + return true; + } + return l.getWorld().generateTree(l, this.getVanillaTreeType()); + } + + @Override + public Set getSpawnable() { + return spawnable; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java new file mode 100644 index 000000000..45152a76d --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.api.gaea.tree.fractal; + +import org.bukkit.Location; +import org.bukkit.entity.Entity; +import org.bukkit.util.Consumer; + + +public class EntitySpawnHolder { + private final Location l; + private final Class e; + private final Consumer c; + + public EntitySpawnHolder(Location l, Class e, Consumer c) { + this.l = l; + this.e = e; + this.c = c; + } + + @SuppressWarnings("rawtypes") + public Class getEntity() { + return e; + } + + public Consumer getConsumer() { + return c; + } + + public Location getLocation() { + return l; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java new file mode 100644 index 000000000..4a83bb56a --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java @@ -0,0 +1,112 @@ +package com.dfsek.terra.api.gaea.tree.fractal; + +import com.dfsek.terra.api.gaea.util.GlueList; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.data.BlockData; +import org.bukkit.entity.Entity; +import org.bukkit.util.Consumer; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Random; + + +public abstract class FractalTree { + private final Map treeAssembler = new HashMap<>(); + private final List entities = new GlueList<>(); + private final Location origin; + private final Random random; + private final List replaceable = Arrays.asList(Material.AIR, Material.GRASS_BLOCK, Material.DIRT, Material.STONE, Material.COARSE_DIRT, Material.GRAVEL, Material.PODZOL, + Material.GRASS, Material.TALL_GRASS, Material.FERN, Material.POPPY, Material.LARGE_FERN, Material.BLUE_ORCHID, Material.AZURE_BLUET, Material.END_STONE, Material.SNOW, Material.SAND, Material.STONE_BUTTON, Material.DEAD_BUSH); + + + /** + * Instantiates a TreeGrower at an origin location. + * + * @param origin - The origin location. + * @param random - The random object to use whilst generating the tree. + */ + public FractalTree(Location origin, Random random) { + this.origin = origin.add(0, 1, 0); + this.random = random; + } + + /** + * Gets the raw tree map. + * + * @return HashMap<Location, BlockData> - The raw dictionary representation of the tree. + */ + public Map getTree() { + return treeAssembler; + } + + + /** + * Fetches the Random object used to generate the tree. + * + * @return Random - The Random object. + */ + public Random getRandom() { + return random; + } + + /** + * Fetches the origin location. + * + * @return Location - The origin location specified upon instantiation. + */ + public Location getOrigin() { + return origin; + } + + /** + * Sets a block in the tree's storage map to a material. + * + * @param l - The location to set. + * @param m - The material to which it will be set. + */ + public void setBlock(Location l, Material m) { + treeAssembler.put(l, m.createBlockData()); + } + + /** + * Grows the tree in memory. Intended to be invoked from an async thread. + */ + public abstract void grow(); + + /** + * Pastes the tree in the world. Must be invoked from main thread. + */ + @SuppressWarnings("unchecked") + public void plant() { + for(Map.Entry entry : treeAssembler.entrySet()) { + if(replaceable.contains(entry.getKey().getBlock().getType())) + entry.getKey().getBlock().setBlockData(entry.getValue(), false); + } + for(EntitySpawnHolder e : entities) { + Objects.requireNonNull(e.getLocation().getWorld()).spawn(e.getLocation(), e.getEntity(), e.getConsumer()); + } + } + + @SuppressWarnings("rawtypes, unchecked") + public void spawnEntity(Location spawn, Class clazz, Consumer consumer) { + entities.add(new EntitySpawnHolder(spawn, clazz, consumer)); + } + + /** + * Gets the material at the specified block. + * Returns air if no material has been set. + * + * @param l - The location at which to check. + * @return Material - The material at the specified block. + */ + public Material getMaterial(Location l) { + return treeAssembler.getOrDefault(l, Material.AIR.createBlockData()).getMaterial(); + } + + +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java new file mode 100644 index 000000000..03faa436a --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java @@ -0,0 +1,66 @@ +package com.dfsek.terra.api.gaea.tree.fractal; + +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.util.Vector; + +public class TreeGeometry { + private final FractalTree tree; + + public TreeGeometry(FractalTree tree) { + this.tree = tree; + } + + public static Vector getPerpendicular(Vector v) { + return v.getZ() < v.getX() ? new Vector(v.getY(), - v.getX(), 0) : new Vector(0, - v.getZ(), v.getY()); + } + + public FractalTree getTree() { + return tree; + } + + public void generateSphere(Location l, Material m, int radius, boolean overwrite) { + generateSphere(l, new ProbabilityCollection().add(m, 1), radius, overwrite); + } + + public void generateCylinder(Location l, Material m, int radius, int height, boolean overwrite) { + generateCylinder(l, new ProbabilityCollection().add(m, 1), radius, height, overwrite); + } + + public void generateSphere(Location l, ProbabilityCollection m, int radius, boolean overwrite) { + for(int x = - radius; x <= radius; x++) { + for(int y = - radius; y <= radius; y++) { + for(int z = - radius; z <= radius; z++) { + Vector position = l.toVector().clone().add(new Vector(x, y, z)); + if(l.toVector().distance(position) <= radius + 0.5 && (overwrite || tree.getMaterial(position.toLocation(l.getWorld())).isAir())) + tree.setBlock(position.toLocation(l.getWorld()), m.get()); + } + } + } + } + + public void generateSponge(Location l, ProbabilityCollection m, int radius, boolean overwrite, int sponginess) { + for(int x = - radius; x <= radius; x++) { + for(int y = - radius; y <= radius; y++) { + for(int z = - radius; z <= radius; z++) { + Vector position = l.toVector().clone().add(new Vector(x, y, z)); + if(tree.getRandom().nextInt(100) < sponginess && l.toVector().distance(position) <= radius + 0.5 && (overwrite || tree.getMaterial(position.toLocation(l.getWorld())).isAir())) + tree.setBlock(position.toLocation(l.getWorld()), m.get()); + } + } + } + } + + public void generateCylinder(Location l, ProbabilityCollection m, int radius, int height, boolean overwrite) { + for(int x = - radius; x <= radius; x++) { + for(int y = 0; y <= height; y++) { + for(int z = - radius; z <= radius; z++) { + Vector position = l.toVector().clone().add(new Vector(x, 0, z)); + if(l.toVector().distance(position) <= radius + 0.5 && (overwrite || tree.getMaterial(position.toLocation(l.getWorld())).isAir())) + tree.setBlock(position.toLocation(l.getWorld()), m.get()); + } + } + } + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGetter.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGetter.java new file mode 100644 index 000000000..c9f9621ce --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGetter.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.api.gaea.tree.fractal; + +import org.bukkit.Location; + +import java.util.Random; + +public interface TreeGetter { + FractalTree getTree(Location l, Random r); +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java new file mode 100644 index 000000000..e8936c58a --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.api.gaea.tree.fractal.trees; + +import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import org.bukkit.Location; +import org.bukkit.Material; + +import java.util.Random; + +public class Cactus extends FractalTree { + /** + * Instantiates a TreeGrower at an origin location. + * + * @param origin - The origin location. + * @param random - The random object to use whilst generating the tree. + */ + public Cactus(Location origin, Random random) { + super(origin, random); + } + + /** + * Grows the tree in memory. Intended to be invoked from an async thread. + */ + @Override + public void grow() { + int h = super.getRandom().nextInt(4) + 1; + for(int i = 0; i < h; i++) setBlock(super.getOrigin().clone().add(0, i, 0), Material.CACTUS); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java new file mode 100644 index 000000000..139725176 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java @@ -0,0 +1,47 @@ +package com.dfsek.terra.api.gaea.tree.fractal.trees; + +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.util.Vector; + +import java.util.Random; + + +public class IceSpike extends FractalTree { + private final TreeGeometry geo; + private static final ProbabilityCollection ice = new ProbabilityCollection().add(Material.PACKED_ICE, 95).add(Material.BLUE_ICE, 5); + + /** + * Instantiates a TreeGrower at an origin location. + * + * @param origin - The origin location. + * @param random - The random object to use whilst generating the tree. + */ + public IceSpike(Location origin, Random random) { + super(origin, random); + geo = new TreeGeometry(this); + } + + private double getOffset() { + return (getRandom().nextDouble() - 0.5D); + } + + /** + * Grows the tree in memory. Intended to be invoked from an async thread. + */ + @Override + public void grow() { + Vector direction = new Vector(getOffset(), 0, getOffset()); + Location l1 = super.getOrigin().clone(); + int h = super.getRandom().nextInt(16) + 8; + for(int i = 0; i < h; i++) { + geo.generateSponge(l1.clone().add(0, i, 0).add(direction.clone().multiply(i)), ice, (int) ((1 - ((double) i / h)) * 2 + 1), true, 80); + } + for(int i = 0; i < h/3; i++) { + setBlock(l1.clone().add(0, h + i, 0).add(direction.clone().multiply(h + i)), ice.get(super.getRandom())); + } + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java new file mode 100644 index 000000000..b6aca7a77 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java @@ -0,0 +1,59 @@ +package com.dfsek.terra.api.gaea.tree.fractal.trees; + +import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import net.jafama.FastMath; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.util.Vector; + +import java.util.Random; + + +public class OakTree extends FractalTree { + private final TreeGeometry geo; + + /** + * Instantiates a TreeGrower at an origin location. + * + * @param origin - The origin location. + * @param random - The random object to use whilst generating the tree. + */ + public OakTree(Location origin, Random random) { + super(origin, random); + geo = new TreeGeometry(this); + } + + /** + * Grows the tree in memory. Intended to be invoked from an async thread. + */ + @Override + public void grow() { + growBranch(super.getOrigin().clone(), new Vector(super.getRandom().nextInt(5) - 2, super.getRandom().nextInt(4) + 6, super.getRandom().nextInt(5) - 2), 2, 0); + } + + private void growBranch(Location l1, Vector diff, double d1, int recursions) { + if(recursions > 1) { + geo.generateSphere(l1, Material.OAK_LEAVES, 1 + super.getRandom().nextInt(2) + (3 - recursions), false); + if(recursions > 2) return; + } + if(diff.getY() < 0) diff.rotateAroundAxis(TreeGeometry.getPerpendicular(diff.clone()).normalize(), FastMath.PI); + int d = (int) diff.length(); + for(int i = 0; i < d; i++) { + geo.generateSphere(l1.clone().add(diff.clone().multiply((double) i / d)), Material.OAK_WOOD, FastMath.max((int) d1, 0), true); + } + double runningAngle = (double) 45 / (recursions + 1); + growBranch(l1.clone().add(diff), diff.clone().multiply(0.75).rotateAroundX(FastMath.toRadians(runningAngle + getNoise())).rotateAroundZ(FastMath.toRadians(getNoise())), + d1 - 1, recursions + 1); + growBranch(l1.clone().add(diff), diff.clone().multiply(0.75).rotateAroundX(FastMath.toRadians(- runningAngle + getNoise())).rotateAroundZ(FastMath.toRadians(getNoise())), + d1 - 1, recursions + 1); + growBranch(l1.clone().add(diff), diff.clone().multiply(0.75).rotateAroundZ(FastMath.toRadians(runningAngle + getNoise())).rotateAroundX(FastMath.toRadians(getNoise())), + d1 - 1, recursions + 1); + growBranch(l1.clone().add(diff), diff.clone().multiply(0.75).rotateAroundZ(FastMath.toRadians(- runningAngle + getNoise())).rotateAroundX(FastMath.toRadians(getNoise())), + d1 - 1, recursions + 1); + } + + private int getNoise() { + return super.getRandom().nextInt(60) - 30; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Rock.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Rock.java new file mode 100644 index 000000000..a8dbf1c31 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Rock.java @@ -0,0 +1,47 @@ +package com.dfsek.terra.api.gaea.tree.fractal.trees; + +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import org.bukkit.Location; +import org.bukkit.Material; + +import java.util.Random; + + +public class Rock extends FractalTree { + private final TreeGeometry geo; + private final FastNoiseLite noise; + private final FastNoiseLite rock; + private static final ProbabilityCollection ice = new ProbabilityCollection().add(Material.PACKED_ICE, 95).add(Material.BLUE_ICE, 5); + + /** + * Instantiates a TreeGrower at an origin location. + * + * @param origin - The origin location. + * @param random - The random object to use whilst generating the tree. + */ + public Rock(Location origin, Random random) { + super(origin, random); + int seed = origin.hashCode(); + this.noise = new FastNoiseLite(seed); + this.rock = new FastNoiseLite(++seed); + geo = new TreeGeometry(this); + } + + /** + * Grows the tree in memory. Intended to be invoked from an async thread. + */ + @Override + public void grow() { + Location l1 = super.getOrigin().clone(); + int h = super.getRandom().nextInt(16) + 8; + for(int i = 0; i < h; i++) { + geo.generateSponge(l1.clone().add(0, i, 0), ice, (int) ((1-((double) i / h))*2+1), true, 70); + } + for(int i = 0; i < h/3; i++) { + setBlock(l1.clone().add(0, h+i, 0), ice.get(super.getRandom())); + } + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java new file mode 100644 index 000000000..091a12a4d --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.api.gaea.tree.fractal.trees; + +import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.EnderCrystal; + +import java.util.Random; + +public class ShatteredPillar extends FractalTree { + /** + * Instantiates a TreeGrower at an origin location. + * + * @param origin - The origin location. + * @param random - The random object to use whilst generating the tree. + */ + public ShatteredPillar(Location origin, Random random) { + super(origin, random); + } + + /** + * Grows the tree in memory. Intended to be invoked from an async thread. + */ + @Override + public void grow() { + int h = super.getRandom().nextInt(5) + 8; + int max = h; + for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(0, i, 0), Material.OBSIDIAN); + h = h + (getRandom().nextBoolean() ? getRandom().nextInt(3) + 1 : - (getRandom().nextInt(3) + 1)); + int[] crystalLoc = new int[] {0, 0}; + if(h > max) { + max = h; + crystalLoc = new int[] {1, 0}; + } + for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(1, i, 0), Material.OBSIDIAN); + h = h + (getRandom().nextBoolean() ? getRandom().nextInt(3) + 1 : - (getRandom().nextInt(3) + 1)); + if(h > max) { + max = h; + crystalLoc = new int[] {0, 1}; + } + for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(0, i, 1), Material.OBSIDIAN); + h = h + (getRandom().nextBoolean() ? getRandom().nextInt(3) + 1 : - (getRandom().nextInt(3) + 1)); + if(h > max) { + max = h; + crystalLoc = new int[] {1, 1}; + } + for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(1, i, 1), Material.OBSIDIAN); + if(getRandom().nextInt(100) < 25) + spawnEntity(getOrigin().add(crystalLoc[0] + 0.5, max, crystalLoc[1] + 0.5), EnderCrystal.class, + enderCrystal -> ((EnderCrystal) enderCrystal).setShowingBottom(false)); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java new file mode 100644 index 000000000..5bab237c8 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java @@ -0,0 +1,66 @@ +package com.dfsek.terra.api.gaea.tree.fractal.trees; + +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import net.jafama.FastMath; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.util.Vector; + +import java.util.Random; + +public class ShatteredTree extends FractalTree { + private final TreeGeometry geo; + private final ProbabilityCollection bark = new ProbabilityCollection() + .add(Material.OBSIDIAN, 1) + .add(Material.BLACK_CONCRETE, 1); + private final ProbabilityCollection leaves = new ProbabilityCollection() + .add(Material.PURPLE_STAINED_GLASS, 1) + .add(Material.MAGENTA_STAINED_GLASS, 1); + + /** + * Instantiates a TreeGrower at an origin location. + * + * @param origin - The origin location. + * @param random - The random object to use whilst generating the tree. + */ + public ShatteredTree(Location origin, Random random) { + super(origin, random); + geo = new TreeGeometry(this); + } + + /** + * Grows the tree in memory. Intended to be invoked from an async thread. + */ + @Override + public void grow() { + growBranch(super.getOrigin().clone(), new Vector(super.getRandom().nextInt(5) - 2, super.getRandom().nextInt(4) + 6, super.getRandom().nextInt(5) - 2), 1, 0); + + } + + private void growBranch(Location l1, Vector diff, double d1, int recursions) { + if(recursions > 2) { + geo.generateSphere(l1, leaves, 1 + super.getRandom().nextInt(2), false); + return; + } + if(diff.getY() < 0) diff.rotateAroundAxis(TreeGeometry.getPerpendicular(diff.clone()).normalize(), FastMath.PI); + int d = (int) diff.length(); + for(int i = 0; i < d; i++) { + geo.generateSphere(l1.clone().add(diff.clone().multiply((double) i / d)), bark, FastMath.max((int) d1, 0), true); + } + double runningAngle = (double) 45 / (recursions + 1); + growBranch(l1.clone().add(diff), diff.clone().multiply(0.9).rotateAroundX(FastMath.toRadians(runningAngle + getNoise())).rotateAroundZ(FastMath.toRadians(getNoise())), + d1 - 1, recursions + 1); + growBranch(l1.clone().add(diff), diff.clone().multiply(0.9).rotateAroundX(FastMath.toRadians(- runningAngle + getNoise())).rotateAroundZ(FastMath.toRadians(getNoise())), + d1 - 1, recursions + 1); + growBranch(l1.clone().add(diff), diff.clone().multiply(0.9).rotateAroundZ(FastMath.toRadians(runningAngle + getNoise())).rotateAroundX(FastMath.toRadians(getNoise())), + d1 - 1, recursions + 1); + growBranch(l1.clone().add(diff), diff.clone().multiply(0.9).rotateAroundZ(FastMath.toRadians(- runningAngle + getNoise())).rotateAroundX(FastMath.toRadians(getNoise())), + d1 - 1, recursions + 1); + } + + private int getNoise() { + return super.getRandom().nextInt(90) - 45; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java new file mode 100644 index 000000000..56054adbb --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.api.gaea.tree.fractal.trees; + +import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import org.bukkit.Location; +import org.bukkit.Material; + +import java.util.Random; + +public class SmallShatteredPillar extends FractalTree { + /** + * Instantiates a TreeGrower at an origin location. + * + * @param origin - The origin location. + * @param random - The random object to use whilst generating the tree. + */ + public SmallShatteredPillar(Location origin, Random random) { + super(origin, random); + } + + /** + * Grows the tree in memory. Intended to be invoked from an async thread. + */ + @Override + public void grow() { + int h = super.getRandom().nextInt(5) + 5; + for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(0, i, 0), Material.OBSIDIAN); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java new file mode 100644 index 000000000..2c6f582ff --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java @@ -0,0 +1,66 @@ +package com.dfsek.terra.api.gaea.tree.fractal.trees; + +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import net.jafama.FastMath; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.util.Vector; + +import java.util.Random; + +public class SmallShatteredTree extends FractalTree { + private final TreeGeometry geo; + private final ProbabilityCollection bark = new ProbabilityCollection() + .add(Material.OBSIDIAN, 1) + .add(Material.BLACK_CONCRETE, 1); + private final ProbabilityCollection leaves = new ProbabilityCollection() + .add(Material.PURPLE_STAINED_GLASS, 1) + .add(Material.MAGENTA_STAINED_GLASS, 1); + + /** + * Instantiates a TreeGrower at an origin location. + * + * @param origin - The origin location. + * @param random - The random object to use whilst generating the tree. + */ + public SmallShatteredTree(Location origin, Random random) { + super(origin, random); + geo = new TreeGeometry(this); + } + + /** + * Grows the tree in memory. Intended to be invoked from an async thread. + */ + @Override + public void grow() { + growBranch(super.getOrigin().clone(), new Vector(super.getRandom().nextInt(5) - 2, super.getRandom().nextInt(3) + 4, super.getRandom().nextInt(5) - 2), 1.5, 0); + + } + + private void growBranch(Location l1, Vector diff, double d1, int recursions) { + if(recursions > 2) { + geo.generateSphere(l1, leaves, 1 + super.getRandom().nextInt(2) + (3 - recursions), false); + return; + } + if(diff.getY() < 0) diff.rotateAroundAxis(TreeGeometry.getPerpendicular(diff.clone()).normalize(), FastMath.PI); + int d = (int) diff.length(); + for(int i = 0; i < d; i++) { + geo.generateSphere(l1.clone().add(diff.clone().multiply((double) i / d)), bark, FastMath.max((int) d1, 0), true); + } + double runningAngle = (double) 45 / (recursions + 1); + growBranch(l1.clone().add(diff), diff.clone().multiply(0.7).rotateAroundX(FastMath.toRadians(runningAngle + getNoise())).rotateAroundZ(FastMath.toRadians(getNoise())), + d1 - 1, recursions + 1); + growBranch(l1.clone().add(diff), diff.clone().multiply(0.7).rotateAroundX(FastMath.toRadians(- runningAngle + getNoise())).rotateAroundZ(FastMath.toRadians(getNoise())), + d1 - 1, recursions + 1); + growBranch(l1.clone().add(diff), diff.clone().multiply(0.7).rotateAroundZ(FastMath.toRadians(runningAngle + getNoise())).rotateAroundX(FastMath.toRadians(getNoise())), + d1 - 1, recursions + 1); + growBranch(l1.clone().add(diff), diff.clone().multiply(0.7).rotateAroundZ(FastMath.toRadians(- runningAngle + getNoise())).rotateAroundX(FastMath.toRadians(getNoise())), + d1 - 1, recursions + 1); + } + + private int getNoise() { + return super.getRandom().nextInt(90) - 45; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java new file mode 100644 index 000000000..9eabfa86f --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java @@ -0,0 +1,46 @@ +package com.dfsek.terra.api.gaea.tree.fractal.trees; + +import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import net.jafama.FastMath; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.util.Vector; + +import java.util.Random; + +public class SpruceTree extends FractalTree { + private final TreeGeometry geo; + + /** + * Instantiates a TreeGrower at an origin location. + * + * @param origin - The origin location. + * @param random - The random object to use whilst generating the tree. + */ + public SpruceTree(Location origin, Random random) { + super(origin, random); + geo = new TreeGeometry(this); + } + + /** + * Grows the tree in memory. Intended to be invoked from an async thread. + */ + @Override + public void grow() { + growTrunk(super.getOrigin().clone(), new Vector(0, 16 + super.getRandom().nextInt(5), 0)); + } + + private void growTrunk(Location l1, Vector diff) { + if(diff.getY() < 0) diff.rotateAroundAxis(TreeGeometry.getPerpendicular(diff.clone()).normalize(), FastMath.PI); + int d = (int) diff.length(); + int rad = 7; + for(int i = 0; i < d; i++) { + geo.generateSphere(l1.clone().add(diff.clone().multiply((double) i / d)), Material.SPRUCE_WOOD, (int) ((i > d * 0.65) ? 0.5 : 1.5), true); + if(i > 3) + geo.generateCylinder(l1.clone().add(diff.clone().multiply((double) i / d)), Material.SPRUCE_LEAVES, (int) (((6 - (i % 4))) * (1.25 - ((double) i / d))), 1, false); + } + setBlock(l1.clone().add(diff), Material.SPRUCE_LEAVES); + setBlock(l1.clone().add(diff).add(0, 1, 0), Material.SPRUCE_LEAVES); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/util/FastRandom.java b/src/main/java/com/dfsek/terra/api/gaea/util/FastRandom.java new file mode 100644 index 000000000..5b6710e12 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/util/FastRandom.java @@ -0,0 +1,64 @@ +package com.dfsek.terra.api.gaea.util; + +import org.apache.commons.rng.core.source64.XoRoShiRo128PlusPlus; + +import java.util.Random; +import java.util.SplittableRandom; + +public class FastRandom extends Random { + + private XoRoShiRo128PlusPlus random; + + public FastRandom() { + super(); + SplittableRandom randomseed = new SplittableRandom(); + this.random = new XoRoShiRo128PlusPlus(randomseed.nextLong(), randomseed.nextLong()); + } + + public FastRandom(long seed) { + super(seed); + SplittableRandom randomseed = new SplittableRandom(seed); + this.random = new XoRoShiRo128PlusPlus(randomseed.nextLong(), randomseed.nextLong()); + } + + @Override + public boolean nextBoolean() { + return random.nextBoolean(); + } + + @Override + public int nextInt() { + return random.nextInt(); + } + + @Override + public float nextFloat() { + return (float) random.nextDouble(); + } + + @Override + public double nextDouble() { + return random.nextDouble(); + } + + @Override + public synchronized void setSeed(long seed) { + SplittableRandom randomseed = new SplittableRandom(seed); + this.random = new XoRoShiRo128PlusPlus(randomseed.nextLong(), randomseed.nextLong()); + } + + @Override + public void nextBytes(byte[] bytes) { + random.nextBytes(bytes); + } + + @Override + public int nextInt(int bound) { + return random.nextInt(bound); + } + + @Override + public long nextLong() { + return random.nextLong(); + } +} \ No newline at end of file diff --git a/src/main/java/com/dfsek/terra/api/gaea/util/GlueList.java b/src/main/java/com/dfsek/terra/api/gaea/util/GlueList.java new file mode 100644 index 000000000..80b2ef54d --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/util/GlueList.java @@ -0,0 +1,1048 @@ +/* + * Copyright 2015 Ertuğrul Çetin + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.dfsek.terra.api.gaea.util; + +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.ConcurrentModificationException; +import java.util.Iterator; +import java.util.LinkedList; +import java.util.List; +import java.util.ListIterator; +import java.util.NoSuchElementException; +import java.util.Objects; + +import static net.jafama.FastMath.*; + + +/** + * GlueList is a brand new List implementation which is way faster than ArrayList and LinkedList. + * This implementation inspired from ArrayList and LinkedList working mechanism. + *
+ * Nodes holding data in arrays, in the beginning the world just like ArrayList ,inserts data into array one by one when there is no space for insertion to array + * new Node will be created and linked with the last Node. + *
+ * The array which belongs to newly created node has half of the size of list , just like ArrayList. + * In ArrayList when there is no space for it it creates new array with double of old size and inserts old data into new one. + * Unlike ArrayList GlueList does it dynamically way with creating new node so old data does NOT have to be moved to another array. + * You can think that GlueList is dynamic version of ArrayList. + *
+ * Adding and removing operations much faster than ArrayList and LinkedList. + * Searching operations nearly same with ArrayList and way better than LinkedList. + *

+ * Best Case
+ * Add O(1)
+ * Remove O(1)
+ * Search O(1)
+ * Access O(1) + *

+ * "m" number of created nodes.
+ * "n" size of node array.
+ * If you insert 10_000_000 record into List there will be just 36 nodes.

+ * Worst Case
+ * Add O(n*m)
+ * Remove O(n*m)
+ * Search O(m)
+ * Access O(m) + * + * version v1.0 + * + * Date: 03.11.2015 + * + * + * @author Ertuğrul Çetin ~ ertu.ctn@gmail.com + * @see Collection + * @see List + * @see LinkedList + * @see ArrayList + * @param the type of elements held in this collection + */ +public class GlueList extends AbstractList implements List, Cloneable, Serializable { + + transient Node first; + transient Node last; + + int size; + + int initialCapacity; + + private static final int DEFAULT_CAPACITY = 10; + + private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + + public GlueList() { + + Node initNode = new Node<>(null, null, 0, DEFAULT_CAPACITY); + + first = initNode; + last = initNode; + } + + public GlueList(int initialCapacity) { + + this.initialCapacity = (initialCapacity > MAX_ARRAY_SIZE) ? MAX_ARRAY_SIZE : initialCapacity; + + Node initNode = new Node<>(null, null, 0, initialCapacity); + + first = initNode; + last = initNode; + } + + public GlueList(Collection c) { + + Objects.requireNonNull(c); + + Object[] arr = c.toArray(); + + int len = arr.length; + + if (len != 0) { + + Node initNode = new Node<>(null, null, 0, len); + + first = initNode; + last = initNode; + + System.arraycopy(arr, 0, last.elementData, 0, len); + + last.elementDataPointer += len; + } else { + + Node initNode = new Node<>(null, null, 0, DEFAULT_CAPACITY); + + first = initNode; + last = initNode; + } + + modCount++; + size += len; + } + + @Override + public boolean add(T element) { + + Node l = last; + + if (l.isAddable()) { + l.add(element); + } else { + Node newNode = new Node<>(l, null, size); + newNode.add(element); + last = newNode; + l.next = last; + } + + modCount++; + size++; + + return true; + } + + @SuppressWarnings("unchecked") + @Override + public void add(int index, T element) { + + rangeCheckForAdd(index); + + Node node = getNodeForAdd(index); + + if (node == null) { + + Node l = last; + + Node newNode = new Node<>(l, null, size); + + last = newNode; + + l.next = last; + + node = newNode; + } + + //if it is last and has extra space for element... + if (node == last && node.elementData.length - node.elementDataPointer > 0) { + + int nodeArrIndex = index - node.startingIndex; + + System.arraycopy(node.elementData, nodeArrIndex, node.elementData, nodeArrIndex + 1, node.elementDataPointer - nodeArrIndex); + + node.elementData[nodeArrIndex] = element; + + if (nodeArrIndex > 0) { + System.arraycopy(node.elementData, 0, node.elementData, 0, nodeArrIndex); + } + + node.elementDataPointer++; + } else { + + int newLen = node.elementData.length + 1; + T[] newElementData = (T[]) new Object[newLen]; + + int nodeArrIndex = index - node.startingIndex; + + System.arraycopy(node.elementData, nodeArrIndex, newElementData, nodeArrIndex + 1, node.elementDataPointer - nodeArrIndex); + + newElementData[nodeArrIndex] = element; + + if (nodeArrIndex > 0) { + System.arraycopy(node.elementData, 0, newElementData, 0, nodeArrIndex); + } + + node.elementData = newElementData; + node.endingIndex++; + node.elementDataPointer++; + } + + updateNodesAfterAdd(node); + + modCount++; + size++; + } + + private void rangeCheckForAdd(int index) { + + if (index > size || index < 0) { + throw new ArrayIndexOutOfBoundsException(index); + } + } + + private void updateNodesAfterAdd(Node nodeFrom) { + + for (Node node = nodeFrom.next; node != null; node = node.next) { + + node.startingIndex++; + node.endingIndex++; + } + } + + @SuppressWarnings("unchecked") + @Override + public boolean addAll(Collection c) { + + Objects.requireNonNull(c); + + Object[] collection = c.toArray(); + + int len = collection.length; + + if (len == 0) { + return false; + } + + if (size == 0) { + + if (initialCapacity >= len) { + System.arraycopy(collection, 0, last.elementData, 0, len); + } else { + last.elementData = Arrays.copyOf((T[]) collection, len); + last.endingIndex = len - 1; + } + + last.elementDataPointer += len; + + modCount++; + size += len; + + return true; + } + + int elementDataLen = last.elementData.length; + int elementSize = last.elementDataPointer; + + int remainedStorage = elementDataLen - elementSize; + + if (remainedStorage == 0) { + + Node l = last; + + int newLen = (size >>> 1); + int initialLen = (len > newLen) ? len : newLen; + + Node newNode = new Node<>(l, null, size, initialLen); + + System.arraycopy(collection, 0, newNode.elementData, 0, len); + + newNode.elementDataPointer += len; + + last = newNode; + l.next = last; + + modCount++; + size += len; + + return true; + } + + if (len <= remainedStorage) { + + System.arraycopy(collection, 0, last.elementData, elementSize, len); + + last.elementDataPointer += len; + + modCount++; + size += len; + + return true; + } + + if (len > remainedStorage) { + + System.arraycopy(collection, 0, last.elementData, elementSize, remainedStorage); + + last.elementDataPointer += remainedStorage; + size += remainedStorage; + + int newLen = (size >>> 1); + int remainedDataLen = len - remainedStorage; + + int initialLen = (newLen > remainedDataLen) ? newLen : remainedDataLen; + + Node l = last; + + Node newNode = new Node<>(l, null, size, initialLen); + + System.arraycopy(collection, remainedStorage, newNode.elementData, 0, remainedDataLen); + + newNode.elementDataPointer += remainedDataLen; + + last = newNode; + l.next = last; + + modCount++; + size += remainedDataLen; + + return true; + } + + return false; + } + + @Override + public T set(int index, T element) { + + rangeCheck(index); + + Node node = getNode(index); + + int nodeArrIndex = index - node.startingIndex; + + T oldValue = node.elementData[nodeArrIndex]; + + node.elementData[nodeArrIndex] = element; + + return oldValue; + } + + @Override + public T get(int index) { + + rangeCheck(index); + + Node node = getNode(index); + + return node.elementData[index - node.startingIndex]; + } + + @Override + public int indexOf(Object o) { + + int index = 0; + + if (o == null) { + + for (Node node = first; node != null; node = node.next) { + for (int i = 0; i < node.elementDataPointer; i++) { + if (node.elementData[i] == null) { + return index; + } + index++; + } + } + } else { + + for (Node node = first; node != null; node = node.next) { + for (int i = 0; i < node.elementDataPointer; i++) { + if (o.equals(node.elementData[i])) { + return index; + } + index++; + } + } + } + + return -1; + } + + @Override + public int lastIndexOf(Object o) { + + int index = size - 1; + + if (o == null) { + for (Node node = last; node != null; node = node.pre) { + for (int i = node.elementDataPointer - 1; i >= 0; i--) { + if (node.elementData[i] == null) { + return index; + } + index--; + } + } + } else { + + for (Node node = last; node != null; node = node.pre) { + for (int i = node.elementDataPointer - 1; i >= 0; i--) { + if (o.equals(node.elementData[i])) { + return index; + } + index--; + } + } + } + + return -1; + } + + @Override + public boolean contains(Object o) { + return indexOf(o) != -1; + } + + @SuppressWarnings("unchecked") + @Override + public T remove(int index) { + + rangeCheck(index); + + Node node; + + if (size == 2 && first != last) { + + Node newNode = new Node<>(null, null, 0, 2); + newNode.add(first.elementData[0]); + newNode.add(last.elementData[0]); + + node = first = last = newNode; + } else { + node = getNode(index); + } + + T[] elementData = node.elementData; + + int elementSize = node.elementDataPointer; + + int nodeArrIndex = index - node.startingIndex; + + T oldValue = elementData[nodeArrIndex]; + + int numMoved = elementSize - nodeArrIndex - 1; + + if (numMoved > 0) { + System.arraycopy(node.elementData, nodeArrIndex + 1, node.elementData, nodeArrIndex, numMoved); + } + + if (first == last || node == last) { + node.elementData[elementSize - 1] = null; + } else { + node.elementData = Arrays.copyOf(node.elementData, elementSize - 1); + node.endingIndex = (--node.endingIndex < 0) ? 0 : node.endingIndex; + } + + node.elementDataPointer--; + + updateNodesAfterRemove(node); + + if (node.elementDataPointer == 0 && first != last) { + + Node next = node.next; + Node prev = node.pre; + + if (prev == null) { + first = next; + } else { + prev.next = next; + node.pre = null; + } + + if (next == null) { + last = prev; + } else { + next.pre = prev; + node.next = null; + } + + node.elementData = null; + } + + size--; + modCount++; + + return oldValue; + } + + @Override + public boolean removeAll(Collection c) { + + Objects.requireNonNull(c); + + Object[] arr = c.toArray(); + if (arr.length == 0) { + return false; + } + + boolean isModified = false; + + for (Object o : arr) { + isModified |= remove(o); + } + + return isModified; + } + + @Override + public boolean retainAll(Collection c) { + + Objects.requireNonNull(c); + + Object[] arr = c.toArray(); + if (arr.length == 0) { + return false; + } + + boolean isModified = false; + + Object[] elements = toArray(); + + for (Object element : elements) { + + if (!c.contains(element)) { + isModified |= remove(element); + } + } + + return isModified; + } + + @Override + public boolean remove(Object o) { + + int index = indexOf(o); + + if (index != -1) { + remove(index); + return true; + } else { + return false; + } + } + + private void updateNodesAfterRemove(Node fromNode) { + + for (Node node = fromNode.next; node != null; node = node.next) { + + node.startingIndex = (--node.startingIndex < 0) ? 0 : node.startingIndex; + node.endingIndex = (--node.endingIndex < 0) ? 0 : node.endingIndex; + } + } + + private Node getNode(int index) { + + int firstStartingIndex = first.startingIndex; + int firstEndingIndex = first.endingIndex; + + int firstMinDistance = min(abs(index - firstStartingIndex), abs(index - firstEndingIndex)); + + int lastStartingIndex = last.startingIndex; + int lastEndingIndex = last.endingIndex; + + int lastMinDistance = min(abs(index - lastStartingIndex), abs(index - lastEndingIndex)); + + if (firstMinDistance <= lastMinDistance) { + + Node node = first; + do { + + if (node.startingIndex <= index && index <= node.endingIndex) { + return node; + } + + node = node.next; + } while (true); + } else { + + Node node = last; + do { + + if (node.startingIndex <= index && index <= node.endingIndex) { + return node; + } + + node = node.pre; + } while (true); + } + } + + private Node getNodeForAdd(int index) { + + if (index == size && !(last.startingIndex <= index && index <= last.endingIndex)) { + return null; + } + + return getNode(index); + } + + private void rangeCheck(int index) { + + if (index >= size || index < 0) { + throw new ArrayIndexOutOfBoundsException(index); + } + } + + @Override + public void clear() { + + for (Node node = first; node != null; ) { + + Node next = node.next; + + node.next = null; + node.pre = null; + node.elementData = null; + + node = next; + } + + first = last = null; + + int capacity = min(MAX_ARRAY_SIZE, max(size, max(initialCapacity, DEFAULT_CAPACITY))); + + Node initNode = new Node<>(null, null, 0, capacity); + + initialCapacity = capacity; + + first = initNode; + last = initNode; + + modCount++; + size = 0; + } + + public void trimToSize() { + + int pointer = last.elementDataPointer; + int arrLen = last.elementData.length; + + if (pointer < arrLen && arrLen > 2) { + + if (pointer < 2) { + last.elementData = Arrays.copyOf(last.elementData, 2); + last.endingIndex -= arrLen - 2; + } else { + last.elementData = Arrays.copyOf(last.elementData, pointer); + last.endingIndex -= arrLen - pointer; + } + } + } + + @Override + public List subList(int fromIndex, int toIndex) { + return super.subList(fromIndex, toIndex); + } + + @Override + public Object[] toArray() { + + Object[] objects = new Object[size]; + + int i = 0; + for (Node node = first; node != null; node = node.next) { + + int len = node.elementDataPointer; + + if (len > 0) { + System.arraycopy(node.elementData, 0, objects, i, len); + } + + i += len; + } + + return objects; + } + + @SuppressWarnings("unchecked") + @Override + public T[] toArray(T[] a) { + return (T[]) Arrays.copyOf(toArray(), size, a.getClass()); + } + + public boolean isEmpty() { + return size == 0; + } + + @Override + public Iterator iterator() { + return new Itr(); + } + + private class Itr implements Iterator { + + Node node = first; + + int i = 0;//inner-array index + int j = 0;//total index -> cursor + + int lastReturn = -1; + + int expectedModCount = modCount; + int elementDataPointer = node.elementDataPointer; + + @Override + public boolean hasNext() { + return j != size; + } + + @Override + public T next() { + + checkForComodification(); + + if (j >= size) { + throw new NoSuchElementException(); + } + + if (j >= last.endingIndex + 1) { + throw new ConcurrentModificationException(); + } + + if (j == 0) {// it's for listIterator.when node becomes null. + node = first; + elementDataPointer = node.elementDataPointer; + i = 0; + } + + T val = node.elementData[i++]; + + if (i >= elementDataPointer) { + node = node.next; + i = 0; + elementDataPointer = (node != null) ? node.elementDataPointer : 0; + } + + lastReturn = j++; + + return val; + } + + @Override + public void remove() { + + if (lastReturn < 0) { + throw new IllegalStateException(); + } + + checkForComodification(); + + try { + com.dfsek.terra.api.gaea.util.GlueList.this.remove(lastReturn); + + j = lastReturn; + + lastReturn = -1; + + i = (--i < 0) ? 0 : i; + + elementDataPointer = (node != null) ? node.elementDataPointer : 0; + + expectedModCount = modCount; + } catch (IndexOutOfBoundsException e) { + throw new ConcurrentModificationException(); + } + } + + void checkForComodification() { + if (modCount != expectedModCount) { + throw new ConcurrentModificationException(); + } + } + } + + @Override + public ListIterator listIterator(int index) { + + checkPositionIndex(index); + + return new ListItr(index); + } + + private void checkPositionIndex(int index) { + + if (!(index >= 0 && index <= size)) { + throw new ArrayIndexOutOfBoundsException(index); + } + } + + @Override + public ListIterator listIterator() { + return new ListItr(0); + } + + private class ListItr extends Itr implements ListIterator { + + public ListItr(int index) { + node = (index == size) ? last : getNode(index); + j = index; + i = index - node.startingIndex; + elementDataPointer = node.elementDataPointer; + } + + @Override + public boolean hasPrevious() { + return j != 0; + } + + @Override + public T previous() { + + checkForComodification(); + + int temp = j - 1; + + if (temp < 0) { + throw new NoSuchElementException(); + } + + if (temp >= last.endingIndex + 1) { + throw new ConcurrentModificationException(); + } + + if (j == size) { + + node = last; + + elementDataPointer = node.elementDataPointer; + + i = elementDataPointer; + } + + int index = j - node.startingIndex; + if (index == 0) { + + node = node.pre; + + elementDataPointer = node.elementDataPointer; + + i = elementDataPointer; + } + + T val = node.elementData[--i]; + + if (i < 0) { + node = node.pre; + i = (node != null) ? node.elementDataPointer : 0; + } + + j = temp; + + lastReturn = j; + + return val; + } + + @Override + public int nextIndex() { + return j; + } + + @Override + public int previousIndex() { + return j - 1; + } + + @Override + public void set(T t) { + + if (lastReturn < 0) { + throw new IllegalStateException(); + } + + checkForComodification(); + + try { + com.dfsek.terra.api.gaea.util.GlueList.this.set(lastReturn, t); + } catch (IndexOutOfBoundsException e) { + throw new ConcurrentModificationException(); + } + } + + @Override + public void add(T t) { + + checkForComodification(); + + try { + int temp = j; + + com.dfsek.terra.api.gaea.util.GlueList.this.add(temp, t); + + j = temp + 1; + + lastReturn = -1; + + i++; + elementDataPointer = (node != null) ? node.elementDataPointer : 0; + + expectedModCount = modCount; + } catch (IndexOutOfBoundsException e) { + throw new ConcurrentModificationException(); + } + } + } + + @Override + public int size() { + return size; + } + + @SuppressWarnings("unchecked") + @Override + public Object clone() { + + try { + com.dfsek.terra.api.gaea.util.GlueList clone = (com.dfsek.terra.api.gaea.util.GlueList) super.clone(); + + clone.first = clone.last = null; + + int capacity = min(MAX_ARRAY_SIZE, max(clone.size, max(clone.initialCapacity, DEFAULT_CAPACITY))); + + Node initNode = new Node<>(null, null, 0, capacity); + + clone.initialCapacity = capacity; + + clone.first = clone.last = initNode; + + clone.modCount = 0; + clone.size = 0; + + for (Node node = first; node != null; node = node.next) { + + for (int i = 0; i < node.elementDataPointer; i++) { + clone.add(node.elementData[i]); + } + } + + return clone; + } catch (CloneNotSupportedException e) { + throw new InternalError(); + } + } + + private void writeObject(ObjectOutputStream s) throws IOException { + + int expectedModCount = modCount; + + s.defaultWriteObject(); + + s.writeInt(size); + + for (Node node = first; node != null; node = node.next) { + for (int i = 0; i < node.elementDataPointer; i++) { + s.writeObject(node.elementData[i]); + } + } + + if (modCount != expectedModCount) { + throw new ConcurrentModificationException(); + } + } + + + @SuppressWarnings("unchecked") + private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException { + + clear(); + + s.defaultReadObject(); + + int size = s.readInt(); + + for (int i = 0; i < size; i++) { + last.add((T) s.readObject()); + } + } + + static class Node { + + Node pre; + Node next; + + int listSize; + + int startingIndex; + int endingIndex; + + T[] elementData; + int elementDataPointer; + + @SuppressWarnings("unchecked") + Node(Node pre, Node next, int listSize) { + this.pre = pre; + this.next = next; + this.listSize = listSize; + this.elementData = (T[]) new Object[listSize >>> 1]; + this.startingIndex = listSize; + this.endingIndex = listSize + elementData.length - 1; + } + + Node(Node pre, Node next, int listSize, int initialCapacity) { + this.pre = pre; + this.next = next; + this.listSize = listSize; + this.elementData = createElementData(initialCapacity); + this.startingIndex = listSize; + this.endingIndex = listSize + elementData.length - 1; + } + + @SuppressWarnings("unchecked") + T[] createElementData(int capacity) { + + if (capacity == 0 || capacity == 1) { + return (T[]) new Object[DEFAULT_CAPACITY]; + } else if (capacity > 1) { + return (T[]) new Object[capacity]; + } else { + throw new IllegalArgumentException("Illegal Capacity: " + capacity); + } + } + + boolean isAddable() { + return elementDataPointer < elementData.length; + } + + void add(T element) { + elementData[elementDataPointer++] = element; + } + + @Override + public String toString() { + return String.format("[sIndex: %d - eIndex: %d | elementDataPointer: %d | elementDataLength: %d]", startingIndex, endingIndex, elementDataPointer, elementData.length); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/dfsek/terra/api/gaea/util/JarUtil.java b/src/main/java/com/dfsek/terra/api/gaea/util/JarUtil.java new file mode 100644 index 000000000..716adf022 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/util/JarUtil.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.api.gaea.util; + +import com.dfsek.terra.api.gaea.Debug; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; + +public class JarUtil { + public static void copyResourcesToDirectory(JarFile fromJar, String sourceDir, String destDir) throws IOException { + for(Enumeration entries = fromJar.entries(); entries.hasMoreElements(); ) { + JarEntry entry = entries.nextElement(); + if(entry.getName().startsWith(sourceDir + "/") && ! entry.isDirectory()) { + File dest = new File(destDir + File.separator + entry.getName().substring(sourceDir.length() + 1)); + if(dest.exists()) continue; + File parent = dest.getParentFile(); + if(parent != null) { + parent.mkdirs(); + } + Debug.info("Output does not already exist. Creating... "); + try(FileOutputStream out = new FileOutputStream(dest); InputStream in = fromJar.getInputStream(entry)) { + byte[] buffer = new byte[(8192)]; + + int s; + while((s = in.read(buffer)) > 0) { + out.write(buffer, 0, s); + } + } catch(IOException e) { + throw new IOException("Could not copy asset from jar file", e); + } + } + } + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java b/src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java new file mode 100644 index 000000000..f4d5bb143 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.api.gaea.util; + +import com.dfsek.terra.api.gaea.serial.MovedObjectInputStream; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.Serializable; + +public class SerializationUtil { + public static Object fromFile(File f) throws IOException, ClassNotFoundException { + ObjectInputStream ois = new MovedObjectInputStream(new FileInputStream(f), "com.dfsek.betterend.gaea", "com.dfsek.terra.api.gaea"); // Backwards compat with old BetterEnd shade location + Object o = ois.readObject(); + ois.close(); + return o; + } + + public static void toFile(Serializable o, File f) throws IOException { + ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f)); + oos.writeObject(o); + oos.close(); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/util/WorldUtil.java b/src/main/java/com/dfsek/terra/api/gaea/util/WorldUtil.java new file mode 100644 index 000000000..757171aed --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/util/WorldUtil.java @@ -0,0 +1,46 @@ +package com.dfsek.terra.api.gaea.util; + +import net.jafama.FastMath; +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.Material; + +import java.util.List; + +public class WorldUtil { + public static int getHighestValidSpawnAt(Chunk chunk, int x, int z) { + int y; + for(y = chunk.getWorld().getMaxHeight() - 1; (chunk.getBlock(x, y, z).getType() != Material.GRASS_BLOCK + && chunk.getBlock(x, y, z).getType() != Material.GRAVEL + && chunk.getBlock(x, y, z).getType() != Material.PODZOL + && chunk.getBlock(x, y, z).getType() != Material.END_STONE + && chunk.getBlock(x, y, z).getType() != Material.DIRT + && chunk.getBlock(x, y, z).getType() != Material.STONE + && chunk.getBlock(x, y, z).getType() != Material.SAND + && chunk.getBlock(x, y, z).getType() != Material.RED_SAND + && chunk.getBlock(x, y, z).getType() != Material.COARSE_DIRT) && y > 0; y--) + ; + return y; + } + + public static int getHighestBlockAt(Chunk chunk, int x, int z) { + int y; + for(y = chunk.getWorld().getMaxHeight() - 1; (chunk.getBlock(x, y, z).getType().isAir()) && y > 0; y--) ; + return y; + } + + public static List getLocationListBetween(Location loc1, Location loc2) { + int lowX = FastMath.min(loc1.getBlockX(), loc2.getBlockX()); + int lowY = FastMath.min(loc1.getBlockY(), loc2.getBlockY()); + int lowZ = FastMath.min(loc1.getBlockZ(), loc2.getBlockZ()); + List locs = new GlueList<>(); + for(int x = 0; x <= FastMath.abs(loc1.getBlockX() - loc2.getBlockX()); x++) { + for(int y = 0; y <= FastMath.abs(loc1.getBlockY() - loc2.getBlockY()); y++) { + for(int z = 0; z <= FastMath.abs(loc1.getBlockZ() - loc2.getBlockZ()); z++) { + locs.add(new Location(loc1.getWorld(), (double) lowX + x, (double) lowY + y, (double) lowZ + z)); + } + } + } + return locs; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java b/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java new file mode 100644 index 000000000..c83e6a800 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.api.gaea.world; + +import com.dfsek.terra.api.gaea.math.Range; +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.block.Block; + +import java.util.List; + +public interface Flora { + List getValidSpawnsAt(Chunk chunk, int x, int z, Range check); + + boolean plant(Location l); +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java b/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java new file mode 100644 index 000000000..61a47b743 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java @@ -0,0 +1,86 @@ +package com.dfsek.terra.api.gaea.world; + +import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.gaea.util.GlueList; +import com.google.common.collect.Sets; +import org.bukkit.Bukkit; +import org.bukkit.Chunk; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockFace; +import org.bukkit.block.data.BlockData; + +import java.util.Arrays; +import java.util.List; +import java.util.Set; + +public enum FloraType implements Flora { + TALL_GRASS(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:tall_grass[half=lower]"), Bukkit.createBlockData("minecraft:tall_grass[half=upper]")), + TALL_FERN(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:large_fern[half=lower]"), Bukkit.createBlockData("minecraft:large_fern[half=upper]")), + SUNFLOWER(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:sunflower[half=lower]"), Bukkit.createBlockData("minecraft:sunflower[half=upper]")), + ROSE_BUSH(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:rose_bush[half=lower]"), Bukkit.createBlockData("minecraft:rose_bush[half=upper]")), + LILAC(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:lilac[half=lower]"), Bukkit.createBlockData("minecraft:lilac[half=upper]")), + PEONY(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:peony[half=lower]"), Bukkit.createBlockData("minecraft:peony[half=upper]")), + GRASS(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:grass")), + FERN(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:fern")), + AZURE_BLUET(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:azure_bluet")), + LILY_OF_THE_VALLEY(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:lily_of_the_valley")), + BLUE_ORCHID(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:blue_orchid")), + POPPY(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:poppy")), + DANDELION(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:dandelion")), + WITHER_ROSE(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:wither_rose")), + DEAD_BUSH(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL, Material.SAND, Material.RED_SAND, + Material.TERRACOTTA, Material.BLACK_TERRACOTTA, Material.BLUE_TERRACOTTA, Material.BROWN_TERRACOTTA, Material.CYAN_TERRACOTTA, Material.GRAY_TERRACOTTA, + Material.GREEN_TERRACOTTA, Material.LIGHT_BLUE_TERRACOTTA, Material.LIGHT_GRAY_TERRACOTTA, Material.LIME_TERRACOTTA, Material.MAGENTA_TERRACOTTA, + Material.ORANGE_TERRACOTTA, Material.PINK_TERRACOTTA, Material.PURPLE_TERRACOTTA, Material.RED_TERRACOTTA, Material.RED_TERRACOTTA, Material.WHITE_TERRACOTTA, + Material.YELLOW_TERRACOTTA), Bukkit.createBlockData("minecraft:dead_bush")), + RED_TULIP(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:red_tulip")), + ORANGE_TULIP(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:orange_tulip")), + WHITE_TULIP(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:white_tulip")), + PINK_TULIP(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:pink_tulip")), + OXEYE_DAISY(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:oxeye_daisy")), + ALLIUM(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:allium")), + CORNFLOWER(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:cornflower")), + LILY_PAD(Sets.newHashSet(Material.WATER), Bukkit.createBlockData("minecraft:lily_pad")), + RED_MUSHROOM(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL, Material.DIRT, Material.STONE, Material.NETHERRACK, Material.MYCELIUM), Bukkit.createBlockData("minecraft:red_mushroom")), + BROWN_MUSHROOM(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL, Material.DIRT, Material.STONE, Material.NETHERRACK, Material.MYCELIUM), Bukkit.createBlockData("minecraft:brown_mushroom")), + ; + + private final List data = new GlueList<>(); + + private final Set spawns; + + FloraType(Set validSpawns, BlockData... type) { + data.addAll(Arrays.asList(type)); + this.spawns = validSpawns; + } + + @Override + public List getValidSpawnsAt(Chunk chunk, int x, int z, Range check) { + List blocks = new GlueList<>(); + for(int y : check) { + Block block = chunk.getBlock(x, y, z); + if(spawns.contains(block.getType()) && valid(block)) { + blocks.add(chunk.getBlock(x, y, z)); + } + } + return blocks; + } + + private boolean valid(Block block) { + for(int i = 1; i < data.size() + 1; i++) { + block = block.getRelative(BlockFace.UP); + if(!block.isEmpty()) return false; + } + return true; + } + + @Override + public boolean plant(Location l) { + for(int i = 1; i < data.size() + 1; i++) { + l.clone().add(0, i, 0).getBlock().setBlockData(data.get(i - 1), false); + } + return true; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/Ore.java b/src/main/java/com/dfsek/terra/api/gaea/world/Ore.java new file mode 100755 index 000000000..ad5b38472 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/world/Ore.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.api.gaea.world; + +import org.bukkit.block.data.BlockData; + +public class Ore { + private final int contChance; + private final BlockData oreMaterial; + + public Ore(BlockData oreMaterial, int contChance) { + this.contChance = contChance; + this.oreMaterial = oreMaterial; + } + + public int getContChance() { + return contChance; + } + + public BlockData getType() { + return oreMaterial; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java b/src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java new file mode 100644 index 000000000..c190552a3 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java @@ -0,0 +1,59 @@ +package com.dfsek.terra.api.gaea.world.carving; + +import com.dfsek.terra.api.gaea.math.MathUtil; +import com.dfsek.terra.api.gaea.util.FastRandom; +import net.jafama.FastMath; +import org.bukkit.World; +import org.bukkit.util.Vector; + +import java.util.Random; +import java.util.function.BiConsumer; + +public abstract class Carver { + private final int minY; + private final int maxY; + private final double sixtyFourSq = FastMath.pow(64, 2); + private int carvingRadius = 4; + + public Carver(int minY, int maxY) { + this.minY = minY; + this.maxY = maxY; + } + + public void carve(int chunkX, int chunkZ, World w, BiConsumer consumer) { + for(int x = chunkX - carvingRadius; x <= chunkX + carvingRadius; x++) { + for(int z = chunkZ - carvingRadius; z <= chunkZ + carvingRadius; z++) { + if(isChunkCarved(w, x, z, new FastRandom(MathUtil.hashToLong(this.getClass().getName() + "_" + x + "&" + z)))) { + long seed = MathUtil.getCarverChunkSeed(x, z, w.getSeed()); + Random r = new FastRandom(seed); + Worm carving = getWorm(seed, new Vector((x << 4) + r.nextInt(16), r.nextInt(maxY - minY + 1) + minY, (z << 4) + r.nextInt(16))); + Vector origin = carving.getOrigin(); + for(int i = 0; i < carving.getLength(); i++) { + carving.step(); + if(carving.getRunning().clone().setY(0).distanceSquared(origin.clone().setY(0)) > sixtyFourSq) + break; + if(FastMath.floorDiv(origin.getBlockX(), 16) != chunkX && FastMath.floorDiv(origin.getBlockZ(), 16) != chunkZ) + continue; + carving.getPoint().carve(chunkX, chunkZ, consumer); + } + } + } + } + } + + public int getCarvingRadius() { + return carvingRadius; + } + + public void setCarvingRadius(int carvingRadius) { + this.carvingRadius = carvingRadius; + } + + public abstract Worm getWorm(long seed, Vector l); + + public abstract boolean isChunkCarved(World w, int chunkX, int chunkZ, Random r); + + public enum CarvingType { + CENTER, WALL, TOP, BOTTOM + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java b/src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java new file mode 100644 index 000000000..c5e69d7e4 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java @@ -0,0 +1,119 @@ +package com.dfsek.terra.api.gaea.world.carving; + +import net.jafama.FastMath; +import org.bukkit.util.Vector; + +import java.util.Random; +import java.util.function.BiConsumer; + +public abstract class Worm { + private final Random r; + private final Vector origin; + private final Vector running; + private final int length; + private int topCut = 0; + private int bottomCut = 0; + private int[] radius = new int[] {0, 0, 0}; + + public Worm(int length, Random r, Vector origin) { + this.r = r; + this.length = length; + this.origin = origin; + this.running = origin; + } + + public void setBottomCut(int bottomCut) { + this.bottomCut = bottomCut; + } + + public void setTopCut(int topCut) { + this.topCut = topCut; + } + + public Vector getOrigin() { + return origin; + } + + public int getLength() { + return length; + } + + public Vector getRunning() { + return running; + } + + public WormPoint getPoint() { + return new WormPoint(running, radius, topCut, bottomCut); + } + + public int[] getRadius() { + return radius; + } + + public void setRadius(int[] radius) { + this.radius = radius; + } + + public Random getRandom() { + return r; + } + + public abstract void step(); + + public static class WormPoint { + private final Vector origin; + private final int topCut; + private final int bottomCut; + private final int[] rad; + + public WormPoint(Vector origin, int[] rad, int topCut, int bottomCut) { + this.origin = origin; + this.rad = rad; + this.topCut = topCut; + this.bottomCut = bottomCut; + } + + private static double ellipseEquation(int x, int y, int z, double xr, double yr, double zr) { + return (FastMath.pow2(x) / FastMath.pow2(xr + 0.5D)) + (FastMath.pow2(y) / FastMath.pow2(yr + 0.5D)) + (FastMath.pow2(z) / FastMath.pow2(zr + 0.5D)); + } + + public Vector getOrigin() { + return origin; + } + + public int getRadius(int index) { + return rad[index]; + } + + public void carve(int chunkX, int chunkZ, BiConsumer consumer) { + int xRad = getRadius(0); + int yRad = getRadius(1); + int zRad = getRadius(2); + int originX = (chunkX << 4); + int originZ = (chunkZ << 4); + for(int x = -xRad - 1; x <= xRad + 1; x++) { + if(!(FastMath.floorDiv(origin.getBlockX() + x, 16) == chunkX)) continue; + for(int z = -zRad - 1; z <= zRad + 1; z++) { + if(!(FastMath.floorDiv(origin.getBlockZ() + z, 16) == chunkZ)) continue; + for(int y = -yRad - 1; y <= yRad + 1; y++) { + Vector position = origin.clone().add(new Vector(x, y, z)); + if(position.getY() < 0 || position.getY() > 255) continue; + double eq = ellipseEquation(x, y, z, xRad, yRad, zRad); + if(eq <= 1 && + y >= -yRad - 1 + bottomCut && y <= yRad + 1 - topCut) { + consumer.accept(new Vector(position.getBlockX() - originX, position.getBlockY(), position.getBlockZ() - originZ), Carver.CarvingType.CENTER); + } else if(eq <= 1.5) { + Carver.CarvingType type = Carver.CarvingType.WALL; + if(y <= -yRad - 1 + bottomCut) { + type = Carver.CarvingType.BOTTOM; + } else if(y >= yRad + 1 - topCut) { + type = Carver.CarvingType.TOP; + } + consumer.accept(new Vector(position.getBlockX() - originX, position.getBlockY(), position.getBlockZ() - originZ), type); + } + } + } + } + } + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/palette/Palette.java b/src/main/java/com/dfsek/terra/api/gaea/world/palette/Palette.java new file mode 100644 index 000000000..f708f028c --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/world/palette/Palette.java @@ -0,0 +1,116 @@ +package com.dfsek.terra.api.gaea.world.palette; + +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.util.GlueList; + +import java.util.List; +import java.util.Random; + +/** + * A class representation of a "slice" of the world. + * Used to get a section of blocks, based on the depth at which they are found. + */ +public abstract class Palette { + private final List> pallet = new GlueList<>(); + + /** + * Constructs a blank palette. + */ + public Palette() { + + } + + /** + * Adds a material to the palette, for a number of layers. + * + * @param m - The material to add to the palette. + * @param layers - The number of layers the material occupies. + * @return - BlockPalette instance for chaining. + */ + public com.dfsek.terra.api.gaea.world.palette.Palette add(E m, int layers) { + for(int i = 0; i < layers; i++) { + pallet.add(new PaletteLayer<>(m)); + } + return this; + } + + /** + * Adds a ProbabilityCollection to the palette, for a number of layers. + * + * @param m - The ProbabilityCollection to add to the palette. + * @param layers - The number of layers the material occupies. + * @return - BlockPalette instance for chaining. + */ + public com.dfsek.terra.api.gaea.world.palette.Palette add(ProbabilityCollection m, int layers) { + for(int i = 0; i < layers; i++) { + pallet.add(new PaletteLayer<>(m)); + } + return this; + } + + /** + * Fetches a material from the palette, at a given layer. + * + * @param layer - The layer at which to fetch the material. + * @return BlockData - The material fetched. + */ + public abstract E get(int layer, int x, int z); + + + public int getSize() { + return pallet.size(); + } + + public List> getLayers() { + return pallet; + } + + /** + * Class representation of a layer of a BlockPalette. + */ + public static class PaletteLayer { + private final boolean col; // Is layer using a collection? + private ProbabilityCollection collection; + private E m; + + /** + * Constructs a PaletteLayer with a ProbabilityCollection of materials and a number of layers. + * + * @param type - The collection of materials to choose from. + */ + public PaletteLayer(ProbabilityCollection type) { + this.col = true; + this.collection = type; + } + + /** + * Constructs a PaletteLayer with a single Material and a number of layers. + * + * @param type - The material to use. + */ + public PaletteLayer(E type) { + this.col = false; + this.m = type; + } + + /** + * Gets a material from the layer. + * + * @return Material - the material.. + */ + public E get(Random random) { + if(col) return this.collection.get(random); + return m; + } + + public E get(FastNoiseLite random, int x, int z) { + if(col) return this.collection.get(random, x, z); + return m; + } + + public ProbabilityCollection getCollection() { + return collection; + } + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/palette/RandomPalette.java b/src/main/java/com/dfsek/terra/api/gaea/world/palette/RandomPalette.java new file mode 100644 index 000000000..65f1e0498 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/world/palette/RandomPalette.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.api.gaea.world.palette; + +import java.util.List; +import java.util.Random; + +public class RandomPalette extends Palette { + private final Random r; + + public RandomPalette(Random r) { + this.r = r; + } + + @Override + public E get(int layer, int x, int z) { + if(layer > this.getSize()) return this.getLayers().get(this.getLayers().size() - 1).get(r); + List> pl = getLayers(); + if(layer >= pl.size()) return pl.get(pl.size() - 1).get(r); + return pl.get(layer).get(r); + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/palette/SimplexPalette.java b/src/main/java/com/dfsek/terra/api/gaea/world/palette/SimplexPalette.java new file mode 100644 index 000000000..3071b4a69 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/gaea/world/palette/SimplexPalette.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.api.gaea.world.palette; + +import com.dfsek.terra.api.gaea.math.FastNoiseLite; + +import java.util.List; + +public class SimplexPalette extends Palette { + private final FastNoiseLite r; + + public SimplexPalette(FastNoiseLite r) { + this.r = r; + } + + @Override + public E get(int layer, int x, int z) { + if(layer > this.getSize()) return this.getLayers().get(this.getLayers().size() - 1).get(r, x, z); + List> pl = getLayers(); + if(layer >= pl.size()) return pl.get(pl.size() - 1).get(r, x, z); + return pl.get(layer).get(r, x, z); + } +} diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java index 4ad035b34..563c7e018 100644 --- a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java @@ -1,4 +1,27 @@ package com.dfsek.terra.api.generic.generator; +import java.util.Collections; +import java.util.List; + public abstract class ChunkGenerator { + public boolean isParallelCapable() { + return false; + } + public boolean shouldGenerateCaves() { + return false; + } + public boolean shouldGenerateDecorations() { + return false; + } + public boolean shouldGenerateMobs() { + return false; + } + + public boolean shouldGenerateStructures() { + return false; + } + + public List getDefaultPopulators() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java b/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java index 7b03a5995..f0871d579 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java +++ b/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java @@ -1,12 +1,12 @@ package com.dfsek.terra.async; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import org.bukkit.Location; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.biome.Biome; -import org.polydev.gaea.generation.GenerationPhase; import java.util.function.Consumer; diff --git a/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java b/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java index aa2d203f0..e7e215d7b 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java +++ b/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java @@ -1,6 +1,7 @@ package com.dfsek.terra.async; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.items.TerraStructure; @@ -11,7 +12,6 @@ import org.bukkit.Location; import org.bukkit.World; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.util.FastRandom; import java.util.Random; import java.util.function.Consumer; diff --git a/src/main/java/com/dfsek/terra/biome/BiomeZone.java b/src/main/java/com/dfsek/terra/biome/BiomeZone.java index a907599d2..26dd35cbb 100644 --- a/src/main/java/com/dfsek/terra/biome/BiomeZone.java +++ b/src/main/java/com/dfsek/terra/biome/BiomeZone.java @@ -1,13 +1,13 @@ package com.dfsek.terra.biome; +import com.dfsek.terra.api.gaea.biome.BiomeGrid; +import com.dfsek.terra.api.gaea.biome.NormalizationUtil; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.image.ImageLoader; import org.bukkit.World; import org.jetbrains.annotations.Nullable; -import org.polydev.gaea.biome.BiomeGrid; -import org.polydev.gaea.biome.NormalizationUtil; -import org.polydev.gaea.math.FastNoiseLite; import java.util.Objects; diff --git a/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java b/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java index 295772b59..34e5f78d4 100644 --- a/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java +++ b/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java @@ -1,16 +1,13 @@ package com.dfsek.terra.biome; +import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.gaea.biome.Decorator; +import com.dfsek.terra.api.gaea.biome.Generator; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.builder.GeneratorBuilder; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.UserDefinedDecorator; import org.bukkit.World; -import org.polydev.gaea.biome.Biome; -import org.polydev.gaea.biome.Decorator; -import org.polydev.gaea.biome.Generator; -import org.polydev.gaea.structures.features.Feature; - -import java.util.List; /** * Class representing a config-defined biome @@ -54,15 +51,6 @@ public class UserDefinedBiome implements Biome { return gen.build(0); } - /** - * Gets a list of Structure Features to be applied to all structures in the biome. - * - * @return List<Feature> - The list of Features. - */ - @Override - public List getStructureFeatures() { - return null; - } /** * Returns the Decorator instance containing information about the population in the biome. diff --git a/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java b/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java index 43219dbec..ecefb99a9 100644 --- a/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java +++ b/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java @@ -1,10 +1,10 @@ package com.dfsek.terra.biome.grid; +import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.gaea.biome.BiomeGrid; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; import org.bukkit.Location; import org.bukkit.World; -import org.polydev.gaea.biome.Biome; -import org.polydev.gaea.biome.BiomeGrid; -import org.polydev.gaea.generation.GenerationPhase; /** * BiomeGrid implementation that holds a single biome. diff --git a/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java b/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java index c2404cc68..b2a0dbe20 100644 --- a/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java +++ b/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java @@ -1,14 +1,14 @@ package com.dfsek.terra.biome.grid; +import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.gaea.biome.BiomeGrid; +import com.dfsek.terra.api.gaea.biome.NormalizationUtil; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.image.ImageLoader; import org.bukkit.Location; import org.bukkit.World; -import org.polydev.gaea.biome.Biome; -import org.polydev.gaea.biome.BiomeGrid; -import org.polydev.gaea.biome.NormalizationUtil; -import org.polydev.gaea.generation.GenerationPhase; public class UserDefinedGrid extends BiomeGrid { private final ImageLoader imageLoader; diff --git a/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java b/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java index 4b4c8dd92..d473af1e4 100644 --- a/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java +++ b/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java @@ -1,8 +1,8 @@ package com.dfsek.terra.biome.grid.master; +import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.biome.grid.UserDefinedGrid; import org.bukkit.World; -import org.polydev.gaea.biome.BiomeGrid; public abstract class TerraBiomeGrid extends BiomeGrid { public TerraBiomeGrid(World w, double freq1, double freq2, int sizeX, int sizeZ) { diff --git a/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java b/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java index 8d23c72c0..7900dc5a3 100644 --- a/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java +++ b/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java @@ -1,5 +1,8 @@ package com.dfsek.terra.biome.grid.master; +import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.gaea.biome.BiomeGrid; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.UserDefinedBiome; @@ -11,9 +14,6 @@ import com.dfsek.terra.config.base.ConfigPackTemplate; import net.jafama.FastMath; import org.bukkit.Location; import org.bukkit.World; -import org.polydev.gaea.biome.Biome; -import org.polydev.gaea.biome.BiomeGrid; -import org.polydev.gaea.generation.GenerationPhase; public class TerraRadialBiomeGrid extends TerraBiomeGrid { private static final int failNum = 0; diff --git a/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java b/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java index 9c82b4e02..45c292156 100644 --- a/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java +++ b/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java @@ -1,5 +1,7 @@ package com.dfsek.terra.biome.grid.master; +import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.UserDefinedBiome; @@ -10,8 +12,6 @@ import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; import org.bukkit.Location; import org.bukkit.World; -import org.polydev.gaea.biome.Biome; -import org.polydev.gaea.generation.GenerationPhase; public class TerraStandardBiomeGrid extends TerraBiomeGrid { private static final int failNum = 0; diff --git a/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java b/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java index 3dd6cf88d..4f171e92b 100644 --- a/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java +++ b/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java @@ -1,7 +1,7 @@ package com.dfsek.terra.biome.palette; +import com.dfsek.terra.api.gaea.world.palette.Palette; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.world.palette.Palette; public class PaletteHolder { private final Palette[] palettes; diff --git a/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java b/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java index ee5b20b02..d447bd275 100644 --- a/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java +++ b/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java @@ -1,9 +1,9 @@ package com.dfsek.terra.biome.palette; +import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.util.PaletteUtil; import net.jafama.FastMath; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.world.palette.Palette; import java.util.Map; import java.util.TreeMap; diff --git a/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java b/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java index 21a57e049..643bf24cc 100644 --- a/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java +++ b/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java @@ -1,8 +1,8 @@ package com.dfsek.terra.biome.palette; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import org.bukkit.block.data.BlockData; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.math.ProbabilityCollection; public class PaletteLayer { private final ProbabilityCollection layer; diff --git a/src/main/java/com/dfsek/terra/biome/palette/SinglePalette.java b/src/main/java/com/dfsek/terra/biome/palette/SinglePalette.java index cb6ad3ca3..254e43c26 100644 --- a/src/main/java/com/dfsek/terra/biome/palette/SinglePalette.java +++ b/src/main/java/com/dfsek/terra/biome/palette/SinglePalette.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.palette; -import org.polydev.gaea.world.palette.Palette; +import com.dfsek.terra.api.gaea.world.palette.Palette; public class SinglePalette extends Palette { private final E item; diff --git a/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java b/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java index ce1ecdcd4..595cd31e8 100644 --- a/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java +++ b/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java @@ -1,7 +1,7 @@ package com.dfsek.terra.biome.postprocessing; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.generic.world.vector.Vector2; -import org.polydev.gaea.math.FastNoiseLite; /** * Offset a coordinate pair by an amount. diff --git a/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java b/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java index 3202dde91..ee56f6a86 100644 --- a/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java +++ b/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java @@ -1,7 +1,7 @@ package com.dfsek.terra.biome.postprocessing; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; import net.jafama.FastMath; -import org.polydev.gaea.math.FastNoiseLite; /** * Class to hold noise function to determine erosion. diff --git a/src/main/java/com/dfsek/terra/carving/CarverCache.java b/src/main/java/com/dfsek/terra/carving/CarverCache.java index 1706dd705..2d4ea412f 100644 --- a/src/main/java/com/dfsek/terra/carving/CarverCache.java +++ b/src/main/java/com/dfsek/terra/carving/CarverCache.java @@ -1,16 +1,16 @@ package com.dfsek.terra.carving; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.gaea.math.MathUtil; +import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.gaea.world.carving.Worm; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import org.bukkit.World; import org.bukkit.util.Vector; -import org.polydev.gaea.biome.Biome; -import org.polydev.gaea.generation.GenerationPhase; -import org.polydev.gaea.math.MathUtil; -import org.polydev.gaea.util.FastRandom; -import org.polydev.gaea.util.GlueList; -import org.polydev.gaea.world.carving.Worm; import java.util.HashMap; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/carving/CarverPalette.java b/src/main/java/com/dfsek/terra/carving/CarverPalette.java index bc6001104..131b8fa8d 100644 --- a/src/main/java/com/dfsek/terra/carving/CarverPalette.java +++ b/src/main/java/com/dfsek/terra/carving/CarverPalette.java @@ -1,9 +1,9 @@ package com.dfsek.terra.carving; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.util.MaterialSet; import org.bukkit.Material; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.math.ProbabilityCollection; import java.util.Map; import java.util.TreeMap; diff --git a/src/main/java/com/dfsek/terra/carving/Cavern.java b/src/main/java/com/dfsek/terra/carving/Cavern.java index 46f94626a..ca40a9cf0 100644 --- a/src/main/java/com/dfsek/terra/carving/Cavern.java +++ b/src/main/java/com/dfsek/terra/carving/Cavern.java @@ -1,5 +1,8 @@ package com.dfsek.terra.carving; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.math.MathUtil; +import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.procgen.GridSpawn; import com.dfsek.terra.procgen.voxel.DeformedSphere; import com.dfsek.terra.procgen.voxel.Tube; @@ -7,9 +10,6 @@ import com.dfsek.terra.procgen.voxel.VoxelGeometry; import org.bukkit.Bukkit; 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.util.FastRandom; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java b/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java index 83977a9b4..33f2f9e9b 100644 --- a/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java +++ b/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java @@ -1,6 +1,11 @@ package com.dfsek.terra.carving; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.gaea.world.carving.Carver; +import com.dfsek.terra.api.gaea.world.carving.Worm; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.CarverTemplate; @@ -8,11 +13,6 @@ import com.dfsek.terra.math.RandomFunction; import net.jafama.FastMath; 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.util.FastRandom; -import org.polydev.gaea.world.carving.Carver; -import org.polydev.gaea.world.carving.Worm; import parsii.eval.Expression; import parsii.eval.Parser; import parsii.eval.Scope; diff --git a/src/main/java/com/dfsek/terra/command/FixChunkCommand.java b/src/main/java/com/dfsek/terra/command/FixChunkCommand.java index 5eec78eca..77994fdfc 100644 --- a/src/main/java/com/dfsek/terra/command/FixChunkCommand.java +++ b/src/main/java/com/dfsek/terra/command/FixChunkCommand.java @@ -1,18 +1,18 @@ package com.dfsek.terra.command; +import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.generation.TerraChunkGenerator; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; import java.util.Collections; import java.util.List; public class FixChunkCommand extends WorldCommand { - public FixChunkCommand(org.polydev.gaea.command.Command parent) { + public FixChunkCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -28,7 +28,7 @@ public class FixChunkCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/OreCommand.java b/src/main/java/com/dfsek/terra/command/OreCommand.java index 337f8848f..9435e4038 100644 --- a/src/main/java/com/dfsek/terra/command/OreCommand.java +++ b/src/main/java/com/dfsek/terra/command/OreCommand.java @@ -1,17 +1,17 @@ package com.dfsek.terra.command; +import com.dfsek.terra.api.gaea.command.WorldCommand; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; import java.util.Collections; import java.util.List; public class OreCommand extends WorldCommand { - public OreCommand(org.polydev.gaea.command.Command parent) { + public OreCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -47,7 +47,7 @@ public class OreCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/PacksCommand.java b/src/main/java/com/dfsek/terra/command/PacksCommand.java index 583f71a8d..50fea52ac 100644 --- a/src/main/java/com/dfsek/terra/command/PacksCommand.java +++ b/src/main/java/com/dfsek/terra/command/PacksCommand.java @@ -1,12 +1,12 @@ package com.dfsek.terra.command; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.Command; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.registry.ConfigRegistry; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.Command; import java.util.Collections; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/command/ReloadCommand.java b/src/main/java/com/dfsek/terra/command/ReloadCommand.java index 306bc3bc8..8fc1374a1 100644 --- a/src/main/java/com/dfsek/terra/command/ReloadCommand.java +++ b/src/main/java/com/dfsek/terra/command/ReloadCommand.java @@ -1,11 +1,11 @@ package com.dfsek.terra.command; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.Command; +import com.dfsek.terra.api.gaea.command.DebugCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.Command; -import org.polydev.gaea.command.DebugCommand; import java.util.Collections; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/command/SaveDataCommand.java b/src/main/java/com/dfsek/terra/command/SaveDataCommand.java index 99c648e12..11c302eb9 100644 --- a/src/main/java/com/dfsek/terra/command/SaveDataCommand.java +++ b/src/main/java/com/dfsek/terra/command/SaveDataCommand.java @@ -1,13 +1,13 @@ package com.dfsek.terra.command; +import com.dfsek.terra.api.gaea.command.Command; +import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.generation.TerraChunkGenerator; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.Command; -import org.polydev.gaea.command.WorldCommand; import java.util.Collections; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/command/TerraCommand.java b/src/main/java/com/dfsek/terra/command/TerraCommand.java index 07a8d23a7..4d64bf834 100644 --- a/src/main/java/com/dfsek/terra/command/TerraCommand.java +++ b/src/main/java/com/dfsek/terra/command/TerraCommand.java @@ -1,5 +1,7 @@ package com.dfsek.terra.command; +import com.dfsek.terra.api.gaea.GaeaPlugin; +import com.dfsek.terra.api.gaea.command.Command; import com.dfsek.terra.command.biome.BiomeCommand; import com.dfsek.terra.command.geometry.GeometryCommand; import com.dfsek.terra.command.image.ImageCommand; @@ -8,8 +10,6 @@ import com.dfsek.terra.command.structure.StructureCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.GaeaPlugin; -import org.polydev.gaea.command.Command; import java.util.Arrays; import java.util.Collections; diff --git a/src/main/java/com/dfsek/terra/command/VersionCommand.java b/src/main/java/com/dfsek/terra/command/VersionCommand.java index 6cf7b7a28..50451a8a2 100644 --- a/src/main/java/com/dfsek/terra/command/VersionCommand.java +++ b/src/main/java/com/dfsek/terra/command/VersionCommand.java @@ -1,11 +1,11 @@ package com.dfsek.terra.command; +import com.dfsek.terra.api.gaea.command.Command; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.Command; import java.util.Collections; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java b/src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java index 5a956e8b8..87d7e64c6 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java +++ b/src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java @@ -1,6 +1,8 @@ package com.dfsek.terra.command.biome; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.config.lang.LangUtil; @@ -9,15 +11,13 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; -import org.polydev.gaea.generation.GenerationPhase; import java.util.Arrays; import java.util.Collections; import java.util.List; public class BiomeCommand extends WorldCommand { - public BiomeCommand(org.polydev.gaea.command.Command parent) { + public BiomeCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -35,7 +35,7 @@ public class BiomeCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Arrays.asList(new BiomeLocateCommand(this, true), new BiomeLocateCommand(this, false), new BiomeInfoCommand(this)); } diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java b/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java index 4a9025444..64581efb6 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java +++ b/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java @@ -1,6 +1,7 @@ package com.dfsek.terra.command.biome; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; @@ -13,7 +14,6 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; import java.util.Collections; import java.util.List; @@ -21,7 +21,7 @@ import java.util.Map; import java.util.stream.Collectors; public class BiomeInfoCommand extends WorldCommand { - public BiomeInfoCommand(org.polydev.gaea.command.Command parent) { + public BiomeInfoCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -74,7 +74,7 @@ public class BiomeInfoCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java b/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java index 4f7765547..109eb08b6 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java +++ b/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java @@ -1,6 +1,7 @@ package com.dfsek.terra.command.biome; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.async.AsyncBiomeFinder; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.lang.LangUtil; @@ -12,7 +13,6 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; import java.util.Collections; import java.util.List; @@ -21,7 +21,7 @@ import java.util.stream.Collectors; public class BiomeLocateCommand extends WorldCommand { private final boolean tp; - public BiomeLocateCommand(org.polydev.gaea.command.Command parent, boolean teleport) { + public BiomeLocateCommand(com.dfsek.terra.api.gaea.command.Command parent, boolean teleport) { super(parent); this.tp = teleport; } @@ -61,7 +61,7 @@ public class BiomeLocateCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/geometry/DeformedSphereCommand.java b/src/main/java/com/dfsek/terra/command/geometry/DeformedSphereCommand.java index 14dc547ce..8e1f690dd 100644 --- a/src/main/java/com/dfsek/terra/command/geometry/DeformedSphereCommand.java +++ b/src/main/java/com/dfsek/terra/command/geometry/DeformedSphereCommand.java @@ -1,5 +1,7 @@ package com.dfsek.terra.command.geometry; +import com.dfsek.terra.api.gaea.command.PlayerCommand; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.procgen.voxel.DeformedSphere; import org.bukkit.Material; @@ -8,14 +10,12 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.PlayerCommand; -import org.polydev.gaea.math.FastNoiseLite; import java.util.Collections; import java.util.List; public class DeformedSphereCommand extends PlayerCommand { - public DeformedSphereCommand(org.polydev.gaea.command.Command parent) { + public DeformedSphereCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -59,7 +59,7 @@ public class DeformedSphereCommand extends PlayerCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/geometry/GeometryCommand.java b/src/main/java/com/dfsek/terra/command/geometry/GeometryCommand.java index 82da4973c..1bf352da2 100644 --- a/src/main/java/com/dfsek/terra/command/geometry/GeometryCommand.java +++ b/src/main/java/com/dfsek/terra/command/geometry/GeometryCommand.java @@ -1,19 +1,19 @@ package com.dfsek.terra.command.geometry; +import com.dfsek.terra.api.gaea.command.DebugCommand; +import com.dfsek.terra.api.gaea.command.PlayerCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.DebugCommand; -import org.polydev.gaea.command.PlayerCommand; import java.util.Arrays; import java.util.Collections; import java.util.List; public class GeometryCommand extends PlayerCommand implements DebugCommand { - public GeometryCommand(org.polydev.gaea.command.Command parent) { + public GeometryCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -29,7 +29,7 @@ public class GeometryCommand extends PlayerCommand implements DebugCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Arrays.asList(new SphereCommand(this), new TubeCommand(this), new DeformedSphereCommand(this)); } diff --git a/src/main/java/com/dfsek/terra/command/geometry/SphereCommand.java b/src/main/java/com/dfsek/terra/command/geometry/SphereCommand.java index 33387f124..4aabb8bab 100644 --- a/src/main/java/com/dfsek/terra/command/geometry/SphereCommand.java +++ b/src/main/java/com/dfsek/terra/command/geometry/SphereCommand.java @@ -1,5 +1,6 @@ package com.dfsek.terra.command.geometry; +import com.dfsek.terra.api.gaea.command.PlayerCommand; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.procgen.voxel.Sphere; import org.bukkit.Material; @@ -8,13 +9,12 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.PlayerCommand; import java.util.Collections; import java.util.List; public class SphereCommand extends PlayerCommand { - public SphereCommand(org.polydev.gaea.command.Command parent) { + public SphereCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -40,7 +40,7 @@ public class SphereCommand extends PlayerCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/geometry/TubeCommand.java b/src/main/java/com/dfsek/terra/command/geometry/TubeCommand.java index 42187be78..3d771fa15 100644 --- a/src/main/java/com/dfsek/terra/command/geometry/TubeCommand.java +++ b/src/main/java/com/dfsek/terra/command/geometry/TubeCommand.java @@ -1,5 +1,6 @@ package com.dfsek.terra.command.geometry; +import com.dfsek.terra.api.gaea.command.PlayerCommand; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.procgen.voxel.Tube; import com.dfsek.terra.util.structure.WorldEditUtil; @@ -10,13 +11,12 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.PlayerCommand; import java.util.Collections; import java.util.List; public class TubeCommand extends PlayerCommand { - public TubeCommand(org.polydev.gaea.command.Command parent) { + public TubeCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -44,7 +44,7 @@ public class TubeCommand extends PlayerCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/image/ImageCommand.java b/src/main/java/com/dfsek/terra/command/image/ImageCommand.java index 7aa1aac8a..145d757e6 100644 --- a/src/main/java/com/dfsek/terra/command/image/ImageCommand.java +++ b/src/main/java/com/dfsek/terra/command/image/ImageCommand.java @@ -1,5 +1,6 @@ package com.dfsek.terra.command.image; +import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.command.image.gui.GUICommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; @@ -7,14 +8,13 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; import java.util.Arrays; import java.util.Collections; import java.util.List; public class ImageCommand extends WorldCommand { - public ImageCommand(org.polydev.gaea.command.Command parent) { + public ImageCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -30,7 +30,7 @@ public class ImageCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Arrays.asList(new RenderCommand(this), new GUICommand(this)); } diff --git a/src/main/java/com/dfsek/terra/command/image/RenderCommand.java b/src/main/java/com/dfsek/terra/command/image/RenderCommand.java index 28f6536e8..27e4ae98b 100644 --- a/src/main/java/com/dfsek/terra/command/image/RenderCommand.java +++ b/src/main/java/com/dfsek/terra/command/image/RenderCommand.java @@ -1,6 +1,7 @@ package com.dfsek.terra.command.image; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.image.WorldImageGenerator; import org.bukkit.World; @@ -8,14 +9,13 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; import java.io.File; import java.util.Collections; import java.util.List; public class RenderCommand extends WorldCommand { - public RenderCommand(org.polydev.gaea.command.Command parent) { + public RenderCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -45,7 +45,7 @@ public class RenderCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/image/gui/GUICommand.java b/src/main/java/com/dfsek/terra/command/image/gui/GUICommand.java index 95bf12f9f..9a592d6b6 100644 --- a/src/main/java/com/dfsek/terra/command/image/gui/GUICommand.java +++ b/src/main/java/com/dfsek/terra/command/image/gui/GUICommand.java @@ -1,20 +1,20 @@ package com.dfsek.terra.command.image.gui; +import com.dfsek.terra.api.gaea.command.DebugCommand; +import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.DebugCommand; -import org.polydev.gaea.command.WorldCommand; import java.util.Arrays; import java.util.Collections; import java.util.List; public class GUICommand extends WorldCommand implements DebugCommand { - public GUICommand(org.polydev.gaea.command.Command parent) { + public GUICommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -30,7 +30,7 @@ public class GUICommand extends WorldCommand implements DebugCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Arrays.asList(new StepGUICommand(this), new RawGUICommand(this)); } diff --git a/src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java b/src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java index a7e8fc84b..53ff18d79 100644 --- a/src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java +++ b/src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java @@ -1,6 +1,7 @@ package com.dfsek.terra.command.image.gui; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.image.ImageLoader; import org.bukkit.World; @@ -8,13 +9,12 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; import java.util.Collections; import java.util.List; public class RawGUICommand extends WorldCommand { - public RawGUICommand(org.polydev.gaea.command.Command parent) { + public RawGUICommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -36,7 +36,7 @@ public class RawGUICommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java b/src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java index ed87a78c8..d1dd7e3bd 100644 --- a/src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java +++ b/src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java @@ -1,6 +1,7 @@ package com.dfsek.terra.command.image.gui; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.image.ImageLoader; import org.bukkit.World; @@ -8,13 +9,12 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; import java.util.Collections; import java.util.List; public class StepGUICommand extends WorldCommand { - public StepGUICommand(org.polydev.gaea.command.Command parent) { + public StepGUICommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -36,7 +36,7 @@ public class StepGUICommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/profile/ProfileCommand.java b/src/main/java/com/dfsek/terra/command/profile/ProfileCommand.java index 9295cbe22..8283dd45f 100644 --- a/src/main/java/com/dfsek/terra/command/profile/ProfileCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/ProfileCommand.java @@ -1,19 +1,19 @@ package com.dfsek.terra.command.profile; +import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; import java.util.Arrays; import java.util.Collections; import java.util.List; public class ProfileCommand extends WorldCommand { - public ProfileCommand(org.polydev.gaea.command.Command parent) { + public ProfileCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -29,7 +29,7 @@ public class ProfileCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Arrays.asList(new QueryCommand(this), new ResetCommand(this), new StartCommand(this), new StopCommand(this)); } diff --git a/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java b/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java index 62f6bc88f..950f5b650 100644 --- a/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java @@ -1,19 +1,19 @@ package com.dfsek.terra.command.profile; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; -import org.polydev.gaea.profiler.WorldProfiler; import java.util.Collections; import java.util.List; public class QueryCommand extends WorldCommand { - public QueryCommand(org.polydev.gaea.command.Command parent) { + public QueryCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -30,7 +30,7 @@ public class QueryCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java b/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java index 9ac0b02fe..02450017f 100644 --- a/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java @@ -1,20 +1,20 @@ package com.dfsek.terra.command.profile; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; -import org.polydev.gaea.profiler.WorldProfiler; import java.util.Collections; import java.util.List; public class ResetCommand extends WorldCommand { - public ResetCommand(org.polydev.gaea.command.Command parent) { + public ResetCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -32,7 +32,7 @@ public class ResetCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/profile/StartCommand.java b/src/main/java/com/dfsek/terra/command/profile/StartCommand.java index a5f71b0f5..3dd287fed 100644 --- a/src/main/java/com/dfsek/terra/command/profile/StartCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/StartCommand.java @@ -1,20 +1,20 @@ package com.dfsek.terra.command.profile; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; -import org.polydev.gaea.profiler.WorldProfiler; import java.util.Collections; import java.util.List; public class StartCommand extends WorldCommand { - public StartCommand(org.polydev.gaea.command.Command parent) { + public StartCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -32,7 +32,7 @@ public class StartCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/profile/StopCommand.java b/src/main/java/com/dfsek/terra/command/profile/StopCommand.java index dd9921b87..c23be4232 100644 --- a/src/main/java/com/dfsek/terra/command/profile/StopCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/StopCommand.java @@ -1,20 +1,20 @@ package com.dfsek.terra.command.profile; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; -import org.polydev.gaea.profiler.WorldProfiler; import java.util.Collections; import java.util.List; public class StopCommand extends WorldCommand { - public StopCommand(org.polydev.gaea.command.Command parent) { + public StopCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -32,7 +32,7 @@ public class StopCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/structure/ExportCommand.java b/src/main/java/com/dfsek/terra/command/structure/ExportCommand.java index 58df083d5..7afb8cdf9 100644 --- a/src/main/java/com/dfsek/terra/command/structure/ExportCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/ExportCommand.java @@ -1,5 +1,6 @@ package com.dfsek.terra.command.structure; +import com.dfsek.terra.api.gaea.command.PlayerCommand; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.structure.InitializationException; import com.dfsek.terra.structure.Structure; @@ -9,7 +10,6 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.PlayerCommand; import java.io.File; import java.io.IOException; @@ -17,7 +17,7 @@ import java.util.Collections; import java.util.List; public class ExportCommand extends PlayerCommand { - public ExportCommand(org.polydev.gaea.command.Command parent) { + public ExportCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -54,7 +54,7 @@ public class ExportCommand extends PlayerCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java b/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java index 407a6f10a..93f7f0e54 100644 --- a/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java @@ -1,6 +1,7 @@ package com.dfsek.terra.command.structure; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.async.AsyncStructureFinder; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.generation.TerraChunkGenerator; @@ -12,7 +13,6 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.WorldCommand; import java.util.Collections; import java.util.List; @@ -22,7 +22,7 @@ import java.util.stream.Collectors; public class LocateCommand extends WorldCommand { private final boolean tp; - public LocateCommand(org.polydev.gaea.command.Command parent, boolean tp) { + public LocateCommand(com.dfsek.terra.api.gaea.command.Command parent, boolean tp) { super(parent); this.tp = tp; } @@ -65,7 +65,7 @@ public class LocateCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java b/src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java index b9fd6534d..fa288dbd7 100644 --- a/src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java @@ -1,6 +1,8 @@ package com.dfsek.terra.command.structure; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.DebugCommand; +import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.structure.StructureSpawnRequirement; import org.bukkit.Location; import org.bukkit.World; @@ -8,14 +10,12 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.DebugCommand; -import org.polydev.gaea.command.WorldCommand; import java.util.Collections; import java.util.List; public class SpawnCommand extends WorldCommand implements DebugCommand { - public SpawnCommand(org.polydev.gaea.command.Command parent) { + public SpawnCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -39,7 +39,7 @@ public class SpawnCommand extends WorldCommand implements DebugCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/structure/StructureCommand.java b/src/main/java/com/dfsek/terra/command/structure/StructureCommand.java index af1a7ed74..325f93363 100644 --- a/src/main/java/com/dfsek/terra/command/structure/StructureCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/StructureCommand.java @@ -1,19 +1,19 @@ package com.dfsek.terra.command.structure; +import com.dfsek.terra.api.gaea.command.PlayerCommand; import com.dfsek.terra.command.structure.load.LoadCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.PlayerCommand; import java.util.Arrays; import java.util.Collections; import java.util.List; public class StructureCommand extends PlayerCommand { - public StructureCommand(org.polydev.gaea.command.Command parent) { + public StructureCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -29,7 +29,7 @@ public class StructureCommand extends PlayerCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Arrays.asList(new ExportCommand(this), new LoadCommand(this), new LocateCommand(this, false), new LocateCommand(this, true), new SpawnCommand(this)); } diff --git a/src/main/java/com/dfsek/terra/command/structure/load/LoadCommand.java b/src/main/java/com/dfsek/terra/command/structure/load/LoadCommand.java index 7e5421b0a..7cdfe8a78 100644 --- a/src/main/java/com/dfsek/terra/command/structure/load/LoadCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/load/LoadCommand.java @@ -1,11 +1,11 @@ package com.dfsek.terra.command.structure.load; +import com.dfsek.terra.api.gaea.command.DebugCommand; +import com.dfsek.terra.api.gaea.command.PlayerCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.DebugCommand; -import org.polydev.gaea.command.PlayerCommand; import java.io.File; import java.io.FilenameFilter; @@ -16,7 +16,7 @@ import java.util.Collections; import java.util.List; public class LoadCommand extends PlayerCommand implements DebugCommand { - public LoadCommand(org.polydev.gaea.command.Command parent) { + public LoadCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -45,7 +45,7 @@ public class LoadCommand extends PlayerCommand implements DebugCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Arrays.asList(new LoadRawCommand(this), new LoadFullCommand(this, true), new LoadFullCommand(this, false)); } diff --git a/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java b/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java index 1aaed376e..b7282ec5f 100644 --- a/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java @@ -1,6 +1,7 @@ package com.dfsek.terra.command.structure.load; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.DebugCommand; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.structure.Rotation; import com.dfsek.terra.structure.Structure; @@ -8,7 +9,6 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.DebugCommand; import java.io.File; import java.io.IOException; @@ -20,7 +20,7 @@ import java.util.stream.Stream; public class LoadFullCommand extends LoadCommand implements DebugCommand { private final boolean chunk; - public LoadFullCommand(org.polydev.gaea.command.Command parent, boolean chunk) { + public LoadFullCommand(com.dfsek.terra.api.gaea.command.Command parent, boolean chunk) { super(parent); this.chunk = chunk; } @@ -52,7 +52,7 @@ public class LoadFullCommand extends LoadCommand implements DebugCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java b/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java index 94fb53580..42995e036 100644 --- a/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java @@ -1,6 +1,7 @@ package com.dfsek.terra.command.structure.load; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.command.DebugCommand; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.structure.Structure; @@ -14,7 +15,6 @@ import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.command.DebugCommand; import java.io.File; import java.io.IOException; @@ -23,7 +23,7 @@ import java.util.List; import java.util.stream.Collectors; public class LoadRawCommand extends LoadCommand implements DebugCommand { - public LoadRawCommand(org.polydev.gaea.command.Command parent) { + public LoadRawCommand(com.dfsek.terra.api.gaea.command.Command parent) { super(parent); } @@ -97,7 +97,7 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index c0e53e82d..cabba5519 100644 --- a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -5,6 +5,11 @@ import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.gaea.structures.loot.LootTable; +import com.dfsek.terra.api.gaea.tree.Tree; +import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.carving.UserDefinedCarver; @@ -47,11 +52,6 @@ import com.dfsek.terra.registry.TerraRegistry; import com.dfsek.terra.registry.TreeRegistry; import com.dfsek.terra.structure.Structure; import com.dfsek.terra.util.StructureTypeEnum; -import org.polydev.gaea.biome.Biome; -import org.polydev.gaea.structures.loot.LootTable; -import org.polydev.gaea.tree.Tree; -import org.polydev.gaea.world.Flora; -import org.polydev.gaea.world.palette.Palette; import parsii.eval.Scope; import java.io.File; diff --git a/src/main/java/com/dfsek/terra/config/base/PluginConfig.java b/src/main/java/com/dfsek/terra/config/base/PluginConfig.java index 44fa5c697..4a79bcaa7 100644 --- a/src/main/java/com/dfsek/terra/config/base/PluginConfig.java +++ b/src/main/java/com/dfsek/terra/config/base/PluginConfig.java @@ -6,9 +6,9 @@ import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.GaeaPlugin; +import com.dfsek.terra.api.gaea.util.JarUtil; import com.dfsek.terra.debug.Debug; -import org.polydev.gaea.GaeaPlugin; -import org.polydev.gaea.util.JarUtil; import java.io.File; import java.io.FileInputStream; diff --git a/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java b/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java index ce203c754..50260148b 100644 --- a/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java +++ b/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java @@ -1,8 +1,8 @@ package com.dfsek.terra.config.builder.biomegrid; +import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.config.base.ConfigPack; import org.bukkit.World; -import org.polydev.gaea.biome.BiomeGrid; public interface BiomeGridBuilder { BiomeGrid build(World world, ConfigPack config); diff --git a/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java b/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java index 1776c6ef4..67a0e8381 100644 --- a/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java +++ b/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java @@ -1,9 +1,9 @@ package com.dfsek.terra.config.builder.biomegrid; +import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.biome.grid.SingleBiomeGrid; import com.dfsek.terra.config.base.ConfigPack; import org.bukkit.World; -import org.polydev.gaea.biome.Biome; public class SingleGridBuilder implements BiomeGridBuilder { private final Biome biome; diff --git a/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java b/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java index 2b3b2d9b1..c724968a2 100644 --- a/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java +++ b/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java @@ -1,9 +1,9 @@ package com.dfsek.terra.config.builder.biomegrid; +import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.biome.grid.UserDefinedGrid; import com.dfsek.terra.config.base.ConfigPack; import org.bukkit.World; -import org.polydev.gaea.biome.Biome; public class UserDefinedGridBuilder implements BiomeGridBuilder { private double xFreq; diff --git a/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java b/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java index 6e4c5f97d..6933a2b1b 100644 --- a/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java @@ -1,12 +1,12 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.builder.GeneratorBuilder; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.UserDefinedDecorator; -import org.polydev.gaea.math.ProbabilityCollection; public class BiomeFactory implements TerraFactory { private final ConfigPack pack; diff --git a/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java b/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java index 35e2a4616..30e8b5877 100644 --- a/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java @@ -1,11 +1,11 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.builder.biomegrid.BiomeGridBuilder; import com.dfsek.terra.config.builder.biomegrid.UserDefinedGridBuilder; import com.dfsek.terra.config.templates.BiomeGridTemplate; -import org.polydev.gaea.biome.Biome; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java b/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java index a9fcdba11..05ee8197e 100644 --- a/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java @@ -2,10 +2,10 @@ package com.dfsek.terra.config.factories; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.templates.CarverTemplate; -import org.polydev.gaea.math.MathUtil; import parsii.tokenizer.ParseException; import java.util.Arrays; diff --git a/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java b/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java index b29268677..149c8adb4 100644 --- a/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java @@ -1,14 +1,14 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.gaea.world.palette.RandomPalette; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.templates.FloraTemplate; import com.dfsek.terra.generation.items.flora.TerraFlora; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.util.FastRandom; -import org.polydev.gaea.world.Flora; -import org.polydev.gaea.world.palette.Palette; -import org.polydev.gaea.world.palette.RandomPalette; public class FloraFactory implements TerraFactory { @Override diff --git a/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java b/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java index 7b8dcd5a4..8952b26dc 100644 --- a/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java @@ -1,14 +1,14 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.gaea.world.palette.RandomPalette; +import com.dfsek.terra.api.gaea.world.palette.SimplexPalette; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.templates.PaletteTemplate; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.math.FastNoiseLite; -import org.polydev.gaea.util.FastRandom; -import org.polydev.gaea.world.palette.Palette; -import org.polydev.gaea.world.palette.RandomPalette; -import org.polydev.gaea.world.palette.SimplexPalette; public class PaletteFactory implements TerraFactory> { @Override diff --git a/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java b/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java index 2bd2e3281..049b51199 100644 --- a/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java @@ -2,9 +2,9 @@ package com.dfsek.terra.config.factories; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.config.templates.TreeTemplate; import com.dfsek.terra.generation.items.tree.TerraTree; -import org.polydev.gaea.tree.Tree; public class TreeFactory implements TerraFactory { @Override diff --git a/src/main/java/com/dfsek/terra/config/lang/LangUtil.java b/src/main/java/com/dfsek/terra/config/lang/LangUtil.java index bd4b9a93d..746b3e1fb 100644 --- a/src/main/java/com/dfsek/terra/config/lang/LangUtil.java +++ b/src/main/java/com/dfsek/terra/config/lang/LangUtil.java @@ -1,11 +1,11 @@ package com.dfsek.terra.config.lang; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.lang.Language; import com.dfsek.terra.debug.Debug; import org.bukkit.command.CommandSender; import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.plugin.java.JavaPlugin; -import org.polydev.gaea.lang.Language; import java.io.File; import java.io.IOException; @@ -14,7 +14,7 @@ import java.util.jar.JarFile; import java.util.logging.Level; import java.util.logging.Logger; -import static org.polydev.gaea.util.JarUtil.copyResourcesToDirectory; +import static com.dfsek.terra.api.gaea.util.JarUtil.copyResourcesToDirectory; public final class LangUtil { private static Language language; diff --git a/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java b/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java index 460335d80..4d66da362 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java @@ -3,10 +3,10 @@ package com.dfsek.terra.config.loaders; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.api.gaea.structures.loot.LootTable; import com.dfsek.terra.config.files.Loader; import org.apache.commons.io.IOUtils; import org.json.simple.parser.ParseException; -import org.polydev.gaea.structures.loot.LootTable; import java.io.IOException; import java.io.InputStream; diff --git a/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java b/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java index 5680d153c..06e95c3bf 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.loaders; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import org.polydev.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; diff --git a/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java b/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java index 5e08691a7..8cd7abed8 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.loaders; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import org.polydev.gaea.math.Range; +import com.dfsek.terra.api.gaea.math.Range; import java.lang.reflect.Type; import java.util.Map; diff --git a/src/main/java/com/dfsek/terra/config/loaders/Types.java b/src/main/java/com/dfsek/terra/config/loaders/Types.java index 553d53df9..4eb23e120 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/Types.java +++ b/src/main/java/com/dfsek/terra/config/loaders/Types.java @@ -1,11 +1,11 @@ package com.dfsek.terra.config.loaders; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.tree.Tree; +import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.gaea.world.palette.Palette; import org.bukkit.Material; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.math.ProbabilityCollection; -import org.polydev.gaea.tree.Tree; -import org.polydev.gaea.world.Flora; -import org.polydev.gaea.world.palette.Palette; import java.lang.reflect.Type; import java.util.Set; diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java b/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java index 4a2ed5f30..645f3c6c9 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java @@ -3,12 +3,12 @@ package com.dfsek.terra.config.loaders.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.gaea.world.Flora; import com.dfsek.terra.config.loaders.Types; import com.dfsek.terra.generation.items.flora.FloraLayer; -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 java.lang.reflect.Type; import java.util.Map; diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java b/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java index 8f135b178..690e9dd63 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java @@ -5,8 +5,8 @@ import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.generation.config.NoiseBuilder; -import org.polydev.gaea.math.FastNoiseLite; import java.lang.reflect.Type; import java.util.Map; diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java b/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java index 31a7e62a0..de649dfb6 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java @@ -3,8 +3,8 @@ package com.dfsek.terra.config.loaders.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.generation.items.ores.OreConfig; -import org.polydev.gaea.math.Range; import java.lang.reflect.Type; import java.util.Map; diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/StructureFeatureLoader.java b/src/main/java/com/dfsek/terra/config/loaders/config/StructureFeatureLoader.java index 35acae3ee..3621fb395 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/config/StructureFeatureLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/config/StructureFeatureLoader.java @@ -3,11 +3,11 @@ package com.dfsek.terra.config.loaders.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.structure.features.EntityFeature; import com.dfsek.terra.structure.features.Feature; import com.dfsek.terra.util.MaterialSet; import org.bukkit.entity.EntityType; -import org.polydev.gaea.math.Range; import java.lang.reflect.Type; import java.util.Map; diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java b/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java index 25c2cee82..7b09b4701 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java @@ -3,13 +3,13 @@ package com.dfsek.terra.config.loaders.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.api.gaea.GaeaPlugin; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.config.loaders.Types; import com.dfsek.terra.generation.items.tree.TreeLayer; -import org.polydev.gaea.GaeaPlugin; -import org.polydev.gaea.math.FastNoiseLite; -import org.polydev.gaea.math.ProbabilityCollection; -import org.polydev.gaea.math.Range; -import org.polydev.gaea.tree.Tree; import java.lang.reflect.Type; import java.util.Map; diff --git a/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java b/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java index dfd74887c..452f1679c 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java @@ -4,11 +4,11 @@ import com.dfsek.tectonic.config.Configuration; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.config.loaders.Types; import com.dfsek.terra.util.MaterialSet; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.math.ProbabilityCollection; import java.lang.reflect.Type; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java b/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java index fa9f9b826..2d8432264 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java @@ -3,11 +3,11 @@ package com.dfsek.terra.config.loaders.palette; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.biome.palette.PaletteHolderBuilder; import com.dfsek.terra.config.loaders.Types; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.world.palette.Palette; import java.lang.reflect.Type; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java b/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java index d96cfb1fc..7c3e62d14 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java @@ -3,10 +3,10 @@ package com.dfsek.terra.config.loaders.palette; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.loaders.Types; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.math.ProbabilityCollection; import java.lang.reflect.Type; import java.util.Map; diff --git a/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java b/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java index 2180f1e8a..2ba67be40 100644 --- a/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java @@ -2,7 +2,7 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Value; -import org.polydev.gaea.biome.Biome; +import com.dfsek.terra.api.gaea.biome.Biome; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index 824d7e310..aa642aa63 100644 --- a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -5,6 +5,8 @@ import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; +import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.biome.palette.SinglePalette; import com.dfsek.terra.carving.UserDefinedCarver; @@ -17,8 +19,6 @@ import com.dfsek.terra.math.BlankFunction; import org.bukkit.Material; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.util.GlueList; -import org.polydev.gaea.world.palette.Palette; import parsii.eval.Parser; import parsii.eval.Scope; import parsii.tokenizer.ParseException; diff --git a/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java b/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java index fba1810ac..bf799a005 100644 --- a/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java @@ -3,10 +3,10 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; +import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.util.MaterialSet; import org.bukkit.Material; -import org.polydev.gaea.math.Range; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java b/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java index c11d81867..b728a3739 100644 --- a/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java @@ -3,10 +3,10 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; +import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.generation.items.ores.Ore; import com.dfsek.terra.util.MaterialSet; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.math.Range; @SuppressWarnings({"unused", "FieldMayBeFinal"}) public class OreTemplate extends AbstractableTemplate { diff --git a/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java b/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java index 0bbab8b7c..281baa12d 100644 --- a/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java @@ -3,13 +3,13 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.gaea.structures.loot.LootTable; +import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.procgen.GridSpawn; import com.dfsek.terra.structure.Structure; import com.dfsek.terra.structure.features.Feature; -import org.polydev.gaea.math.ProbabilityCollection; -import org.polydev.gaea.math.Range; -import org.polydev.gaea.structures.loot.LootTable; -import org.polydev.gaea.util.GlueList; import java.util.List; import java.util.Map; diff --git a/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java b/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java index f41d18d4a..deef3ed5c 100644 --- a/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java @@ -3,9 +3,9 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.structure.Structure; import com.dfsek.terra.util.MaterialSet; -import org.polydev.gaea.math.ProbabilityCollection; @SuppressWarnings({"unused", "FieldMayBeFinal"}) public class TreeTemplate extends AbstractableTemplate { diff --git a/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java b/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java index 31e860b62..3fd28f5f4 100644 --- a/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java +++ b/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java @@ -1,13 +1,13 @@ package com.dfsek.terra.debug.gui; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.image.ImageLoader; import net.jafama.FastMath; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import org.polydev.gaea.generation.GenerationPhase; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java b/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java index e02ddb546..3269e3510 100644 --- a/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java +++ b/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java @@ -1,9 +1,9 @@ package com.dfsek.terra.generation; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.gaea.math.Interpolator; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.config.WorldGenerator; -import org.polydev.gaea.generation.GenerationPhase; -import org.polydev.gaea.math.Interpolator; public class ElevationInterpolator { private final WorldGenerator[][] gens = new WorldGenerator[10][10]; diff --git a/src/main/java/com/dfsek/terra/generation/Sampler.java b/src/main/java/com/dfsek/terra/generation/Sampler.java index 1bc098331..15b0079ad 100644 --- a/src/main/java/com/dfsek/terra/generation/Sampler.java +++ b/src/main/java/com/dfsek/terra/generation/Sampler.java @@ -1,7 +1,7 @@ package com.dfsek.terra.generation; +import com.dfsek.terra.api.gaea.math.ChunkInterpolator; import net.jafama.FastMath; -import org.polydev.gaea.math.ChunkInterpolator; public class Sampler { private final ChunkInterpolator interpolator; diff --git a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index da0fd8892..909673760 100644 --- a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -2,6 +2,15 @@ package com.dfsek.terra.generation; import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.gaea.generation.GaeaChunkGenerator; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.gaea.generation.GenerationPopulator; +import com.dfsek.terra.api.gaea.math.ChunkInterpolator; +import com.dfsek.terra.api.gaea.population.PopulationManager; +import com.dfsek.terra.api.gaea.profiler.ProfileFuture; +import com.dfsek.terra.api.gaea.profiler.WorldProfiler; +import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.lang.LangUtil; @@ -20,15 +29,6 @@ import org.bukkit.block.data.BlockData; import org.bukkit.generator.BlockPopulator; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.biome.Biome; -import org.polydev.gaea.generation.GaeaChunkGenerator; -import org.polydev.gaea.generation.GenerationPhase; -import org.polydev.gaea.generation.GenerationPopulator; -import org.polydev.gaea.math.ChunkInterpolator; -import org.polydev.gaea.population.PopulationManager; -import org.polydev.gaea.profiler.ProfileFuture; -import org.polydev.gaea.profiler.WorldProfiler; -import org.polydev.gaea.world.palette.Palette; import java.io.FileNotFoundException; import java.io.IOException; @@ -94,7 +94,7 @@ public class TerraChunkGenerator extends GaeaChunkGenerator { if(!tw.isSafe()) return chunk; int xOrig = (chunkX << 4); int zOrig = (chunkZ << 4); - org.polydev.gaea.biome.BiomeGrid grid = getBiomeGrid(world); + com.dfsek.terra.api.gaea.biome.BiomeGrid grid = getBiomeGrid(world); ElevationInterpolator elevationInterpolator; try(ProfileFuture ignore = tw.getProfiler().measure("ElevationTime")) { @@ -176,7 +176,7 @@ public class TerraChunkGenerator extends GaeaChunkGenerator { } @Override - public org.polydev.gaea.biome.BiomeGrid getBiomeGrid(World world) { + public com.dfsek.terra.api.gaea.biome.BiomeGrid getBiomeGrid(World world) { return main.getWorld(world).getGrid(); } diff --git a/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java b/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java index 347aed9ab..e3088f6de 100644 --- a/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java +++ b/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java @@ -1,10 +1,10 @@ package com.dfsek.terra.generation; +import com.dfsek.terra.api.gaea.biome.Decorator; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.tree.Tree; +import com.dfsek.terra.api.gaea.world.Flora; import org.bukkit.block.Biome; -import org.polydev.gaea.biome.Decorator; -import org.polydev.gaea.math.ProbabilityCollection; -import org.polydev.gaea.tree.Tree; -import org.polydev.gaea.world.Flora; public class UserDefinedDecorator extends Decorator { diff --git a/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java b/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java index e8e957a43..4d1082de3 100644 --- a/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java +++ b/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java @@ -3,7 +3,7 @@ package com.dfsek.terra.generation.config; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; -import org.polydev.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; public class NoiseBuilder implements ConfigTemplate { @Value("type") diff --git a/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java b/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java index 576ab7f28..84fc589f7 100644 --- a/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java +++ b/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java @@ -1,15 +1,15 @@ package com.dfsek.terra.generation.config; +import com.dfsek.terra.api.gaea.biome.Generator; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.math.Interpolator; +import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.math.NoiseFunction2; import com.dfsek.terra.math.NoiseFunction3; import com.dfsek.terra.math.RandomFunction; import org.bukkit.World; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.biome.Generator; -import org.polydev.gaea.math.FastNoiseLite; -import org.polydev.gaea.math.Interpolator; -import org.polydev.gaea.world.palette.Palette; import parsii.eval.Expression; import parsii.eval.Parser; import parsii.eval.Scope; diff --git a/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java b/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java index 3285fa71c..4370e0fcd 100644 --- a/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java +++ b/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java @@ -1,10 +1,10 @@ package com.dfsek.terra.generation.items; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.generic.world.vector.Vector2; import org.bukkit.Chunk; -import org.polydev.gaea.math.FastNoiseLite; -import org.polydev.gaea.math.ProbabilityCollection; -import org.polydev.gaea.math.Range; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java b/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java index af6019197..5ef80194d 100644 --- a/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java +++ b/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java @@ -1,11 +1,11 @@ package com.dfsek.terra.generation.items; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.gaea.structures.loot.LootTable; import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.procgen.GridSpawn; import com.dfsek.terra.structure.Structure; -import org.polydev.gaea.math.ProbabilityCollection; -import org.polydev.gaea.math.Range; -import org.polydev.gaea.structures.loot.LootTable; import java.util.Map; diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java b/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java index a061371c9..e89d875dc 100644 --- a/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java +++ b/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java @@ -1,13 +1,13 @@ package com.dfsek.terra.generation.items.flora; +import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.gaea.world.Flora; import org.bukkit.Chunk; import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.math.Range; -import org.polydev.gaea.util.GlueList; -import org.polydev.gaea.world.Flora; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java b/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java index 29d2f462f..a2b7fdf6f 100644 --- a/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java +++ b/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java @@ -1,12 +1,12 @@ package com.dfsek.terra.generation.items.flora; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.gaea.world.Flora; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.generation.items.PlaceableLayer; import org.bukkit.Chunk; -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 java.util.Random; diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java b/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java index cbcb15d9b..713c08bb2 100644 --- a/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java +++ b/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java @@ -1,6 +1,11 @@ package com.dfsek.terra.generation.items.flora; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; @@ -12,11 +17,6 @@ import org.bukkit.block.data.BlockData; import org.bukkit.block.data.Directional; import org.bukkit.block.data.MultipleFacing; import org.bukkit.block.data.Rotatable; -import org.polydev.gaea.math.Range; -import org.polydev.gaea.util.FastRandom; -import org.polydev.gaea.util.GlueList; -import org.polydev.gaea.world.Flora; -import org.polydev.gaea.world.palette.Palette; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java b/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java index d5534a20c..985ffc53a 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java +++ b/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java @@ -1,14 +1,14 @@ package com.dfsek.terra.generation.items.ores; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.util.MaterialSet; import org.bukkit.Chunk; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.util.Vector; -import org.polydev.gaea.math.FastNoiseLite; -import org.polydev.gaea.math.Range; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java b/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java index 305ca5785..b8f4c5a75 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java +++ b/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation.items.ores; -import org.polydev.gaea.math.Range; +import com.dfsek.terra.api.gaea.math.Range; public class OreConfig { private final Range amount; diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java b/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java index fde4fb7ab..d3f19d63e 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java +++ b/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation.items.ores; -import org.polydev.gaea.util.GlueList; +import com.dfsek.terra.api.gaea.util.GlueList; import java.util.List; import java.util.function.BiConsumer; diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java b/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java index 9b283fb2c..dfcc09726 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java +++ b/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java @@ -1,6 +1,7 @@ package com.dfsek.terra.generation.items.ores; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; @@ -8,7 +9,6 @@ import org.bukkit.Chunk; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.util.Vector; -import org.polydev.gaea.math.Range; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index 615510842..c73e9d1c6 100644 --- a/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -1,6 +1,8 @@ package com.dfsek.terra.generation.items.tree; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.structure.Rotation; import com.dfsek.terra.structure.Structure; @@ -10,8 +12,6 @@ import com.dfsek.terra.util.MaterialSet; import com.dfsek.terra.util.structure.RotationUtil; import org.bukkit.Location; import org.bukkit.plugin.java.JavaPlugin; -import org.polydev.gaea.math.ProbabilityCollection; -import org.polydev.gaea.tree.Tree; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java b/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java index 75edd2672..88a1a117f 100644 --- a/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java +++ b/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java @@ -1,16 +1,16 @@ package com.dfsek.terra.generation.items.tree; +import com.dfsek.terra.api.gaea.GaeaPlugin; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.gaea.tree.Tree; +import com.dfsek.terra.api.gaea.tree.TreeType; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.generation.items.PlaceableLayer; import org.bukkit.Chunk; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.polydev.gaea.GaeaPlugin; -import org.polydev.gaea.math.FastNoiseLite; -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 java.util.Random; diff --git a/src/main/java/com/dfsek/terra/image/ImageLoader.java b/src/main/java/com/dfsek/terra/image/ImageLoader.java index b5f28e9bd..ed90deeca 100644 --- a/src/main/java/com/dfsek/terra/image/ImageLoader.java +++ b/src/main/java/com/dfsek/terra/image/ImageLoader.java @@ -1,12 +1,12 @@ package com.dfsek.terra.image; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.biome.NormalizationUtil; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.debug.gui.DebugGUI; import net.jafama.FastMath; import org.bukkit.World; -import org.polydev.gaea.biome.NormalizationUtil; import javax.imageio.ImageIO; import java.awt.*; diff --git a/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java b/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java index 2ae7188f0..7669c530f 100644 --- a/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java +++ b/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java @@ -2,9 +2,9 @@ package com.dfsek.terra.image; import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.biome.NormalizationUtil; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import org.bukkit.World; -import org.polydev.gaea.biome.NormalizationUtil; import javax.imageio.ImageIO; import java.awt.*; diff --git a/src/main/java/com/dfsek/terra/listeners/EventListener.java b/src/main/java/com/dfsek/terra/listeners/EventListener.java index 25bd067ec..239983013 100644 --- a/src/main/java/com/dfsek/terra/listeners/EventListener.java +++ b/src/main/java/com/dfsek/terra/listeners/EventListener.java @@ -2,6 +2,9 @@ package com.dfsek.terra.listeners; import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.tree.Tree; +import com.dfsek.terra.api.gaea.tree.TreeType; +import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.items.tree.TerraTree; @@ -12,9 +15,6 @@ import org.bukkit.block.data.BlockData; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.StructureGrowEvent; -import org.polydev.gaea.tree.Tree; -import org.polydev.gaea.tree.TreeType; -import org.polydev.gaea.util.FastRandom; /** * Listener for events on all implementations. diff --git a/src/main/java/com/dfsek/terra/math/NoiseFunction2.java b/src/main/java/com/dfsek/terra/math/NoiseFunction2.java index fac412c93..a9760aeda 100644 --- a/src/main/java/com/dfsek/terra/math/NoiseFunction2.java +++ b/src/main/java/com/dfsek/terra/math/NoiseFunction2.java @@ -1,8 +1,8 @@ package com.dfsek.terra.math; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.generation.config.NoiseBuilder; import com.dfsek.terra.util.hash.HashMapDoubleDouble; -import org.polydev.gaea.math.FastNoiseLite; import parsii.eval.Expression; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/math/NoiseFunction3.java b/src/main/java/com/dfsek/terra/math/NoiseFunction3.java index f257afff5..fbd2fd02e 100644 --- a/src/main/java/com/dfsek/terra/math/NoiseFunction3.java +++ b/src/main/java/com/dfsek/terra/math/NoiseFunction3.java @@ -1,7 +1,7 @@ package com.dfsek.terra.math; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.generation.config.NoiseBuilder; -import org.polydev.gaea.math.FastNoiseLite; import parsii.eval.Expression; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/math/RandomFunction.java b/src/main/java/com/dfsek/terra/math/RandomFunction.java index bad8d3d6e..3dde8768d 100644 --- a/src/main/java/com/dfsek/terra/math/RandomFunction.java +++ b/src/main/java/com/dfsek/terra/math/RandomFunction.java @@ -1,13 +1,13 @@ package com.dfsek.terra.math; -import org.polydev.gaea.util.FastRandom; +import com.dfsek.terra.api.gaea.util.FastRandom; import parsii.eval.Expression; import parsii.eval.Function; import java.util.List; /** - * Provides access to a PRNG ({@link org.polydev.gaea.util.FastRandom}) + * Provides access to a PRNG ({@link com.dfsek.terra.api.gaea.util.FastRandom}) *

* Takes 1 argument, which sets the seed */ diff --git a/src/main/java/com/dfsek/terra/population/CavePopulator.java b/src/main/java/com/dfsek/terra/population/CavePopulator.java index 9a32c1035..f216da84b 100644 --- a/src/main/java/com/dfsek/terra/population/CavePopulator.java +++ b/src/main/java/com/dfsek/terra/population/CavePopulator.java @@ -2,6 +2,7 @@ package com.dfsek.terra.population; import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; @@ -15,7 +16,6 @@ import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.bukkit.generator.BlockPopulator; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.profiler.ProfileFuture; import java.util.HashMap; import java.util.HashSet; diff --git a/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/src/main/java/com/dfsek/terra/population/FloraPopulator.java index 0327d641c..2553382d0 100644 --- a/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -2,6 +2,9 @@ package com.dfsek.terra.population; import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.gaea.population.GaeaBlockPopulator; +import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; @@ -9,9 +12,6 @@ import com.dfsek.terra.generation.items.flora.FloraLayer; import org.bukkit.Chunk; import org.bukkit.World; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.generation.GenerationPhase; -import org.polydev.gaea.population.GaeaBlockPopulator; -import org.polydev.gaea.profiler.ProfileFuture; import java.util.HashMap; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/population/OrePopulator.java b/src/main/java/com/dfsek/terra/population/OrePopulator.java index 4443ae591..bf908b9fb 100644 --- a/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -2,18 +2,18 @@ package com.dfsek.terra.population; import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.gaea.math.MathUtil; +import com.dfsek.terra.api.gaea.population.GaeaBlockPopulator; +import com.dfsek.terra.api.gaea.profiler.ProfileFuture; +import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import org.bukkit.Chunk; import org.bukkit.World; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.biome.Biome; -import org.polydev.gaea.generation.GenerationPhase; -import org.polydev.gaea.math.MathUtil; -import org.polydev.gaea.population.GaeaBlockPopulator; -import org.polydev.gaea.profiler.ProfileFuture; -import org.polydev.gaea.util.FastRandom; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/src/main/java/com/dfsek/terra/population/StructurePopulator.java index a08ca9428..1d542dbfa 100644 --- a/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -2,6 +2,9 @@ package com.dfsek.terra.population; import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.profiler.ProfileFuture; +import com.dfsek.terra.api.gaea.structures.loot.LootTable; +import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; @@ -21,9 +24,6 @@ import org.bukkit.World; import org.bukkit.generator.BlockPopulator; import org.bukkit.inventory.BlockInventoryHolder; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.profiler.ProfileFuture; -import org.polydev.gaea.structures.loot.LootTable; -import org.polydev.gaea.util.FastRandom; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/population/TreePopulator.java b/src/main/java/com/dfsek/terra/population/TreePopulator.java index f2524eec5..6ad922681 100644 --- a/src/main/java/com/dfsek/terra/population/TreePopulator.java +++ b/src/main/java/com/dfsek/terra/population/TreePopulator.java @@ -2,6 +2,9 @@ package com.dfsek.terra.population; import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.gaea.population.GaeaBlockPopulator; +import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; @@ -10,9 +13,6 @@ import net.jafama.FastMath; import org.bukkit.Chunk; import org.bukkit.World; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.generation.GenerationPhase; -import org.polydev.gaea.population.GaeaBlockPopulator; -import org.polydev.gaea.profiler.ProfileFuture; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/procgen/GridSpawn.java b/src/main/java/com/dfsek/terra/procgen/GridSpawn.java index 371625192..8fc7ddcb8 100644 --- a/src/main/java/com/dfsek/terra/procgen/GridSpawn.java +++ b/src/main/java/com/dfsek/terra/procgen/GridSpawn.java @@ -1,9 +1,9 @@ package com.dfsek.terra.procgen; +import com.dfsek.terra.api.gaea.math.MathUtil; +import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.gaea.util.GlueList; import org.bukkit.util.Vector; -import org.polydev.gaea.math.MathUtil; -import org.polydev.gaea.util.FastRandom; -import org.polydev.gaea.util.GlueList; import java.util.List; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java b/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java index 8a30bccb0..5e94f5326 100644 --- a/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java +++ b/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java @@ -1,7 +1,7 @@ package com.dfsek.terra.procgen.voxel; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; 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) { diff --git a/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java b/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java index 3d0405722..ded1dab11 100644 --- a/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java +++ b/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.procgen.voxel; +import com.dfsek.terra.api.gaea.util.GlueList; import org.bukkit.util.Vector; -import org.polydev.gaea.util.GlueList; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/registry/FloraRegistry.java b/src/main/java/com/dfsek/terra/registry/FloraRegistry.java index 336be4184..7c677e3dc 100644 --- a/src/main/java/com/dfsek/terra/registry/FloraRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/FloraRegistry.java @@ -1,9 +1,9 @@ package com.dfsek.terra.registry; +import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.gaea.world.FloraType; import com.dfsek.terra.generation.items.flora.BlockFlora; import org.bukkit.Bukkit; -import org.polydev.gaea.world.Flora; -import org.polydev.gaea.world.FloraType; public class FloraRegistry extends TerraRegistry { public FloraRegistry() { diff --git a/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java b/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java index 2e318533a..11339f586 100644 --- a/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java @@ -1,9 +1,9 @@ package com.dfsek.terra.registry; +import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.biome.palette.SinglePalette; import org.bukkit.Bukkit; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.world.palette.Palette; public class PaletteRegistry extends TerraRegistry> { @Override diff --git a/src/main/java/com/dfsek/terra/registry/TreeRegistry.java b/src/main/java/com/dfsek/terra/registry/TreeRegistry.java index 56ecf7ab5..3a97e81b6 100644 --- a/src/main/java/com/dfsek/terra/registry/TreeRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/TreeRegistry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.registry; -import org.polydev.gaea.tree.Tree; -import org.polydev.gaea.tree.TreeType; +import com.dfsek.terra.api.gaea.tree.Tree; +import com.dfsek.terra.api.gaea.tree.TreeType; public class TreeRegistry extends TerraRegistry { public TreeRegistry() { diff --git a/src/main/java/com/dfsek/terra/structure/Structure.java b/src/main/java/com/dfsek/terra/structure/Structure.java index d42800441..661dbe961 100644 --- a/src/main/java/com/dfsek/terra/structure/Structure.java +++ b/src/main/java/com/dfsek/terra/structure/Structure.java @@ -1,6 +1,7 @@ package com.dfsek.terra.structure; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.debug.Debug; @@ -17,7 +18,6 @@ import org.bukkit.block.Sign; import org.bukkit.block.data.BlockData; import org.bukkit.inventory.BlockInventoryHolder; import org.jetbrains.annotations.NotNull; -import org.polydev.gaea.math.Range; import java.io.File; import java.io.FileInputStream; diff --git a/src/main/java/com/dfsek/terra/structure/features/EntityFeature.java b/src/main/java/com/dfsek/terra/structure/features/EntityFeature.java index ff3b95009..df7391a73 100644 --- a/src/main/java/com/dfsek/terra/structure/features/EntityFeature.java +++ b/src/main/java/com/dfsek/terra/structure/features/EntityFeature.java @@ -1,5 +1,9 @@ package com.dfsek.terra.structure.features; +import com.dfsek.terra.api.gaea.math.MathUtil; +import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.structure.Rotation; import com.dfsek.terra.structure.Structure; @@ -11,10 +15,6 @@ import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.EntityType; -import org.polydev.gaea.math.MathUtil; -import org.polydev.gaea.math.Range; -import org.polydev.gaea.util.FastRandom; -import org.polydev.gaea.util.GlueList; import java.util.List; import java.util.Objects; diff --git a/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java index cfb37f30b..bbe6b0c00 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java @@ -2,11 +2,11 @@ package com.dfsek.terra.structure.spawn; import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.config.WorldGenerator; import org.bukkit.World; -import org.polydev.gaea.generation.GenerationPhase; public class AirSpawn extends Requirement { public AirSpawn(World world, Terra main) { diff --git a/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java index 696cda4ec..6282cd618 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java @@ -2,10 +2,10 @@ package com.dfsek.terra.structure.spawn; import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.generation.config.WorldGenerator; import org.bukkit.World; -import org.polydev.gaea.generation.GenerationPhase; public class LandSpawn extends Requirement { public LandSpawn(World world, Terra main) { diff --git a/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java index d17815d50..5953d095a 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java @@ -2,11 +2,11 @@ package com.dfsek.terra.structure.spawn; import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.config.WorldGenerator; import org.bukkit.World; -import org.polydev.gaea.generation.GenerationPhase; public class OceanSpawn extends Requirement { public OceanSpawn(World world, Terra main) { diff --git a/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java b/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java index 0fd0b4174..55df1f574 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java @@ -1,9 +1,9 @@ package com.dfsek.terra.structure.spawn; import com.dfsek.terra.Terra; +import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.generation.TerraChunkGenerator; import org.bukkit.World; -import org.polydev.gaea.math.FastNoiseLite; import java.util.Objects; diff --git a/src/main/java/com/dfsek/terra/util/PaletteUtil.java b/src/main/java/com/dfsek/terra/util/PaletteUtil.java index c1d0e1469..2fc61334a 100644 --- a/src/main/java/com/dfsek/terra/util/PaletteUtil.java +++ b/src/main/java/com/dfsek/terra/util/PaletteUtil.java @@ -1,14 +1,14 @@ package com.dfsek.terra.util; +import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.gaea.world.palette.RandomPalette; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.Sampler; import com.dfsek.terra.math.MathUtil; import org.bukkit.Material; import org.bukkit.block.data.BlockData; -import org.polydev.gaea.util.FastRandom; -import org.polydev.gaea.world.palette.Palette; -import org.polydev.gaea.world.palette.RandomPalette; public final class PaletteUtil { public static final BlockData WATER = Material.WATER.createBlockData(); diff --git a/src/main/java/com/dfsek/terra/util/PopulationUtil.java b/src/main/java/com/dfsek/terra/util/PopulationUtil.java index eb0638175..3365397cd 100644 --- a/src/main/java/com/dfsek/terra/util/PopulationUtil.java +++ b/src/main/java/com/dfsek/terra/util/PopulationUtil.java @@ -1,8 +1,8 @@ package com.dfsek.terra.util; +import com.dfsek.terra.api.gaea.math.MathUtil; +import com.dfsek.terra.api.gaea.util.FastRandom; import org.bukkit.Chunk; -import org.polydev.gaea.math.MathUtil; -import org.polydev.gaea.util.FastRandom; public final class PopulationUtil { public static FastRandom getRandom(Chunk c) { diff --git a/src/main/java/com/dfsek/terra/util/SlabUtil.java b/src/main/java/com/dfsek/terra/util/SlabUtil.java index 3ab30300c..74f08eca2 100644 --- a/src/main/java/com/dfsek/terra/util/SlabUtil.java +++ b/src/main/java/com/dfsek/terra/util/SlabUtil.java @@ -1,5 +1,6 @@ package com.dfsek.terra.util; +import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.generation.Sampler; import org.bukkit.Material; import org.bukkit.block.BlockFace; @@ -10,7 +11,6 @@ import org.bukkit.block.data.type.Slab; import org.bukkit.block.data.type.Stairs; import org.bukkit.generator.ChunkGenerator; import org.bukkit.util.Vector; -import org.polydev.gaea.world.palette.Palette; import java.util.Map; diff --git a/src/test/java/DistributionTest.java b/src/test/java/DistributionTest.java index 27f2d556b..1d5928fc4 100644 --- a/src/test/java/DistributionTest.java +++ b/src/test/java/DistributionTest.java @@ -1,6 +1,6 @@ +import com.dfsek.terra.api.gaea.math.FastNoiseLite; import net.jafama.FastMath; import org.junit.jupiter.api.Test; -import org.polydev.gaea.math.FastNoiseLite; class DistributionTest { private static final double[] normalMap = new double[] {-0.8408907651901245D, -0.8200346231460571D, -0.8070776462554932D, -0.7970088720321655D, -0.7890776991844177D, -0.7819743156433105D, -0.7759857773780823D, -0.7706204056739807D, -0.765608549118042D, -0.7611993551254272D, -0.7569039463996887D, -0.7528656125068665D, -0.7492497563362122D, -0.7458332777023315D, -0.7424643039703369D, -0.7392163872718811D, -0.736059844493866D, -0.7332375049591064D, -0.7305010557174683D, -0.7277776598930359D, -0.7251102924346924D, -0.7227165699005127D, -0.7203239798545837D, -0.7179931998252869D, -0.7157421112060547D, -0.7135322690010071D, -0.71131432056427D, -0.7092097997665405D, -0.7071162462234497D, -0.7050217390060425D, -0.703119695186615D, -0.7011850476264954D, -0.6992706060409546D, -0.6974170207977295D, -0.6955324411392212D, -0.6937324404716492D, -0.6919872760772705D, -0.690233588218689D, -0.6885692477226257D, -0.6869722008705139D, -0.6852975487709045D, -0.683682382106781D, -0.6821723580360413D, -0.6806833744049072D, -0.679179310798645D, -0.6776503324508667D, -0.676136314868927D, -0.6746450662612915D, -0.6731522083282471D, -0.6717588305473328D, -0.6702994704246521D, -0.6689524054527283D, -0.6675862073898315D, -0.6662633419036865D, -0.6649606823921204D, -0.6636543273925781D, -0.6623714566230774D, -0.6610865592956543D, -0.6598274111747742D, -0.6585804224014282D, -0.6573819518089294D, -0.6561920642852783D, -0.6549379825592041D, -0.6537073254585266D, -0.6525376439094543D, -0.6513495445251465D, -0.650168240070343D, -0.649040162563324D, -0.6479091048240662D, -0.6467820405960083D, -0.6456737518310547D, -0.6445609331130981D, -0.6434952020645142D, -0.6424031257629395D, -0.6413089632987976D, -0.640256941318512D, -0.6391684412956238D, -0.638137936592102D, -0.6371254324913025D, -0.6361099481582642D, -0.6350630521774292D, -0.6339953541755676D, -0.6330388188362122D, -0.632024347782135D, -0.6310704946517944D, -0.6300620436668396D, -0.6290494799613953D, -0.6280747056007385D, -0.6271024346351624D, -0.6261362433433533D, -0.6251688599586487D, -0.6242944002151489D, -0.6233505606651306D, -0.622406542301178D, -0.6214921474456787D, -0.6205630302429199D, -0.619683563709259D, -0.6187522411346436D, -0.6178513169288635D, -0.6170046925544739D, -0.6161392331123352D, -0.615269660949707D, -0.6144152879714966D, -0.6135557293891907D, -0.6127009391784668D, -0.6117991209030151D, -0.6109536290168762D, -0.6101033091545105D, -0.6092590689659119D, -0.6084139347076416D, -0.6075553894042969D, -0.6067432165145874D, -0.6058894991874695D, -0.6050370335578918D, -0.6042441725730896D, -0.6034530401229858D, -0.6026210784912109D, -0.6018084287643433D, -0.6010326743125916D, -0.6002528071403503D, -0.5994450449943542D, -0.5986629128456116D, -0.5978666543960571D, -0.5971032977104187D, -0.5963031649589539D, -0.5955566167831421D, -0.5947844982147217D, -0.5940142869949341D, -0.5932715535163879D, -0.5925368666648865D, -0.5917928218841553D, -0.591031014919281D, -0.5903055667877197D, -0.5895851850509644D, -0.5888315439224243D, -0.5880893468856812D, -0.5873630046844482D, -0.5866444110870361D, -0.5859208106994629D, -0.5852057933807373D, -0.5844889879226685D, -0.5837893486022949D, -0.5830587148666382D, -0.582359254360199D, -0.5816157460212708D, -0.5809139013290405D, -0.5802302956581116D, -0.5795474052429199D, -0.5788565874099731D, -0.5781614184379578D, -0.5774743556976318D, -0.5767905712127686D, -0.5760961771011353D, -0.5754467248916626D, -0.5747898817062378D, -0.5741211175918579D, -0.5734619498252869D, -0.5728112459182739D, -0.5721414089202881D, -0.5714717507362366D, -0.5708272457122803D, -0.5701769590377808D, -0.5695428252220154D, -0.568885087966919D, -0.5682525038719177D, -0.5675948262214661D, -0.5669249296188354D, -0.5663014054298401D, -0.5656630992889404D, -0.5650165677070618D, -0.5643728971481323D, -0.5637710094451904D, -0.5631371736526489D, -0.562507152557373D, -0.5618733167648315D, -0.5612503290176392D, -0.560631513595581D, -0.5600159168243408D, -0.559416651725769D, -0.5587995052337646D, -0.5581864714622498D, -0.5575871467590332D, -0.556957483291626D, -0.5563494563102722D, -0.555757999420166D, -0.5551457405090332D, -0.5545571446418762D, -0.5539442300796509D, -0.5533522367477417D, -0.5527352094650269D, -0.5521476864814758D, -0.5515644550323486D, -0.5509964823722839D, -0.550428032875061D, -0.5498668551445007D, -0.5492658615112305D, -0.5486577749252319D, -0.5480945110321045D, -0.5475296378135681D, -0.5469772815704346D, -0.5463858246803284D, -0.5458088517189026D, -0.545259952545166D, -0.5447098016738892D, -0.5441542863845825D, -0.5436179041862488D, -0.5430275201797485D, -0.5424584746360779D, -0.5419116616249084D, -0.5413541197776794D, -0.5408090353012085D, -0.5402546525001526D, -0.5396901369094849D, -0.539120078086853D, -0.5385692715644836D, -0.5380025506019592D, -0.5374376773834229D, -0.5369035601615906D, -0.5363785624504089D, -0.5358348488807678D, -0.5352905988693237D, -0.5347356796264648D, -0.5341591238975525D, -0.5336212515830994D, -0.5330695509910583D, -0.5325397849082947D, -0.5319978594779968D, -0.5314696431159973D, -0.530921220779419D, -0.530373752117157D, -0.5298687219619751D, -0.529342770576477D, -0.5288130044937134D, -0.5282856822013855D, -0.5277521014213562D, -0.5272186994552612D, -0.526702880859375D, -0.5261659026145935D, -0.5256563425064087D, -0.5251585245132446D, -0.524644136428833D, -0.5240897536277771D, -0.5235958695411682D, -0.5230914354324341D, -0.5225777626037598D, -0.5220786929130554D, -0.5215602517127991D, -0.5210496187210083D, -0.5205234885215759D, -0.5199909210205078D, -0.5194736123085022D, -0.5189557075500488D, -0.5184388160705566D, -0.517956018447876D, -0.5174460411071777D, -0.5169391632080078D, -0.5164353251457214D, -0.5159274935722351D, -0.5154002904891968D, -0.5149046778678894D, -0.5143994092941284D, -0.5139294862747192D, -0.5134499669075012D, -0.5129679441452026D, -0.5124912261962891D, -0.511996328830719D, -0.5114986300468445D, -0.5110247135162354D, -0.5105308294296265D, -0.5100609064102173D, -0.5095614194869995D, -0.5090870261192322D, -0.5085906982421875D, -0.5081197619438171D, -0.5076301097869873D, -0.507135808467865D, -0.5066789388656616D, -0.5062170624732971D, -0.5057358145713806D, -0.5052729845046997D, -0.5048062205314636D, -0.5043444037437439D, -0.5038503408432007D, -0.5033678412437439D, -0.5029129981994629D, -0.5024451017379761D, -0.5019713640213013D, -0.501503586769104D, -0.5010541677474976D, -0.500596284866333D, -0.5001118183135986D, -0.49962663650512695D, -0.4991636574268341D, -0.49869197607040405D, -0.4982263445854187D, -0.4977402091026306D, -0.49727755784988403D, -0.496805876493454D, -0.49637076258659363D, -0.4958948493003845D, -0.49544137716293335D, -0.49501892924308777D, -0.4945528209209442D, -0.49409356713294983D, -0.49364787340164185D, -0.49319401383399963D, -0.49275630712509155D, -0.4923110902309418D, -0.4918690621852875D, -0.49141621589660645D, -0.49096524715423584D, -0.4905273914337158D, -0.4900781512260437D, -0.48962411284446716D, -0.4891759753227234D, -0.48872804641723633D, -0.4882771670818329D, -0.48784005641937256D, -0.48739326000213623D, -0.48694151639938354D, -0.48648712038993835D, -0.48605871200561523D, -0.4856131374835968D, -0.4851803183555603D, -0.4847318232059479D, -0.4842924177646637D, -0.48386046290397644D, -0.4834265112876892D, -0.4829675257205963D, -0.482522189617157D, -0.4820839762687683D, -0.48165363073349D, -0.4812239706516266D, -0.4807860255241394D, -0.4803447425365448D, -0.4798981845378876D, -0.4794575572013855D, -0.4790170192718506D, -0.47858935594558716D, -0.4781353175640106D, -0.477681040763855D, -0.477261483669281D, -0.4768490791320801D, -0.4764252305030823D, -0.47600477933883667D, -0.47555917501449585D, -0.4751377999782562D, -0.47470518946647644D, -0.47426924109458923D, -0.4738460183143616D, -0.47342449426651D, -0.4730163812637329D, -0.4726114571094513D, -0.4721759557723999D, -0.4717848598957062D, -0.4713689088821411D, -0.4709392488002777D, -0.47049304842948914D, -0.4700826108455658D, -0.4696255028247833D, -0.46921586990356445D, -0.46877801418304443D, -0.46836233139038086D, -0.46794429421424866D, -0.46752703189849854D, -0.4670995771884918D, -0.4666939377784729D, -0.46625566482543945D, -0.4658403992652893D, -0.4654417932033539D, -0.465023398399353D, -0.46460986137390137D, -0.46419557929039D, -0.46378859877586365D, -0.46336546540260315D, -0.46295180916786194D, -0.4625388979911804D, -0.46212026476860046D, -0.4617091715335846D, -0.46131056547164917D, -0.46089276671409607D, -0.4604875445365906D, -0.46008041501045227D, -0.4596766233444214D, -0.4592905044555664D, -0.45886731147766113D, -0.4584708511829376D, -0.458060622215271D, -0.457650750875473D, -0.4572262763977051D, -0.45681101083755493D, -0.4564330577850342D, -0.4560151696205139D, -0.4556240141391754D, -0.4552316963672638D, -0.4548242688179016D, -0.4544048309326172D, -0.4539957046508789D, -0.45359495282173157D, -0.4532042443752289D, -0.4528181552886963D, -0.4524168372154236D, -0.4519919157028198D, -0.4515584409236908D, -0.45118191838264465D, -0.45078909397125244D, -0.4504043459892273D, -0.4500110447406769D, -0.44961291551589966D, -0.44922786951065063D, -0.4488254189491272D, -0.448411762714386D, -0.44801002740859985D, -0.4476070702075958D, -0.4472062289714813D, -0.44680875539779663D, -0.44641414284706116D, -0.44601938128471375D, -0.4456106126308441D, -0.4452301263809204D, -0.44483858346939087D, -0.44447171688079834D, -0.44407233595848083D, -0.44368883967399597D, -0.44329920411109924D, -0.4429243206977844D, -0.4425082802772522D, -0.4421197474002838D, -0.4417261481285095D, -0.4413236379623413D, -0.44093117117881775D, -0.4405667185783386D, -0.4401840567588806D, -0.43980535864830017D, -0.43940675258636475D, -0.439028263092041D, -0.43865975737571716D, -0.4382753372192383D, -0.43788960576057434D, -0.4374869465827942D, -0.4371262192726135D, -0.4367597997188568D, -0.43636399507522583D, -0.4359838366508484D, -0.4355921745300293D, -0.4352045953273773D, -0.43481752276420593D, -0.4344243109226227D, -0.4340437948703766D, -0.433651864528656D, -0.43328702449798584D, -0.43291205167770386D, -0.43252551555633545D, -0.4321480095386505D, -0.4317898750305176D, -0.4314233064651489D, -0.43104124069213867D, -0.43066880106925964D, -0.430292546749115D, -0.4299023747444153D, -0.4295300245285034D, -0.42915427684783936D, -0.4287806749343872D, -0.42839178442955017D, -0.4280126392841339D, -0.427650511264801D, -0.4272746443748474D, -0.426890105009079D, -0.4265204966068268D, -0.4261537194252014D, -0.42576107382774353D, -0.4253731369972229D, -0.4249960482120514D, -0.424624502658844D, -0.424255907535553D, -0.42388004064559937D, -0.42350152134895325D, -0.42311522364616394D, -0.4227565824985504D, -0.42240461707115173D, -0.4220307767391205D, -0.4216674268245697D, -0.42131006717681885D, -0.420943945646286D, -0.4205697178840637D, -0.42019638419151306D, -0.41983455419540405D, -0.4194658100605011D, -0.4190995693206787D, -0.41873085498809814D, -0.4183567464351654D, -0.4179975688457489D, -0.4176383316516876D, -0.41729846596717834D, -0.41692838072776794D, -0.41655758023262024D, -0.41620612144470215D, -0.4158278703689575D, -0.4154700040817261D, -0.4151083528995514D, -0.4147477149963379D, -0.4143727421760559D, -0.41399645805358887D, -0.41361644864082336D, -0.41325125098228455D, -0.4128910303115845D, -0.4125325381755829D, -0.412177711725235D, -0.41182252764701843D, -0.41146835684776306D, -0.411092609167099D, -0.4107370972633362D, -0.41037485003471375D, -0.41001537442207336D, -0.40966421365737915D, -0.4093012511730194D, -0.40894198417663574D, -0.40859392285346985D, -0.4082479178905487D, -0.4078933000564575D, -0.4075292944908142D, -0.40716227889060974D, -0.4068087041378021D, -0.4064478874206543D, -0.406091570854187D, -0.40573540329933167D, -0.40538454055786133D, -0.40504181385040283D, -0.4047034680843353D, -0.4043614864349365D, -0.40400779247283936D, -0.4036547839641571D, -0.4032823443412781D, -0.4029378592967987D, -0.4025970697402954D, -0.402246356010437D, -0.40188851952552795D, -0.40156131982803345D, -0.40120363235473633D, -0.4008401036262512D, -0.40048736333847046D, -0.4001263976097107D, -0.39976367354393005D, -0.39942193031311035D, -0.3990681767463684D, -0.3987242877483368D, -0.398363322019577D, -0.39801621437072754D, -0.39766016602516174D, -0.39731889963150024D, -0.39698633551597595D, -0.39662742614746094D, -0.39628860354423523D, -0.39593571424484253D, -0.395590215921402D, -0.3952309787273407D, -0.3948807716369629D, -0.39455100893974304D, -0.3942095935344696D, -0.39386501908302307D, -0.3935443162918091D, -0.3931947946548462D, -0.39285120368003845D, -0.3925047814846039D, -0.39214301109313965D, -0.39179378747940063D, -0.3914482891559601D, -0.39108943939208984D, -0.3907601833343506D, -0.3904222249984741D, -0.3900834023952484D, -0.38973814249038696D, -0.3894020617008209D, -0.38905972242355347D, -0.38871514797210693D, -0.3883773684501648D, -0.3880293369293213D, -0.3876887559890747D, -0.38734734058380127D, -0.386979341506958D, -0.38662150502204895D, -0.38627174496650696D, -0.3859280049800873D, -0.38558584451675415D, -0.3852563500404358D, -0.3849097490310669D, -0.38456815481185913D, -0.38420337438583374D, -0.38386270403862D, -0.38352808356285095D, -0.3831936717033386D, -0.3828587532043457D, -0.3825334906578064D, -0.3822133243083954D, -0.38188061118125916D, -0.3815428614616394D, -0.3812029957771301D, -0.38088124990463257D, -0.38053950667381287D, -0.38019588589668274D, -0.37985116243362427D, -0.3795320689678192D, -0.379200279712677D, -0.37889277935028076D, -0.37856200337409973D, -0.3782331347465515D, -0.3779050409793854D, -0.3775690197944641D, -0.3772413730621338D, -0.3769242763519287D, -0.3765946924686432D, -0.37626904249191284D, -0.3759467601776123D, -0.37560951709747314D, -0.3752872347831726D, -0.37494587898254395D, -0.3746064007282257D, -0.3742677569389343D, -0.3739333748817444D, -0.3736076056957245D, -0.37326452136039734D, -0.37293750047683716D, -0.3725985884666443D, -0.3722609877586365D, -0.37193018198013306D, -0.3715952932834625D, -0.3712655007839203D, -0.3709229826927185D, -0.3705999255180359D, -0.37027597427368164D, -0.369951069355011D, -0.3696173429489136D, -0.3692963123321533D, -0.36897599697113037D, -0.36867132782936096D, -0.3683592677116394D, -0.3680408298969269D, -0.3677233159542084D, -0.367404967546463D, -0.36708003282546997D, -0.36677178740501404D, -0.3664388358592987D, -0.36611905694007874D, -0.3658014237880707D, -0.36547884345054626D, -0.3651513159275055D, -0.36481767892837524D, -0.3644823729991913D, -0.364155650138855D, -0.36383169889450073D, -0.36351490020751953D, -0.3631979823112488D, -0.3628738224506378D, -0.36254048347473145D, -0.3622121512889862D, -0.3618980348110199D, -0.3615726828575134D, -0.3612515330314636D, -0.3609353005886078D, -0.36061736941337585D, -0.36030900478363037D, -0.3599989712238312D, -0.3596540689468384D, -0.35933634638786316D, -0.35900697112083435D, -0.3586837351322174D, -0.35836634039878845D, -0.3580488860607147D, -0.35772836208343506D, -0.3574066162109375D, -0.3570963144302368D, -0.3567792475223541D, -0.356449693441391D, -0.35615187883377075D, -0.3558260202407837D, -0.3555348217487335D, -0.3552199602127075D, -0.3548942804336548D, -0.3545764684677124D, -0.35425788164138794D, -0.3539428114891052D, -0.3536147177219391D, -0.35328033566474915D, -0.3529603183269501D, -0.3526480793952942D, -0.35232388973236084D, -0.35200271010398865D, -0.35168105363845825D, -0.35135796666145325D, -0.3510427176952362D, -0.3507138788700104D, -0.35040056705474854D, -0.3500818610191345D, -0.34976863861083984D, -0.34945595264434814D, -0.34914907813072205D, -0.3488360345363617D, -0.34851935505867004D, -0.3481927514076233D, -0.3478827476501465D, -0.3475636839866638D, -0.34725847840309143D, -0.3469395339488983D, -0.34662553668022156D, -0.34631386399269104D, -0.3460105359554291D, -0.3456878960132599D, -0.345344603061676D, -0.34503841400146484D, -0.3447076678276062D, -0.344401091337204D, -0.3441048264503479D, -0.3437953293323517D, -0.343493789434433D, -0.34316104650497437D, -0.34285077452659607D, -0.3425139784812927D, -0.34221309423446655D, -0.341905802488327D, -0.3415932357311249D, -0.3412908911705017D, -0.34100088477134705D, -0.34069502353668213D, -0.3403867483139038D, -0.3400827944278717D, -0.3397866189479828D, -0.3394818603992462D, -0.33916914463043213D, -0.3388570249080658D, -0.3385341763496399D, -0.33820855617523193D, -0.3379049599170685D, -0.3375984728336334D, -0.33730369806289673D, -0.33700433373451233D, -0.33670154213905334D, -0.33638641238212585D, -0.33607667684555054D, -0.33575505018234253D, -0.3354572057723999D, -0.3351454734802246D, -0.3348299264907837D, -0.334527850151062D, -0.3342225253582001D, -0.33391332626342773D, -0.3336237072944641D, -0.3332982063293457D, -0.3329954445362091D, -0.3326762020587921D, -0.3323662281036377D, -0.3320602774620056D, -0.33175498247146606D, -0.3314487636089325D, -0.33115020394325256D, -0.330841064453125D, -0.3305378258228302D, -0.3302415609359741D, -0.329933226108551D, -0.329643577337265D, -0.32934796810150146D, -0.32905206084251404D, -0.3287571668624878D, -0.328460156917572D, -0.32815226912498474D, -0.3278505206108093D, -0.3275279998779297D, -0.32723256945610046D, -0.3269461989402771D, -0.3266374468803406D, -0.32633867859840393D, -0.32603901624679565D, -0.32573506236076355D, -0.3254241645336151D, -0.3251294791698456D, -0.3248370289802551D, -0.32453545928001404D, -0.3242391347885132D, -0.32394152879714966D, -0.32363662123680115D, -0.32332345843315125D, -0.323017418384552D, -0.32272642850875854D, -0.32241278886795044D, -0.32211995124816895D, -0.321819007396698D, -0.3215320408344269D, -0.3212323486804962D, -0.3209359347820282D, -0.3206302225589752D, -0.32032862305641174D, -0.3200341463088989D, -0.3197453022003174D, -0.31943413615226746D, -0.31913426518440247D, -0.3188168704509735D, -0.3185330033302307D, -0.3182430863380432D, -0.3179488778114319D, -0.3176538050174713D, -0.31735554337501526D, -0.3170680105686188D, -0.3167757987976074D, -0.3164826035499573D, -0.3161925673484802D, -0.31590309739112854D, -0.3156057894229889D, -0.3153114318847656D, -0.3150043487548828D, -0.3147113621234894D, -0.3144054412841797D, -0.3141002655029297D, -0.3138138949871063D, -0.3135177195072174D, -0.3132264018058777D, -0.31294235587120056D, -0.3126477599143982D, -0.3123481869697571D, -0.31204888224601746D, -0.3117561936378479D, -0.3114587366580963D, -0.3111598491668701D, -0.31085237860679626D, -0.31057536602020264D, -0.31028178334236145D, -0.30997639894485474D, -0.30967190861701965D, -0.30936843156814575D, -0.30909404158592224D, -0.3088019788265228D, -0.30850961804389954D, -0.3082248866558075D, -0.3079489469528198D, -0.3076601028442383D, -0.3073663115501404D, -0.30707186460494995D, -0.306782066822052D, -0.3064883351325989D, -0.3061949610710144D, -0.30590012669563293D, -0.30561313033103943D, -0.3053309917449951D, -0.3050406575202942D, -0.304754376411438D, -0.30446040630340576D, -0.3041768968105316D, -0.3038821816444397D, -0.3035893738269806D, -0.30328431725502014D, -0.3030011057853699D, -0.3027121424674988D, -0.3024280369281769D, -0.30212947726249695D, -0.3018357753753662D, -0.30154919624328613D, -0.30126914381980896D, -0.30098485946655273D, -0.30068662762641907D, -0.30040308833122253D, -0.30009666085243225D, -0.2998005747795105D, -0.2994982898235321D, -0.29921627044677734D, -0.29892295598983765D, -0.2986327111721039D, -0.29834234714508057D, -0.2980586290359497D, -0.29778116941452026D, -0.2974989116191864D, -0.29720795154571533D, -0.2969287931919098D, -0.2966563403606415D, -0.2963668704032898D, -0.2960667610168457D, -0.29577767848968506D, -0.29548513889312744D, -0.29519715905189514D, -0.29489442706108093D, -0.2946091890335083D, -0.2943197190761566D, -0.29404720664024353D, -0.2937503457069397D, -0.2934649586677551D, -0.2931755483150482D, -0.29288724064826965D, -0.29261279106140137D, -0.29232826828956604D, -0.29203593730926514D, -0.2917509078979492D, -0.291476309299469D, -0.2911933362483978D, -0.29089832305908203D, -0.29060450196266174D, -0.29032155871391296D, -0.2900330424308777D, -0.28975367546081543D, -0.28948378562927246D, -0.28919175267219543D, -0.28892582654953003D, -0.28864026069641113D, -0.28835973143577576D, -0.28808465600013733D, -0.28779277205467224D, -0.2875235378742218D, -0.287244975566864D, -0.2869555354118347D, -0.28667202591896057D, -0.2863847613334656D, -0.28609588742256165D, -0.28580570220947266D, -0.28554603457450867D, -0.2852514386177063D, -0.2849790155887604D, -0.28469184041023254D, -0.28441160917282104D, -0.2841390371322632D, -0.2838601768016815D, -0.2835925221443176D, -0.28331464529037476D, -0.28303512930870056D, -0.28274592757225037D, -0.28246626257896423D, -0.28217896819114685D, -0.28188076615333557D, -0.28161147236824036D, -0.2813378572463989D, -0.2810610234737396D, -0.2807842195034027D, -0.2804943323135376D, -0.28019919991493225D, -0.2799144983291626D, -0.27964210510253906D, -0.2793615162372589D, -0.2790962755680084D, -0.27882760763168335D, -0.27854248881340027D, -0.27825871109962463D, -0.2779737710952759D, -0.2777007222175598D, -0.27742964029312134D, -0.27714890241622925D, -0.27688339352607727D, -0.2765926122665405D, -0.2763076424598694D, -0.2760260999202728D, -0.2757579982280731D, -0.27548402547836304D, -0.2751961052417755D, -0.274922251701355D, -0.2746416926383972D, -0.27436795830726624D, -0.2740943133831024D, -0.2738019824028015D, -0.27353906631469727D, -0.27326154708862305D, -0.2729891836643219D, -0.27270472049713135D, -0.27243277430534363D, -0.2721635699272156D, -0.2718750536441803D, -0.2715913951396942D, -0.27133479714393616D, -0.2710684835910797D, -0.2707928419113159D, -0.2705102860927582D, -0.2702246606349945D, -0.26995614171028137D, -0.269681841135025D, -0.26940596103668213D, -0.26912009716033936D, -0.26884424686431885D, -0.2685716450214386D, -0.2682885527610779D, -0.2680133283138275D, -0.2677347660064697D, -0.26747408509254456D, -0.2672025263309479D, -0.26692694425582886D, -0.2666434049606323D, -0.2663731873035431D, -0.26609575748443604D, -0.2658277153968811D, -0.265566885471344D, -0.2652873694896698D, -0.265009343624115D, -0.2647358775138855D, -0.26447242498397827D, -0.2642005383968353D, -0.2639273405075073D, -0.26365959644317627D, -0.26338252425193787D, -0.26311179995536804D, -0.2628440260887146D, -0.26257866621017456D, -0.2623051702976227D, -0.2620226740837097D, -0.26175981760025024D, -0.2614777684211731D, -0.26120269298553467D, -0.2609373927116394D, -0.2606671154499054D, -0.26038432121276855D, -0.2601143717765808D, -0.25984737277030945D, -0.2595686912536621D, -0.2592966556549072D, -0.25902673602104187D, -0.25875210762023926D, -0.25847649574279785D, -0.25820842385292053D, -0.2579323947429657D, -0.25765854120254517D, -0.2574003040790558D, -0.25713491439819336D, -0.2568623721599579D, -0.25658881664276123D, -0.2563152313232422D, -0.25604572892189026D, -0.2557758390903473D, -0.2554943561553955D, -0.25521519780158997D, -0.25494012236595154D, -0.2546757459640503D, -0.2544080913066864D, -0.25414639711380005D, -0.253864049911499D, -0.2535991072654724D, -0.25332823395729065D, -0.25306326150894165D, -0.25280603766441345D, -0.2525345981121063D, -0.25226184725761414D, -0.2519981563091278D, -0.2517358958721161D, -0.2514859139919281D, -0.25121521949768066D, -0.2509450614452362D, -0.2506673038005829D, -0.25037816166877747D, -0.2501011788845062D, -0.24982967972755432D, -0.24956010282039642D, -0.24929192662239075D, -0.24902109801769257D, -0.24874456226825714D, -0.24847736954689026D, -0.2482159286737442D, -0.24794703722000122D, -0.24767209589481354D, -0.24741970002651215D, -0.24716982245445251D, -0.24689742922782898D, -0.24662908911705017D, -0.2463528960943222D, -0.2460920661687851D, -0.2458297461271286D, -0.2455553114414215D, -0.2452864646911621D, -0.24501584470272064D, -0.24475401639938354D, -0.24448587000370026D, -0.24422040581703186D, -0.24395723640918732D, -0.24368800222873688D, -0.24342411756515503D, -0.24315224587917328D, -0.2428782880306244D, -0.24262136220932007D, -0.2423519641160965D, -0.242094025015831D, -0.24183285236358643D, -0.24157416820526123D, -0.24128861725330353D, -0.2410109043121338D, -0.24074263870716095D, -0.24047909677028656D, -0.2402070164680481D, -0.23994535207748413D, -0.23968873918056488D, -0.23940715193748474D, -0.23913469910621643D, -0.23886923491954803D, -0.23860231041908264D, -0.23833289742469788D, -0.23806728422641754D, -0.23780885338783264D, -0.23753899335861206D, -0.23726941645145416D, -0.2369997203350067D, -0.23672956228256226D, -0.23645663261413574D, -0.23618397116661072D, -0.23593071103096008D, -0.23566082119941711D, -0.2354077845811844D, -0.2351534217596054D, -0.23488231003284454D, -0.2346220165491104D, -0.23435726761817932D, -0.2340918332338333D, -0.2338235080242157D, -0.2335655242204666D, -0.2333153784275055D, -0.23306378722190857D, -0.2328043133020401D, -0.23254400491714478D, -0.23228463530540466D, -0.2320064902305603D, -0.23174738883972168D, -0.23149773478507996D, -0.23124253749847412D, -0.23097634315490723D, -0.23071180284023285D, -0.23045700788497925D, -0.230192169547081D, -0.22991830110549927D, -0.22963789105415344D, -0.22937417030334473D, -0.22910505533218384D, -0.22883500158786774D, -0.2285711020231247D, -0.22831669449806213D, -0.2280465066432953D, -0.2277848720550537D, -0.22753745317459106D, -0.22728675603866577D, -0.22702650725841522D, -0.22676996886730194D, -0.22651082277297974D, -0.22624187171459198D, -0.22597870230674744D, -0.22570855915546417D, -0.22543907165527344D, -0.22518296539783478D, -0.22492025792598724D, -0.22467266023159027D, -0.22439832985401154D, -0.22413182258605957D, -0.2238631248474121D, -0.22359998524188995D, -0.22333964705467224D, -0.2230590581893921D, -0.22280718386173248D, -0.22254756093025208D, -0.22228197753429413D, -0.22201159596443176D, -0.22175270318984985D, -0.22150228917598724D, -0.22124618291854858D, -0.22099649906158447D, -0.22074392437934875D, -0.22047969698905945D, -0.22022272646427155D, -0.21997378766536713D, -0.2197091281414032D, -0.21945351362228394D, -0.2192097306251526D, -0.21894562244415283D, -0.21867841482162476D, -0.2184201329946518D, -0.2181641310453415D, -0.21789231896400452D, -0.21763677895069122D, -0.21738234162330627D, -0.2171180546283722D, -0.2168525755405426D, -0.21659737825393677D, -0.2163332849740982D, -0.21607044339179993D, -0.21581339836120605D, -0.21555018424987793D, -0.2152981460094452D, -0.21504613757133484D, -0.21478135883808136D, -0.21452942490577698D, -0.21428382396697998D, -0.21401828527450562D, -0.21376505494117737D, -0.2135121375322342D, -0.21325898170471191D, -0.21300353109836578D, -0.2127491533756256D, -0.21248602867126465D, -0.212227463722229D, -0.21197248995304108D, -0.211714506149292D, -0.21144689619541168D, -0.21119168400764465D, -0.21092993021011353D, -0.2106601893901825D, -0.2104104608297348D, -0.2101590931415558D, -0.2099045366048813D, -0.20964594185352325D, -0.209390327334404D, -0.20913049578666687D, -0.20888525247573853D, -0.20861712098121643D, -0.20835545659065247D, -0.20807304978370667D, -0.20782627165317535D, -0.20756679773330688D, -0.2073090374469757D, -0.20704127848148346D, -0.20678317546844482D, -0.20653437077999115D, -0.20627987384796143D, -0.2060208022594452D, -0.2057662308216095D, -0.20550277829170227D, -0.20525488257408142D, -0.20500688254833221D, -0.20475590229034424D, -0.204499751329422D, -0.20424525439739227D, -0.2039918303489685D, -0.20372796058654785D, -0.2034660130739212D, -0.20319855213165283D, -0.2029460072517395D, -0.20268212258815765D, -0.20242102444171906D, -0.20215927064418793D, -0.20190972089767456D, -0.2016443908214569D, -0.20138707756996155D, -0.20113015174865723D, -0.20087777078151703D, -0.20062702894210815D, -0.2003677785396576D, -0.20011863112449646D, -0.1998559683561325D, -0.19960248470306396D, -0.19935469329357147D, -0.19909074902534485D, -0.19882997870445251D, -0.19857299327850342D, -0.1983131766319275D, -0.1980532854795456D, -0.19780057668685913D, -0.19753916561603546D, -0.19728423655033112D, -0.1970248520374298D, -0.19676361978054047D, -0.19650912284851074D, -0.19625143706798553D, -0.19600039720535278D, -0.1957373321056366D, -0.19547948241233826D, -0.1952110230922699D, -0.19495542347431183D, -0.19469761848449707D, -0.19444851577281952D, -0.19418317079544067D, -0.19392995536327362D, -0.19367724657058716D, -0.19342119991779327D, -0.193157359957695D, -0.19289681315422058D, -0.19262950122356415D, -0.19238001108169556D, -0.19211608171463013D, -0.1918654441833496D, -0.19162078201770782D, -0.19136491417884827D, -0.19111116230487823D, -0.1908569037914276D, -0.19059760868549347D, -0.19035883247852325D, -0.19009436666965485D, -0.18983271718025208D, -0.18957246840000153D, -0.1893143355846405D, -0.18905536830425262D, -0.1888037919998169D, -0.18855144083499908D, -0.18828624486923218D, -0.18803848326206207D, -0.18779553472995758D, -0.18753254413604736D, -0.18728092312812805D, -0.18703658878803253D, -0.18677440285682678D, -0.1865210384130478D, -0.18627333641052246D, -0.1860176920890808D, -0.18575197458267212D, -0.18549758195877075D, -0.18524503707885742D, -0.18499478697776794D, -0.18474870920181274D, -0.18449726700782776D, -0.1842447966337204D, -0.18398450314998627D, -0.18373912572860718D, -0.18347981572151184D, -0.1832396537065506D, -0.1829894334077835D, -0.1827465295791626D, -0.1824868768453598D, -0.18223384022712708D, -0.181983083486557D, -0.18173179030418396D, -0.18149229884147644D, -0.18125100433826447D, -0.1810166984796524D, -0.18076547980308533D, -0.18052025139331818D, -0.18028059601783752D, -0.18003447353839874D, -0.17976894974708557D, -0.1795182228088379D, -0.17926038801670074D, -0.17900227010250092D, -0.17875243723392487D, -0.17849260568618774D, -0.1782395988702774D, -0.17798492312431335D, -0.17773054540157318D, -0.1774715632200241D, -0.17721407115459442D, -0.17695027589797974D, -0.17670336365699768D, -0.17644056677818298D, -0.17620298266410828D, -0.17594093084335327D, -0.17569057643413544D, -0.17543667554855347D, -0.17517289519309998D, -0.17491887509822845D, -0.17465627193450928D, -0.17440259456634521D, -0.17415493726730347D, -0.17391294240951538D, -0.17365816235542297D, -0.1734064668416977D, -0.1731625646352768D, -0.17290157079696655D, -0.1726544052362442D, -0.17240196466445923D, -0.1721460521221161D, -0.17188984155654907D, -0.17164205014705658D, -0.1714034527540207D, -0.17115624248981476D, -0.17089448869228363D, -0.17063680291175842D, -0.17039979994297028D, -0.17014959454536438D, -0.1698901206254959D, -0.16964471340179443D, -0.1694014072418213D, -0.16913889348506927D, -0.16887636482715607D, -0.16862861812114716D, -0.16837315261363983D, -0.1681090146303177D, -0.1678696870803833D, -0.16762171685695648D, -0.16737119853496552D, -0.1671179234981537D, -0.16687534749507904D, -0.16663305461406708D, -0.1663946509361267D, -0.16613495349884033D, -0.16588224470615387D, -0.16563618183135986D, -0.16538074612617493D, -0.1651364266872406D, -0.16490191221237183D, -0.16465792059898376D, -0.16440246999263763D, -0.16415110230445862D, -0.16390496492385864D, -0.16366207599639893D, -0.1634174883365631D, -0.16316935420036316D, -0.1629198044538498D, -0.16267001628875732D, -0.16242310404777527D, -0.16217178106307983D, -0.16191552579402924D, -0.16166867315769196D, -0.1614210307598114D, -0.1611790955066681D, -0.16093122959136963D, -0.1606772541999817D, -0.16043275594711304D, -0.16018515825271606D, -0.15993653237819672D, -0.1596994400024414D, -0.15944430232048035D, -0.15919804573059082D, -0.15895970165729523D, -0.1587119996547699D, -0.15847010910511017D, -0.15822650492191315D, -0.15797394514083862D, -0.15772566199302673D, -0.15748535096645355D, -0.15724743902683258D, -0.15699094533920288D, -0.15675128996372223D, -0.15649347007274628D, -0.15624989569187164D, -0.15599365532398224D, -0.15574221312999725D, -0.15548446774482727D, -0.15522776544094086D, -0.15496757626533508D, -0.1547342836856842D, -0.1544916033744812D, -0.15425007045269012D, -0.1540067493915558D, -0.15374967455863953D, -0.15350456535816193D, -0.15324702858924866D, -0.15298958122730255D, -0.15275487303733826D, -0.15251053869724274D, -0.152267724275589D, -0.15201044082641602D, -0.15175509452819824D, -0.151505246758461D, -0.15124619007110596D, -0.15099188685417175D, -0.1507432460784912D, -0.15049618482589722D, -0.15025031566619873D, -0.1499987542629242D, -0.14975327253341675D, -0.1495012789964676D, -0.14925517141819D, -0.14899614453315735D, -0.14874862134456635D, -0.14850221574306488D, -0.14825864136219025D, -0.14800988137722015D, -0.14776690304279327D, -0.14751356840133667D, -0.14725728332996368D, -0.14701828360557556D, -0.1467764675617218D, -0.14652809500694275D, -0.1462775468826294D, -0.14603087306022644D, -0.14578372240066528D, -0.1455492079257965D, -0.14530538022518158D, -0.1450677067041397D, -0.1448247730731964D, -0.14457790553569794D, -0.14433254301548004D, -0.14408448338508606D, -0.14383292198181152D, -0.14358893036842346D, -0.14333432912826538D, -0.14308729767799377D, -0.1428370475769043D, -0.14258548617362976D, -0.14234289526939392D, -0.14209994673728943D, -0.14185495674610138D, -0.14160139858722687D, -0.14135192334651947D, -0.14110565185546875D, -0.14085626602172852D, -0.14060232043266296D, -0.14035870134830475D, -0.14011816680431366D, -0.1398662030696869D, -0.1396220326423645D, -0.13937823474407196D, -0.1391391158103943D, -0.1388905644416809D, -0.13864193856716156D, -0.13839447498321533D, -0.13814809918403625D, -0.13790713250637054D, -0.1376522183418274D, -0.13741502165794373D, -0.13717547059059143D, -0.13693785667419434D, -0.13668829202651978D, -0.13643985986709595D, -0.1362117975950241D, -0.1359674036502838D, -0.13571487367153168D, -0.13547922670841217D, -0.13521651923656464D, -0.13495062291622162D, -0.1347016990184784D, -0.13445797562599182D, -0.13421109318733215D, -0.13394372165203094D, -0.13369591534137726D, -0.1334560066461563D, -0.13321466743946075D, -0.1329614669084549D, -0.13270504772663116D, -0.13244760036468506D, -0.13218137621879578D, -0.1319417953491211D, -0.13170531392097473D, -0.1314602643251419D, -0.13120467960834503D, -0.13096478581428528D, -0.1307184249162674D, -0.13046908378601074D, -0.1302255094051361D, -0.12998691201210022D, -0.12974600493907928D, -0.1295071542263031D, -0.1292717605829239D, -0.12903152406215668D, -0.12879106402397156D, -0.12854063510894775D, -0.12829795479774475D, -0.12804800271987915D, -0.1277998685836792D, -0.12754665315151215D, -0.12730130553245544D, -0.12706024944782257D, -0.12681734561920166D, -0.12656420469284058D, -0.12631171941757202D, -0.1260722577571869D, -0.12582357227802277D, -0.1255764663219452D, -0.12533816695213318D, -0.12509363889694214D, -0.12485770136117935D, -0.12460377812385559D, -0.12436322122812271D, -0.12412640452384949D, -0.12387391924858093D, -0.12363933771848679D, -0.12340278923511505D, -0.12317416071891785D, -0.12292548269033432D, -0.12268528342247009D, -0.12244031578302383D, -0.12219351530075073D, -0.12195321917533875D, -0.1217072457075119D, -0.12145407497882843D, -0.12118937075138092D, -0.12093839049339294D, -0.12068343162536621D, -0.12044784426689148D, -0.12020371109247208D, -0.1199624091386795D, -0.11971180886030197D, -0.11945878714323044D, -0.11921756714582443D, -0.11896989494562149D, -0.11871515214443207D, -0.11847058683633804D, -0.11823519319295883D, -0.1179933100938797D, -0.11774738132953644D, -0.11750373244285583D, -0.1172565147280693D, -0.11700785160064697D, -0.11676418781280518D, -0.11652734875679016D, -0.11627509444952011D, -0.11602754890918732D, -0.11577780544757843D, -0.11553701758384705D, -0.11528782546520233D, -0.11505863815546036D, -0.11480346322059631D, -0.11456599831581116D, -0.11431010812520981D, -0.11407358199357986D, -0.11383143067359924D, -0.11360126733779907D, -0.11336424946784973D, -0.1131257489323616D, -0.11287946999073029D, -0.11264096945524216D, -0.11240296065807343D, -0.11215709149837494D, -0.11191694438457489D, -0.11166784912347794D, -0.1114199161529541D, -0.11117790639400482D, -0.110927514731884D, -0.11067363619804382D, -0.11044003069400787D, -0.11019321531057358D, -0.10995994508266449D, -0.10971911251544952D, -0.10947442054748535D, -0.10922731459140778D, -0.10898025333881378D, -0.10874222218990326D, -0.10849777609109879D, -0.1082630529999733D, -0.10802622139453888D, -0.1077839732170105D, -0.10753330588340759D, -0.10729499161243439D, -0.1070358008146286D, -0.10678865760564804D, -0.10653838515281677D, -0.10629342496395111D, -0.10604272782802582D, -0.10579723864793777D, -0.10554585605859756D, -0.10529976338148117D, -0.10505616664886475D, -0.1048198938369751D, -0.10458079725503922D, -0.10433512926101685D, -0.10408937931060791D, -0.10384517908096313D, -0.10361005365848541D, -0.10336779057979584D, -0.1031176820397377D, -0.10287676751613617D, -0.10262610018253326D, -0.10237167030572891D, -0.10212275385856628D, -0.10188750922679901D, -0.10163980722427368D, -0.10139568150043488D, -0.10115278512239456D, -0.10089636594057083D, -0.10065758973360062D, -0.10040846467018127D, -0.10017679631710052D, -0.09993906319141388D, -0.09969222545623779D, -0.0994405448436737D, -0.099197156727314D, -0.09895378351211548D, -0.09871632605791092D, -0.09848727285861969D, -0.09823883324861526D, -0.09799803793430328D, -0.09774011373519897D, -0.09750278294086456D, -0.09725803881883621D, -0.0970136970281601D, -0.09676622599363327D, -0.09651307016611099D, -0.09627290070056915D, -0.09603053331375122D, -0.09578799456357956D, -0.09554785490036011D, -0.09530899673700333D, -0.09506220370531082D, -0.09481719136238098D, -0.09456701576709747D, -0.09431912004947662D, -0.09408935904502869D, -0.09383450448513031D, -0.09358792006969452D, -0.09333662688732147D, -0.09308815002441406D, -0.09284839779138565D, -0.09261038154363632D, -0.09236297011375427D, -0.09211356192827225D, -0.09187184274196625D, -0.09162575006484985D, -0.0913834348320961D, -0.09114708006381989D, -0.09090118110179901D, -0.09066314250230789D, -0.09040945768356323D, -0.09017443656921387D, -0.08994124084711075D, -0.089698925614357D, -0.08944778144359589D, -0.08919527381658554D, -0.08896385133266449D, -0.08871737867593765D, -0.08848631381988525D, -0.08825340867042542D, -0.08800895512104034D, -0.0877874493598938D, -0.08753707259893417D, -0.08728936314582825D, -0.08704547584056854D, -0.08680916577577591D, -0.08656804263591766D, -0.08632045984268188D, -0.08607527613639832D, -0.08583015948534012D, -0.08558361977338791D, -0.08533721417188644D, -0.08509048074483871D, -0.08485028147697449D, -0.08460789173841476D, -0.08436190336942673D, -0.08410844951868057D, -0.0838729739189148D, -0.08363857865333557D, -0.08339942991733551D, -0.0831519365310669D, -0.08291947841644287D, -0.0826779305934906D, -0.08242892473936081D, -0.08219455182552338D, -0.08195057511329651D, -0.08170703053474426D, -0.081464022397995D, -0.08122886717319489D, -0.08100023120641708D, -0.08075392991304398D, -0.0805170014500618D, -0.08027160912752151D, -0.08002904802560806D, -0.07978925108909607D, -0.07955169677734375D, -0.07930881530046463D, -0.0790669322013855D, -0.07882830500602722D, -0.0785798504948616D, -0.07833991944789886D, -0.07809559255838394D, -0.07786226272583008D, -0.0776219591498375D, -0.07737678289413452D, -0.07714521139860153D, -0.07691224664449692D, -0.07665777206420898D, -0.07641151547431946D, -0.07617313414812088D, -0.07592753320932388D, -0.07569229602813721D, -0.0754416435956955D, -0.07519475370645523D, -0.07494813203811646D, -0.0747164636850357D, -0.07448276877403259D, -0.07423548400402069D, -0.07399512827396393D, -0.07376088201999664D, -0.07351675629615784D, -0.07327954471111298D, -0.07303505390882492D, -0.07279020547866821D, -0.07253576070070267D, -0.07229600846767426D, -0.07204475998878479D, -0.07179662585258484D, -0.07155118137598038D, -0.07129927724599838D, -0.07106245309114456D, -0.07081857323646545D, -0.07056738436222076D, -0.07032652199268341D, -0.07008545845746994D, -0.06985671073198318D, -0.06962361931800842D, -0.06937389075756073D, -0.06912381947040558D, -0.06887900829315186D, -0.0686340481042862D, -0.06838493049144745D, -0.0681314691901207D, -0.06789498031139374D, -0.06765970587730408D, -0.06742730736732483D, -0.06719651073217392D, -0.06694657355546951D, -0.06670555472373962D, -0.06645660102367401D, -0.06621503829956055D, -0.06598034501075745D, -0.06574320793151855D, -0.06549137830734253D, -0.06525201350450516D, -0.06501458585262299D, -0.06479227542877197D, -0.06455428898334503D, -0.06431309133768082D, -0.06407991051673889D, -0.0638367235660553D, -0.06359873712062836D, -0.06334324926137924D, -0.06310774385929108D, -0.06286437809467316D, -0.06262777745723724D, -0.06237030401825905D, -0.0621323436498642D, -0.06189025938510895D, -0.061647746711969376D, -0.06140772998332977D, -0.06117217615246773D, -0.060926057398319244D, -0.06067296862602234D, -0.06043364480137825D, -0.06018991395831108D, -0.05995730683207512D, -0.05970904603600502D, -0.05945960804820061D, -0.059217669069767D, -0.05897081643342972D, -0.05872904509305954D, -0.05849192291498184D, -0.058252234011888504D, -0.058004919439554214D, -0.057772375643253326D, -0.057538487017154694D, -0.05728022754192352D, -0.05705133080482483D, -0.0568150132894516D, -0.05658133700489998D, -0.05634107068181038D, -0.05609507858753204D, -0.05584454536437988D, -0.05560510605573654D, -0.055361032485961914D, -0.05511125177145004D, -0.05486954376101494D, -0.0546349361538887D, -0.054383497685194016D, -0.054135002195835114D, -0.05389668419957161D, -0.05365772172808647D, -0.053429946303367615D, -0.05319244787096977D, -0.05295149236917496D, -0.05270173400640488D, -0.05245363712310791D, -0.052212126553058624D, -0.05197114497423172D, -0.05172385275363922D, -0.05147520452737808D, -0.05123189836740494D, -0.050989679992198944D, -0.05073939263820648D, -0.050494953989982605D, -0.050253815948963165D, -0.05001272261142731D, -0.04977148026227951D, -0.049528926610946655D, -0.0492960549890995D, -0.049062661826610565D, -0.04881996288895607D, -0.04857254773378372D, -0.04833959415555D, -0.04808736592531204D, -0.04785143956542015D, -0.04761652648448944D, -0.04738566651940346D, -0.047138575464487076D, -0.046896256506443024D, -0.04665457457304001D, -0.046410854905843735D, -0.046181485056877136D, -0.04594765976071358D, -0.045701175928115845D, -0.04545196518301964D, -0.04520288109779358D, -0.04497365653514862D, -0.04473564028739929D, -0.044497597962617874D, -0.04426290839910507D, -0.04401934891939163D, -0.04377321898937225D, -0.04354047775268555D, -0.04330435022711754D, -0.04306349903345108D, -0.04282412305474281D, -0.042600978165864944D, -0.04235575720667839D, -0.042125359177589417D, -0.0418863445520401D, -0.04164663329720497D, -0.041397858411073685D, -0.04115602374076843D, -0.04090924188494682D, -0.040665313601493835D, -0.040422823280096054D, -0.04018530994653702D, -0.03994182497262955D, -0.03970673680305481D, -0.039466261863708496D, -0.03923157975077629D, -0.03900260105729103D, -0.03876923769712448D, -0.03853490203619003D, -0.03827759623527527D, -0.038032952696084976D, -0.03779587149620056D, -0.03755195438861847D, -0.037318892776966095D, -0.0370723120868206D, -0.03683407977223396D, -0.03659613057971001D, -0.036354124546051025D, -0.03612060472369194D, -0.035871125757694244D, -0.0356329046189785D, -0.03540351986885071D, -0.03516382724046707D, -0.03492915630340576D, -0.03468974679708481D, -0.03444032371044159D, -0.03418684005737305D, -0.033952150493860245D, -0.0337207056581974D, -0.03348376974463463D, -0.03324819356203079D, -0.03300824016332626D, -0.03275500610470772D, -0.03251590207219124D, -0.032279904931783676D, -0.032043423503637314D, -0.031806062906980515D, -0.03156071901321411D, -0.03131228685379028D, -0.031079325824975967D, -0.030846213921904564D, -0.030607648193836212D, -0.030370527878403664D, -0.03013504482805729D, -0.02989460527896881D, -0.029653780162334442D, -0.02942124754190445D, -0.02915763482451439D, -0.02890888601541519D, -0.028668014332652092D, -0.02843261882662773D, -0.028197886422276497D, -0.027968186885118484D, -0.027727065607905388D, -0.027480654418468475D, -0.027245230972766876D, -0.027006402611732483D, -0.02677249163389206D, -0.02654179185628891D, -0.026293570175766945D, -0.026052728295326233D, -0.02581942081451416D, -0.025574829429388046D, -0.025324739515781403D, -0.02508126199245453D, -0.02484128810465336D, -0.024607401341199875D, -0.024367906153202057D, -0.024130383506417274D, -0.023888912051916122D, -0.023636002093553543D, -0.02339264750480652D, -0.023146748542785645D, -0.022916993126273155D, -0.022678110748529434D, -0.022439364343881607D, -0.02219318598508835D, -0.02194978855550289D, -0.02171243354678154D, -0.021477043628692627D, -0.02123437076807022D, -0.02098814956843853D, -0.02074434421956539D, -0.020506832748651505D, -0.020272759720683098D, -0.02004285529255867D, -0.019803741946816444D, -0.01955583691596985D, -0.019311942160129547D, -0.019074883311986923D, -0.018838535994291306D, -0.018599458038806915D, -0.018360331654548645D, -0.01811789721250534D, -0.01788494735956192D, -0.017648138105869293D, -0.017405608668923378D, -0.017160717397928238D, -0.016933269798755646D, -0.016701746731996536D, -0.016470860689878464D, -0.016230151057243347D, -0.01599072851240635D, -0.01574883423745632D, -0.015508405864238739D, -0.015284917317330837D, -0.01503007858991623D, -0.014800170436501503D, -0.01455119252204895D, -0.014315657317638397D, -0.014065643772482872D, -0.013827585615217686D, -0.013587378896772861D, -0.013347174972295761D, -0.013102564960718155D, -0.012854132801294327D, -0.012623535469174385D, -0.012376610189676285D, -0.012131456285715103D, -0.01189560629427433D, -0.011651847511529922D, -0.01142079383134842D, -0.011175703257322311D, -0.010937604121863842D, -0.010689251124858856D, -0.010437887161970139D, -0.010197514668107033D, -0.009952478110790253D, -0.009725537151098251D, -0.009491712786257267D, -0.009257838129997253D, -0.009027864784002304D, -0.008777694776654243D, -0.008550971746444702D, -0.00831599161028862D, -0.008069436997175217D, -0.007820136845111847D, -0.007574319839477539D, -0.007336270064115524D, -0.007096525281667709D, -0.006860194727778435D, -0.00662708654999733D, -0.006389433518052101D, -0.006162447854876518D, -0.005919415503740311D, -0.005667705088853836D, -0.005427785217761993D, -0.005184531211853027D, -0.004940364509820938D, -0.00468367338180542D, -0.004453904926776886D, -0.004206191748380661D, -0.003969529643654823D, -0.0037299059331417084D, -0.003492492251098156D, -0.003242732025682926D, -0.0030055344104766846D, -0.0027720071375370026D, -0.00253082811832428D, -0.00228659575805068D, -0.002054929733276367D, -0.0018176455050706863D, -0.001599922776222229D, -0.0013567134737968445D, -0.0011234097182750702D, -9.045042097568512E-4D, -6.500082090497017E-4D, -4.1660130955278873E-4D, -1.7212703824043274E-4D, 1.8030405044555664E-5D, 2.5004614144563675E-4D, 4.7913193702697754E-4D, 7.338970899581909E-4D, 9.82176512479782E-4D, 0.0012129582464694977D, 0.0014488585293293D, 0.0016867630183696747D, 0.0019273310899734497D, 0.0021613668650388718D, 0.002390991896390915D, 0.0026295240968465805D, 0.0028657931834459305D, 0.0031123533844947815D, 0.003348197788000107D, 0.003588378429412842D, 0.0038277730345726013D, 0.0040658749639987946D, 0.004302076995372772D, 0.004537015222012997D, 0.00477440282702446D, 0.005008077248930931D, 0.005255784839391708D, 0.0054915063083171844D, 0.005724627524614334D, 0.00595773383975029D, 0.006182271987199783D, 0.006420166231691837D, 0.006653249729424715D, 0.00689283199608326D, 0.007140390574932098D, 0.007379662245512009D, 0.0076194386929273605D, 0.007851885631680489D, 0.008095469325780869D, 0.008320674300193787D, 0.008559394627809525D, 0.008799819275736809D, 0.009034939110279083D, 0.009275494143366814D, 0.009523751214146614D, 0.00976627878844738D, 0.009996486827731133D, 0.01023360900580883D, 0.010484512895345688D, 0.010711602866649628D, 0.010940506123006344D, 0.011187344789505005D, 0.011436786502599716D, 0.011673590168356895D, 0.01189296692609787D, 0.012140963226556778D, 0.012369673699140549D, 0.012593931518495083D, 0.012840654700994492D, 0.013081846758723259D, 0.013317383825778961D, 0.013564608991146088D, 0.013808630406856537D, 0.014055570587515831D, 0.014296349138021469D, 0.01453232578933239D, 0.014765492640435696D, 0.015003692358732224D, 0.015242312103509903D, 0.015490015037357807D, 0.015726767480373383D, 0.01596280187368393D, 0.01620377227663994D, 0.01644257828593254D, 0.01667718216776848D, 0.016922373324632645D, 0.017163371667265892D, 0.017399052157998085D, 0.01764657348394394D, 0.017877236008644104D, 0.01812145859003067D, 0.01835670694708824D, 0.018597178161144257D, 0.01882927119731903D, 0.019075646996498108D, 0.019314182922244072D, 0.019556086510419846D, 0.019792847335338593D, 0.02003338560461998D, 0.020272035151720047D, 0.02050381898880005D, 0.020733200013637543D, 0.020976442843675613D, 0.021210378035902977D, 0.02143765240907669D, 0.021682390943169594D, 0.021919602528214455D, 0.0221518874168396D, 0.022384680807590485D, 0.022622741758823395D, 0.022860225290060043D, 0.02310165762901306D, 0.023336874321103096D, 0.023573121055960655D, 0.02379993349313736D, 0.02404947392642498D, 0.024299774318933487D, 0.024536117911338806D, 0.02478577382862568D, 0.025020964443683624D, 0.025249026715755463D, 0.025489892810583115D, 0.025740530341863632D, 0.025998929515480995D, 0.026246890425682068D, 0.02648969367146492D, 0.026718705892562866D, 0.026957036927342415D, 0.027204863727092743D, 0.027444452047348022D, 0.027704622596502304D, 0.027947325259447098D, 0.02819725126028061D, 0.02844608575105667D, 0.028680214658379555D, 0.028920786455273628D, 0.029158281162381172D, 0.029388519003987312D, 0.029632214456796646D, 0.029864804819226265D, 0.030107151716947556D, 0.030348382890224457D, 0.030580196529626846D, 0.03082174062728882D, 0.031057609245181084D, 0.03129713609814644D, 0.031536027789115906D, 0.03177642449736595D, 0.032016344368457794D, 0.032250333577394485D, 0.03248574212193489D, 0.03272556513547897D, 0.032981544733047485D, 0.03322865441441536D, 0.03346912935376167D, 0.0337110199034214D, 0.033949390053749084D, 0.034183282405138016D, 0.034417230635881424D, 0.03465258330106735D, 0.0348886139690876D, 0.035128623247146606D, 0.03536383435130119D, 0.03560587763786316D, 0.03585127741098404D, 0.036084286868572235D, 0.03631396219134331D, 0.036562442779541016D, 0.03680244833230972D, 0.03704371303319931D, 0.037276409566402435D, 0.03751538693904877D, 0.037762030959129333D, 0.03801950067281723D, 0.03826010972261429D, 0.038504309952259064D, 0.0387469083070755D, 0.03899405896663666D, 0.039229098707437515D, 0.03947621211409569D, 0.039711613208055496D, 0.03995666652917862D, 0.040196262300014496D, 0.040436677634716034D, 0.04066110774874687D, 0.04089445620775223D, 0.04114403575658798D, 0.04137770086526871D, 0.04162734001874924D, 0.04187489300966263D, 0.04212113842368126D, 0.04237997904419899D, 0.04263453558087349D, 0.04288449138402939D, 0.04311514273285866D, 0.04335115849971771D, 0.04357973113656044D, 0.04382624477148056D, 0.04406590759754181D, 0.04431349039077759D, 0.04456290230154991D, 0.044805336743593216D, 0.0450420007109642D, 0.04527563601732254D, 0.04551904648542404D, 0.045769836753606796D, 0.04600602388381958D, 0.046249911189079285D, 0.04649045318365097D, 0.0467350110411644D, 0.0469646230340004D, 0.04720987752079964D, 0.0474463514983654D, 0.04768086224794388D, 0.047928351908922195D, 0.048162274062633514D, 0.048396602272987366D, 0.04864221811294556D, 0.048878930509090424D, 0.0491228923201561D, 0.0493641197681427D, 0.0496056005358696D, 0.049858272075653076D, 0.050106972455978394D, 0.0503457672894001D, 0.05058106780052185D, 0.050811801105737686D, 0.051054518669843674D, 0.051300615072250366D, 0.051533062011003494D, 0.051776714622974396D, 0.05200812220573425D, 0.052254874259233475D, 0.05247935280203819D, 0.05271238088607788D, 0.05296379327774048D, 0.053211115300655365D, 0.053449779748916626D, 0.05368578061461449D, 0.05392590910196304D, 0.05417390167713165D, 0.05440376326441765D, 0.05464910343289375D, 0.054876476526260376D, 0.055116206407547D, 0.05535535141825676D, 0.05559191852807999D, 0.05583671107888222D, 0.05606665462255478D, 0.05629488080739975D, 0.056531038135290146D, 0.05677127465605736D, 0.05701253190636635D, 0.05725562572479248D, 0.05749615281820297D, 0.05773595720529556D, 0.05798366293311119D, 0.05822004750370979D, 0.05847081169486046D, 0.05871637910604477D, 0.05896701663732529D, 0.05920988693833351D, 0.05945613235235214D, 0.059691719710826874D, 0.059922900050878525D, 0.06016569584608078D, 0.060413725674152374D, 0.06065669655799866D, 0.06089803948998451D, 0.061139024794101715D, 0.061384011059999466D, 0.061639074236154556D, 0.06188543885946274D, 0.06213250756263733D, 0.062370769679546356D, 0.06261318922042847D, 0.0628569945693016D, 0.06309330463409424D, 0.06332416087388992D, 0.06356460601091385D, 0.06382028758525848D, 0.06406866014003754D, 0.06430210918188095D, 0.06454354524612427D, 0.06478959321975708D, 0.06503751873970032D, 0.06529387086629868D, 0.06553513556718826D, 0.06577916443347931D, 0.06601770222187042D, 0.06625692546367645D, 0.06650961935520172D, 0.06674687564373016D, 0.0669788122177124D, 0.06722482293844223D, 0.0674588531255722D, 0.06768260151147842D, 0.06790776550769806D, 0.06814801692962646D, 0.06838471442461014D, 0.06863133609294891D, 0.06886210292577744D, 0.06910943239927292D, 0.06934362649917603D, 0.06958003342151642D, 0.06981192529201508D, 0.07004958391189575D, 0.07029459625482559D, 0.07055052369832993D, 0.07078401744365692D, 0.07101749628782272D, 0.07126064598560333D, 0.07150739431381226D, 0.07175813615322113D, 0.0720054879784584D, 0.07224322110414505D, 0.07248044013977051D, 0.07271689921617508D, 0.07295949757099152D, 0.0732078030705452D, 0.07345090061426163D, 0.07368715852499008D, 0.07393429428339005D, 0.07417695224285126D, 0.07441578805446625D, 0.07466088980436325D, 0.07489414513111115D, 0.07513600587844849D, 0.0753738135099411D, 0.07561701536178589D, 0.0758667066693306D, 0.07612309604883194D, 0.07638232409954071D, 0.076628178358078D, 0.07686847448348999D, 0.07710824906826019D, 0.07734467834234238D, 0.07758921384811401D, 0.07784561812877655D, 0.07808583974838257D, 0.07834410667419434D, 0.07858625054359436D, 0.07882437855005264D, 0.07906801998615265D, 0.0793083980679512D, 0.07955463230609894D, 0.07981622219085693D, 0.08005615323781967D, 0.08030057698488235D, 0.0805463120341301D, 0.08078382909297943D, 0.08103151619434357D, 0.08126095682382584D, 0.0815000832080841D, 0.08173040300607681D, 0.08196523785591125D, 0.08220580220222473D, 0.08243486285209656D, 0.08268188685178757D, 0.08292843401432037D, 0.0831647738814354D, 0.08339834958314896D, 0.0836380124092102D, 0.08387906104326248D, 0.08412414789199829D, 0.08436859399080276D, 0.0846082791686058D, 0.08485112339258194D, 0.08509281277656555D, 0.08533436059951782D, 0.08558444678783417D, 0.08581666648387909D, 0.08605876564979553D, 0.08630654215812683D, 0.08654367923736572D, 0.08678770065307617D, 0.08702260255813599D, 0.08725456148386002D, 0.08750993013381958D, 0.08773811906576157D, 0.08798518031835556D, 0.0882255807518959D, 0.08847689628601074D, 0.0887211263179779D, 0.08896452188491821D, 0.08920910954475403D, 0.08945497870445251D, 0.08969209343194962D, 0.08994311094284058D, 0.09017997980117798D, 0.09042559564113617D, 0.0906810313463211D, 0.09092381596565247D, 0.0911625400185585D, 0.09141795337200165D, 0.09166523069143295D, 0.09191490709781647D, 0.0921562910079956D, 0.09239944815635681D, 0.09264124929904938D, 0.09289426356554031D, 0.09314051270484924D, 0.09336643666028976D, 0.09361747652292252D, 0.09384654462337494D, 0.09409788250923157D, 0.0943448394536972D, 0.09459105134010315D, 0.0948304533958435D, 0.09507936984300613D, 0.09532738476991653D, 0.09556381404399872D, 0.09580858051776886D, 0.09604042023420334D, 0.09626977145671844D, 0.09650926291942596D, 0.0967506468296051D, 0.09699468314647675D, 0.09725047647953033D, 0.09750711917877197D, 0.09776434302330017D, 0.09801188111305237D, 0.09824371337890625D, 0.09848768264055252D, 0.09872874617576599D, 0.09896586090326309D, 0.09920790046453476D, 0.09944957494735718D, 0.09968200325965881D, 0.09992703795433044D, 0.10018682479858398D, 0.10043767094612122D, 0.10069596767425537D, 0.10094213485717773D, 0.10119457542896271D, 0.10144343972206116D, 0.10168857872486115D, 0.1019381657242775D, 0.1021813377737999D, 0.10242380201816559D, 0.10266663134098053D, 0.1029038205742836D, 0.10315491259098053D, 0.1034012958407402D, 0.10365647822618484D, 0.10389219224452972D, 0.104132741689682D, 0.10438927263021469D, 0.10462994873523712D, 0.10488337278366089D, 0.10512462258338928D, 0.10537828505039215D, 0.1056293249130249D, 0.10587567090988159D, 0.10612065345048904D, 0.10636690258979797D, 0.10661175101995468D, 0.10686026513576508D, 0.10710041970014572D, 0.10735155642032623D, 0.10758167505264282D, 0.10782761126756668D, 0.10806737840175629D, 0.1083139032125473D, 0.10856615751981735D, 0.108811154961586D, 0.10905927419662476D, 0.10930319875478745D, 0.10955643653869629D, 0.10979588329792023D, 0.11004279553890228D, 0.1102958396077156D, 0.11054527759552002D, 0.11079119145870209D, 0.11103609204292297D, 0.11127711832523346D, 0.1115172803401947D, 0.1117594912648201D, 0.1120046079158783D, 0.11223725229501724D, 0.11248401552438736D, 0.11272372305393219D, 0.11297810077667236D, 0.11322519183158875D, 0.11346785724163055D, 0.11372040957212448D, 0.11395683884620667D, 0.11420010775327682D, 0.11444250494241714D, 0.11468120664358139D, 0.11492819339036942D, 0.11517039686441422D, 0.11540466547012329D, 0.11564680933952332D, 0.11589252948760986D, 0.11613063514232635D, 0.11639325320720673D, 0.11663356423377991D, 0.11688605695962906D, 0.11712798476219177D, 0.11737510561943054D, 0.11761916428804398D, 0.11786546558141708D, 0.11810825765132904D, 0.11834405362606049D, 0.11859436333179474D, 0.11883425712585449D, 0.11908208578824997D, 0.11933384835720062D, 0.11957629024982452D, 0.11981932073831558D, 0.12006602436304092D, 0.1203235313296318D, 0.12056553363800049D, 0.12080793082714081D, 0.12105826288461685D, 0.12129639089107513D, 0.12155969440937042D, 0.12180247157812119D, 0.12205307930707932D, 0.12229906022548676D, 0.12254200130701065D, 0.12278658151626587D, 0.12303048372268677D, 0.12327433377504349D, 0.12352501600980759D, 0.12377308309078217D, 0.12401439994573593D, 0.12425234913825989D, 0.12449690699577332D, 0.12473757565021515D, 0.12498489767313004D, 0.12522444128990173D, 0.1254711002111435D, 0.1257123202085495D, 0.1259474903345108D, 0.12619467079639435D, 0.12644141912460327D, 0.12670068442821503D, 0.12694254517555237D, 0.12717880308628082D, 0.12742914259433746D, 0.12767036259174347D, 0.12791737914085388D, 0.12815646827220917D, 0.12838824093341827D, 0.1286291480064392D, 0.12887807190418243D, 0.1291383057832718D, 0.12939326465129852D, 0.1296338587999344D, 0.1298784613609314D, 0.1301174759864807D, 0.13036495447158813D, 0.130618155002594D, 0.13086116313934326D, 0.13110719621181488D, 0.13135799765586853D, 0.1315925568342209D, 0.1318426877260208D, 0.13207705318927765D, 0.13231460750102997D, 0.13256874680519104D, 0.1328187882900238D, 0.13305653631687164D, 0.13330477476119995D, 0.13354620337486267D, 0.13378751277923584D, 0.13402922451496124D, 0.1342799961566925D, 0.13453587889671326D, 0.13477690517902374D, 0.13502594828605652D, 0.13527695834636688D, 0.13551442325115204D, 0.13576547801494598D, 0.1360103189945221D, 0.1362583041191101D, 0.13651292026042938D, 0.13675719499588013D, 0.13699865341186523D, 0.13724200427532196D, 0.13749007880687714D, 0.1377292424440384D, 0.1379738599061966D, 0.13822335004806519D, 0.13847866654396057D, 0.13873206079006195D, 0.13898490369319916D, 0.13923271000385284D, 0.1394839584827423D, 0.13973473012447357D, 0.13997481763362885D, 0.1402241587638855D, 0.1404787302017212D, 0.14072586596012115D, 0.14096570014953613D, 0.14121803641319275D, 0.14146292209625244D, 0.14170925319194794D, 0.14195016026496887D, 0.14219069480895996D, 0.14244592189788818D, 0.14269237220287323D, 0.1429404616355896D, 0.1431778520345688D, 0.14341974258422852D, 0.14366695284843445D, 0.143928661942482D, 0.14417223632335663D, 0.144425168633461D, 0.14466984570026398D, 0.144924595952034D, 0.14517496526241302D, 0.14541681110858917D, 0.14565762877464294D, 0.14590227603912354D, 0.14615565538406372D, 0.146397665143013D, 0.14664502441883087D, 0.14689862728118896D, 0.14715076982975006D, 0.14740772545337677D, 0.14766333997249603D, 0.1479138731956482D, 0.14816024899482727D, 0.14840947091579437D, 0.14864777028560638D, 0.14889664947986603D, 0.1491481214761734D, 0.1493992805480957D, 0.14964887499809265D, 0.14990657567977905D, 0.150163471698761D, 0.15041270852088928D, 0.1506699174642563D, 0.1509278118610382D, 0.1511797457933426D, 0.15143243968486786D, 0.15168344974517822D, 0.15193966031074524D, 0.15217027068138123D, 0.1524168848991394D, 0.15265515446662903D, 0.15290214121341705D, 0.1531422883272171D, 0.1533876657485962D, 0.15364302694797516D, 0.15389402210712433D, 0.15414564311504364D, 0.15439721941947937D, 0.15463466942310333D, 0.15488171577453613D, 0.15513262152671814D, 0.15537695586681366D, 0.15562325716018677D, 0.1558755785226822D, 0.15611112117767334D, 0.15636210143566132D, 0.1566154956817627D, 0.15687504410743713D, 0.15712611377239227D, 0.15738089382648468D, 0.15762266516685486D, 0.15787272155284882D, 0.15813465416431427D, 0.15839409828186035D, 0.15864822268486023D, 0.15889886021614075D, 0.15914614498615265D, 0.1593829244375229D, 0.15962837636470795D, 0.15988434851169586D, 0.16013933718204498D, 0.1603895127773285D, 0.1606409102678299D, 0.16089800000190735D, 0.16113731265068054D, 0.16138312220573425D, 0.16164162755012512D, 0.1619039922952652D, 0.16216659545898438D, 0.1624208390712738D, 0.16268286108970642D, 0.16292384266853333D, 0.16317801177501678D, 0.16342324018478394D, 0.16366511583328247D, 0.16390013694763184D, 0.16414274275302887D, 0.16438521444797516D, 0.16463032364845276D, 0.16487151384353638D, 0.1651274561882019D, 0.1653711199760437D, 0.16560332477092743D, 0.16584159433841705D, 0.16609609127044678D, 0.16633854806423187D, 0.16659075021743774D, 0.16683602333068848D, 0.16707871854305267D, 0.16732636094093323D, 0.16758735477924347D, 0.16783970594406128D, 0.16809149086475372D, 0.16834628582000732D, 0.16860048472881317D, 0.16885283589363098D, 0.16911184787750244D, 0.1693841814994812D, 0.16964191198349D, 0.1698930859565735D, 0.1701383739709854D, 0.1703755259513855D, 0.17063964903354645D, 0.17089423537254333D, 0.1711474359035492D, 0.171388179063797D, 0.17163044214248657D, 0.17187903821468353D, 0.17215164005756378D, 0.1724054217338562D, 0.17266374826431274D, 0.17292089760303497D, 0.1731615662574768D, 0.17340199649333954D, 0.17366479337215424D, 0.1739150434732437D, 0.17417052388191223D, 0.1744164675474167D, 0.17465999722480774D, 0.1749131977558136D, 0.17516209185123444D, 0.1754201203584671D, 0.17568381130695343D, 0.17593267560005188D, 0.17619283497333527D, 0.17645525932312012D, 0.17671234905719757D, 0.17696595191955566D, 0.17722009122371674D, 0.17747735977172852D, 0.17772412300109863D, 0.17797930538654327D, 0.17823158204555511D, 0.17848974466323853D, 0.17873625457286835D, 0.17898991703987122D, 0.1792307198047638D, 0.1794891506433487D, 0.17973554134368896D, 0.17999310791492462D, 0.18024954199790955D, 0.18050163984298706D, 0.18076446652412415D, 0.18102599680423737D, 0.18126806616783142D, 0.18151478469371796D, 0.18176385760307312D, 0.18201972544193268D, 0.1822776347398758D, 0.18253739178180695D, 0.18278411030769348D, 0.18303966522216797D, 0.1832965612411499D, 0.1835542917251587D, 0.1838156133890152D, 0.1840553879737854D, 0.18431082367897034D, 0.1845688670873642D, 0.18482251465320587D, 0.18506990373134613D, 0.18532750010490417D, 0.18557335436344147D, 0.18582487106323242D, 0.18608145415782928D, 0.18633334338665009D, 0.18658064305782318D, 0.18683351576328278D, 0.18709410727024078D, 0.18735168874263763D, 0.18761134147644043D, 0.18786972761154175D, 0.18811970949172974D, 0.18837547302246094D, 0.18862836062908173D, 0.18887996673583984D, 0.1891300231218338D, 0.18938672542572021D, 0.18964359164237976D, 0.18990398943424225D, 0.19015058875083923D, 0.19040174782276154D, 0.19066479802131653D, 0.19092917442321777D, 0.19117361307144165D, 0.19143356382846832D, 0.19168759882450104D, 0.1919550895690918D, 0.1922134906053543D, 0.19246909022331238D, 0.1927301287651062D, 0.19298666715621948D, 0.19325979053974152D, 0.19350659847259521D, 0.1937701553106308D, 0.19402582943439484D, 0.19428086280822754D, 0.19453628361225128D, 0.19479681551456451D, 0.19505488872528076D, 0.19530737400054932D, 0.1955641359090805D, 0.1958162784576416D, 0.1960599720478058D, 0.19630758464336395D, 0.19656088948249817D, 0.19681763648986816D, 0.19707539677619934D, 0.1973382830619812D, 0.19758382439613342D, 0.19783498346805573D, 0.19810113310813904D, 0.19836364686489105D, 0.198616623878479D, 0.19888028502464294D, 0.1991325318813324D, 0.19938108325004578D, 0.19963473081588745D, 0.19988803565502167D, 0.2001369297504425D, 0.20039276778697968D, 0.20064187049865723D, 0.2009114772081375D, 0.20116636157035828D, 0.20142139494419098D, 0.2016759216785431D, 0.20193830132484436D, 0.20219115912914276D, 0.2024461179971695D, 0.20269548892974854D, 0.20295751094818115D, 0.2032078355550766D, 0.20346446335315704D, 0.20372796058654785D, 0.20398731529712677D, 0.20425032079219818D, 0.20450064539909363D, 0.20475132763385773D, 0.20501857995986938D, 0.20528261363506317D, 0.20554444193840027D, 0.20581212639808655D, 0.20607292652130127D, 0.20632115006446838D, 0.20657122135162354D, 0.20683971047401428D, 0.2071026861667633D, 0.2073436677455902D, 0.20759855210781097D, 0.20785433053970337D, 0.20810873806476593D, 0.20837277173995972D, 0.2086334526538849D, 0.20889252424240112D, 0.2091631293296814D, 0.20941714942455292D, 0.20966646075248718D, 0.20992329716682434D, 0.210189089179039D, 0.2104564607143402D, 0.21071530878543854D, 0.2109697461128235D, 0.21122780442237854D, 0.21149942278862D, 0.21177108585834503D, 0.212026447057724D, 0.21229231357574463D, 0.21255123615264893D, 0.2128051221370697D, 0.2130669802427292D, 0.21332398056983948D, 0.21358664333820343D, 0.2138541340827942D, 0.2141055166721344D, 0.21435829997062683D, 0.21462669968605042D, 0.21488457918167114D, 0.21513977646827698D, 0.21538878977298737D, 0.2156517058610916D, 0.21592454612255096D, 0.216178759932518D, 0.216445192694664D, 0.21670177578926086D, 0.21695657074451447D, 0.21721142530441284D, 0.21747595071792603D, 0.21773701906204224D, 0.2179940938949585D, 0.2182585597038269D, 0.21852922439575195D, 0.2187880575656891D, 0.21905365586280823D, 0.21932736039161682D, 0.21959064900875092D, 0.2198474109172821D, 0.22009959816932678D, 0.22036632895469666D, 0.22063975036144257D, 0.2208988517522812D, 0.2211713194847107D, 0.22143341600894928D, 0.22171543538570404D, 0.22197507321834564D, 0.22224444150924683D, 0.2225213348865509D, 0.22277890145778656D, 0.22304566204547882D, 0.22330500185489655D, 0.22357644140720367D, 0.22383159399032593D, 0.22409124672412872D, 0.22433821856975555D, 0.22459536790847778D, 0.22486494481563568D, 0.22513198852539062D, 0.22539369761943817D, 0.22565101087093353D, 0.22591067850589752D, 0.22616182267665863D, 0.22642919421195984D, 0.22670313715934753D, 0.2269665002822876D, 0.2272244691848755D, 0.22747714817523956D, 0.2277398705482483D, 0.22800278663635254D, 0.22826018929481506D, 0.22853484749794006D, 0.22879329323768616D, 0.22905567288398743D, 0.22932875156402588D, 0.22959567606449127D, 0.22985166311264038D, 0.23012641072273254D, 0.23038911819458008D, 0.23065757751464844D, 0.2309347689151764D, 0.23118633031845093D, 0.23145408928394318D, 0.2317189872264862D, 0.23198048770427704D, 0.2322455197572708D, 0.23250694572925568D, 0.232782781124115D, 0.23303967714309692D, 0.2333066314458847D, 0.23356512188911438D, 0.23384179174900055D, 0.2341168224811554D, 0.23438036441802979D, 0.23465333878993988D, 0.23490497469902039D, 0.2351686954498291D, 0.23543143272399902D, 0.2357012927532196D, 0.23596397042274475D, 0.23622770607471466D, 0.23648853600025177D, 0.23676562309265137D, 0.23701412975788116D, 0.2372843474149704D, 0.23755553364753723D, 0.23782414197921753D, 0.2380770742893219D, 0.23833540081977844D, 0.23858565092086792D, 0.2388562709093094D, 0.2391243726015091D, 0.23939518630504608D, 0.2396606057882309D, 0.2399381399154663D, 0.24020333588123322D, 0.24046452343463898D, 0.24074232578277588D, 0.24100619554519653D, 0.24127767980098724D, 0.24153725802898407D, 0.24180150032043457D, 0.2420664131641388D, 0.24233688414096832D, 0.24260331690311432D, 0.24287430942058563D, 0.24314293265342712D, 0.2434246838092804D, 0.24368378520011902D, 0.24393977224826813D, 0.24419629573822021D, 0.24446481466293335D, 0.24473105370998383D, 0.24499809741973877D, 0.24526169896125793D, 0.24553239345550537D, 0.24579843878746033D, 0.24606765806674957D, 0.24634045362472534D, 0.24660402536392212D, 0.2468681037425995D, 0.2471298724412918D, 0.24741238355636597D, 0.2476801872253418D, 0.2479431927204132D, 0.2482285499572754D, 0.24848723411560059D, 0.24875469505786896D, 0.24903346598148346D, 0.24929732084274292D, 0.24957558512687683D, 0.24984514713287354D, 0.25010985136032104D, 0.25036337971687317D, 0.2506392002105713D, 0.2509065270423889D, 0.25119492411613464D, 0.25146934390068054D, 0.25174203515052795D, 0.25201404094696045D, 0.25227802991867065D, 0.252545565366745D, 0.252820760011673D, 0.2530921697616577D, 0.2533664405345917D, 0.25363945960998535D, 0.2539142072200775D, 0.25417646765708923D, 0.2544398903846741D, 0.2547091245651245D, 0.25498032569885254D, 0.2552673816680908D, 0.25553467869758606D, 0.2558070719242096D, 0.2560715973377228D, 0.2563423812389374D, 0.2566147446632385D, 0.256882905960083D, 0.2571600079536438D, 0.257426381111145D, 0.2576892673969269D, 0.2579575479030609D, 0.25823888182640076D, 0.258513867855072D, 0.2587907612323761D, 0.25906962156295776D, 0.2593492269515991D, 0.25961726903915405D, 0.25989121198654175D, 0.2601594924926758D, 0.26043808460235596D, 0.2607068121433258D, 0.2609749138355255D, 0.26124802231788635D, 0.2615189850330353D, 0.2617867887020111D, 0.2620628774166107D, 0.26233547925949097D, 0.262612521648407D, 0.2628844082355499D, 0.26317137479782104D, 0.26344573497772217D, 0.2637230157852173D, 0.2639881670475006D, 0.26426470279693604D, 0.2645290791988373D, 0.26480042934417725D, 0.26508674025535583D, 0.26537132263183594D, 0.26565036177635193D, 0.2659280598163605D, 0.26621153950691223D, 0.2664932310581207D, 0.266765296459198D, 0.2670402526855469D, 0.26732540130615234D, 0.2676064372062683D, 0.2678873836994171D, 0.26817184686660767D, 0.26845213770866394D, 0.2687281370162964D, 0.2689865827560425D, 0.2692733108997345D, 0.2695508897304535D, 0.26984232664108276D, 0.2701159417629242D, 0.27039632201194763D, 0.2706771194934845D, 0.2709551453590393D, 0.27123481035232544D, 0.2715044319629669D, 0.2717909812927246D, 0.2720479965209961D, 0.27231383323669434D, 0.2725817859172821D, 0.2728441059589386D, 0.27311280369758606D, 0.2733941972255707D, 0.27368631958961487D, 0.2739763855934143D, 0.274264395236969D, 0.2745394706726074D, 0.2748079299926758D, 0.2750902473926544D, 0.2753576934337616D, 0.27563992142677307D, 0.27591678500175476D, 0.2762015461921692D, 0.2764870226383209D, 0.2767705023288727D, 0.2770461440086365D, 0.2773202061653137D, 0.277586430311203D, 0.2778612971305847D, 0.2781475782394409D, 0.27842074632644653D, 0.27869942784309387D, 0.27898266911506653D, 0.27925804257392883D, 0.27953964471817017D, 0.2798300087451935D, 0.28011223673820496D, 0.28038647770881653D, 0.28068000078201294D, 0.280953049659729D, 0.2812424302101135D, 0.2815268635749817D, 0.28180745244026184D, 0.2820815443992615D, 0.28235483169555664D, 0.28263142704963684D, 0.28291577100753784D, 0.2831827402114868D, 0.28346097469329834D, 0.28373128175735474D, 0.28402161598205566D, 0.2842971086502075D, 0.2845851182937622D, 0.2848743200302124D, 0.28514111042022705D, 0.2854291498661041D, 0.28570130467414856D, 0.28598201274871826D, 0.2862635850906372D, 0.2865474224090576D, 0.2868312895298004D, 0.28711485862731934D, 0.287393182516098D, 0.28767767548561096D, 0.2879578173160553D, 0.28823962807655334D, 0.2885189354419708D, 0.28880178928375244D, 0.2890920341014862D, 0.28937217593193054D, 0.28966113924980164D, 0.2899322509765625D, 0.29023706912994385D, 0.2905227243900299D, 0.29082342982292175D, 0.29111379384994507D, 0.2913990020751953D, 0.29169899225234985D, 0.2919909954071045D, 0.2922763526439667D, 0.2925618588924408D, 0.2928437292575836D, 0.29313600063323975D, 0.29342198371887207D, 0.29370519518852234D, 0.293990820646286D, 0.29427266120910645D, 0.29455944895744324D, 0.2948371469974518D, 0.2951136827468872D, 0.29540109634399414D, 0.29569217562675476D, 0.29599061608314514D, 0.29627665877342224D, 0.2965618371963501D, 0.29685071110725403D, 0.29713842272758484D, 0.2974165678024292D, 0.2977107763290405D, 0.29799580574035645D, 0.29828667640686035D, 0.2985561192035675D, 0.29883459210395813D, 0.2991248369216919D, 0.29942139983177185D, 0.2997003495693207D, 0.2999816834926605D, 0.3002794682979584D, 0.300558477640152D, 0.3008628785610199D, 0.3011316657066345D, 0.30142825841903687D, 0.30170485377311707D, 0.30200570821762085D, 0.30228835344314575D, 0.30257362127304077D, 0.3028506934642792D, 0.3031497299671173D, 0.3034270107746124D, 0.3037080466747284D, 0.30399709939956665D, 0.3042883276939392D, 0.30455490946769714D, 0.3048365116119385D, 0.3051189184188843D, 0.305414617061615D, 0.30569401383399963D, 0.3059791922569275D, 0.3062690496444702D, 0.3065638244152069D, 0.30685165524482727D, 0.3071337342262268D, 0.30742549896240234D, 0.3077087104320526D, 0.307993084192276D, 0.308301717042923D, 0.3085950016975403D, 0.30887916684150696D, 0.30916836857795715D, 0.30946359038352966D, 0.3097575008869171D, 0.3100418746471405D, 0.3103356957435608D, 0.3106286823749542D, 0.3109305202960968D, 0.31121826171875D, 0.3115043640136719D, 0.3117966055870056D, 0.3120863735675812D, 0.31238704919815063D, 0.312675416469574D, 0.3129754364490509D, 0.3132772445678711D, 0.31357139348983765D, 0.3138739764690399D, 0.314156711101532D, 0.31446096301078796D, 0.314767062664032D, 0.3150571882724762D, 0.31536349654197693D, 0.31567034125328064D, 0.31597578525543213D, 0.31626302003860474D, 0.3165755569934845D, 0.31686896085739136D, 0.31716006994247437D, 0.3174631595611572D, 0.31774675846099854D, 0.3180374503135681D, 0.31833595037460327D, 0.3186424672603607D, 0.31892913579940796D, 0.3192225694656372D, 0.31952160596847534D, 0.31980904936790466D, 0.32011789083480835D, 0.32043129205703735D, 0.32072004675865173D, 0.32100987434387207D, 0.3213180601596832D, 0.3216226398944855D, 0.3219207525253296D, 0.32221996784210205D, 0.32251104712486267D, 0.3228189945220947D, 0.32310861349105835D, 0.32341235876083374D, 0.32371604442596436D, 0.3240188658237457D, 0.3243238031864166D, 0.3246264159679413D, 0.3249231278896332D, 0.32521936297416687D, 0.32550862431526184D, 0.32581818103790283D, 0.3261036276817322D, 0.32640382647514343D, 0.3267083168029785D, 0.327004998922348D, 0.3272927403450012D, 0.3275948762893677D, 0.32788318395614624D, 0.3281833529472351D, 0.3284815549850464D, 0.32878002524375916D, 0.3290672302246094D, 0.3293750286102295D, 0.3296642303466797D, 0.3299630880355835D, 0.3302602469921112D, 0.3305669128894806D, 0.33086422085762024D, 0.3311595916748047D, 0.33145591616630554D, 0.33177000284194946D, 0.33208441734313965D, 0.3323875963687897D, 0.33268964290618896D, 0.33300232887268066D, 0.33329537510871887D, 0.3335980772972107D, 0.3338931202888489D, 0.334201455116272D, 0.33450081944465637D, 0.33479708433151245D, 0.3350889980792999D, 0.3354017734527588D, 0.3356862962245941D, 0.33597806096076965D, 0.3362779915332794D, 0.33658143877983093D, 0.3368886709213257D, 0.3372003436088562D, 0.3374904990196228D, 0.33780431747436523D, 0.3381199836730957D, 0.3384174108505249D, 0.3387186527252197D, 0.33900177478790283D, 0.33931413292884827D, 0.33961257338523865D, 0.3399102985858917D, 0.34022054076194763D, 0.3405352234840393D, 0.3408523499965668D, 0.3411627411842346D, 0.3414681553840637D, 0.3417760133743286D, 0.3420804738998413D, 0.3423832356929779D, 0.34269484877586365D, 0.34302496910095215D, 0.34334123134613037D, 0.3436470329761505D, 0.34394562244415283D, 0.3442646265029907D, 0.34457018971443176D, 0.34488752484321594D, 0.3452032506465912D, 0.3455159664154053D, 0.34581413865089417D, 0.3461098074913025D, 0.34641650319099426D, 0.3467230796813965D, 0.34702906012535095D, 0.3473309278488159D, 0.34764036536216736D, 0.3479456901550293D, 0.3482525050640106D, 0.34856411814689636D, 0.3488941192626953D, 0.3492147624492645D, 0.34952324628829956D, 0.3498258590698242D, 0.35016393661499023D, 0.3504606783390045D, 0.3507762551307678D, 0.35109102725982666D, 0.3514126241207123D, 0.35172921419143677D, 0.3520503044128418D, 0.35238561034202576D, 0.3527106046676636D, 0.3530224859714508D, 0.3533511757850647D, 0.35365211963653564D, 0.3539552092552185D, 0.35427314043045044D, 0.3545979857444763D, 0.35491013526916504D, 0.355211466550827D, 0.35551631450653076D, 0.35583731532096863D, 0.3561674952507019D, 0.356503427028656D, 0.35681140422821045D, 0.35713064670562744D, 0.3574579656124115D, 0.3577730655670166D, 0.3580852746963501D, 0.35840508341789246D, 0.3587261736392975D, 0.3590567708015442D, 0.35936981439590454D, 0.35967788100242615D, 0.3599919378757477D, 0.36031630635261536D, 0.3606279492378235D, 0.360944539308548D, 0.3612835109233856D, 0.36159858107566833D, 0.36191561818122864D, 0.3622327446937561D, 0.36255162954330444D, 0.36288535594940186D, 0.3632265329360962D, 0.36356231570243835D, 0.36387547850608826D, 0.3641921877861023D, 0.3645060658454895D, 0.36482110619544983D, 0.36514586210250854D, 0.3654731512069702D, 0.3657870292663574D, 0.366103857755661D, 0.3664219379425049D, 0.3667573034763336D, 0.3670819103717804D, 0.36740440130233765D, 0.3677348494529724D, 0.3680580258369446D, 0.3683835566043854D, 0.36869534850120544D, 0.3690166771411896D, 0.36936962604522705D, 0.3697071671485901D, 0.3700341284275055D, 0.3703477680683136D, 0.3706650137901306D, 0.37098345160484314D, 0.3713064193725586D, 0.3716377019882202D, 0.3719581365585327D, 0.3722735345363617D, 0.3726058304309845D, 0.3729363977909088D, 0.37326177954673767D, 0.37356603145599365D, 0.3738855719566345D, 0.3742108941078186D, 0.37452539801597595D, 0.3748537600040436D, 0.3751770555973053D, 0.3755142092704773D, 0.37582820653915405D, 0.3761524558067322D, 0.3764798045158386D, 0.3767988681793213D, 0.37712106108665466D, 0.37743860483169556D, 0.3777543902397156D, 0.37809327244758606D, 0.37840941548347473D, 0.37875550985336304D, 0.37908700108528137D, 0.37941306829452515D, 0.3797505497932434D, 0.38008758425712585D, 0.3804277181625366D, 0.3807571530342102D, 0.3810791075229645D, 0.38141703605651855D, 0.3817656934261322D, 0.38210225105285645D, 0.3824288845062256D, 0.382769376039505D, 0.38310790061950684D, 0.38344258069992065D, 0.3837745189666748D, 0.3841177821159363D, 0.38443708419799805D, 0.3847852945327759D, 0.3851090669631958D, 0.3854374289512634D, 0.38577699661254883D, 0.38612180948257446D, 0.38646358251571655D, 0.3868139684200287D, 0.38715416193008423D, 0.3874974548816681D, 0.3878219425678253D, 0.3881516456604004D, 0.38848888874053955D, 0.3888251483440399D, 0.38917040824890137D, 0.38950109481811523D, 0.38981884717941284D, 0.3901572823524475D, 0.39050623774528503D, 0.39083072543144226D, 0.39116042852401733D, 0.3915018141269684D, 0.3918399214744568D, 0.39218366146087646D, 0.3925294280052185D, 0.3928794264793396D, 0.39322105050086975D, 0.39356595277786255D, 0.39390116930007935D, 0.39424818754196167D, 0.39459410309791565D, 0.39493328332901D, 0.39526739716529846D, 0.39559459686279297D, 0.39594566822052D, 0.3962780237197876D, 0.39662104845046997D, 0.3969428539276123D, 0.3972987234592438D, 0.39764490723609924D, 0.39799994230270386D, 0.3983498811721802D, 0.39869624376296997D, 0.3990347385406494D, 0.39939403533935547D, 0.39974305033683777D, 0.4000907838344574D, 0.40044382214546204D, 0.4007917642593384D, 0.40111610293388367D, 0.4014665186405182D, 0.40181636810302734D, 0.40216636657714844D, 0.40252143144607544D, 0.4028819799423218D, 0.40323081612586975D, 0.4035872519016266D, 0.40394827723503113D, 0.4042988121509552D, 0.4046299159526825D, 0.40498116612434387D, 0.4053340256214142D, 0.4056835174560547D, 0.40604034066200256D, 0.40639346837997437D, 0.40674713253974915D, 0.4070903956890106D, 0.4074479639530182D, 0.4077978730201721D, 0.40815556049346924D, 0.4085153043270111D, 0.4088471829891205D, 0.40920335054397583D, 0.409536749124527D, 0.40988242626190186D, 0.4102332293987274D, 0.41057583689689636D, 0.4109056293964386D, 0.4112517535686493D, 0.41158610582351685D, 0.411954402923584D, 0.4123139977455139D, 0.4126741290092468D, 0.41304558515548706D, 0.4134019911289215D, 0.413760781288147D, 0.414113849401474D, 0.4144744575023651D, 0.4148549735546112D, 0.4152146577835083D, 0.4155882000923157D, 0.41595014929771423D, 0.41632524132728577D, 0.41668492555618286D, 0.4170358180999756D, 0.417406290769577D, 0.4177599251270294D, 0.4181312918663025D, 0.4184896945953369D, 0.4188544452190399D, 0.41922518610954285D, 0.419583797454834D, 0.41994741559028625D, 0.42030736804008484D, 0.4206812381744385D, 0.4210386574268341D, 0.4214108884334564D, 0.42178136110305786D, 0.42215496301651D, 0.4225171208381653D, 0.4228813350200653D, 0.42325109243392944D, 0.423615962266922D, 0.4239715337753296D, 0.42434579133987427D, 0.42472386360168457D, 0.42510300874710083D, 0.4254789650440216D, 0.4258454144001007D, 0.4262089729309082D, 0.4265795052051544D, 0.4269504249095917D, 0.42731940746307373D, 0.4276832640171051D, 0.42804470658302307D, 0.4284045994281769D, 0.42876332998275757D, 0.4291493892669678D, 0.4295348823070526D, 0.4299010634422302D, 0.43027088046073914D, 0.43064936995506287D, 0.43101370334625244D, 0.4313836097717285D, 0.43177637457847595D, 0.43216753005981445D, 0.4325481057167053D, 0.43293753266334534D, 0.4333171844482422D, 0.4336993396282196D, 0.4340720772743225D, 0.43445608019828796D, 0.43482720851898193D, 0.43520474433898926D, 0.4355813264846802D, 0.435965895652771D, 0.4363478720188141D, 0.4367339015007019D, 0.43710440397262573D, 0.4374915361404419D, 0.43787166476249695D, 0.4382757544517517D, 0.4386570155620575D, 0.4390236437320709D, 0.43937790393829346D, 0.43978676199913025D, 0.4401753544807434D, 0.44054529070854187D, 0.4409463107585907D, 0.4413623809814453D, 0.44173145294189453D, 0.44210049510002136D, 0.44250327348709106D, 0.4428851902484894D, 0.44325748085975647D, 0.44363629817962646D, 0.4440159797668457D, 0.4443915784358978D, 0.4447783827781677D, 0.44518083333969116D, 0.4455743432044983D, 0.44597482681274414D, 0.44637376070022583D, 0.4467555284500122D, 0.4471644163131714D, 0.44755885004997253D, 0.44794702529907227D, 0.44833505153656006D, 0.44871219992637634D, 0.44911694526672363D, 0.44951802492141724D, 0.44992169737815857D, 0.45028671622276306D, 0.45069053769111633D, 0.4510745704174042D, 0.45147672295570374D, 0.4518676698207855D, 0.45226404070854187D, 0.4526667594909668D, 0.45307374000549316D, 0.45347461104393005D, 0.453886479139328D, 0.4542858898639679D, 0.45466384291648865D, 0.4550491273403168D, 0.45543593168258667D, 0.4558371901512146D, 0.45624276995658875D, 0.4566361904144287D, 0.457043319940567D, 0.45746922492980957D, 0.4578607976436615D, 0.458267480134964D, 0.45867159962654114D, 0.4590873718261719D, 0.459495484828949D, 0.4598916471004486D, 0.46029186248779297D, 0.46069759130477905D, 0.46110185980796814D, 0.4615064859390259D, 0.46192145347595215D, 0.46233877539634705D, 0.46276673674583435D, 0.46316519379615784D, 0.4635927677154541D, 0.4640122056007385D, 0.46440884470939636D, 0.4648398756980896D, 0.4652484059333801D, 0.4656558334827423D, 0.46607261896133423D, 0.4665050506591797D, 0.4669226109981537D, 0.46733230352401733D, 0.4677324891090393D, 0.46813610196113586D, 0.4685579836368561D, 0.4689575731754303D, 0.46935874223709106D, 0.4697929620742798D, 0.4702039957046509D, 0.4706023335456848D, 0.47102463245391846D, 0.4714542329311371D, 0.47186529636383057D, 0.47227713465690613D, 0.47273728251457214D, 0.47315338253974915D, 0.4735952317714691D, 0.4740048050880432D, 0.4744380712509155D, 0.47486940026283264D, 0.47530895471572876D, 0.47574278712272644D, 0.4761829376220703D, 0.47661855816841125D, 0.4770328402519226D, 0.4774709641933441D, 0.477912038564682D, 0.47833552956581116D, 0.47877728939056396D, 0.4792020618915558D, 0.47962984442710876D, 0.48004886507987976D, 0.48047083616256714D, 0.48091474175453186D, 0.48136579990386963D, 0.4817824363708496D, 0.48223716020584106D, 0.4826858341693878D, 0.483129620552063D, 0.48356717824935913D, 0.48402535915374756D, 0.4844686985015869D, 0.48492634296417236D, 0.4853666424751282D, 0.48579952120780945D, 0.48623910546302795D, 0.4866853952407837D, 0.4871336817741394D, 0.4875692129135132D, 0.4880107045173645D, 0.48845070600509644D, 0.4888957142829895D, 0.48936671018600464D, 0.4898100197315216D, 0.49028757214546204D, 0.4907471537590027D, 0.49118760228157043D, 0.49167636036872864D, 0.4921429753303528D, 0.49261200428009033D, 0.49306604266166687D, 0.4935230314731598D, 0.4939839243888855D, 0.49443933367729187D, 0.49487918615341187D, 0.495321661233902D, 0.49577128887176514D, 0.4962393343448639D, 0.4967193901538849D, 0.4971999526023865D, 0.4976634979248047D, 0.4981079697608948D, 0.4985779821872711D, 0.4990575909614563D, 0.4995216429233551D, 0.49998214840888977D, 0.5004438757896423D, 0.5009346604347229D, 0.5013915300369263D, 0.5018666386604309D, 0.5023337006568909D, 0.5028214454650879D, 0.5032830238342285D, 0.5037580728530884D, 0.5042566061019897D, 0.5047234296798706D, 0.5052047967910767D, 0.5056884288787842D, 0.506147027015686D, 0.5066317915916443D, 0.5071203708648682D, 0.5075882077217102D, 0.5080697536468506D, 0.5085747838020325D, 0.5090773105621338D, 0.5095798373222351D, 0.5100753307342529D, 0.5105835199356079D, 0.5110831260681152D, 0.5115672945976257D, 0.5120378136634827D, 0.5125263929367065D, 0.5130169987678528D, 0.5135247707366943D, 0.5140180587768555D, 0.5145205855369568D, 0.5150368213653564D, 0.5155346989631653D, 0.516032874584198D, 0.5165354609489441D, 0.5170459747314453D, 0.517546534538269D, 0.5180581212043762D, 0.5185604691505432D, 0.5190833210945129D, 0.5195894837379456D, 0.5200911164283752D, 0.5206009149551392D, 0.5211076736450195D, 0.5216162204742432D, 0.5221534967422485D, 0.5226559638977051D, 0.5232011079788208D, 0.5237134099006653D, 0.524222731590271D, 0.5247693657875061D, 0.5253021121025085D, 0.5258720517158508D, 0.5263900756835938D, 0.5269289612770081D, 0.527440071105957D, 0.527983546257019D, 0.5285229086875916D, 0.5290459990501404D, 0.5295710563659668D, 0.5301372408866882D, 0.5306873917579651D, 0.5312291383743286D, 0.5317577123641968D, 0.5322787761688232D, 0.5328095555305481D, 0.5333465933799744D, 0.5338669419288635D, 0.5344110131263733D, 0.5349779725074768D, 0.535515308380127D, 0.5360614657402039D, 0.5366105437278748D, 0.5371830463409424D, 0.5377721190452576D, 0.5383244156837463D, 0.5388537049293518D, 0.5394071340560913D, 0.5399731397628784D, 0.5405322909355164D, 0.5410723090171814D, 0.541620671749115D, 0.5421631336212158D, 0.5427330136299133D, 0.5433263778686523D, 0.543902575969696D, 0.5445014834403992D, 0.5451188087463379D, 0.54570472240448D, 0.5462703108787537D, 0.5468359589576721D, 0.5474085211753845D, 0.5479677319526672D, 0.5485826134681702D, 0.5491936206817627D, 0.5497756004333496D, 0.550329864025116D, 0.5509083271026611D, 0.5514797568321228D, 0.5520867705345154D, 0.5526585578918457D, 0.5532442331314087D, 0.5538352131843567D, 0.554451048374176D, 0.5550478100776672D, 0.5556716322898865D, 0.5562905669212341D, 0.5568975210189819D, 0.5575076937675476D, 0.55810546875D, 0.5587112903594971D, 0.5593138933181763D, 0.5599293112754822D, 0.560528576374054D, 0.5611559748649597D, 0.5618165731430054D, 0.5624411702156067D, 0.5630917549133301D, 0.5637422204017639D, 0.5643942356109619D, 0.565030038356781D, 0.5656741857528687D, 0.5663131475448608D, 0.5669856071472168D, 0.5676253437995911D, 0.5682467818260193D, 0.5688928961753845D, 0.5695339441299438D, 0.5701755881309509D, 0.5708367824554443D, 0.5714528560638428D, 0.5721008777618408D, 0.572792112827301D, 0.5734336972236633D, 0.5740956664085388D, 0.5747833847999573D, 0.5754809975624084D, 0.5761705636978149D, 0.5768662095069885D, 0.5775163769721985D, 0.5782217979431152D, 0.5789486169815063D, 0.5796666145324707D, 0.5803557634353638D, 0.581061065196991D, 0.5817610025405884D, 0.5824694633483887D, 0.5831955671310425D, 0.5839105844497681D, 0.5846039056777954D, 0.5852735042572021D, 0.585961639881134D, 0.5866875052452087D, 0.5874256491661072D, 0.5881643891334534D, 0.5888875722885132D, 0.5896194577217102D, 0.5903604030609131D, 0.5911058783531189D, 0.5918967723846436D, 0.5926496982574463D, 0.5934140086174011D, 0.5941669344902039D, 0.5949351787567139D, 0.5956904292106628D, 0.5964735746383667D, 0.5972592830657959D, 0.5980729460716248D, 0.5988597869873047D, 0.599652111530304D, 0.6004453897476196D, 0.6012773513793945D, 0.6020792722702026D, 0.6028953194618225D, 0.6037645936012268D, 0.6045876145362854D, 0.6053803563117981D, 0.6061732172966003D, 0.6070164442062378D, 0.607831597328186D, 0.6086806058883667D, 0.6095685958862305D, 0.6104097962379456D, 0.6112634539604187D, 0.6120801568031311D, 0.6129648685455322D, 0.61387699842453D, 0.6147569417953491D, 0.6155954599380493D, 0.616402268409729D, 0.6172897219657898D, 0.6181901693344116D, 0.6190983653068542D, 0.6199691891670227D, 0.6208701133728027D, 0.6217461824417114D, 0.6226446032524109D, 0.6236084699630737D, 0.6245348453521729D, 0.6254535913467407D, 0.6264715194702148D, 0.627429187297821D, 0.6283873319625854D, 0.6293536424636841D, 0.6303542852401733D, 0.6313357353210449D, 0.6323064565658569D, 0.6332805156707764D, 0.6342861652374268D, 0.6353551745414734D, 0.6363866329193115D, 0.6374404430389404D, 0.6384573578834534D, 0.6395328044891357D, 0.640578031539917D, 0.6416310667991638D, 0.6427513360977173D, 0.6438618302345276D, 0.6449521780014038D, 0.6460468173027039D, 0.6471554636955261D, 0.6482812166213989D, 0.6493995189666748D, 0.6506232619285583D, 0.6517972946166992D, 0.6529961228370667D, 0.6542066931724548D, 0.6553934216499329D, 0.6565525531768799D, 0.6577653288841248D, 0.659013569355011D, 0.6602596640586853D, 0.6615633964538574D, 0.6628472805023193D, 0.6642037034034729D, 0.6654988527297974D, 0.6668195128440857D, 0.6681184768676758D, 0.6694334149360657D, 0.6707931756973267D, 0.6722204685211182D, 0.6736778020858765D, 0.6750837564468384D, 0.6765458583831787D, 0.6780242919921875D, 0.6794694662094116D, 0.6809762716293335D, 0.6825757026672363D, 0.6842136383056641D, 0.6857424974441528D, 0.6873693466186523D, 0.6890041828155518D, 0.6906958222389221D, 0.6923577785491943D, 0.6941602230072021D, 0.6958938241004944D, 0.6976979374885559D, 0.6996030807495117D, 0.7014617919921875D, 0.7033551931381226D, 0.7053101062774658D, 0.7073088884353638D, 0.7093900442123413D, 0.7115321159362793D, 0.7136979699134827D, 0.7159866690635681D, 0.7184513211250305D, 0.7208492159843445D, 0.7233277559280396D, 0.725836992263794D, 0.7282920479774475D, 0.7309600114822388D, 0.7337514162063599D, 0.7369317412376404D, 0.7400341629981995D, 0.7431910634040833D, 0.7465731501579285D, 0.7502389550209045D, 0.7539366483688354D, 0.7578595280647278D, 0.7620136737823486D, 0.7664995193481445D, 0.7713850736618042D, 0.7766971588134766D, 0.7824797630310059D, 0.7896102666854858D, 0.7976230382919312D, 0.8072929978370667D, 0.8200995326042175D, 0.8393367528915405D, 0.8953311443328857D}; diff --git a/src/test/java/LookupGenerator.java b/src/test/java/LookupGenerator.java index eea731910..7063a0788 100644 --- a/src/test/java/LookupGenerator.java +++ b/src/test/java/LookupGenerator.java @@ -1,7 +1,7 @@ +import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.gaea.util.GlueList; import net.jafama.FastMath; import org.junit.jupiter.api.Test; -import org.polydev.gaea.math.FastNoiseLite; -import org.polydev.gaea.util.GlueList; import java.util.ArrayList; import java.util.Collections; diff --git a/src/test/java/NoiseInstancePerformanceTest.java b/src/test/java/NoiseInstancePerformanceTest.java index ac3ecc72c..66693c40b 100644 --- a/src/test/java/NoiseInstancePerformanceTest.java +++ b/src/test/java/NoiseInstancePerformanceTest.java @@ -1,5 +1,5 @@ +import com.dfsek.terra.api.gaea.math.FastNoiseLite; import org.junit.jupiter.api.Test; -import org.polydev.gaea.math.FastNoiseLite; public class NoiseInstancePerformanceTest { @Test diff --git a/src/test/java/RangeTest.java b/src/test/java/RangeTest.java index b9e12cccf..74e10b23c 100644 --- a/src/test/java/RangeTest.java +++ b/src/test/java/RangeTest.java @@ -1,5 +1,5 @@ +import com.dfsek.terra.api.gaea.math.Range; import org.junit.jupiter.api.Test; -import org.polydev.gaea.math.Range; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; From 3dc27f2b0a29658aead3f6c3144f5d9e479db642 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 10:52:02 -0700 Subject: [PATCH 005/210] Fix minor Gaea related issues --- .../com/dfsek/terra/api/gaea/util/SerializationUtil.java | 2 +- .../java/com/dfsek/terra/command/VersionCommand.java | 9 +-------- src/main/resources/plugin.yml | 1 - 3 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java b/src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java index f4d5bb143..50e6baf90 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java +++ b/src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java @@ -12,7 +12,7 @@ import java.io.Serializable; public class SerializationUtil { public static Object fromFile(File f) throws IOException, ClassNotFoundException { - ObjectInputStream ois = new MovedObjectInputStream(new FileInputStream(f), "com.dfsek.betterend.gaea", "com.dfsek.terra.api.gaea"); // Backwards compat with old BetterEnd shade location + ObjectInputStream ois = new MovedObjectInputStream(new FileInputStream(f), "org.polydev.gaea", "com.dfsek.terra.api.gaea"); // Backwards compat with old Gaea location Object o = ois.readObject(); ois.close(); return o; diff --git a/src/main/java/com/dfsek/terra/command/VersionCommand.java b/src/main/java/com/dfsek/terra/command/VersionCommand.java index 50451a8a2..60c2dce80 100644 --- a/src/main/java/com/dfsek/terra/command/VersionCommand.java +++ b/src/main/java/com/dfsek/terra/command/VersionCommand.java @@ -2,14 +2,11 @@ package com.dfsek.terra.command; import com.dfsek.terra.api.gaea.command.Command; import com.dfsek.terra.config.lang.LangUtil; -import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; -import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; -import java.util.Objects; public class VersionCommand extends Command { public VersionCommand(Command parent) { @@ -28,12 +25,8 @@ public class VersionCommand extends Command { @Override public boolean execute(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { - Plugin gaea = Objects.requireNonNull(Bukkit.getPluginManager().getPlugin("Gaea")); - String gaeaVersion = gaea.getDescription().getVersion(); - String terraVersion = getMain().getDescription().getVersion(); - LangUtil.send("command.version", sender, terraVersion, gaeaVersion); - + LangUtil.send("command.version", sender, terraVersion); return true; } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 1ea9b8982..3e6c3fd79 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,4 @@ name: "Terra" -depend: [ "Gaea" ] main: "com.dfsek.terra.Terra" version: "@VERSION@" load: "STARTUP" From f4456f46a7045d81b8d80be8b1c7704e94d4263a Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 11:42:17 -0700 Subject: [PATCH 006/210] API stuff --- .../terra/api/bukkit/BukkitBiomeGrid.java | 39 ++++++++++ .../terra/api/bukkit/BukkitBlockData.java | 17 +++++ .../dfsek/terra/api/bukkit/BukkitWorld.java | 5 ++ .../generator/BukkitChunkGenerator.java | 60 +++++++++++++++ .../dfsek/terra/api/generic/BlockData.java | 5 ++ .../api/generic/generator/BlockPopulator.java | 4 +- .../api/generic/generator/ChunkGenerator.java | 75 ++++++++++++++----- .../terra/api/generic/world/BiomeGrid.java | 50 +++++++++++++ .../dfsek/terra/api/generic/world/World.java | 2 + 9 files changed, 236 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/BukkitBlockData.java create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/BlockData.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java new file mode 100644 index 000000000..599243fd0 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java @@ -0,0 +1,39 @@ +package com.dfsek.terra.api.bukkit; + +import com.dfsek.terra.api.generic.world.BiomeGrid; +import org.bukkit.block.Biome; +import org.bukkit.generator.ChunkGenerator; +import org.jetbrains.annotations.NotNull; + +public class BukkitBiomeGrid implements BiomeGrid { + private final ChunkGenerator.BiomeGrid delegate; + + public BukkitBiomeGrid(ChunkGenerator.BiomeGrid biomeGrid) { + this.delegate = biomeGrid; + } + + @Override + public ChunkGenerator.BiomeGrid getHandle() { + return delegate; + } + + @Override + public @NotNull Biome getBiome(int x, int z) { + return delegate.getBiome(x, z); + } + + @Override + public @NotNull Biome getBiome(int x, int y, int z) { + return delegate.getBiome(x, y, z); + } + + @Override + public void setBiome(int x, int z, @NotNull Biome bio) { + delegate.setBiome(x, z, bio); + } + + @Override + public void setBiome(int x, int y, int z, @NotNull Biome bio) { + delegate.setBiome(x, y, z, bio); + } +} diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitBlockData.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitBlockData.java new file mode 100644 index 000000000..73701d1ea --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitBlockData.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.api.bukkit; + +import com.dfsek.terra.api.generic.BlockData; + +public class BukkitBlockData implements BlockData { + private final org.bukkit.block.data.BlockData delegate; + + public BukkitBlockData(org.bukkit.block.data.BlockData delegate) { + this.delegate = delegate; + } + + + @Override + public org.bukkit.block.data.BlockData getHandle() { + return delegate; + } +} diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java index 94e3ae4c3..91b16ae6d 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java @@ -13,4 +13,9 @@ public class BukkitWorld implements World { public long getSeed() { return delegate.getSeed(); } + + @Override + public org.bukkit.World getHandle() { + return delegate; + } } diff --git a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java new file mode 100644 index 000000000..1c4530278 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java @@ -0,0 +1,60 @@ +package com.dfsek.terra.api.bukkit.generator; + +import com.dfsek.terra.api.bukkit.BukkitBiomeGrid; +import com.dfsek.terra.api.bukkit.BukkitBlockData; +import com.dfsek.terra.api.bukkit.BukkitWorld; +import com.dfsek.terra.api.generic.BlockData; +import com.dfsek.terra.api.generic.generator.BlockPopulator; +import org.bukkit.World; +import org.bukkit.generator.ChunkGenerator; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Random; + +public abstract class BukkitChunkGenerator extends ChunkGenerator implements com.dfsek.terra.api.generic.generator.ChunkGenerator { + + + @Override + public ChunkGenerator.@NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { + BukkitChunkData data = new BukkitChunkData(createChunkData(((BukkitWorld) world).getHandle())); + generateChunkData(new BukkitWorld(world), random, x, z, new BukkitBiomeGrid(biome), data); + return data.getHandle(); + } + + @Override + public List getDefaultPopulators(com.dfsek.terra.api.generic.world.World world) { + return null; + } + + public static class BukkitChunkData implements com.dfsek.terra.api.generic.generator.ChunkGenerator.ChunkData { + + private final ChunkGenerator.ChunkData delegate; + + public BukkitChunkData(ChunkGenerator.ChunkData delegate) { + this.delegate = delegate; + } + + @Override + public ChunkGenerator.ChunkData getHandle() { + return delegate; + } + + @Override + public int getMaxHeight() { + return delegate.getMaxHeight(); + } + + + @Override + public void setBlock(int x, int y, int z, @NotNull BlockData blockData) { + delegate.setBlock(x, y, z, ((BukkitBlockData) blockData).getHandle()); + } + + + @Override + public @NotNull BlockData getBlockData(int x, int y, int z) { + return new BukkitBlockData(delegate.getBlockData(x, y, z)); + } + } +} diff --git a/src/main/java/com/dfsek/terra/api/generic/BlockData.java b/src/main/java/com/dfsek/terra/api/generic/BlockData.java new file mode 100644 index 000000000..dfca0b585 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/BlockData.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.api.generic; + +public interface BlockData { + Object getHandle(); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java b/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java index a205ff579..196a9153a 100644 --- a/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java +++ b/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java @@ -5,6 +5,6 @@ import com.dfsek.terra.api.generic.world.World; import java.util.Random; -public abstract class BlockPopulator { - public abstract void populate(World world, Random random, Chunk chunk); +public interface BlockPopulator { + void populate(World world, Random random, Chunk chunk); } diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java index 563c7e018..8eda98c94 100644 --- a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java @@ -1,27 +1,64 @@ package com.dfsek.terra.api.generic.generator; -import java.util.Collections; +import com.dfsek.terra.api.generic.BlockData; +import com.dfsek.terra.api.generic.world.BiomeGrid; +import com.dfsek.terra.api.generic.world.World; +import org.jetbrains.annotations.NotNull; + import java.util.List; +import java.util.Random; -public abstract class ChunkGenerator { - public boolean isParallelCapable() { - return false; - } - public boolean shouldGenerateCaves() { - return false; - } - public boolean shouldGenerateDecorations() { - return false; - } - public boolean shouldGenerateMobs() { - return false; - } +public interface ChunkGenerator { + boolean isParallelCapable(); - public boolean shouldGenerateStructures() { - return false; - } + boolean shouldGenerateCaves(); - public List getDefaultPopulators() { - return Collections.emptyList(); + boolean shouldGenerateDecorations(); + + boolean shouldGenerateMobs(); + + boolean shouldGenerateStructures(); + + void generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData data); + + List getDefaultPopulators(World world); + + interface ChunkData { + Object getHandle(); + + /** + * Get the maximum height for the chunk. + *

+ * Setting blocks at or above this height will do nothing. + * + * @return the maximum height + */ + int getMaxHeight(); + + + /** + * Set the block at x,y,z in the chunk data to material. + *

+ * Setting blocks outside the chunk's bounds does nothing. + * + * @param x the x location in the chunk from 0-15 inclusive + * @param y the y location in the chunk from 0 (inclusive) - maxHeight (exclusive) + * @param z the z location in the chunk from 0-15 inclusive + * @param blockData the type to set the block to + */ + void setBlock(int x, int y, int z, @NotNull BlockData blockData); + + + /** + * Get the type and data of the block at x, y, z. + *

+ * Getting blocks outside the chunk's bounds returns air. + * + * @param x the x location in the chunk from 0-15 inclusive + * @param y the y location in the chunk from 0 (inclusive) - maxHeight (exclusive) + * @param z the z location in the chunk from 0-15 inclusive + * @return the data of the block or the BlockData for air if x, y or z are outside the chunk's bounds + */ + @NotNull BlockData getBlockData(int x, int y, int z); } } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java b/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java new file mode 100644 index 000000000..2cc030c17 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java @@ -0,0 +1,50 @@ +package com.dfsek.terra.api.generic.world; + +import org.bukkit.block.Biome; +import org.jetbrains.annotations.NotNull; + +public interface BiomeGrid { + Object getHandle(); + + /** + * Get biome at x, z within chunk being generated + * + * @param x - 0-15 + * @param z - 0-15 + * @return Biome value + * @deprecated biomes are now 3-dimensional + */ + @NotNull + Biome getBiome(int x, int z); + + /** + * Get biome at x, z within chunk being generated + * + * @param x - 0-15 + * @param y - 0-255 + * @param z - 0-15 + * @return Biome value + */ + @NotNull + Biome getBiome(int x, int y, int z); + + /** + * Set biome at x, z within chunk being generated + * + * @param x - 0-15 + * @param z - 0-15 + * @param bio - Biome value + * @deprecated biomes are now 3-dimensional + */ + void setBiome(int x, int z, @NotNull Biome bio); + + /** + * Set biome at x, z within chunk being generated + * + * @param x - 0-15 + * @param y - 0-255 + * @param z - 0-15 + * @param bio - Biome value + */ + void setBiome(int x, int y, int z, @NotNull Biome bio); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/World.java b/src/main/java/com/dfsek/terra/api/generic/world/World.java index 2b834ce54..2a2078259 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/World.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/World.java @@ -2,4 +2,6 @@ package com.dfsek.terra.api.generic.world; public interface World { long getSeed(); + + Object getHandle(); } From d9f585e4b2b3e70240cb9882cc105789bdb5e8f5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 11:51:30 -0700 Subject: [PATCH 007/210] make Handle separate interface --- src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java | 5 +++++ src/main/java/com/dfsek/terra/api/generic/BlockData.java | 3 +-- src/main/java/com/dfsek/terra/api/generic/Handle.java | 8 ++++++++ .../java/com/dfsek/terra/api/generic/world/BiomeGrid.java | 5 ++--- .../java/com/dfsek/terra/api/generic/world/Block.java | 4 +++- .../java/com/dfsek/terra/api/generic/world/Chunk.java | 4 +++- .../java/com/dfsek/terra/api/generic/world/World.java | 6 +++--- 7 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/dfsek/terra/api/generic/Handle.java diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java index 269d27707..e96289eee 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java @@ -18,4 +18,9 @@ public class BukkitChunk implements Chunk { public int getZ() { return delegate.getZ(); } + + @Override + public org.bukkit.Chunk getHandle() { + return delegate; + } } diff --git a/src/main/java/com/dfsek/terra/api/generic/BlockData.java b/src/main/java/com/dfsek/terra/api/generic/BlockData.java index dfca0b585..64d031c61 100644 --- a/src/main/java/com/dfsek/terra/api/generic/BlockData.java +++ b/src/main/java/com/dfsek/terra/api/generic/BlockData.java @@ -1,5 +1,4 @@ package com.dfsek.terra.api.generic; -public interface BlockData { - Object getHandle(); +public interface BlockData extends Handle { } diff --git a/src/main/java/com/dfsek/terra/api/generic/Handle.java b/src/main/java/com/dfsek/terra/api/generic/Handle.java new file mode 100644 index 000000000..1df2e8946 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/Handle.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.api.generic; + +/** + * An interface that contains a platform delegate. + */ +public interface Handle { + Object getHandle(); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java b/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java index 2cc030c17..b2df137dd 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java @@ -1,11 +1,10 @@ package com.dfsek.terra.api.generic.world; +import com.dfsek.terra.api.generic.Handle; import org.bukkit.block.Biome; import org.jetbrains.annotations.NotNull; -public interface BiomeGrid { - Object getHandle(); - +public interface BiomeGrid extends Handle { /** * Get biome at x, z within chunk being generated * diff --git a/src/main/java/com/dfsek/terra/api/generic/world/Block.java b/src/main/java/com/dfsek/terra/api/generic/world/Block.java index e3ec7fe64..d45bcd51a 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/Block.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/Block.java @@ -1,4 +1,6 @@ package com.dfsek.terra.api.generic.world; -public interface Block { +import com.dfsek.terra.api.generic.Handle; + +public interface Block extends Handle { } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java b/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java index 1c8370131..e9ffcf814 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java @@ -1,6 +1,8 @@ package com.dfsek.terra.api.generic.world; -public interface Chunk { +import com.dfsek.terra.api.generic.Handle; + +public interface Chunk extends Handle { int getX(); int getZ(); diff --git a/src/main/java/com/dfsek/terra/api/generic/world/World.java b/src/main/java/com/dfsek/terra/api/generic/world/World.java index 2a2078259..fc1df9474 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/World.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/World.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.generic.world; -public interface World { - long getSeed(); +import com.dfsek.terra.api.generic.Handle; - Object getHandle(); +public interface World extends Handle { + long getSeed(); } From 9f4e120283d505e394f5d3fb654a011a0a73a37a Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 12:28:59 -0700 Subject: [PATCH 008/210] Implement Block interface --- .../dfsek/terra/api/bukkit/BukkitBlock.java | 27 +++++++++++ .../terra/api/bukkit/BukkitWorldHandle.java | 12 +++-- .../generator/BukkitChunkGenerator.java | 20 ++++---- .../dfsek/terra/api/generic/world/Block.java | 4 ++ .../terra/api/generic/world/WorldHandle.java | 2 + .../terra/generation/ChunkGeneratorImpl.java | 47 +++++++++++++++++++ 6 files changed, 98 insertions(+), 14 deletions(-) create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/BukkitBlock.java create mode 100644 src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitBlock.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitBlock.java new file mode 100644 index 000000000..d635b63b8 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitBlock.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.api.bukkit; + +import com.dfsek.terra.api.generic.BlockData; +import com.dfsek.terra.api.generic.world.Block; + +public class BukkitBlock implements Block { + private final org.bukkit.block.Block delegate; + + public BukkitBlock(org.bukkit.block.Block delegate) { + this.delegate = delegate; + } + + @Override + public void setBlockData(BlockData data, boolean physics) { + delegate.setBlockData(((BukkitBlockData) data).getHandle(), physics); + } + + @Override + public BlockData getBlockData() { + return new BukkitBlockData(delegate.getBlockData()); + } + + @Override + public Object getHandle() { + return delegate; + } +} diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java index 93ace5702..b28ee2585 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java @@ -1,18 +1,19 @@ package com.dfsek.terra.api.bukkit; import com.dfsek.terra.api.generic.world.WorldHandle; +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; public class BukkitWorldHandle implements WorldHandle { + @Override - public void setBlockData(Block block, BlockData data, boolean physics) { + public void setBlockData(Block block, org.bukkit.block.data.BlockData data, boolean physics) { block.setBlockData(data, physics); } @Override - public BlockData getBlockData(Block block) { + public org.bukkit.block.data.BlockData getBlockData(Block block) { return block.getBlockData(); } @@ -20,4 +21,9 @@ public class BukkitWorldHandle implements WorldHandle { public Material getType(Block block) { return block.getType(); } + + @Override + public com.dfsek.terra.api.generic.BlockData createBlockData(String data) { + return new BukkitBlockData(Bukkit.createBlockData(data)); + } } diff --git a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java index 1c4530278..7b0d3362c 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java @@ -4,27 +4,25 @@ import com.dfsek.terra.api.bukkit.BukkitBiomeGrid; import com.dfsek.terra.api.bukkit.BukkitBlockData; import com.dfsek.terra.api.bukkit.BukkitWorld; import com.dfsek.terra.api.generic.BlockData; -import com.dfsek.terra.api.generic.generator.BlockPopulator; import org.bukkit.World; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; -import java.util.List; import java.util.Random; -public abstract class BukkitChunkGenerator extends ChunkGenerator implements com.dfsek.terra.api.generic.generator.ChunkGenerator { +public class BukkitChunkGenerator extends ChunkGenerator { + private final com.dfsek.terra.api.generic.generator.ChunkGenerator delegate; - - @Override - public ChunkGenerator.@NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { - BukkitChunkData data = new BukkitChunkData(createChunkData(((BukkitWorld) world).getHandle())); - generateChunkData(new BukkitWorld(world), random, x, z, new BukkitBiomeGrid(biome), data); - return data.getHandle(); + public BukkitChunkGenerator(com.dfsek.terra.api.generic.generator.ChunkGenerator delegate) { + this.delegate = delegate; } @Override - public List getDefaultPopulators(com.dfsek.terra.api.generic.world.World world) { - return null; + public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { + BukkitWorld bukkitWorld = new BukkitWorld(world); + BukkitChunkData data = new BukkitChunkData(createChunkData(world)); + delegate.generateChunkData(bukkitWorld, random, x, z, new BukkitBiomeGrid(biome), data); + return data.getHandle(); } public static class BukkitChunkData implements com.dfsek.terra.api.generic.generator.ChunkGenerator.ChunkData { diff --git a/src/main/java/com/dfsek/terra/api/generic/world/Block.java b/src/main/java/com/dfsek/terra/api/generic/world/Block.java index d45bcd51a..c78a707e0 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/Block.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/Block.java @@ -1,6 +1,10 @@ package com.dfsek.terra.api.generic.world; +import com.dfsek.terra.api.generic.BlockData; import com.dfsek.terra.api.generic.Handle; public interface Block extends Handle { + void setBlockData(BlockData data, boolean physics); + + BlockData getBlockData(); } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java b/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java index fb4359d9d..bf59124ff 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java @@ -13,4 +13,6 @@ public interface WorldHandle { BlockData getBlockData(Block block); Material getType(Block block); + + com.dfsek.terra.api.generic.BlockData createBlockData(String data); } diff --git a/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java b/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java new file mode 100644 index 000000000..e12f50c5c --- /dev/null +++ b/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java @@ -0,0 +1,47 @@ +package com.dfsek.terra.generation; + +import com.dfsek.terra.api.generic.generator.BlockPopulator; +import com.dfsek.terra.api.generic.generator.ChunkGenerator; +import com.dfsek.terra.api.generic.world.BiomeGrid; +import com.dfsek.terra.api.generic.world.World; +import org.jetbrains.annotations.NotNull; + +import java.util.List; +import java.util.Random; + +public class ChunkGeneratorImpl implements ChunkGenerator { + @Override + public boolean isParallelCapable() { + return false; + } + + @Override + public boolean shouldGenerateCaves() { + return false; + } + + @Override + public boolean shouldGenerateDecorations() { + return false; + } + + @Override + public boolean shouldGenerateMobs() { + return false; + } + + @Override + public boolean shouldGenerateStructures() { + return false; + } + + @Override + public void generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData data) { + + } + + @Override + public List getDefaultPopulators(World world) { + return null; + } +} From abd29c1cb473269db7e973275ef90dad85163b0c Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 14:15:02 -0700 Subject: [PATCH 009/210] Do a whole bunch of stuff [DOES NOT COMPILE] --- src/main/java/com/dfsek/terra/Terra.java | 1 - src/main/java/com/dfsek/terra/TerraWorld.java | 1 - .../terra/api/bukkit/BukkitBlockData.java | 17 -- .../terra/api/bukkit/BukkitWorldHandle.java | 18 +- .../generator/BukkitChunkGenerator.java | 4 +- .../bukkit/{ => world/block}/BukkitBlock.java | 6 +- .../bukkit/world/block/BukkitBlockData.java | 37 +++ .../world/block/BukkitMaterialData.java | 33 +++ .../world/block/data/BukkitEnumAdapter.java | 153 +++++++++++++ .../bukkit/world/block/data/BukkitStairs.java | 55 +++++ .../world/block/data/BukkitWaterlogged.java | 23 ++ .../dfsek/terra/api/gaea/biome/Generator.java | 24 +- .../gaea/generation/GaeaChunkGenerator.java | 1 - .../gaea/generation/GenerationPopulator.java | 1 - .../api/gaea/math/ChunkInterpolator.java | 32 --- .../api/gaea/math/ChunkInterpolator2.java | 72 ------ .../api/gaea/math/ChunkInterpolator3.java | 21 +- .../dfsek/terra/api/generic/BlockData.java | 4 - .../api/generic/generator/ChunkGenerator.java | 2 +- .../dfsek/terra/api/generic/world/World.java | 2 + .../terra/api/generic/world/WorldHandle.java | 5 +- .../api/generic/world/{ => block}/Block.java | 3 +- .../api/generic/world/block/BlockData.java | 9 + .../api/generic/world/block/BlockFace.java | 148 ++++++++++++ .../api/generic/world/block/MaterialData.java | 10 + .../generic/world/block/data/Bisected.java | 20 ++ .../generic/world/block/data/Directional.java | 10 + .../api/generic/world/block/data/Slab.java | 4 + .../api/generic/world/block/data/Stairs.java | 30 +++ .../generic/world/block/data/Waterlogged.java | 9 + .../api/generic/world/vector/Vector3.java | 5 +- .../dfsek/terra/command/FixChunkCommand.java | 1 - .../dfsek/terra/command/SaveDataCommand.java | 1 - .../terra/command/biome/BiomeInfoCommand.java | 1 - .../command/biome/BiomeLocateCommand.java | 1 - .../command/structure/LocateCommand.java | 1 - .../com/dfsek/terra/debug/gui/DebugFrame.java | 1 - .../terra/generation/ChunkGeneratorImpl.java | 170 +++++++++++++- .../com/dfsek/terra/generation/Sampler.java | 6 +- .../terra/generation/TerraChunkGenerator.java | 212 ------------------ .../terra/structure/spawn/Requirement.java | 1 - .../java/com/dfsek/terra/util/SlabUtil.java | 24 +- 42 files changed, 765 insertions(+), 414 deletions(-) delete mode 100644 src/main/java/com/dfsek/terra/api/bukkit/BukkitBlockData.java rename src/main/java/com/dfsek/terra/api/bukkit/{ => world/block}/BukkitBlock.java (77%) create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlockData.java create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitMaterialData.java create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitEnumAdapter.java create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitStairs.java create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitWaterlogged.java delete mode 100644 src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator.java delete mode 100644 src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator2.java delete mode 100644 src/main/java/com/dfsek/terra/api/generic/BlockData.java rename src/main/java/com/dfsek/terra/api/generic/world/{ => block}/Block.java (66%) create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/block/BlockFace.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/block/data/Bisected.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/block/data/Directional.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/block/data/Stairs.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/block/data/Waterlogged.java delete mode 100644 src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java diff --git a/src/main/java/com/dfsek/terra/Terra.java b/src/main/java/com/dfsek/terra/Terra.java index 7abcf65b2..459bf8f1f 100644 --- a/src/main/java/com/dfsek/terra/Terra.java +++ b/src/main/java/com/dfsek/terra/Terra.java @@ -33,7 +33,6 @@ import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader; import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader; import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader; import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.generation.config.NoiseBuilder; import com.dfsek.terra.generation.items.flora.FloraLayer; import com.dfsek.terra.generation.items.flora.TerraFlora; diff --git a/src/main/java/com/dfsek/terra/TerraWorld.java b/src/main/java/com/dfsek/terra/TerraWorld.java index 8e9812f84..1e1046ae0 100644 --- a/src/main/java/com/dfsek/terra/TerraWorld.java +++ b/src/main/java/com/dfsek/terra/TerraWorld.java @@ -9,7 +9,6 @@ import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.config.builder.biomegrid.BiomeGridBuilder; import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.generation.TerraChunkGenerator; import org.bukkit.Bukkit; import org.bukkit.World; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitBlockData.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitBlockData.java deleted file mode 100644 index 73701d1ea..000000000 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitBlockData.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dfsek.terra.api.bukkit; - -import com.dfsek.terra.api.generic.BlockData; - -public class BukkitBlockData implements BlockData { - private final org.bukkit.block.data.BlockData delegate; - - public BukkitBlockData(org.bukkit.block.data.BlockData delegate) { - this.delegate = delegate; - } - - - @Override - public org.bukkit.block.data.BlockData getHandle() { - return delegate; - } -} diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java index b28ee2585..a804889ba 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java @@ -1,9 +1,17 @@ package com.dfsek.terra.api.bukkit; +import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; +import com.dfsek.terra.api.bukkit.world.block.BukkitMaterialData; +import com.dfsek.terra.api.bukkit.world.block.data.BukkitStairs; +import com.dfsek.terra.api.bukkit.world.block.data.BukkitWaterlogged; import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.block.data.Waterlogged; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.block.data.type.Stairs; public class BukkitWorldHandle implements WorldHandle { @@ -23,7 +31,15 @@ public class BukkitWorldHandle implements WorldHandle { } @Override - public com.dfsek.terra.api.generic.BlockData createBlockData(String data) { + public BlockData createBlockData(String data) { + org.bukkit.block.data.BlockData bukkitData = Bukkit.createBlockData(data); + if(bukkitData instanceof Stairs) return new BukkitStairs(bukkitData); + if(bukkitData instanceof Waterlogged) return new BukkitWaterlogged(bukkitData); return new BukkitBlockData(Bukkit.createBlockData(data)); } + + @Override + public MaterialData createMaterialData(String data) { + return new BukkitMaterialData(Material.matchMaterial(data)); + } } diff --git a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java index 7b0d3362c..a2cf7d3ab 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.bukkit.generator; import com.dfsek.terra.api.bukkit.BukkitBiomeGrid; -import com.dfsek.terra.api.bukkit.BukkitBlockData; import com.dfsek.terra.api.bukkit.BukkitWorld; -import com.dfsek.terra.api.generic.BlockData; +import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; +import com.dfsek.terra.api.generic.world.block.BlockData; import org.bukkit.World; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitBlock.java b/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlock.java similarity index 77% rename from src/main/java/com/dfsek/terra/api/bukkit/BukkitBlock.java rename to src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlock.java index d635b63b8..10a9ca888 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitBlock.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlock.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.bukkit; +package com.dfsek.terra.api.bukkit.world.block; -import com.dfsek.terra.api.generic.BlockData; -import com.dfsek.terra.api.generic.world.Block; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.block.BlockData; public class BukkitBlock implements Block { private final org.bukkit.block.Block delegate; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlockData.java b/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlockData.java new file mode 100644 index 000000000..98d6e54c7 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlockData.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.api.bukkit.world.block; + +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; + +public class BukkitBlockData implements BlockData { + private final org.bukkit.block.data.BlockData delegate; + + public BukkitBlockData(org.bukkit.block.data.BlockData delegate) { + this.delegate = delegate; + } + + + @Override + public org.bukkit.block.data.BlockData getHandle() { + return delegate; + } + + @Override + public MaterialData getMaterial() { + return new BukkitMaterialData(delegate.getMaterial()); + } + + @Override + public boolean matches(MaterialData materialData) { + return delegate.getMaterial().equals(((BukkitMaterialData) materialData).getHandle()); + } + + @Override + public BukkitBlockData clone() { + try { + return (BukkitBlockData) super.clone(); + } catch(CloneNotSupportedException e) { + throw new Error(e); + } + } +} diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitMaterialData.java b/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitMaterialData.java new file mode 100644 index 000000000..6185ea8bd --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitMaterialData.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.api.bukkit.world.block; + +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import org.bukkit.Material; + +public class BukkitMaterialData implements MaterialData { + private final Material delegate; + + public BukkitMaterialData(Material delegate) { + this.delegate = delegate; + } + + @Override + public boolean matches(MaterialData other) { + return ((BukkitMaterialData) other).getHandle().equals(delegate); + } + + @Override + public boolean matches(BlockData other) { + return ((BukkitMaterialData) other.getMaterial()).getHandle().equals(delegate); + } + + @Override + public Material getHandle() { + return delegate; + } + + @Override + public int hashCode() { + return delegate.hashCode(); + } +} diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitEnumAdapter.java b/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitEnumAdapter.java new file mode 100644 index 000000000..8410578b3 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitEnumAdapter.java @@ -0,0 +1,153 @@ +package com.dfsek.terra.api.bukkit.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.data.Bisected; +import com.dfsek.terra.api.generic.world.block.data.Stairs; + +public final class BukkitEnumAdapter { + public static Stairs.Shape fromBukkitStair(org.bukkit.block.data.type.Stairs.Shape shape) { + switch(shape) { + case STRAIGHT: + return Stairs.Shape.STRAIGHT; + case INNER_LEFT: + return Stairs.Shape.INNER_LEFT; + case OUTER_LEFT: + return Stairs.Shape.OUTER_LEFT; + case INNER_RIGHT: + return Stairs.Shape.INNER_RIGHT; + case OUTER_RIGHT: + return Stairs.Shape.OUTER_RIGHT; + default: + throw new IllegalStateException(); + } + } + + public static org.bukkit.block.data.type.Stairs.Shape fromTerraStair(Stairs.Shape shape) { + switch(shape) { + case STRAIGHT: + return org.bukkit.block.data.type.Stairs.Shape.STRAIGHT; + case INNER_LEFT: + return org.bukkit.block.data.type.Stairs.Shape.INNER_LEFT; + case OUTER_LEFT: + return org.bukkit.block.data.type.Stairs.Shape.OUTER_LEFT; + case INNER_RIGHT: + return org.bukkit.block.data.type.Stairs.Shape.INNER_RIGHT; + case OUTER_RIGHT: + return org.bukkit.block.data.type.Stairs.Shape.OUTER_RIGHT; + default: + throw new IllegalStateException(); + } + } + + public static Bisected.Half fromBukkitHalf(org.bukkit.block.data.Bisected.Half half) { + switch(half) { + case BOTTOM: + return Bisected.Half.BOTTOM; + case TOP: + return Bisected.Half.TOP; + default: + throw new IllegalStateException(); + } + } + + public static org.bukkit.block.data.Bisected.Half fromTerraHalf(Bisected.Half half) { + switch(half) { + case TOP: + return org.bukkit.block.data.Bisected.Half.TOP; + case BOTTOM: + return org.bukkit.block.data.Bisected.Half.BOTTOM; + default: + throw new IllegalStateException(); + } + } + + public static BlockFace fromBukkitBlockFace(org.bukkit.block.BlockFace face) { + switch(face) { + case DOWN: + return BlockFace.DOWN; + case UP: + return BlockFace.UP; + case NORTH_WEST: + return BlockFace.NORTH_WEST; + case NORTH_EAST: + return BlockFace.NORTH_EAST; + case SOUTH_EAST: + return BlockFace.SOUTH_EAST; + case SOUTH_WEST: + return BlockFace.SOUTH_WEST; + case NORTH_NORTH_WEST: + return BlockFace.NORTH_NORTH_WEST; + case WEST_NORTH_WEST: + return BlockFace.WEST_NORTH_WEST; + case WEST_SOUTH_WEST: + return BlockFace.WEST_SOUTH_WEST; + case SOUTH_SOUTH_WEST: + return BlockFace.SOUTH_SOUTH_WEST; + case EAST_NORTH_EAST: + return BlockFace.EAST_NORTH_EAST; + case WEST: + return BlockFace.WEST; + case SOUTH: + return BlockFace.SOUTH; + case EAST: + return BlockFace.EAST; + case NORTH: + return BlockFace.NORTH; + case SELF: + return BlockFace.SELF; + case EAST_SOUTH_EAST: + return BlockFace.EAST_SOUTH_EAST; + case NORTH_NORTH_EAST: + return BlockFace.NORTH_NORTH_EAST; + case SOUTH_SOUTH_EAST: + return BlockFace.SOUTH_SOUTH_EAST; + default: + throw new IllegalStateException(); + } + } + + public static org.bukkit.block.BlockFace fromTerraBlockFace(BlockFace face) { + switch(face) { + case DOWN: + return org.bukkit.block.BlockFace.DOWN; + case UP: + return org.bukkit.block.BlockFace.UP; + case NORTH_WEST: + return org.bukkit.block.BlockFace.NORTH_WEST; + case NORTH_EAST: + return org.bukkit.block.BlockFace.NORTH_EAST; + case SOUTH_EAST: + return org.bukkit.block.BlockFace.SOUTH_EAST; + case SOUTH_WEST: + return org.bukkit.block.BlockFace.SOUTH_WEST; + case NORTH_NORTH_WEST: + return org.bukkit.block.BlockFace.NORTH_NORTH_WEST; + case WEST_NORTH_WEST: + return org.bukkit.block.BlockFace.WEST_NORTH_WEST; + case WEST_SOUTH_WEST: + return org.bukkit.block.BlockFace.WEST_SOUTH_WEST; + case SOUTH_SOUTH_WEST: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST; + case EAST_NORTH_EAST: + return org.bukkit.block.BlockFace.EAST_NORTH_EAST; + case WEST: + return org.bukkit.block.BlockFace.WEST; + case SOUTH: + return org.bukkit.block.BlockFace.SOUTH; + case EAST: + return org.bukkit.block.BlockFace.EAST; + case NORTH: + return org.bukkit.block.BlockFace.NORTH; + case SELF: + return org.bukkit.block.BlockFace.SELF; + case EAST_SOUTH_EAST: + return org.bukkit.block.BlockFace.EAST_SOUTH_EAST; + case NORTH_NORTH_EAST: + return org.bukkit.block.BlockFace.NORTH_NORTH_EAST; + case SOUTH_SOUTH_EAST: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST; + default: + throw new IllegalStateException(); + } + } +} diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitStairs.java b/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitStairs.java new file mode 100644 index 000000000..27ed177ea --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitStairs.java @@ -0,0 +1,55 @@ +package com.dfsek.terra.api.bukkit.world.block.data; + +import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.data.Stairs; +import org.bukkit.block.data.BlockData; + +public class BukkitStairs extends BukkitBlockData implements Stairs { + private final org.bukkit.block.data.type.Stairs stairs; + + public BukkitStairs(BlockData delegate) { + super(delegate); + this.stairs = (org.bukkit.block.data.type.Stairs) delegate; + } + + @Override + public Shape getShape() { + return BukkitEnumAdapter.fromBukkitStair(stairs.getShape()); + } + + @Override + public void setShape(Shape shape) { + stairs.setShape(BukkitEnumAdapter.fromTerraStair(shape)); + } + + @Override + public Half getHalf() { + return BukkitEnumAdapter.fromBukkitHalf(stairs.getHalf()); + } + + @Override + public void setHalf(Half half) { + stairs.setHalf(BukkitEnumAdapter.fromTerraHalf(half)); + } + + @Override + public BlockFace getFacing() { + return BukkitEnumAdapter.fromBukkitBlockFace(stairs.getFacing()); + } + + @Override + public void setFacing(BlockFace facing) { + stairs.setFacing(BukkitEnumAdapter.fromTerraBlockFace(facing)); + } + + @Override + public boolean isWaterlogged() { + return stairs.isWaterlogged(); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + stairs.setWaterlogged(waterlogged); + } +} diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitWaterlogged.java b/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitWaterlogged.java new file mode 100644 index 000000000..25ee1cc80 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitWaterlogged.java @@ -0,0 +1,23 @@ +package com.dfsek.terra.api.bukkit.world.block.data; + +import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; +import com.dfsek.terra.api.generic.world.block.data.Waterlogged; +import org.bukkit.block.data.BlockData; + +public class BukkitWaterlogged extends BukkitBlockData implements Waterlogged { + private boolean waterlogged; + + public BukkitWaterlogged(BlockData delegate) { + super(delegate); + } + + @Override + public boolean isWaterlogged() { + return waterlogged; + } + + @Override + public void setWaterlogged(boolean waterlogged) { + this.waterlogged = waterlogged; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java b/src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java index a878a2253..d11d26623 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java +++ b/src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java @@ -1,32 +1,20 @@ package com.dfsek.terra.api.gaea.biome; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.Interpolator; import com.dfsek.terra.api.gaea.world.palette.Palette; -import org.bukkit.World; -import org.bukkit.block.data.BlockData; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.BlockData; public abstract class Generator { - /** - * Gets the 2D noise at a pair of coordinates using the provided FastNoiseLite instance. - * - * @param gen - The FastNoiseLite instance to use. - * @param x - The x coordinate. - * @param z - The z coordinate. - * @return double - Noise value at the specified coordinates. - */ - public abstract double getNoise(FastNoiseLite gen, World w, int x, int z); - /** * Gets the 3D noise at a pair of coordinates using the provided FastNoiseLite instance. * - * @param gen - The FastNoiseLite instance to use. - * @param x - The x coordinate. - * @param y - The y coordinate. - * @param z - The z coordinate. + * @param x - The x coordinate. + * @param y - The y coordinate. + * @param z - The z coordinate. * @return double - Noise value at the specified coordinates. */ - public abstract double getNoise(FastNoiseLite gen, World w, int x, int y, int z); + public abstract double getNoise(World w, int x, int y, int z); /** * Gets the BlocPalette to generate the biome with. diff --git a/src/main/java/com/dfsek/terra/api/gaea/generation/GaeaChunkGenerator.java b/src/main/java/com/dfsek/terra/api/gaea/generation/GaeaChunkGenerator.java index 99edab779..dee2b3026 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/generation/GaeaChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/gaea/generation/GaeaChunkGenerator.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.gaea.generation; import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.gaea.math.ChunkInterpolator; import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; diff --git a/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPopulator.java b/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPopulator.java index 76cab5215..57ac2cb0a 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPopulator.java +++ b/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPopulator.java @@ -1,6 +1,5 @@ package com.dfsek.terra.api.gaea.generation; -import com.dfsek.terra.api.gaea.math.ChunkInterpolator; import org.bukkit.World; import org.bukkit.generator.ChunkGenerator; diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator.java b/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator.java deleted file mode 100644 index 9f8b34a46..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.dfsek.terra.api.gaea.math; - -import com.dfsek.terra.api.gaea.biome.BiomeGrid; -import org.bukkit.World; - -public interface ChunkInterpolator { - double getNoise(double x, double z); - - double getNoise(double x, double y, double z); - - enum InterpolationType { - /** - * 2D (Bilinear) interpolation - */ - BILINEAR { - @Override - public com.dfsek.terra.api.gaea.math.ChunkInterpolator getInstance(World w, int chunkX, int chunkZ, BiomeGrid grid, FastNoiseLite noise) { - return new ChunkInterpolator2(w, chunkX, chunkZ, grid, noise); - } - }, - /** - * 3D (Trilinear) interpolation - */ - TRILINEAR { - @Override - public com.dfsek.terra.api.gaea.math.ChunkInterpolator getInstance(World w, int chunkX, int chunkZ, BiomeGrid grid, FastNoiseLite noise) { - return new ChunkInterpolator3(w, chunkX, chunkZ, grid, noise); - } - }; - public abstract com.dfsek.terra.api.gaea.math.ChunkInterpolator getInstance(World w, int chunkX, int chunkZ, BiomeGrid grid, FastNoiseLite noise); - } -} diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator2.java b/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator2.java deleted file mode 100644 index 9191eadd0..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator2.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.dfsek.terra.api.gaea.math; - -import com.dfsek.terra.api.gaea.biome.BiomeGrid; -import com.dfsek.terra.api.gaea.biome.Generator; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import org.bukkit.World; - -/** - * Class to abstract away the 16 Interpolators needed to generate a chunk.
- * Contains method to get interpolated noise at a coordinate within the chunk. - */ -public class ChunkInterpolator2 implements ChunkInterpolator { - private final Interpolator[][] interpGrid = new Interpolator[4][4]; - - private final int xOrigin; - private final int zOrigin; - private final FastNoiseLite noise; - private final World w; - - /** - * Instantiates a ChunkInterpolator at a pair of chunk coordinates, with a BiomeGrid and FastNoiseLite instance. - * - * @param chunkX X coordinate of the chunk. - * @param chunkZ Z coordinate of the chunk. - * @param grid BiomeGrid to use for noise fetching. - * @param noise FastNoiseLite instance to use. - */ - public ChunkInterpolator2(World w, int chunkX, int chunkZ, BiomeGrid grid, FastNoiseLite noise) { - this.xOrigin = chunkX << 4; - this.zOrigin = chunkZ << 4; - this.noise = noise; - this.w = w; - Generator[][] gridTemp = new Generator[8][8]; - for(int x = - 2; x < 6; x++) { - for(int z = - 2; z < 6; z++) { - gridTemp[x + 2][z + 2] = grid.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), GenerationPhase.BASE).getGenerator(); - } - } - for(byte x = 0; x < 4; x++) { - for(byte z = 0; z < 4; z++) { - interpGrid[x][z] = new Interpolator(biomeAvg(x, z, gridTemp), - biomeAvg(x + 1, z, gridTemp), - biomeAvg(x, z + 1, gridTemp), - biomeAvg(x + 1, z + 1, gridTemp), gridTemp[x+1][z+1].getInterpolationType()); - } - } - } - - private double biomeAvg(int x, int z, Generator[][] g) { - return (g[x + 3][z + 2].getNoise(noise, w, (x << 2) + xOrigin, (z << 2) + zOrigin) - + g[x + 1][z + 2].getNoise(noise, w, (x << 2) + xOrigin, (z << 2) + zOrigin) - + g[x + 2][z + 3].getNoise(noise, w, (x << 2) + xOrigin, (z << 2) + zOrigin) - + g[x + 2][z + 1].getNoise(noise, w, (x << 2) + xOrigin, (z << 2) + zOrigin)) / 4D; - } - - /** - * Gets the noise at a pair of internal chunk coordinates. - * - * @param x The internal X coordinate (0-15). - * @param z The internal Z coordinate (0-15). - * @return double - The interpolated noise at the coordinates. - */ - @Override - public double getNoise(double x, double z) { - return interpGrid[((int) x) / 4][((int) z) / 4].bilerp((x % 4) / 4, (z % 4) / 4); - } - - @Override - public double getNoise(double x, double y, double z) { - return getNoise(x, z); - } -} diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java b/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java index 9bd1d06cf..95547e132 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java +++ b/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java @@ -3,19 +3,18 @@ package com.dfsek.terra.api.gaea.math; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.biome.Generator; import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.generic.world.World; import net.jafama.FastMath; -import org.bukkit.World; /** * Class to abstract away the 16 Interpolators needed to generate a chunk.
* Contains method to get interpolated noise at a coordinate within the chunk. */ -public class ChunkInterpolator3 implements ChunkInterpolator { +public class ChunkInterpolator3 { private final Interpolator3[][][] interpGrid = new Interpolator3[4][64][4]; private final Generator[][] gens = new Generator[7][7]; private final boolean[][] needsBiomeInterp = new boolean[5][5]; private final double[][][] noiseStorage = new double[7][7][65]; - private final FastNoiseLite noise; private final int xOrigin; private final int zOrigin; private final World w; @@ -26,17 +25,15 @@ public class ChunkInterpolator3 implements ChunkInterpolator { * @param chunkX X coordinate of the chunk. * @param chunkZ Z coordinate of the chunk. * @param grid BiomeGrid to use for noise fetching. - * @param noise FastNoiseLite instance to use. */ - public ChunkInterpolator3(World w, int chunkX, int chunkZ, BiomeGrid grid, FastNoiseLite noise) { + public ChunkInterpolator3(World w, int chunkX, int chunkZ, BiomeGrid grid) { this.xOrigin = chunkX << 4; this.zOrigin = chunkZ << 4; - this.noise = noise; this.w = w; - for(int x = - 1; x < 6; x++) { - for(int z = - 1; z < 6; z++) { + for(int x = -1; x < 6; x++) { + for(int z = -1; z < 6; z++) { gens[x + 1][z + 1] = grid.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), GenerationPhase.BASE).getGenerator(); } } @@ -87,7 +84,7 @@ public class ChunkInterpolator3 implements ChunkInterpolator { for(byte x = - 1; x < 6; x++) { for(byte z = - 1; z < 6; z++) { for(int y = 0; y < 64; y++) { - noiseStorage[x + 1][z + 1][y] = gens[x + 1][z + 1].getNoise(noise, w, (x << 2) + xOrigin, y << 2, (z << 2) + zOrigin); + noiseStorage[x + 1][z + 1][y] = gens[x + 1][z + 1].getNoise(w, (x << 2) + xOrigin, y << 2, (z << 2) + zOrigin); } } } @@ -114,11 +111,6 @@ public class ChunkInterpolator3 implements ChunkInterpolator { } } - @Override - public double getNoise(double x, double z) { - return getNoise(x, 0, z); - } - /** * Gets the noise at a pair of internal chunk coordinates. * @@ -126,7 +118,6 @@ public class ChunkInterpolator3 implements ChunkInterpolator { * @param z The internal Z coordinate (0-15). * @return double - The interpolated noise at the coordinates. */ - @Override public double getNoise(double x, double y, double z) { return interpGrid[reRange(((int) x) / 4, 3)][reRange(((int) y) / 4, 63)][reRange(((int) z) / 4, 3)].trilerp((x % 4) / 4, (y % 4) / 4, (z % 4) / 4); } diff --git a/src/main/java/com/dfsek/terra/api/generic/BlockData.java b/src/main/java/com/dfsek/terra/api/generic/BlockData.java deleted file mode 100644 index 64d031c61..000000000 --- a/src/main/java/com/dfsek/terra/api/generic/BlockData.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra.api.generic; - -public interface BlockData extends Handle { -} diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java index 8eda98c94..a7261ff68 100644 --- a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.generic.generator; -import com.dfsek.terra.api.generic.BlockData; import com.dfsek.terra.api.generic.world.BiomeGrid; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.BlockData; import org.jetbrains.annotations.NotNull; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/api/generic/world/World.java b/src/main/java/com/dfsek/terra/api/generic/world/World.java index fc1df9474..99b3f1242 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/World.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/World.java @@ -4,4 +4,6 @@ import com.dfsek.terra.api.generic.Handle; public interface World extends Handle { long getSeed(); + + int getMaxHeight(); } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java b/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java index bf59124ff..9936e42c7 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.generic.world; +import com.dfsek.terra.api.generic.world.block.MaterialData; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; @@ -14,5 +15,7 @@ public interface WorldHandle { Material getType(Block block); - com.dfsek.terra.api.generic.BlockData createBlockData(String data); + com.dfsek.terra.api.generic.world.block.BlockData createBlockData(String data); + + MaterialData createMaterialData(String data); } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/Block.java b/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java similarity index 66% rename from src/main/java/com/dfsek/terra/api/generic/world/Block.java rename to src/main/java/com/dfsek/terra/api/generic/world/block/Block.java index c78a707e0..691c1080f 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/Block.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java @@ -1,6 +1,5 @@ -package com.dfsek.terra.api.generic.world; +package com.dfsek.terra.api.generic.world.block; -import com.dfsek.terra.api.generic.BlockData; import com.dfsek.terra.api.generic.Handle; public interface Block extends Handle { diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java b/src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java new file mode 100644 index 000000000..50200660d --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.api.generic.world.block; + +import com.dfsek.terra.api.generic.Handle; + +public interface BlockData extends Handle, Cloneable { + MaterialData getMaterial(); + + boolean matches(MaterialData materialData); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/BlockFace.java b/src/main/java/com/dfsek/terra/api/generic/world/block/BlockFace.java new file mode 100644 index 000000000..6a16eea70 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/BlockFace.java @@ -0,0 +1,148 @@ +package com.dfsek.terra.api.generic.world.block; + +import com.dfsek.terra.api.generic.world.vector.Vector3; +import org.jetbrains.annotations.NotNull; + +public enum BlockFace { + NORTH(0, 0, -1), + EAST(1, 0, 0), + SOUTH(0, 0, 1), + WEST(-1, 0, 0), + UP(0, 1, 0), + DOWN(0, -1, 0), + NORTH_EAST(NORTH, EAST), + NORTH_WEST(NORTH, WEST), + SOUTH_EAST(SOUTH, EAST), + SOUTH_WEST(SOUTH, WEST), + WEST_NORTH_WEST(WEST, NORTH_WEST), + NORTH_NORTH_WEST(NORTH, NORTH_WEST), + NORTH_NORTH_EAST(NORTH, NORTH_EAST), + EAST_NORTH_EAST(EAST, NORTH_EAST), + EAST_SOUTH_EAST(EAST, SOUTH_EAST), + SOUTH_SOUTH_EAST(SOUTH, SOUTH_EAST), + SOUTH_SOUTH_WEST(SOUTH, SOUTH_WEST), + WEST_SOUTH_WEST(WEST, SOUTH_WEST), + SELF(0, 0, 0); + + private final int modX; + private final int modY; + private final int modZ; + + BlockFace(final int modX, final int modY, final int modZ) { + this.modX = modX; + this.modY = modY; + this.modZ = modZ; + } + + BlockFace(final BlockFace face1, final BlockFace face2) { + this.modX = face1.getModX() + face2.getModX(); + this.modY = face1.getModY() + face2.getModY(); + this.modZ = face1.getModZ() + face2.getModZ(); + } + + /** + * Get the amount of X-coordinates to modify to get the represented block + * + * @return Amount of X-coordinates to modify + */ + public int getModX() { + return modX; + } + + /** + * Get the amount of Y-coordinates to modify to get the represented block + * + * @return Amount of Y-coordinates to modify + */ + public int getModY() { + return modY; + } + + /** + * Get the amount of Z-coordinates to modify to get the represented block + * + * @return Amount of Z-coordinates to modify + */ + public int getModZ() { + return modZ; + } + + /** + * Gets the normal vector corresponding to this block face. + * + * @return the normal vector + */ + @NotNull + public Vector3 getDirection() { + Vector3 direction = new Vector3(modX, modY, modZ); + if(modX != 0 || modY != 0 || modZ != 0) { + direction.normalize(); + } + return direction; + } + + @NotNull + public org.bukkit.block.BlockFace getOppositeFace() { + switch(this) { + case NORTH: + return org.bukkit.block.BlockFace.SOUTH; + + case SOUTH: + return org.bukkit.block.BlockFace.NORTH; + + case EAST: + return org.bukkit.block.BlockFace.WEST; + + case WEST: + return org.bukkit.block.BlockFace.EAST; + + case UP: + return org.bukkit.block.BlockFace.DOWN; + + case DOWN: + return org.bukkit.block.BlockFace.UP; + + case NORTH_EAST: + return org.bukkit.block.BlockFace.SOUTH_WEST; + + case NORTH_WEST: + return org.bukkit.block.BlockFace.SOUTH_EAST; + + case SOUTH_EAST: + return org.bukkit.block.BlockFace.NORTH_WEST; + + case SOUTH_WEST: + return org.bukkit.block.BlockFace.NORTH_EAST; + + case WEST_NORTH_WEST: + return org.bukkit.block.BlockFace.EAST_SOUTH_EAST; + + case NORTH_NORTH_WEST: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST; + + case NORTH_NORTH_EAST: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST; + + case EAST_NORTH_EAST: + return org.bukkit.block.BlockFace.WEST_SOUTH_WEST; + + case EAST_SOUTH_EAST: + return org.bukkit.block.BlockFace.WEST_NORTH_WEST; + + case SOUTH_SOUTH_EAST: + return org.bukkit.block.BlockFace.NORTH_NORTH_WEST; + + case SOUTH_SOUTH_WEST: + return org.bukkit.block.BlockFace.NORTH_NORTH_EAST; + + case WEST_SOUTH_WEST: + return org.bukkit.block.BlockFace.EAST_NORTH_EAST; + + case SELF: + return org.bukkit.block.BlockFace.SELF; + } + + return org.bukkit.block.BlockFace.SELF; + } +} + diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java b/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java new file mode 100644 index 000000000..d632c52d1 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.generic.world.block; + +import com.dfsek.terra.api.generic.Handle; + +public interface MaterialData extends Handle { + boolean matches(MaterialData other); + + boolean matches(BlockData other); + +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/data/Bisected.java b/src/main/java/com/dfsek/terra/api/generic/world/block/data/Bisected.java new file mode 100644 index 000000000..3c897f048 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/data/Bisected.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.api.generic.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockData; + +public interface Bisected extends BlockData { + Half getHalf(); + + void setHalf(Half half); + + enum Half { + /** + * The top half of the block, normally with the higher y coordinate. + */ + TOP, + /** + * The bottom half of the block, normally with the lower y coordinate. + */ + BOTTOM + } +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/data/Directional.java b/src/main/java/com/dfsek/terra/api/generic/world/block/data/Directional.java new file mode 100644 index 000000000..d7f5979a1 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/data/Directional.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.generic.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; + +public interface Directional extends BlockData { + BlockFace getFacing(); + + void setFacing(BlockFace facing); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java b/src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java new file mode 100644 index 000000000..3587f957f --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.generic.world.block.data; + +public interface Slab extends Bisected, Waterlogged { +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/data/Stairs.java b/src/main/java/com/dfsek/terra/api/generic/world/block/data/Stairs.java new file mode 100644 index 000000000..5ac6bfcfd --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/data/Stairs.java @@ -0,0 +1,30 @@ +package com.dfsek.terra.api.generic.world.block.data; + +public interface Stairs extends Waterlogged, Directional, Bisected { + Shape getShape(); + + void setShape(Shape shape); + + enum Shape { + /** + * Regular stair block. + */ + STRAIGHT, + /** + * Inner corner stair block with higher left side. + */ + INNER_LEFT, + /** + * Inner corner stair block with higher right side. + */ + INNER_RIGHT, + /** + * Outer corner stair block with higher left side. + */ + OUTER_LEFT, + /** + * Outer corner stair block with higher right side. + */ + OUTER_RIGHT + } +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/data/Waterlogged.java b/src/main/java/com/dfsek/terra/api/generic/world/block/data/Waterlogged.java new file mode 100644 index 000000000..da3caacf7 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/data/Waterlogged.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.api.generic.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockData; + +public interface Waterlogged extends BlockData { + boolean isWaterlogged(); + + void setWaterlogged(boolean waterlogged); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java b/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java index 48e38ebec..7a156466c 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java @@ -53,7 +53,7 @@ public class Vector3 implements Cloneable { return FastMath.floorToInt(z); } - public Vector3 multiply(int m) { + public Vector3 multiply(double m) { x *= m; y *= m; z *= m; @@ -101,4 +101,7 @@ public class Vector3 implements Cloneable { return new Location(world, this.clone()); } + public Vector3 normalize() { + return this.multiply(1D / this.length()); + } } diff --git a/src/main/java/com/dfsek/terra/command/FixChunkCommand.java b/src/main/java/com/dfsek/terra/command/FixChunkCommand.java index 77994fdfc..7efd71d29 100644 --- a/src/main/java/com/dfsek/terra/command/FixChunkCommand.java +++ b/src/main/java/com/dfsek/terra/command/FixChunkCommand.java @@ -1,7 +1,6 @@ package com.dfsek.terra.command; import com.dfsek.terra.api.gaea.command.WorldCommand; -import com.dfsek.terra.generation.TerraChunkGenerator; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/dfsek/terra/command/SaveDataCommand.java b/src/main/java/com/dfsek/terra/command/SaveDataCommand.java index 11c302eb9..cbd22670f 100644 --- a/src/main/java/com/dfsek/terra/command/SaveDataCommand.java +++ b/src/main/java/com/dfsek/terra/command/SaveDataCommand.java @@ -3,7 +3,6 @@ package com.dfsek.terra.command; import com.dfsek.terra.api.gaea.command.Command; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.generation.TerraChunkGenerator; import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java b/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java index 64581efb6..e1b6f0c32 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java +++ b/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java @@ -7,7 +7,6 @@ import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.generation.items.TerraStructure; import org.bukkit.World; import org.bukkit.command.Command; diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java b/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java index 109eb08b6..c5252d4e5 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java +++ b/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java @@ -5,7 +5,6 @@ import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.async.AsyncBiomeFinder; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.generation.TerraChunkGenerator; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; diff --git a/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java b/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java index 93f7f0e54..6624ce2e1 100644 --- a/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java @@ -4,7 +4,6 @@ import com.dfsek.terra.Terra; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.async.AsyncStructureFinder; import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.generation.items.TerraStructure; import org.bukkit.Bukkit; import org.bukkit.Location; diff --git a/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java b/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java index 3fd28f5f4..ed9012618 100644 --- a/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java +++ b/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java @@ -3,7 +3,6 @@ package com.dfsek.terra.debug.gui; import com.dfsek.terra.Terra; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.image.ImageLoader; import net.jafama.FastMath; import org.bukkit.Bukkit; diff --git a/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java b/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java index e12f50c5c..e3f23d7b7 100644 --- a/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java +++ b/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java @@ -1,47 +1,203 @@ package com.dfsek.terra.generation; +import com.dfsek.terra.Terra; +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.gaea.generation.GenerationPopulator; +import com.dfsek.terra.api.gaea.math.ChunkInterpolator3; +import com.dfsek.terra.api.gaea.population.PopulationManager; +import com.dfsek.terra.api.gaea.profiler.ProfileFuture; +import com.dfsek.terra.api.gaea.profiler.WorldProfiler; +import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.api.generic.generator.BlockPopulator; import com.dfsek.terra.api.generic.generator.ChunkGenerator; import com.dfsek.terra.api.generic.world.BiomeGrid; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.config.base.ConfigPack; +import com.dfsek.terra.config.lang.LangUtil; +import com.dfsek.terra.config.templates.BiomeTemplate; +import com.dfsek.terra.debug.Debug; +import com.dfsek.terra.population.FloraPopulator; +import com.dfsek.terra.population.OrePopulator; +import com.dfsek.terra.population.TreePopulator; +import com.dfsek.terra.util.PaletteUtil; +import com.dfsek.terra.util.SlabUtil; import org.jetbrains.annotations.NotNull; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Random; +import java.util.logging.Level; public class ChunkGeneratorImpl implements ChunkGenerator { + private static final Map popMap = new HashMap<>(); + private final PopulationManager popMan; + private final ConfigPack configPack; + private final Terra main; + private boolean needsLoad = true; + + public ChunkGeneratorImpl(ConfigPack c, Terra main) { + popMan = new PopulationManager(main); + this.configPack = c; + this.main = main; + popMan.attach(new OrePopulator(main)); + popMan.attach(new TreePopulator(main)); + popMan.attach(new FloraPopulator(main)); + } + + public static synchronized void saveAll() { + for(Map.Entry e : popMap.entrySet()) { + try { + e.getValue().saveBlocks(e.getKey()); + Debug.info("Saved data for world " + e.getKey().getName()); + } catch(IOException ioException) { + ioException.printStackTrace(); + } + } + } + + public static synchronized void fixChunk(Chunk c) { + if(!(c.getWorld().getGenerator() instanceof TerraChunkGenerator)) throw new IllegalArgumentException(); + popMap.get(c.getWorld()).checkNeighbors(c.getX(), c.getZ(), c.getWorld()); + } + @Override public boolean isParallelCapable() { - return false; + return true; } @Override public boolean shouldGenerateCaves() { - return false; + return configPack.getTemplate().vanillaCaves(); } @Override public boolean shouldGenerateDecorations() { - return false; + return configPack.getTemplate().vanillaDecorations(); } @Override public boolean shouldGenerateMobs() { - return false; + return configPack.getTemplate().vanillaMobs(); } @Override public boolean shouldGenerateStructures() { - return false; + return configPack.getTemplate().vanillaStructures(); } @Override - public void generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData data) { + public void generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData chunk) { + TerraWorld tw = main.getWorld(world); + try(ProfileFuture ignore = tw.getProfiler().measure("TotalChunkGenTime")) { + ChunkInterpolator3 interp; + try(ProfileFuture ignored = tw.getProfiler().measure("ChunkBaseGenTime")) { + interp = new ChunkInterpolator3(world, x, z, tw.getGrid()); + if(needsLoad) load(world); // Load population data for world. + if(!tw.isSafe()) return; + int xOrig = (x << 4); + int zOrig = (z << 4); + com.dfsek.terra.api.gaea.biome.BiomeGrid grid = tw.getGrid(); + + ElevationInterpolator elevationInterpolator; + try(ProfileFuture ignored1 = tw.getProfiler().measure("ElevationTime")) { + elevationInterpolator = new ElevationInterpolator(x, z, tw.getGrid()); + } + + Sampler sampler = new Sampler(interp, elevationInterpolator); + + for(byte x = 0; x < 16; x++) { + for(byte z = 0; z < 16; z++) { + int paletteLevel = 0; + + int cx = xOrig + x; + int cz = zOrig + z; + + Biome b = grid.getBiome(xOrig + x, zOrig + z, GenerationPhase.PALETTE_APPLY); + BiomeTemplate c = ((UserDefinedBiome) b).getConfig(); + + int sea = c.getSeaLevel(); + Palette seaPalette = c.getOceanPalette(); + + boolean justSet = false; + BlockData data = null; + for(int y = world.getMaxHeight() - 1; y >= 0; y--) { + if(sampler.sample(x, y, z) > 0) { + justSet = true; + data = PaletteUtil.getPalette(x, y, z, c, sampler).get(paletteLevel, cx, cz); + chunk.setBlock(x, y, z, data); + if(paletteLevel == 0 && c.doSlabs() && y < 255) { + SlabUtil.prepareBlockPartFloor(data, chunk.getBlockData(x, y + 1, z), chunk, new Vector3(x, y + 1, z), c.getSlabPalettes(), + c.getStairPalettes(), c.getSlabThreshold(), sampler); + } + paletteLevel++; + } else if(y <= sea) { + chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, z + zOrig)); + if(justSet && c.doSlabs()) { + SlabUtil.prepareBlockPartCeiling(data, chunk.getBlockData(x, y, z), chunk, new Vector3(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); + } + justSet = false; + paletteLevel = 0; + } else { + if(justSet && c.doSlabs()) { + SlabUtil.prepareBlockPartCeiling(data, chunk.getBlockData(x, y, z), chunk, new Vector3(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); + } + justSet = false; + paletteLevel = 0; + } + } + } + } + } + try(ProfileFuture ignored = measure("BiomeApplyTime")) { + com.dfsek.terra.api.gaea.biome.BiomeGrid grid = getBiomeGrid(world); + int xOrig = (chunkX << 4); + int zOrig = (chunkZ << 4); + for(byte x = 0; x < 4; x++) { + for(byte z = 0; z < 4; z++) { + int cx = xOrig + (x << 2); + int cz = zOrig + (z << 2); + Biome b = grid.getBiome(cx, cz, GenerationPhase.PALETTE_APPLY); + biome.setBiome(x << 2, z << 2, b.getVanillaBiome()); + } + } + } + for(GenerationPopulator g : getGenerationPopulators(world)) { + g.populate(world, chunk, random, chunkX, chunkZ, interp); + } + } + + + return chunk; } @Override public List getDefaultPopulators(World world) { - return null; + return Collections.emptyList(); + } + + public void attachProfiler(WorldProfiler p) { + popMan.attachProfiler(p); + } + + private void load(org.bukkit.World w) { + try { + popMan.loadBlocks(w); + } catch(FileNotFoundException e) { + LangUtil.log("warning.no-population", Level.WARNING); + } catch(IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + popMap.put(w, popMan); + needsLoad = false; } } diff --git a/src/main/java/com/dfsek/terra/generation/Sampler.java b/src/main/java/com/dfsek/terra/generation/Sampler.java index 15b0079ad..3189e2272 100644 --- a/src/main/java/com/dfsek/terra/generation/Sampler.java +++ b/src/main/java/com/dfsek/terra/generation/Sampler.java @@ -1,13 +1,13 @@ package com.dfsek.terra.generation; -import com.dfsek.terra.api.gaea.math.ChunkInterpolator; +import com.dfsek.terra.api.gaea.math.ChunkInterpolator3; import net.jafama.FastMath; public class Sampler { - private final ChunkInterpolator interpolator; + private final ChunkInterpolator3 interpolator; private final ElevationInterpolator elevationInterpolator; - public Sampler(ChunkInterpolator interpolator, ElevationInterpolator elevationInterpolator) { + public Sampler(ChunkInterpolator3 interpolator, ElevationInterpolator elevationInterpolator) { this.interpolator = interpolator; this.elevationInterpolator = elevationInterpolator; } diff --git a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java deleted file mode 100644 index 909673760..000000000 --- a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ /dev/null @@ -1,212 +0,0 @@ -package com.dfsek.terra.generation; - -import com.dfsek.terra.Terra; -import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.gaea.generation.GaeaChunkGenerator; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.gaea.generation.GenerationPopulator; -import com.dfsek.terra.api.gaea.math.ChunkInterpolator; -import com.dfsek.terra.api.gaea.population.PopulationManager; -import com.dfsek.terra.api.gaea.profiler.ProfileFuture; -import com.dfsek.terra.api.gaea.profiler.WorldProfiler; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.population.CavePopulator; -import com.dfsek.terra.population.FloraPopulator; -import com.dfsek.terra.population.OrePopulator; -import com.dfsek.terra.population.StructurePopulator; -import com.dfsek.terra.population.TreePopulator; -import com.dfsek.terra.util.PaletteUtil; -import com.dfsek.terra.util.SlabUtil; -import org.bukkit.Chunk; -import org.bukkit.World; -import org.bukkit.block.data.BlockData; -import org.bukkit.generator.BlockPopulator; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.NotNull; - -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.logging.Level; - - -public class TerraChunkGenerator extends GaeaChunkGenerator { - private static final Map popMap = new HashMap<>(); - private final PopulationManager popMan; - private final ConfigPack configPack; - private boolean needsLoad = true; - private final Terra main; - - public ConfigPack getConfigPack() { - return configPack; - } - - - public TerraChunkGenerator(ConfigPack c, Terra main) { - super(ChunkInterpolator.InterpolationType.TRILINEAR); - popMan = new PopulationManager(main); - this.configPack = c; - this.main = main; - popMan.attach(new OrePopulator(main)); - popMan.attach(new TreePopulator(main)); - popMan.attach(new FloraPopulator(main)); - } - - public static synchronized void saveAll() { - for(Map.Entry e : popMap.entrySet()) { - try { - e.getValue().saveBlocks(e.getKey()); - Debug.info("Saved data for world " + e.getKey().getName()); - } catch(IOException ioException) { - ioException.printStackTrace(); - } - } - } - - public static synchronized void fixChunk(Chunk c) { - if(!(c.getWorld().getGenerator() instanceof TerraChunkGenerator)) throw new IllegalArgumentException(); - popMap.get(c.getWorld()).checkNeighbors(c.getX(), c.getZ(), c.getWorld()); - } - - @Override - public void attachProfiler(WorldProfiler p) { - super.attachProfiler(p); - popMan.attachProfiler(p); - } - - @Override - @SuppressWarnings("try") - public ChunkData generateBase(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, ChunkInterpolator interpolator) { - if(needsLoad) load(world); // Load population data for world. - ChunkData chunk = createChunkData(world); - TerraWorld tw = main.getWorld(world); - if(!tw.isSafe()) return chunk; - int xOrig = (chunkX << 4); - int zOrig = (chunkZ << 4); - com.dfsek.terra.api.gaea.biome.BiomeGrid grid = getBiomeGrid(world); - - ElevationInterpolator elevationInterpolator; - try(ProfileFuture ignore = tw.getProfiler().measure("ElevationTime")) { - elevationInterpolator = new ElevationInterpolator(chunkX, chunkZ, tw.getGrid()); - } - - Sampler sampler = new Sampler(interpolator, elevationInterpolator); - - for(byte x = 0; x < 16; x++) { - for(byte z = 0; z < 16; z++) { - int paletteLevel = 0; - - int cx = xOrig + x; - int cz = zOrig + z; - - Biome b = grid.getBiome(xOrig + x, zOrig + z, GenerationPhase.PALETTE_APPLY); - BiomeTemplate c = ((UserDefinedBiome) b).getConfig(); - - int sea = c.getSeaLevel(); - Palette seaPalette = c.getOceanPalette(); - - boolean justSet = false; - BlockData data = null; - for(int y = world.getMaxHeight() - 1; y >= 0; y--) { - if(sampler.sample(x, y, z) > 0) { - justSet = true; - data = PaletteUtil.getPalette(x, y, z, c, sampler).get(paletteLevel, cx, cz); - chunk.setBlock(x, y, z, data); - if(paletteLevel == 0 && c.doSlabs() && y < 255) { - SlabUtil.prepareBlockPartFloor(data, chunk.getBlockData(x, y + 1, z), chunk, new Vector(x, y + 1, z), c.getSlabPalettes(), - c.getStairPalettes(), c.getSlabThreshold(), sampler); - } - paletteLevel++; - } else if(y <= sea) { - chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, z + zOrig)); - if(justSet && c.doSlabs()) { - SlabUtil.prepareBlockPartCeiling(data, chunk.getBlockData(x, y, z), chunk, new Vector(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); - } - justSet = false; - paletteLevel = 0; - } else { - if(justSet && c.doSlabs()) { - SlabUtil.prepareBlockPartCeiling(data, chunk.getBlockData(x, y, z), chunk, new Vector(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); - } - justSet = false; - paletteLevel = 0; - } - } - } - } - return chunk; - } - - private void load(World w) { - try { - popMan.loadBlocks(w); - } catch(FileNotFoundException e) { - LangUtil.log("warning.no-population", Level.WARNING); - } catch(IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - popMap.put(w, popMan); - needsLoad = false; - } - - @Override - public int getNoiseOctaves(World world) { - return 1; - } - - @Override - public double getNoiseFrequency(World world) { - return 0.02; - } - - @Override - public List getGenerationPopulators(World world) { - return Collections.emptyList(); - } - - @Override - public com.dfsek.terra.api.gaea.biome.BiomeGrid getBiomeGrid(World world) { - return main.getWorld(world).getGrid(); - } - - @Override - public @NotNull List getDefaultPopulators(@NotNull World world) { - return Arrays.asList(new CavePopulator(main), new StructurePopulator(main), popMan); - } - - @Override - public boolean isParallelCapable() { - return true; - } - - @Override - public boolean shouldGenerateCaves() { - return configPack.getTemplate().vanillaCaves(); - } - - @Override - public boolean shouldGenerateDecorations() { - return configPack.getTemplate().vanillaDecorations(); - } - - @Override - public boolean shouldGenerateMobs() { - return configPack.getTemplate().vanillaMobs(); - } - - @Override - public boolean shouldGenerateStructures() { - return configPack.getTemplate().vanillaStructures(); - } -} diff --git a/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java b/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java index 55df1f574..dd23438f2 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java @@ -2,7 +2,6 @@ package com.dfsek.terra.structure.spawn; import com.dfsek.terra.Terra; import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.generation.TerraChunkGenerator; import org.bukkit.World; import java.util.Objects; diff --git a/src/main/java/com/dfsek/terra/util/SlabUtil.java b/src/main/java/com/dfsek/terra/util/SlabUtil.java index 74f08eca2..b9ca5f9ef 100644 --- a/src/main/java/com/dfsek/terra/util/SlabUtil.java +++ b/src/main/java/com/dfsek/terra/util/SlabUtil.java @@ -1,22 +1,22 @@ package com.dfsek.terra.util; import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.generic.generator.ChunkGenerator; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.block.data.Bisected; +import com.dfsek.terra.api.generic.world.block.data.Stairs; +import com.dfsek.terra.api.generic.world.block.data.Waterlogged; +import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.generation.Sampler; -import org.bukkit.Material; import org.bukkit.block.BlockFace; -import org.bukkit.block.data.Bisected; -import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Slab; -import org.bukkit.block.data.type.Stairs; -import org.bukkit.generator.ChunkGenerator; -import org.bukkit.util.Vector; import java.util.Map; public final class SlabUtil { - public static void prepareBlockPartFloor(BlockData down, BlockData orig, ChunkGenerator.ChunkData chunk, Vector block, Map> slabs, - Map> stairs, double thresh, Sampler sampler) { + public static void prepareBlockPartFloor(BlockData down, BlockData orig, ChunkGenerator.ChunkData chunk, Vector3 block, Map> slabs, + Map> stairs, double thresh, Sampler sampler) { if(sampler.sample(block.getBlockX(), block.getBlockY() - 0.4, block.getBlockZ()) > thresh) { if(stairs != null) { Palette stairPalette = stairs.get(down.getMaterial()); @@ -34,8 +34,8 @@ public final class SlabUtil { } } - public static void prepareBlockPartCeiling(BlockData up, BlockData orig, ChunkGenerator.ChunkData chunk, Vector block, Map> slabs, - Map> stairs, double thresh, Sampler sampler) { + public static void prepareBlockPartCeiling(BlockData up, BlockData orig, ChunkGenerator.ChunkData chunk, Vector3 block, Map> slabs, + Map> stairs, double thresh, Sampler sampler) { if(sampler.sample(block.getBlockX(), block.getBlockY() + 0.4, block.getBlockZ()) > thresh) { if(stairs != null) { Palette stairPalette = stairs.get(up.getMaterial()); @@ -56,7 +56,7 @@ public final class SlabUtil { } } - private static boolean placeStair(BlockData orig, ChunkGenerator.ChunkData chunk, Vector block, double thresh, Sampler sampler, Stairs stairNew) { + private static boolean placeStair(BlockData orig, ChunkGenerator.ChunkData chunk, Vector3 block, double thresh, Sampler sampler, Stairs stairNew) { if(sampler.sample(block.getBlockX() - 0.55, block.getBlockY(), block.getBlockZ()) > thresh) { stairNew.setFacing(BlockFace.WEST); } else if(sampler.sample(block.getBlockX(), block.getBlockY(), block.getBlockZ() - 0.55) > thresh) { From 31361286b55f4329325437b55b08c42329b77fa6 Mon Sep 17 00:00:00 2001 From: solonovamax Date: Thu, 10 Dec 2020 16:57:05 -0500 Subject: [PATCH 010/210] Slight change to how world edit is loaded + make locate commands like vanilla (#38) * make getWorldEdit() never null. Signed-off-by: solonovamax * Locate commands work like vanilla Signed-off-by: solonovamax --- build.gradle.kts | 1 + .../command/biome/BiomeLocateCommand.java | 23 +++++++++++----- .../command/structure/LocateCommand.java | 26 +++++++++++++------ .../terra/population/StructurePopulator.java | 3 ++- .../structure/WorldEditNotFoundException.java | 22 ++++++++++++++++ .../terra/util/structure/WorldEditUtil.java | 26 ++++++++++++++----- 6 files changed, 79 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/dfsek/terra/util/structure/WorldEditNotFoundException.java diff --git a/build.gradle.kts b/build.gradle.kts index b84e53fba..2638dc0fd 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -10,6 +10,7 @@ import java.nio.file.StandardCopyOption plugins { java maven + idea id("com.github.johnrengelman.shadow").version("6.1.0") } diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java b/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java index c5252d4e5..6b3a9a774 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java +++ b/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java @@ -5,12 +5,19 @@ import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.async.AsyncBiomeFinder; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.lang.LangUtil; +import com.dfsek.terra.generation.TerraChunkGenerator; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; -import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -25,6 +32,7 @@ public class BiomeLocateCommand extends WorldCommand { this.tp = teleport; } + @SuppressWarnings("DuplicatedCode") @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { String id = args[0]; @@ -44,11 +52,14 @@ public class BiomeLocateCommand extends WorldCommand { } Bukkit.getScheduler().runTaskAsynchronously(getMain(), new AsyncBiomeFinder(((Terra) getMain()).getWorld(world).getGrid(), b, sender.getLocation().clone().multiply((1D / ((Terra) getMain()).getTerraConfig().getBiomeSearchResolution())), 0, maxRadius, location -> { if(location != null) { - LangUtil.send("command.biome.biome-found", sender, String.valueOf(location.getBlockX()), String.valueOf(location.getBlockZ())); - if(tp) { - Location l = new Location(sender.getWorld(), location.getX(), sender.getLocation().getY(), location.getZ()); - Bukkit.getScheduler().runTask(getMain(), () -> sender.teleport(l)); - } + ComponentBuilder cm = new ComponentBuilder(String.format("The nearest %s is at ", id.toLowerCase())) + .append(String.format("[%d, ~, %d]", location.getBlockX(), location.getBlockZ()), ComponentBuilder.FormatRetention.NONE) + .event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("/minecraft:tp %s %d.0 %.2f %d.0", sender.getName(), location.getBlockX(), sender.getLocation().getY(), location.getBlockZ()))) + .event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new BaseComponent[] {new TextComponent("Click to teleport")})) + .color(ChatColor.GREEN) + .append(String.format(" (%.1f blocks away)", location.add(new Vector(0, sender.getLocation().getY(), 0)).distance(sender.getLocation().toVector())), ComponentBuilder.FormatRetention.NONE); + sender.spigot().sendMessage(cm.create()); + // LangUtil.send("command.biome.biome-found", sender, String.valueOf(location.getBlockX()), String.valueOf(location.getBlockZ())); } else LangUtil.send("command.biome.unable-to-locate", sender); }, (Terra) getMain())); return true; diff --git a/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java b/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java index 6624ce2e1..78dec4a0d 100644 --- a/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java @@ -5,12 +5,18 @@ import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.async.AsyncStructureFinder; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.generation.items.TerraStructure; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; -import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import java.util.Collections; @@ -26,10 +32,12 @@ public class LocateCommand extends WorldCommand { this.tp = tp; } + @SuppressWarnings("DuplicatedCode") @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { String id = args[0]; int maxRadius; + try { maxRadius = Integer.parseInt(args[1]); } catch(NumberFormatException e) { @@ -46,13 +54,15 @@ public class LocateCommand extends WorldCommand { Bukkit.getScheduler().runTaskAsynchronously(getMain(), new AsyncStructureFinder(((Terra) getMain()).getWorld(world).getGrid(), s, sender.getLocation(), 0, maxRadius, (location) -> { if(sender.isOnline()) { if(location != null) { - sender.sendMessage("Located structure at (" + location.getBlockX() + ", " + location.getBlockZ() + ")."); - if(tp) { - int finalX = location.getBlockX(); - int finalZ = location.getBlockZ(); - Bukkit.getScheduler().runTask(getMain(), () -> sender.teleport(new Location(sender.getWorld(), finalX, sender.getLocation().getY(), finalZ))); - } - } else sender.sendMessage("Unable to locate structure. "); + ComponentBuilder cm = new ComponentBuilder(String.format("The nearest %s is at ", id.toLowerCase())) + .append(String.format("[%d, ~, %d]", location.getBlockX(), location.getBlockZ()), ComponentBuilder.FormatRetention.NONE) + .event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("/minecraft:tp %s %d.0 %.2f %d.0", sender.getName(), location.getBlockX(), sender.getLocation().getY(), location.getBlockZ()))) + .event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new BaseComponent[] {new TextComponent("Click to teleport")})) + .color(ChatColor.GREEN) + .append(String.format(" (%.1f blocks away)", location.add(new Vector(0, sender.getLocation().getY(), 0)).distance(sender.getLocation().toVector())), ComponentBuilder.FormatRetention.NONE); + sender.spigot().sendMessage(cm.create()); + } else + sender.sendMessage("Unable to locate structure. "); } }, (Terra) getMain())); return true; diff --git a/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/src/main/java/com/dfsek/terra/population/StructurePopulator.java index 1d542dbfa..986031e65 100644 --- a/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -48,7 +48,8 @@ public class StructurePopulator extends BlockPopulator { structure: for(TerraStructure conf : config.getStructures()) { Location spawn = conf.getSpawn().getNearestSpawn(cx + 8, cz + 8, world.getSeed()).toLocation(world); - if(!((UserDefinedBiome) grid.getBiome(spawn)).getConfig().getStructures().contains(conf)) continue; + if(!((UserDefinedBiome) grid.getBiome(spawn)).getConfig().getStructures().contains(conf)) + continue; Random r2 = new FastRandom(spawn.hashCode()); Structure struc = conf.getStructures().get(r2); Rotation rotation = Rotation.fromDegrees(r2.nextInt(4) * 90); diff --git a/src/main/java/com/dfsek/terra/util/structure/WorldEditNotFoundException.java b/src/main/java/com/dfsek/terra/util/structure/WorldEditNotFoundException.java new file mode 100644 index 000000000..a5f08d649 --- /dev/null +++ b/src/main/java/com/dfsek/terra/util/structure/WorldEditNotFoundException.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.util.structure; + +public class WorldEditNotFoundException extends RuntimeException { + public WorldEditNotFoundException() { + } + + public WorldEditNotFoundException(String message) { + super(message); + } + + public WorldEditNotFoundException(String message, Throwable cause) { + super(message, cause); + } + + public WorldEditNotFoundException(Throwable cause) { + super(cause); + } + + public WorldEditNotFoundException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } +} diff --git a/src/main/java/com/dfsek/terra/util/structure/WorldEditUtil.java b/src/main/java/com/dfsek/terra/util/structure/WorldEditUtil.java index d4813ef22..a5518bcc7 100644 --- a/src/main/java/com/dfsek/terra/util/structure/WorldEditUtil.java +++ b/src/main/java/com/dfsek/terra/util/structure/WorldEditUtil.java @@ -10,13 +10,16 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; public final class WorldEditUtil { public static Location[] getSelectionLocations(Player sender) { - WorldEditPlugin we = WorldEditUtil.getWorldEdit(); - if(we == null) { + WorldEditPlugin we; + try { + we = WorldEditUtil.getWorldEdit(); + } catch(WorldEditNotFoundException e) { sender.sendMessage("WorldEdit is not installed! Please install WorldEdit before attempting to export structures."); - return null; + throw e; } Region selection; try { @@ -36,18 +39,27 @@ public final class WorldEditUtil { return new Location[] {l1, l2}; } + /** + * Gets an instance of the WorldEditPlugin class. + * + * @return The world edit plugin instance. + * @throws WorldEditNotFoundException Thrown when worldedit cannot be found. + */ + @NotNull public static WorldEditPlugin getWorldEdit() { Plugin p = Bukkit.getServer().getPluginManager().getPlugin("WorldEdit"); if(p instanceof WorldEditPlugin) return (WorldEditPlugin) p; Bukkit.getLogger().severe("[Terra] a command requiring WorldEdit was executed, but WorldEdit was not detected!"); - return null; + throw new WorldEditNotFoundException("Could not find World Edit!"); } public static Location[] getSelectionPositions(Player sender) { - WorldEditPlugin we = WorldEditUtil.getWorldEdit(); - if(we == null) { + WorldEditPlugin we; + try { + we = WorldEditUtil.getWorldEdit(); + } catch(WorldEditNotFoundException e) { sender.sendMessage("WorldEdit is not installed! Please install WorldEdit before attempting to export structures."); - return null; + throw e; } CuboidRegion selection; try { From 7a61a2548bf4e87ae7b08e5bbb78b0bb1036d1e8 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 15:23:43 -0700 Subject: [PATCH 011/210] Implement more stuff --- .../dfsek/terra/api/bukkit/BukkitChunk.java | 6 ++ .../dfsek/terra/api/bukkit/BukkitWorld.java | 41 +++++++++++ .../generator/BukkitChunkGenerator.java | 71 ++++++++++--------- .../BukkitChunkGeneratorWrapper.java | 58 +++++++++++++++ .../api/bukkit/generator/BukkitPopulator.java | 27 +++++++ .../java/com/dfsek/terra/api/gaea/Gaea.java | 5 +- .../api/gaea/population/ChunkCoordinate.java | 3 +- .../gaea/population/PopulationManager.java | 20 +++--- .../dfsek/terra/api/generic/TerraPlugin.java | 2 + .../api/generic/generator/BlockPopulator.java | 3 +- .../api/generic/generator/ChunkGenerator.java | 5 +- .../dfsek/terra/api/generic/world/Chunk.java | 2 + .../dfsek/terra/api/generic/world/World.java | 16 +++++ .../terra/generation/ChunkGeneratorImpl.java | 57 ++++++--------- 14 files changed, 232 insertions(+), 84 deletions(-) create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGeneratorWrapper.java create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitPopulator.java diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java index e96289eee..e7d0e64d8 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.bukkit; import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; public class BukkitChunk implements Chunk { private final org.bukkit.Chunk delegate; @@ -19,6 +20,11 @@ public class BukkitChunk implements Chunk { return delegate.getZ(); } + @Override + public World getWorld() { + return new BukkitWorld(delegate.getWorld()); + } + @Override public org.bukkit.Chunk getHandle() { return delegate; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java index 91b16ae6d..0af1b0652 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java @@ -1,7 +1,13 @@ package com.dfsek.terra.api.bukkit; +import com.dfsek.terra.api.bukkit.generator.BukkitChunkGenerator; +import com.dfsek.terra.api.generic.generator.ChunkGenerator; +import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; +import java.io.File; +import java.util.UUID; + public class BukkitWorld implements World { private final org.bukkit.World delegate; @@ -14,6 +20,41 @@ public class BukkitWorld implements World { return delegate.getSeed(); } + @Override + public int getMaxHeight() { + return delegate.getMaxHeight(); + } + + @Override + public ChunkGenerator getGenerator() { + return new BukkitChunkGenerator(delegate.getGenerator()); + } + + @Override + public String getName() { + return null; + } + + @Override + public UUID getUID() { + return null; + } + + @Override + public boolean isChunkGenerated(int x, int z) { + return false; + } + + @Override + public Chunk getChunkAt(int x, int z) { + return null; + } + + @Override + public File getWorldFolder() { + return null; + } + @Override public org.bukkit.World getHandle() { return delegate; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java index a2cf7d3ab..a79d4a5a7 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java @@ -2,57 +2,60 @@ package com.dfsek.terra.api.bukkit.generator; import com.dfsek.terra.api.bukkit.BukkitBiomeGrid; import com.dfsek.terra.api.bukkit.BukkitWorld; -import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; -import com.dfsek.terra.api.generic.world.block.BlockData; -import org.bukkit.World; +import com.dfsek.terra.api.generic.generator.BlockPopulator; +import com.dfsek.terra.api.generic.world.BiomeGrid; +import com.dfsek.terra.api.generic.world.World; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; +import java.util.List; import java.util.Random; +import java.util.stream.Collectors; -public class BukkitChunkGenerator extends ChunkGenerator { - private final com.dfsek.terra.api.generic.generator.ChunkGenerator delegate; +public class BukkitChunkGenerator implements com.dfsek.terra.api.generic.generator.ChunkGenerator { + private final ChunkGenerator delegate; - public BukkitChunkGenerator(com.dfsek.terra.api.generic.generator.ChunkGenerator delegate) { + public BukkitChunkGenerator(ChunkGenerator delegate) { this.delegate = delegate; } @Override - public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { - BukkitWorld bukkitWorld = new BukkitWorld(world); - BukkitChunkData data = new BukkitChunkData(createChunkData(world)); - delegate.generateChunkData(bukkitWorld, random, x, z, new BukkitBiomeGrid(biome), data); - return data.getHandle(); + public ChunkGenerator getHandle() { + return delegate; } - public static class BukkitChunkData implements com.dfsek.terra.api.generic.generator.ChunkGenerator.ChunkData { + @Override + public boolean isParallelCapable() { + return delegate.isParallelCapable(); + } - private final ChunkGenerator.ChunkData delegate; + @Override + public boolean shouldGenerateCaves() { + return delegate.shouldGenerateCaves(); + } - public BukkitChunkData(ChunkGenerator.ChunkData delegate) { - this.delegate = delegate; - } + @Override + public boolean shouldGenerateDecorations() { + return delegate.shouldGenerateDecorations(); + } - @Override - public ChunkGenerator.ChunkData getHandle() { - return delegate; - } + @Override + public boolean shouldGenerateMobs() { + return delegate.shouldGenerateMobs(); + } - @Override - public int getMaxHeight() { - return delegate.getMaxHeight(); - } + @Override + public boolean shouldGenerateStructures() { + return delegate.shouldGenerateStructures(); + } + @Override + public ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData data) { + return new BukkitChunkGeneratorWrapper.BukkitChunkData(delegate.generateChunkData(((BukkitWorld) world).getHandle(), random, x, z, ((BukkitBiomeGrid) biome).getHandle())); + } - @Override - public void setBlock(int x, int y, int z, @NotNull BlockData blockData) { - delegate.setBlock(x, y, z, ((BukkitBlockData) blockData).getHandle()); - } - - - @Override - public @NotNull BlockData getBlockData(int x, int y, int z) { - return new BukkitBlockData(delegate.getBlockData(x, y, z)); - } + @Override + public List getDefaultPopulators(World world) { + return delegate.getDefaultPopulators(((BukkitWorld) world).getHandle()).stream().map(BukkitPopulator::new).collect(Collectors.toList()); } } diff --git a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGeneratorWrapper.java b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGeneratorWrapper.java new file mode 100644 index 000000000..c7a527347 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -0,0 +1,58 @@ +package com.dfsek.terra.api.bukkit.generator; + +import com.dfsek.terra.api.bukkit.BukkitBiomeGrid; +import com.dfsek.terra.api.bukkit.BukkitWorld; +import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; +import com.dfsek.terra.api.generic.world.block.BlockData; +import org.bukkit.World; +import org.bukkit.generator.ChunkGenerator; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + +public class BukkitChunkGeneratorWrapper extends ChunkGenerator { + private final com.dfsek.terra.api.generic.generator.ChunkGenerator delegate; + + public BukkitChunkGeneratorWrapper(com.dfsek.terra.api.generic.generator.ChunkGenerator delegate) { + this.delegate = delegate; + } + + @Override + public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { + BukkitWorld bukkitWorld = new BukkitWorld(world); + BukkitChunkData data = new BukkitChunkData(createChunkData(world)); + delegate.generateChunkData(bukkitWorld, random, x, z, new BukkitBiomeGrid(biome), data); + return data.getHandle(); + } + + public static class BukkitChunkData implements com.dfsek.terra.api.generic.generator.ChunkGenerator.ChunkData { + + private final ChunkGenerator.ChunkData delegate; + + public BukkitChunkData(ChunkGenerator.ChunkData delegate) { + this.delegate = delegate; + } + + @Override + public ChunkGenerator.ChunkData getHandle() { + return delegate; + } + + @Override + public int getMaxHeight() { + return delegate.getMaxHeight(); + } + + + @Override + public void setBlock(int x, int y, int z, @NotNull BlockData blockData) { + delegate.setBlock(x, y, z, ((BukkitBlockData) blockData).getHandle()); + } + + + @Override + public @NotNull BlockData getBlockData(int x, int y, int z) { + return new BukkitBlockData(delegate.getBlockData(x, y, z)); + } + } +} diff --git a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitPopulator.java b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitPopulator.java new file mode 100644 index 000000000..85a218c1e --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitPopulator.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.api.bukkit.generator; + +import com.dfsek.terra.api.bukkit.BukkitChunk; +import com.dfsek.terra.api.bukkit.BukkitWorld; +import com.dfsek.terra.api.generic.generator.BlockPopulator; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; + +import java.util.Random; + +public class BukkitPopulator implements BlockPopulator { + private final org.bukkit.generator.BlockPopulator handle; + + public BukkitPopulator(org.bukkit.generator.BlockPopulator handle) { + this.handle = handle; + } + + @Override + public void populate(World world, Random random, Chunk chunk) { + handle.populate(((BukkitWorld) world).getHandle(), random, ((BukkitChunk) chunk).getHandle()); + } + + @Override + public org.bukkit.generator.BlockPopulator getHandle() { + return handle; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/Gaea.java b/src/main/java/com/dfsek/terra/api/gaea/Gaea.java index 50623d482..a8c38b374 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/Gaea.java +++ b/src/main/java/com/dfsek/terra/api/gaea/Gaea.java @@ -1,10 +1,11 @@ package com.dfsek.terra.api.gaea; -import org.bukkit.World; + +import com.dfsek.terra.api.generic.world.World; import java.io.File; -public class Gaea { +public class Gaea { private static boolean debug; public static File getGaeaFolder(World w) { diff --git a/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java b/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java index 35ad222c7..a5d2a34e7 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java +++ b/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.gaea.population; -import org.bukkit.Chunk; + +import com.dfsek.terra.api.generic.world.Chunk; import java.io.Serializable; import java.util.UUID; diff --git a/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java b/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java index d17f1a850..fbf3d78db 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java +++ b/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java @@ -6,10 +6,10 @@ import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.gaea.util.SerializationUtil; -import org.bukkit.Chunk; -import org.bukkit.World; -import org.bukkit.generator.BlockPopulator; -import org.bukkit.plugin.java.JavaPlugin; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.generator.BlockPopulator; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; import org.jetbrains.annotations.NotNull; import java.io.File; @@ -18,18 +18,18 @@ import java.util.HashSet; import java.util.List; import java.util.Random; -public class PopulationManager extends BlockPopulator { - private final List attachedPopulators = new GlueList<>(); +public class PopulationManager implements BlockPopulator { + private final List attachedPopulators = new GlueList<>(); private final HashSet needsPop = new HashSet<>(); - private final JavaPlugin main; + private final TerraPlugin main; private final Object popLock = new Object(); private WorldProfiler profiler; - public PopulationManager(JavaPlugin main) { + public PopulationManager(TerraPlugin main) { this.main = main; } - public void attach(GaeaBlockPopulator populator) { + public void attach(BlockPopulator populator) { this.attachedPopulators.add(populator); } @@ -85,7 +85,7 @@ public class PopulationManager extends BlockPopulator { long zRand = (random.nextLong() / 2L << 1L) + 1L; random.setSeed((long) x * xRand + (long) z * zRand ^ w.getSeed()); Chunk currentChunk = w.getChunkAt(x, z); - for(GaeaBlockPopulator r : attachedPopulators) { + for(BlockPopulator r : attachedPopulators) { r.populate(w, random, currentChunk); } needsPop.remove(c); diff --git a/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java b/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java index 8926d69ff..9cbcd02ef 100644 --- a/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java +++ b/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java @@ -4,4 +4,6 @@ import com.dfsek.terra.api.generic.world.WorldHandle; public interface TerraPlugin { WorldHandle getHandle(); + + boolean isEnabled(); } diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java b/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java index 196a9153a..15591155f 100644 --- a/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java +++ b/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java @@ -1,10 +1,11 @@ package com.dfsek.terra.api.generic.generator; +import com.dfsek.terra.api.generic.Handle; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import java.util.Random; -public interface BlockPopulator { +public interface BlockPopulator extends Handle { void populate(World world, Random random, Chunk chunk); } diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java index a7261ff68..f63ec12a3 100644 --- a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.generic.generator; +import com.dfsek.terra.api.generic.Handle; import com.dfsek.terra.api.generic.world.BiomeGrid; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.BlockData; @@ -8,7 +9,7 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Random; -public interface ChunkGenerator { +public interface ChunkGenerator extends Handle { boolean isParallelCapable(); boolean shouldGenerateCaves(); @@ -19,7 +20,7 @@ public interface ChunkGenerator { boolean shouldGenerateStructures(); - void generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData data); + ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData data); List getDefaultPopulators(World world); diff --git a/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java b/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java index e9ffcf814..1c9ed6b1e 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java @@ -6,4 +6,6 @@ public interface Chunk extends Handle { int getX(); int getZ(); + + World getWorld(); } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/World.java b/src/main/java/com/dfsek/terra/api/generic/world/World.java index 99b3f1242..e32bc7309 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/World.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/World.java @@ -1,9 +1,25 @@ package com.dfsek.terra.api.generic.world; import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.generic.generator.ChunkGenerator; + +import java.io.File; +import java.util.UUID; public interface World extends Handle { long getSeed(); int getMaxHeight(); + + ChunkGenerator getGenerator(); + + String getName(); + + UUID getUID(); + + boolean isChunkGenerated(int x, int z); + + Chunk getChunkAt(int x, int z); + + File getWorldFolder(); } diff --git a/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java b/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java index e3f23d7b7..a3cc4bee6 100644 --- a/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java +++ b/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java @@ -4,7 +4,6 @@ import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.gaea.generation.GenerationPopulator; import com.dfsek.terra.api.gaea.math.ChunkInterpolator3; import com.dfsek.terra.api.gaea.population.PopulationManager; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; @@ -13,6 +12,7 @@ import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.api.generic.generator.BlockPopulator; import com.dfsek.terra.api.generic.generator.ChunkGenerator; import com.dfsek.terra.api.generic.world.BiomeGrid; +import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Vector3; @@ -21,9 +21,6 @@ import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.population.FloraPopulator; -import com.dfsek.terra.population.OrePopulator; -import com.dfsek.terra.population.TreePopulator; import com.dfsek.terra.util.PaletteUtil; import com.dfsek.terra.util.SlabUtil; import org.jetbrains.annotations.NotNull; @@ -38,7 +35,7 @@ import java.util.Random; import java.util.logging.Level; public class ChunkGeneratorImpl implements ChunkGenerator { - private static final Map popMap = new HashMap<>(); + private static final Map popMap = new HashMap<>(); private final PopulationManager popMan; private final ConfigPack configPack; private final Terra main; @@ -48,13 +45,13 @@ public class ChunkGeneratorImpl implements ChunkGenerator { popMan = new PopulationManager(main); this.configPack = c; this.main = main; - popMan.attach(new OrePopulator(main)); - popMan.attach(new TreePopulator(main)); - popMan.attach(new FloraPopulator(main)); + //popMan.attach(new OrePopulator(main)); + //popMan.attach(new TreePopulator(main)); + //popMan.attach(new FloraPopulator(main)); } public static synchronized void saveAll() { - for(Map.Entry e : popMap.entrySet()) { + for(Map.Entry e : popMap.entrySet()) { try { e.getValue().saveBlocks(e.getKey()); Debug.info("Saved data for world " + e.getKey().getName()); @@ -65,7 +62,7 @@ public class ChunkGeneratorImpl implements ChunkGenerator { } public static synchronized void fixChunk(Chunk c) { - if(!(c.getWorld().getGenerator() instanceof TerraChunkGenerator)) throw new IllegalArgumentException(); + if(!(c.getWorld().getGenerator() instanceof ChunkGeneratorImpl)) throw new IllegalArgumentException(); popMap.get(c.getWorld()).checkNeighbors(c.getX(), c.getZ(), c.getWorld()); } @@ -95,22 +92,22 @@ public class ChunkGeneratorImpl implements ChunkGenerator { } @Override - public void generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData chunk) { + public ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome, ChunkData chunk) { TerraWorld tw = main.getWorld(world); + com.dfsek.terra.api.gaea.biome.BiomeGrid grid = tw.getGrid(); try(ProfileFuture ignore = tw.getProfiler().measure("TotalChunkGenTime")) { ChunkInterpolator3 interp; try(ProfileFuture ignored = tw.getProfiler().measure("ChunkBaseGenTime")) { - interp = new ChunkInterpolator3(world, x, z, tw.getGrid()); + interp = new ChunkInterpolator3(world, chunkX, chunkZ, tw.getGrid()); if(needsLoad) load(world); // Load population data for world. - if(!tw.isSafe()) return; - int xOrig = (x << 4); - int zOrig = (z << 4); - com.dfsek.terra.api.gaea.biome.BiomeGrid grid = tw.getGrid(); + if(!tw.isSafe()) return chunk; + int xOrig = (chunkX << 4); + int zOrig = (chunkZ << 4); ElevationInterpolator elevationInterpolator; try(ProfileFuture ignored1 = tw.getProfiler().measure("ElevationTime")) { - elevationInterpolator = new ElevationInterpolator(x, z, tw.getGrid()); + elevationInterpolator = new ElevationInterpolator(chunkX, chunkZ, tw.getGrid()); } Sampler sampler = new Sampler(interp, elevationInterpolator); @@ -158,25 +155,17 @@ public class ChunkGeneratorImpl implements ChunkGenerator { } } } - try(ProfileFuture ignored = measure("BiomeApplyTime")) { - com.dfsek.terra.api.gaea.biome.BiomeGrid grid = getBiomeGrid(world); - int xOrig = (chunkX << 4); - int zOrig = (chunkZ << 4); - for(byte x = 0; x < 4; x++) { - for(byte z = 0; z < 4; z++) { - int cx = xOrig + (x << 2); - int cz = zOrig + (z << 2); - Biome b = grid.getBiome(cx, cz, GenerationPhase.PALETTE_APPLY); - biome.setBiome(x << 2, z << 2, b.getVanillaBiome()); - } + int xOrig = (chunkX << 4); + int zOrig = (chunkZ << 4); + for(int x = 0; x < 4; x++) { + for(byte z = 0; z < 4; z++) { + int cx = xOrig + (x << 2); + int cz = zOrig + (z << 2); + Biome b = grid.getBiome(cx, cz, GenerationPhase.PALETTE_APPLY); + biome.setBiome(x << 2, z << 2, b.getVanillaBiome()); } } - for(GenerationPopulator g : getGenerationPopulators(world)) { - g.populate(world, chunk, random, chunkX, chunkZ, interp); - } } - - return chunk; } @@ -189,7 +178,7 @@ public class ChunkGeneratorImpl implements ChunkGenerator { popMan.attachProfiler(p); } - private void load(org.bukkit.World w) { + private void load(World w) { try { popMan.loadBlocks(w); } catch(FileNotFoundException e) { From 560fdf17fa9b71c90374b097bf71a20b98ced0d5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 18:13:54 -0700 Subject: [PATCH 012/210] Implement a whole bunch of stuff --- build.gradle.kts | 2 - .../java/com/dfsek/terra/TerraProfiler.java | 2 +- src/main/java/com/dfsek/terra/TerraWorld.java | 15 +- .../com/dfsek/terra/api/GenericLoaders.java | 68 ++++++ .../com/dfsek/terra/api/LoaderRegistrar.java | 7 + .../bukkit/TerraBukkitPlugin.java} | 92 ++------ .../generator/BukkitChunkGenerator.java | 37 +++- .../BukkitChunkGeneratorWrapper.java | 42 +--- .../terra/api/bukkit/world/BukkitBiome.java | 16 ++ .../com/dfsek/terra/api/gaea/GaeaPlugin.java | 2 - .../dfsek/terra/api/gaea/biome/BiomeGrid.java | 4 +- .../terra/api/gaea/command/WorldCommand.java | 5 +- .../gaea/generation/GaeaChunkGenerator.java | 85 -------- .../gaea/generation/GenerationPopulator.java | 10 - .../api/gaea/profiler/WorldProfiler.java | 8 +- .../com/dfsek/terra/api/gaea/tree/Tree.java | 3 +- .../dfsek/terra/api/gaea/tree/TreeType.java | 6 +- .../terra/api/gaea/world/carving/Carver.java | 12 +- .../terra/api/gaea/world/carving/Worm.java | 26 +-- .../dfsek/terra/api/generic/TerraPlugin.java | 11 +- .../api/generic/generator/ChunkGenerator.java | 2 +- .../generator/TerraChunkGenerator.java | 27 +++ .../dfsek/terra/api/generic/world/Biome.java | 6 + .../api/generic/world/vector/Location.java | 12 ++ .../api/generic/world/vector/Vector3.java | 204 +++++++++++++++++- .../dfsek/terra/async/AsyncBiomeFinder.java | 4 +- .../dfsek/terra/async/AsyncFeatureFinder.java | 6 +- .../terra/async/AsyncStructureFinder.java | 4 +- .../java/com/dfsek/terra/biome/BiomeZone.java | 2 +- .../terra/biome/grid/SingleBiomeGrid.java | 4 +- .../terra/biome/grid/UserDefinedGrid.java | 4 +- .../biome/grid/master/TerraBiomeGrid.java | 2 +- .../grid/master/TerraRadialBiomeGrid.java | 4 +- .../grid/master/TerraStandardBiomeGrid.java | 4 +- .../terra/biome/palette/PaletteHolder.java | 2 +- .../biome/palette/PaletteHolderBuilder.java | 6 +- .../com/dfsek/terra/carving/CarverCache.java | 12 +- .../terra/carving/UserDefinedCarver.java | 22 +- .../com/dfsek/terra/command/PacksCommand.java | 4 +- .../dfsek/terra/command/ReloadCommand.java | 10 +- .../terra/command/biome/BiomeCommand.java | 4 +- .../terra/command/biome/BiomeInfoCommand.java | 6 +- .../command/biome/BiomeLocateCommand.java | 10 +- .../terra/command/image/RenderCommand.java | 4 +- .../command/image/gui/RawGUICommand.java | 8 +- .../command/image/gui/StepGUICommand.java | 8 +- .../terra/command/profile/QueryCommand.java | 4 +- .../terra/command/profile/ResetCommand.java | 4 +- .../terra/command/profile/StartCommand.java | 4 +- .../terra/command/profile/StopCommand.java | 4 +- .../command/structure/LocateCommand.java | 10 +- .../terra/command/structure/SpawnCommand.java | 8 +- .../structure/load/LoadFullCommand.java | 6 +- .../structure/load/LoadRawCommand.java | 4 +- .../dfsek/terra/config/base/ConfigPack.java | 18 +- .../dfsek/terra/config/base/PluginConfig.java | 4 +- .../builder/biomegrid/BiomeGridBuilder.java | 2 +- .../builder/biomegrid/SingleGridBuilder.java | 2 +- .../biomegrid/UserDefinedGridBuilder.java | 2 +- .../terra/config/factories/BiomeFactory.java | 4 +- .../config/factories/BiomeGridFactory.java | 4 +- .../terra/config/factories/CarverFactory.java | 4 +- .../terra/config/factories/FloraFactory.java | 4 +- .../terra/config/factories/OreFactory.java | 4 +- .../config/factories/PaletteFactory.java | 4 +- .../config/factories/StructureFactory.java | 4 +- .../terra/config/factories/TerraFactory.java | 4 +- .../terra/config/factories/TreeFactory.java | 4 +- .../com/dfsek/terra/config/lang/LangUtil.java | 4 +- .../loaders/config/TreeLayerLoader.java | 10 +- .../terra/config/templates/BiomeTemplate.java | 17 +- .../com/dfsek/terra/debug/gui/DebugFrame.java | 6 +- .../com/dfsek/terra/debug/gui/DebugGUI.java | 6 +- ...atorImpl.java => TerraChunkGenerator.java} | 29 ++- .../generation/config/WorldGenerator.java | 15 +- .../generation/items/flora/TerraFlora.java | 6 +- .../items/ores/DeformedSphereOre.java | 4 +- .../terra/generation/items/ores/Ore.java | 6 +- .../generation/items/ores/VanillaOre.java | 4 +- .../generation/items/tree/TerraTree.java | 8 +- .../generation/items/tree/TreeLayer.java | 9 +- .../com/dfsek/terra/image/ImageLoader.java | 10 +- .../terra/image/WorldImageGenerator.java | 8 +- .../dfsek/terra/listeners/EventListener.java | 6 +- .../dfsek/terra/listeners/SpigotListener.java | 6 +- .../dfsek/terra/population/CavePopulator.java | 6 +- .../terra/population/FloraPopulator.java | 6 +- .../dfsek/terra/population/OrePopulator.java | 6 +- .../terra/population/StructurePopulator.java | 6 +- .../dfsek/terra/population/TreePopulator.java | 6 +- .../dfsek/terra/registry/ConfigRegistry.java | 8 +- .../com/dfsek/terra/structure/Structure.java | 8 +- .../structure/StructureSpawnRequirement.java | 12 +- .../dfsek/terra/structure/spawn/AirSpawn.java | 4 +- .../terra/structure/spawn/LandSpawn.java | 4 +- .../terra/structure/spawn/OceanSpawn.java | 4 +- .../terra/structure/spawn/Requirement.java | 6 +- .../com/dfsek/terra/util/PaletteUtil.java | 9 +- src/main/resources/plugin.yml | 2 +- 99 files changed, 673 insertions(+), 510 deletions(-) create mode 100644 src/main/java/com/dfsek/terra/api/GenericLoaders.java create mode 100644 src/main/java/com/dfsek/terra/api/LoaderRegistrar.java rename src/main/java/com/dfsek/terra/{Terra.java => api/bukkit/TerraBukkitPlugin.java} (57%) create mode 100644 src/main/java/com/dfsek/terra/api/bukkit/world/BukkitBiome.java delete mode 100644 src/main/java/com/dfsek/terra/api/gaea/generation/GaeaChunkGenerator.java delete mode 100644 src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPopulator.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/Biome.java rename src/main/java/com/dfsek/terra/generation/{ChunkGeneratorImpl.java => TerraChunkGenerator.java} (90%) diff --git a/build.gradle.kts b/build.gradle.kts index 2638dc0fd..ed12e012e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -34,7 +34,6 @@ version = versionObj dependencies { implementation("org.apache.commons:commons-rng-core:1.3") implementation("net.jafama:jafama:2.3.2") - implementation("co.aikar:taskchain-bukkit:3.7.2") compileOnly("org.jetbrains:annotations:20.1.0") @@ -103,7 +102,6 @@ tasks.named("shadowJar") { relocate("net.jafama", "com.dfsek.terra.lib.jafama") relocate("com.dfsek.tectonic", "com.dfsek.terra.lib.tectonic") relocate("net.jafama", "com.dfsek.terra.lib.jafama") - relocate("co.aikar.taskchain", "com.dfsek.terra.lib.taskchain") minimize() } diff --git a/src/main/java/com/dfsek/terra/TerraProfiler.java b/src/main/java/com/dfsek/terra/TerraProfiler.java index 34a17cccd..127968132 100644 --- a/src/main/java/com/dfsek/terra/TerraProfiler.java +++ b/src/main/java/com/dfsek/terra/TerraProfiler.java @@ -3,7 +3,7 @@ package com.dfsek.terra; import com.dfsek.terra.api.gaea.profiler.DataType; import com.dfsek.terra.api.gaea.profiler.Measurement; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; -import org.bukkit.World; +import com.dfsek.terra.api.generic.world.World; public class TerraProfiler extends WorldProfiler { public TerraProfiler(World w) { diff --git a/src/main/java/com/dfsek/terra/TerraWorld.java b/src/main/java/com/dfsek/terra/TerraWorld.java index 1e1046ae0..50ca0751e 100644 --- a/src/main/java/com/dfsek/terra/TerraWorld.java +++ b/src/main/java/com/dfsek/terra/TerraWorld.java @@ -1,6 +1,9 @@ package com.dfsek.terra; import com.dfsek.terra.api.gaea.biome.BiomeGrid; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.biome.grid.master.TerraRadialBiomeGrid; @@ -9,8 +12,6 @@ import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.config.builder.biomegrid.BiomeGridBuilder; import com.dfsek.terra.debug.Debug; -import org.bukkit.Bukkit; -import org.bukkit.World; public class TerraWorld { private final TerraBiomeGrid grid; @@ -20,7 +21,7 @@ public class TerraWorld { private final TerraProfiler profiler; - public TerraWorld(World w, ConfigPack c) { + public TerraWorld(World w, ConfigPack c, TerraPlugin main) { safe = true; config = c; profiler = new TerraProfiler(w); @@ -39,10 +40,10 @@ public class TerraWorld { } catch(NullPointerException e) { safe = false; Debug.stack(e); - Bukkit.getLogger().severe("No such BiomeGrid " + partName); - Bukkit.getLogger().severe("Please check configuration files for errors. Configuration errors will have been reported during initialization."); - Bukkit.getLogger().severe("ONLY report this to Terra if you are SURE your config is error-free."); - Bukkit.getLogger().severe("Terrain will NOT generate properly at this point. Correct your config before using your server!"); + main.getLogger().severe("No such BiomeGrid " + partName); + main.getLogger().severe("Please check configuration files for errors. Configuration errors will have been reported during initialization."); + main.getLogger().severe("ONLY report this to Terra if you are SURE your config is error-free."); + main.getLogger().severe("Terrain will NOT generate properly at this point. Correct your config before using your server!"); } } zone = new BiomeZone(w, c, definedGrids); diff --git a/src/main/java/com/dfsek/terra/api/GenericLoaders.java b/src/main/java/com/dfsek/terra/api/GenericLoaders.java new file mode 100644 index 000000000..70c57408c --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/GenericLoaders.java @@ -0,0 +1,68 @@ +package com.dfsek.terra.api; + +import com.dfsek.tectonic.loading.TypeRegistry; +import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import com.dfsek.terra.biome.palette.PaletteHolder; +import com.dfsek.terra.biome.palette.PaletteLayer; +import com.dfsek.terra.carving.CarverPalette; +import com.dfsek.terra.config.loaders.ImageLoaderLoader; +import com.dfsek.terra.config.loaders.MaterialSetLoader; +import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; +import com.dfsek.terra.config.loaders.RangeLoader; +import com.dfsek.terra.config.loaders.config.FloraLayerLoader; +import com.dfsek.terra.config.loaders.config.GridSpawnLoader; +import com.dfsek.terra.config.loaders.config.NoiseBuilderLoader; +import com.dfsek.terra.config.loaders.config.OreConfigLoader; +import com.dfsek.terra.config.loaders.config.OreHolderLoader; +import com.dfsek.terra.config.loaders.config.StructureFeatureLoader; +import com.dfsek.terra.config.loaders.config.TreeLayerLoader; +import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader; +import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader; +import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader; +import com.dfsek.terra.generation.config.NoiseBuilder; +import com.dfsek.terra.generation.items.flora.FloraLayer; +import com.dfsek.terra.generation.items.flora.TerraFlora; +import com.dfsek.terra.generation.items.ores.Ore; +import com.dfsek.terra.generation.items.ores.OreConfig; +import com.dfsek.terra.generation.items.ores.OreHolder; +import com.dfsek.terra.generation.items.tree.TreeLayer; +import com.dfsek.terra.image.ImageLoader; +import com.dfsek.terra.procgen.GridSpawn; +import com.dfsek.terra.structure.features.Feature; +import com.dfsek.terra.util.MaterialSet; +import com.dfsek.terra.util.StructureTypeEnum; + +public class GenericLoaders implements LoaderRegistrar { + private final TerraPlugin main; + + public GenericLoaders(TerraPlugin main) { + this.main = main; + } + + @Override + public void register(TypeRegistry registry) { + registry.registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()) + .registerLoader(Range.class, new RangeLoader()) + .registerLoader(CarverPalette.class, new CarverPaletteLoader()) + .registerLoader(GridSpawn.class, new GridSpawnLoader()) + .registerLoader(PaletteHolder.class, new PaletteHolderLoader()) + .registerLoader(PaletteLayer.class, new PaletteLayerLoader()) + .registerLoader(FloraLayer.class, new FloraLayerLoader()) + .registerLoader(Ore.Type.class, (t, o, l) -> Ore.Type.valueOf((String) o)) + .registerLoader(OreConfig.class, new OreConfigLoader()) + .registerLoader(NoiseBuilder.class, new NoiseBuilderLoader()) + .registerLoader(TreeLayer.class, new TreeLayerLoader(main)) + .registerLoader(MaterialSet.class, new MaterialSetLoader()) + .registerLoader(OreHolder.class, new OreHolderLoader()) + .registerLoader(Feature.class, new StructureFeatureLoader()) + .registerLoader(ImageLoader.class, new ImageLoaderLoader()) + .registerLoader(TerraBiomeGrid.Type.class, (t, o, l) -> TerraBiomeGrid.Type.valueOf((String) o)) + .registerLoader(StructureTypeEnum.class, (t, o, l) -> StructureTypeEnum.valueOf((String) o)) + .registerLoader(ImageLoader.Channel.class, (t, o, l) -> ImageLoader.Channel.valueOf((String) o)) + .registerLoader(ImageLoader.Align.class, (t, o, l) -> ImageLoader.Align.valueOf((String) o)) + .registerLoader(TerraFlora.Search.class, (t, o, l) -> TerraFlora.Search.valueOf((String) o)); + } +} diff --git a/src/main/java/com/dfsek/terra/api/LoaderRegistrar.java b/src/main/java/com/dfsek/terra/api/LoaderRegistrar.java new file mode 100644 index 000000000..96308deb0 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/LoaderRegistrar.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.api; + +import com.dfsek.tectonic.loading.TypeRegistry; + +public interface LoaderRegistrar { + void register(TypeRegistry registry); +} diff --git a/src/main/java/com/dfsek/terra/Terra.java b/src/main/java/com/dfsek/terra/api/bukkit/TerraBukkitPlugin.java similarity index 57% rename from src/main/java/com/dfsek/terra/Terra.java rename to src/main/java/com/dfsek/terra/api/bukkit/TerraBukkitPlugin.java index 459bf8f1f..9bd692ca0 100644 --- a/src/main/java/com/dfsek/terra/Terra.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/TerraBukkitPlugin.java @@ -1,58 +1,27 @@ -package com.dfsek.terra; +package com.dfsek.terra.api.bukkit; import com.dfsek.tectonic.loading.TypeRegistry; -import com.dfsek.terra.api.bukkit.BukkitWorldHandle; +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.bukkit.generator.BukkitChunkGeneratorWrapper; import com.dfsek.terra.api.gaea.GaeaPlugin; -import com.dfsek.terra.api.gaea.generation.GaeaChunkGenerator; import com.dfsek.terra.api.gaea.lang.Language; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import com.dfsek.terra.biome.palette.PaletteHolder; -import com.dfsek.terra.biome.palette.PaletteLayer; -import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.command.TerraCommand; import com.dfsek.terra.command.structure.LocateCommand; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.PluginConfig; import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.config.loaders.ImageLoaderLoader; -import com.dfsek.terra.config.loaders.MaterialSetLoader; -import com.dfsek.terra.config.loaders.ProbabilityCollectionLoader; -import com.dfsek.terra.config.loaders.RangeLoader; -import com.dfsek.terra.config.loaders.config.FloraLayerLoader; -import com.dfsek.terra.config.loaders.config.GridSpawnLoader; -import com.dfsek.terra.config.loaders.config.NoiseBuilderLoader; -import com.dfsek.terra.config.loaders.config.OreConfigLoader; -import com.dfsek.terra.config.loaders.config.OreHolderLoader; -import com.dfsek.terra.config.loaders.config.StructureFeatureLoader; -import com.dfsek.terra.config.loaders.config.TreeLayerLoader; -import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader; -import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader; -import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader; import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.generation.config.NoiseBuilder; -import com.dfsek.terra.generation.items.flora.FloraLayer; -import com.dfsek.terra.generation.items.flora.TerraFlora; -import com.dfsek.terra.generation.items.ores.Ore; -import com.dfsek.terra.generation.items.ores.OreConfig; -import com.dfsek.terra.generation.items.ores.OreHolder; -import com.dfsek.terra.generation.items.tree.TreeLayer; -import com.dfsek.terra.image.ImageLoader; +import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.listeners.EventListener; import com.dfsek.terra.listeners.SpigotListener; -import com.dfsek.terra.procgen.GridSpawn; import com.dfsek.terra.registry.ConfigRegistry; -import com.dfsek.terra.structure.features.Feature; -import com.dfsek.terra.util.MaterialSet; import com.dfsek.terra.util.PaperUtil; -import com.dfsek.terra.util.StructureTypeEnum; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.data.BlockData; import org.bukkit.command.PluginCommand; @@ -66,7 +35,7 @@ import java.util.Map; import java.util.Objects; -public class Terra extends GaeaPlugin implements TerraPlugin { +public class TerraBukkitPlugin extends GaeaPlugin implements TerraPlugin { private final Map generatorMap = new HashMap<>(); private final Map worldMap = new HashMap<>(); private final Map worlds = new HashMap<>(); @@ -78,7 +47,7 @@ public class Terra extends GaeaPlugin implements TerraPlugin { Map newMap = new HashMap<>(); worldMap.forEach((world, tw) -> { String packID = tw.getConfig().getTemplate().getID(); - newMap.put(world, new TerraWorld(world, registry.get(packID))); + newMap.put(world, new TerraWorld(world, registry.get(packID), this)); }); worldMap.clear(); worldMap.putAll(newMap); @@ -136,11 +105,11 @@ public class Terra extends GaeaPlugin implements TerraPlugin { @Override public @Nullable ChunkGenerator getDefaultWorldGenerator(@NotNull String worldName, @Nullable String id) { - return generatorMap.computeIfAbsent(worldName, name -> { + return new BukkitChunkGeneratorWrapper(generatorMap.computeIfAbsent(worldName, name -> { if(!registry.contains(id)) throw new IllegalArgumentException("No such config pack \"" + id + "\""); worlds.put(worldName, registry.get(id)); return new TerraChunkGenerator(registry.get(id), this); - }); + })); } @Override @@ -148,43 +117,12 @@ public class Terra extends GaeaPlugin implements TerraPlugin { return config.isDebug(); } - @Override - public Class getGeneratorClass() { - return TerraChunkGenerator.class; - } @Override public Language getLanguage() { return LangUtil.getLanguage(); } - public void registerAllLoaders(TypeRegistry registry) { - registry.registerLoader(ProbabilityCollection.class, new ProbabilityCollectionLoader()) - .registerLoader(Range.class, new RangeLoader()) - .registerLoader(CarverPalette.class, new CarverPaletteLoader()) - .registerLoader(GridSpawn.class, new GridSpawnLoader()) - .registerLoader(PaletteHolder.class, new PaletteHolderLoader()) - .registerLoader(PaletteLayer.class, new PaletteLayerLoader()) - .registerLoader(Biome.class, (t, o, l) -> Biome.valueOf((String) o)) - .registerLoader(BlockData.class, (t, o, l) -> Bukkit.createBlockData((String) o)) - .registerLoader(Material.class, (t, o, l) -> Material.matchMaterial((String) o)) - .registerLoader(FloraLayer.class, new FloraLayerLoader()) - .registerLoader(Ore.Type.class, (t, o, l) -> Ore.Type.valueOf((String) o)) - .registerLoader(OreConfig.class, new OreConfigLoader()) - .registerLoader(NoiseBuilder.class, new NoiseBuilderLoader()) - .registerLoader(TreeLayer.class, new TreeLayerLoader(this)) - .registerLoader(MaterialSet.class, new MaterialSetLoader()) - .registerLoader(OreHolder.class, new OreHolderLoader()) - .registerLoader(Feature.class, new StructureFeatureLoader()) - .registerLoader(ImageLoader.class, new ImageLoaderLoader()) - .registerLoader(EntityType.class, (t, o, l) -> EntityType.valueOf((String) o)) - .registerLoader(TerraBiomeGrid.Type.class, (t, o, l) -> TerraBiomeGrid.Type.valueOf((String) o)) - .registerLoader(StructureTypeEnum.class, (t, o, l) -> StructureTypeEnum.valueOf((String) o)) - .registerLoader(ImageLoader.Channel.class, (t, o, l) -> ImageLoader.Channel.valueOf((String) o)) - .registerLoader(ImageLoader.Align.class, (t, o, l) -> ImageLoader.Align.valueOf((String) o)) - .registerLoader(TerraFlora.Search.class, (t, o, l) -> TerraFlora.Search.valueOf((String) o)); - } - public ConfigRegistry getRegistry() { return registry; } @@ -193,9 +131,9 @@ public class Terra extends GaeaPlugin implements TerraPlugin { if(!(w.getGenerator() instanceof TerraChunkGenerator)) throw new IllegalArgumentException("Not a Terra world!"); if(!worlds.containsKey(w.getName())) { getLogger().warning("Unexpected world load detected: \"" + w.getName() + "\""); - return new TerraWorld(w, ((TerraChunkGenerator) w.getGenerator()).getConfigPack()); + return new TerraWorld(w, ((TerraChunkGenerator) w.getGenerator()).getConfigPack(), this); } - return worldMap.computeIfAbsent(w, world -> new TerraWorld(w, worlds.get(w.getName()))); + return worldMap.computeIfAbsent(w, world -> new TerraWorld(w, worlds.get(w.getName()), this)); } @NotNull @@ -207,4 +145,12 @@ public class Terra extends GaeaPlugin implements TerraPlugin { public WorldHandle getHandle() { return handle; } + + @Override + public void register(TypeRegistry registry) { + registry.registerLoader(Biome.class, (t, o, l) -> Biome.valueOf((String) o)) + .registerLoader(BlockData.class, (t, o, l) -> Bukkit.createBlockData((String) o)) + .registerLoader(Material.class, (t, o, l) -> Material.matchMaterial((String) o)) + .registerLoader(EntityType.class, (t, o, l) -> EntityType.valueOf((String) o)); + } } diff --git a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java index a79d4a5a7..8e6e847d9 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java @@ -2,9 +2,11 @@ package com.dfsek.terra.api.bukkit.generator; import com.dfsek.terra.api.bukkit.BukkitBiomeGrid; import com.dfsek.terra.api.bukkit.BukkitWorld; +import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.api.generic.generator.BlockPopulator; import com.dfsek.terra.api.generic.world.BiomeGrid; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.BlockData; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; @@ -50,12 +52,43 @@ public class BukkitChunkGenerator implements com.dfsek.terra.api.generic.generat } @Override - public ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData data) { - return new BukkitChunkGeneratorWrapper.BukkitChunkData(delegate.generateChunkData(((BukkitWorld) world).getHandle(), random, x, z, ((BukkitBiomeGrid) biome).getHandle())); + public ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { + return new BukkitChunkData(delegate.generateChunkData(((BukkitWorld) world).getHandle(), random, x, z, ((BukkitBiomeGrid) biome).getHandle())); } @Override public List getDefaultPopulators(World world) { return delegate.getDefaultPopulators(((BukkitWorld) world).getHandle()).stream().map(BukkitPopulator::new).collect(Collectors.toList()); } + + public static class BukkitChunkData implements ChunkData { + + private final ChunkGenerator.ChunkData delegate; + + public BukkitChunkData(ChunkGenerator.ChunkData delegate) { + this.delegate = delegate; + } + + @Override + public ChunkGenerator.ChunkData getHandle() { + return delegate; + } + + @Override + public int getMaxHeight() { + return delegate.getMaxHeight(); + } + + + @Override + public void setBlock(int x, int y, int z, @NotNull BlockData blockData) { + delegate.setBlock(x, y, z, ((BukkitBlockData) blockData).getHandle()); + } + + + @Override + public @NotNull BlockData getBlockData(int x, int y, int z) { + return new BukkitBlockData(delegate.getBlockData(x, y, z)); + } + } } diff --git a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGeneratorWrapper.java b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGeneratorWrapper.java index c7a527347..2574cf96d 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -2,8 +2,7 @@ package com.dfsek.terra.api.bukkit.generator; import com.dfsek.terra.api.bukkit.BukkitBiomeGrid; import com.dfsek.terra.api.bukkit.BukkitWorld; -import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; import org.bukkit.World; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; @@ -11,48 +10,17 @@ import org.jetbrains.annotations.NotNull; import java.util.Random; public class BukkitChunkGeneratorWrapper extends ChunkGenerator { - private final com.dfsek.terra.api.generic.generator.ChunkGenerator delegate; + private final TerraChunkGenerator delegate; - public BukkitChunkGeneratorWrapper(com.dfsek.terra.api.generic.generator.ChunkGenerator delegate) { + public BukkitChunkGeneratorWrapper(TerraChunkGenerator delegate) { this.delegate = delegate; } @Override public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { BukkitWorld bukkitWorld = new BukkitWorld(world); - BukkitChunkData data = new BukkitChunkData(createChunkData(world)); - delegate.generateChunkData(bukkitWorld, random, x, z, new BukkitBiomeGrid(biome), data); + BukkitChunkGenerator.BukkitChunkData data = new BukkitChunkGenerator.BukkitChunkData(createChunkData(world)); + delegate.generateChunkData(bukkitWorld, random, x, z, new BukkitBiomeGrid(biome), new BukkitChunkGenerator.BukkitChunkData(createChunkData(bukkitWorld.getHandle()))); return data.getHandle(); } - - public static class BukkitChunkData implements com.dfsek.terra.api.generic.generator.ChunkGenerator.ChunkData { - - private final ChunkGenerator.ChunkData delegate; - - public BukkitChunkData(ChunkGenerator.ChunkData delegate) { - this.delegate = delegate; - } - - @Override - public ChunkGenerator.ChunkData getHandle() { - return delegate; - } - - @Override - public int getMaxHeight() { - return delegate.getMaxHeight(); - } - - - @Override - public void setBlock(int x, int y, int z, @NotNull BlockData blockData) { - delegate.setBlock(x, y, z, ((BukkitBlockData) blockData).getHandle()); - } - - - @Override - public @NotNull BlockData getBlockData(int x, int y, int z) { - return new BukkitBlockData(delegate.getBlockData(x, y, z)); - } - } } diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/BukkitBiome.java b/src/main/java/com/dfsek/terra/api/bukkit/world/BukkitBiome.java new file mode 100644 index 000000000..e7b44fb0e --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/bukkit/world/BukkitBiome.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.api.bukkit.world; + +import com.dfsek.terra.api.generic.world.Biome; + +public class BukkitBiome implements Biome { + private final org.bukkit.block.Biome biome; + + public BukkitBiome(org.bukkit.block.Biome biome) { + this.biome = biome; + } + + @Override + public org.bukkit.block.Biome getHandle() { + return biome; + } +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/GaeaPlugin.java b/src/main/java/com/dfsek/terra/api/gaea/GaeaPlugin.java index f835ac2ca..69db4158c 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/GaeaPlugin.java +++ b/src/main/java/com/dfsek/terra/api/gaea/GaeaPlugin.java @@ -1,11 +1,9 @@ package com.dfsek.terra.api.gaea; -import com.dfsek.terra.api.gaea.generation.GaeaChunkGenerator; import com.dfsek.terra.api.gaea.lang.Language; import org.bukkit.plugin.java.JavaPlugin; public abstract class GaeaPlugin extends JavaPlugin { public abstract boolean isDebug(); - public abstract Class getGeneratorClass(); public abstract Language getLanguage(); } diff --git a/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java b/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java index f166570ab..ef106fde0 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java +++ b/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java @@ -2,8 +2,8 @@ package com.dfsek.terra.api.gaea.biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import org.bukkit.Location; -import org.bukkit.World; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.vector.Location; public abstract class BiomeGrid { private final FastNoiseLite noiseX; diff --git a/src/main/java/com/dfsek/terra/api/gaea/command/WorldCommand.java b/src/main/java/com/dfsek/terra/api/gaea/command/WorldCommand.java index 2d3548c76..08a5aa5b3 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/command/WorldCommand.java +++ b/src/main/java/com/dfsek/terra/api/gaea/command/WorldCommand.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.gaea.command; -import com.dfsek.terra.api.gaea.generation.GaeaChunkGenerator; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.entity.Player; +import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; /** @@ -28,8 +28,7 @@ public abstract class WorldCommand extends PlayerCommand { */ @Override public final boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - Class clazz = getMain().getGeneratorClass(); - if(clazz.isInstance(sender.getWorld().getGenerator())) { + if(sender.getWorld().getGenerator() instanceof ChunkGenerator) { // TODO: implementation return execute(sender, command, label, args, sender.getWorld()); } else { getMain().getLanguage().send("command.world", sender); diff --git a/src/main/java/com/dfsek/terra/api/gaea/generation/GaeaChunkGenerator.java b/src/main/java/com/dfsek/terra/api/gaea/generation/GaeaChunkGenerator.java deleted file mode 100644 index dee2b3026..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/generation/GaeaChunkGenerator.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.dfsek.terra.api.gaea.generation; - -import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.gaea.profiler.ProfileFuture; -import com.dfsek.terra.api.gaea.profiler.WorldProfiler; -import org.bukkit.World; -import org.bukkit.generator.ChunkGenerator; -import org.jetbrains.annotations.NotNull; - -import java.util.List; -import java.util.Random; - -public abstract class GaeaChunkGenerator extends ChunkGenerator { - private final ChunkInterpolator.InterpolationType interpolationType; - private FastNoiseLite gen; - private WorldProfiler profiler; - - public GaeaChunkGenerator(ChunkInterpolator.InterpolationType type) { - interpolationType = type; - } - - @Override - public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome) { - try(ProfileFuture ignore = measure("TotalChunkGenTime")) { - if(gen == null) { - gen = new FastNoiseLite((int) world.getSeed()); - gen.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); - gen.setFractalType(FastNoiseLite.FractalType.FBm); - gen.setFractalOctaves(getNoiseOctaves(world)); - gen.setFrequency(getNoiseFrequency(world)); - } - ChunkData chunk; - ChunkInterpolator interp; - try(ProfileFuture ignored = measure("ChunkBaseGenTime")) { - interp = interpolationType.getInstance(world, chunkX, chunkZ, this.getBiomeGrid(world), gen); - chunk = generateBase(world, random, chunkX, chunkZ, interp); - } - try(ProfileFuture ignored = measure("BiomeApplyTime")) { - com.dfsek.terra.api.gaea.biome.BiomeGrid grid = getBiomeGrid(world); - int xOrig = (chunkX << 4); - int zOrig = (chunkZ << 4); - for(byte x = 0; x < 4; x++) { - for(byte z = 0; z < 4; z++) { - int cx = xOrig + (x << 2); - int cz = zOrig + (z << 2); - Biome b = grid.getBiome(cx, cz, GenerationPhase.PALETTE_APPLY); - biome.setBiome(x << 2, z << 2, b.getVanillaBiome()); - } - } - } - for(GenerationPopulator g : getGenerationPopulators(world)) { - g.populate(world, chunk, random, chunkX, chunkZ, interp); - } - return chunk; - } - } - - public void attachProfiler(WorldProfiler p) { - this.profiler = p; - } - - public WorldProfiler getProfiler() { - return profiler; - } - - private ProfileFuture measure(String id) { - if(profiler != null) return profiler.measure(id); - return null; - } - - public abstract ChunkData generateBase(@NotNull World world, @NotNull Random random, int x, int z, ChunkInterpolator noise); - - public abstract int getNoiseOctaves(World w); - - public abstract double getNoiseFrequency(World w); - - public abstract List getGenerationPopulators(World w); - - public abstract com.dfsek.terra.api.gaea.biome.BiomeGrid getBiomeGrid(World w); - - public FastNoiseLite getNoiseGenerator() { - return gen; - } -} diff --git a/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPopulator.java b/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPopulator.java deleted file mode 100644 index 57ac2cb0a..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPopulator.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dfsek.terra.api.gaea.generation; - -import org.bukkit.World; -import org.bukkit.generator.ChunkGenerator; - -import java.util.Random; - -public abstract class GenerationPopulator { - public abstract void populate(World world, ChunkGenerator.ChunkData chunk, Random r, int chunkX, int chunkZ, ChunkInterpolator interp); -} diff --git a/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java b/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java index eb45f26c5..9a493930d 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java +++ b/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java @@ -1,11 +1,11 @@ package com.dfsek.terra.api.gaea.profiler; -import com.dfsek.terra.api.gaea.generation.GaeaChunkGenerator; +import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; +import com.dfsek.terra.api.generic.world.World; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import net.jafama.FastMath; import org.bukkit.ChatColor; -import org.bukkit.World; import java.util.Map; @@ -15,7 +15,7 @@ public class WorldProfiler { private boolean isProfiling; public WorldProfiler(World w) { - if(! (w.getGenerator() instanceof GaeaChunkGenerator)) + if(!(w.getGenerator() instanceof TerraChunkGenerator)) throw new IllegalArgumentException("Attempted to instantiate profiler on non-Gaea managed world!"); this.addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "TotalChunkGenTime") .addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "ChunkBaseGenTime") @@ -23,7 +23,7 @@ public class WorldProfiler { .addMeasurement(new Measurement(2000000, DataType.PERIOD_MILLISECONDS), "PopulationManagerTime"); isProfiling = false; this.world = w; - ((GaeaChunkGenerator) w.getGenerator()).attachProfiler(this); + ((TerraChunkGenerator) w.getGenerator()).attachProfiler(this); } public String getResultsFormatted() { diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java b/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java index 075fd58aa..0923f0635 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java @@ -2,13 +2,12 @@ package com.dfsek.terra.api.gaea.tree; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.plugin.java.JavaPlugin; import java.util.Random; import java.util.Set; public interface Tree { - boolean plant(Location l, Random r, JavaPlugin main); + boolean plant(Location l, Random r); Set getSpawnable(); } diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java b/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java index 57117dec8..c34187ed1 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java @@ -89,10 +89,8 @@ public enum TreeType implements Tree { if(this.getVanillaTreeType() == null) { if(!spawnable.contains(l.subtract(0, 1, 0).getBlock().getType())) return false; FractalTree tree = getCustomTreeType().getTree(l, r); - if(main.isEnabled()) co.aikar.taskchain.BukkitTaskChainFactory.create(main).newChain() - .async(tree::grow) - .sync(tree::plant) - .execute(); + tree.grow(); + tree.plant(); return true; } return l.getWorld().generateTree(l, this.getVanillaTreeType()); diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java b/src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java index c190552a3..d85feafcd 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java +++ b/src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java @@ -2,9 +2,9 @@ package com.dfsek.terra.api.gaea.world.carving; import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.vector.Vector3; import net.jafama.FastMath; -import org.bukkit.World; -import org.bukkit.util.Vector; import java.util.Random; import java.util.function.BiConsumer; @@ -20,14 +20,14 @@ public abstract class Carver { this.maxY = maxY; } - public void carve(int chunkX, int chunkZ, World w, BiConsumer consumer) { + public void carve(int chunkX, int chunkZ, World w, BiConsumer consumer) { for(int x = chunkX - carvingRadius; x <= chunkX + carvingRadius; x++) { for(int z = chunkZ - carvingRadius; z <= chunkZ + carvingRadius; z++) { if(isChunkCarved(w, x, z, new FastRandom(MathUtil.hashToLong(this.getClass().getName() + "_" + x + "&" + z)))) { long seed = MathUtil.getCarverChunkSeed(x, z, w.getSeed()); Random r = new FastRandom(seed); - Worm carving = getWorm(seed, new Vector((x << 4) + r.nextInt(16), r.nextInt(maxY - minY + 1) + minY, (z << 4) + r.nextInt(16))); - Vector origin = carving.getOrigin(); + Worm carving = getWorm(seed, new Vector3((x << 4) + r.nextInt(16), r.nextInt(maxY - minY + 1) + minY, (z << 4) + r.nextInt(16))); + Vector3 origin = carving.getOrigin(); for(int i = 0; i < carving.getLength(); i++) { carving.step(); if(carving.getRunning().clone().setY(0).distanceSquared(origin.clone().setY(0)) > sixtyFourSq) @@ -49,7 +49,7 @@ public abstract class Carver { this.carvingRadius = carvingRadius; } - public abstract Worm getWorm(long seed, Vector l); + public abstract Worm getWorm(long seed, Vector3 l); public abstract boolean isChunkCarved(World w, int chunkX, int chunkZ, Random r); diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java b/src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java index c5e69d7e4..62072db04 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java +++ b/src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java @@ -1,21 +1,21 @@ package com.dfsek.terra.api.gaea.world.carving; +import com.dfsek.terra.api.generic.world.vector.Vector3; import net.jafama.FastMath; -import org.bukkit.util.Vector; import java.util.Random; import java.util.function.BiConsumer; public abstract class Worm { private final Random r; - private final Vector origin; - private final Vector running; + private final Vector3 origin; + private final Vector3 running; private final int length; private int topCut = 0; private int bottomCut = 0; private int[] radius = new int[] {0, 0, 0}; - public Worm(int length, Random r, Vector origin) { + public Worm(int length, Random r, Vector3 origin) { this.r = r; this.length = length; this.origin = origin; @@ -30,7 +30,7 @@ public abstract class Worm { this.topCut = topCut; } - public Vector getOrigin() { + public Vector3 getOrigin() { return origin; } @@ -38,7 +38,7 @@ public abstract class Worm { return length; } - public Vector getRunning() { + public Vector3 getRunning() { return running; } @@ -61,12 +61,12 @@ public abstract class Worm { public abstract void step(); public static class WormPoint { - private final Vector origin; + private final Vector3 origin; private final int topCut; private final int bottomCut; private final int[] rad; - public WormPoint(Vector origin, int[] rad, int topCut, int bottomCut) { + public WormPoint(Vector3 origin, int[] rad, int topCut, int bottomCut) { this.origin = origin; this.rad = rad; this.topCut = topCut; @@ -77,7 +77,7 @@ public abstract class Worm { return (FastMath.pow2(x) / FastMath.pow2(xr + 0.5D)) + (FastMath.pow2(y) / FastMath.pow2(yr + 0.5D)) + (FastMath.pow2(z) / FastMath.pow2(zr + 0.5D)); } - public Vector getOrigin() { + public Vector3 getOrigin() { return origin; } @@ -85,7 +85,7 @@ public abstract class Worm { return rad[index]; } - public void carve(int chunkX, int chunkZ, BiConsumer consumer) { + public void carve(int chunkX, int chunkZ, BiConsumer consumer) { int xRad = getRadius(0); int yRad = getRadius(1); int zRad = getRadius(2); @@ -96,12 +96,12 @@ public abstract class Worm { for(int z = -zRad - 1; z <= zRad + 1; z++) { if(!(FastMath.floorDiv(origin.getBlockZ() + z, 16) == chunkZ)) continue; for(int y = -yRad - 1; y <= yRad + 1; y++) { - Vector position = origin.clone().add(new Vector(x, y, z)); + Vector3 position = origin.clone().add(new Vector3(x, y, z)); if(position.getY() < 0 || position.getY() > 255) continue; double eq = ellipseEquation(x, y, z, xRad, yRad, zRad); if(eq <= 1 && y >= -yRad - 1 + bottomCut && y <= yRad + 1 - topCut) { - consumer.accept(new Vector(position.getBlockX() - originX, position.getBlockY(), position.getBlockZ() - originZ), Carver.CarvingType.CENTER); + consumer.accept(new Vector3(position.getBlockX() - originX, position.getBlockY(), position.getBlockZ() - originZ), Carver.CarvingType.CENTER); } else if(eq <= 1.5) { Carver.CarvingType type = Carver.CarvingType.WALL; if(y <= -yRad - 1 + bottomCut) { @@ -109,7 +109,7 @@ public abstract class Worm { } else if(y >= yRad + 1 - topCut) { type = Carver.CarvingType.TOP; } - consumer.accept(new Vector(position.getBlockX() - originX, position.getBlockY(), position.getBlockZ() - originZ), type); + consumer.accept(new Vector3(position.getBlockX() - originX, position.getBlockY(), position.getBlockZ() - originZ), type); } } } diff --git a/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java b/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java index 9cbcd02ef..ac7ff029c 100644 --- a/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java +++ b/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java @@ -1,9 +1,18 @@ package com.dfsek.terra.api.generic; +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.LoaderRegistrar; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; -public interface TerraPlugin { +import java.util.logging.Logger; + +public interface TerraPlugin extends LoaderRegistrar { WorldHandle getHandle(); boolean isEnabled(); + + TerraWorld getWorld(World world); + + Logger getLogger(); } diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java index f63ec12a3..bda0a2fb3 100644 --- a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java @@ -20,7 +20,7 @@ public interface ChunkGenerator extends Handle { boolean shouldGenerateStructures(); - ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkData data); + ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome); List getDefaultPopulators(World world); diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java b/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java new file mode 100644 index 000000000..ff3821387 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.api.generic.generator; + +import com.dfsek.terra.api.gaea.profiler.WorldProfiler; +import com.dfsek.terra.api.generic.world.BiomeGrid; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.config.base.ConfigPack; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + +public interface TerraChunkGenerator { + void generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkGenerator.ChunkData data); + + void attachProfiler(WorldProfiler profiler); + + boolean isParallelCapable(); + + boolean shouldGenerateCaves(); + + boolean shouldGenerateDecorations(); + + boolean shouldGenerateMobs(); + + boolean shouldGenerateStructures(); + + ConfigPack getConfigPack(); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/Biome.java b/src/main/java/com/dfsek/terra/api/generic/world/Biome.java new file mode 100644 index 000000000..693972fed --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/Biome.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.api.generic.world; + +import com.dfsek.terra.api.generic.Handle; + +public interface Biome extends Handle { +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java b/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java index 7c82c96f4..81fdf0b9d 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java @@ -24,4 +24,16 @@ public class Location implements Cloneable { throw new Error(e); } } + + public int getBlockX() { + return vector.getBlockX(); + } + + public int getBlockY() { + return vector.getBlockY(); + } + + public int getBlockZ() { + return vector.getBlockZ(); + } } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java b/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java index 7a156466c..f4caa28fd 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java @@ -2,8 +2,17 @@ package com.dfsek.terra.api.generic.world.vector; import com.dfsek.terra.api.generic.world.World; import net.jafama.FastMath; +import org.bukkit.util.NumberConversions; +import org.bukkit.util.Vector; +import org.jetbrains.annotations.NotNull; public class Vector3 implements Cloneable { + + /** + * Threshold for fuzzy equals(). + */ + private static final double epsilon = 0.000001; + private double x; private double y; private double z; @@ -80,12 +89,17 @@ public class Vector3 implements Cloneable { return this; } - public double lengthSq() { - return x * x + y * y + z * z; + /** + * Get the threshold used for equals(). + * + * @return The epsilon. + */ + public static double getEpsilon() { + return epsilon; } - public double length() { - return FastMath.sqrt(lengthSq()); + public double lengthSquared() { + return x * x + y * y + z * z; } @Override @@ -97,6 +111,188 @@ public class Vector3 implements Cloneable { } } + public double length() { + return FastMath.sqrt(lengthSquared()); + } + + /** + * Returns if a vector is normalized + * + * @return whether the vector is normalised + */ + public boolean isNormalized() { + return Math.abs(this.lengthSquared() - 1) < getEpsilon(); + } + + /** + * Rotates the vector around the x axis. + *

+ * This piece of math is based on the standard rotation matrix for vectors + * in three dimensional space. This matrix can be found here: + * Rotation + * Matrix. + * + * @param angle the angle to rotate the vector about. This angle is passed + * in radians + * @return the same vector + */ + @NotNull + public Vector3 rotateAroundX(double angle) { + double angleCos = Math.cos(angle); + double angleSin = Math.sin(angle); + + double y = angleCos * getY() - angleSin * getZ(); + double z = angleSin * getY() + angleCos * getZ(); + return setY(y).setZ(z); + } + + /** + * Rotates the vector around the y axis. + *

+ * This piece of math is based on the standard rotation matrix for vectors + * in three dimensional space. This matrix can be found here: + * Rotation + * Matrix. + * + * @param angle the angle to rotate the vector about. This angle is passed + * in radians + * @return the same vector + */ + @NotNull + public Vector3 rotateAroundY(double angle) { + double angleCos = Math.cos(angle); + double angleSin = Math.sin(angle); + + double x = angleCos * getX() + angleSin * getZ(); + double z = -angleSin * getX() + angleCos * getZ(); + return setX(x).setZ(z); + } + + /** + * Rotates the vector around the z axis + *

+ * This piece of math is based on the standard rotation matrix for vectors + * in three dimensional space. This matrix can be found here: + * Rotation + * Matrix. + * + * @param angle the angle to rotate the vector about. This angle is passed + * in radians + * @return the same vector + */ + @NotNull + public Vector3 rotateAroundZ(double angle) { + double angleCos = Math.cos(angle); + double angleSin = Math.sin(angle); + + double x = angleCos * getX() - angleSin * getY(); + double y = angleSin * getX() + angleCos * getY(); + return setX(x).setY(y); + } + + /** + * Get the distance between this vector and another. The value of this + * method is not cached and uses a costly square-root function, so do not + * repeatedly call this method to get the vector's magnitude. NaN will be + * returned if the inner result of the sqrt() function overflows, which + * will be caused if the distance is too long. + * + * @param o The other vector + * @return the distance + */ + public double distance(@NotNull Vector3 o) { + return FastMath.sqrt(NumberConversions.square(x - o.x) + NumberConversions.square(y - o.y) + NumberConversions.square(z - o.z)); + } + + /** + * Get the squared distance between this vector and another. + * + * @param o The other vector + * @return the distance + */ + public double distanceSquared(@NotNull Vector3 o) { + return NumberConversions.square(x - o.x) + NumberConversions.square(y - o.y) + NumberConversions.square(z - o.z); + } + + /** + * Rotates the vector around a given arbitrary axis in 3 dimensional space. + * + *

+ * Rotation will follow the general Right-Hand-Rule, which means rotation + * will be counterclockwise when the axis is pointing towards the observer. + *

+ * This method will always make sure the provided axis is a unit vector, to + * not modify the length of the vector when rotating. If you are experienced + * with the scaling of a non-unit axis vector, you can use + * {@link Vector#rotateAroundNonUnitAxis(Vector, double)}. + * + * @param axis the axis to rotate the vector around. If the passed vector is + * not of length 1, it gets copied and normalized before using it for the + * rotation. Please use {@link Vector#normalize()} on the instance before + * passing it to this method + * @param angle the angle to rotate the vector around the axis + * @return the same vector + * @throws IllegalArgumentException if the provided axis vector instance is + * null + */ + @NotNull + public Vector3 rotateAroundAxis(@NotNull Vector3 axis, double angle) throws IllegalArgumentException { + return rotateAroundNonUnitAxis(axis.isNormalized() ? axis : axis.clone().normalize(), angle); + } + + /** + * Rotates the vector around a given arbitrary axis in 3 dimensional space. + * + *

+ * Rotation will follow the general Right-Hand-Rule, which means rotation + * will be counterclockwise when the axis is pointing towards the observer. + *

+ * Note that the vector length will change accordingly to the axis vector + * length. If the provided axis is not a unit vector, the rotated vector + * will not have its previous length. The scaled length of the resulting + * vector will be related to the axis vector. If you are not perfectly sure + * about the scaling of the vector, use + * {@link Vector#rotateAroundAxis(Vector, double)} + * + * @param axis the axis to rotate the vector around. + * @param angle the angle to rotate the vector around the axis + * @return the same vector + * @throws IllegalArgumentException if the provided axis vector instance is + * null + */ + @NotNull + public Vector3 rotateAroundNonUnitAxis(@NotNull Vector3 axis, double angle) throws IllegalArgumentException { + double x = getX(), y = getY(), z = getZ(); + double x2 = axis.getX(), y2 = axis.getY(), z2 = axis.getZ(); + + double cosTheta = Math.cos(angle); + double sinTheta = Math.sin(angle); + double dotProduct = this.dot(axis); + + double xPrime = x2 * dotProduct * (1d - cosTheta) + + x * cosTheta + + (-z2 * y + y2 * z) * sinTheta; + double yPrime = y2 * dotProduct * (1d - cosTheta) + + y * cosTheta + + (z2 * x - x2 * z) * sinTheta; + double zPrime = z2 * dotProduct * (1d - cosTheta) + + z * cosTheta + + (-y2 * x + x2 * y) * sinTheta; + + return setX(xPrime).setY(yPrime).setZ(zPrime); + } + + /** + * Calculates the dot product of this vector with another. The dot product + * is defined as x1*x2+y1*y2+z1*z2. The returned value is a scalar. + * + * @param other The other vector + * @return dot product + */ + public double dot(@NotNull Vector3 other) { + return x * other.x + y * other.y + z * other.z; + } + public Location toLocation(World world) { return new Location(world, this.clone()); } diff --git a/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java b/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java index f0871d579..73940b84d 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java +++ b/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java @@ -1,6 +1,6 @@ package com.dfsek.terra.async; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; @@ -15,7 +15,7 @@ import java.util.function.Consumer; */ public class AsyncBiomeFinder extends AsyncFeatureFinder { - public AsyncBiomeFinder(TerraBiomeGrid grid, Biome target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, Terra main) { + public AsyncBiomeFinder(TerraBiomeGrid grid, Biome target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraBukkitPlugin main) { super(grid, target, origin, startRadius, maxRadius, callback, main); } diff --git a/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java b/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java index d26418bf5..b45c479d3 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java +++ b/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java @@ -1,6 +1,6 @@ package com.dfsek.terra.async; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import org.bukkit.Bukkit; import org.bukkit.Location; @@ -20,9 +20,9 @@ public abstract class AsyncFeatureFinder implements Runnable { protected final World world; private final Consumer callback; protected int searchSize = 1; - protected final Terra main; + protected final TerraBukkitPlugin main; - public AsyncFeatureFinder(TerraBiomeGrid grid, T target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, Terra main) { + public AsyncFeatureFinder(TerraBiomeGrid grid, T target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraBukkitPlugin main) { this.grid = grid; this.target = target; this.main = main; diff --git a/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java b/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java index e7e215d7b..265b48c81 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java +++ b/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java @@ -1,6 +1,6 @@ package com.dfsek.terra.async; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; @@ -20,7 +20,7 @@ import java.util.function.Consumer; * Runnable to locate structures asynchronously */ public class AsyncStructureFinder extends AsyncFeatureFinder { - public AsyncStructureFinder(TerraBiomeGrid grid, TerraStructure target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, Terra main) { + public AsyncStructureFinder(TerraBiomeGrid grid, TerraStructure target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraBukkitPlugin main) { super(grid, target, origin, startRadius, maxRadius, callback, main); setSearchSize(target.getSpawn().getWidth() + 2 * target.getSpawn().getSeparation()); } diff --git a/src/main/java/com/dfsek/terra/biome/BiomeZone.java b/src/main/java/com/dfsek/terra/biome/BiomeZone.java index 26dd35cbb..e93d28b37 100644 --- a/src/main/java/com/dfsek/terra/biome/BiomeZone.java +++ b/src/main/java/com/dfsek/terra/biome/BiomeZone.java @@ -3,10 +3,10 @@ package com.dfsek.terra.biome; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.biome.NormalizationUtil; import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.image.ImageLoader; -import org.bukkit.World; import org.jetbrains.annotations.Nullable; import java.util.Objects; diff --git a/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java b/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java index ecefb99a9..c4412cd53 100644 --- a/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java +++ b/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java @@ -3,8 +3,8 @@ package com.dfsek.terra.biome.grid; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import org.bukkit.Location; -import org.bukkit.World; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.vector.Location; /** * BiomeGrid implementation that holds a single biome. diff --git a/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java b/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java index b2a0dbe20..61cbd749d 100644 --- a/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java +++ b/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java @@ -4,11 +4,11 @@ import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.biome.NormalizationUtil; import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.image.ImageLoader; -import org.bukkit.Location; -import org.bukkit.World; public class UserDefinedGrid extends BiomeGrid { private final ImageLoader imageLoader; diff --git a/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java b/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java index d473af1e4..6968a13e9 100644 --- a/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java +++ b/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java @@ -1,8 +1,8 @@ package com.dfsek.terra.biome.grid.master; import com.dfsek.terra.api.gaea.biome.BiomeGrid; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.grid.UserDefinedGrid; -import org.bukkit.World; public abstract class TerraBiomeGrid extends BiomeGrid { public TerraBiomeGrid(World w, double freq1, double freq2, int sizeX, int sizeZ) { diff --git a/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java b/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java index 7900dc5a3..a55953071 100644 --- a/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java +++ b/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java @@ -3,6 +3,8 @@ package com.dfsek.terra.biome.grid.master; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.UserDefinedBiome; @@ -12,8 +14,6 @@ import com.dfsek.terra.biome.postprocessing.ErosionNoise; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; import net.jafama.FastMath; -import org.bukkit.Location; -import org.bukkit.World; public class TerraRadialBiomeGrid extends TerraBiomeGrid { private static final int failNum = 0; diff --git a/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java b/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java index 45c292156..e23838eba 100644 --- a/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java +++ b/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java @@ -2,6 +2,8 @@ package com.dfsek.terra.biome.grid.master; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.UserDefinedBiome; @@ -10,8 +12,6 @@ import com.dfsek.terra.biome.postprocessing.CoordinatePerturb; import com.dfsek.terra.biome.postprocessing.ErosionNoise; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; -import org.bukkit.Location; -import org.bukkit.World; public class TerraStandardBiomeGrid extends TerraBiomeGrid { private static final int failNum = 0; diff --git a/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java b/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java index 4f171e92b..95230cce1 100644 --- a/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java +++ b/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java @@ -1,7 +1,7 @@ package com.dfsek.terra.biome.palette; import com.dfsek.terra.api.gaea.world.palette.Palette; -import org.bukkit.block.data.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockData; public class PaletteHolder { private final Palette[] palettes; diff --git a/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java b/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java index d447bd275..db944f239 100644 --- a/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java +++ b/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java @@ -1,9 +1,8 @@ package com.dfsek.terra.biome.palette; import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.util.PaletteUtil; +import com.dfsek.terra.api.generic.world.block.BlockData; import net.jafama.FastMath; -import org.bukkit.block.data.BlockData; import java.util.Map; import java.util.TreeMap; @@ -20,13 +19,14 @@ public class PaletteHolderBuilder { public PaletteHolder build() { Palette[] palettes = new Palette[paletteMap.lastKey() + 1]; for(int y = 0; y <= FastMath.max(paletteMap.lastKey(), 255); y++) { - Palette d = PaletteUtil.BLANK_PALETTE; + Palette d = null; for(Map.Entry> e : paletteMap.entrySet()) { if(e.getKey() >= y) { d = e.getValue(); break; } } + if(d == null) throw new IllegalArgumentException("No palette for Y=" + y); palettes[y] = d; } return new PaletteHolder(palettes); diff --git a/src/main/java/com/dfsek/terra/carving/CarverCache.java b/src/main/java/com/dfsek/terra/carving/CarverCache.java index 2d4ea412f..041f4ec09 100644 --- a/src/main/java/com/dfsek/terra/carving/CarverCache.java +++ b/src/main/java/com/dfsek/terra/carving/CarverCache.java @@ -1,16 +1,16 @@ package com.dfsek.terra.carving; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.gaea.world.carving.Worm; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import org.bukkit.World; -import org.bukkit.util.Vector; import java.util.HashMap; import java.util.List; @@ -21,9 +21,9 @@ public class CarverCache { private final World w; private final Map> carvers = new HashMap<>(); - private final Terra main; + private final TerraBukkitPlugin main; - public CarverCache(World w, Terra main) { + public CarverCache(World w, TerraBukkitPlugin main) { this.w = w; this.main = main; } @@ -36,7 +36,7 @@ public class CarverCache { long seed = MathUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed()); carver.getSeedVar().setValue(seed); Random r = new FastRandom(seed); - Worm carving = carver.getWorm(seed, new Vector((chunkX << 4) + r.nextInt(16), carver.getConfig().getHeight().get(r), (chunkZ << 4) + r.nextInt(16))); + Worm carving = carver.getWorm(seed, new Vector3((chunkX << 4) + r.nextInt(16), carver.getConfig().getHeight().get(r), (chunkZ << 4) + r.nextInt(16))); List points = new GlueList<>(); for(int i = 0; i < carving.getLength(); i++) { carving.step(); diff --git a/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java b/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java index 33f2f9e9b..0fe710463 100644 --- a/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java +++ b/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java @@ -1,18 +1,18 @@ package com.dfsek.terra.carving; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.world.carving.Carver; import com.dfsek.terra.api.gaea.world.carving.Worm; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.CarverTemplate; import com.dfsek.terra.math.RandomFunction; import net.jafama.FastMath; -import org.bukkit.World; -import org.bukkit.util.Vector; import parsii.eval.Expression; import parsii.eval.Parser; import parsii.eval.Scope; @@ -43,9 +43,9 @@ public class UserDefinedCarver extends Carver { private double step = 2; private Range recalc = new Range(8, 10); private double recalcMagnitude = 3; - private final Terra main; + private final TerraBukkitPlugin main; - public UserDefinedCarver(Range height, Range length, double[] start, double[] mutate, List radii, Scope parent, long hash, int topCut, int bottomCut, CarverTemplate config, Terra main) throws ParseException { + public UserDefinedCarver(Range height, Range length, double[] start, double[] mutate, List radii, Scope parent, long hash, int topCut, int bottomCut, CarverTemplate config, TerraBukkitPlugin main) throws ParseException { super(height.getMin(), height.getMax()); this.length = length; this.start = start; @@ -74,7 +74,7 @@ public class UserDefinedCarver extends Carver { } @Override - public Worm getWorm(long l, Vector vector) { + public Worm getWorm(long l, Vector3 vector) { Random r = new FastRandom(l + hash); return new UserDefinedWorm(length.get(r) / 2, r, vector, topCut, bottomCut); } @@ -100,13 +100,13 @@ public class UserDefinedCarver extends Carver { } @Override - public void carve(int chunkX, int chunkZ, World w, BiConsumer consumer) { + public void carve(int chunkX, int chunkZ, World w, BiConsumer consumer) { CarverCache cache = cacheMap.computeIfAbsent(w, world -> new CarverCache(world, main)); int carvingRadius = getCarvingRadius(); for(int x = chunkX - carvingRadius; x <= chunkX + carvingRadius; x++) { for(int z = chunkZ - carvingRadius; z <= chunkZ + carvingRadius; z++) { cache.getPoints(x, z, this).forEach(point -> { - Vector origin = point.getOrigin(); + Vector3 origin = point.getOrigin(); if(FastMath.floorDiv(origin.getBlockX(), 16) != chunkX && FastMath.floorDiv(origin.getBlockZ(), 16) != chunkZ) // We only want to carve this chunk. return; point.carve(chunkX, chunkZ, consumer); @@ -133,16 +133,16 @@ public class UserDefinedCarver extends Carver { } private class UserDefinedWorm extends Worm { - private final Vector direction; + private final Vector3 direction; private int steps; private int nextDirection = 0; private double[] currentRotation = new double[3]; - public UserDefinedWorm(int length, Random r, Vector origin, int topCut, int bottomCut) { + public UserDefinedWorm(int length, Random r, Vector3 origin, int topCut, int bottomCut) { super(length, r, origin); super.setTopCut(topCut); super.setBottomCut(bottomCut); - direction = new Vector((r.nextDouble() - 0.5D) * start[0], (r.nextDouble() - 0.5D) * start[1], (r.nextDouble() - 0.5D) * start[2]).normalize().multiply(step); + direction = new Vector3((r.nextDouble() - 0.5D) * start[0], (r.nextDouble() - 0.5D) * start[1], (r.nextDouble() - 0.5D) * start[2]).normalize().multiply(step); position.setValue(0); lengthVar.setValue(length); setRadius(new int[] {(int) (xRad.evaluate()), (int) (yRad.evaluate()), (int) (zRad.evaluate())}); diff --git a/src/main/java/com/dfsek/terra/command/PacksCommand.java b/src/main/java/com/dfsek/terra/command/PacksCommand.java index 50fea52ac..4a41ff6ed 100644 --- a/src/main/java/com/dfsek/terra/command/PacksCommand.java +++ b/src/main/java/com/dfsek/terra/command/PacksCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.Command; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.config.lang.LangUtil; @@ -29,7 +29,7 @@ public class PacksCommand extends Command { @Override public boolean execute(@NotNull CommandSender commandSender, org.bukkit.command.@NotNull Command command, @NotNull String s, @NotNull String[] strings) { - ConfigRegistry registry = ((Terra) getMain()).getRegistry(); + ConfigRegistry registry = ((TerraBukkitPlugin) getMain()).getRegistry(); if(registry.entries().size() == 0) { LangUtil.send("command.packs.none", commandSender); diff --git a/src/main/java/com/dfsek/terra/command/ReloadCommand.java b/src/main/java/com/dfsek/terra/command/ReloadCommand.java index 8fc1374a1..58a59fe09 100644 --- a/src/main/java/com/dfsek/terra/command/ReloadCommand.java +++ b/src/main/java/com/dfsek/terra/command/ReloadCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.Command; import com.dfsek.terra.api.gaea.command.DebugCommand; import com.dfsek.terra.config.lang.LangUtil; @@ -27,13 +27,13 @@ public class ReloadCommand extends Command implements DebugCommand { @Override public boolean execute(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { - ((Terra) getMain()).getTerraConfig().load(getMain()); - LangUtil.load(((Terra) getMain()).getTerraConfig().getLanguage(), getMain()); // Load language. - if(!((Terra) getMain()).getRegistry().loadAll((Terra) getMain())) { + ((TerraBukkitPlugin) getMain()).getTerraConfig().load(getMain()); + LangUtil.load(((TerraBukkitPlugin) getMain()).getTerraConfig().getLanguage(), getMain()); // Load language. + if(!((TerraBukkitPlugin) getMain()).getRegistry().loadAll((TerraBukkitPlugin) getMain())) { LangUtil.send("command.reload-error", sender); return true; } - ((Terra) getMain()).reload(); + ((TerraBukkitPlugin) getMain()).reload(); LangUtil.send("command.reload", sender); return true; } diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java b/src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java index 87d7e64c6..f8bc63591 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java +++ b/src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command.biome; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; @@ -23,7 +23,7 @@ public class BiomeCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World w) { - TerraBiomeGrid grid = ((Terra) getMain()).getWorld(sender.getWorld()).getGrid(); + TerraBiomeGrid grid = ((TerraBukkitPlugin) getMain()).getWorld(sender.getWorld()).getGrid(); UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome(sender.getLocation(), GenerationPhase.POPULATE); LangUtil.send("command.biome.in", sender, biome.getID()); return true; diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java b/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java index e1b6f0c32..900d7bf79 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java +++ b/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command.biome; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.carving.UserDefinedCarver; @@ -27,7 +27,7 @@ public class BiomeInfoCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { String id = args[0]; - ConfigPack cfg = ((Terra) getMain()).getWorld(world).getConfig(); + ConfigPack cfg = ((TerraBukkitPlugin) getMain()).getWorld(world).getConfig(); UserDefinedBiome b; try { b = cfg.getBiome(id); @@ -86,7 +86,7 @@ public class BiomeInfoCommand extends WorldCommand { public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { if(!(sender instanceof Player) || !(((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator)) return Collections.emptyList(); - List ids = ((Terra) getMain()).getWorld(((Player) sender).getWorld()).getConfig().getBiomeIDs(); + List ids = ((TerraBukkitPlugin) getMain()).getWorld(((Player) sender).getWorld()).getConfig().getBiomeIDs(); if(args.length == 1) return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); return Collections.emptyList(); diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java b/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java index 6b3a9a774..b98c5f84f 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java +++ b/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command.biome; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.async.AsyncBiomeFinder; import com.dfsek.terra.biome.UserDefinedBiome; @@ -45,12 +45,12 @@ public class BiomeLocateCommand extends WorldCommand { } UserDefinedBiome b; try { - b = ((Terra) getMain()).getWorld(world).getConfig().getBiome(id); + b = ((TerraBukkitPlugin) getMain()).getWorld(world).getConfig().getBiome(id); } catch(IllegalArgumentException | NullPointerException e) { LangUtil.send("command.biome.invalid", sender, id); return true; } - Bukkit.getScheduler().runTaskAsynchronously(getMain(), new AsyncBiomeFinder(((Terra) getMain()).getWorld(world).getGrid(), b, sender.getLocation().clone().multiply((1D / ((Terra) getMain()).getTerraConfig().getBiomeSearchResolution())), 0, maxRadius, location -> { + Bukkit.getScheduler().runTaskAsynchronously(getMain(), new AsyncBiomeFinder(((TerraBukkitPlugin) getMain()).getWorld(world).getGrid(), b, sender.getLocation().clone().multiply((1D / ((TerraBukkitPlugin) getMain()).getTerraConfig().getBiomeSearchResolution())), 0, maxRadius, location -> { if(location != null) { ComponentBuilder cm = new ComponentBuilder(String.format("The nearest %s is at ", id.toLowerCase())) .append(String.format("[%d, ~, %d]", location.getBlockX(), location.getBlockZ()), ComponentBuilder.FormatRetention.NONE) @@ -61,7 +61,7 @@ public class BiomeLocateCommand extends WorldCommand { sender.spigot().sendMessage(cm.create()); // LangUtil.send("command.biome.biome-found", sender, String.valueOf(location.getBlockX()), String.valueOf(location.getBlockZ())); } else LangUtil.send("command.biome.unable-to-locate", sender); - }, (Terra) getMain())); + }, (TerraBukkitPlugin) getMain())); return true; } @@ -84,7 +84,7 @@ public class BiomeLocateCommand extends WorldCommand { public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { if(!(sender instanceof Player) || !(((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator)) return Collections.emptyList(); - List ids = ((Terra) getMain()).getWorld(((Player) sender).getWorld()).getConfig().getBiomeIDs(); + List ids = ((TerraBukkitPlugin) getMain()).getWorld(((Player) sender).getWorld()).getConfig().getBiomeIDs(); if(args.length == 1) return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); return Collections.emptyList(); diff --git a/src/main/java/com/dfsek/terra/command/image/RenderCommand.java b/src/main/java/com/dfsek/terra/command/image/RenderCommand.java index 27e4ae98b..3b5d19527 100644 --- a/src/main/java/com/dfsek/terra/command/image/RenderCommand.java +++ b/src/main/java/com/dfsek/terra/command/image/RenderCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command.image; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.image.WorldImageGenerator; @@ -22,7 +22,7 @@ public class RenderCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { try { - WorldImageGenerator g = new WorldImageGenerator(world, Integer.parseInt(args[0]), Integer.parseInt(args[1]), (Terra) getMain()); + WorldImageGenerator g = new WorldImageGenerator(world, Integer.parseInt(args[0]), Integer.parseInt(args[1]), (TerraBukkitPlugin) getMain()); g.drawWorld(sender.getLocation().getBlockX(), sender.getLocation().getBlockZ()); File file = new File(getMain().getDataFolder() + File.separator + "export" + File.separator + "map" + File.separator + "map_" + System.currentTimeMillis() + ".png"); //noinspection ResultOfMethodCallIgnored diff --git a/src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java b/src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java index 53ff18d79..9f886886c 100644 --- a/src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java +++ b/src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command.image.gui; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.image.ImageLoader; @@ -24,9 +24,9 @@ public class RawGUICommand extends WorldCommand { LangUtil.send("command.image.gui.debug", sender); return true; } - ImageLoader loader = ((Terra) getMain()).getWorld(world).getConfig().getTemplate().getImageLoader(); - if(loader != null) loader.debug(false, sender.getWorld(), (Terra) getMain()); - else ImageLoader.debugWorld(false, world, (Terra) getMain()); + ImageLoader loader = ((TerraBukkitPlugin) getMain()).getWorld(world).getConfig().getTemplate().getImageLoader(); + if(loader != null) loader.debug(false, sender.getWorld(), (TerraBukkitPlugin) getMain()); + else ImageLoader.debugWorld(false, world, (TerraBukkitPlugin) getMain()); return true; } diff --git a/src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java b/src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java index d1dd7e3bd..513b8ff28 100644 --- a/src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java +++ b/src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command.image.gui; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.image.ImageLoader; @@ -24,9 +24,9 @@ public class StepGUICommand extends WorldCommand { LangUtil.send("command.image.gui.debug", sender); return true; } - ImageLoader loader = ((Terra) getMain()).getWorld(world).getConfig().getTemplate().getImageLoader(); - if(loader != null) loader.debug(true, sender.getWorld(), (Terra) getMain()); - else ImageLoader.debugWorld(true, world, (Terra) getMain()); + ImageLoader loader = ((TerraBukkitPlugin) getMain()).getWorld(world).getConfig().getTemplate().getImageLoader(); + if(loader != null) loader.debug(true, sender.getWorld(), (TerraBukkitPlugin) getMain()); + else ImageLoader.debugWorld(true, world, (TerraBukkitPlugin) getMain()); return true; } diff --git a/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java b/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java index 950f5b650..31c8cda9f 100644 --- a/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command.profile; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import org.bukkit.World; @@ -19,7 +19,7 @@ public class QueryCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = ((Terra) getMain()).getWorld(world).getProfiler(); + WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(world).getProfiler(); sender.sendMessage(profile.getResultsFormatted()); return true; } diff --git a/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java b/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java index 02450017f..c4b256373 100644 --- a/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command.profile; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import com.dfsek.terra.config.lang.LangUtil; @@ -20,7 +20,7 @@ public class ResetCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = ((Terra) getMain()).getWorld(world).getProfiler(); + WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(world).getProfiler(); profile.reset(); LangUtil.send("command.profile.reset", sender); return true; diff --git a/src/main/java/com/dfsek/terra/command/profile/StartCommand.java b/src/main/java/com/dfsek/terra/command/profile/StartCommand.java index 3dd287fed..0ef729e97 100644 --- a/src/main/java/com/dfsek/terra/command/profile/StartCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/StartCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command.profile; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import com.dfsek.terra.config.lang.LangUtil; @@ -20,7 +20,7 @@ public class StartCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = ((Terra) getMain()).getWorld(world).getProfiler(); + WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(world).getProfiler(); profile.setProfiling(true); LangUtil.send("command.profile.start", sender); return true; diff --git a/src/main/java/com/dfsek/terra/command/profile/StopCommand.java b/src/main/java/com/dfsek/terra/command/profile/StopCommand.java index c23be4232..07c9ff2b0 100644 --- a/src/main/java/com/dfsek/terra/command/profile/StopCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/StopCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command.profile; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import com.dfsek.terra.config.lang.LangUtil; @@ -20,7 +20,7 @@ public class StopCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = ((Terra) getMain()).getWorld(world).getProfiler(); + WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(world).getProfiler(); profile.setProfiling(false); LangUtil.send("command.profile.stop", sender); return true; diff --git a/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java b/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java index 78dec4a0d..04a9e3711 100644 --- a/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command.structure; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.async.AsyncStructureFinder; import com.dfsek.terra.config.lang.LangUtil; @@ -46,12 +46,12 @@ public class LocateCommand extends WorldCommand { } TerraStructure s; try { - s = Objects.requireNonNull(((Terra) getMain()).getWorld(world).getConfig().getStructure(id)); + s = Objects.requireNonNull(((TerraBukkitPlugin) getMain()).getWorld(world).getConfig().getStructure(id)); } catch(IllegalArgumentException | NullPointerException e) { LangUtil.send("command.structure.invalid", sender, id); return true; } - Bukkit.getScheduler().runTaskAsynchronously(getMain(), new AsyncStructureFinder(((Terra) getMain()).getWorld(world).getGrid(), s, sender.getLocation(), 0, maxRadius, (location) -> { + Bukkit.getScheduler().runTaskAsynchronously(getMain(), new AsyncStructureFinder(((TerraBukkitPlugin) getMain()).getWorld(world).getGrid(), s, sender.getLocation(), 0, maxRadius, (location) -> { if(sender.isOnline()) { if(location != null) { ComponentBuilder cm = new ComponentBuilder(String.format("The nearest %s is at ", id.toLowerCase())) @@ -64,7 +64,7 @@ public class LocateCommand extends WorldCommand { } else sender.sendMessage("Unable to locate structure. "); } - }, (Terra) getMain())); + }, (TerraBukkitPlugin) getMain())); return true; } @@ -87,7 +87,7 @@ public class LocateCommand extends WorldCommand { public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { if(!(sender instanceof Player) || !(((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator)) return Collections.emptyList(); - List ids = ((Terra) getMain()).getWorld(((Player) sender).getWorld()).getConfig().getStructureIDs(); + List ids = ((TerraBukkitPlugin) getMain()).getWorld(((Player) sender).getWorld()).getConfig().getStructureIDs(); if(args.length == 1) return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); return Collections.emptyList(); diff --git a/src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java b/src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java index fa288dbd7..7ca2eb7a7 100644 --- a/src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command.structure; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.DebugCommand; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.structure.StructureSpawnRequirement; @@ -25,9 +25,9 @@ public class SpawnCommand extends WorldCommand implements DebugCommand { int x = p.getBlockX(); int y = p.getBlockY(); int z = p.getBlockZ(); - boolean air = StructureSpawnRequirement.AIR.getInstance(world, (Terra) getMain()).matches(x, y, z); - boolean ground = StructureSpawnRequirement.LAND.getInstance(world, (Terra) getMain()).matches(x, y, z); - boolean sea = StructureSpawnRequirement.OCEAN.getInstance(world, (Terra) getMain()).matches(x, y, z); + boolean air = StructureSpawnRequirement.AIR.getInstance(world, (TerraBukkitPlugin) getMain()).matches(x, y, z); + boolean ground = StructureSpawnRequirement.LAND.getInstance(world, (TerraBukkitPlugin) getMain()).matches(x, y, z); + boolean sea = StructureSpawnRequirement.OCEAN.getInstance(world, (TerraBukkitPlugin) getMain()).matches(x, y, z); sender.sendMessage("AIR: " + air + "\nLAND: " + ground + "\nOCEAN: " + sea); return true; diff --git a/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java b/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java index b7282ec5f..b238d065e 100644 --- a/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command.structure.load; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.DebugCommand; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.structure.Rotation; @@ -36,8 +36,8 @@ public class LoadFullCommand extends LoadCommand implements DebugCommand { return true; } Structure struc = Structure.load(new File(getMain().getDataFolder() + File.separator + "export" + File.separator + "structures", args[0] + ".tstructure")); - if(chunk) struc.paste(sender.getLocation(), sender.getLocation().getChunk(), r, (Terra) getMain()); - else struc.paste(sender.getLocation(), r, (Terra) getMain()); + if(chunk) struc.paste(sender.getLocation(), sender.getLocation().getChunk(), r, (TerraBukkitPlugin) getMain()); + else struc.paste(sender.getLocation(), r, (TerraBukkitPlugin) getMain()); //sender.sendMessage(String.valueOf(struc.checkSpawns(sender.getLocation(), r))); } catch(IOException e) { e.printStackTrace(); diff --git a/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java b/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java index 42995e036..4100b256e 100644 --- a/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.command.structure.load; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.DebugCommand; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.config.lang.LangUtil; @@ -38,7 +38,7 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { try { - WorldHandle handle = ((Terra) getMain()).getHandle(); + WorldHandle handle = ((TerraBukkitPlugin) getMain()).getHandle(); Structure struc = Structure.load(new File(getMain().getDataFolder() + File.separator + "export" + File.separator + "structures", args[0] + ".tstructure")); StructureInfo info = struc.getStructureInfo(); int centerX = info.getCenterX(); diff --git a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index cabba5519..a26bfdd03 100644 --- a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -4,12 +4,12 @@ import com.dfsek.tectonic.abstraction.AbstractConfigLoader; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.terra.Terra; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.structures.loot.LootTable; import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.world.Flora; import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.carving.UserDefinedCarver; @@ -102,11 +102,11 @@ public class ConfigPack { .registerLoader(TerraStructure.class, structureRegistry); } - public ConfigPack(File folder, Terra main) throws ConfigException { + public ConfigPack(File folder, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); - main.registerAllLoaders(selfLoader); - main.registerAllLoaders(abstractConfigLoader); + main.register(selfLoader); + main.register(abstractConfigLoader); File pack = new File(folder, "pack.yml"); @@ -119,11 +119,11 @@ public class ConfigPack { load(new FolderLoader(folder.toPath()), l, main); } - public ConfigPack(ZipFile file, Terra main) throws ConfigException { + public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); - main.registerAllLoaders(selfLoader); - main.registerAllLoaders(abstractConfigLoader); + main.register(selfLoader); + main.register(abstractConfigLoader); InputStream stream = null; @@ -143,7 +143,7 @@ public class ConfigPack { load(new ZIPLoader(file), l, main); } - private void load(Loader loader, long start, Terra main) throws ConfigException { + private void load(Loader loader, long start, TerraPlugin main) throws ConfigException { for(Map.Entry var : template.getVariables().entrySet()) { varScope.create(var.getKey()).setValue(var.getValue()); } @@ -179,7 +179,7 @@ public class ConfigPack { LangUtil.log("config-pack.loaded", Level.INFO, template.getID(), String.valueOf((System.nanoTime() - start) / 1000000D), template.getAuthor(), template.getVersion()); } - private void buildAll(TerraFactory factory, TerraRegistry registry, List configTemplates, Terra main) throws LoadException { + private void buildAll(TerraFactory factory, TerraRegistry registry, List configTemplates, TerraPlugin main) throws LoadException { for(C template : configTemplates) registry.add(template.getID(), factory.build(template, main)); } diff --git a/src/main/java/com/dfsek/terra/config/base/PluginConfig.java b/src/main/java/com/dfsek/terra/config/base/PluginConfig.java index 4a79bcaa7..8962987b8 100644 --- a/src/main/java/com/dfsek/terra/config/base/PluginConfig.java +++ b/src/main/java/com/dfsek/terra/config/base/PluginConfig.java @@ -5,7 +5,7 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.GaeaPlugin; import com.dfsek.terra.api.gaea.util.JarUtil; import com.dfsek.terra.debug.Debug; @@ -51,7 +51,7 @@ public class PluginConfig implements ConfigTemplate { ConfigLoader loader = new ConfigLoader(); loader.load(this, file); if(dumpDefaultConfig) { // Don't dump default config if already loaded. - try(JarFile jar = new JarFile(new File(Terra.class.getProtectionDomain().getCodeSource().getLocation().toURI()))) { + try(JarFile jar = new JarFile(new File(TerraBukkitPlugin.class.getProtectionDomain().getCodeSource().getLocation().toURI()))) { JarUtil.copyResourcesToDirectory(jar, "packs", new File(main.getDataFolder(), "packs").toString()); } catch(IOException | URISyntaxException e) { Debug.error("Failed to dump default config files!"); diff --git a/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java b/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java index 50260148b..6960a605e 100644 --- a/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java +++ b/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java @@ -1,8 +1,8 @@ package com.dfsek.terra.config.builder.biomegrid; import com.dfsek.terra.api.gaea.biome.BiomeGrid; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.config.base.ConfigPack; -import org.bukkit.World; public interface BiomeGridBuilder { BiomeGrid build(World world, ConfigPack config); diff --git a/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java b/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java index 67a0e8381..121e7c8dc 100644 --- a/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java +++ b/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java @@ -1,9 +1,9 @@ package com.dfsek.terra.config.builder.biomegrid; import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.grid.SingleBiomeGrid; import com.dfsek.terra.config.base.ConfigPack; -import org.bukkit.World; public class SingleGridBuilder implements BiomeGridBuilder { private final Biome biome; diff --git a/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java b/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java index c724968a2..fcbef2910 100644 --- a/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java +++ b/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java @@ -1,9 +1,9 @@ package com.dfsek.terra.config.builder.biomegrid; import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.grid.UserDefinedGrid; import com.dfsek.terra.config.base.ConfigPack; -import org.bukkit.World; public class UserDefinedGridBuilder implements BiomeGridBuilder { private double xFreq; diff --git a/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java b/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java index 6933a2b1b..0648cabe9 100644 --- a/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java @@ -1,7 +1,7 @@ package com.dfsek.terra.config.factories; -import com.dfsek.terra.Terra; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.builder.GeneratorBuilder; @@ -16,7 +16,7 @@ public class BiomeFactory implements TerraFactory(), new ProbabilityCollection<>(), 0, 0); GeneratorBuilder generatorBuilder = new GeneratorBuilder(); generatorBuilder.setElevationEquation(template.getElevationEquation()); diff --git a/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java b/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java index 30e8b5877..b954f1bf1 100644 --- a/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java @@ -1,7 +1,7 @@ package com.dfsek.terra.config.factories; -import com.dfsek.terra.Terra; import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.builder.biomegrid.BiomeGridBuilder; import com.dfsek.terra.config.builder.biomegrid.UserDefinedGridBuilder; @@ -12,7 +12,7 @@ import java.util.List; public class BiomeGridFactory implements TerraFactory { @Override - public UserDefinedGridBuilder build(BiomeGridTemplate config, Terra main) { + public UserDefinedGridBuilder build(BiomeGridTemplate config, TerraPlugin main) { UserDefinedGridBuilder holder = new UserDefinedGridBuilder(); holder.setXFreq(config.getXFreq()); diff --git a/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java b/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java index 05ee8197e..92aea8bb8 100644 --- a/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java @@ -1,8 +1,8 @@ package com.dfsek.terra.config.factories; import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.terra.Terra; import com.dfsek.terra.api.gaea.math.MathUtil; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.templates.CarverTemplate; @@ -19,7 +19,7 @@ public class CarverFactory implements TerraFactory radius = Arrays.asList(config.getRadMX(), config.getRadMY(), config.getRadMZ()); diff --git a/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java b/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java index 149c8adb4..d25bafc04 100644 --- a/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java @@ -1,10 +1,10 @@ package com.dfsek.terra.config.factories; -import com.dfsek.terra.Terra; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.world.Flora; import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.api.gaea.world.palette.RandomPalette; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.templates.FloraTemplate; import com.dfsek.terra.generation.items.flora.TerraFlora; @@ -12,7 +12,7 @@ import org.bukkit.block.data.BlockData; public class FloraFactory implements TerraFactory { @Override - public TerraFlora build(FloraTemplate config, Terra main) { + public TerraFlora build(FloraTemplate config, TerraPlugin main) { Palette palette = new RandomPalette<>(new FastRandom(2403)); for(PaletteLayer layer : config.getFloraPalette()) { palette.add(layer.getLayer(), layer.getSize()); diff --git a/src/main/java/com/dfsek/terra/config/factories/OreFactory.java b/src/main/java/com/dfsek/terra/config/factories/OreFactory.java index db8c4bfdf..3b6f043bc 100644 --- a/src/main/java/com/dfsek/terra/config/factories/OreFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/OreFactory.java @@ -1,6 +1,6 @@ package com.dfsek.terra.config.factories; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.config.templates.OreTemplate; import com.dfsek.terra.generation.items.ores.DeformedSphereOre; import com.dfsek.terra.generation.items.ores.Ore; @@ -9,7 +9,7 @@ import org.bukkit.block.data.BlockData; public class OreFactory implements TerraFactory { @Override - public Ore build(OreTemplate config, Terra main) { + public Ore build(OreTemplate config, TerraPlugin main) { BlockData m = config.getMaterial(); switch(config.getType()) { case SPHERE: diff --git a/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java b/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java index 8952b26dc..85d19d977 100644 --- a/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java @@ -1,18 +1,18 @@ package com.dfsek.terra.config.factories; -import com.dfsek.terra.Terra; import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.api.gaea.world.palette.RandomPalette; import com.dfsek.terra.api.gaea.world.palette.SimplexPalette; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.templates.PaletteTemplate; import org.bukkit.block.data.BlockData; public class PaletteFactory implements TerraFactory> { @Override - public Palette build(PaletteTemplate config, Terra main) { + public Palette build(PaletteTemplate config, TerraPlugin main) { Palette palette; if(config.isSimplex()) { FastNoiseLite noise = new FastNoiseLite((int) config.getSeed()); diff --git a/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java b/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java index 5f578dc19..9dbb2f347 100644 --- a/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java @@ -1,13 +1,13 @@ package com.dfsek.terra.config.factories; import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.generation.items.TerraStructure; public class StructureFactory implements TerraFactory { @Override - public TerraStructure build(StructureTemplate config, Terra main) throws LoadException { + public TerraStructure build(StructureTemplate config, TerraPlugin main) throws LoadException { return new TerraStructure(config.getStructures(), config.getBound(), config.getY(), config.getSpawn(), config.getLoot(), config); } } diff --git a/src/main/java/com/dfsek/terra/config/factories/TerraFactory.java b/src/main/java/com/dfsek/terra/config/factories/TerraFactory.java index ebc4d87d7..13049b1a5 100644 --- a/src/main/java/com/dfsek/terra/config/factories/TerraFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/TerraFactory.java @@ -2,8 +2,8 @@ package com.dfsek.terra.config.factories; import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.generic.TerraPlugin; public interface TerraFactory { - O build(C config, Terra main) throws LoadException; + O build(C config, TerraPlugin main) throws LoadException; } diff --git a/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java b/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java index 049b51199..01e0bc6df 100644 --- a/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java @@ -1,14 +1,14 @@ package com.dfsek.terra.config.factories; import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.terra.Terra; import com.dfsek.terra.api.gaea.tree.Tree; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.config.templates.TreeTemplate; import com.dfsek.terra.generation.items.tree.TerraTree; public class TreeFactory implements TerraFactory { @Override - public Tree build(TreeTemplate config, Terra main) throws LoadException { + public Tree build(TreeTemplate config, TerraPlugin main) throws LoadException { return new TerraTree(config.getSpawnable(), config.getyOffset(), config.getStructures()); } } diff --git a/src/main/java/com/dfsek/terra/config/lang/LangUtil.java b/src/main/java/com/dfsek/terra/config/lang/LangUtil.java index 746b3e1fb..9455de92d 100644 --- a/src/main/java/com/dfsek/terra/config/lang/LangUtil.java +++ b/src/main/java/com/dfsek/terra/config/lang/LangUtil.java @@ -1,6 +1,6 @@ package com.dfsek.terra.config.lang; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.lang.Language; import com.dfsek.terra.debug.Debug; import org.bukkit.command.CommandSender; @@ -23,7 +23,7 @@ public final class LangUtil { public static void load(String langID, JavaPlugin main) { logger = main.getLogger(); File file = new File(main.getDataFolder(), "lang"); - try(JarFile jar = new JarFile(new File(Terra.class.getProtectionDomain().getCodeSource().getLocation().toURI()))) { + try(JarFile jar = new JarFile(new File(TerraBukkitPlugin.class.getProtectionDomain().getCodeSource().getLocation().toURI()))) { copyResourcesToDirectory(jar, "lang", file.toString()); } catch(IOException | URISyntaxException e) { Debug.error("Failed to dump language files!"); diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java b/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java index 7b09b4701..66c17da32 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java @@ -3,11 +3,11 @@ package com.dfsek.terra.config.loaders.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.gaea.GaeaPlugin; import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.tree.Tree; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.config.loaders.Types; import com.dfsek.terra.generation.items.tree.TreeLayer; @@ -16,9 +16,9 @@ import java.util.Map; @SuppressWarnings("unchecked") public class TreeLayerLoader implements TypeLoader { - private final GaeaPlugin main; + private final TerraPlugin main; - public TreeLayerLoader(GaeaPlugin main) { + public TreeLayerLoader(TerraPlugin main) { this.main = main; } @@ -33,9 +33,9 @@ public class TreeLayerLoader implements TypeLoader { if(map.containsKey("simplex-frequency")) { FastNoiseLite noiseLite = new FastNoiseLite(); noiseLite.setFrequency((Double) map.get("simplex-frequency")); - return new TreeLayer(density, range, items, noiseLite, main); + return new TreeLayer(density, range, items, noiseLite); } - return new TreeLayer(density, range, items, null, main); + return new TreeLayer(density, range, items, null); } } diff --git a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index aa642aa63..f31a012e4 100644 --- a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -7,8 +7,10 @@ import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.generic.world.Biome; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.biome.palette.PaletteHolder; -import com.dfsek.terra.biome.palette.SinglePalette; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.generation.items.TerraStructure; @@ -16,9 +18,6 @@ import com.dfsek.terra.generation.items.flora.FloraLayer; import com.dfsek.terra.generation.items.ores.OreHolder; import com.dfsek.terra.generation.items.tree.TreeLayer; import com.dfsek.terra.math.BlankFunction; -import org.bukkit.Material; -import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; import parsii.eval.Parser; import parsii.eval.Scope; import parsii.tokenizer.ParseException; @@ -74,7 +73,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf @Value("ocean.palette") @Abstractable @Default - private Palette oceanPalette = new SinglePalette<>(Material.WATER.createBlockData()); + private Palette oceanPalette = null; @Value("elevation.equation") @Default @@ -104,12 +103,12 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf @Value("slabs.palettes") @Abstractable @Default - private Map> slabPalettes; + private Map> slabPalettes; @Value("slabs.stair-palettes") @Abstractable @Default - private Map> stairPalettes; + private Map> stairPalettes; @Value("slant.threshold") @Abstractable @@ -145,11 +144,11 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf return doSlabs; } - public Map> getSlabPalettes() { + public Map> getSlabPalettes() { return slabPalettes; } - public Map> getStairPalettes() { + public Map> getStairPalettes() { return stairPalettes; } diff --git a/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java b/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java index ed9012618..22ecfe5bd 100644 --- a/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java +++ b/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java @@ -1,6 +1,6 @@ package com.dfsek.terra.debug.gui; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.image.ImageLoader; @@ -19,9 +19,9 @@ public class DebugFrame extends JFrame implements ActionListener { private final int x; private final int z; private final BufferedImage img; - private final Terra main; + private final TerraBukkitPlugin main; - public DebugFrame(BufferedImage image, String s, Terra main) { + public DebugFrame(BufferedImage image, String s, TerraBukkitPlugin main) { super(s); this.x = image.getWidth(); this.z = image.getHeight(); diff --git a/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java b/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java index ecca7eace..3dfcf2a0b 100644 --- a/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java +++ b/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java @@ -1,6 +1,6 @@ package com.dfsek.terra.debug.gui; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import javax.swing.*; import java.awt.*; @@ -9,9 +9,9 @@ import java.awt.image.BufferedImage; public class DebugGUI extends Thread { private final BufferedImage img; - private final Terra main; + private final TerraBukkitPlugin main; - public DebugGUI(BufferedImage img, Terra main) { + public DebugGUI(BufferedImage img, TerraBukkitPlugin main) { this.img = img; this.main = main; } diff --git a/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java similarity index 90% rename from src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java rename to src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index a3cc4bee6..333e68f3b 100644 --- a/src/main/java/com/dfsek/terra/generation/ChunkGeneratorImpl.java +++ b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -1,7 +1,7 @@ package com.dfsek.terra.generation; -import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.ChunkInterpolator3; @@ -9,7 +9,6 @@ import com.dfsek.terra.api.gaea.population.PopulationManager; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.generic.generator.BlockPopulator; import com.dfsek.terra.api.generic.generator.ChunkGenerator; import com.dfsek.terra.api.generic.world.BiomeGrid; import com.dfsek.terra.api.generic.world.Chunk; @@ -27,21 +26,19 @@ import org.jetbrains.annotations.NotNull; import java.io.FileNotFoundException; import java.io.IOException; -import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Random; import java.util.logging.Level; -public class ChunkGeneratorImpl implements ChunkGenerator { +public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generator.TerraChunkGenerator { private static final Map popMap = new HashMap<>(); private final PopulationManager popMan; private final ConfigPack configPack; - private final Terra main; + private final TerraBukkitPlugin main; private boolean needsLoad = true; - public ChunkGeneratorImpl(ConfigPack c, Terra main) { + public TerraChunkGenerator(ConfigPack c, TerraBukkitPlugin main) { popMan = new PopulationManager(main); this.configPack = c; this.main = main; @@ -62,7 +59,7 @@ public class ChunkGeneratorImpl implements ChunkGenerator { } public static synchronized void fixChunk(Chunk c) { - if(!(c.getWorld().getGenerator() instanceof ChunkGeneratorImpl)) throw new IllegalArgumentException(); + if(!(c.getWorld().getGenerator() instanceof TerraChunkGenerator)) throw new IllegalArgumentException(); popMap.get(c.getWorld()).checkNeighbors(c.getX(), c.getZ(), c.getWorld()); } @@ -92,7 +89,13 @@ public class ChunkGeneratorImpl implements ChunkGenerator { } @Override - public ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome, ChunkData chunk) { + public ConfigPack getConfigPack() { + return configPack; + } + + + @Override + public void generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome, ChunkGenerator.ChunkData chunk) { TerraWorld tw = main.getWorld(world); com.dfsek.terra.api.gaea.biome.BiomeGrid grid = tw.getGrid(); try(ProfileFuture ignore = tw.getProfiler().measure("TotalChunkGenTime")) { @@ -101,7 +104,7 @@ public class ChunkGeneratorImpl implements ChunkGenerator { interp = new ChunkInterpolator3(world, chunkX, chunkZ, tw.getGrid()); if(needsLoad) load(world); // Load population data for world. - if(!tw.isSafe()) return chunk; + if(!tw.isSafe()) return; int xOrig = (chunkX << 4); int zOrig = (chunkZ << 4); @@ -166,12 +169,6 @@ public class ChunkGeneratorImpl implements ChunkGenerator { } } } - return chunk; - } - - @Override - public List getDefaultPopulators(World world) { - return Collections.emptyList(); } public void attachProfiler(WorldProfiler p) { diff --git a/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java b/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java index 84fc589f7..2c2bb2ce6 100644 --- a/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java +++ b/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java @@ -1,15 +1,14 @@ package com.dfsek.terra.generation.config; import com.dfsek.terra.api.gaea.biome.Generator; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.Interpolator; import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.math.NoiseFunction2; import com.dfsek.terra.math.NoiseFunction3; import com.dfsek.terra.math.RandomFunction; -import org.bukkit.World; -import org.bukkit.block.data.BlockData; import parsii.eval.Expression; import parsii.eval.Parser; import parsii.eval.Scope; @@ -91,15 +90,7 @@ public class WorldGenerator extends Generator { } @Override - public synchronized double getNoise(FastNoiseLite fastNoiseLite, World world, int x, int z) { - xVar.setValue(x); - yVar.setValue(0); - zVar.setValue(z); - return noiseExp.evaluate(); - } - - @Override - public synchronized double getNoise(FastNoiseLite fastNoiseLite, World world, int x, int y, int z) { + public synchronized double getNoise(World world, int x, int y, int z) { xVar.setValue(x); yVar.setValue(y); zVar.setValue(z); diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java b/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java index 713c08bb2..2ee756d69 100644 --- a/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java +++ b/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation.items.flora; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.util.GlueList; @@ -41,9 +41,9 @@ public class TerraFlora implements Flora { private final int irrigableOffset; - private final Terra main; + private final TerraBukkitPlugin main; - public TerraFlora(Palette floraPalette, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, Terra main) { + public TerraFlora(Palette floraPalette, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, TerraBukkitPlugin main) { this.floraPalette = floraPalette; this.physics = physics; this.testRotation = testRotation; diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java b/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java index 985ffc53a..d014693a5 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java +++ b/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation.items.ores; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.generic.world.WorldHandle; @@ -17,7 +17,7 @@ public class DeformedSphereOre extends Ore { private final double deformFrequency; private final Range size; - public DeformedSphereOre(BlockData material, MaterialSet replaceable, boolean applyGravity, double deform, double deformFrequency, Range size, Terra main) { + public DeformedSphereOre(BlockData material, MaterialSet replaceable, boolean applyGravity, double deform, double deformFrequency, Range size, TerraBukkitPlugin main) { super(material, replaceable, applyGravity, main); this.deform = deform; this.deformFrequency = deformFrequency; diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java b/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java index 84ee34db9..0083244ba 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java +++ b/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation.items.ores; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.util.MaterialSet; import org.bukkit.Chunk; import org.bukkit.block.data.BlockData; @@ -13,9 +13,9 @@ public abstract class Ore { private final BlockData material; private final MaterialSet replaceable; private final boolean applyGravity; - protected Terra main; + protected TerraBukkitPlugin main; - public Ore(BlockData material, MaterialSet replaceable, boolean applyGravity, Terra main) { + public Ore(BlockData material, MaterialSet replaceable, boolean applyGravity, TerraBukkitPlugin main) { this.material = material; this.replaceable = replaceable; diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java b/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java index dfcc09726..0d236570a 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java +++ b/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation.items.ores; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.util.MaterialSet; @@ -16,7 +16,7 @@ import java.util.Random; public class VanillaOre extends Ore { private final Range sizeRange; - public VanillaOre(BlockData material, MaterialSet replaceable, boolean applyGravity, Range size, Terra main) { + public VanillaOre(BlockData material, MaterialSet replaceable, boolean applyGravity, Range size, TerraBukkitPlugin main) { super(material, replaceable, applyGravity, main); this.sizeRange = size; } diff --git a/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index c73e9d1c6..4c767eea9 100644 --- a/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation.items.tree; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.generic.world.vector.Vector2; @@ -32,8 +32,8 @@ public class TerraTree implements Tree { if(!spawnable.contains(location.getBlock().getType())) return false; Structure struc = structure.get(random); Rotation rotation = Rotation.fromDegrees(random.nextInt(4) * 90); - if(!struc.checkSpawns(mut, rotation, (Terra) main)) return false; - struc.paste(mut, rotation, (Terra) main); + if(!struc.checkSpawns(mut, rotation, (TerraBukkitPlugin) main)) return false; + struc.paste(mut, rotation, (TerraBukkitPlugin) main); return true; } @@ -42,7 +42,7 @@ public class TerraTree implements Tree { return spawnable; } - public boolean plantBlockCheck(Location location, Random random, Terra main) { + public boolean plantBlockCheck(Location location, Random random, TerraBukkitPlugin main) { Location mut = location.clone().subtract(0, yOffset, 0); if(!spawnable.contains(location.getBlock().getType())) return false; Structure struc = structure.get(random); diff --git a/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java b/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java index 88a1a117f..1c8dd74d7 100644 --- a/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java +++ b/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java @@ -1,6 +1,5 @@ package com.dfsek.terra.generation.items.tree; -import com.dfsek.terra.api.gaea.GaeaPlugin; import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.math.Range; @@ -15,11 +14,9 @@ import org.bukkit.block.BlockFace; import java.util.Random; public class TreeLayer extends PlaceableLayer { - private final GaeaPlugin main; - public TreeLayer(double density, Range level, ProbabilityCollection layer, FastNoiseLite noise, GaeaPlugin main) { + public TreeLayer(double density, Range level, ProbabilityCollection layer, FastNoiseLite noise) { super(density, level, layer, noise); - this.main = main; } @Override @@ -30,8 +27,8 @@ public class TreeLayer extends PlaceableLayer { current = current.getRelative(BlockFace.DOWN); if(item.getSpawnable().contains(current.getType())) { if(item instanceof TreeType && current.getRelative(BlockFace.UP).isEmpty()) - item.plant(current.getLocation().add(0, 1, 0), random, main); - else if(!(item instanceof TreeType)) item.plant(current.getLocation(), random, main); + item.plant(current.getLocation().add(0, 1, 0), random); + else if(!(item instanceof TreeType)) item.plant(current.getLocation(), random); } } } diff --git a/src/main/java/com/dfsek/terra/image/ImageLoader.java b/src/main/java/com/dfsek/terra/image/ImageLoader.java index ed90deeca..b2fd9d39f 100644 --- a/src/main/java/com/dfsek/terra/image/ImageLoader.java +++ b/src/main/java/com/dfsek/terra/image/ImageLoader.java @@ -1,12 +1,12 @@ package com.dfsek.terra.image; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.biome.NormalizationUtil; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.debug.gui.DebugGUI; import net.jafama.FastMath; -import org.bukkit.World; import javax.imageio.ImageIO; import java.awt.*; @@ -24,7 +24,7 @@ public class ImageLoader { this.align = align; } - public static void debugWorld(boolean genStep, World w, Terra main) { + public static void debugWorld(boolean genStep, World w, TerraBukkitPlugin main) { if(!main.isDebug()) return; BufferedImage newImg = new WorldImageGenerator(w, 1024, 1024, main).drawWorld(0, 0).getDraw(); if(genStep) newImg = redrawStepped(newImg, w, Align.CENTER, main); @@ -32,7 +32,7 @@ public class ImageLoader { debugGUI.start(); } - private static BufferedImage redrawStepped(BufferedImage original, World w, Align align, Terra main) { + private static BufferedImage redrawStepped(BufferedImage original, World w, Align align, TerraBukkitPlugin main) { BufferedImage newImg = copyImage(original); TerraBiomeGrid tb = main.getWorld(w).getGrid(); BiomeZone z = main.getWorld(w).getZone(); @@ -59,7 +59,7 @@ public class ImageLoader { return b; } - public void debug(boolean genStep, World w, Terra main) { + public void debug(boolean genStep, World w, TerraBukkitPlugin main) { if(!main.isDebug()) return; BufferedImage newImg = copyImage(image); if(genStep) { diff --git a/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java b/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java index 7669c530f..b81ef9864 100644 --- a/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java +++ b/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java @@ -1,10 +1,10 @@ package com.dfsek.terra.image; -import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.biome.NormalizationUtil; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import org.bukkit.World; import javax.imageio.ImageIO; import java.awt.*; @@ -15,9 +15,9 @@ import java.io.IOException; public class WorldImageGenerator { private final World w; private final BufferedImage draw; - private final Terra main; + private final TerraBukkitPlugin main; - public WorldImageGenerator(World w, int width, int height, Terra main) { + public WorldImageGenerator(World w, int width, int height, TerraBukkitPlugin main) { draw = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); this.w = w; this.main = main; diff --git a/src/main/java/com/dfsek/terra/listeners/EventListener.java b/src/main/java/com/dfsek/terra/listeners/EventListener.java index 239983013..e79751598 100644 --- a/src/main/java/com/dfsek/terra/listeners/EventListener.java +++ b/src/main/java/com/dfsek/terra/listeners/EventListener.java @@ -1,7 +1,7 @@ package com.dfsek.terra.listeners; -import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.tree.TreeType; import com.dfsek.terra.api.gaea.util.FastRandom; @@ -20,9 +20,9 @@ import org.bukkit.event.world.StructureGrowEvent; * Listener for events on all implementations. */ public class EventListener implements Listener { - private final Terra main; + private final TerraBukkitPlugin main; - public EventListener(Terra main) { + public EventListener(TerraBukkitPlugin main) { this.main = main; } diff --git a/src/main/java/com/dfsek/terra/listeners/SpigotListener.java b/src/main/java/com/dfsek/terra/listeners/SpigotListener.java index 0e1147a7d..0d5196fb1 100644 --- a/src/main/java/com/dfsek/terra/listeners/SpigotListener.java +++ b/src/main/java/com/dfsek/terra/listeners/SpigotListener.java @@ -1,7 +1,7 @@ package com.dfsek.terra.listeners; -import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.async.AsyncStructureFinder; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.items.TerraStructure; @@ -24,9 +24,9 @@ import org.bukkit.event.entity.VillagerCareerChangeEvent; * StructureLocateEvent). */ public class SpigotListener implements Listener { - private final Terra main; + private final TerraBukkitPlugin main; - public SpigotListener(Terra main) { + public SpigotListener(TerraBukkitPlugin main) { this.main = main; } diff --git a/src/main/java/com/dfsek/terra/population/CavePopulator.java b/src/main/java/com/dfsek/terra/population/CavePopulator.java index f216da84b..ab7040856 100644 --- a/src/main/java/com/dfsek/terra/population/CavePopulator.java +++ b/src/main/java/com/dfsek/terra/population/CavePopulator.java @@ -1,7 +1,7 @@ package com.dfsek.terra.population; -import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.carving.UserDefinedCarver; @@ -24,11 +24,11 @@ import java.util.Random; import java.util.Set; public class CavePopulator extends BlockPopulator { - private final Terra main; + private final TerraBukkitPlugin main; private static final Map shiftStorage = new HashMap<>(); // Persist BlockData created for shifts, to avoid re-calculating each time. private static final BlockData AIR = Material.AIR.createBlockData(); - public CavePopulator(Terra main) { + public CavePopulator(TerraBukkitPlugin main) { this.main = main; } diff --git a/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/src/main/java/com/dfsek/terra/population/FloraPopulator.java index 2553382d0..d75a8d289 100644 --- a/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -1,7 +1,7 @@ package com.dfsek.terra.population; -import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.population.GaeaBlockPopulator; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; @@ -22,9 +22,9 @@ import java.util.Random; * Populates Flora and Trees */ public class FloraPopulator extends GaeaBlockPopulator { - private final Terra main; + private final TerraBukkitPlugin main; - public FloraPopulator(Terra main) { + public FloraPopulator(TerraBukkitPlugin main) { this.main = main; } diff --git a/src/main/java/com/dfsek/terra/population/OrePopulator.java b/src/main/java/com/dfsek/terra/population/OrePopulator.java index bf908b9fb..da112186f 100644 --- a/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -1,7 +1,7 @@ package com.dfsek.terra.population; -import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.MathUtil; @@ -18,9 +18,9 @@ import org.jetbrains.annotations.NotNull; import java.util.Random; public class OrePopulator extends GaeaBlockPopulator { - private final Terra main; + private final TerraBukkitPlugin main; - public OrePopulator(Terra main) { + public OrePopulator(TerraBukkitPlugin main) { this.main = main; } diff --git a/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/src/main/java/com/dfsek/terra/population/StructurePopulator.java index 986031e65..ebe45f5c4 100644 --- a/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -1,7 +1,7 @@ package com.dfsek.terra.population; -import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.gaea.structures.loot.LootTable; import com.dfsek.terra.api.gaea.util.FastRandom; @@ -28,9 +28,9 @@ import org.jetbrains.annotations.NotNull; import java.util.Random; public class StructurePopulator extends BlockPopulator { - private final Terra main; + private final TerraBukkitPlugin main; - public StructurePopulator(Terra main) { + public StructurePopulator(TerraBukkitPlugin main) { this.main = main; } diff --git a/src/main/java/com/dfsek/terra/population/TreePopulator.java b/src/main/java/com/dfsek/terra/population/TreePopulator.java index 6ad922681..674954326 100644 --- a/src/main/java/com/dfsek/terra/population/TreePopulator.java +++ b/src/main/java/com/dfsek/terra/population/TreePopulator.java @@ -1,7 +1,7 @@ package com.dfsek.terra.population; -import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.population.GaeaBlockPopulator; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; @@ -18,9 +18,9 @@ import java.util.Random; public class TreePopulator extends GaeaBlockPopulator { - private final Terra main; + private final TerraBukkitPlugin main; - public TreePopulator(Terra main) { + public TreePopulator(TerraBukkitPlugin main) { this.main = main; } diff --git a/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java b/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java index 54037ac2c..820674e7c 100644 --- a/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.registry; import com.dfsek.tectonic.exception.ConfigException; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.debug.Debug; @@ -13,12 +13,12 @@ import java.util.zip.ZipFile; * Class to hold config packs */ public class ConfigRegistry extends TerraRegistry { - public void load(File folder, Terra main) throws ConfigException { + public void load(File folder, TerraBukkitPlugin main) throws ConfigException { ConfigPack pack = new ConfigPack(folder, main); add(pack.getTemplate().getID(), pack); } - public boolean loadAll(Terra main) { + public boolean loadAll(TerraBukkitPlugin main) { boolean valid = true; File packsFolder = new File(main.getDataFolder(), "packs"); for(File dir : packsFolder.listFiles(File::isDirectory)) { @@ -41,7 +41,7 @@ public class ConfigRegistry extends TerraRegistry { return valid; } - public void load(ZipFile file, Terra main) throws ConfigException { + public void load(ZipFile file, TerraBukkitPlugin main) throws ConfigException { ConfigPack pack = new ConfigPack(file, main); add(pack.getTemplate().getID(), pack); } diff --git a/src/main/java/com/dfsek/terra/structure/Structure.java b/src/main/java/com/dfsek/terra/structure/Structure.java index 661dbe961..0535377f6 100644 --- a/src/main/java/com/dfsek/terra/structure/Structure.java +++ b/src/main/java/com/dfsek/terra/structure/Structure.java @@ -1,6 +1,6 @@ package com.dfsek.terra.structure; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.vector.Vector2; @@ -163,7 +163,7 @@ public class Structure implements Serializable { * @param origin Origin location * @param r Rotation */ - public void paste(@NotNull Location origin, Rotation r, Terra main) { + public void paste(@NotNull Location origin, Rotation r, TerraBukkitPlugin main) { Range xRange = getRange(Rotation.Axis.X, r); Range zRange = getRange(Rotation.Axis.Z, r); this.executeForBlocksInRange(xRange, getRange(Rotation.Axis.Y, r), zRange, block -> pasteBlock(block, origin, r, main.getHandle()), r); @@ -286,7 +286,7 @@ public class Structure implements Serializable { } } - public boolean checkSpawns(Location origin, Rotation r, Terra main) { + public boolean checkSpawns(Location origin, Rotation r, TerraBukkitPlugin main) { for(StructureContainedBlock b : spawns) { Vector2 rot = getRotatedCoords(new Vector2(b.getX() - structureInfo.getCenterX(), b.getZ() - structureInfo.getCenterZ()), r); if(!b.getRequirement().getInstance(origin.getWorld(), main).matches((int) rot.getX() + origin.getBlockX(), origin.getBlockY() + b.getY(), (int) rot.getZ() + origin.getBlockZ())) @@ -310,7 +310,7 @@ public class Structure implements Serializable { * @param chunk Chunk to confine pasting to * @param r Rotation */ - public void paste(Location origin, Chunk chunk, Rotation r, Terra main) { + public void paste(Location origin, Chunk chunk, Rotation r, TerraBukkitPlugin main) { int xOr = (chunk.getX() << 4); int zOr = (chunk.getZ() << 4); Range intersectX = new Range(xOr, xOr + 16).sub(origin.getBlockX() - structureInfo.getCenterX()); diff --git a/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java b/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java index 18ef6605c..b7d793ca3 100644 --- a/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java +++ b/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java @@ -1,6 +1,6 @@ package com.dfsek.terra.structure; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.structure.spawn.AirSpawn; import com.dfsek.terra.structure.spawn.BlankSpawn; import com.dfsek.terra.structure.spawn.LandSpawn; @@ -13,26 +13,26 @@ import java.io.Serializable; public enum StructureSpawnRequirement implements Serializable { AIR { @Override - public Requirement getInstance(World world, Terra main) { + public Requirement getInstance(World world, TerraBukkitPlugin main) { return new AirSpawn(world, main); } }, OCEAN { @Override - public Requirement getInstance(World world, Terra main) { + public Requirement getInstance(World world, TerraBukkitPlugin main) { return new OceanSpawn(world, main); } }, LAND { @Override - public Requirement getInstance(World world, Terra main) { + public Requirement getInstance(World world, TerraBukkitPlugin main) { return new LandSpawn(world, main); } }, BLANK { @Override - public Requirement getInstance(World world, Terra main) { + public Requirement getInstance(World world, TerraBukkitPlugin main) { return new BlankSpawn(); } }; private static final long serialVersionUID = -175639605885943679L; - public abstract Requirement getInstance(World world, Terra main); + public abstract Requirement getInstance(World world, TerraBukkitPlugin main); } diff --git a/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java index bbe6b0c00..e60165913 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java @@ -1,7 +1,7 @@ package com.dfsek.terra.structure.spawn; -import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; @@ -9,7 +9,7 @@ import com.dfsek.terra.generation.config.WorldGenerator; import org.bukkit.World; public class AirSpawn extends Requirement { - public AirSpawn(World world, Terra main) { + public AirSpawn(World world, TerraBukkitPlugin main) { super(world, main); } diff --git a/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java index 6282cd618..69d5346de 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java @@ -1,14 +1,14 @@ package com.dfsek.terra.structure.spawn; -import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.generation.config.WorldGenerator; import org.bukkit.World; public class LandSpawn extends Requirement { - public LandSpawn(World world, Terra main) { + public LandSpawn(World world, TerraBukkitPlugin main) { super(world, main); } diff --git a/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java index 5953d095a..19a65087a 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java @@ -1,7 +1,7 @@ package com.dfsek.terra.structure.spawn; -import com.dfsek.terra.Terra; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; @@ -9,7 +9,7 @@ import com.dfsek.terra.generation.config.WorldGenerator; import org.bukkit.World; public class OceanSpawn extends Requirement { - public OceanSpawn(World world, Terra main) { + public OceanSpawn(World world, TerraBukkitPlugin main) { super(world, main); } diff --git a/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java b/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java index dd23438f2..acdccf78f 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java @@ -1,6 +1,6 @@ package com.dfsek.terra.structure.spawn; -import com.dfsek.terra.Terra; +import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.math.FastNoiseLite; import org.bukkit.World; @@ -8,9 +8,9 @@ import java.util.Objects; public abstract class Requirement { protected final World world; - protected final Terra main; + protected final TerraBukkitPlugin main; - public Requirement(World world, Terra main) { + public Requirement(World world, TerraBukkitPlugin main) { this.world = world; this.main = main; } diff --git a/src/main/java/com/dfsek/terra/util/PaletteUtil.java b/src/main/java/com/dfsek/terra/util/PaletteUtil.java index 2fc61334a..8d3a6767b 100644 --- a/src/main/java/com/dfsek/terra/util/PaletteUtil.java +++ b/src/main/java/com/dfsek/terra/util/PaletteUtil.java @@ -1,20 +1,13 @@ package com.dfsek.terra.util; -import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.gaea.world.palette.RandomPalette; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.Sampler; import com.dfsek.terra.math.MathUtil; -import org.bukkit.Material; -import org.bukkit.block.data.BlockData; public final class PaletteUtil { - public static final BlockData WATER = Material.WATER.createBlockData(); - public static final BlockData AIR = Material.AIR.createBlockData(); - public static final Palette BLANK_PALETTE = new RandomPalette(new FastRandom(2403)).add(AIR, 1); - public static Palette getPalette(int x, int y, int z, BiomeTemplate c, Sampler sampler) { PaletteHolder slant = c.getSlantPalette(); if(slant != null && MathUtil.derivative(sampler, x, y, z) > c.getSlantThreshold()) { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 3e6c3fd79..6dc8aa00b 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: "Terra" -main: "com.dfsek.terra.Terra" +main: "com.dfsek.terra.api.bukkit.Terra" version: "@VERSION@" load: "STARTUP" api-version: "1.16" From dbf4b4dd3bc8b6ba768e0964d63e326da01252f2 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 20:39:55 -0700 Subject: [PATCH 013/210] Implementation go brrrr --- .../dfsek/terra/api/bukkit/BukkitWorld.java | 23 ++++++-- .../terra/api/bukkit/TerraBukkitPlugin.java | 1 + .../gaea/population/GaeaBlockPopulator.java | 11 ---- .../gaea/population/PopulationManager.java | 12 ++-- .../com/dfsek/terra/api/gaea/tree/Tree.java | 7 ++- .../com/dfsek/terra/api/gaea/world/Flora.java | 6 +- .../dfsek/terra/api/generic/TerraPlugin.java | 3 + .../generator/TerraBlockPopulator.java | 10 ++++ .../terra/api/generic/world/BiomeGrid.java | 2 - .../dfsek/terra/api/generic/world/Chunk.java | 3 + .../dfsek/terra/api/generic/world/World.java | 6 ++ .../terra/api/generic/world/WorldHandle.java | 9 ++- .../terra/api/generic/world/block/Block.java | 17 ++++++ .../api/generic/world/block/BlockData.java | 4 +- .../api/generic/world/block/MaterialData.java | 1 + .../world/block/data/MultipleFacing.java | 12 ++++ .../generic/world/block/data/Rotatable.java | 10 ++++ .../api/generic/world/vector/Location.java | 41 ++++++++++++++ .../com/dfsek/terra/carving/CarverCache.java | 6 +- .../java/com/dfsek/terra/carving/Cavern.java | 55 ------------------- .../terra/carving/UserDefinedCarver.java | 6 +- .../terra/config/factories/OreFactory.java | 2 +- .../config/loaders/MaterialSetLoader.java | 3 +- .../loaders/palette/PaletteHolderLoader.java | 2 +- .../terra/config/templates/OreTemplate.java | 2 +- .../terra/generation/TerraChunkGenerator.java | 2 + .../generation/items/PlaceableLayer.java | 2 +- .../generation/items/flora/BlockFlora.java | 12 ++-- .../generation/items/flora/FloraLayer.java | 3 +- .../generation/items/flora/TerraFlora.java | 22 ++++---- .../items/ores/DeformedSphereOre.java | 16 +++--- .../terra/generation/items/ores/Ore.java | 14 ++--- .../generation/items/ores/VanillaOre.java | 14 ++--- .../generation/items/tree/TreeLayer.java | 6 +- .../dfsek/terra/population/CavePopulator.java | 33 ++++------- .../terra/population/FloraPopulator.java | 8 +-- .../dfsek/terra/population/OrePopulator.java | 12 ++-- .../terra/population/StructurePopulator.java | 30 +++------- .../dfsek/terra/population/TreePopulator.java | 8 +-- .../com/dfsek/terra/procgen/GridSpawn.java | 16 +++--- .../com/dfsek/terra/structure/Structure.java | 24 ++++---- .../structure/StructureSpawnRequirement.java | 2 +- .../dfsek/terra/structure/spawn/AirSpawn.java | 4 +- .../terra/structure/spawn/LandSpawn.java | 4 +- .../terra/structure/spawn/OceanSpawn.java | 4 +- .../terra/structure/spawn/Requirement.java | 8 +-- .../com/dfsek/terra/util/MaterialSet.java | 10 ++-- .../java/com/dfsek/terra/util/SlabUtil.java | 4 +- .../java/com/dfsek/terra/util/TagUtil.java | 17 +++--- 49 files changed, 276 insertions(+), 253 deletions(-) delete mode 100644 src/main/java/com/dfsek/terra/api/gaea/population/GaeaBlockPopulator.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/generator/TerraBlockPopulator.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/block/data/MultipleFacing.java create mode 100644 src/main/java/com/dfsek/terra/api/generic/world/block/data/Rotatable.java delete mode 100644 src/main/java/com/dfsek/terra/carving/Cavern.java diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java index 0af1b0652..3aa4b5a78 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java @@ -1,9 +1,12 @@ package com.dfsek.terra.api.bukkit; import com.dfsek.terra.api.bukkit.generator.BukkitChunkGenerator; +import com.dfsek.terra.api.bukkit.world.block.BukkitBlock; import com.dfsek.terra.api.generic.generator.ChunkGenerator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.vector.Location; import java.io.File; import java.util.UUID; @@ -32,27 +35,37 @@ public class BukkitWorld implements World { @Override public String getName() { - return null; + return delegate.getName(); } @Override public UUID getUID() { - return null; + return delegate.getUID(); } @Override public boolean isChunkGenerated(int x, int z) { - return false; + return delegate.isChunkGenerated(x, z); } @Override public Chunk getChunkAt(int x, int z) { - return null; + return new BukkitChunk(delegate.getChunkAt(x, z)); } @Override public File getWorldFolder() { - return null; + return delegate.getWorldFolder(); + } + + @Override + public Block getBlockAt(int x, int y, int z) { + return new BukkitBlock(delegate.getBlockAt(x, y, z)); + } + + @Override + public Block getBlockAt(Location l) { + return new BukkitBlock(delegate.getBlockAt(l.getBlockX(), l.getBlockY(), l.getBlockZ())); } @Override diff --git a/src/main/java/com/dfsek/terra/api/bukkit/TerraBukkitPlugin.java b/src/main/java/com/dfsek/terra/api/bukkit/TerraBukkitPlugin.java index 9bd692ca0..b2c55729f 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/TerraBukkitPlugin.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/TerraBukkitPlugin.java @@ -137,6 +137,7 @@ public class TerraBukkitPlugin extends GaeaPlugin implements TerraPlugin { } @NotNull + @Override public PluginConfig getTerraConfig() { return config; } diff --git a/src/main/java/com/dfsek/terra/api/gaea/population/GaeaBlockPopulator.java b/src/main/java/com/dfsek/terra/api/gaea/population/GaeaBlockPopulator.java deleted file mode 100644 index a074deca9..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/population/GaeaBlockPopulator.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dfsek.terra.api.gaea.population; - -import org.bukkit.Chunk; -import org.bukkit.World; -import org.jetbrains.annotations.NotNull; - -import java.util.Random; - -public abstract class GaeaBlockPopulator { - public abstract void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk); -} diff --git a/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java b/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java index fbf3d78db..c790b63a7 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java +++ b/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java @@ -7,7 +7,7 @@ import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.gaea.util.SerializationUtil; import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.generator.BlockPopulator; +import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import org.jetbrains.annotations.NotNull; @@ -18,22 +18,22 @@ import java.util.HashSet; import java.util.List; import java.util.Random; -public class PopulationManager implements BlockPopulator { - private final List attachedPopulators = new GlueList<>(); +public class PopulationManager implements TerraBlockPopulator { + private final List attachedPopulators = new GlueList<>(); private final HashSet needsPop = new HashSet<>(); private final TerraPlugin main; - private final Object popLock = new Object(); private WorldProfiler profiler; public PopulationManager(TerraPlugin main) { this.main = main; } - public void attach(BlockPopulator populator) { + public void attach(TerraBlockPopulator populator) { this.attachedPopulators.add(populator); } @Override + @SuppressWarnings("try") public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) { try(ProfileFuture ignored = measure()) { needsPop.add(new ChunkCoordinate(chunk)); @@ -85,7 +85,7 @@ public class PopulationManager implements BlockPopulator { long zRand = (random.nextLong() / 2L << 1L) + 1L; random.setSeed((long) x * xRand + (long) z * zRand ^ w.getSeed()); Chunk currentChunk = w.getChunkAt(x, z); - for(BlockPopulator r : attachedPopulators) { + for(TerraBlockPopulator r : attachedPopulators) { r.populate(w, random, currentChunk); } needsPop.remove(c); diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java b/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java index 0923f0635..5b78a34d4 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java @@ -1,7 +1,8 @@ package com.dfsek.terra.api.gaea.tree; -import org.bukkit.Location; -import org.bukkit.Material; + +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.vector.Location; import java.util.Random; import java.util.Set; @@ -9,5 +10,5 @@ import java.util.Set; public interface Tree { boolean plant(Location l, Random r); - Set getSpawnable(); + Set getSpawnable(); } diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java b/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java index c83e6a800..bd1aa95ea 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java +++ b/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.gaea.world; import com.dfsek.terra.api.gaea.math.Range; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.block.Block; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.vector.Location; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java b/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java index ac7ff029c..c96f2b94e 100644 --- a/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java +++ b/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java @@ -4,6 +4,7 @@ import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.config.base.PluginConfig; import java.util.logging.Logger; @@ -15,4 +16,6 @@ public interface TerraPlugin extends LoaderRegistrar { TerraWorld getWorld(World world); Logger getLogger(); + + PluginConfig getTerraConfig(); } diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/TerraBlockPopulator.java b/src/main/java/com/dfsek/terra/api/generic/generator/TerraBlockPopulator.java new file mode 100644 index 000000000..bc6b6dfb8 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/generator/TerraBlockPopulator.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.generic.generator; + +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; + +import java.util.Random; + +public interface TerraBlockPopulator { + void populate(World world, Random random, Chunk chunk); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java b/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java index b2df137dd..8c1a08c88 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java @@ -11,7 +11,6 @@ public interface BiomeGrid extends Handle { * @param x - 0-15 * @param z - 0-15 * @return Biome value - * @deprecated biomes are now 3-dimensional */ @NotNull Biome getBiome(int x, int z); @@ -33,7 +32,6 @@ public interface BiomeGrid extends Handle { * @param x - 0-15 * @param z - 0-15 * @param bio - Biome value - * @deprecated biomes are now 3-dimensional */ void setBiome(int x, int z, @NotNull Biome bio); diff --git a/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java b/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java index 1c9ed6b1e..e83ef4ab5 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.generic.world; import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.generic.world.block.Block; public interface Chunk extends Handle { int getX(); @@ -8,4 +9,6 @@ public interface Chunk extends Handle { int getZ(); World getWorld(); + + Block getBlock(int x, int y, int z); } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/World.java b/src/main/java/com/dfsek/terra/api/generic/world/World.java index e32bc7309..e3ef05fbf 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/World.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/World.java @@ -2,6 +2,8 @@ package com.dfsek.terra.api.generic.world; import com.dfsek.terra.api.generic.Handle; import com.dfsek.terra.api.generic.generator.ChunkGenerator; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.vector.Location; import java.io.File; import java.util.UUID; @@ -22,4 +24,8 @@ public interface World extends Handle { Chunk getChunkAt(int x, int z); File getWorldFolder(); + + Block getBlockAt(int x, int y, int z); + + Block getBlockAt(Location l); } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java b/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java index 9936e42c7..1e33c4f50 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java @@ -1,9 +1,8 @@ package com.dfsek.terra.api.generic.world; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; /** * Interface to be implemented for world manipulation. @@ -13,9 +12,9 @@ public interface WorldHandle { BlockData getBlockData(Block block); - Material getType(Block block); + MaterialData getType(Block block); - com.dfsek.terra.api.generic.world.block.BlockData createBlockData(String data); + BlockData createBlockData(String data); MaterialData createMaterialData(String data); } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java b/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java index 691c1080f..6f439ffa5 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java @@ -1,9 +1,26 @@ package com.dfsek.terra.api.generic.world.block; import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.generic.world.vector.Location; public interface Block extends Handle { void setBlockData(BlockData data, boolean physics); BlockData getBlockData(); + + Block getRelative(BlockFace face); + + Block getRelative(BlockFace face, int len); + + boolean isEmpty(); + + Location getLocation(); + + MaterialData getType(); + + int getX(); + + int getZ(); + + int getY(); } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java b/src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java index 50200660d..2a9d02fb1 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java @@ -2,8 +2,10 @@ package com.dfsek.terra.api.generic.world.block; import com.dfsek.terra.api.generic.Handle; -public interface BlockData extends Handle, Cloneable { +public interface BlockData extends Cloneable, Handle { MaterialData getMaterial(); boolean matches(MaterialData materialData); + + BlockData clone(); } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java b/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java index d632c52d1..628192332 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java @@ -7,4 +7,5 @@ public interface MaterialData extends Handle { boolean matches(BlockData other); + boolean isSolid(); } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/data/MultipleFacing.java b/src/main/java/com/dfsek/terra/api/generic/world/block/data/MultipleFacing.java new file mode 100644 index 000000000..e07b1ce02 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/data/MultipleFacing.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.api.generic.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; + +import java.util.Set; + +public interface MultipleFacing extends BlockData { + Set getFaces(); + + void setFace(BlockFace face, boolean facing); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rotatable.java b/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rotatable.java new file mode 100644 index 000000000..25842bec7 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rotatable.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.generic.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; + +public interface Rotatable extends BlockData { + BlockFace getRotation(); + + void setRotation(BlockFace face); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java b/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java index 81fdf0b9d..62409e5b1 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.generic.world.vector; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.Block; public class Location implements Cloneable { private final World world; @@ -36,4 +37,44 @@ public class Location implements Cloneable { public int getBlockZ() { return vector.getBlockZ(); } + + public double getY() { + return vector.getY(); + } + + public Location setY(double y) { + vector.setY(y); + return this; + } + + public double getX() { + return vector.getX(); + } + + public Location setX(double x) { + vector.setX(x); + return this; + } + + public double getZ() { + return vector.getZ(); + } + + public Location setZ(double z) { + vector.setZ(z); + return this; + } + + public World getWorld() { + return world; + } + + public Location add(double x, double y, double z) { + vector.add(x, y, z); + return this; + } + + public Block getBlock() { + return world.getBlockAt(this); + } } diff --git a/src/main/java/com/dfsek/terra/carving/CarverCache.java b/src/main/java/com/dfsek/terra/carving/CarverCache.java index 041f4ec09..02c5040ab 100644 --- a/src/main/java/com/dfsek/terra/carving/CarverCache.java +++ b/src/main/java/com/dfsek/terra/carving/CarverCache.java @@ -1,12 +1,12 @@ package com.dfsek.terra.carving; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.gaea.world.carving.Worm; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.biome.UserDefinedBiome; @@ -21,9 +21,9 @@ public class CarverCache { private final World w; private final Map> carvers = new HashMap<>(); - private final TerraBukkitPlugin main; + private final TerraPlugin main; - public CarverCache(World w, TerraBukkitPlugin main) { + public CarverCache(World w, TerraPlugin main) { this.w = w; this.main = main; } diff --git a/src/main/java/com/dfsek/terra/carving/Cavern.java b/src/main/java/com/dfsek/terra/carving/Cavern.java deleted file mode 100644 index ca40a9cf0..000000000 --- a/src/main/java/com/dfsek/terra/carving/Cavern.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.dfsek.terra.carving; - -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.gaea.math.MathUtil; -import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.procgen.GridSpawn; -import com.dfsek.terra.procgen.voxel.DeformedSphere; -import com.dfsek.terra.procgen.voxel.Tube; -import com.dfsek.terra.procgen.voxel.VoxelGeometry; -import org.bukkit.Bukkit; -import org.bukkit.World; -import org.bukkit.util.Vector; - -import java.util.Random; - -public class Cavern { - private final Node node; - private final long seed; - - public Cavern(World w) { - this.node = new Node(w); - this.seed = w.getSeed(); - } - - public VoxelGeometry carveChunk(int chunkX, int chunkZ) { - long seedC = MathUtil.getCarverChunkSeed(chunkX, chunkZ, seed); - Random chunk = new FastRandom(seedC); - Vector org = node.getNodeLocation((chunkX << 4) + 8, (chunkZ << 4) + 8).clone().setY(chunk.nextInt(128)); - VoxelGeometry carve = VoxelGeometry.getBlank(); - - FastNoiseLite smpl = new FastNoiseLite((int) seedC); - smpl.setFrequency(0.01f); - smpl.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); - Bukkit.getLogger().info("Cavern: " + org.toString()); - carve.merge(new DeformedSphere(org.clone(), chunk.nextInt(4) + 3, 0.75, smpl)); - - Vector _00 = new Vector(org.getX() + 16, new FastRandom(MathUtil.getCarverChunkSeed(chunkX + 1, chunkZ, seed)).nextInt(128), org.getZ()); - - carve.merge(new Tube(org, _00, 4)); - return carve; - } - - public static class Node { - private final long seed; - private final GridSpawn spawn = new GridSpawn(16, 0, 0); - - public Node(World w) { - this.seed = w.getSeed(); - } - - public Vector getNodeLocation(int x, int z) { - return spawn.getNearestSpawn(x, z, seed); - } - } -} diff --git a/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java b/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java index 0fe710463..2d78c2407 100644 --- a/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java +++ b/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java @@ -1,11 +1,11 @@ package com.dfsek.terra.carving; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.world.carving.Carver; import com.dfsek.terra.api.gaea.world.carving.Worm; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.biome.UserDefinedBiome; @@ -43,9 +43,9 @@ public class UserDefinedCarver extends Carver { private double step = 2; private Range recalc = new Range(8, 10); private double recalcMagnitude = 3; - private final TerraBukkitPlugin main; + private final TerraPlugin main; - public UserDefinedCarver(Range height, Range length, double[] start, double[] mutate, List radii, Scope parent, long hash, int topCut, int bottomCut, CarverTemplate config, TerraBukkitPlugin main) throws ParseException { + public UserDefinedCarver(Range height, Range length, double[] start, double[] mutate, List radii, Scope parent, long hash, int topCut, int bottomCut, CarverTemplate config, TerraPlugin main) throws ParseException { super(height.getMin(), height.getMax()); this.length = length; this.start = start; diff --git a/src/main/java/com/dfsek/terra/config/factories/OreFactory.java b/src/main/java/com/dfsek/terra/config/factories/OreFactory.java index 3b6f043bc..a07f4847c 100644 --- a/src/main/java/com/dfsek/terra/config/factories/OreFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/OreFactory.java @@ -1,11 +1,11 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.config.templates.OreTemplate; import com.dfsek.terra.generation.items.ores.DeformedSphereOre; import com.dfsek.terra.generation.items.ores.Ore; import com.dfsek.terra.generation.items.ores.VanillaOre; -import org.bukkit.block.data.BlockData; public class OreFactory implements TerraFactory { @Override diff --git a/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java b/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java index f9af8b732..c582f8714 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java @@ -3,6 +3,7 @@ package com.dfsek.terra.config.loaders; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; +import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.util.MaterialSet; import org.bukkit.Material; @@ -19,7 +20,7 @@ public class MaterialSetLoader implements TypeLoader { for(String string : stringData) { try { if(string.startsWith("#")) set.addTag(string.substring(1)); - else set.add((Material) configLoader.loadType(Material.class, string)); + else set.add((MaterialData) configLoader.loadType(Material.class, string)); } catch(NullPointerException e) { throw new LoadException("Invalid data identifier \"" + string + "\"", e); } diff --git a/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java b/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java index 2d8432264..612877bd8 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java @@ -4,10 +4,10 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.biome.palette.PaletteHolderBuilder; import com.dfsek.terra.config.loaders.Types; -import org.bukkit.block.data.BlockData; import java.lang.reflect.Type; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java b/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java index b728a3739..20f6c7b1f 100644 --- a/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java @@ -4,9 +4,9 @@ import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.generation.items.ores.Ore; import com.dfsek.terra.util.MaterialSet; -import org.bukkit.block.data.BlockData; @SuppressWarnings({"unused", "FieldMayBeFinal"}) public class OreTemplate extends AbstractableTemplate { diff --git a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index 333e68f3b..e4c0e9de4 100644 --- a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -95,6 +95,7 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato @Override + @SuppressWarnings({"deprecation", "try"}) public void generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome, ChunkGenerator.ChunkData chunk) { TerraWorld tw = main.getWorld(world); com.dfsek.terra.api.gaea.biome.BiomeGrid grid = tw.getGrid(); @@ -165,6 +166,7 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato int cx = xOrig + (x << 2); int cz = zOrig + (z << 2); Biome b = grid.getBiome(cx, cz, GenerationPhase.PALETTE_APPLY); + biome.setBiome(x << 2, z << 2, b.getVanillaBiome()); } } diff --git a/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java b/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java index 4370e0fcd..77cdce7ed 100644 --- a/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java +++ b/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java @@ -3,8 +3,8 @@ package com.dfsek.terra.generation.items; import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.vector.Vector2; -import org.bukkit.Chunk; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java b/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java index e89d875dc..a8013e3d7 100644 --- a/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java +++ b/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java @@ -3,11 +3,11 @@ package com.dfsek.terra.generation.items.flora; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.gaea.world.Flora; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.data.BlockData; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.vector.Location; import java.util.List; @@ -38,7 +38,7 @@ public class BlockFlora implements Flora { @Override public boolean plant(Location location) { - location.add(0, 1, 0).getBlock().setBlockData(data); + location.add(0, 1, 0).getBlock().setBlockData(data, true); return true; } } diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java b/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java index a2b7fdf6f..80812adcd 100644 --- a/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java +++ b/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java @@ -4,9 +4,9 @@ import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.generation.items.PlaceableLayer; -import org.bukkit.Chunk; import java.util.Random; @@ -20,6 +20,7 @@ public class FloraLayer extends PlaceableLayer { return density; } + @Override public void place(Chunk chunk, Vector2 coords, Random random) { Flora item = noise == null ? layer.get(random) : layer.get(noise, (chunk.getX() << 4) + coords.getX(), (chunk.getZ() << 4) + coords.getZ()); item.getValidSpawnsAt(chunk, (int) coords.getX(), (int) coords.getZ(), level).forEach(block -> item.plant(block.getLocation())); diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java b/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java index 2ee756d69..936e320c5 100644 --- a/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java +++ b/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java @@ -1,22 +1,22 @@ package com.dfsek.terra.generation.items.flora; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.gaea.world.Flora; import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.data.Directional; +import com.dfsek.terra.api.generic.world.block.data.MultipleFacing; +import com.dfsek.terra.api.generic.world.block.data.Rotatable; +import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.Directional; -import org.bukkit.block.data.MultipleFacing; -import org.bukkit.block.data.Rotatable; import java.util.ArrayList; import java.util.List; @@ -41,9 +41,9 @@ public class TerraFlora implements Flora { private final int irrigableOffset; - private final TerraBukkitPlugin main; + private final TerraPlugin main; - public TerraFlora(Palette floraPalette, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, TerraBukkitPlugin main) { + public TerraFlora(Palette floraPalette, boolean physics, boolean ceiling, MaterialSet irrigable, MaterialSet spawnable, MaterialSet replaceable, MaterialSet testRotation, int maxPlacements, Search search, boolean spawnBlacklist, int irrigableOffset, TerraPlugin main) { this.floraPalette = floraPalette; this.physics = physics; this.testRotation = testRotation; diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java b/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java index d014693a5..b02cea6d3 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java +++ b/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java @@ -1,14 +1,14 @@ package com.dfsek.terra.generation.items.ores; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.util.MaterialSet; -import org.bukkit.Chunk; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.util.Vector; import java.util.Random; @@ -17,7 +17,7 @@ public class DeformedSphereOre extends Ore { private final double deformFrequency; private final Range size; - public DeformedSphereOre(BlockData material, MaterialSet replaceable, boolean applyGravity, double deform, double deformFrequency, Range size, TerraBukkitPlugin main) { + public DeformedSphereOre(BlockData material, MaterialSet replaceable, boolean applyGravity, double deform, double deformFrequency, Range size, TerraPlugin main) { super(material, replaceable, applyGravity, main); this.deform = deform; this.deformFrequency = deformFrequency; @@ -26,7 +26,7 @@ public class DeformedSphereOre extends Ore { @Override - public void generate(Vector origin, Chunk c, Random r) { + public void generate(Vector3 origin, Chunk c, Random r) { WorldHandle handle = main.getHandle(); FastNoiseLite ore = new FastNoiseLite(r.nextInt()); ore.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); @@ -35,7 +35,7 @@ public class DeformedSphereOre extends Ore { for(int x = -rad; x <= rad; x++) { for(int y = -rad; y <= rad; y++) { for(int z = -rad; z <= rad; z++) { - Vector oreLoc = origin.clone().add(new Vector(x, y, z)); + Vector3 oreLoc = origin.clone().add(new Vector3(x, y, z)); if(oreLoc.getBlockX() > 15 || oreLoc.getBlockZ() > 15 || oreLoc.getBlockY() > 255 || oreLoc.getBlockX() < 0 || oreLoc.getBlockZ() < 0 || oreLoc.getBlockY() < 0) continue; if(oreLoc.distance(origin) < (rad + 0.5) * ((ore.getNoise(x, y, z) + 1) * deform)) { diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java b/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java index 0083244ba..1b47852c2 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java +++ b/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java @@ -1,10 +1,10 @@ package com.dfsek.terra.generation.items.ores; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.util.MaterialSet; -import org.bukkit.Chunk; -import org.bukkit.block.data.BlockData; -import org.bukkit.util.Vector; import java.util.Random; @@ -13,9 +13,9 @@ public abstract class Ore { private final BlockData material; private final MaterialSet replaceable; private final boolean applyGravity; - protected TerraBukkitPlugin main; + protected TerraPlugin main; - public Ore(BlockData material, MaterialSet replaceable, boolean applyGravity, TerraBukkitPlugin main) { + public Ore(BlockData material, MaterialSet replaceable, boolean applyGravity, TerraPlugin main) { this.material = material; this.replaceable = replaceable; @@ -23,7 +23,7 @@ public abstract class Ore { this.main = main; } - public abstract void generate(Vector origin, Chunk c, Random r); + public abstract void generate(Vector3 origin, Chunk c, Random r); public BlockData getMaterial() { return material; diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java b/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java index 0d236570a..c030a8c06 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java +++ b/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java @@ -1,14 +1,14 @@ package com.dfsek.terra.generation.items.ores; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; -import org.bukkit.Chunk; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.util.Vector; import java.util.Random; @@ -16,13 +16,13 @@ import java.util.Random; public class VanillaOre extends Ore { private final Range sizeRange; - public VanillaOre(BlockData material, MaterialSet replaceable, boolean applyGravity, Range size, TerraBukkitPlugin main) { + public VanillaOre(BlockData material, MaterialSet replaceable, boolean applyGravity, Range size, TerraPlugin main) { super(material, replaceable, applyGravity, main); this.sizeRange = size; } @Override - public void generate(Vector location, Chunk chunk, Random random) { + public void generate(Vector3 location, Chunk chunk, Random random) { WorldHandle handle = main.getHandle(); double size = sizeRange.get(random); diff --git a/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java b/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java index 1c8dd74d7..d247da2ed 100644 --- a/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java +++ b/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java @@ -5,11 +5,11 @@ import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.tree.TreeType; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.generation.items.PlaceableLayer; -import org.bukkit.Chunk; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/population/CavePopulator.java b/src/main/java/com/dfsek/terra/population/CavePopulator.java index ab7040856..531bfa233 100644 --- a/src/main/java/com/dfsek/terra/population/CavePopulator.java +++ b/src/main/java/com/dfsek/terra/population/CavePopulator.java @@ -1,32 +1,20 @@ package com.dfsek.terra.population; -import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; -import com.dfsek.terra.api.gaea.profiler.ProfileFuture; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.carving.UserDefinedCarver; -import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.config.templates.CarverTemplate; -import com.dfsek.terra.util.PopulationUtil; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.World; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; -import org.bukkit.generator.BlockPopulator; +import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; import org.jetbrains.annotations.NotNull; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Random; -import java.util.Set; -public class CavePopulator extends BlockPopulator { +public class CavePopulator implements TerraBlockPopulator { private final TerraBukkitPlugin main; - private static final Map shiftStorage = new HashMap<>(); // Persist BlockData created for shifts, to avoid re-calculating each time. - private static final BlockData AIR = Material.AIR.createBlockData(); + private static final Map shiftStorage = new HashMap<>(); // Persist BlockData created for shifts, to avoid re-calculating each time. public CavePopulator(TerraBukkitPlugin main) { this.main = main; @@ -35,6 +23,7 @@ public class CavePopulator extends BlockPopulator { @SuppressWarnings("try") @Override public void populate(@NotNull World world, @NotNull Random r, @NotNull Chunk chunk) { + /* TerraWorld tw = main.getWorld(world); WorldHandle handle = main.getHandle(); try(ProfileFuture ignored = tw.getProfiler().measure("CaveTime")) { @@ -44,11 +33,11 @@ public class CavePopulator extends BlockPopulator { for(UserDefinedCarver c : config.getCarvers()) { CarverTemplate template = c.getConfig(); - Map shiftCandidate = new HashMap<>(); + Map shiftCandidate = new HashMap<>(); Set updateNeeded = new HashSet<>(); c.carve(chunk.getX(), chunk.getZ(), world, (v, type) -> { Block b = chunk.getBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ()); - Material m = handle.getType(b); + MaterialData m = handle.getType(b); switch(type) { case CENTER: if(template.getInner().canReplace(m)) { @@ -101,5 +90,7 @@ public class CavePopulator extends BlockPopulator { } } + + */ } } diff --git a/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/src/main/java/com/dfsek/terra/population/FloraPopulator.java index d75a8d289..c4983771e 100644 --- a/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -3,14 +3,14 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.gaea.population.GaeaBlockPopulator; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; +import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.items.flora.FloraLayer; -import org.bukkit.Chunk; -import org.bukkit.World; import org.jetbrains.annotations.NotNull; import java.util.HashMap; @@ -21,7 +21,7 @@ import java.util.Random; /** * Populates Flora and Trees */ -public class FloraPopulator extends GaeaBlockPopulator { +public class FloraPopulator implements TerraBlockPopulator { private final TerraBukkitPlugin main; public FloraPopulator(TerraBukkitPlugin main) { diff --git a/src/main/java/com/dfsek/terra/population/OrePopulator.java b/src/main/java/com/dfsek/terra/population/OrePopulator.java index da112186f..448179abf 100644 --- a/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -5,19 +5,19 @@ import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.MathUtil; -import com.dfsek.terra.api.gaea.population.GaeaBlockPopulator; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; -import org.bukkit.Chunk; -import org.bukkit.World; -import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import java.util.Random; -public class OrePopulator extends GaeaBlockPopulator { +public class OrePopulator implements TerraBlockPopulator { private final TerraBukkitPlugin main; public OrePopulator(TerraBukkitPlugin main) { @@ -42,7 +42,7 @@ public class OrePopulator extends GaeaBlockPopulator { config.getOreHolder().forEach((ore, oreConfig) -> { int amount = oreConfig.getAmount().get(random); for(int i = 0; i < amount; i++) { - Vector location = new Vector(random.nextInt(16) + 16 * finalCx, oreConfig.getHeight().get(random), random.nextInt(16) + 16 * finalCz); + Vector3 location = new Vector3(random.nextInt(16) + 16 * finalCx, oreConfig.getHeight().get(random), random.nextInt(16) + 16 * finalCz); ore.generate(location, chunk, random); } }); diff --git a/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/src/main/java/com/dfsek/terra/population/StructurePopulator.java index ebe45f5c4..59774fd36 100644 --- a/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -1,33 +1,14 @@ package com.dfsek.terra.population; -import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; -import com.dfsek.terra.api.gaea.profiler.ProfileFuture; -import com.dfsek.terra.api.gaea.structures.loot.LootTable; -import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.api.generic.world.vector.Vector2; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.generation.items.TerraStructure; -import com.dfsek.terra.structure.Rotation; -import com.dfsek.terra.structure.Structure; -import com.dfsek.terra.structure.StructureContainedInventory; -import com.dfsek.terra.structure.features.Feature; -import com.dfsek.terra.util.PopulationUtil; -import com.dfsek.terra.util.structure.RotationUtil; -import net.jafama.FastMath; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.World; -import org.bukkit.generator.BlockPopulator; -import org.bukkit.inventory.BlockInventoryHolder; +import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; import org.jetbrains.annotations.NotNull; import java.util.Random; -public class StructurePopulator extends BlockPopulator { +public class StructurePopulator implements TerraBlockPopulator { private final TerraBukkitPlugin main; public StructurePopulator(TerraBukkitPlugin main) { @@ -37,6 +18,7 @@ public class StructurePopulator extends BlockPopulator { @SuppressWarnings("try") @Override public void populate(@NotNull World world, @NotNull Random r, @NotNull Chunk chunk) { + /* TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("StructureTime")) { Random random = PopulationUtil.getRandom(chunk); @@ -80,5 +62,7 @@ public class StructurePopulator extends BlockPopulator { } } } + + */ } } diff --git a/src/main/java/com/dfsek/terra/population/TreePopulator.java b/src/main/java/com/dfsek/terra/population/TreePopulator.java index 674954326..66899a162 100644 --- a/src/main/java/com/dfsek/terra/population/TreePopulator.java +++ b/src/main/java/com/dfsek/terra/population/TreePopulator.java @@ -3,21 +3,21 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.gaea.population.GaeaBlockPopulator; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; +import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.items.tree.TreeLayer; import net.jafama.FastMath; -import org.bukkit.Chunk; -import org.bukkit.World; import org.jetbrains.annotations.NotNull; import java.util.Random; -public class TreePopulator extends GaeaBlockPopulator { +public class TreePopulator implements TerraBlockPopulator { private final TerraBukkitPlugin main; public TreePopulator(TerraBukkitPlugin main) { diff --git a/src/main/java/com/dfsek/terra/procgen/GridSpawn.java b/src/main/java/com/dfsek/terra/procgen/GridSpawn.java index 8fc7ddcb8..753310128 100644 --- a/src/main/java/com/dfsek/terra/procgen/GridSpawn.java +++ b/src/main/java/com/dfsek/terra/procgen/GridSpawn.java @@ -3,7 +3,7 @@ package com.dfsek.terra.procgen; import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.util.GlueList; -import org.bukkit.util.Vector; +import com.dfsek.terra.api.generic.world.vector.Vector3; import java.util.List; import java.util.Random; @@ -30,18 +30,18 @@ public class GridSpawn { * @param seed Seed for RNG * @return Vector representing nearest spawnpoint */ - public Vector getNearestSpawn(int x, int z, long seed) { + public Vector3 getNearestSpawn(int x, int z, long seed) { int structureChunkX = x / (width + 2 * separation); int structureChunkZ = z / (width + 2 * separation); - List zones = new GlueList<>(); + List zones = new GlueList<>(); for(int xi = structureChunkX - 1; xi <= structureChunkX + 1; xi++) { for(int zi = structureChunkZ - 1; zi <= structureChunkZ + 1; zi++) { zones.add(getChunkSpawn(xi, zi, seed + seedOffset)); } } - Vector shortest = zones.get(0); - Vector compare = new Vector(x, 0, z); - for(Vector v : zones) { + Vector3 shortest = zones.get(0); + Vector3 compare = new Vector3(x, 0, z); + for(Vector3 v : zones) { if(compare.distanceSquared(shortest) > compare.distanceSquared(v)) shortest = v.clone(); } return shortest; @@ -55,13 +55,13 @@ public class GridSpawn { * @param seed Seed for RNG * @return Vector representing spawnpoint */ - public Vector getChunkSpawn(int structureChunkX, int structureChunkZ, long seed) { + public Vector3 getChunkSpawn(int structureChunkX, int structureChunkZ, long seed) { Random r = new FastRandom(MathUtil.getCarverChunkSeed(structureChunkX, structureChunkZ, seed + seedOffset)); int offsetX = r.nextInt(width); int offsetZ = r.nextInt(width); int sx = structureChunkX * (width + 2 * separation) + offsetX; int sz = structureChunkZ * (width + 2 * separation) + offsetZ; - return new Vector(sx, 0, sz); + return new Vector3(sx, 0, sz); } public int getWidth() { diff --git a/src/main/java/com/dfsek/terra/structure/Structure.java b/src/main/java/com/dfsek/terra/structure/Structure.java index 0535377f6..876473a48 100644 --- a/src/main/java/com/dfsek/terra/structure/Structure.java +++ b/src/main/java/com/dfsek/terra/structure/Structure.java @@ -3,20 +3,11 @@ package com.dfsek.terra.structure; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.util.structure.RotationUtil; import net.jafama.FastMath; -import org.bukkit.Bukkit; import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.BlockState; -import org.bukkit.block.Sign; -import org.bukkit.block.data.BlockData; -import org.bukkit.inventory.BlockInventoryHolder; import org.jetbrains.annotations.NotNull; import java.io.File; @@ -28,7 +19,6 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.util.HashSet; -import java.util.Objects; import java.util.UUID; import java.util.function.Consumer; @@ -53,6 +43,7 @@ public class Structure implements Serializable { if(l1.getX() > l2.getX() || l1.getY() > l2.getY() || l1.getZ() > l2.getZ()) throw new IllegalArgumentException("Invalid locations provided!"); structure = new StructureContainedBlock[l2.getBlockX() - l1.getBlockX() + 1][l2.getBlockZ() - l1.getBlockZ() + 1][l2.getBlockY() - l1.getBlockY() + 1]; + /* for(int x = 0; x <= l2.getBlockX() - l1.getBlockX(); x++) { for(int z = 0; z <= l2.getBlockZ() - l1.getBlockZ(); z++) { for(int y = 0; y <= l2.getBlockY() - l1.getBlockY(); y++) { @@ -110,6 +101,8 @@ public class Structure implements Serializable { } } } + + */ if(centerX < 0 || centerZ < 0) throw new InitializationException("No structure center specified.", null); structureInfo = new StructureInfo(l2.getBlockX() - l1.getBlockX() + 1, l2.getBlockY() - l1.getBlockY() + 1, l2.getBlockZ() - l1.getBlockZ() + 1, new Vector2(centerX, centerZ)); } @@ -177,6 +170,7 @@ public class Structure implements Serializable { * @param r The rotation of the structure */ private void pasteBlock(StructureContainedBlock block, Location origin, Rotation r, WorldHandle handle) { + /* BlockData data = block.getBlockData().clone(); if(!data.getMaterial().equals(Material.STRUCTURE_VOID)) { @@ -209,6 +203,8 @@ public class Structure implements Serializable { block.getState().getState(worldBlock.getState()).update(true, false); } } + + */ } /** @@ -287,12 +283,16 @@ public class Structure implements Serializable { } public boolean checkSpawns(Location origin, Rotation r, TerraBukkitPlugin main) { + /* for(StructureContainedBlock b : spawns) { Vector2 rot = getRotatedCoords(new Vector2(b.getX() - structureInfo.getCenterX(), b.getZ() - structureInfo.getCenterZ()), r); if(!b.getRequirement().getInstance(origin.getWorld(), main).matches((int) rot.getX() + origin.getBlockX(), origin.getBlockY() + b.getY(), (int) rot.getZ() + origin.getBlockZ())) return false; } - return true; + return true; + + */ + return false; } public HashSet getSpawns() { diff --git a/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java b/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java index b7d793ca3..5cc2c496f 100644 --- a/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java +++ b/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java @@ -1,12 +1,12 @@ package com.dfsek.terra.structure; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.structure.spawn.AirSpawn; import com.dfsek.terra.structure.spawn.BlankSpawn; import com.dfsek.terra.structure.spawn.LandSpawn; import com.dfsek.terra.structure.spawn.OceanSpawn; import com.dfsek.terra.structure.spawn.Requirement; -import org.bukkit.World; import java.io.Serializable; diff --git a/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java index e60165913..c21512609 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java @@ -3,10 +3,10 @@ package com.dfsek.terra.structure.spawn; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.config.WorldGenerator; -import org.bukkit.World; public class AirSpawn extends Requirement { public AirSpawn(World world, TerraBukkitPlugin main) { @@ -20,6 +20,6 @@ public class AirSpawn extends Requirement { BiomeTemplate c = b.getConfig(); if(y <= c.getSeaLevel()) return false; double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); - return b.getGenerator().getNoise(getNoise(), world, x, y, z) + elevation <= 0; + return b.getGenerator().getNoise(world, x, y, z) + elevation <= 0; } } diff --git a/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java index 69d5346de..f12f8509d 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java @@ -3,9 +3,9 @@ package com.dfsek.terra.structure.spawn; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.generation.config.WorldGenerator; -import org.bukkit.World; public class LandSpawn extends Requirement { public LandSpawn(World world, TerraBukkitPlugin main) { @@ -17,6 +17,6 @@ public class LandSpawn extends Requirement { TerraWorld tw = main.getWorld(world); UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); - return b.getGenerator().getNoise(getNoise(), world, x, y, z) + elevation > 0; + return b.getGenerator().getNoise(world, x, y, z) + elevation > 0; } } diff --git a/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java index 19a65087a..27f6622a6 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java @@ -3,10 +3,10 @@ package com.dfsek.terra.structure.spawn; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.config.WorldGenerator; -import org.bukkit.World; public class OceanSpawn extends Requirement { public OceanSpawn(World world, TerraBukkitPlugin main) { @@ -20,6 +20,6 @@ public class OceanSpawn extends Requirement { BiomeTemplate c = b.getConfig(); if(y > c.getSeaLevel()) return false; double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); - return b.getGenerator().getNoise(getNoise(), world, x, y, z) + elevation <= 0; + return b.getGenerator().getNoise(world, x, y, z) + elevation <= 0; } } diff --git a/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java b/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java index acdccf78f..a0ac0113f 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java @@ -1,10 +1,7 @@ package com.dfsek.terra.structure.spawn; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import org.bukkit.World; - -import java.util.Objects; +import com.dfsek.terra.api.generic.world.World; public abstract class Requirement { protected final World world; @@ -17,9 +14,6 @@ public abstract class Requirement { public abstract boolean matches(int x, int y, int z); - protected FastNoiseLite getNoise() { - return ((TerraChunkGenerator) Objects.requireNonNull(world.getGenerator())).getNoiseGenerator(); - } public World getWorld() { return world; diff --git a/src/main/java/com/dfsek/terra/util/MaterialSet.java b/src/main/java/com/dfsek/terra/util/MaterialSet.java index e60321207..b3008a8ce 100644 --- a/src/main/java/com/dfsek/terra/util/MaterialSet.java +++ b/src/main/java/com/dfsek/terra/util/MaterialSet.java @@ -1,21 +1,21 @@ package com.dfsek.terra.util; -import org.bukkit.Material; -import org.bukkit.block.data.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; import java.util.Arrays; import java.util.HashSet; -public class MaterialSet extends HashSet { +public class MaterialSet extends HashSet { private static final long serialVersionUID = 3056512763631017301L; - public static MaterialSet singleton(Material material) { + public static MaterialSet singleton(MaterialData material) { MaterialSet set = new MaterialSet(); set.add(material); return set; } - public static MaterialSet get(Material... materials) { + public static MaterialSet get(MaterialData... materials) { MaterialSet set = new MaterialSet(); set.addAll(Arrays.asList(materials)); return set; diff --git a/src/main/java/com/dfsek/terra/util/SlabUtil.java b/src/main/java/com/dfsek/terra/util/SlabUtil.java index b9ca5f9ef..ac036504a 100644 --- a/src/main/java/com/dfsek/terra/util/SlabUtil.java +++ b/src/main/java/com/dfsek/terra/util/SlabUtil.java @@ -21,8 +21,8 @@ public final class SlabUtil { if(stairs != null) { Palette stairPalette = stairs.get(down.getMaterial()); if(stairPalette != null) { - BlockData stair = stairPalette.get(0, block.getBlockX(), block.getBlockZ()); - Stairs stairNew = (Stairs) stair.clone(); + BlockData stair = stairPalette.get(0, block.getBlockX(), block.getBlockZ()).clone(); + Stairs stairNew = (Stairs) stair; if(placeStair(orig, chunk, block, thresh, sampler, stairNew)) return; // Successfully placed part. } } diff --git a/src/main/java/com/dfsek/terra/util/TagUtil.java b/src/main/java/com/dfsek/terra/util/TagUtil.java index 375d014a9..e05cb67e7 100644 --- a/src/main/java/com/dfsek/terra/util/TagUtil.java +++ b/src/main/java/com/dfsek/terra/util/TagUtil.java @@ -1,14 +1,10 @@ package com.dfsek.terra.util; +import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.debug.Debug; -import org.bukkit.Material; -import org.bukkit.Tag; import org.jetbrains.annotations.NotNull; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; import java.util.HashMap; -import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Set; @@ -17,12 +13,13 @@ import java.util.stream.Stream; @SuppressWarnings("unchecked") public final class TagUtil { - private static final Map> tagMap; + private static final Map> tagMap; static { Debug.info("Loading tags..."); tagMap = new HashMap<>(); + /* Field[] tags = Tag.class.getFields(); // Add Bukkit tags for(Field field : tags) { if(Modifier.isStatic(field.getModifiers())) { @@ -61,18 +58,20 @@ public final class TagUtil { Debug.info("Added " + snow.size() + " materials to snow blacklist"); Debug.info("Added " + solid.size() + " materials to solid list"); Debug.info("Loaded " + tagMap.size() + " tags."); + + */ } - private static Set getSet(Material... materials) { + private static Set getSet(MaterialData... materials) { return Stream.of(materials).collect(Collectors.toSet()); } - private static void putCustomSet(String key, Material... materials) { + private static void putCustomSet(String key, MaterialData... materials) { tagMap.put(key, getSet(materials)); } @NotNull - public static Set getTag(String tag) { + public static Set getTag(String tag) { return Objects.requireNonNull(tagMap.get(tag)); } } From 3e04dc6b46647f5ff5eb5e79e637431b90e04cdc Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 21:35:14 -0700 Subject: [PATCH 014/210] it compiles now B) --- .../terra/api/bukkit/BukkitBiomeGrid.java | 11 ++-- .../dfsek/terra/api/bukkit/BukkitChunk.java | 7 +++ .../dfsek/terra/api/bukkit/BukkitWorld.java | 13 +++++ .../terra/api/bukkit/BukkitWorldHandle.java | 8 +-- .../api/bukkit/world/block/BukkitBlock.java | 50 +++++++++++++++++++ .../world/block/BukkitMaterialData.java | 10 ++++ .../com/dfsek/terra/api/gaea/biome/Biome.java | 2 +- .../terra/api/gaea/tree/CustomTreeType.java | 2 +- .../dfsek/terra/api/gaea/tree/TreeType.java | 12 +++-- .../gaea/tree/fractal/EntitySpawnHolder.java | 2 +- .../api/gaea/tree/fractal/FractalTree.java | 12 +++-- .../api/gaea/tree/fractal/TreeGeometry.java | 14 +++--- .../api/gaea/tree/fractal/TreeGetter.java | 2 +- .../api/gaea/tree/fractal/trees/Cactus.java | 2 +- .../api/gaea/tree/fractal/trees/IceSpike.java | 6 +-- .../api/gaea/tree/fractal/trees/OakTree.java | 8 +-- .../api/gaea/tree/fractal/trees/Rock.java | 47 ----------------- .../tree/fractal/trees/ShatteredPillar.java | 2 +- .../tree/fractal/trees/ShatteredTree.java | 8 +-- .../fractal/trees/SmallShatteredPillar.java | 2 +- .../fractal/trees/SmallShatteredTree.java | 8 +-- .../gaea/tree/fractal/trees/SpruceTree.java | 8 +-- .../dfsek/terra/api/gaea/world/FloraType.java | 16 +++--- .../terra/api/generic/world/BiomeGrid.java | 1 - .../dfsek/terra/api/generic/world/World.java | 7 +++ .../terra/api/generic/world/block/Block.java | 2 + .../api/generic/world/block/MaterialData.java | 2 + .../api/generic/world/vector/Location.java | 14 ++++++ .../api/generic/world/vector/Vector3.java | 25 ++++++---- .../dfsek/terra/async/AsyncBiomeFinder.java | 6 +-- .../dfsek/terra/async/AsyncFeatureFinder.java | 10 ++-- .../terra/async/AsyncStructureFinder.java | 9 ++-- .../dfsek/terra/biome/UserDefinedBiome.java | 6 +-- .../terra/biome/palette/PaletteLayer.java | 2 +- .../dfsek/terra/command/FixChunkCommand.java | 2 +- .../dfsek/terra/command/SaveDataCommand.java | 2 +- .../terra/command/biome/BiomeCommand.java | 8 ++- .../terra/command/biome/BiomeInfoCommand.java | 7 ++- .../command/biome/BiomeLocateCommand.java | 20 +++----- .../terra/command/image/RenderCommand.java | 8 +-- .../command/image/gui/RawGUICommand.java | 6 +-- .../command/image/gui/StepGUICommand.java | 6 +-- .../terra/command/profile/QueryCommand.java | 3 +- .../terra/command/profile/ResetCommand.java | 3 +- .../terra/command/profile/StartCommand.java | 3 +- .../terra/command/profile/StopCommand.java | 3 +- .../command/structure/ExportCommand.java | 10 ++-- .../command/structure/LocateCommand.java | 20 +++----- .../terra/command/structure/SpawnCommand.java | 5 +- .../structure/load/LoadFullCommand.java | 9 ++-- .../structure/load/LoadRawCommand.java | 14 ++---- .../terra/config/factories/FloraFactory.java | 2 +- .../config/factories/PaletteFactory.java | 2 +- .../loaders/palette/PaletteLayerLoader.java | 2 +- .../terra/config/templates/FloraTemplate.java | 3 +- .../com/dfsek/terra/debug/gui/DebugFrame.java | 10 ++-- .../generation/items/tree/TerraTree.java | 9 ++-- .../dfsek/terra/listeners/EventListener.java | 19 +++---- .../dfsek/terra/listeners/SpigotListener.java | 17 ++----- .../dfsek/terra/registry/FloraRegistry.java | 4 -- .../dfsek/terra/registry/PaletteRegistry.java | 5 +- .../java/com/dfsek/terra/util/SlabUtil.java | 15 ++++-- src/main/resources/plugin.yml | 2 +- 63 files changed, 293 insertions(+), 262 deletions(-) delete mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Rock.java diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java index 599243fd0..58f79ad7a 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java @@ -1,7 +1,8 @@ package com.dfsek.terra.api.bukkit; +import com.dfsek.terra.api.bukkit.world.BukkitBiome; +import com.dfsek.terra.api.generic.world.Biome; import com.dfsek.terra.api.generic.world.BiomeGrid; -import org.bukkit.block.Biome; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; @@ -19,21 +20,21 @@ public class BukkitBiomeGrid implements BiomeGrid { @Override public @NotNull Biome getBiome(int x, int z) { - return delegate.getBiome(x, z); + return new BukkitBiome(delegate.getBiome(x, z)); } @Override public @NotNull Biome getBiome(int x, int y, int z) { - return delegate.getBiome(x, y, z); + return new BukkitBiome(delegate.getBiome(x, y, z)); } @Override public void setBiome(int x, int z, @NotNull Biome bio) { - delegate.setBiome(x, z, bio); + delegate.setBiome(x, z, ((BukkitBiome) bio).getHandle()); } @Override public void setBiome(int x, int y, int z, @NotNull Biome bio) { - delegate.setBiome(x, y, z, bio); + delegate.setBiome(x, y, z, ((BukkitBiome) bio).getHandle()); } } diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java index e7d0e64d8..7d5bd7b84 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java @@ -1,7 +1,9 @@ package com.dfsek.terra.api.bukkit; +import com.dfsek.terra.api.bukkit.world.block.BukkitBlock; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.Block; public class BukkitChunk implements Chunk { private final org.bukkit.Chunk delegate; @@ -25,6 +27,11 @@ public class BukkitChunk implements Chunk { return new BukkitWorld(delegate.getWorld()); } + @Override + public Block getBlock(int x, int y, int z) { + return new BukkitBlock(delegate.getBlock(x, y, z)); + } + @Override public org.bukkit.Chunk getHandle() { return delegate; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java index 3aa4b5a78..79af467ab 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java @@ -7,6 +7,9 @@ import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; +import org.bukkit.TreeType; +import org.bukkit.entity.Entity; +import org.bukkit.util.Consumer; import java.io.File; import java.util.UUID; @@ -68,6 +71,16 @@ public class BukkitWorld implements World { return new BukkitBlock(delegate.getBlockAt(l.getBlockX(), l.getBlockY(), l.getBlockZ())); } + @Override + public boolean generateTree(Location l, TreeType vanillaTreeType) { + return delegate.generateTree(new org.bukkit.Location(((BukkitWorld) l.getWorld()).getHandle(), l.getX(), l.getY(), l.getZ()), vanillaTreeType); + } + + @Override + public void spawn(Location l, Class entity, Consumer consumer) { + delegate.spawn(new org.bukkit.Location(((BukkitWorld) l.getWorld()).getHandle(), l.getX(), l.getY(), l.getZ()), entity, consumer); + } + @Override public org.bukkit.World getHandle() { return delegate; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java index a804889ba..b8c2ec442 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java @@ -5,28 +5,28 @@ import com.dfsek.terra.api.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.api.bukkit.world.block.data.BukkitStairs; import com.dfsek.terra.api.bukkit.world.block.data.BukkitWaterlogged; import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.generic.world.block.data.Waterlogged; import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.block.Block; import org.bukkit.block.data.type.Stairs; public class BukkitWorldHandle implements WorldHandle { @Override - public void setBlockData(Block block, org.bukkit.block.data.BlockData data, boolean physics) { + public void setBlockData(Block block, BlockData data, boolean physics) { block.setBlockData(data, physics); } @Override - public org.bukkit.block.data.BlockData getBlockData(Block block) { + public BlockData getBlockData(Block block) { return block.getBlockData(); } @Override - public Material getType(Block block) { + public MaterialData getType(Block block) { return block.getType(); } diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlock.java b/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlock.java index 10a9ca888..3985e2945 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlock.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlock.java @@ -1,7 +1,12 @@ package com.dfsek.terra.api.bukkit.world.block; +import com.dfsek.terra.api.bukkit.BukkitWorld; +import com.dfsek.terra.api.bukkit.world.block.data.BukkitEnumAdapter; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.vector.Location; public class BukkitBlock implements Block { private final org.bukkit.block.Block delegate; @@ -20,6 +25,51 @@ public class BukkitBlock implements Block { return new BukkitBlockData(delegate.getBlockData()); } + @Override + public Block getRelative(BlockFace face) { + return new BukkitBlock(delegate.getRelative(BukkitEnumAdapter.fromTerraBlockFace(face))); + } + + @Override + public Block getRelative(BlockFace face, int len) { + return new BukkitBlock(delegate.getRelative(BukkitEnumAdapter.fromTerraBlockFace(face), len)); + } + + @Override + public boolean isEmpty() { + return delegate.isEmpty(); + } + + @Override + public Location getLocation() { + return new Location(new BukkitWorld(delegate.getWorld()), delegate.getX(), delegate.getY(), delegate.getZ()); + } + + @Override + public MaterialData getType() { + return new BukkitMaterialData(delegate.getType()); + } + + @Override + public int getX() { + return delegate.getX(); + } + + @Override + public int getZ() { + return delegate.getZ(); + } + + @Override + public int getY() { + return delegate.getY(); + } + + @Override + public boolean isPassable() { + return delegate.isPassable(); + } + @Override public Object getHandle() { return delegate; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitMaterialData.java b/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitMaterialData.java index 6185ea8bd..14c17e7c6 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitMaterialData.java +++ b/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitMaterialData.java @@ -21,6 +21,16 @@ public class BukkitMaterialData implements MaterialData { return ((BukkitMaterialData) other.getMaterial()).getHandle().equals(delegate); } + @Override + public boolean isSolid() { + return delegate.isSolid(); + } + + @Override + public boolean isAir() { + return delegate.isAir(); + } + @Override public Material getHandle() { return delegate; diff --git a/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java b/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java index 12e0a7b6d..cc6262deb 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java +++ b/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java @@ -13,7 +13,7 @@ public interface Biome { * * @return Biome - The Vanilla biome. */ - org.bukkit.block.Biome getVanillaBiome(); + com.dfsek.terra.api.generic.world.Biome getVanillaBiome(); /** * Gets the BiomeTerrain instance used to generate the biome. diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/CustomTreeType.java b/src/main/java/com/dfsek/terra/api/gaea/tree/CustomTreeType.java index 429b7bd2f..275668bd3 100755 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/CustomTreeType.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/CustomTreeType.java @@ -10,7 +10,7 @@ import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredTree; import com.dfsek.terra.api.gaea.tree.fractal.trees.SmallShatteredPillar; import com.dfsek.terra.api.gaea.tree.fractal.trees.SmallShatteredTree; import com.dfsek.terra.api.gaea.tree.fractal.trees.SpruceTree; -import org.bukkit.Location; +import com.dfsek.terra.api.generic.world.vector.Location; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java b/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java index c34187ed1..e83b99747 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java @@ -1,14 +1,16 @@ package com.dfsek.terra.api.gaea.tree; +import com.dfsek.terra.api.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.vector.Location; import com.google.common.collect.Sets; -import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.plugin.java.JavaPlugin; import java.util.Collections; import java.util.Random; import java.util.Set; +import java.util.stream.Collectors; public enum TreeType implements Tree { SHATTERED_SMALL(null, Collections.singleton(Material.END_STONE)), @@ -85,7 +87,7 @@ public enum TreeType implements Tree { return CustomTreeType.valueOf(this.toString()); } - public boolean plant(Location l, Random r, JavaPlugin main) { + public boolean plant(Location l, Random r) { if(this.getVanillaTreeType() == null) { if(!spawnable.contains(l.subtract(0, 1, 0).getBlock().getType())) return false; FractalTree tree = getCustomTreeType().getTree(l, r); @@ -97,7 +99,7 @@ public enum TreeType implements Tree { } @Override - public Set getSpawnable() { - return spawnable; + public Set getSpawnable() { + return spawnable.stream().map(BukkitMaterialData::new).collect(Collectors.toSet()); } } diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java index 45152a76d..8f1c1d3a5 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.gaea.tree.fractal; -import org.bukkit.Location; +import com.dfsek.terra.api.generic.world.vector.Location; import org.bukkit.entity.Entity; import org.bukkit.util.Consumer; diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java index 4a83bb56a..274afa51a 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java @@ -1,9 +1,11 @@ package com.dfsek.terra.api.gaea.tree.fractal; +import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.api.gaea.util.GlueList; -import org.bukkit.Location; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.vector.Location; import org.bukkit.Material; -import org.bukkit.block.data.BlockData; import org.bukkit.entity.Entity; import org.bukkit.util.Consumer; @@ -70,7 +72,7 @@ public abstract class FractalTree { * @param m - The material to which it will be set. */ public void setBlock(Location l, Material m) { - treeAssembler.put(l, m.createBlockData()); + treeAssembler.put(l, new BukkitBlockData(m.createBlockData())); } /** @@ -104,8 +106,8 @@ public abstract class FractalTree { * @param l - The location at which to check. * @return Material - The material at the specified block. */ - public Material getMaterial(Location l) { - return treeAssembler.getOrDefault(l, Material.AIR.createBlockData()).getMaterial(); + public MaterialData getMaterial(Location l) { + return treeAssembler.getOrDefault(l, new BukkitBlockData(Material.AIR.createBlockData())).getMaterial(); } diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java index 03faa436a..865a44135 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.gaea.tree.fractal; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import org.bukkit.Location; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.generic.world.vector.Vector3; import org.bukkit.Material; -import org.bukkit.util.Vector; public class TreeGeometry { private final FractalTree tree; @@ -12,8 +12,8 @@ public class TreeGeometry { this.tree = tree; } - public static Vector getPerpendicular(Vector v) { - return v.getZ() < v.getX() ? new Vector(v.getY(), - v.getX(), 0) : new Vector(0, - v.getZ(), v.getY()); + public static Vector3 getPerpendicular(Vector3 v) { + return v.getZ() < v.getX() ? new Vector3(v.getY(), - v.getX(), 0) : new Vector3(0, - v.getZ(), v.getY()); } public FractalTree getTree() { @@ -32,7 +32,7 @@ public class TreeGeometry { for(int x = - radius; x <= radius; x++) { for(int y = - radius; y <= radius; y++) { for(int z = - radius; z <= radius; z++) { - Vector position = l.toVector().clone().add(new Vector(x, y, z)); + Vector3 position = l.toVector().clone().add(new Vector3(x, y, z)); if(l.toVector().distance(position) <= radius + 0.5 && (overwrite || tree.getMaterial(position.toLocation(l.getWorld())).isAir())) tree.setBlock(position.toLocation(l.getWorld()), m.get()); } @@ -44,7 +44,7 @@ public class TreeGeometry { for(int x = - radius; x <= radius; x++) { for(int y = - radius; y <= radius; y++) { for(int z = - radius; z <= radius; z++) { - Vector position = l.toVector().clone().add(new Vector(x, y, z)); + Vector3 position = l.toVector().clone().add(new Vector3(x, y, z)); if(tree.getRandom().nextInt(100) < sponginess && l.toVector().distance(position) <= radius + 0.5 && (overwrite || tree.getMaterial(position.toLocation(l.getWorld())).isAir())) tree.setBlock(position.toLocation(l.getWorld()), m.get()); } @@ -56,7 +56,7 @@ public class TreeGeometry { for(int x = - radius; x <= radius; x++) { for(int y = 0; y <= height; y++) { for(int z = - radius; z <= radius; z++) { - Vector position = l.toVector().clone().add(new Vector(x, 0, z)); + Vector3 position = l.toVector().clone().add(new Vector3(x, 0, z)); if(l.toVector().distance(position) <= radius + 0.5 && (overwrite || tree.getMaterial(position.toLocation(l.getWorld())).isAir())) tree.setBlock(position.toLocation(l.getWorld()), m.get()); } diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGetter.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGetter.java index c9f9621ce..bd169bf22 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGetter.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGetter.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.gaea.tree.fractal; -import org.bukkit.Location; +import com.dfsek.terra.api.generic.world.vector.Location; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java index e8936c58a..3ff2946ad 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import org.bukkit.Location; +import com.dfsek.terra.api.generic.world.vector.Location; import org.bukkit.Material; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java index 139725176..2c9e5efe6 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java @@ -3,9 +3,9 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; -import org.bukkit.Location; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.generic.world.vector.Vector3; import org.bukkit.Material; -import org.bukkit.util.Vector; import java.util.Random; @@ -34,7 +34,7 @@ public class IceSpike extends FractalTree { */ @Override public void grow() { - Vector direction = new Vector(getOffset(), 0, getOffset()); + Vector3 direction = new Vector3(getOffset(), 0, getOffset()); Location l1 = super.getOrigin().clone(); int h = super.getRandom().nextInt(16) + 8; for(int i = 0; i < h; i++) { diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java index b6aca7a77..beab1539e 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java @@ -2,10 +2,10 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.generic.world.vector.Vector3; import net.jafama.FastMath; -import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.util.Vector; import java.util.Random; @@ -29,10 +29,10 @@ public class OakTree extends FractalTree { */ @Override public void grow() { - growBranch(super.getOrigin().clone(), new Vector(super.getRandom().nextInt(5) - 2, super.getRandom().nextInt(4) + 6, super.getRandom().nextInt(5) - 2), 2, 0); + growBranch(super.getOrigin().clone(), new Vector3(super.getRandom().nextInt(5) - 2, super.getRandom().nextInt(4) + 6, super.getRandom().nextInt(5) - 2), 2, 0); } - private void growBranch(Location l1, Vector diff, double d1, int recursions) { + private void growBranch(Location l1, Vector3 diff, double d1, int recursions) { if(recursions > 1) { geo.generateSphere(l1, Material.OAK_LEAVES, 1 + super.getRandom().nextInt(2) + (3 - recursions), false); if(recursions > 2) return; diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Rock.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Rock.java deleted file mode 100644 index a8dbf1c31..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Rock.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.dfsek.terra.api.gaea.tree.fractal.trees; - -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; -import org.bukkit.Location; -import org.bukkit.Material; - -import java.util.Random; - - -public class Rock extends FractalTree { - private final TreeGeometry geo; - private final FastNoiseLite noise; - private final FastNoiseLite rock; - private static final ProbabilityCollection ice = new ProbabilityCollection().add(Material.PACKED_ICE, 95).add(Material.BLUE_ICE, 5); - - /** - * Instantiates a TreeGrower at an origin location. - * - * @param origin - The origin location. - * @param random - The random object to use whilst generating the tree. - */ - public Rock(Location origin, Random random) { - super(origin, random); - int seed = origin.hashCode(); - this.noise = new FastNoiseLite(seed); - this.rock = new FastNoiseLite(++seed); - geo = new TreeGeometry(this); - } - - /** - * Grows the tree in memory. Intended to be invoked from an async thread. - */ - @Override - public void grow() { - Location l1 = super.getOrigin().clone(); - int h = super.getRandom().nextInt(16) + 8; - for(int i = 0; i < h; i++) { - geo.generateSponge(l1.clone().add(0, i, 0), ice, (int) ((1-((double) i / h))*2+1), true, 70); - } - for(int i = 0; i < h/3; i++) { - setBlock(l1.clone().add(0, h+i, 0), ice.get(super.getRandom())); - } - } -} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java index 091a12a4d..9caa60af9 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import org.bukkit.Location; +import com.dfsek.terra.api.generic.world.vector.Location; import org.bukkit.Material; import org.bukkit.entity.EnderCrystal; diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java index 5bab237c8..45c730596 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java @@ -3,10 +3,10 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.generic.world.vector.Vector3; import net.jafama.FastMath; -import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.util.Vector; import java.util.Random; @@ -35,11 +35,11 @@ public class ShatteredTree extends FractalTree { */ @Override public void grow() { - growBranch(super.getOrigin().clone(), new Vector(super.getRandom().nextInt(5) - 2, super.getRandom().nextInt(4) + 6, super.getRandom().nextInt(5) - 2), 1, 0); + growBranch(super.getOrigin().clone(), new Vector3(super.getRandom().nextInt(5) - 2, super.getRandom().nextInt(4) + 6, super.getRandom().nextInt(5) - 2), 1, 0); } - private void growBranch(Location l1, Vector diff, double d1, int recursions) { + private void growBranch(Location l1, Vector3 diff, double d1, int recursions) { if(recursions > 2) { geo.generateSphere(l1, leaves, 1 + super.getRandom().nextInt(2), false); return; diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java index 56054adbb..2f1581228 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import org.bukkit.Location; +import com.dfsek.terra.api.generic.world.vector.Location; import org.bukkit.Material; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java index 2c6f582ff..569c986ee 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java @@ -3,10 +3,10 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.generic.world.vector.Vector3; import net.jafama.FastMath; -import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.util.Vector; import java.util.Random; @@ -35,11 +35,11 @@ public class SmallShatteredTree extends FractalTree { */ @Override public void grow() { - growBranch(super.getOrigin().clone(), new Vector(super.getRandom().nextInt(5) - 2, super.getRandom().nextInt(3) + 4, super.getRandom().nextInt(5) - 2), 1.5, 0); + growBranch(super.getOrigin().clone(), new Vector3(super.getRandom().nextInt(5) - 2, super.getRandom().nextInt(3) + 4, super.getRandom().nextInt(5) - 2), 1.5, 0); } - private void growBranch(Location l1, Vector diff, double d1, int recursions) { + private void growBranch(Location l1, Vector3 diff, double d1, int recursions) { if(recursions > 2) { geo.generateSphere(l1, leaves, 1 + super.getRandom().nextInt(2) + (3 - recursions), false); return; diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java index 9eabfa86f..83d5765cd 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java @@ -2,10 +2,10 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.generic.world.vector.Vector3; import net.jafama.FastMath; -import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.util.Vector; import java.util.Random; @@ -28,10 +28,10 @@ public class SpruceTree extends FractalTree { */ @Override public void grow() { - growTrunk(super.getOrigin().clone(), new Vector(0, 16 + super.getRandom().nextInt(5), 0)); + growTrunk(super.getOrigin().clone(), new Vector3(0, 16 + super.getRandom().nextInt(5), 0)); } - private void growTrunk(Location l1, Vector diff) { + private void growTrunk(Location l1, Vector3 diff) { if(diff.getY() < 0) diff.rotateAroundAxis(TreeGeometry.getPerpendicular(diff.clone()).normalize(), FastMath.PI); int d = (int) diff.length(); int rad = 7; diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java b/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java index 61a47b743..d59730594 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java +++ b/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java @@ -1,19 +1,21 @@ package com.dfsek.terra.api.gaea.world; +import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.vector.Location; import com.google.common.collect.Sets; import org.bukkit.Bukkit; -import org.bukkit.Chunk; -import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.block.data.BlockData; import java.util.Arrays; import java.util.List; import java.util.Set; +import java.util.stream.Collectors; public enum FloraType implements Flora { TALL_GRASS(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:tall_grass[half=lower]"), Bukkit.createBlockData("minecraft:tall_grass[half=upper]")), @@ -51,8 +53,8 @@ public enum FloraType implements Flora { private final Set spawns; - FloraType(Set validSpawns, BlockData... type) { - data.addAll(Arrays.asList(type)); + FloraType(Set validSpawns, org.bukkit.block.data.BlockData... type) { + data.addAll(Arrays.stream(type).map(BukkitBlockData::new).collect(Collectors.toList())); this.spawns = validSpawns; } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java b/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java index 8c1a08c88..5f6905441 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.generic.world; import com.dfsek.terra.api.generic.Handle; -import org.bukkit.block.Biome; import org.jetbrains.annotations.NotNull; public interface BiomeGrid extends Handle { diff --git a/src/main/java/com/dfsek/terra/api/generic/world/World.java b/src/main/java/com/dfsek/terra/api/generic/world/World.java index e3ef05fbf..74624e8ce 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/World.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/World.java @@ -4,6 +4,9 @@ import com.dfsek.terra.api.generic.Handle; import com.dfsek.terra.api.generic.generator.ChunkGenerator; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; +import org.bukkit.TreeType; +import org.bukkit.entity.Entity; +import org.bukkit.util.Consumer; import java.io.File; import java.util.UUID; @@ -28,4 +31,8 @@ public interface World extends Handle { Block getBlockAt(int x, int y, int z); Block getBlockAt(Location l); + + boolean generateTree(Location l, TreeType vanillaTreeType); // TODO: Bukkit treetype is bad + + void spawn(Location location, Class entity, Consumer consumer); // TODO: Bukkit Entity is bad } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java b/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java index 6f439ffa5..d72371bab 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java @@ -23,4 +23,6 @@ public interface Block extends Handle { int getZ(); int getY(); + + boolean isPassable(); } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java b/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java index 628192332..c0a724a0d 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java @@ -8,4 +8,6 @@ public interface MaterialData extends Handle { boolean matches(BlockData other); boolean isSolid(); + + boolean isAir(); } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java b/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java index 62409e5b1..77fde3ff4 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java @@ -77,4 +77,18 @@ public class Location implements Cloneable { public Block getBlock() { return world.getBlockAt(this); } + + public Location subtract(int x, int y, int z) { + vector.subtract(x, y, z); + return this; + } + + public Location add(Vector3 add) { + vector.add(add); + return this; + } + + public Vector3 toVector() { + return vector.clone(); + } } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java b/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java index f4caa28fd..fbde7e7fc 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java @@ -23,6 +23,15 @@ public class Vector3 implements Cloneable { this.z = z; } + /** + * Get the threshold used for equals(). + * + * @return The epsilon. + */ + public static double getEpsilon() { + return epsilon; + } + public double getZ() { return z; } @@ -89,15 +98,6 @@ public class Vector3 implements Cloneable { return this; } - /** - * Get the threshold used for equals(). - * - * @return The epsilon. - */ - public static double getEpsilon() { - return epsilon; - } - public double lengthSquared() { return x * x + y * y + z * z; } @@ -300,4 +300,11 @@ public class Vector3 implements Cloneable { public Vector3 normalize() { return this.multiply(1D / this.length()); } + + public Vector3 subtract(int x, int y, int z) { + this.x -= x; + this.y -= y; + this.z = -z; + return this; + } } diff --git a/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java b/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java index 73940b84d..cf286d2b7 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java +++ b/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java @@ -3,9 +3,9 @@ package com.dfsek.terra.async; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import org.bukkit.Location; -import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; @@ -15,7 +15,7 @@ import java.util.function.Consumer; */ public class AsyncBiomeFinder extends AsyncFeatureFinder { - public AsyncBiomeFinder(TerraBiomeGrid grid, Biome target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraBukkitPlugin main) { + public AsyncBiomeFinder(TerraBiomeGrid grid, Biome target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraBukkitPlugin main) { super(grid, target, origin, startRadius, maxRadius, callback, main); } @@ -33,7 +33,7 @@ public class AsyncBiomeFinder extends AsyncFeatureFinder { } @Override - public Vector finalizeVector(Vector orig) { + public Vector3 finalizeVector(Vector3 orig) { return orig.multiply(main.getTerraConfig().getBiomeSearchResolution()); } } diff --git a/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java b/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java index b45c479d3..e4b287ea8 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java +++ b/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java @@ -1,11 +1,11 @@ package com.dfsek.terra.async; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; @@ -18,11 +18,11 @@ public abstract class AsyncFeatureFinder implements Runnable { protected final int centerX; protected final int centerZ; protected final World world; - private final Consumer callback; + private final Consumer callback; protected int searchSize = 1; protected final TerraBukkitPlugin main; - public AsyncFeatureFinder(TerraBiomeGrid grid, T target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraBukkitPlugin main) { + public AsyncFeatureFinder(TerraBiomeGrid grid, T target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraBukkitPlugin main) { this.grid = grid; this.target = target; this.main = main; @@ -67,12 +67,12 @@ public abstract class AsyncFeatureFinder implements Runnable { run++; toggle = !toggle; } - Vector finalSpawn = found ? finalizeVector(new Vector(x, 0, z)) : null; + Vector3 finalSpawn = found ? finalizeVector(new Vector3(x, 0, z)) : null; Bukkit.getScheduler().runTask(main, () -> callback.accept(finalSpawn)); } - public abstract Vector finalizeVector(Vector orig); + public abstract Vector3 finalizeVector(Vector3 orig); public abstract boolean isValid(int x, int z, T target); diff --git a/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java b/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java index 265b48c81..06941f71e 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java +++ b/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java @@ -1,7 +1,9 @@ package com.dfsek.terra.async; +import com.dfsek.terra.api.bukkit.BukkitWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.items.TerraStructure; @@ -10,7 +12,6 @@ import com.dfsek.terra.structure.Rotation; import com.dfsek.terra.structure.Structure; import org.bukkit.Location; import org.bukkit.World; -import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import java.util.Random; @@ -20,7 +21,7 @@ import java.util.function.Consumer; * Runnable to locate structures asynchronously */ public class AsyncStructureFinder extends AsyncFeatureFinder { - public AsyncStructureFinder(TerraBiomeGrid grid, TerraStructure target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraBukkitPlugin main) { + public AsyncStructureFinder(TerraBiomeGrid grid, TerraStructure target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraBukkitPlugin main) { super(grid, target, origin, startRadius, maxRadius, callback, main); setSearchSize(target.getSpawn().getWidth() + 2 * target.getSpawn().getSeparation()); } @@ -34,7 +35,7 @@ public class AsyncStructureFinder extends AsyncFeatureFinder { */ public boolean isValid(int x, int z, TerraStructure target) { World world = getWorld(); - Location spawn = target.getSpawn().getChunkSpawn(x, z, world.getSeed()).toLocation(world); + com.dfsek.terra.api.generic.world.vector.Location spawn = target.getSpawn().getChunkSpawn(x, z, world.getSeed()).toLocation(new BukkitWorld(world)); if(!((UserDefinedBiome) grid.getBiome(spawn)).getConfig().getStructures().contains(target)) return false; Random r2 = new FastRandom(spawn.hashCode()); Structure struc = target.getStructures().get(r2); @@ -49,7 +50,7 @@ public class AsyncStructureFinder extends AsyncFeatureFinder { } @Override - public Vector finalizeVector(Vector orig) { + public Vector3 finalizeVector(Vector3 orig) { GridSpawn spawn = target.getSpawn(); return spawn.getChunkSpawn(orig.getBlockX(), orig.getBlockZ(), world.getSeed()); } diff --git a/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java b/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java index 34e5f78d4..3ea850369 100644 --- a/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java +++ b/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java @@ -15,14 +15,14 @@ import org.bukkit.World; public class UserDefinedBiome implements Biome { private final GeneratorBuilder gen; private final UserDefinedDecorator decorator; - private final org.bukkit.block.Biome vanilla; + private final com.dfsek.terra.api.generic.world.Biome vanilla; private final String id; private final BiomeTemplate config; private final ConfigPack pack; private UserDefinedBiome erode; - public UserDefinedBiome(org.bukkit.block.Biome vanilla, UserDefinedDecorator dec, GeneratorBuilder gen, BiomeTemplate config, ConfigPack pack) { + public UserDefinedBiome(com.dfsek.terra.api.generic.world.Biome vanilla, UserDefinedDecorator dec, GeneratorBuilder gen, BiomeTemplate config, ConfigPack pack) { this.vanilla = vanilla; this.decorator = dec; this.gen = gen; @@ -37,7 +37,7 @@ public class UserDefinedBiome implements Biome { * @return Biome - The Vanilla biome. */ @Override - public org.bukkit.block.Biome getVanillaBiome() { + public com.dfsek.terra.api.generic.world.Biome getVanillaBiome() { return vanilla; } diff --git a/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java b/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java index 643bf24cc..4b72a6226 100644 --- a/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java +++ b/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java @@ -1,7 +1,7 @@ package com.dfsek.terra.biome.palette; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import org.bukkit.block.data.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockData; import org.jetbrains.annotations.NotNull; public class PaletteLayer { diff --git a/src/main/java/com/dfsek/terra/command/FixChunkCommand.java b/src/main/java/com/dfsek/terra/command/FixChunkCommand.java index 7efd71d29..83d721333 100644 --- a/src/main/java/com/dfsek/terra/command/FixChunkCommand.java +++ b/src/main/java/com/dfsek/terra/command/FixChunkCommand.java @@ -17,7 +17,7 @@ public class FixChunkCommand extends WorldCommand { @Override public boolean execute(@NotNull Player player, @NotNull Command command, @NotNull String s, @NotNull String[] strings, World world) { - TerraChunkGenerator.fixChunk(player.getLocation().getChunk()); + //TerraChunkGenerator.fixChunk(player.getLocation().getChunk()); return true; } diff --git a/src/main/java/com/dfsek/terra/command/SaveDataCommand.java b/src/main/java/com/dfsek/terra/command/SaveDataCommand.java index cbd22670f..fb34002d2 100644 --- a/src/main/java/com/dfsek/terra/command/SaveDataCommand.java +++ b/src/main/java/com/dfsek/terra/command/SaveDataCommand.java @@ -38,7 +38,7 @@ public class SaveDataCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args, World w) { - TerraChunkGenerator.saveAll(); + //TerraChunkGenerator.saveAll(); LangUtil.send("debug.data-save", sender, w.getName()); return true; } diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java b/src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java index f8bc63591..24b70bf33 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java +++ b/src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java @@ -1,11 +1,6 @@ package com.dfsek.terra.command.biome; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -23,9 +18,12 @@ public class BiomeCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World w) { + /* TerraBiomeGrid grid = ((TerraBukkitPlugin) getMain()).getWorld(sender.getWorld()).getGrid(); UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome(sender.getLocation(), GenerationPhase.POPULATE); LangUtil.send("command.biome.in", sender, biome.getID()); + + */ return true; } diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java b/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java index 900d7bf79..4f5c00324 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java +++ b/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java @@ -1,5 +1,6 @@ package com.dfsek.terra.command.biome; +import com.dfsek.terra.api.bukkit.BukkitWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.biome.UserDefinedBiome; @@ -17,7 +18,6 @@ import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.stream.Collectors; public class BiomeInfoCommand extends WorldCommand { public BiomeInfoCommand(com.dfsek.terra.api.gaea.command.Command parent) { @@ -27,7 +27,7 @@ public class BiomeInfoCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { String id = args[0]; - ConfigPack cfg = ((TerraBukkitPlugin) getMain()).getWorld(world).getConfig(); + ConfigPack cfg = ((TerraBukkitPlugin) getMain()).getWorld(new BukkitWorld(world)).getConfig(); UserDefinedBiome b; try { b = cfg.getBiome(id); @@ -84,11 +84,14 @@ public class BiomeInfoCommand extends WorldCommand { @Override public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { + /* if(!(sender instanceof Player) || !(((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator)) return Collections.emptyList(); List ids = ((TerraBukkitPlugin) getMain()).getWorld(((Player) sender).getWorld()).getConfig().getBiomeIDs(); if(args.length == 1) return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); + + */ return Collections.emptyList(); } } diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java b/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java index b98c5f84f..b75eebf1d 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java +++ b/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java @@ -1,28 +1,14 @@ package com.dfsek.terra.command.biome; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; -import com.dfsek.terra.async.AsyncBiomeFinder; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.generation.TerraChunkGenerator; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.chat.ComponentBuilder; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; -import java.util.stream.Collectors; public class BiomeLocateCommand extends WorldCommand { private final boolean tp; @@ -35,6 +21,7 @@ public class BiomeLocateCommand extends WorldCommand { @SuppressWarnings("DuplicatedCode") @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { + /* String id = args[0]; int maxRadius; try { @@ -62,6 +49,8 @@ public class BiomeLocateCommand extends WorldCommand { // LangUtil.send("command.biome.biome-found", sender, String.valueOf(location.getBlockX()), String.valueOf(location.getBlockZ())); } else LangUtil.send("command.biome.unable-to-locate", sender); }, (TerraBukkitPlugin) getMain())); + + */ return true; } @@ -82,11 +71,14 @@ public class BiomeLocateCommand extends WorldCommand { @Override public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { + /* if(!(sender instanceof Player) || !(((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator)) return Collections.emptyList(); List ids = ((TerraBukkitPlugin) getMain()).getWorld(((Player) sender).getWorld()).getConfig().getBiomeIDs(); if(args.length == 1) return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); + + */ return Collections.emptyList(); } } diff --git a/src/main/java/com/dfsek/terra/command/image/RenderCommand.java b/src/main/java/com/dfsek/terra/command/image/RenderCommand.java index 3b5d19527..bc913384b 100644 --- a/src/main/java/com/dfsek/terra/command/image/RenderCommand.java +++ b/src/main/java/com/dfsek/terra/command/image/RenderCommand.java @@ -1,16 +1,12 @@ package com.dfsek.terra.command.image; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; -import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.image.WorldImageGenerator; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.io.File; import java.util.Collections; import java.util.List; @@ -21,6 +17,7 @@ public class RenderCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { + /* try { WorldImageGenerator g = new WorldImageGenerator(world, Integer.parseInt(args[0]), Integer.parseInt(args[1]), (TerraBukkitPlugin) getMain()); g.drawWorld(sender.getLocation().getBlockX(), sender.getLocation().getBlockZ()); @@ -37,6 +34,9 @@ public class RenderCommand extends WorldCommand { LangUtil.send("command.image.render.error", sender); return true; } + + */ + return true; } @Override diff --git a/src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java b/src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java index 9f886886c..52f2a6472 100644 --- a/src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java +++ b/src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java @@ -1,9 +1,6 @@ package com.dfsek.terra.command.image.gui; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; -import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.image.ImageLoader; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -20,6 +17,7 @@ public class RawGUICommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { + /* if(!getMain().isDebug()) { LangUtil.send("command.image.gui.debug", sender); return true; @@ -27,6 +25,8 @@ public class RawGUICommand extends WorldCommand { ImageLoader loader = ((TerraBukkitPlugin) getMain()).getWorld(world).getConfig().getTemplate().getImageLoader(); if(loader != null) loader.debug(false, sender.getWorld(), (TerraBukkitPlugin) getMain()); else ImageLoader.debugWorld(false, world, (TerraBukkitPlugin) getMain()); + + */ return true; } diff --git a/src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java b/src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java index 513b8ff28..1d838aebb 100644 --- a/src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java +++ b/src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java @@ -1,9 +1,6 @@ package com.dfsek.terra.command.image.gui; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; -import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.image.ImageLoader; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -20,6 +17,7 @@ public class StepGUICommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { + /* if(!getMain().isDebug()) { LangUtil.send("command.image.gui.debug", sender); return true; @@ -27,6 +25,8 @@ public class StepGUICommand extends WorldCommand { ImageLoader loader = ((TerraBukkitPlugin) getMain()).getWorld(world).getConfig().getTemplate().getImageLoader(); if(loader != null) loader.debug(true, sender.getWorld(), (TerraBukkitPlugin) getMain()); else ImageLoader.debugWorld(true, world, (TerraBukkitPlugin) getMain()); + + */ return true; } diff --git a/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java b/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java index 31c8cda9f..1802c8777 100644 --- a/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java @@ -1,5 +1,6 @@ package com.dfsek.terra.command.profile; +import com.dfsek.terra.api.bukkit.BukkitWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; @@ -19,7 +20,7 @@ public class QueryCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(world).getProfiler(); + WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(new BukkitWorld(world)).getProfiler(); sender.sendMessage(profile.getResultsFormatted()); return true; } diff --git a/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java b/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java index c4b256373..2efefdb23 100644 --- a/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java @@ -1,5 +1,6 @@ package com.dfsek.terra.command.profile; +import com.dfsek.terra.api.bukkit.BukkitWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; @@ -20,7 +21,7 @@ public class ResetCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(world).getProfiler(); + WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(new BukkitWorld(world)).getProfiler(); profile.reset(); LangUtil.send("command.profile.reset", sender); return true; diff --git a/src/main/java/com/dfsek/terra/command/profile/StartCommand.java b/src/main/java/com/dfsek/terra/command/profile/StartCommand.java index 0ef729e97..16bf4a813 100644 --- a/src/main/java/com/dfsek/terra/command/profile/StartCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/StartCommand.java @@ -1,5 +1,6 @@ package com.dfsek.terra.command.profile; +import com.dfsek.terra.api.bukkit.BukkitWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; @@ -20,7 +21,7 @@ public class StartCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(world).getProfiler(); + WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(new BukkitWorld(world)).getProfiler(); profile.setProfiling(true); LangUtil.send("command.profile.start", sender); return true; diff --git a/src/main/java/com/dfsek/terra/command/profile/StopCommand.java b/src/main/java/com/dfsek/terra/command/profile/StopCommand.java index 07c9ff2b0..de4b0564a 100644 --- a/src/main/java/com/dfsek/terra/command/profile/StopCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/StopCommand.java @@ -1,5 +1,6 @@ package com.dfsek.terra.command.profile; +import com.dfsek.terra.api.bukkit.BukkitWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; @@ -20,7 +21,7 @@ public class StopCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(world).getProfiler(); + WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(new BukkitWorld(world)).getProfiler(); profile.setProfiling(false); LangUtil.send("command.profile.stop", sender); return true; diff --git a/src/main/java/com/dfsek/terra/command/structure/ExportCommand.java b/src/main/java/com/dfsek/terra/command/structure/ExportCommand.java index 7afb8cdf9..d3bbcb15b 100644 --- a/src/main/java/com/dfsek/terra/command/structure/ExportCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/ExportCommand.java @@ -1,9 +1,6 @@ package com.dfsek.terra.command.structure; import com.dfsek.terra.api.gaea.command.PlayerCommand; -import com.dfsek.terra.config.lang.LangUtil; -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; @@ -11,8 +8,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.io.File; -import java.io.IOException; import java.util.Collections; import java.util.List; @@ -24,7 +19,8 @@ public class ExportCommand extends PlayerCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { Location[] l = WorldEditUtil.getSelectionLocations(sender); - if(l == null) return true; + /*if(l == null) return true; + Location l1 = l[0]; Location l2 = l[1]; Structure structure; @@ -45,6 +41,8 @@ public class ExportCommand extends PlayerCommand { } catch(IOException e) { e.printStackTrace(); } + + */ return true; } diff --git a/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java b/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java index 04a9e3711..871123f2a 100644 --- a/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java @@ -1,28 +1,15 @@ package com.dfsek.terra.command.structure; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; -import com.dfsek.terra.async.AsyncStructureFinder; import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.generation.items.TerraStructure; -import net.md_5.bungee.api.ChatColor; -import net.md_5.bungee.api.chat.BaseComponent; -import net.md_5.bungee.api.chat.ClickEvent; -import net.md_5.bungee.api.chat.ComponentBuilder; -import net.md_5.bungee.api.chat.HoverEvent; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; public class LocateCommand extends WorldCommand { private final boolean tp; @@ -44,6 +31,7 @@ public class LocateCommand extends WorldCommand { LangUtil.send("command.structure.invalid-radius", sender, args[1]); return true; } + /* TerraStructure s; try { s = Objects.requireNonNull(((TerraBukkitPlugin) getMain()).getWorld(world).getConfig().getStructure(id)); @@ -65,6 +53,8 @@ public class LocateCommand extends WorldCommand { sender.sendMessage("Unable to locate structure. "); } }, (TerraBukkitPlugin) getMain())); + + */ return true; } @@ -85,11 +75,15 @@ public class LocateCommand extends WorldCommand { @Override public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { + /* if(!(sender instanceof Player) || !(((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator)) return Collections.emptyList(); + List ids = ((TerraBukkitPlugin) getMain()).getWorld(((Player) sender).getWorld()).getConfig().getStructureIDs(); if(args.length == 1) return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); + + */ return Collections.emptyList(); } } diff --git a/src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java b/src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java index 7ca2eb7a7..dae0e5a04 100644 --- a/src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java @@ -1,9 +1,7 @@ package com.dfsek.terra.command.structure; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.DebugCommand; import com.dfsek.terra.api.gaea.command.WorldCommand; -import com.dfsek.terra.structure.StructureSpawnRequirement; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.Command; @@ -25,11 +23,14 @@ public class SpawnCommand extends WorldCommand implements DebugCommand { int x = p.getBlockX(); int y = p.getBlockY(); int z = p.getBlockZ(); + /* boolean air = StructureSpawnRequirement.AIR.getInstance(world, (TerraBukkitPlugin) getMain()).matches(x, y, z); boolean ground = StructureSpawnRequirement.LAND.getInstance(world, (TerraBukkitPlugin) getMain()).matches(x, y, z); boolean sea = StructureSpawnRequirement.OCEAN.getInstance(world, (TerraBukkitPlugin) getMain()).matches(x, y, z); sender.sendMessage("AIR: " + air + "\nLAND: " + ground + "\nOCEAN: " + sea); + + */ return true; } diff --git a/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java b/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java index b238d065e..31a31fd46 100644 --- a/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java @@ -1,17 +1,11 @@ package com.dfsek.terra.command.structure.load; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.DebugCommand; -import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.structure.Rotation; -import com.dfsek.terra.structure.Structure; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.io.File; -import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -27,6 +21,7 @@ public class LoadFullCommand extends LoadCommand implements DebugCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { + /* try { Rotation r; try { @@ -43,6 +38,8 @@ public class LoadFullCommand extends LoadCommand implements DebugCommand { e.printStackTrace(); LangUtil.send("command.structure.invalid", sender, args[0]); } + + */ return true; } diff --git a/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java b/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java index 4100b256e..f3ac6c8dd 100644 --- a/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java +++ b/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java @@ -1,23 +1,12 @@ package com.dfsek.terra.command.structure.load; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.DebugCommand; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.structure.Structure; -import com.dfsek.terra.structure.StructureContainedBlock; -import com.dfsek.terra.structure.StructureInfo; -import com.dfsek.terra.structure.StructureSpawnRequirement; -import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.block.Sign; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.io.File; -import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -37,6 +26,7 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { + /* try { WorldHandle handle = ((TerraBukkitPlugin) getMain()).getHandle(); Structure struc = Structure.load(new File(getMain().getDataFolder() + File.separator + "export" + File.separator + "structures", args[0] + ".tstructure")); @@ -88,6 +78,8 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { e.printStackTrace(); LangUtil.send("command.structure.invalid", sender, args[0]); } + + */ return true; } diff --git a/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java b/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java index d25bafc04..a1ee6bf81 100644 --- a/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java @@ -5,10 +5,10 @@ import com.dfsek.terra.api.gaea.world.Flora; import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.api.gaea.world.palette.RandomPalette; import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.templates.FloraTemplate; import com.dfsek.terra.generation.items.flora.TerraFlora; -import org.bukkit.block.data.BlockData; public class FloraFactory implements TerraFactory { @Override diff --git a/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java b/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java index 85d19d977..9c889088e 100644 --- a/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java +++ b/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java @@ -6,9 +6,9 @@ import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.api.gaea.world.palette.RandomPalette; import com.dfsek.terra.api.gaea.world.palette.SimplexPalette; import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.templates.PaletteTemplate; -import org.bukkit.block.data.BlockData; public class PaletteFactory implements TerraFactory> { @Override diff --git a/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java b/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java index 7c3e62d14..fc998ff5c 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java @@ -4,9 +4,9 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.loaders.Types; -import org.bukkit.block.data.BlockData; import java.lang.reflect.Type; import java.util.Map; diff --git a/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java b/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java index 26f38b7a7..16cdaec88 100644 --- a/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java @@ -3,6 +3,7 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; +import com.dfsek.terra.api.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.generation.items.flora.TerraFlora; import com.dfsek.terra.util.MaterialSet; @@ -28,7 +29,7 @@ public class FloraTemplate extends AbstractableTemplate { @Value("replaceable") @Abstractable @Default - private MaterialSet replaceable = MaterialSet.singleton(Material.AIR); + private MaterialSet replaceable = MaterialSet.singleton(new BukkitMaterialData(Material.AIR)); @Value("irrigable") @Abstractable diff --git a/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java b/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java index 22ecfe5bd..90cd937e1 100644 --- a/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java +++ b/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java @@ -1,12 +1,6 @@ package com.dfsek.terra.debug.gui; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.image.ImageLoader; -import net.jafama.FastMath; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; import javax.swing.*; import java.awt.*; @@ -33,8 +27,8 @@ public class DebugFrame extends JFrame implements ActionListener { @Override public void paint(Graphics g) { super.paintComponents(g); + /* for(Player p : Bukkit.getOnlinePlayers()) { - if(!(p.getWorld().getGenerator() instanceof TerraChunkGenerator)) break; int xp = (int) (((double) FastMath.floorMod(p.getLocation().getBlockX() - (img.getWidth() / 2), x) / x) * getWidth()); int zp = (int) (((double) FastMath.floorMod(p.getLocation().getBlockZ() - (img.getHeight() / 2), z) / z) * getHeight()); ImageLoader loader = main.getWorld(p.getWorld()).getConfig().getTemplate().getImageLoader(); @@ -52,6 +46,8 @@ public class DebugFrame extends JFrame implements ActionListener { g.setColor(Color.RED); g.fillOval(xp + 3, zp + 3, 5, 5); } + + */ } @Override diff --git a/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index 4c767eea9..c84a1897c 100644 --- a/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -3,6 +3,7 @@ package com.dfsek.terra.generation.items.tree; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.tree.Tree; +import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.structure.Rotation; import com.dfsek.terra.structure.Structure; @@ -10,8 +11,6 @@ import com.dfsek.terra.structure.StructureContainedBlock; import com.dfsek.terra.structure.StructureInfo; import com.dfsek.terra.util.MaterialSet; import com.dfsek.terra.util.structure.RotationUtil; -import org.bukkit.Location; -import org.bukkit.plugin.java.JavaPlugin; import java.util.Random; @@ -27,13 +26,13 @@ public class TerraTree implements Tree { } @Override - public boolean plant(Location location, Random random, JavaPlugin main) { + public boolean plant(Location location, Random random) { Location mut = location.clone().subtract(0, yOffset, 0); if(!spawnable.contains(location.getBlock().getType())) return false; Structure struc = structure.get(random); Rotation rotation = Rotation.fromDegrees(random.nextInt(4) * 90); - if(!struc.checkSpawns(mut, rotation, (TerraBukkitPlugin) main)) return false; - struc.paste(mut, rotation, (TerraBukkitPlugin) main); + if(!struc.checkSpawns(mut, rotation, null)) return false; + struc.paste(mut, rotation, null); return true; } diff --git a/src/main/java/com/dfsek/terra/listeners/EventListener.java b/src/main/java/com/dfsek/terra/listeners/EventListener.java index e79751598..f00280038 100644 --- a/src/main/java/com/dfsek/terra/listeners/EventListener.java +++ b/src/main/java/com/dfsek/terra/listeners/EventListener.java @@ -1,17 +1,6 @@ package com.dfsek.terra.listeners; -import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; -import com.dfsek.terra.api.gaea.tree.Tree; -import com.dfsek.terra.api.gaea.tree.TreeType; -import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.generation.items.tree.TerraTree; -import com.dfsek.terra.registry.TreeRegistry; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.block.data.BlockData; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.StructureGrowEvent; @@ -28,8 +17,10 @@ public class EventListener implements Listener { @EventHandler public void onSaplingGrow(StructureGrowEvent e) { - if(!TerraWorld.isTerraWorld(e.getWorld())) return; - TerraWorld tw = main.getWorld(e.getWorld()); + /* + World bukkit = new BukkitWorld(e.getWorld()); + if(!TerraWorld.isTerraWorld(bukkit)) return; + TerraWorld tw = main.getWorld(bukkit); ConfigPack c = tw.getConfig(); if(c.getTemplate().isDisableSaplings()) return; e.setCancelled(true); @@ -44,5 +35,7 @@ public class EventListener implements Listener { block.setBlockData(data); } } else if(!tree.plant(e.getLocation().subtract(0, 1, 0), new FastRandom(), main)) block.setBlockData(data); + + */ } } diff --git a/src/main/java/com/dfsek/terra/listeners/SpigotListener.java b/src/main/java/com/dfsek/terra/listeners/SpigotListener.java index 0d5196fb1..7ec8f2e5c 100644 --- a/src/main/java/com/dfsek/terra/listeners/SpigotListener.java +++ b/src/main/java/com/dfsek/terra/listeners/SpigotListener.java @@ -1,21 +1,7 @@ package com.dfsek.terra.listeners; -import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; -import com.dfsek.terra.async.AsyncStructureFinder; -import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.generation.items.TerraStructure; -import com.dfsek.terra.util.StructureTypeEnum; -import org.bukkit.entity.EnderSignal; -import org.bukkit.entity.Entity; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Villager; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; -import org.bukkit.event.entity.EntitySpawnEvent; -import org.bukkit.event.entity.VillagerAcquireTradeEvent; -import org.bukkit.event.entity.VillagerCareerChangeEvent; /** * Listener to load on Spigot servers, contains Villager crash prevention and hacky ender eye redirection. @@ -29,6 +15,7 @@ public class SpigotListener implements Listener { public SpigotListener(TerraBukkitPlugin main) { this.main = main; } + /* @EventHandler(priority = EventPriority.NORMAL) public void onEnderEye(EntitySpawnEvent e) { @@ -67,4 +54,6 @@ public class SpigotListener implements Listener { e.setCancelled(true); } } + + */ } diff --git a/src/main/java/com/dfsek/terra/registry/FloraRegistry.java b/src/main/java/com/dfsek/terra/registry/FloraRegistry.java index 7c677e3dc..4bd5fbbbd 100644 --- a/src/main/java/com/dfsek/terra/registry/FloraRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/FloraRegistry.java @@ -2,8 +2,6 @@ package com.dfsek.terra.registry; import com.dfsek.terra.api.gaea.world.Flora; import com.dfsek.terra.api.gaea.world.FloraType; -import com.dfsek.terra.generation.items.flora.BlockFlora; -import org.bukkit.Bukkit; public class FloraRegistry extends TerraRegistry { public FloraRegistry() { @@ -12,8 +10,6 @@ public class FloraRegistry extends TerraRegistry { @Override public Flora get(String id) { - if(id.startsWith("BLOCK:")) - return new BlockFlora(Bukkit.createBlockData(id.substring(6))); // Return single flora for BLOCK: shortcut. return super.get(id); } } diff --git a/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java b/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java index 11339f586..074a0d3b4 100644 --- a/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java @@ -1,15 +1,16 @@ package com.dfsek.terra.registry; +import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.biome.palette.SinglePalette; import org.bukkit.Bukkit; -import org.bukkit.block.data.BlockData; public class PaletteRegistry extends TerraRegistry> { @Override public Palette get(String id) { if(id.startsWith("BLOCK:")) - return new SinglePalette<>(Bukkit.createBlockData(id.substring(6))); // Return single palette for BLOCK: shortcut. + return new SinglePalette<>(new BukkitBlockData(Bukkit.createBlockData(id.substring(6)))); // Return single palette for BLOCK: shortcut. return super.get(id); } } diff --git a/src/main/java/com/dfsek/terra/util/SlabUtil.java b/src/main/java/com/dfsek/terra/util/SlabUtil.java index ac036504a..3e2b5615f 100644 --- a/src/main/java/com/dfsek/terra/util/SlabUtil.java +++ b/src/main/java/com/dfsek/terra/util/SlabUtil.java @@ -4,19 +4,16 @@ import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.api.generic.generator.ChunkGenerator; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.generic.world.block.data.Bisected; import com.dfsek.terra.api.generic.world.block.data.Stairs; -import com.dfsek.terra.api.generic.world.block.data.Waterlogged; import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.generation.Sampler; -import org.bukkit.block.BlockFace; -import org.bukkit.block.data.type.Slab; import java.util.Map; public final class SlabUtil { public static void prepareBlockPartFloor(BlockData down, BlockData orig, ChunkGenerator.ChunkData chunk, Vector3 block, Map> slabs, Map> stairs, double thresh, Sampler sampler) { + /* if(sampler.sample(block.getBlockX(), block.getBlockY() - 0.4, block.getBlockZ()) > thresh) { if(stairs != null) { Palette stairPalette = stairs.get(down.getMaterial()); @@ -32,10 +29,12 @@ public final class SlabUtil { } else if(orig.matches(PaletteUtil.WATER)) return; chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), slab); } + */ } public static void prepareBlockPartCeiling(BlockData up, BlockData orig, ChunkGenerator.ChunkData chunk, Vector3 block, Map> slabs, Map> stairs, double thresh, Sampler sampler) { + /* if(sampler.sample(block.getBlockX(), block.getBlockY() + 0.4, block.getBlockZ()) > thresh) { if(stairs != null) { Palette stairPalette = stairs.get(up.getMaterial()); @@ -54,10 +53,14 @@ public final class SlabUtil { } else if(orig.matches(PaletteUtil.WATER)) return; // Only replace water if waterlogged. chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), slab); } + + */ } private static boolean placeStair(BlockData orig, ChunkGenerator.ChunkData chunk, Vector3 block, double thresh, Sampler sampler, Stairs stairNew) { - if(sampler.sample(block.getBlockX() - 0.55, block.getBlockY(), block.getBlockZ()) > thresh) { + /* + if(sampler.sample(block.getBlockX() - 0.55, block.getBlockY(), block.getBlockZ()) > thresh) { + stairNew.setFacing(BlockFace.WEST); } else if(sampler.sample(block.getBlockX(), block.getBlockY(), block.getBlockZ() - 0.55) > thresh) { stairNew.setFacing(BlockFace.NORTH); @@ -71,6 +74,8 @@ public final class SlabUtil { chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), stairNew); return true; } + + */ return false; } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 6dc8aa00b..6df5bf4a9 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: "Terra" -main: "com.dfsek.terra.api.bukkit.Terra" +main: "com.dfsek.terra.api.bukkit.TerraBukkitPlugin" version: "@VERSION@" load: "STARTUP" api-version: "1.16" From ee529a5973526f833406c200d49b50a5c3d800ed Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 21:39:31 -0700 Subject: [PATCH 015/210] refactor --- .../java/com/dfsek/terra/api/gaea/tree/TreeType.java | 2 +- .../dfsek/terra/api/gaea/tree/fractal/FractalTree.java | 2 +- .../java/com/dfsek/terra/api/gaea/world/FloraType.java | 2 +- .../{ => implementations}/bukkit/BukkitBiomeGrid.java | 4 ++-- .../api/{ => implementations}/bukkit/BukkitChunk.java | 4 ++-- .../api/{ => implementations}/bukkit/BukkitWorld.java | 6 +++--- .../bukkit/BukkitWorldHandle.java | 10 +++++----- .../bukkit/TerraBukkitPlugin.java | 4 ++-- .../bukkit/generator/BukkitChunkGenerator.java | 8 ++++---- .../bukkit/generator/BukkitChunkGeneratorWrapper.java | 6 +++--- .../bukkit/generator/BukkitPopulator.java | 6 +++--- .../bukkit/world/BukkitBiome.java | 2 +- .../bukkit/world/block/BukkitBlock.java | 6 +++--- .../bukkit/world/block/BukkitBlockData.java | 2 +- .../bukkit/world/block/BukkitMaterialData.java | 2 +- .../bukkit/world/block/data/BukkitEnumAdapter.java | 2 +- .../bukkit/world/block/data/BukkitStairs.java | 4 ++-- .../bukkit/world/block/data/BukkitWaterlogged.java | 4 ++-- .../java/com/dfsek/terra/async/AsyncBiomeFinder.java | 2 +- .../java/com/dfsek/terra/async/AsyncFeatureFinder.java | 2 +- .../com/dfsek/terra/async/AsyncStructureFinder.java | 4 ++-- .../java/com/dfsek/terra/command/PacksCommand.java | 2 +- .../java/com/dfsek/terra/command/ReloadCommand.java | 2 +- .../dfsek/terra/command/biome/BiomeInfoCommand.java | 4 ++-- .../com/dfsek/terra/command/profile/QueryCommand.java | 4 ++-- .../com/dfsek/terra/command/profile/ResetCommand.java | 4 ++-- .../com/dfsek/terra/command/profile/StartCommand.java | 4 ++-- .../com/dfsek/terra/command/profile/StopCommand.java | 4 ++-- .../java/com/dfsek/terra/config/base/PluginConfig.java | 2 +- .../java/com/dfsek/terra/config/lang/LangUtil.java | 2 +- .../dfsek/terra/config/templates/FloraTemplate.java | 2 +- .../java/com/dfsek/terra/debug/gui/DebugFrame.java | 2 +- src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java | 2 +- .../dfsek/terra/generation/TerraChunkGenerator.java | 2 +- .../dfsek/terra/generation/items/tree/TerraTree.java | 2 +- src/main/java/com/dfsek/terra/image/ImageLoader.java | 2 +- .../com/dfsek/terra/image/WorldImageGenerator.java | 2 +- .../java/com/dfsek/terra/listeners/EventListener.java | 2 +- .../java/com/dfsek/terra/listeners/SpigotListener.java | 2 +- .../java/com/dfsek/terra/population/CavePopulator.java | 2 +- .../com/dfsek/terra/population/FloraPopulator.java | 2 +- .../java/com/dfsek/terra/population/OrePopulator.java | 2 +- .../com/dfsek/terra/population/StructurePopulator.java | 2 +- .../java/com/dfsek/terra/population/TreePopulator.java | 2 +- .../java/com/dfsek/terra/registry/ConfigRegistry.java | 2 +- .../java/com/dfsek/terra/registry/PaletteRegistry.java | 2 +- src/main/java/com/dfsek/terra/structure/Structure.java | 2 +- .../terra/structure/StructureSpawnRequirement.java | 2 +- .../java/com/dfsek/terra/structure/spawn/AirSpawn.java | 2 +- .../com/dfsek/terra/structure/spawn/LandSpawn.java | 2 +- .../com/dfsek/terra/structure/spawn/OceanSpawn.java | 2 +- .../com/dfsek/terra/structure/spawn/Requirement.java | 2 +- src/main/resources/plugin.yml | 2 +- 53 files changed, 79 insertions(+), 79 deletions(-) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/BukkitBiomeGrid.java (89%) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/BukkitChunk.java (86%) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/BukkitWorld.java (91%) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/BukkitWorldHandle.java (77%) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/TerraBukkitPlugin.java (97%) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/generator/BukkitChunkGenerator.java (90%) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/generator/BukkitChunkGeneratorWrapper.java (83%) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/generator/BukkitPopulator.java (79%) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/world/BukkitBiome.java (84%) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/world/block/BukkitBlock.java (89%) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/world/block/BukkitBlockData.java (93%) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/world/block/BukkitMaterialData.java (93%) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/world/block/data/BukkitEnumAdapter.java (98%) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/world/block/data/BukkitStairs.java (90%) rename src/main/java/com/dfsek/terra/api/{ => implementations}/bukkit/world/block/data/BukkitWaterlogged.java (77%) diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java b/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java index e83b99747..d19c5b14b 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.gaea.tree; -import com.dfsek.terra.api.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitMaterialData; import com.google.common.collect.Sets; import org.bukkit.Material; diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java index 274afa51a..4bd4409db 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java +++ b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java @@ -1,10 +1,10 @@ package com.dfsek.terra.api.gaea.tree.fractal; -import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; import org.bukkit.Material; import org.bukkit.entity.Entity; import org.bukkit.util.Consumer; diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java b/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java index d59730594..f13ed9f02 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java +++ b/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java @@ -1,6 +1,5 @@ package com.dfsek.terra.api.gaea.world; -import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.generic.world.Chunk; @@ -8,6 +7,7 @@ import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; import com.google.common.collect.Sets; import org.bukkit.Bukkit; import org.bukkit.Material; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitBiomeGrid.java similarity index 89% rename from src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitBiomeGrid.java index 58f79ad7a..7f637ec62 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitBiomeGrid.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitBiomeGrid.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.api.bukkit; +package com.dfsek.terra.api.implementations.bukkit; -import com.dfsek.terra.api.bukkit.world.BukkitBiome; import com.dfsek.terra.api.generic.world.Biome; import com.dfsek.terra.api.generic.world.BiomeGrid; +import com.dfsek.terra.api.implementations.bukkit.world.BukkitBiome; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitChunk.java similarity index 86% rename from src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitChunk.java index 7d5bd7b84..94a9f8f61 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitChunk.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitChunk.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.api.bukkit; +package com.dfsek.terra.api.implementations.bukkit; -import com.dfsek.terra.api.bukkit.world.block.BukkitBlock; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlock; public class BukkitChunk implements Chunk { private final org.bukkit.Chunk delegate; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorld.java similarity index 91% rename from src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorld.java index 79af467ab..9a9fd0b55 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorld.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorld.java @@ -1,12 +1,12 @@ -package com.dfsek.terra.api.bukkit; +package com.dfsek.terra.api.implementations.bukkit; -import com.dfsek.terra.api.bukkit.generator.BukkitChunkGenerator; -import com.dfsek.terra.api.bukkit.world.block.BukkitBlock; import com.dfsek.terra.api.generic.generator.ChunkGenerator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.implementations.bukkit.generator.BukkitChunkGenerator; +import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlock; import org.bukkit.TreeType; import org.bukkit.entity.Entity; import org.bukkit.util.Consumer; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorldHandle.java similarity index 77% rename from src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorldHandle.java index b8c2ec442..f0285167b 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/BukkitWorldHandle.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorldHandle.java @@ -1,14 +1,14 @@ -package com.dfsek.terra.api.bukkit; +package com.dfsek.terra.api.implementations.bukkit; -import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; -import com.dfsek.terra.api.bukkit.world.block.BukkitMaterialData; -import com.dfsek.terra.api.bukkit.world.block.data.BukkitStairs; -import com.dfsek.terra.api.bukkit.world.block.data.BukkitWaterlogged; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.generic.world.block.data.Waterlogged; +import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; +import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitMaterialData; +import com.dfsek.terra.api.implementations.bukkit.world.block.data.BukkitStairs; +import com.dfsek.terra.api.implementations.bukkit.world.block.data.BukkitWaterlogged; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.type.Stairs; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/TerraBukkitPlugin.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/TerraBukkitPlugin.java similarity index 97% rename from src/main/java/com/dfsek/terra/api/bukkit/TerraBukkitPlugin.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/TerraBukkitPlugin.java index b2c55729f..52a9495d9 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/TerraBukkitPlugin.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/TerraBukkitPlugin.java @@ -1,13 +1,13 @@ -package com.dfsek.terra.api.bukkit; +package com.dfsek.terra.api.implementations.bukkit; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.bukkit.generator.BukkitChunkGeneratorWrapper; import com.dfsek.terra.api.gaea.GaeaPlugin; import com.dfsek.terra.api.gaea.lang.Language; import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.implementations.bukkit.generator.BukkitChunkGeneratorWrapper; import com.dfsek.terra.command.TerraCommand; import com.dfsek.terra.command.structure.LocateCommand; import com.dfsek.terra.config.base.ConfigPack; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGenerator.java similarity index 90% rename from src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGenerator.java index 8e6e847d9..83a4f1a26 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGenerator.java @@ -1,12 +1,12 @@ -package com.dfsek.terra.api.bukkit.generator; +package com.dfsek.terra.api.implementations.bukkit.generator; -import com.dfsek.terra.api.bukkit.BukkitBiomeGrid; -import com.dfsek.terra.api.bukkit.BukkitWorld; -import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.api.generic.generator.BlockPopulator; import com.dfsek.terra.api.generic.world.BiomeGrid; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.implementations.bukkit.BukkitBiomeGrid; +import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; +import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGeneratorWrapper.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGeneratorWrapper.java similarity index 83% rename from src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGeneratorWrapper.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGeneratorWrapper.java index 2574cf96d..f3d7d470e 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.api.bukkit.generator; +package com.dfsek.terra.api.implementations.bukkit.generator; -import com.dfsek.terra.api.bukkit.BukkitBiomeGrid; -import com.dfsek.terra.api.bukkit.BukkitWorld; import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; +import com.dfsek.terra.api.implementations.bukkit.BukkitBiomeGrid; +import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; import org.bukkit.World; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitPopulator.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitPopulator.java similarity index 79% rename from src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitPopulator.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitPopulator.java index 85a218c1e..2562f0f62 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/generator/BukkitPopulator.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitPopulator.java @@ -1,10 +1,10 @@ -package com.dfsek.terra.api.bukkit.generator; +package com.dfsek.terra.api.implementations.bukkit.generator; -import com.dfsek.terra.api.bukkit.BukkitChunk; -import com.dfsek.terra.api.bukkit.BukkitWorld; import com.dfsek.terra.api.generic.generator.BlockPopulator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.implementations.bukkit.BukkitChunk; +import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/BukkitBiome.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/BukkitBiome.java similarity index 84% rename from src/main/java/com/dfsek/terra/api/bukkit/world/BukkitBiome.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/world/BukkitBiome.java index e7b44fb0e..600e18be9 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/world/BukkitBiome.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/BukkitBiome.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.bukkit.world; +package com.dfsek.terra.api.implementations.bukkit.world; import com.dfsek.terra.api.generic.world.Biome; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlock.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitBlock.java similarity index 89% rename from src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlock.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitBlock.java index 3985e2945..4cf0129f0 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlock.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitBlock.java @@ -1,12 +1,12 @@ -package com.dfsek.terra.api.bukkit.world.block; +package com.dfsek.terra.api.implementations.bukkit.world.block; -import com.dfsek.terra.api.bukkit.BukkitWorld; -import com.dfsek.terra.api.bukkit.world.block.data.BukkitEnumAdapter; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; +import com.dfsek.terra.api.implementations.bukkit.world.block.data.BukkitEnumAdapter; public class BukkitBlock implements Block { private final org.bukkit.block.Block delegate; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlockData.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitBlockData.java similarity index 93% rename from src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlockData.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitBlockData.java index 98d6e54c7..a4760521b 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitBlockData.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitBlockData.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.bukkit.world.block; +package com.dfsek.terra.api.implementations.bukkit.world.block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitMaterialData.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitMaterialData.java similarity index 93% rename from src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitMaterialData.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitMaterialData.java index 14c17e7c6..af4717ea4 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/world/block/BukkitMaterialData.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitMaterialData.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.bukkit.world.block; +package com.dfsek.terra.api.implementations.bukkit.world.block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitEnumAdapter.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitEnumAdapter.java similarity index 98% rename from src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitEnumAdapter.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitEnumAdapter.java index 8410578b3..550c3def7 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitEnumAdapter.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitEnumAdapter.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.bukkit.world.block.data; +package com.dfsek.terra.api.implementations.bukkit.world.block.data; import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.data.Bisected; diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitStairs.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitStairs.java similarity index 90% rename from src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitStairs.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitStairs.java index 27ed177ea..b09142ce8 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitStairs.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitStairs.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.api.bukkit.world.block.data; +package com.dfsek.terra.api.implementations.bukkit.world.block.data; -import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.data.Stairs; +import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; import org.bukkit.block.data.BlockData; public class BukkitStairs extends BukkitBlockData implements Stairs { diff --git a/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitWaterlogged.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitWaterlogged.java similarity index 77% rename from src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitWaterlogged.java rename to src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitWaterlogged.java index 25ee1cc80..076c89e4b 100644 --- a/src/main/java/com/dfsek/terra/api/bukkit/world/block/data/BukkitWaterlogged.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitWaterlogged.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.bukkit.world.block.data; +package com.dfsek.terra.api.implementations.bukkit.world.block.data; -import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.api.generic.world.block.data.Waterlogged; +import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; import org.bukkit.block.data.BlockData; public class BukkitWaterlogged extends BukkitBlockData implements Waterlogged { diff --git a/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java b/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java index cf286d2b7..4a0652583 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java +++ b/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java @@ -1,9 +1,9 @@ package com.dfsek.terra.async; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import org.bukkit.Location; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java b/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java index e4b287ea8..aca7eccda 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java +++ b/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java @@ -1,7 +1,7 @@ package com.dfsek.terra.async; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import org.bukkit.Bukkit; import org.bukkit.Location; diff --git a/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java b/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java index 06941f71e..ef2f3afbc 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java +++ b/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java @@ -1,9 +1,9 @@ package com.dfsek.terra.async; -import com.dfsek.terra.api.bukkit.BukkitWorld; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.items.TerraStructure; diff --git a/src/main/java/com/dfsek/terra/command/PacksCommand.java b/src/main/java/com/dfsek/terra/command/PacksCommand.java index 4a41ff6ed..0d514ada6 100644 --- a/src/main/java/com/dfsek/terra/command/PacksCommand.java +++ b/src/main/java/com/dfsek/terra/command/PacksCommand.java @@ -1,7 +1,7 @@ package com.dfsek.terra.command; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.Command; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.registry.ConfigRegistry; diff --git a/src/main/java/com/dfsek/terra/command/ReloadCommand.java b/src/main/java/com/dfsek/terra/command/ReloadCommand.java index 58a59fe09..e62ded0c1 100644 --- a/src/main/java/com/dfsek/terra/command/ReloadCommand.java +++ b/src/main/java/com/dfsek/terra/command/ReloadCommand.java @@ -1,8 +1,8 @@ package com.dfsek.terra.command; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.Command; import com.dfsek.terra.api.gaea.command.DebugCommand; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java b/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java index 4f5c00324..a50676604 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java +++ b/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java @@ -1,8 +1,8 @@ package com.dfsek.terra.command.biome; -import com.dfsek.terra.api.bukkit.BukkitWorld; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; diff --git a/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java b/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java index 1802c8777..053341579 100644 --- a/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java @@ -1,9 +1,9 @@ package com.dfsek.terra.command.profile; -import com.dfsek.terra.api.bukkit.BukkitWorld; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; +import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java b/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java index 2efefdb23..18e73db79 100644 --- a/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java @@ -1,9 +1,9 @@ package com.dfsek.terra.command.profile; -import com.dfsek.terra.api.bukkit.BukkitWorld; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; +import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; diff --git a/src/main/java/com/dfsek/terra/command/profile/StartCommand.java b/src/main/java/com/dfsek/terra/command/profile/StartCommand.java index 16bf4a813..3ea69a242 100644 --- a/src/main/java/com/dfsek/terra/command/profile/StartCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/StartCommand.java @@ -1,9 +1,9 @@ package com.dfsek.terra.command.profile; -import com.dfsek.terra.api.bukkit.BukkitWorld; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; +import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; diff --git a/src/main/java/com/dfsek/terra/command/profile/StopCommand.java b/src/main/java/com/dfsek/terra/command/profile/StopCommand.java index de4b0564a..0a9ccf7b9 100644 --- a/src/main/java/com/dfsek/terra/command/profile/StopCommand.java +++ b/src/main/java/com/dfsek/terra/command/profile/StopCommand.java @@ -1,9 +1,9 @@ package com.dfsek.terra.command.profile; -import com.dfsek.terra.api.bukkit.BukkitWorld; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; +import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; diff --git a/src/main/java/com/dfsek/terra/config/base/PluginConfig.java b/src/main/java/com/dfsek/terra/config/base/PluginConfig.java index 8962987b8..8e1ad77fe 100644 --- a/src/main/java/com/dfsek/terra/config/base/PluginConfig.java +++ b/src/main/java/com/dfsek/terra/config/base/PluginConfig.java @@ -5,9 +5,9 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.GaeaPlugin; import com.dfsek.terra.api.gaea.util.JarUtil; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.debug.Debug; import java.io.File; diff --git a/src/main/java/com/dfsek/terra/config/lang/LangUtil.java b/src/main/java/com/dfsek/terra/config/lang/LangUtil.java index 9455de92d..9c372aad0 100644 --- a/src/main/java/com/dfsek/terra/config/lang/LangUtil.java +++ b/src/main/java/com/dfsek/terra/config/lang/LangUtil.java @@ -1,7 +1,7 @@ package com.dfsek.terra.config.lang; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.lang.Language; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.debug.Debug; import org.bukkit.command.CommandSender; import org.bukkit.configuration.InvalidConfigurationException; diff --git a/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java b/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java index 16cdaec88..125b51e7e 100644 --- a/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java +++ b/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.api.bukkit.world.block.BukkitMaterialData; +import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.generation.items.flora.TerraFlora; import com.dfsek.terra.util.MaterialSet; diff --git a/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java b/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java index 90cd937e1..3e3cdf559 100644 --- a/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java +++ b/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java @@ -1,6 +1,6 @@ package com.dfsek.terra.debug.gui; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java b/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java index 3dfcf2a0b..994ffac9d 100644 --- a/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java +++ b/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java @@ -1,6 +1,6 @@ package com.dfsek.terra.debug.gui; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import javax.swing.*; import java.awt.*; diff --git a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index e4c0e9de4..b22620085 100644 --- a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -1,7 +1,6 @@ package com.dfsek.terra.generation; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.ChunkInterpolator3; @@ -15,6 +14,7 @@ import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.lang.LangUtil; diff --git a/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index c84a1897c..f865b5d74 100644 --- a/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -1,10 +1,10 @@ package com.dfsek.terra.generation.items.tree; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.structure.Rotation; import com.dfsek.terra.structure.Structure; import com.dfsek.terra.structure.StructureContainedBlock; diff --git a/src/main/java/com/dfsek/terra/image/ImageLoader.java b/src/main/java/com/dfsek/terra/image/ImageLoader.java index b2fd9d39f..9328cc351 100644 --- a/src/main/java/com/dfsek/terra/image/ImageLoader.java +++ b/src/main/java/com/dfsek/terra/image/ImageLoader.java @@ -1,8 +1,8 @@ package com.dfsek.terra.image; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.biome.NormalizationUtil; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.debug.gui.DebugGUI; diff --git a/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java b/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java index b81ef9864..9fb3364bc 100644 --- a/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java +++ b/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java @@ -1,9 +1,9 @@ package com.dfsek.terra.image; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.biome.NormalizationUtil; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import javax.imageio.ImageIO; diff --git a/src/main/java/com/dfsek/terra/listeners/EventListener.java b/src/main/java/com/dfsek/terra/listeners/EventListener.java index f00280038..d5b6a5a77 100644 --- a/src/main/java/com/dfsek/terra/listeners/EventListener.java +++ b/src/main/java/com/dfsek/terra/listeners/EventListener.java @@ -1,6 +1,6 @@ package com.dfsek.terra.listeners; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.StructureGrowEvent; diff --git a/src/main/java/com/dfsek/terra/listeners/SpigotListener.java b/src/main/java/com/dfsek/terra/listeners/SpigotListener.java index 7ec8f2e5c..526c5ddd8 100644 --- a/src/main/java/com/dfsek/terra/listeners/SpigotListener.java +++ b/src/main/java/com/dfsek/terra/listeners/SpigotListener.java @@ -1,6 +1,6 @@ package com.dfsek.terra.listeners; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import org.bukkit.event.Listener; /** diff --git a/src/main/java/com/dfsek/terra/population/CavePopulator.java b/src/main/java/com/dfsek/terra/population/CavePopulator.java index 531bfa233..b923652ac 100644 --- a/src/main/java/com/dfsek/terra/population/CavePopulator.java +++ b/src/main/java/com/dfsek/terra/population/CavePopulator.java @@ -1,11 +1,11 @@ package com.dfsek.terra.population; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import org.jetbrains.annotations.NotNull; import java.util.HashMap; diff --git a/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/src/main/java/com/dfsek/terra/population/FloraPopulator.java index c4983771e..2251a3a86 100644 --- a/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -1,13 +1,13 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.items.flora.FloraLayer; diff --git a/src/main/java/com/dfsek/terra/population/OrePopulator.java b/src/main/java/com/dfsek/terra/population/OrePopulator.java index 448179abf..a33c857d7 100644 --- a/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -1,7 +1,6 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.MathUtil; @@ -11,6 +10,7 @@ import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/src/main/java/com/dfsek/terra/population/StructurePopulator.java index 59774fd36..faef5ace5 100644 --- a/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -1,9 +1,9 @@ package com.dfsek.terra.population; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import org.jetbrains.annotations.NotNull; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/population/TreePopulator.java b/src/main/java/com/dfsek/terra/population/TreePopulator.java index 66899a162..3125338fc 100644 --- a/src/main/java/com/dfsek/terra/population/TreePopulator.java +++ b/src/main/java/com/dfsek/terra/population/TreePopulator.java @@ -1,13 +1,13 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.items.tree.TreeLayer; diff --git a/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java b/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java index 820674e7c..acb56beb4 100644 --- a/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.registry; import com.dfsek.tectonic.exception.ConfigException; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.debug.Debug; diff --git a/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java b/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java index 074a0d3b4..52e43aaeb 100644 --- a/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java @@ -1,8 +1,8 @@ package com.dfsek.terra.registry; -import com.dfsek.terra.api.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.biome.palette.SinglePalette; import org.bukkit.Bukkit; diff --git a/src/main/java/com/dfsek/terra/structure/Structure.java b/src/main/java/com/dfsek/terra/structure/Structure.java index 876473a48..7c7e0dac7 100644 --- a/src/main/java/com/dfsek/terra/structure/Structure.java +++ b/src/main/java/com/dfsek/terra/structure/Structure.java @@ -1,10 +1,10 @@ package com.dfsek.terra.structure; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.debug.Debug; import net.jafama.FastMath; import org.bukkit.Chunk; diff --git a/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java b/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java index 5cc2c496f..fd46c53f3 100644 --- a/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java +++ b/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java @@ -1,7 +1,7 @@ package com.dfsek.terra.structure; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.structure.spawn.AirSpawn; import com.dfsek.terra.structure.spawn.BlankSpawn; import com.dfsek.terra.structure.spawn.LandSpawn; diff --git a/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java index c21512609..6aaf48b97 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java @@ -1,9 +1,9 @@ package com.dfsek.terra.structure.spawn; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.config.WorldGenerator; diff --git a/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java index f12f8509d..bf891470f 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java @@ -1,9 +1,9 @@ package com.dfsek.terra.structure.spawn; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.generation.config.WorldGenerator; diff --git a/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java index 27f6622a6..ba71262d0 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java @@ -1,9 +1,9 @@ package com.dfsek.terra.structure.spawn; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.config.WorldGenerator; diff --git a/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java b/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java index a0ac0113f..124f4a340 100644 --- a/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java +++ b/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java @@ -1,7 +1,7 @@ package com.dfsek.terra.structure.spawn; -import com.dfsek.terra.api.bukkit.TerraBukkitPlugin; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; public abstract class Requirement { protected final World world; diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 6df5bf4a9..b6edcf3a1 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: "Terra" -main: "com.dfsek.terra.api.bukkit.TerraBukkitPlugin" +main: "com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin" version: "@VERSION@" load: "STARTUP" api-version: "1.16" From 4b2c2d8ba2fdeb5935007eaf57594346c06a9049 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 21:46:09 -0700 Subject: [PATCH 016/210] Actually register loaders --- .../api/implementations/bukkit/TerraBukkitPlugin.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/TerraBukkitPlugin.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/TerraBukkitPlugin.java index 52a9495d9..f3340d0f3 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/TerraBukkitPlugin.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/TerraBukkitPlugin.java @@ -2,11 +2,14 @@ package com.dfsek.terra.api.implementations.bukkit; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.GenericLoaders; import com.dfsek.terra.api.gaea.GaeaPlugin; import com.dfsek.terra.api.gaea.lang.Language; import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.implementations.bukkit.generator.BukkitChunkGeneratorWrapper; import com.dfsek.terra.command.TerraCommand; import com.dfsek.terra.command.structure.LocateCommand; @@ -21,9 +24,7 @@ import com.dfsek.terra.registry.ConfigRegistry; import com.dfsek.terra.util.PaperUtil; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; -import org.bukkit.Material; import org.bukkit.block.Biome; -import org.bukkit.block.data.BlockData; import org.bukkit.command.PluginCommand; import org.bukkit.entity.EntityType; import org.bukkit.generator.ChunkGenerator; @@ -42,6 +43,7 @@ public class TerraBukkitPlugin extends GaeaPlugin implements TerraPlugin { private final ConfigRegistry registry = new ConfigRegistry(); private final PluginConfig config = new PluginConfig(); private WorldHandle handle = new BukkitWorldHandle(); + private final GenericLoaders genericLoaders = new GenericLoaders(this); public void reload() { Map newMap = new HashMap<>(); @@ -150,8 +152,9 @@ public class TerraBukkitPlugin extends GaeaPlugin implements TerraPlugin { @Override public void register(TypeRegistry registry) { registry.registerLoader(Biome.class, (t, o, l) -> Biome.valueOf((String) o)) - .registerLoader(BlockData.class, (t, o, l) -> Bukkit.createBlockData((String) o)) - .registerLoader(Material.class, (t, o, l) -> Material.matchMaterial((String) o)) + .registerLoader(BlockData.class, (t, o, l) -> handle.createBlockData((String) o)) + .registerLoader(MaterialData.class, (t, o, l) -> handle.createMaterialData((String) o)) .registerLoader(EntityType.class, (t, o, l) -> EntityType.valueOf((String) o)); + genericLoaders.register(registry); } } From c7539dc5dd6f1dc047d5dc86f2914c3c18690f39 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 22:47:53 -0700 Subject: [PATCH 017/210] haha yes it works sort of --- src/main/java/com/dfsek/terra/TerraWorld.java | 4 ++-- .../dfsek/terra/api/gaea/profiler/WorldProfiler.java | 7 ++++--- .../terra/api/generic/generator/ChunkGenerator.java | 1 + .../api/generic/generator/TerraChunkGenerator.java | 3 ++- .../api/implementations/bukkit/TerraBukkitPlugin.java | 10 +++++++--- .../bukkit/generator/BukkitChunkGeneratorWrapper.java | 9 ++++++--- .../dfsek/terra/config/loaders/MaterialSetLoader.java | 3 +-- .../java/com/dfsek/terra/config/loaders/Types.java | 2 +- .../dfsek/terra/generation/TerraChunkGenerator.java | 9 +++++---- 9 files changed, 29 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/dfsek/terra/TerraWorld.java b/src/main/java/com/dfsek/terra/TerraWorld.java index 50ca0751e..1d90a3072 100644 --- a/src/main/java/com/dfsek/terra/TerraWorld.java +++ b/src/main/java/com/dfsek/terra/TerraWorld.java @@ -2,8 +2,8 @@ package com.dfsek.terra; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.implementations.bukkit.generator.BukkitChunkGenerator; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.biome.grid.master.TerraRadialBiomeGrid; @@ -55,7 +55,7 @@ public class TerraWorld { } public static boolean isTerraWorld(World w) { - return w.getGenerator() instanceof TerraChunkGenerator; + return w.getGenerator() instanceof BukkitChunkGenerator; } public TerraBiomeGrid getGrid() { diff --git a/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java b/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java index 9a493930d..f98e284e5 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java +++ b/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java @@ -1,7 +1,8 @@ package com.dfsek.terra.api.gaea.profiler; -import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.implementations.bukkit.generator.BukkitChunkGenerator; +import com.dfsek.terra.api.implementations.bukkit.generator.BukkitChunkGeneratorWrapper; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import net.jafama.FastMath; @@ -15,7 +16,7 @@ public class WorldProfiler { private boolean isProfiling; public WorldProfiler(World w) { - if(!(w.getGenerator() instanceof TerraChunkGenerator)) + if(!(w.getGenerator() instanceof BukkitChunkGenerator)) throw new IllegalArgumentException("Attempted to instantiate profiler on non-Gaea managed world!"); this.addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "TotalChunkGenTime") .addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "ChunkBaseGenTime") @@ -23,7 +24,7 @@ public class WorldProfiler { .addMeasurement(new Measurement(2000000, DataType.PERIOD_MILLISECONDS), "PopulationManagerTime"); isProfiling = false; this.world = w; - ((TerraChunkGenerator) w.getGenerator()).attachProfiler(this); + ((BukkitChunkGeneratorWrapper) ((BukkitChunkGenerator) w.getGenerator()).getHandle()).getDelegate().attachProfiler(this); } public String getResultsFormatted() { diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java index bda0a2fb3..09593b2f8 100644 --- a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java @@ -22,6 +22,7 @@ public interface ChunkGenerator extends Handle { ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome); + List getDefaultPopulators(World world); interface ChunkData { diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java b/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java index ff3821387..e76a54497 100644 --- a/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java @@ -9,7 +9,7 @@ import org.jetbrains.annotations.NotNull; import java.util.Random; public interface TerraChunkGenerator { - void generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkGenerator.ChunkData data); + ChunkGenerator.ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkGenerator.ChunkData original); void attachProfiler(WorldProfiler profiler); @@ -24,4 +24,5 @@ public interface TerraChunkGenerator { boolean shouldGenerateStructures(); ConfigPack getConfigPack(); + } diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/TerraBukkitPlugin.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/TerraBukkitPlugin.java index f3340d0f3..638269366 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/TerraBukkitPlugin.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/TerraBukkitPlugin.java @@ -6,11 +6,14 @@ import com.dfsek.terra.api.GenericLoaders; import com.dfsek.terra.api.gaea.GaeaPlugin; import com.dfsek.terra.api.gaea.lang.Language; import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.Biome; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.implementations.bukkit.generator.BukkitChunkGenerator; import com.dfsek.terra.api.implementations.bukkit.generator.BukkitChunkGeneratorWrapper; +import com.dfsek.terra.api.implementations.bukkit.world.BukkitBiome; import com.dfsek.terra.command.TerraCommand; import com.dfsek.terra.command.structure.LocateCommand; import com.dfsek.terra.config.base.ConfigPack; @@ -24,7 +27,6 @@ import com.dfsek.terra.registry.ConfigRegistry; import com.dfsek.terra.util.PaperUtil; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; -import org.bukkit.block.Biome; import org.bukkit.command.PluginCommand; import org.bukkit.entity.EntityType; import org.bukkit.generator.ChunkGenerator; @@ -130,7 +132,8 @@ public class TerraBukkitPlugin extends GaeaPlugin implements TerraPlugin { } public TerraWorld getWorld(World w) { - if(!(w.getGenerator() instanceof TerraChunkGenerator)) throw new IllegalArgumentException("Not a Terra world!"); + if(!(w.getGenerator() instanceof BukkitChunkGenerator)) + throw new IllegalArgumentException("Not a Terra world! " + w.getGenerator()); if(!worlds.containsKey(w.getName())) { getLogger().warning("Unexpected world load detected: \"" + w.getName() + "\""); return new TerraWorld(w, ((TerraChunkGenerator) w.getGenerator()).getConfigPack(), this); @@ -151,9 +154,10 @@ public class TerraBukkitPlugin extends GaeaPlugin implements TerraPlugin { @Override public void register(TypeRegistry registry) { - registry.registerLoader(Biome.class, (t, o, l) -> Biome.valueOf((String) o)) + registry .registerLoader(BlockData.class, (t, o, l) -> handle.createBlockData((String) o)) .registerLoader(MaterialData.class, (t, o, l) -> handle.createMaterialData((String) o)) + .registerLoader(Biome.class, (t, o, l) -> new BukkitBiome(org.bukkit.block.Biome.valueOf((String) o))) .registerLoader(EntityType.class, (t, o, l) -> EntityType.valueOf((String) o)); genericLoaders.register(registry); } diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGeneratorWrapper.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGeneratorWrapper.java index f3d7d470e..0c9b846d9 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -19,8 +19,11 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator { @Override public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { BukkitWorld bukkitWorld = new BukkitWorld(world); - BukkitChunkGenerator.BukkitChunkData data = new BukkitChunkGenerator.BukkitChunkData(createChunkData(world)); - delegate.generateChunkData(bukkitWorld, random, x, z, new BukkitBiomeGrid(biome), new BukkitChunkGenerator.BukkitChunkData(createChunkData(bukkitWorld.getHandle()))); - return data.getHandle(); + + return (ChunkData) delegate.generateChunkData(bukkitWorld, random, x, z, new BukkitBiomeGrid(biome), new BukkitChunkGenerator.BukkitChunkData(createChunkData(world))).getHandle(); + } + + public TerraChunkGenerator getDelegate() { + return delegate; } } diff --git a/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java b/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java index c582f8714..3924521d1 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java +++ b/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java @@ -5,7 +5,6 @@ import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.util.MaterialSet; -import org.bukkit.Material; import java.lang.reflect.Type; import java.util.List; @@ -20,7 +19,7 @@ public class MaterialSetLoader implements TypeLoader { for(String string : stringData) { try { if(string.startsWith("#")) set.addTag(string.substring(1)); - else set.add((MaterialData) configLoader.loadType(Material.class, string)); + else set.add((MaterialData) configLoader.loadType(MaterialData.class, string)); } catch(NullPointerException e) { throw new LoadException("Invalid data identifier \"" + string + "\"", e); } diff --git a/src/main/java/com/dfsek/terra/config/loaders/Types.java b/src/main/java/com/dfsek/terra/config/loaders/Types.java index 4eb23e120..6271084a2 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/Types.java +++ b/src/main/java/com/dfsek/terra/config/loaders/Types.java @@ -4,8 +4,8 @@ import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.world.Flora; import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.generic.world.block.BlockData; import org.bukkit.Material; -import org.bukkit.block.data.BlockData; import java.lang.reflect.Type; import java.util.Set; diff --git a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index b22620085..8ef632b6f 100644 --- a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -95,8 +95,8 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato @Override - @SuppressWarnings({"deprecation", "try"}) - public void generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome, ChunkGenerator.ChunkData chunk) { + @SuppressWarnings({"try"}) + public ChunkGenerator.ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome, ChunkGenerator.ChunkData chunk) { TerraWorld tw = main.getWorld(world); com.dfsek.terra.api.gaea.biome.BiomeGrid grid = tw.getGrid(); try(ProfileFuture ignore = tw.getProfiler().measure("TotalChunkGenTime")) { @@ -105,7 +105,7 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato interp = new ChunkInterpolator3(world, chunkX, chunkZ, tw.getGrid()); if(needsLoad) load(world); // Load population data for world. - if(!tw.isSafe()) return; + if(!tw.isSafe()) return chunk; int xOrig = (chunkX << 4); int zOrig = (chunkZ << 4); @@ -142,7 +142,7 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato } 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)); if(justSet && c.doSlabs()) { SlabUtil.prepareBlockPartCeiling(data, chunk.getBlockData(x, y, z), chunk, new Vector3(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); } @@ -170,6 +170,7 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato biome.setBiome(x << 2, z << 2, b.getVanillaBiome()); } } + return chunk; } } From af5309ff21209e554839ce5410f60ab0cabaa7a5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 23:09:53 -0700 Subject: [PATCH 018/210] Populators work now --- .../generator/TerraChunkGenerator.java | 3 ++ .../implementations/bukkit/BukkitWorld.java | 12 +++++++ .../BukkitChunkGeneratorWrapper.java | 33 +++++++++++++++++++ .../generator/BukkitPopulatorWrapper.java | 24 ++++++++++++++ .../world/block/BukkitMaterialData.java | 8 +++++ .../terra/generation/TerraChunkGenerator.java | 25 ++++++++++---- .../dfsek/terra/population/CavePopulator.java | 6 ++-- .../terra/population/FloraPopulator.java | 6 ++-- .../dfsek/terra/population/OrePopulator.java | 6 ++-- .../terra/population/StructurePopulator.java | 6 ++-- .../dfsek/terra/population/TreePopulator.java | 6 ++-- 11 files changed, 114 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitPopulatorWrapper.java diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java b/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java index e76a54497..753b877cf 100644 --- a/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.config.base.ConfigPack; import org.jetbrains.annotations.NotNull; +import java.util.List; import java.util.Random; public interface TerraChunkGenerator { @@ -25,4 +26,6 @@ public interface TerraChunkGenerator { ConfigPack getConfigPack(); + List getPopulators(); + } diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorld.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorld.java index 9a9fd0b55..ef51bbeea 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorld.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorld.java @@ -85,4 +85,16 @@ public class BukkitWorld implements World { public org.bukkit.World getHandle() { return delegate; } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof BukkitWorld)) return false; + BukkitWorld other = (BukkitWorld) obj; + return other.getHandle().equals(delegate); + } + + @Override + public int hashCode() { + return delegate.hashCode(); + } } diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGeneratorWrapper.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGeneratorWrapper.java index 0c9b846d9..a45ee4b03 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -4,10 +4,13 @@ import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; import com.dfsek.terra.api.implementations.bukkit.BukkitBiomeGrid; import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; import org.bukkit.World; +import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; +import java.util.List; import java.util.Random; +import java.util.stream.Collectors; public class BukkitChunkGeneratorWrapper extends ChunkGenerator { private final TerraChunkGenerator delegate; @@ -26,4 +29,34 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator { public TerraChunkGenerator getDelegate() { return delegate; } + + @Override + public @NotNull List getDefaultPopulators(@NotNull World world) { + return delegate.getPopulators().stream().map(BukkitPopulatorWrapper::new).collect(Collectors.toList()); + } + + @Override + public boolean isParallelCapable() { + return delegate.isParallelCapable(); + } + + @Override + public boolean shouldGenerateCaves() { + return delegate.shouldGenerateCaves(); + } + + @Override + public boolean shouldGenerateDecorations() { + return delegate.shouldGenerateDecorations(); + } + + @Override + public boolean shouldGenerateMobs() { + return delegate.shouldGenerateMobs(); + } + + @Override + public boolean shouldGenerateStructures() { + return super.shouldGenerateStructures(); + } } diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitPopulatorWrapper.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitPopulatorWrapper.java new file mode 100644 index 000000000..2470dab16 --- /dev/null +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitPopulatorWrapper.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.api.implementations.bukkit.generator; + +import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; +import com.dfsek.terra.api.implementations.bukkit.BukkitChunk; +import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; +import org.bukkit.Chunk; +import org.bukkit.World; +import org.bukkit.generator.BlockPopulator; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; + +public class BukkitPopulatorWrapper extends BlockPopulator { + private final TerraBlockPopulator delegate; + + public BukkitPopulatorWrapper(TerraBlockPopulator delegate) { + this.delegate = delegate; + } + + @Override + public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk source) { + delegate.populate(new BukkitWorld(world), random, new BukkitChunk(source)); + } +} diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitMaterialData.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitMaterialData.java index af4717ea4..a3bd6f1b8 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitMaterialData.java +++ b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitMaterialData.java @@ -40,4 +40,12 @@ public class BukkitMaterialData implements MaterialData { public int hashCode() { return delegate.hashCode(); } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof BukkitMaterialData)) return false; + BukkitMaterialData other = (BukkitMaterialData) obj; + + return other.getHandle().equals(this.delegate); + } } diff --git a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index 8ef632b6f..328d12e55 100644 --- a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -8,25 +8,33 @@ import com.dfsek.terra.api.gaea.population.PopulationManager; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.generator.ChunkGenerator; +import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.api.generic.world.BiomeGrid; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Vector3; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.debug.Debug; +import com.dfsek.terra.population.CavePopulator; +import com.dfsek.terra.population.FloraPopulator; +import com.dfsek.terra.population.OrePopulator; +import com.dfsek.terra.population.StructurePopulator; +import com.dfsek.terra.population.TreePopulator; import com.dfsek.terra.util.PaletteUtil; import com.dfsek.terra.util.SlabUtil; import org.jetbrains.annotations.NotNull; import java.io.FileNotFoundException; import java.io.IOException; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Random; import java.util.logging.Level; @@ -35,16 +43,16 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato private static final Map popMap = new HashMap<>(); private final PopulationManager popMan; private final ConfigPack configPack; - private final TerraBukkitPlugin main; + private final TerraPlugin main; private boolean needsLoad = true; - public TerraChunkGenerator(ConfigPack c, TerraBukkitPlugin main) { + public TerraChunkGenerator(ConfigPack c, TerraPlugin main) { popMan = new PopulationManager(main); this.configPack = c; this.main = main; - //popMan.attach(new OrePopulator(main)); - //popMan.attach(new TreePopulator(main)); - //popMan.attach(new FloraPopulator(main)); + popMan.attach(new OrePopulator(main)); + popMan.attach(new TreePopulator(main)); + popMan.attach(new FloraPopulator(main)); } public static synchronized void saveAll() { @@ -93,6 +101,11 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato return configPack; } + @Override + public List getPopulators() { + return Arrays.asList(new CavePopulator(main), new StructurePopulator(main), popMan); + } + @Override @SuppressWarnings({"try"}) diff --git a/src/main/java/com/dfsek/terra/population/CavePopulator.java b/src/main/java/com/dfsek/terra/population/CavePopulator.java index b923652ac..7ecbb3cb8 100644 --- a/src/main/java/com/dfsek/terra/population/CavePopulator.java +++ b/src/main/java/com/dfsek/terra/population/CavePopulator.java @@ -1,11 +1,11 @@ package com.dfsek.terra.population; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import org.jetbrains.annotations.NotNull; import java.util.HashMap; @@ -13,10 +13,10 @@ import java.util.Map; import java.util.Random; public class CavePopulator implements TerraBlockPopulator { - private final TerraBukkitPlugin main; + private final TerraPlugin main; private static final Map shiftStorage = new HashMap<>(); // Persist BlockData created for shifts, to avoid re-calculating each time. - public CavePopulator(TerraBukkitPlugin main) { + public CavePopulator(TerraPlugin main) { this.main = main; } diff --git a/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/src/main/java/com/dfsek/terra/population/FloraPopulator.java index 2251a3a86..75cf94cfd 100644 --- a/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -3,11 +3,11 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Vector2; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.items.flora.FloraLayer; @@ -22,9 +22,9 @@ import java.util.Random; * Populates Flora and Trees */ public class FloraPopulator implements TerraBlockPopulator { - private final TerraBukkitPlugin main; + private final TerraPlugin main; - public FloraPopulator(TerraBukkitPlugin main) { + public FloraPopulator(TerraPlugin main) { this.main = main; } diff --git a/src/main/java/com/dfsek/terra/population/OrePopulator.java b/src/main/java/com/dfsek/terra/population/OrePopulator.java index a33c857d7..c2d9f9e26 100644 --- a/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -6,11 +6,11 @@ import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Vector3; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import org.jetbrains.annotations.NotNull; @@ -18,9 +18,9 @@ import org.jetbrains.annotations.NotNull; import java.util.Random; public class OrePopulator implements TerraBlockPopulator { - private final TerraBukkitPlugin main; + private final TerraPlugin main; - public OrePopulator(TerraBukkitPlugin main) { + public OrePopulator(TerraPlugin main) { this.main = main; } diff --git a/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/src/main/java/com/dfsek/terra/population/StructurePopulator.java index faef5ace5..9533fee37 100644 --- a/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -1,17 +1,17 @@ package com.dfsek.terra.population; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import org.jetbrains.annotations.NotNull; import java.util.Random; public class StructurePopulator implements TerraBlockPopulator { - private final TerraBukkitPlugin main; + private final TerraPlugin main; - public StructurePopulator(TerraBukkitPlugin main) { + public StructurePopulator(TerraPlugin main) { this.main = main; } diff --git a/src/main/java/com/dfsek/terra/population/TreePopulator.java b/src/main/java/com/dfsek/terra/population/TreePopulator.java index 3125338fc..565e1e409 100644 --- a/src/main/java/com/dfsek/terra/population/TreePopulator.java +++ b/src/main/java/com/dfsek/terra/population/TreePopulator.java @@ -3,11 +3,11 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Vector2; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.items.tree.TreeLayer; @@ -18,9 +18,9 @@ import java.util.Random; public class TreePopulator implements TerraBlockPopulator { - private final TerraBukkitPlugin main; + private final TerraPlugin main; - public TreePopulator(TerraBukkitPlugin main) { + public TreePopulator(TerraPlugin main) { this.main = main; } From 5c9c47d0782397f215496efd8fc1a798b32e1f48 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 10 Dec 2020 23:13:35 -0700 Subject: [PATCH 019/210] Fix Location clone issue --- .../api/generic/world/vector/Location.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java b/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java index 77fde3ff4..4cd2f2265 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java +++ b/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java @@ -4,8 +4,8 @@ import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; public class Location implements Cloneable { - private final World world; - private final Vector3 vector; + private World world; + private Vector3 vector; public Location(World w, double x, double y, double z) { this.world = w; @@ -17,10 +17,24 @@ public class Location implements Cloneable { this.vector = vector; } + public void setWorld(World world) { + this.world = world; + } + + public Vector3 getVector() { + return vector; + } + + public void setVector(Vector3 vector) { + this.vector = vector; + } + @Override public Location clone() { try { - return (Location) super.clone(); + Location other = (Location) super.clone(); + other.setVector(other.getVector().clone()); + return other; } catch(CloneNotSupportedException e) { throw new Error(e); } From 7ee1d2c391ffefde7d9fe8614f2c2f7b4edf0757 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 11 Dec 2020 00:11:37 -0700 Subject: [PATCH 020/210] Predefined Flora --- .../dfsek/terra/api/gaea/world/FloraType.java | 88 ------------------- .../dfsek/terra/config/base/ConfigPack.java | 32 ++++--- .../generation/items/flora/ConstantFlora.java | 52 +++++++++++ .../dfsek/terra/registry/FloraRegistry.java | 65 +++++++++++++- 4 files changed, 134 insertions(+), 103 deletions(-) delete mode 100644 src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java create mode 100644 src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java b/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java deleted file mode 100644 index f13ed9f02..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/world/FloraType.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.dfsek.terra.api.gaea.world; - -import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.gaea.util.GlueList; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; -import com.google.common.collect.Sets; -import org.bukkit.Bukkit; -import org.bukkit.Material; - -import java.util.Arrays; -import java.util.List; -import java.util.Set; -import java.util.stream.Collectors; - -public enum FloraType implements Flora { - TALL_GRASS(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:tall_grass[half=lower]"), Bukkit.createBlockData("minecraft:tall_grass[half=upper]")), - TALL_FERN(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:large_fern[half=lower]"), Bukkit.createBlockData("minecraft:large_fern[half=upper]")), - SUNFLOWER(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:sunflower[half=lower]"), Bukkit.createBlockData("minecraft:sunflower[half=upper]")), - ROSE_BUSH(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:rose_bush[half=lower]"), Bukkit.createBlockData("minecraft:rose_bush[half=upper]")), - LILAC(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:lilac[half=lower]"), Bukkit.createBlockData("minecraft:lilac[half=upper]")), - PEONY(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:peony[half=lower]"), Bukkit.createBlockData("minecraft:peony[half=upper]")), - GRASS(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:grass")), - FERN(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:fern")), - AZURE_BLUET(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:azure_bluet")), - LILY_OF_THE_VALLEY(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:lily_of_the_valley")), - BLUE_ORCHID(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:blue_orchid")), - POPPY(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:poppy")), - DANDELION(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:dandelion")), - WITHER_ROSE(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:wither_rose")), - DEAD_BUSH(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL, Material.SAND, Material.RED_SAND, - Material.TERRACOTTA, Material.BLACK_TERRACOTTA, Material.BLUE_TERRACOTTA, Material.BROWN_TERRACOTTA, Material.CYAN_TERRACOTTA, Material.GRAY_TERRACOTTA, - Material.GREEN_TERRACOTTA, Material.LIGHT_BLUE_TERRACOTTA, Material.LIGHT_GRAY_TERRACOTTA, Material.LIME_TERRACOTTA, Material.MAGENTA_TERRACOTTA, - Material.ORANGE_TERRACOTTA, Material.PINK_TERRACOTTA, Material.PURPLE_TERRACOTTA, Material.RED_TERRACOTTA, Material.RED_TERRACOTTA, Material.WHITE_TERRACOTTA, - Material.YELLOW_TERRACOTTA), Bukkit.createBlockData("minecraft:dead_bush")), - RED_TULIP(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:red_tulip")), - ORANGE_TULIP(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:orange_tulip")), - WHITE_TULIP(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:white_tulip")), - PINK_TULIP(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:pink_tulip")), - OXEYE_DAISY(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:oxeye_daisy")), - ALLIUM(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:allium")), - CORNFLOWER(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL), Bukkit.createBlockData("minecraft:cornflower")), - LILY_PAD(Sets.newHashSet(Material.WATER), Bukkit.createBlockData("minecraft:lily_pad")), - RED_MUSHROOM(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL, Material.DIRT, Material.STONE, Material.NETHERRACK, Material.MYCELIUM), Bukkit.createBlockData("minecraft:red_mushroom")), - BROWN_MUSHROOM(Sets.newHashSet(Material.GRASS_BLOCK, Material.PODZOL, Material.DIRT, Material.STONE, Material.NETHERRACK, Material.MYCELIUM), Bukkit.createBlockData("minecraft:brown_mushroom")), - ; - - private final List data = new GlueList<>(); - - private final Set spawns; - - FloraType(Set validSpawns, org.bukkit.block.data.BlockData... type) { - data.addAll(Arrays.stream(type).map(BukkitBlockData::new).collect(Collectors.toList())); - this.spawns = validSpawns; - } - - @Override - public List getValidSpawnsAt(Chunk chunk, int x, int z, Range check) { - List blocks = new GlueList<>(); - for(int y : check) { - Block block = chunk.getBlock(x, y, z); - if(spawns.contains(block.getType()) && valid(block)) { - blocks.add(chunk.getBlock(x, y, z)); - } - } - return blocks; - } - - private boolean valid(Block block) { - for(int i = 1; i < data.size() + 1; i++) { - block = block.getRelative(BlockFace.UP); - if(!block.isEmpty()) return false; - } - return true; - } - - @Override - public boolean plant(Location l) { - for(int i = 1; i < data.size() + 1; i++) { - l.clone().add(0, i, 0).getBlock().setBlockData(data.get(i - 1), false); - } - return true; - } -} diff --git a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index a26bfdd03..83637f11d 100644 --- a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -4,6 +4,8 @@ import com.dfsek.tectonic.abstraction.AbstractConfigLoader; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; +import com.dfsek.tectonic.loading.TypeRegistry; +import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.structures.loot.LootTable; import com.dfsek.terra.api.gaea.tree.Tree; @@ -74,14 +76,14 @@ import java.util.zip.ZipFile; /** * Represents a Terra configuration pack. */ -public class ConfigPack { +public class ConfigPack implements LoaderRegistrar { private final ConfigPackTemplate template = new ConfigPackTemplate(); private final BiomeRegistry biomeRegistry = new BiomeRegistry(); private final BiomeGridRegistry biomeGridRegistry = new BiomeGridRegistry(biomeRegistry); private final StructureRegistry structureRegistry = new StructureRegistry(); private final CarverRegistry carverRegistry = new CarverRegistry(); private final PaletteRegistry paletteRegistry = new PaletteRegistry(); - private final FloraRegistry floraRegistry = new FloraRegistry(); + private final FloraRegistry floraRegistry; private final OreRegistry oreRegistry = new OreRegistry(); private final TreeRegistry treeRegistry = new TreeRegistry(); @@ -91,19 +93,11 @@ public class ConfigPack { private final Map structureMap = new HashMap<>(); - { - abstractConfigLoader - .registerLoader(Palette.class, paletteRegistry) - .registerLoader(Biome.class, biomeRegistry) - .registerLoader(UserDefinedCarver.class, carverRegistry) - .registerLoader(Flora.class, floraRegistry) - .registerLoader(Ore.class, oreRegistry) - .registerLoader(Tree.class, treeRegistry) - .registerLoader(TerraStructure.class, structureRegistry); - } public ConfigPack(File folder, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); + floraRegistry = new FloraRegistry(main); + register(abstractConfigLoader); main.register(selfLoader); main.register(abstractConfigLoader); @@ -121,6 +115,8 @@ public class ConfigPack { public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); + floraRegistry = new FloraRegistry(main); + register(abstractConfigLoader); main.register(selfLoader); main.register(abstractConfigLoader); @@ -234,4 +230,16 @@ public class ConfigPack { public TerraStructure getStructureLocatable(StructureTypeEnum type) { return structureMap.get(type); } + + @Override + public void register(TypeRegistry registry) { + registry + .registerLoader(Palette.class, paletteRegistry) + .registerLoader(Biome.class, biomeRegistry) + .registerLoader(UserDefinedCarver.class, carverRegistry) + .registerLoader(Flora.class, floraRegistry) + .registerLoader(Ore.class, oreRegistry) + .registerLoader(Tree.class, treeRegistry) + .registerLoader(TerraStructure.class, structureRegistry); + } } diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java b/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java new file mode 100644 index 000000000..a8c5d89e9 --- /dev/null +++ b/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.generation.items.flora; + +import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.util.MaterialSet; + +import java.util.List; + +public class ConstantFlora implements Flora { + private final List data; + + private final MaterialSet spawns; + + public ConstantFlora(MaterialSet spawns, List data) { + this.data = data; + this.spawns = spawns; + } + + @Override + public List getValidSpawnsAt(Chunk chunk, int x, int z, Range check) { + List blocks = new GlueList<>(); + for(int y : check) { + Block block = chunk.getBlock(x, y, z); + if(spawns.contains(block.getType()) && valid(block)) { + blocks.add(chunk.getBlock(x, y, z)); + } + } + return blocks; + } + + private boolean valid(Block block) { + for(int i = 1; i < data.size() + 1; i++) { + block = block.getRelative(BlockFace.UP); + if(!block.isEmpty()) return false; + } + return true; + } + + @Override + public boolean plant(Location l) { + for(int i = 1; i < data.size() + 1; i++) { + l.clone().add(0, i, 0).getBlock().setBlockData(data.get(i - 1), false); + } + return true; + } +} diff --git a/src/main/java/com/dfsek/terra/registry/FloraRegistry.java b/src/main/java/com/dfsek/terra/registry/FloraRegistry.java index 4bd5fbbbd..64c09a11d 100644 --- a/src/main/java/com/dfsek/terra/registry/FloraRegistry.java +++ b/src/main/java/com/dfsek/terra/registry/FloraRegistry.java @@ -1,13 +1,72 @@ package com.dfsek.terra.registry; import com.dfsek.terra.api.gaea.world.Flora; -import com.dfsek.terra.api.gaea.world.FloraType; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.generation.items.flora.ConstantFlora; +import com.dfsek.terra.util.MaterialSet; + +import java.util.Arrays; +import java.util.Collections; public class FloraRegistry extends TerraRegistry { - public FloraRegistry() { - for(FloraType f : FloraType.values()) add(f.toString(), f); + private final TerraPlugin main; + + public FloraRegistry(TerraPlugin main) { + this.main = main; + MaterialSet grassy = MaterialSet.get(create("minecraft:grass_block"), create("minecraft:podzol")); + addItem("TALL_GRASS", new ConstantFlora(grassy, Arrays.asList(data("minecraft:tall_grass[half=lower]"), data("minecraft:tall_grass[half=upper]")))); + addItem("TALL_FERN", new ConstantFlora(grassy, Arrays.asList(data("minecraft:large_fern[half=lower]"), data("minecraft:large_fern[half=upper]")))); + addItem("SUNFLOWER", new ConstantFlora(grassy, Arrays.asList(data("minecraft:sunflower[half=lower]"), data("minecraft:sunflower[half=upper]")))); + addItem("ROSE_BUSH", new ConstantFlora(grassy, Arrays.asList(data("minecraft:rose_bush[half=lower]"), data("minecraft:rose_bush[half=upper]")))); + addItem("LILAC", new ConstantFlora(grassy, Arrays.asList(data("minecraft:lilac[half=lower]"), data("minecraft:lilac[half=upper]")))); + addItem("PEONY", new ConstantFlora(grassy, Arrays.asList(data("minecraft:peony[half=lower]"), data("minecraft:peony[half=upper]")))); + addItem("GRASS", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:grass")))); + addItem("FERN", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:fern")))); + addItem("AZURE_BLUET", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:azure_bluet")))); + addItem("LILY_OF_THE_VALLEY", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:lily_of_the_valley")))); + addItem("BLUE_ORCHID", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:blue_orchid")))); + addItem("POPPY", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:poppy")))); + addItem("DANDELION", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:dandelion")))); + addItem("WITHER_ROSE", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:wither_rose")))); + addItem("DEAD_BUSH", new ConstantFlora(MaterialSet.get(create("minecraft:terracotta"), create("minecraft:black_terracotta"), + create("minecraft:blue_terracotta"), create("minecraft:brown_terracotta"), create("minecraft:cyan_terracotta"), + create("minecraft:gray_terracotta"), create("minecraft:green_terracotta"), create("minecraft:light_blue_terracotta"), + create("minecraft:light_gray_terracotta"), create("minecraft:lime_terracotta"), create("minecraft:magenta_terracotta"), + create("minecraft:orange_terracotta"), create("minecraft:pink_terracotta"), create("minecraft:purple_terracotta"), + create("minecraft:red_terracotta"), create("minecraft:white_terracotta"), create("minecraft:yellow_terracotta"), + create("minecraft:red_sand"), create("minecraft:sand")), Collections.singletonList(data("minecraft:dead_bush")))); + addItem("RED_TULIP", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:red_tulip")))); + addItem("ORANGE_TULIP", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:orange_tulip")))); + addItem("WHITE_TULIP", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:white_tulip")))); + addItem("PINK_TULIP", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:pink_tulip")))); + addItem("OXEYE_DAISY", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:oxeye_daisy")))); + addItem("ALLIUM", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:allium")))); + addItem("CORNFLOWER", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:cornflower")))); + addItem("LILY_PAD", new ConstantFlora(MaterialSet.get(create("minecraft:water")), Collections.singletonList(data("minecraft:lily_pad")))); + MaterialSet mushroom = MaterialSet.get(create("minecraft:grass_block"), create("minecraft:stone"), create("minecraft:podzol"), create("minecraft:netherrack"), create("minecraft:mycelium")); + addItem("RED_MUSHROOM", new ConstantFlora(mushroom, Collections.singletonList(data("minecraft:red_mushroom")))); + addItem("BROWN_MUSHROOM", new ConstantFlora(mushroom, Collections.singletonList(data("minecraft:brown_mushroom")))); } + private MaterialData create(String s) { + return main.getHandle().createMaterialData(s); + } + + private void addItem(String id, ConstantFlora flora) { + try { + add(id, flora); + } catch(IllegalArgumentException e) { + main.getLogger().warning("Failed to load Flora item: " + id + ": " + e.getMessage()); + } + } + + private BlockData data(String s) { + return main.getHandle().createBlockData(s); + } + + @Override public Flora get(String id) { return super.get(id); From 5bf699cba9cf71f3e55a0b925b29a20c14e727b0 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 11 Dec 2020 17:30:17 -0700 Subject: [PATCH 021/210] Look ma, no Bukkit API in the core package --- build.gradle.kts | 23 +- common/build.gradle.kts | 47 +++ .../java/com/dfsek/terra/TerraProfiler.java | 0 .../main/java/com/dfsek/terra/TerraWorld.java | 4 +- .../main/java/com/dfsek/terra/api/Entity.java | 8 + .../com/dfsek/terra/api/GenericLoaders.java | 5 - .../com/dfsek/terra/api/LoaderRegistrar.java | 0 .../main/java/com/dfsek/terra/api/Player.java | 4 + .../java/com/dfsek/terra/api/gaea/Debug.java | 6 +- .../java/com/dfsek/terra/api/gaea/Gaea.java | 0 .../com/dfsek/terra/api/gaea/biome/Biome.java | 3 +- .../dfsek/terra/api/gaea/biome/BiomeGrid.java | 0 .../dfsek/terra/api/gaea/biome/Decorator.java | 2 - .../dfsek/terra/api/gaea/biome/Generator.java | 0 .../api/gaea/biome/NormalizationUtil.java | 0 .../api/gaea/generation/GenerationPhase.java | 0 .../dfsek/terra/api/gaea/lang/Language.java | 15 +- .../dfsek/terra/api/gaea/lang/Message.java | 3 +- .../terra/api/gaea/lang/MultiLineMessage.java | 7 +- .../api/gaea/lang/SingleLineMessage.java | 8 +- .../api/gaea/math/ChunkInterpolator3.java | 0 .../terra/api/gaea/math/FastNoiseLite.java | 0 .../terra/api/gaea/math/Interpolator.java | 0 .../terra/api/gaea/math/Interpolator3.java | 0 .../dfsek/terra/api/gaea/math/MathUtil.java | 0 .../api/gaea/math/ProbabilityCollection.java | 0 .../com/dfsek/terra/api/gaea/math/Range.java | 0 .../api/gaea/population/ChunkCoordinate.java | 0 .../gaea/population/PopulationManager.java | 0 .../terra/api/gaea/profiler/DataHolder.java | 11 +- .../terra/api/gaea/profiler/DataType.java | 0 .../dfsek/terra/api/gaea/profiler/Desire.java | 10 + .../terra/api/gaea/profiler/Measurement.java | 2 - .../api/gaea/profiler/ProfileFuture.java | 0 .../api/gaea/profiler/WorldProfiler.java | 17 +- .../gaea/serial/MovedObjectInputStream.java | 0 .../terra/api/gaea/structures/loot/Entry.java | 26 +- .../api/gaea/structures/loot/LootTable.java | 11 +- .../terra/api/gaea/structures/loot/Pool.java | 10 +- .../loot/functions/AmountFunction.java | 3 +- .../loot/functions/DamageFunction.java | 6 +- .../structures/loot/functions/Function.java | 3 +- .../com/dfsek/terra/api/gaea/tree/Tree.java | 0 .../gaea/tree/fractal/EntitySpawnHolder.java | 5 +- .../api/gaea/tree/fractal/FractalTree.java | 28 +- .../api/gaea/tree/fractal/TreeGeometry.java | 16 +- .../api/gaea/tree/fractal/trees/Cactus.java | 10 +- .../api/gaea/tree/fractal/trees/IceSpike.java | 12 +- .../api/gaea/tree/fractal/trees/OakTree.java | 13 +- .../tree/fractal/trees/ShatteredPillar.java | 20 +- .../tree/fractal/trees/ShatteredTree.java | 24 +- .../fractal/trees/SmallShatteredPillar.java | 10 +- .../fractal/trees/SmallShatteredTree.java | 24 +- .../gaea/tree/fractal/trees/SpruceTree.java | 17 +- .../dfsek/terra/api/gaea/util/FastRandom.java | 1 + .../dfsek/terra/api/gaea/util/GlueList.java | 0 .../dfsek/terra/api/gaea/util/JarUtil.java | 0 .../api/gaea/util/SerializationUtil.java | 0 .../com/dfsek/terra/api/gaea/world/Flora.java | 0 .../terra/api/gaea/world/carving/Carver.java | 0 .../terra/api/gaea/world/carving/Worm.java | 0 .../terra/api/gaea/world/palette/Palette.java | 0 .../api/gaea/world/palette/RandomPalette.java | 0 .../gaea/world/palette/SimplexPalette.java | 0 .../terra/api/generic/CommandSender.java | 5 + .../com/dfsek/terra/api/generic/Entity.java | 4 + .../com/dfsek/terra/api/generic/Handle.java | 0 .../dfsek/terra/api/generic/TerraPlugin.java | 18 +- .../com/dfsek/terra/api/generic/Tree.java | 4 + .../api/generic/generator/BlockPopulator.java | 0 .../generator/TerraBlockPopulator.java | 0 .../generator/TerraChunkGenerator.java | 0 .../api/generic/inventory/Inventory.java | 11 + .../api/generic/inventory/ItemHandle.java | 7 + .../api/generic/inventory/ItemStack.java | 19 + .../generic/inventory/item/Damageable.java | 10 + .../api/generic/inventory/item/ItemMeta.java | 6 + .../dfsek/terra/api/generic/world/Biome.java | 0 .../terra/api/generic/world/BiomeGrid.java | 0 .../dfsek/terra/api/generic/world/Chunk.java | 0 .../dfsek/terra/api/generic/world/World.java | 8 +- .../terra/api/generic/world/WorldHandle.java | 0 .../terra/api/generic/world/block/Axis.java | 5 + .../terra/api/generic/world/block/Block.java | 0 .../api/generic/world/block/BlockData.java | 0 .../api/generic/world/block/BlockFace.java | 42 +-- .../api/generic/world/block/MaterialData.java | 2 + .../world/block/data/AnaloguePowerable.java | 9 + .../generic/world/block/data/Bisected.java | 0 .../generic/world/block/data/Directional.java | 0 .../world/block/data/MultipleFacing.java | 4 + .../generic/world/block/data/Orientable.java | 12 + .../api/generic/world/block/data/Rail.java | 22 ++ .../world/block/data/RedstoneWire.java | 15 + .../generic/world/block/data/Rotatable.java | 0 .../api/generic/world/block/data/Slab.java | 0 .../api/generic/world/block/data/Stairs.java | 0 .../api/generic/world/block/data/Wall.java | 15 + .../generic/world/block/data/Waterlogged.java | 0 .../generic/world/block/state/BlockState.java | 4 + .../api/generic/world/vector/Location.java | 0 .../api/generic/world/vector/Vector2.java | 0 .../api/generic/world/vector/Vector3.java | 23 +- .../dfsek/terra/async/AsyncBiomeFinder.java | 6 +- .../dfsek/terra/async/AsyncFeatureFinder.java | 13 +- .../java/com/dfsek/terra/biome/BiomeZone.java | 0 .../dfsek/terra/biome/UserDefinedBiome.java | 2 +- .../terra/biome/grid/SingleBiomeGrid.java | 0 .../terra/biome/grid/UserDefinedGrid.java | 0 .../biome/grid/master/TerraBiomeGrid.java | 0 .../grid/master/TerraRadialBiomeGrid.java | 0 .../grid/master/TerraStandardBiomeGrid.java | 0 .../terra/biome/palette/PaletteHolder.java | 0 .../biome/palette/PaletteHolderBuilder.java | 0 .../terra/biome/palette/PaletteLayer.java | 0 .../terra/biome/palette/SinglePalette.java | 0 .../postprocessing/CoordinatePerturb.java | 0 .../biome/postprocessing/ErosionNoise.java | 0 .../com/dfsek/terra/carving/CarverCache.java | 0 .../dfsek/terra/carving/CarverPalette.java | 9 +- .../terra/carving/UserDefinedCarver.java | 0 .../dfsek/terra/config/base/ConfigPack.java | 27 +- .../terra/config/base/ConfigPackTemplate.java | 8 - .../dfsek/terra/config/base/PluginConfig.java | 7 +- .../config/builder/GeneratorBuilder.java | 0 .../builder/biomegrid/BiomeGridBuilder.java | 0 .../builder/biomegrid/SingleGridBuilder.java | 0 .../biomegrid/UserDefinedGridBuilder.java | 0 .../exception/FileMissingException.java | 0 .../terra/config/factories/BiomeFactory.java | 0 .../config/factories/BiomeGridFactory.java | 0 .../terra/config/factories/CarverFactory.java | 0 .../terra/config/factories/FloraFactory.java | 0 .../terra/config/factories/OreFactory.java | 0 .../config/factories/PaletteFactory.java | 0 .../config/factories/StructureFactory.java | 2 +- .../terra/config/factories/TerraFactory.java | 0 .../terra/config/factories/TreeFactory.java | 0 .../config/files/ExceptionalConsumer.java | 0 .../terra/config/files/FolderLoader.java | 0 .../com/dfsek/terra/config/files/Loader.java | 0 .../dfsek/terra/config/files/ZIPLoader.java | 0 .../com/dfsek/terra/config/lang/LangUtil.java | 12 +- .../config/loaders/ImageLoaderLoader.java | 0 .../terra/config/loaders/LootTableLoader.java | 7 +- .../config/loaders/MaterialSetLoader.java | 0 .../loaders/ProbabilityCollectionLoader.java | 0 .../terra/config/loaders/RangeLoader.java | 0 .../com/dfsek/terra/config/loaders/Types.java | 6 +- .../loaders/config/FloraLayerLoader.java | 0 .../loaders/config/GridSpawnLoader.java | 0 .../loaders/config/NoiseBuilderLoader.java | 0 .../loaders/config/OreConfigLoader.java | 0 .../loaders/config/OreHolderLoader.java | 0 .../loaders/config/TreeLayerLoader.java | 0 .../loaders/palette/CarverPaletteLoader.java | 2 +- .../loaders/palette/PaletteHolderLoader.java | 0 .../loaders/palette/PaletteLayerLoader.java | 0 .../templates/AbstractableTemplate.java | 0 .../config/templates/BiomeGridTemplate.java | 0 .../config/templates/CarverTemplate.java | 6 +- .../terra/config/templates/FloraTemplate.java | 4 +- .../terra/config/templates/OreTemplate.java | 0 .../config/templates/PaletteTemplate.java | 0 .../config/templates/StructureTemplate.java | 10 +- .../terra/config/templates/TreeTemplate.java | 5 +- .../java/com/dfsek/terra/debug/Debug.java | 0 .../com/dfsek/terra/debug/gui/DebugFrame.java | 6 +- .../com/dfsek/terra/debug/gui/DebugGUI.java | 6 +- .../generation/ElevationInterpolator.java | 0 .../com/dfsek/terra/generation/Sampler.java | 0 .../terra/generation/TerraChunkGenerator.java | 0 .../generation/UserDefinedDecorator.java | 6 - .../terra/generation/config/NoiseBuilder.java | 0 .../generation/config/WorldGenerator.java | 0 .../generation/items/PlaceableLayer.java | 0 .../generation/items/TerraStructure.java | 7 +- .../generation/items/flora/BlockFlora.java | 0 .../generation/items/flora/ConstantFlora.java | 0 .../generation/items/flora/FloraLayer.java | 0 .../generation/items/flora/TerraFlora.java | 2 +- .../items/ores/DeformedSphereOre.java | 2 +- .../terra/generation/items/ores/Ore.java | 0 .../generation/items/ores/OreConfig.java | 0 .../generation/items/ores/OreHolder.java | 0 .../generation/items/ores/VanillaOre.java | 2 +- .../generation/items/tree/TerraTree.java | 22 +- .../generation/items/tree/TreeLayer.java | 5 +- .../com/dfsek/terra/image/ImageLoader.java | 8 +- .../terra/image/WorldImageGenerator.java | 6 +- .../com/dfsek/terra/math/BlankFunction.java | 0 .../java/com/dfsek/terra/math/MathUtil.java | 0 .../com/dfsek/terra/math/NoiseFunction.java | 0 .../com/dfsek/terra/math/NoiseFunction2.java | 0 .../com/dfsek/terra/math/NoiseFunction3.java | 0 .../com/dfsek/terra/math/RandomFunction.java | 0 .../dfsek/terra/population/CavePopulator.java | 2 +- .../terra/population/FloraPopulator.java | 0 .../dfsek/terra/population/OrePopulator.java | 0 .../terra/population/StructurePopulator.java | 0 .../dfsek/terra/population/TreePopulator.java | 0 .../com/dfsek/terra/procgen/GridSpawn.java | 0 .../terra/procgen/pixel/Distribution.java | 0 .../dfsek/terra/procgen/pixel/Polygon.java | 0 .../dfsek/terra/procgen/pixel/Rectangle.java | 0 .../dfsek/terra/procgen/voxel/Cylinder.java | 10 + .../terra/procgen/voxel/DeformedSphere.java | 6 +- .../com/dfsek/terra/procgen/voxel/Sphere.java | 6 +- .../com/dfsek/terra/procgen/voxel/Tube.java | 8 +- .../terra/procgen/voxel/VoxelGeometry.java | 8 +- .../terra/registry/BiomeGridRegistry.java | 0 .../dfsek/terra/registry/BiomeRegistry.java | 0 .../dfsek/terra/registry/CarverRegistry.java | 0 .../dfsek/terra/registry/ConfigRegistry.java | 10 +- .../dfsek/terra/registry/FloraRegistry.java | 4 +- .../com/dfsek/terra/registry/OreRegistry.java | 0 .../dfsek/terra/registry/PaletteRegistry.java | 11 +- .../terra/registry/StructureRegistry.java | 0 .../dfsek/terra/registry/TerraRegistry.java | 0 .../dfsek/terra/registry/TreeRegistry.java | 3 +- .../com/dfsek/terra/structure/Rotation.java | 1 + .../com/dfsek/terra/util/MaterialSet.java | 0 .../com/dfsek/terra/util/PaletteUtil.java | 0 .../com/dfsek/terra/util/PopulationUtil.java | 2 +- .../java/com/dfsek/terra/util/SlabUtil.java | 0 .../java/com/dfsek/terra/util/TagUtil.java | 4 +- .../dfsek/terra/util/hash/HashIntrinsic.java | 0 .../terra/util/hash/HashMapDoubleDouble.java | 0 platforms/bukkit/build.gradle.kts | 64 ++++ .../dfsek/terra}/bukkit/BukkitBiomeGrid.java | 4 +- .../com/dfsek/terra}/bukkit/BukkitChunk.java | 4 +- .../terra/bukkit/BukkitCommandSender.java | 22 ++ .../com/dfsek/terra/bukkit/BukkitEntity.java | 16 + .../dfsek/terra/bukkit/BukkitItemHandle.java | 13 + .../dfsek/terra/bukkit/BukkitItemMeta.java | 16 + .../dfsek/terra/bukkit/BukkitItemStack.java | 56 +++ .../com/dfsek/terra/bukkit/BukkitPlayer.java | 23 ++ .../com/dfsek/terra/bukkit/BukkitTree.java | 17 + .../com/dfsek/terra}/bukkit/BukkitWorld.java | 17 +- .../terra}/bukkit/BukkitWorldHandle.java | 10 +- .../terra}/bukkit/TerraBukkitPlugin.java | 32 +- .../dfsek/terra/bukkit}/command/Command.java | 25 +- .../terra/bukkit}/command/DebugCommand.java | 2 +- .../terra/bukkit}/command/PlayerCommand.java | 5 +- .../terra/bukkit}/command/WorldCommand.java | 12 +- .../command}/command/FixChunkCommand.java | 8 +- .../bukkit/command}/command/OreCommand.java | 8 +- .../bukkit/command}/command/PacksCommand.java | 14 +- .../command}/command/ReloadCommand.java | 21 +- .../command}/command/SaveDataCommand.java | 9 +- .../bukkit/command}/command/TerraCommand.java | 23 +- .../command}/command/VersionCommand.java | 10 +- .../command}/command/biome/BiomeCommand.java | 8 +- .../command/biome/BiomeInfoCommand.java | 16 +- .../command/biome/BiomeLocateCommand.java | 8 +- .../geometry/DeformedSphereCommand.java | 26 +- .../command/geometry/GeometryCommand.java | 13 +- .../command/geometry/SphereCommand.java | 22 +- .../command/geometry/TubeCommand.java | 24 +- .../command}/command/image/ImageCommand.java | 13 +- .../command}/command/image/RenderCommand.java | 8 +- .../command/image/gui/GUICommand.java | 13 +- .../command/image/gui/RawGUICommand.java | 8 +- .../command/image/gui/StepGUICommand.java | 8 +- .../command/profile/ProfileCommand.java | 11 +- .../command/profile/QueryCommand.java | 13 +- .../command/profile/ResetCommand.java | 16 +- .../command/profile/StartCommand.java | 16 +- .../command}/command/profile/StopCommand.java | 16 +- .../command/structure/ExportCommand.java | 10 +- .../command/structure/LocateCommand.java | 11 +- .../command/structure/SpawnCommand.java | 10 +- .../command/structure/StructureCommand.java | 13 +- .../command/structure/load/LoadCommand.java | 10 +- .../structure/load/LoadFullCommand.java | 8 +- .../structure/load/LoadRawCommand.java | 10 +- .../generator/BukkitChunkGenerator.java | 15 +- .../BukkitChunkGeneratorWrapper.java | 18 +- .../bukkit/generator/BukkitPopulator.java | 6 +- .../generator/BukkitPopulatorWrapper.java | 6 +- .../bukkit}/listeners/EventListener.java | 8 +- .../bukkit}/listeners/PaperListener.java | 2 +- .../bukkit}/listeners/SpigotListener.java | 8 +- .../terra/bukkit}/structure/RotationUtil.java | 41 +- .../structure/WorldEditNotFoundException.java | 2 +- .../bukkit}/structure/WorldEditUtil.java | 2 +- .../terra/bukkit/util/BukkitConversions.java | 10 + .../dfsek/terra/bukkit}/util/PaperUtil.java | 2 +- .../terra}/bukkit/world/BukkitBiome.java | 2 +- .../bukkit/world/block/BukkitBlock.java | 10 +- .../bukkit/world/block/BukkitBlockData.java | 2 +- .../world/block/BukkitMaterialData.java | 7 +- .../world/block/data/BukkitEnumAdapter.java | 82 ++++ .../bukkit/world/block/data/BukkitStairs.java | 10 +- .../world/block/data/BukkitWaterlogged.java | 4 +- .../world/block/data/TerraEnumAdapter.java | 81 ++++ .../bukkit/src}/main/resources/config.yml | 0 .../src}/main/resources/lang/afr_sa.yml | 0 .../bukkit/src}/main/resources/lang/de_de.yml | 0 .../bukkit/src}/main/resources/lang/en_us.yml | 0 .../bukkit/src}/main/resources/lang/es.yml | 0 .../bukkit/src}/main/resources/lang/ja_jp.yml | 0 .../bukkit/src}/main/resources/lang/pl.yml | 0 .../bukkit/src}/main/resources/lang/zh_cn.yml | 0 .../bukkit/src}/main/resources/plugin.yml | 3 +- platforms/bukkit/src/main/resources/world.yml | 1 + platforms/fabric/build.gradle.kts | 20 + settings.gradle.kts | 3 + .../com/dfsek/terra/api/gaea/GaeaPlugin.java | 9 - .../dfsek/terra/api/gaea/profiler/Desire.java | 36 -- .../functions/EnchantWithLevelsFunction.java | 61 --- .../terra/api/gaea/tree/CustomTreeType.java | 66 ---- .../dfsek/terra/api/gaea/tree/TreeType.java | 105 ------ .../api/gaea/tree/fractal/TreeGetter.java | 9 - .../dfsek/terra/api/gaea/util/WorldUtil.java | 46 --- .../com/dfsek/terra/api/gaea/world/Ore.java | 21 -- .../world/block/data/BukkitEnumAdapter.java | 153 -------- .../terra/async/AsyncStructureFinder.java | 57 --- .../terra/config/loaders/StructureLoader.java | 28 -- .../config/StructureFeatureLoader.java | 32 -- .../dfsek/terra/procgen/voxel/Cylinder.java | 9 - .../structure/InitializationException.java | 25 -- .../com/dfsek/terra/structure/Structure.java | 353 ------------------ .../structure/StructureContainedBlock.java | 98 ----- .../StructureContainedInventory.java | 40 -- .../dfsek/terra/structure/StructureInfo.java | 47 --- .../structure/StructureSpawnRequirement.java | 38 -- .../structure/features/EntityFeature.java | 94 ----- .../terra/structure/features/Feature.java | 14 - .../serialize/SerializableBlockData.java | 19 - .../serialize/block/SerializableBanner.java | 52 --- .../block/SerializableBlockState.java | 11 - .../block/SerializableMonsterCage.java | 41 -- .../serialize/block/SerializableSign.java | 38 -- .../dfsek/terra/structure/spawn/AirSpawn.java | 25 -- .../terra/structure/spawn/BlankSpawn.java | 12 - .../terra/structure/spawn/LandSpawn.java | 22 -- .../terra/structure/spawn/OceanSpawn.java | 25 -- .../terra/structure/spawn/Requirement.java | 21 -- .../dfsek/terra/util/StructureTypeEnum.java | 41 -- src/test/java/DistributionTest.java | 83 ---- src/test/java/LookupGenerator.java | 136 ------- .../java/NoiseInstancePerformanceTest.java | 17 - src/test/java/NoiseTest.java | 52 --- src/test/java/RangeTest.java | 39 -- 345 files changed, 1352 insertions(+), 2642 deletions(-) create mode 100644 common/build.gradle.kts rename {src => common/src}/main/java/com/dfsek/terra/TerraProfiler.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/TerraWorld.java (95%) create mode 100644 common/src/main/java/com/dfsek/terra/api/Entity.java rename {src => common/src}/main/java/com/dfsek/terra/api/GenericLoaders.java (90%) rename {src => common/src}/main/java/com/dfsek/terra/api/LoaderRegistrar.java (100%) create mode 100644 common/src/main/java/com/dfsek/terra/api/Player.java rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/Debug.java (79%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/Gaea.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/biome/Biome.java (95%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/biome/Decorator.java (88%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/biome/Generator.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/biome/NormalizationUtil.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/generation/GenerationPhase.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/lang/Language.java (69%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/lang/Message.java (84%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java (68%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java (64%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/math/FastNoiseLite.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/math/Interpolator.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/math/Interpolator3.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/math/MathUtil.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/math/Range.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/profiler/DataHolder.java (77%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/profiler/DataType.java (100%) create mode 100644 common/src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/profiler/Measurement.java (94%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/profiler/ProfileFuture.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java (76%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/serial/MovedObjectInputStream.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java (73%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java (86%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java (83%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java (93%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java (87%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java (89%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/tree/Tree.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java (88%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java (72%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java (79%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java (67%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java (73%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java (81%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java (73%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java (75%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java (66%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java (75%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java (66%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/util/FastRandom.java (99%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/util/GlueList.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/util/JarUtil.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/world/Flora.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/world/palette/Palette.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/world/palette/RandomPalette.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/gaea/world/palette/SimplexPalette.java (100%) create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/CommandSender.java create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/Entity.java rename {src => common/src}/main/java/com/dfsek/terra/api/generic/Handle.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/TerraPlugin.java (56%) create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/Tree.java rename {src => common/src}/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/generator/TerraBlockPopulator.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java (100%) create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/inventory/Inventory.java create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemHandle.java create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemStack.java create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/inventory/item/Damageable.java create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/inventory/item/ItemMeta.java rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/Biome.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/Chunk.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/World.java (78%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java (100%) create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/world/block/Axis.java rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/block/Block.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/block/BlockFace.java (68%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java (89%) create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/world/block/data/AnaloguePowerable.java rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/block/data/Bisected.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/block/data/Directional.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/block/data/MultipleFacing.java (81%) create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Orientable.java create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rail.java create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/world/block/data/RedstoneWire.java rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/block/data/Rotatable.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/block/data/Stairs.java (100%) create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Wall.java rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/block/data/Waterlogged.java (100%) create mode 100644 common/src/main/java/com/dfsek/terra/api/generic/world/block/state/BlockState.java rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/vector/Location.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/vector/Vector2.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java (91%) rename {src => common/src}/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java (89%) rename {src => common/src}/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java (88%) rename {src => common/src}/main/java/com/dfsek/terra/biome/BiomeZone.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/biome/UserDefinedBiome.java (97%) rename {src => common/src}/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/biome/palette/SinglePalette.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/carving/CarverCache.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/carving/CarverPalette.java (81%) rename {src => common/src}/main/java/com/dfsek/terra/carving/UserDefinedCarver.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/base/ConfigPack.java (86%) rename {src => common/src}/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java (95%) rename {src => common/src}/main/java/com/dfsek/terra/config/base/PluginConfig.java (89%) rename {src => common/src}/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/exception/FileMissingException.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/factories/BiomeFactory.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/factories/CarverFactory.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/factories/FloraFactory.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/factories/OreFactory.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/factories/PaletteFactory.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/factories/StructureFactory.java (77%) rename {src => common/src}/main/java/com/dfsek/terra/config/factories/TerraFactory.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/factories/TreeFactory.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/files/ExceptionalConsumer.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/files/FolderLoader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/files/Loader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/files/ZIPLoader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/lang/LangUtil.java (76%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/ImageLoaderLoader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java (84%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/RangeLoader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/Types.java (91%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java (96%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/templates/AbstractableTemplate.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/templates/CarverTemplate.java (95%) rename {src => common/src}/main/java/com/dfsek/terra/config/templates/FloraTemplate.java (91%) rename {src => common/src}/main/java/com/dfsek/terra/config/templates/OreTemplate.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/templates/PaletteTemplate.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/config/templates/StructureTemplate.java (81%) rename {src => common/src}/main/java/com/dfsek/terra/config/templates/TreeTemplate.java (84%) rename {src => common/src}/main/java/com/dfsek/terra/debug/Debug.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/debug/gui/DebugFrame.java (91%) rename {src => common/src}/main/java/com/dfsek/terra/debug/gui/DebugGUI.java (82%) rename {src => common/src}/main/java/com/dfsek/terra/generation/ElevationInterpolator.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/generation/Sampler.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java (91%) rename {src => common/src}/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/generation/config/WorldGenerator.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/generation/items/TerraStructure.java (76%) rename {src => common/src}/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java (99%) rename {src => common/src}/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java (97%) rename {src => common/src}/main/java/com/dfsek/terra/generation/items/ores/Ore.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java (98%) rename {src => common/src}/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java (80%) rename {src => common/src}/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java (79%) rename {src => common/src}/main/java/com/dfsek/terra/image/ImageLoader.java (95%) rename {src => common/src}/main/java/com/dfsek/terra/image/WorldImageGenerator.java (92%) rename {src => common/src}/main/java/com/dfsek/terra/math/BlankFunction.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/math/MathUtil.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/math/NoiseFunction.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/math/NoiseFunction2.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/math/NoiseFunction3.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/math/RandomFunction.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/population/CavePopulator.java (98%) rename {src => common/src}/main/java/com/dfsek/terra/population/FloraPopulator.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/population/OrePopulator.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/population/StructurePopulator.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/population/TreePopulator.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/procgen/GridSpawn.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/procgen/pixel/Distribution.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/procgen/pixel/Polygon.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java (100%) create mode 100644 common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java rename {src => common/src}/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java (71%) rename {src => common/src}/main/java/com/dfsek/terra/procgen/voxel/Sphere.java (71%) rename {src => common/src}/main/java/com/dfsek/terra/procgen/voxel/Tube.java (54%) rename {src => common/src}/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java (67%) rename {src => common/src}/main/java/com/dfsek/terra/registry/BiomeGridRegistry.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/registry/BiomeRegistry.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/registry/CarverRegistry.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/registry/ConfigRegistry.java (80%) rename {src => common/src}/main/java/com/dfsek/terra/registry/FloraRegistry.java (97%) rename {src => common/src}/main/java/com/dfsek/terra/registry/OreRegistry.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/registry/PaletteRegistry.java (57%) rename {src => common/src}/main/java/com/dfsek/terra/registry/StructureRegistry.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/registry/TerraRegistry.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/registry/TreeRegistry.java (52%) rename {src => common/src}/main/java/com/dfsek/terra/structure/Rotation.java (99%) rename {src => common/src}/main/java/com/dfsek/terra/util/MaterialSet.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/util/PaletteUtil.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/util/PopulationUtil.java (87%) rename {src => common/src}/main/java/com/dfsek/terra/util/SlabUtil.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/util/TagUtil.java (96%) rename {src => common/src}/main/java/com/dfsek/terra/util/hash/HashIntrinsic.java (100%) rename {src => common/src}/main/java/com/dfsek/terra/util/hash/HashMapDoubleDouble.java (100%) create mode 100644 platforms/bukkit/build.gradle.kts rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/BukkitBiomeGrid.java (89%) rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/BukkitChunk.java (86%) create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemMeta.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/BukkitWorld.java (73%) rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/BukkitWorldHandle.java (77%) rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/TerraBukkitPlugin.java (88%) rename {src/main/java/com/dfsek/terra/api/gaea => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit}/command/Command.java (80%) rename {src/main/java/com/dfsek/terra/api/gaea => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit}/command/DebugCommand.java (86%) rename {src/main/java/com/dfsek/terra/api/gaea => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit}/command/PlayerCommand.java (93%) rename {src/main/java/com/dfsek/terra/api/gaea => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit}/command/WorldCommand.java (77%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/FixChunkCommand.java (79%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/OreCommand.java (87%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/PacksCommand.java (70%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/ReloadCommand.java (60%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/SaveDataCommand.java (78%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/TerraCommand.java (65%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/VersionCommand.java (71%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/biome/BiomeCommand.java (83%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/biome/BiomeInfoCommand.java (84%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/biome/BiomeLocateCommand.java (92%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/geometry/DeformedSphereCommand.java (66%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/geometry/GeometryCommand.java (69%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/geometry/SphereCommand.java (59%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/geometry/TubeCommand.java (58%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/image/ImageCommand.java (68%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/image/RenderCommand.java (87%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/image/gui/GUICommand.java (69%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/image/gui/RawGUICommand.java (83%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/image/gui/StepGUICommand.java (83%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/profile/ProfileCommand.java (72%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/profile/QueryCommand.java (66%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/profile/ResetCommand.java (64%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/profile/StartCommand.java (65%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/profile/StopCommand.java (65%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/structure/ExportCommand.java (85%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/structure/LocateCommand.java (89%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/structure/SpawnCommand.java (83%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/structure/StructureCommand.java (68%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/structure/load/LoadCommand.java (84%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/structure/load/LoadFullCommand.java (89%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command}/command/structure/load/LoadRawCommand.java (94%) rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/generator/BukkitChunkGenerator.java (83%) rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/generator/BukkitChunkGeneratorWrapper.java (87%) rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/generator/BukkitPopulator.java (79%) rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/generator/BukkitPopulatorWrapper.java (77%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit}/listeners/EventListener.java (86%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit}/listeners/PaperListener.java (80%) rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit}/listeners/SpigotListener.java (92%) rename {src/main/java/com/dfsek/terra/util => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit}/structure/RotationUtil.java (89%) rename {src/main/java/com/dfsek/terra/util => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit}/structure/WorldEditNotFoundException.java (93%) rename {src/main/java/com/dfsek/terra/util => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit}/structure/WorldEditUtil.java (98%) create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java rename {src/main/java/com/dfsek/terra => platforms/bukkit/src/main/java/com/dfsek/terra/bukkit}/util/PaperUtil.java (91%) rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/world/BukkitBiome.java (84%) rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/world/block/BukkitBlock.java (80%) rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/world/block/BukkitBlockData.java (93%) rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/world/block/BukkitMaterialData.java (89%) create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/world/block/data/BukkitStairs.java (77%) rename {src/main/java/com/dfsek/terra/api/implementations => platforms/bukkit/src/main/java/com/dfsek/terra}/bukkit/world/block/data/BukkitWaterlogged.java (77%) create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java rename {src => platforms/bukkit/src}/main/resources/config.yml (100%) rename {src => platforms/bukkit/src}/main/resources/lang/afr_sa.yml (100%) rename {src => platforms/bukkit/src}/main/resources/lang/de_de.yml (100%) rename {src => platforms/bukkit/src}/main/resources/lang/en_us.yml (100%) rename {src => platforms/bukkit/src}/main/resources/lang/es.yml (100%) rename {src => platforms/bukkit/src}/main/resources/lang/ja_jp.yml (100%) rename {src => platforms/bukkit/src}/main/resources/lang/pl.yml (100%) rename {src => platforms/bukkit/src}/main/resources/lang/zh_cn.yml (100%) rename {src => platforms/bukkit/src}/main/resources/plugin.yml (86%) create mode 100644 platforms/bukkit/src/main/resources/world.yml create mode 100644 platforms/fabric/build.gradle.kts delete mode 100644 src/main/java/com/dfsek/terra/api/gaea/GaeaPlugin.java delete mode 100644 src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java delete mode 100644 src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/EnchantWithLevelsFunction.java delete mode 100755 src/main/java/com/dfsek/terra/api/gaea/tree/CustomTreeType.java delete mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java delete mode 100644 src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGetter.java delete mode 100644 src/main/java/com/dfsek/terra/api/gaea/util/WorldUtil.java delete mode 100755 src/main/java/com/dfsek/terra/api/gaea/world/Ore.java delete mode 100644 src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitEnumAdapter.java delete mode 100644 src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java delete mode 100644 src/main/java/com/dfsek/terra/config/loaders/StructureLoader.java delete mode 100644 src/main/java/com/dfsek/terra/config/loaders/config/StructureFeatureLoader.java delete mode 100644 src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java delete mode 100644 src/main/java/com/dfsek/terra/structure/InitializationException.java delete mode 100644 src/main/java/com/dfsek/terra/structure/Structure.java delete mode 100644 src/main/java/com/dfsek/terra/structure/StructureContainedBlock.java delete mode 100644 src/main/java/com/dfsek/terra/structure/StructureContainedInventory.java delete mode 100644 src/main/java/com/dfsek/terra/structure/StructureInfo.java delete mode 100644 src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java delete mode 100644 src/main/java/com/dfsek/terra/structure/features/EntityFeature.java delete mode 100644 src/main/java/com/dfsek/terra/structure/features/Feature.java delete mode 100644 src/main/java/com/dfsek/terra/structure/serialize/SerializableBlockData.java delete mode 100644 src/main/java/com/dfsek/terra/structure/serialize/block/SerializableBanner.java delete mode 100644 src/main/java/com/dfsek/terra/structure/serialize/block/SerializableBlockState.java delete mode 100644 src/main/java/com/dfsek/terra/structure/serialize/block/SerializableMonsterCage.java delete mode 100644 src/main/java/com/dfsek/terra/structure/serialize/block/SerializableSign.java delete mode 100644 src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java delete mode 100644 src/main/java/com/dfsek/terra/structure/spawn/BlankSpawn.java delete mode 100644 src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java delete mode 100644 src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java delete mode 100644 src/main/java/com/dfsek/terra/structure/spawn/Requirement.java delete mode 100644 src/main/java/com/dfsek/terra/util/StructureTypeEnum.java delete mode 100644 src/test/java/DistributionTest.java delete mode 100644 src/test/java/LookupGenerator.java delete mode 100644 src/test/java/NoiseInstancePerformanceTest.java delete mode 100644 src/test/java/NoiseTest.java delete mode 100644 src/test/java/RangeTest.java diff --git a/build.gradle.kts b/build.gradle.kts index ed12e012e..976352fbc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -14,12 +14,19 @@ plugins { id("com.github.johnrengelman.shadow").version("6.1.0") } +val versionObj = Version("2", "2", "0", true) + +allprojects { + version = versionObj + group = "com.dfsek.terra" + +} + repositories { maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") } maven { url = uri("http://maven.enginehub.org/repo/") } maven { url = uri("https://repo.codemc.org/repository/maven-public") } maven { url = uri("https://papermc.io/repo/repository/maven-public/") } - maven { url = uri("https://repo.aikar.co/content/groups/aikar/") } } java { @@ -27,15 +34,10 @@ java { targetCompatibility = JavaVersion.VERSION_1_8 } -val versionObj = Version("2", "2", "0", true) - -version = versionObj - dependencies { implementation("org.apache.commons:commons-rng-core:1.3") implementation("net.jafama:jafama:2.3.2") - compileOnly("org.jetbrains:annotations:20.1.0") implementation("commons-io:commons-io:2.4") implementation("org.apache.commons:commons-imaging:1.0-alpha2") @@ -47,19 +49,20 @@ dependencies { implementation("com.scireum:parsii:1.2.1") - compileOnly("org.spigotmc:spigot-api:1.16.2-R0.1-SNAPSHOT") - implementation("io.papermc:paperlib:1.0.5") - implementation("net.jafama:jafama:2.3.2") implementation("com.dfsek:Tectonic:1.0.3") + + // JUnit. testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0") } + + val compileJava: JavaCompile by tasks val mainSourceSet: SourceSet = sourceSets["main"] @@ -168,7 +171,7 @@ val testWithPaper = task(name = "testWithPaper") { // Copy Terra into dir doFirst { copy { - from("${buildDir}/libs/Terra-${versionObj}.jar") + from("${project("platforms:bukkit").buildDir}/libs/Terra-${versionObj}.jar") into("${testDir}/plugins/") } } diff --git a/common/build.gradle.kts b/common/build.gradle.kts new file mode 100644 index 000000000..07524d9e2 --- /dev/null +++ b/common/build.gradle.kts @@ -0,0 +1,47 @@ +plugins { + java + maven + idea + id("com.github.johnrengelman.shadow") +} + +group = "com.dfsek.terra.common" + +repositories { + mavenCentral() + maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") } + maven { url = uri("http://maven.enginehub.org/repo/") } + maven { url = uri("https://repo.codemc.org/repository/maven-public") } + maven { url = uri("https://papermc.io/repo/repository/maven-public/") } +} + +dependencies { + compileOnly("org.jetbrains:annotations:20.1.0") + testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0") + implementation("org.apache.commons:commons-rng-core:1.3") + implementation("commons-io:commons-io:2.4") + + implementation("com.scireum:parsii:1.2.1") + implementation("com.dfsek:Tectonic:1.0.3") + implementation("net.jafama:jafama:2.3.2") + + compileOnly("com.googlecode.json-simple:json-simple:1.1") + + implementation("com.google.guava:guava:30.0-jre") +} + +tasks.named("shadowJar") { + + archiveClassifier.set("") + archiveBaseName.set("Terra") + setVersion(project.version) + relocate("org.apache.commons", "com.dfsek.terra.lib.commons") + relocate("org.bstats.bukkit", "com.dfsek.terra.lib.bstats") + relocate("parsii", "com.dfsek.terra.lib.parsii") + relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") + relocate("net.jafama", "com.dfsek.terra.lib.jafama") + relocate("com.dfsek.tectonic", "com.dfsek.terra.lib.tectonic") + relocate("net.jafama", "com.dfsek.terra.lib.jafama") + minimize() +} \ No newline at end of file diff --git a/src/main/java/com/dfsek/terra/TerraProfiler.java b/common/src/main/java/com/dfsek/terra/TerraProfiler.java similarity index 100% rename from src/main/java/com/dfsek/terra/TerraProfiler.java rename to common/src/main/java/com/dfsek/terra/TerraProfiler.java diff --git a/src/main/java/com/dfsek/terra/TerraWorld.java b/common/src/main/java/com/dfsek/terra/TerraWorld.java similarity index 95% rename from src/main/java/com/dfsek/terra/TerraWorld.java rename to common/src/main/java/com/dfsek/terra/TerraWorld.java index 1d90a3072..8129e6e81 100644 --- a/src/main/java/com/dfsek/terra/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/TerraWorld.java @@ -3,7 +3,6 @@ package com.dfsek.terra; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.implementations.bukkit.generator.BukkitChunkGenerator; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.biome.grid.master.TerraRadialBiomeGrid; @@ -12,6 +11,7 @@ import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.config.builder.biomegrid.BiomeGridBuilder; import com.dfsek.terra.debug.Debug; +import com.dfsek.terra.generation.TerraChunkGenerator; public class TerraWorld { private final TerraBiomeGrid grid; @@ -55,7 +55,7 @@ public class TerraWorld { } public static boolean isTerraWorld(World w) { - return w.getGenerator() instanceof BukkitChunkGenerator; + return w.getGenerator() instanceof TerraChunkGenerator; } public TerraBiomeGrid getGrid() { diff --git a/common/src/main/java/com/dfsek/terra/api/Entity.java b/common/src/main/java/com/dfsek/terra/api/Entity.java new file mode 100644 index 000000000..ace1710e4 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/Entity.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.api; + +import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.generic.world.vector.Location; + +public interface Entity extends Handle { + Location getLocation(); +} diff --git a/src/main/java/com/dfsek/terra/api/GenericLoaders.java b/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java similarity index 90% rename from src/main/java/com/dfsek/terra/api/GenericLoaders.java rename to common/src/main/java/com/dfsek/terra/api/GenericLoaders.java index 70c57408c..454ecc50d 100644 --- a/src/main/java/com/dfsek/terra/api/GenericLoaders.java +++ b/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java @@ -17,7 +17,6 @@ import com.dfsek.terra.config.loaders.config.GridSpawnLoader; import com.dfsek.terra.config.loaders.config.NoiseBuilderLoader; import com.dfsek.terra.config.loaders.config.OreConfigLoader; import com.dfsek.terra.config.loaders.config.OreHolderLoader; -import com.dfsek.terra.config.loaders.config.StructureFeatureLoader; import com.dfsek.terra.config.loaders.config.TreeLayerLoader; import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader; import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader; @@ -31,9 +30,7 @@ import com.dfsek.terra.generation.items.ores.OreHolder; import com.dfsek.terra.generation.items.tree.TreeLayer; import com.dfsek.terra.image.ImageLoader; import com.dfsek.terra.procgen.GridSpawn; -import com.dfsek.terra.structure.features.Feature; import com.dfsek.terra.util.MaterialSet; -import com.dfsek.terra.util.StructureTypeEnum; public class GenericLoaders implements LoaderRegistrar { private final TerraPlugin main; @@ -57,10 +54,8 @@ public class GenericLoaders implements LoaderRegistrar { .registerLoader(TreeLayer.class, new TreeLayerLoader(main)) .registerLoader(MaterialSet.class, new MaterialSetLoader()) .registerLoader(OreHolder.class, new OreHolderLoader()) - .registerLoader(Feature.class, new StructureFeatureLoader()) .registerLoader(ImageLoader.class, new ImageLoaderLoader()) .registerLoader(TerraBiomeGrid.Type.class, (t, o, l) -> TerraBiomeGrid.Type.valueOf((String) o)) - .registerLoader(StructureTypeEnum.class, (t, o, l) -> StructureTypeEnum.valueOf((String) o)) .registerLoader(ImageLoader.Channel.class, (t, o, l) -> ImageLoader.Channel.valueOf((String) o)) .registerLoader(ImageLoader.Align.class, (t, o, l) -> ImageLoader.Align.valueOf((String) o)) .registerLoader(TerraFlora.Search.class, (t, o, l) -> TerraFlora.Search.valueOf((String) o)); diff --git a/src/main/java/com/dfsek/terra/api/LoaderRegistrar.java b/common/src/main/java/com/dfsek/terra/api/LoaderRegistrar.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/LoaderRegistrar.java rename to common/src/main/java/com/dfsek/terra/api/LoaderRegistrar.java diff --git a/common/src/main/java/com/dfsek/terra/api/Player.java b/common/src/main/java/com/dfsek/terra/api/Player.java new file mode 100644 index 000000000..3d4a1b4a0 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/Player.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api; + +public interface Player extends Entity { +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/Debug.java b/common/src/main/java/com/dfsek/terra/api/gaea/Debug.java similarity index 79% rename from src/main/java/com/dfsek/terra/api/gaea/Debug.java rename to common/src/main/java/com/dfsek/terra/api/gaea/Debug.java index 38fa01148..d447e695f 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/Debug.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/Debug.java @@ -1,11 +1,11 @@ package com.dfsek.terra.api.gaea; -import org.bukkit.plugin.java.JavaPlugin; +import com.dfsek.terra.api.generic.TerraPlugin; public class Debug { - public static JavaPlugin main; + public static TerraPlugin main; - public static void setMain(JavaPlugin main) { + public static void setMain(TerraPlugin main) { Debug.main = main; } diff --git a/src/main/java/com/dfsek/terra/api/gaea/Gaea.java b/common/src/main/java/com/dfsek/terra/api/gaea/Gaea.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/Gaea.java rename to common/src/main/java/com/dfsek/terra/api/gaea/Gaea.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java b/common/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java similarity index 95% rename from src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java rename to common/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java index cc6262deb..d36a22e56 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.gaea.biome; -import org.bukkit.World; + +import com.dfsek.terra.api.generic.world.World; /** * Interface to be implemented by a custom generator's Biome enum.
diff --git a/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java b/common/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java rename to common/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/biome/Decorator.java b/common/src/main/java/com/dfsek/terra/api/gaea/biome/Decorator.java similarity index 88% rename from src/main/java/com/dfsek/terra/api/gaea/biome/Decorator.java rename to common/src/main/java/com/dfsek/terra/api/gaea/biome/Decorator.java index b4353cc85..480dc96cb 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/biome/Decorator.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/biome/Decorator.java @@ -13,8 +13,6 @@ public abstract class Decorator { public abstract boolean overrideStructureChance(); - public abstract org.bukkit.block.Biome getVanillaBiome(); - public abstract ProbabilityCollection getFlora(); public abstract int getFloraChance(); diff --git a/src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java b/common/src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java rename to common/src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/biome/NormalizationUtil.java b/common/src/main/java/com/dfsek/terra/api/gaea/biome/NormalizationUtil.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/biome/NormalizationUtil.java rename to common/src/main/java/com/dfsek/terra/api/gaea/biome/NormalizationUtil.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPhase.java b/common/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPhase.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPhase.java rename to common/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPhase.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java b/common/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java similarity index 69% rename from src/main/java/com/dfsek/terra/api/gaea/lang/Language.java rename to common/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java index 8b977f65f..604b8068d 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java @@ -1,8 +1,7 @@ package com.dfsek.terra.api.gaea.lang; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.YamlConfiguration; + +import com.dfsek.terra.api.generic.CommandSender; import org.jetbrains.annotations.NotNull; import java.io.File; @@ -11,17 +10,15 @@ import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; -public class Language extends YamlConfiguration { - public Language(File file) throws IOException, InvalidConfigurationException { +public class Language { + public Language(File file) throws IOException { load(file); } - @Override - public void load(@NotNull File file) throws IOException, InvalidConfigurationException { - super.load(file); + public void load(@NotNull File file) throws IOException { } @SuppressWarnings("unchecked") public Message getMessage(String id) { - Object m = get(id); + Object m = null; Message temp; if(m instanceof List) { temp = new MultiLineMessage((List) m); diff --git a/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java b/common/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java similarity index 84% rename from src/main/java/com/dfsek/terra/api/gaea/lang/Message.java rename to common/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java index e3b3ab66b..1a3e00003 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.gaea.lang; -import org.bukkit.command.CommandSender; + +import com.dfsek.terra.api.generic.CommandSender; import java.util.logging.Level; import java.util.logging.Logger; diff --git a/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java b/common/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java similarity index 68% rename from src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java rename to common/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java index db7795cb5..2518f286d 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.gaea.lang; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; +import com.dfsek.terra.api.generic.CommandSender; import java.util.Arrays; import java.util.List; @@ -16,14 +15,14 @@ public class MultiLineMessage implements Message { @Override public void log(Logger logger, Level level, String... args) { for(String line: message) { - logger.log(level, ChatColor.translateAlternateColorCodes('&', String.format(line, Arrays.asList(args).toArray()))); + logger.log(level, String.format(line, Arrays.asList(args).toArray())); } } @Override public void send(CommandSender sender, String... args) { for(String line: message) { - sender.sendMessage(ChatColor.translateAlternateColorCodes('&', String.format(line, Arrays.asList(args).toArray()))); + sender.sendMessage(String.format(line, Arrays.asList(args).toArray())); } } diff --git a/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java b/common/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java similarity index 64% rename from src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java rename to common/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java index fdee35f8d..9254300fe 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.gaea.lang; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; + +import com.dfsek.terra.api.generic.CommandSender; import java.util.Arrays; import java.util.logging.Level; @@ -14,12 +14,12 @@ public class SingleLineMessage implements Message { } @Override public void log(Logger logger, Level level, String... args) { - logger.log(level, ChatColor.translateAlternateColorCodes('&', String.format(message, Arrays.asList(args).toArray()))); + logger.log(level, String.format(message, Arrays.asList(args).toArray())); } @Override public void send(CommandSender sender, String... args) { - sender.sendMessage(ChatColor.translateAlternateColorCodes('&', String.format(message, Arrays.asList(args).toArray()))); + sender.sendMessage(String.format(message, Arrays.asList(args).toArray())); } @Override diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java b/common/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java rename to common/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/FastNoiseLite.java b/common/src/main/java/com/dfsek/terra/api/gaea/math/FastNoiseLite.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/math/FastNoiseLite.java rename to common/src/main/java/com/dfsek/terra/api/gaea/math/FastNoiseLite.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator.java b/common/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/math/Interpolator.java rename to common/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator3.java b/common/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator3.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/math/Interpolator3.java rename to common/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator3.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/MathUtil.java b/common/src/main/java/com/dfsek/terra/api/gaea/math/MathUtil.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/math/MathUtil.java rename to common/src/main/java/com/dfsek/terra/api/gaea/math/MathUtil.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java b/common/src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java rename to common/src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/math/Range.java b/common/src/main/java/com/dfsek/terra/api/gaea/math/Range.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/math/Range.java rename to common/src/main/java/com/dfsek/terra/api/gaea/math/Range.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java b/common/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java rename to common/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java b/common/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java rename to common/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/profiler/DataHolder.java b/common/src/main/java/com/dfsek/terra/api/gaea/profiler/DataHolder.java similarity index 77% rename from src/main/java/com/dfsek/terra/api/gaea/profiler/DataHolder.java rename to common/src/main/java/com/dfsek/terra/api/gaea/profiler/DataHolder.java index d6ef3f54d..6d47d52cb 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/profiler/DataHolder.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/profiler/DataHolder.java @@ -1,8 +1,5 @@ package com.dfsek.terra.api.gaea.profiler; -import net.jafama.FastMath; -import net.md_5.bungee.api.ChatColor; - /** * Class to hold a profiler data value. Contains formatting method to highlight value based on desired range. */ @@ -34,12 +31,6 @@ public class DataHolder { * @return String - The formatted data. */ public String getFormattedData(long data) { - double range = desiredRangePercent * desired; - ChatColor color = ChatColor.YELLOW; - if(FastMath.abs(data - desired) > range) { - if(data > desired) color = type.getDesire().getHighColor(); - else color = type.getDesire().getLowColor(); - } - return color + type.getFormatted(data) + ChatColor.RESET; + return type.getFormatted(data); } } diff --git a/src/main/java/com/dfsek/terra/api/gaea/profiler/DataType.java b/common/src/main/java/com/dfsek/terra/api/gaea/profiler/DataType.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/profiler/DataType.java rename to common/src/main/java/com/dfsek/terra/api/gaea/profiler/DataType.java diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java b/common/src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java new file mode 100644 index 000000000..ee2ba541d --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.gaea.profiler; + + +/** + * Enum to represent the "goal" of a value, whether it is desirable for the value to be high (e.g. Frequency), or low (e.g. Period) + */ +public enum Desire { + LOW, HIGH + +} diff --git a/src/main/java/com/dfsek/terra/api/gaea/profiler/Measurement.java b/common/src/main/java/com/dfsek/terra/api/gaea/profiler/Measurement.java similarity index 94% rename from src/main/java/com/dfsek/terra/api/gaea/profiler/Measurement.java rename to common/src/main/java/com/dfsek/terra/api/gaea/profiler/Measurement.java index 1122f0aae..b6782a626 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/profiler/Measurement.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/profiler/Measurement.java @@ -3,7 +3,6 @@ package com.dfsek.terra.api.gaea.profiler; import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.util.GlueList; import net.jafama.FastMath; -import org.bukkit.Bukkit; import java.math.BigInteger; import java.util.List; @@ -33,7 +32,6 @@ public class Measurement { public void record(long value) { max = FastMath.max(value, max); min = FastMath.min(value, min); - if(value / 1000000 > 5000) Bukkit.getLogger().warning("Measurement took " + type.getFormatted(value)); measurements.add(value); } diff --git a/src/main/java/com/dfsek/terra/api/gaea/profiler/ProfileFuture.java b/common/src/main/java/com/dfsek/terra/api/gaea/profiler/ProfileFuture.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/profiler/ProfileFuture.java rename to common/src/main/java/com/dfsek/terra/api/gaea/profiler/ProfileFuture.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java b/common/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java similarity index 76% rename from src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java rename to common/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java index f98e284e5..09d87fdd0 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java @@ -1,12 +1,9 @@ package com.dfsek.terra.api.gaea.profiler; import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.implementations.bukkit.generator.BukkitChunkGenerator; -import com.dfsek.terra.api.implementations.bukkit.generator.BukkitChunkGeneratorWrapper; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import net.jafama.FastMath; -import org.bukkit.ChatColor; import java.util.Map; @@ -16,7 +13,7 @@ public class WorldProfiler { private boolean isProfiling; public WorldProfiler(World w) { - if(!(w.getGenerator() instanceof BukkitChunkGenerator)) + if(w.getGenerator().getTerraGenerator() == null) throw new IllegalArgumentException("Attempted to instantiate profiler on non-Gaea managed world!"); this.addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "TotalChunkGenTime") .addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "ChunkBaseGenTime") @@ -24,29 +21,25 @@ public class WorldProfiler { .addMeasurement(new Measurement(2000000, DataType.PERIOD_MILLISECONDS), "PopulationManagerTime"); isProfiling = false; this.world = w; - ((BukkitChunkGeneratorWrapper) ((BukkitChunkGenerator) w.getGenerator()).getHandle()).getDelegate().attachProfiler(this); + w.getGenerator().getTerraGenerator().attachProfiler(this); } public String getResultsFormatted() { if(! isProfiling) return "Profiler is not currently running."; - StringBuilder result = new StringBuilder(ChatColor.GOLD + "Gaea World Profiler Results (Min / Avg / Max / Std Dev): \n"); + StringBuilder result = new StringBuilder("Gaea World Profiler Results (Min / Avg / Max / Std Dev): \n"); for(Map.Entry e : measures.entrySet()) { - result.append(ChatColor.GOLD) + result .append(e.getKey()) .append(": ") .append(e.getValue().getDataHolder().getFormattedData(e.getValue().getMin())) - .append(ChatColor.GOLD) .append(" / ") .append(e.getValue().getDataHolder().getFormattedData(e.getValue().average())) - .append(ChatColor.GOLD) .append(" / ") .append(e.getValue().getDataHolder().getFormattedData(e.getValue().getMax())) - .append(ChatColor.GOLD) .append(" / ") - .append(ChatColor.GREEN) .append((double) FastMath.round((e.getValue().getStdDev() / 1000000) * 100D) / 100D) .append("ms") - .append(ChatColor.GOLD).append(" (x").append(e.getValue().size()).append(")\n"); + .append(" (x").append(e.getValue().size()).append(")\n"); } return result.toString(); } diff --git a/src/main/java/com/dfsek/terra/api/gaea/serial/MovedObjectInputStream.java b/common/src/main/java/com/dfsek/terra/api/gaea/serial/MovedObjectInputStream.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/serial/MovedObjectInputStream.java rename to common/src/main/java/com/dfsek/terra/api/gaea/serial/MovedObjectInputStream.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java similarity index 73% rename from src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java rename to common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java index 77805b968..5eb15b4aa 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java @@ -2,12 +2,12 @@ package com.dfsek.terra.api.gaea.structures.loot; import com.dfsek.terra.api.gaea.structures.loot.functions.AmountFunction; import com.dfsek.terra.api.gaea.structures.loot.functions.DamageFunction; -import com.dfsek.terra.api.gaea.structures.loot.functions.EnchantWithLevelsFunction; import com.dfsek.terra.api.gaea.structures.loot.functions.Function; import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.inventory.ItemStack; +import com.dfsek.terra.api.generic.world.block.MaterialData; import net.jafama.FastMath; -import org.bukkit.Material; -import org.bukkit.inventory.ItemStack; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -18,19 +18,20 @@ import java.util.Random; * Representation of a single item entry within a Loot Table pool. */ public class Entry { - private final Material item; + private final MaterialData item; private final long weight; private final List functions = new GlueList<>(); + private final TerraPlugin main; /** * Instantiates an Entry from a JSON representation. * * @param entry The JSON Object to instantiate from. */ - public Entry(JSONObject entry) { - + public Entry(JSONObject entry, TerraPlugin main) { + this.main = main; String id = entry.get("name").toString(); - this.item = Material.matchMaterial(id); + this.item = main.getWorldHandle().createMaterialData(id); long weight1; try { @@ -62,15 +63,6 @@ public class Entry { long minDamage = (long) ((JSONObject) ((JSONObject) function).get("damage")).get("min"); functions.add(new DamageFunction(FastMath.toIntExact(minDamage), FastMath.toIntExact(maxDamage))); break; - case "minecraft:enchant_with_levels": - case "enchant_with_levels": - long maxEnchant = (long) ((JSONObject) ((JSONObject) function).get("levels")).get("max"); - long minEnchant = (long) ((JSONObject) ((JSONObject) function).get("levels")).get("min"); - JSONArray disabled = null; - if(((JSONObject) function).containsKey("disabled_enchants")) - disabled = (JSONArray) ((JSONObject) function).get("disabled_enchants"); - functions.add(new EnchantWithLevelsFunction(FastMath.toIntExact(minEnchant), FastMath.toIntExact(maxEnchant), disabled)); - break; } } } @@ -83,7 +75,7 @@ public class Entry { * @return ItemStack - The ItemStack with all functions applied. */ public ItemStack getItem(Random r) { - ItemStack item = new ItemStack(this.item, 1); + ItemStack item = main.getItemHandle().newItemStack(this.item, 1); for(Function f : functions) { item = f.apply(item, r); } diff --git a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java similarity index 86% rename from src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java rename to common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java index facafff7b..08c571915 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java @@ -1,8 +1,9 @@ package com.dfsek.terra.api.gaea.structures.loot; import com.dfsek.terra.api.gaea.util.GlueList; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.inventory.Inventory; +import com.dfsek.terra.api.generic.inventory.ItemStack; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -23,12 +24,12 @@ public class LootTable { * @param json The JSON String representing the loot table. * @throws ParseException if malformed JSON is passed. */ - public LootTable(String json) throws ParseException { + public LootTable(String json, TerraPlugin main) throws ParseException { JSONParser jsonParser = new JSONParser(); Object tableJSON = jsonParser.parse(json); JSONArray poolArray = (JSONArray) ((JSONObject) tableJSON).get("pools"); for(Object pool : poolArray) { - pools.add(new Pool((JSONObject) pool)); + pools.add(new Pool((JSONObject) pool, main)); } } @@ -64,7 +65,7 @@ public class LootTable { if(slotItem == null) { i.setItem(slot, newStack); stack.setAmount(stack.getAmount() - 1); - } else if(slotItem.getType() == newStack.getType()) { + } else if(slotItem.getType().equals(newStack.getType())) { ItemStack dep = newStack.clone(); dep.setAmount(newStack.getAmount() + slotItem.getAmount()); i.setItem(slot, dep); diff --git a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java similarity index 83% rename from src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java rename to common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java index c7e698dde..1e8a2117e 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java @@ -2,8 +2,9 @@ package com.dfsek.terra.api.gaea.structures.loot; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.inventory.ItemStack; import net.jafama.FastMath; -import org.bukkit.inventory.ItemStack; import org.json.simple.JSONArray; import org.json.simple.JSONObject; @@ -16,14 +17,15 @@ import java.util.Random; public class Pool { private final int max; private final int min; - private final ProbabilityCollection entries = new ProbabilityCollection<>(); + private final ProbabilityCollection entries; /** * Instantiates a Pool from a JSON representation. * * @param pool The JSON Object to instantiate from. */ - public Pool(JSONObject pool) { + public Pool(JSONObject pool, TerraPlugin main) { + entries = new ProbabilityCollection<>(); Object amount = pool.get("rolls"); if(amount instanceof Long) { max = FastMath.toIntExact((Long) amount); @@ -34,7 +36,7 @@ public class Pool { } for(Object entryJSON : (JSONArray) pool.get("entries")) { - Entry entry = new Entry((JSONObject) entryJSON); + Entry entry = new Entry((JSONObject) entryJSON, main); entries.add(entry, FastMath.toIntExact(entry.getWeight())); } } diff --git a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java similarity index 93% rename from src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java rename to common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java index 925a54bb7..e93400a7d 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.gaea.structures.loot.functions; -import org.bukkit.inventory.ItemStack; + +import com.dfsek.terra.api.generic.inventory.ItemStack; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java similarity index 87% rename from src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java rename to common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java index 4faa9766e..ee9d3932b 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.gaea.structures.loot.functions; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.Damageable; -import org.bukkit.inventory.meta.ItemMeta; +import com.dfsek.terra.api.generic.inventory.ItemStack; +import com.dfsek.terra.api.generic.inventory.item.Damageable; +import com.dfsek.terra.api.generic.inventory.item.ItemMeta; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java similarity index 89% rename from src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java rename to common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java index b58dc1b81..ed1961390 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.gaea.structures.loot.functions; -import org.bukkit.inventory.ItemStack; + +import com.dfsek.terra.api.generic.inventory.ItemStack; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java rename to common/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java similarity index 88% rename from src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java rename to common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java index 8f1c1d3a5..a2983e747 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java @@ -1,8 +1,9 @@ package com.dfsek.terra.api.gaea.tree.fractal; +import com.dfsek.terra.api.generic.Entity; import com.dfsek.terra.api.generic.world.vector.Location; -import org.bukkit.entity.Entity; -import org.bukkit.util.Consumer; + +import java.util.function.Consumer; public class EntitySpawnHolder { diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java similarity index 72% rename from src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java rename to common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java index 4bd4409db..f8fed6916 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java @@ -1,20 +1,18 @@ package com.dfsek.terra.api.gaea.tree.fractal; import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.generic.Entity; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; -import org.bukkit.Material; -import org.bukkit.entity.Entity; -import org.bukkit.util.Consumer; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Random; +import java.util.function.Consumer; public abstract class FractalTree { @@ -22,9 +20,7 @@ public abstract class FractalTree { private final List entities = new GlueList<>(); private final Location origin; private final Random random; - private final List replaceable = Arrays.asList(Material.AIR, Material.GRASS_BLOCK, Material.DIRT, Material.STONE, Material.COARSE_DIRT, Material.GRAVEL, Material.PODZOL, - Material.GRASS, Material.TALL_GRASS, Material.FERN, Material.POPPY, Material.LARGE_FERN, Material.BLUE_ORCHID, Material.AZURE_BLUET, Material.END_STONE, Material.SNOW, Material.SAND, Material.STONE_BUTTON, Material.DEAD_BUSH); - + private final TerraPlugin main; /** * Instantiates a TreeGrower at an origin location. @@ -32,9 +28,10 @@ public abstract class FractalTree { * @param origin - The origin location. * @param random - The random object to use whilst generating the tree. */ - public FractalTree(Location origin, Random random) { + public FractalTree(Location origin, Random random, TerraPlugin plugin) { this.origin = origin.add(0, 1, 0); this.random = random; + this.main = plugin; } /** @@ -71,8 +68,12 @@ public abstract class FractalTree { * @param l - The location to set. * @param m - The material to which it will be set. */ - public void setBlock(Location l, Material m) { - treeAssembler.put(l, new BukkitBlockData(m.createBlockData())); + public void setBlock(Location l, BlockData m) { + treeAssembler.put(l, m); + } + + public TerraPlugin getMain() { + return main; } /** @@ -86,8 +87,7 @@ public abstract class FractalTree { @SuppressWarnings("unchecked") public void plant() { for(Map.Entry entry : treeAssembler.entrySet()) { - if(replaceable.contains(entry.getKey().getBlock().getType())) - entry.getKey().getBlock().setBlockData(entry.getValue(), false); + entry.getKey().getBlock().setBlockData(entry.getValue(), false); } for(EntitySpawnHolder e : entities) { Objects.requireNonNull(e.getLocation().getWorld()).spawn(e.getLocation(), e.getEntity(), e.getConsumer()); @@ -107,7 +107,7 @@ public abstract class FractalTree { * @return Material - The material at the specified block. */ public MaterialData getMaterial(Location l) { - return treeAssembler.getOrDefault(l, new BukkitBlockData(Material.AIR.createBlockData())).getMaterial(); + return treeAssembler.getOrDefault(l, main.getWorldHandle().createBlockData("minecraft:air")).getMaterial(); } diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java similarity index 79% rename from src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java rename to common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java index 865a44135..105f532f6 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.gaea.tree.fractal; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector3; -import org.bukkit.Material; public class TreeGeometry { private final FractalTree tree; @@ -20,15 +20,15 @@ public class TreeGeometry { return tree; } - public void generateSphere(Location l, Material m, int radius, boolean overwrite) { - generateSphere(l, new ProbabilityCollection().add(m, 1), radius, overwrite); + public void generateSphere(Location l, BlockData m, int radius, boolean overwrite) { + generateSphere(l, new ProbabilityCollection().add(m, 1), radius, overwrite); } - public void generateCylinder(Location l, Material m, int radius, int height, boolean overwrite) { - generateCylinder(l, new ProbabilityCollection().add(m, 1), radius, height, overwrite); + public void generateCylinder(Location l, BlockData m, int radius, int height, boolean overwrite) { + generateCylinder(l, new ProbabilityCollection().add(m, 1), radius, height, overwrite); } - public void generateSphere(Location l, ProbabilityCollection m, int radius, boolean overwrite) { + public void generateSphere(Location l, ProbabilityCollection m, int radius, boolean overwrite) { for(int x = - radius; x <= radius; x++) { for(int y = - radius; y <= radius; y++) { for(int z = - radius; z <= radius; z++) { @@ -40,7 +40,7 @@ public class TreeGeometry { } } - public void generateSponge(Location l, ProbabilityCollection m, int radius, boolean overwrite, int sponginess) { + public void generateSponge(Location l, ProbabilityCollection m, int radius, boolean overwrite, int sponginess) { for(int x = - radius; x <= radius; x++) { for(int y = - radius; y <= radius; y++) { for(int z = - radius; z <= radius; z++) { @@ -52,7 +52,7 @@ public class TreeGeometry { } } - public void generateCylinder(Location l, ProbabilityCollection m, int radius, int height, boolean overwrite) { + public void generateCylinder(Location l, ProbabilityCollection m, int radius, int height, boolean overwrite) { for(int x = - radius; x <= radius; x++) { for(int y = 0; y <= height; y++) { for(int z = - radius; z <= radius; z++) { diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java similarity index 67% rename from src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java rename to common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java index 3ff2946ad..5bc7272f7 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java @@ -1,8 +1,9 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; -import org.bukkit.Material; import java.util.Random; @@ -13,8 +14,8 @@ public class Cactus extends FractalTree { * @param origin - The origin location. * @param random - The random object to use whilst generating the tree. */ - public Cactus(Location origin, Random random) { - super(origin, random); + public Cactus(Location origin, Random random, TerraPlugin main) { + super(origin, random, main); } /** @@ -22,7 +23,8 @@ public class Cactus extends FractalTree { */ @Override public void grow() { + BlockData cactus = getMain().getWorldHandle().createBlockData("minecraft:cactus"); int h = super.getRandom().nextInt(4) + 1; - for(int i = 0; i < h; i++) setBlock(super.getOrigin().clone().add(0, i, 0), Material.CACTUS); + for(int i = 0; i < h; i++) setBlock(super.getOrigin().clone().add(0, i, 0), cactus); } } diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java similarity index 73% rename from src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java rename to common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java index 2c9e5efe6..935c59759 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java @@ -3,16 +3,18 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector3; -import org.bukkit.Material; import java.util.Random; public class IceSpike extends FractalTree { private final TreeGeometry geo; - private static final ProbabilityCollection ice = new ProbabilityCollection().add(Material.PACKED_ICE, 95).add(Material.BLUE_ICE, 5); + private final ProbabilityCollection ice; /** * Instantiates a TreeGrower at an origin location. @@ -20,9 +22,11 @@ public class IceSpike extends FractalTree { * @param origin - The origin location. * @param random - The random object to use whilst generating the tree. */ - public IceSpike(Location origin, Random random) { - super(origin, random); + public IceSpike(Location origin, Random random, TerraPlugin main) { + super(origin, random, main); geo = new TreeGeometry(this); + WorldHandle handle = main.getWorldHandle(); + ice = new ProbabilityCollection().add(handle.createBlockData("minecraft:packed_ice"), 95).add(handle.createBlockData("minecraft:blue_ice"), 5); } private double getOffset() { diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java similarity index 81% rename from src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java rename to common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java index beab1539e..e55e3af2d 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java @@ -2,10 +2,11 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector3; import net.jafama.FastMath; -import org.bukkit.Material; import java.util.Random; @@ -19,8 +20,8 @@ public class OakTree extends FractalTree { * @param origin - The origin location. * @param random - The random object to use whilst generating the tree. */ - public OakTree(Location origin, Random random) { - super(origin, random); + public OakTree(Location origin, Random random, TerraPlugin main) { + super(origin, random, main); geo = new TreeGeometry(this); } @@ -33,14 +34,16 @@ public class OakTree extends FractalTree { } private void growBranch(Location l1, Vector3 diff, double d1, int recursions) { + BlockData wood = getMain().getWorldHandle().createBlockData("minecraft:oak_wood"); + BlockData leaves = getMain().getWorldHandle().createBlockData("minecraft:oak_leave"); if(recursions > 1) { - geo.generateSphere(l1, Material.OAK_LEAVES, 1 + super.getRandom().nextInt(2) + (3 - recursions), false); + geo.generateSphere(l1, leaves, 1 + super.getRandom().nextInt(2) + (3 - recursions), false); if(recursions > 2) return; } if(diff.getY() < 0) diff.rotateAroundAxis(TreeGeometry.getPerpendicular(diff.clone()).normalize(), FastMath.PI); int d = (int) diff.length(); for(int i = 0; i < d; i++) { - geo.generateSphere(l1.clone().add(diff.clone().multiply((double) i / d)), Material.OAK_WOOD, FastMath.max((int) d1, 0), true); + geo.generateSphere(l1.clone().add(diff.clone().multiply((double) i / d)), wood, FastMath.max((int) d1, 0), true); } double runningAngle = (double) 45 / (recursions + 1); growBranch(l1.clone().add(diff), diff.clone().multiply(0.75).rotateAroundX(FastMath.toRadians(runningAngle + getNoise())).rotateAroundZ(FastMath.toRadians(getNoise())), diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java similarity index 73% rename from src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java rename to common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java index 9caa60af9..f495bc4ec 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; -import org.bukkit.Material; -import org.bukkit.entity.EnderCrystal; import java.util.Random; @@ -14,8 +14,8 @@ public class ShatteredPillar extends FractalTree { * @param origin - The origin location. * @param random - The random object to use whilst generating the tree. */ - public ShatteredPillar(Location origin, Random random) { - super(origin, random); + public ShatteredPillar(Location origin, Random random, TerraPlugin main) { + super(origin, random, main); } /** @@ -23,30 +23,28 @@ public class ShatteredPillar extends FractalTree { */ @Override public void grow() { + BlockData obsidian = getMain().getWorldHandle().createBlockData("minecraft:obsidian"); int h = super.getRandom().nextInt(5) + 8; int max = h; - for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(0, i, 0), Material.OBSIDIAN); + for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(0, i, 0), obsidian); h = h + (getRandom().nextBoolean() ? getRandom().nextInt(3) + 1 : - (getRandom().nextInt(3) + 1)); int[] crystalLoc = new int[] {0, 0}; if(h > max) { max = h; crystalLoc = new int[] {1, 0}; } - for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(1, i, 0), Material.OBSIDIAN); + for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(1, i, 0), obsidian); h = h + (getRandom().nextBoolean() ? getRandom().nextInt(3) + 1 : - (getRandom().nextInt(3) + 1)); if(h > max) { max = h; crystalLoc = new int[] {0, 1}; } - for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(0, i, 1), Material.OBSIDIAN); + for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(0, i, 1), obsidian); h = h + (getRandom().nextBoolean() ? getRandom().nextInt(3) + 1 : - (getRandom().nextInt(3) + 1)); if(h > max) { max = h; crystalLoc = new int[] {1, 1}; } - for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(1, i, 1), Material.OBSIDIAN); - if(getRandom().nextInt(100) < 25) - spawnEntity(getOrigin().add(crystalLoc[0] + 0.5, max, crystalLoc[1] + 0.5), EnderCrystal.class, - enderCrystal -> ((EnderCrystal) enderCrystal).setShowingBottom(false)); + for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(1, i, 1), obsidian); } } diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java similarity index 75% rename from src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java rename to common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java index 45c730596..4c366053b 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java @@ -3,21 +3,19 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector3; import net.jafama.FastMath; -import org.bukkit.Material; import java.util.Random; public class ShatteredTree extends FractalTree { private final TreeGeometry geo; - private final ProbabilityCollection bark = new ProbabilityCollection() - .add(Material.OBSIDIAN, 1) - .add(Material.BLACK_CONCRETE, 1); - private final ProbabilityCollection leaves = new ProbabilityCollection() - .add(Material.PURPLE_STAINED_GLASS, 1) - .add(Material.MAGENTA_STAINED_GLASS, 1); + private final ProbabilityCollection bark; + private final ProbabilityCollection leaves; /** * Instantiates a TreeGrower at an origin location. @@ -25,9 +23,17 @@ public class ShatteredTree extends FractalTree { * @param origin - The origin location. * @param random - The random object to use whilst generating the tree. */ - public ShatteredTree(Location origin, Random random) { - super(origin, random); + public ShatteredTree(Location origin, Random random, TerraPlugin main) { + super(origin, random, main); geo = new TreeGeometry(this); + WorldHandle handle = main.getWorldHandle(); + + bark = new ProbabilityCollection() + .add(handle.createBlockData("minecraft:obsidian"), 1) + .add(handle.createBlockData("minecraft:black_concrete"), 1); + leaves = new ProbabilityCollection() + .add(handle.createBlockData("minecraft:purple_stained_glass"), 1) + .add(handle.createBlockData("minecraft:magenta_stained_glass"), 1); } /** diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java similarity index 66% rename from src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java rename to common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java index 2f1581228..a4f779e86 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java @@ -1,8 +1,9 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; -import org.bukkit.Material; import java.util.Random; @@ -13,8 +14,8 @@ public class SmallShatteredPillar extends FractalTree { * @param origin - The origin location. * @param random - The random object to use whilst generating the tree. */ - public SmallShatteredPillar(Location origin, Random random) { - super(origin, random); + public SmallShatteredPillar(Location origin, Random random, TerraPlugin main) { + super(origin, random, main); } /** @@ -23,6 +24,7 @@ public class SmallShatteredPillar extends FractalTree { @Override public void grow() { int h = super.getRandom().nextInt(5) + 5; - for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(0, i, 0), Material.OBSIDIAN); + BlockData obsidian = getMain().getWorldHandle().createBlockData("minecraft:obsidian"); + for(int i = - h; i < h; i++) setBlock(super.getOrigin().clone().add(0, i, 0), obsidian); } } diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java similarity index 75% rename from src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java rename to common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java index 569c986ee..18bc86486 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java @@ -3,21 +3,19 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector3; import net.jafama.FastMath; -import org.bukkit.Material; import java.util.Random; public class SmallShatteredTree extends FractalTree { private final TreeGeometry geo; - private final ProbabilityCollection bark = new ProbabilityCollection() - .add(Material.OBSIDIAN, 1) - .add(Material.BLACK_CONCRETE, 1); - private final ProbabilityCollection leaves = new ProbabilityCollection() - .add(Material.PURPLE_STAINED_GLASS, 1) - .add(Material.MAGENTA_STAINED_GLASS, 1); + private final ProbabilityCollection bark; + private final ProbabilityCollection leaves; /** * Instantiates a TreeGrower at an origin location. @@ -25,9 +23,17 @@ public class SmallShatteredTree extends FractalTree { * @param origin - The origin location. * @param random - The random object to use whilst generating the tree. */ - public SmallShatteredTree(Location origin, Random random) { - super(origin, random); + public SmallShatteredTree(Location origin, Random random, TerraPlugin main) { + super(origin, random, main); geo = new TreeGeometry(this); + + WorldHandle handle = main.getWorldHandle(); + bark = new ProbabilityCollection() + .add(handle.createBlockData("minecraft:obsidian"), 1) + .add(handle.createBlockData("minecraft:black_concrete"), 1); + leaves = new ProbabilityCollection() + .add(handle.createBlockData("minecraft:purple_stained_glass"), 1) + .add(handle.createBlockData("minecraft:magenta_stained_glass"), 1); } /** diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java similarity index 66% rename from src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java rename to common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java index 83d5765cd..7a9a9ff8a 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java @@ -2,10 +2,11 @@ package com.dfsek.terra.api.gaea.tree.fractal.trees; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector3; import net.jafama.FastMath; -import org.bukkit.Material; import java.util.Random; @@ -18,8 +19,8 @@ public class SpruceTree extends FractalTree { * @param origin - The origin location. * @param random - The random object to use whilst generating the tree. */ - public SpruceTree(Location origin, Random random) { - super(origin, random); + public SpruceTree(Location origin, Random random, TerraPlugin main) { + super(origin, random, main); geo = new TreeGeometry(this); } @@ -35,12 +36,14 @@ public class SpruceTree extends FractalTree { if(diff.getY() < 0) diff.rotateAroundAxis(TreeGeometry.getPerpendicular(diff.clone()).normalize(), FastMath.PI); int d = (int) diff.length(); int rad = 7; + BlockData wood = getMain().getWorldHandle().createBlockData("minecraft:spruce_wood"); + BlockData leaves = getMain().getWorldHandle().createBlockData("minecraft:spruce_leave"); for(int i = 0; i < d; i++) { - geo.generateSphere(l1.clone().add(diff.clone().multiply((double) i / d)), Material.SPRUCE_WOOD, (int) ((i > d * 0.65) ? 0.5 : 1.5), true); + geo.generateSphere(l1.clone().add(diff.clone().multiply((double) i / d)), wood, (int) ((i > d * 0.65) ? 0.5 : 1.5), true); if(i > 3) - geo.generateCylinder(l1.clone().add(diff.clone().multiply((double) i / d)), Material.SPRUCE_LEAVES, (int) (((6 - (i % 4))) * (1.25 - ((double) i / d))), 1, false); + geo.generateCylinder(l1.clone().add(diff.clone().multiply((double) i / d)), leaves, (int) (((6 - (i % 4))) * (1.25 - ((double) i / d))), 1, false); } - setBlock(l1.clone().add(diff), Material.SPRUCE_LEAVES); - setBlock(l1.clone().add(diff).add(0, 1, 0), Material.SPRUCE_LEAVES); + setBlock(l1.clone().add(diff), leaves); + setBlock(l1.clone().add(diff).add(0, 1, 0), leaves); } } diff --git a/src/main/java/com/dfsek/terra/api/gaea/util/FastRandom.java b/common/src/main/java/com/dfsek/terra/api/gaea/util/FastRandom.java similarity index 99% rename from src/main/java/com/dfsek/terra/api/gaea/util/FastRandom.java rename to common/src/main/java/com/dfsek/terra/api/gaea/util/FastRandom.java index 5b6710e12..f2cc8ad3a 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/util/FastRandom.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/util/FastRandom.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.gaea.util; + import org.apache.commons.rng.core.source64.XoRoShiRo128PlusPlus; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/api/gaea/util/GlueList.java b/common/src/main/java/com/dfsek/terra/api/gaea/util/GlueList.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/util/GlueList.java rename to common/src/main/java/com/dfsek/terra/api/gaea/util/GlueList.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/util/JarUtil.java b/common/src/main/java/com/dfsek/terra/api/gaea/util/JarUtil.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/util/JarUtil.java rename to common/src/main/java/com/dfsek/terra/api/gaea/util/JarUtil.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java b/common/src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java rename to common/src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java b/common/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/world/Flora.java rename to common/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java b/common/src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java rename to common/src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java b/common/src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java rename to common/src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/palette/Palette.java b/common/src/main/java/com/dfsek/terra/api/gaea/world/palette/Palette.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/world/palette/Palette.java rename to common/src/main/java/com/dfsek/terra/api/gaea/world/palette/Palette.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/palette/RandomPalette.java b/common/src/main/java/com/dfsek/terra/api/gaea/world/palette/RandomPalette.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/world/palette/RandomPalette.java rename to common/src/main/java/com/dfsek/terra/api/gaea/world/palette/RandomPalette.java diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/palette/SimplexPalette.java b/common/src/main/java/com/dfsek/terra/api/gaea/world/palette/SimplexPalette.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/gaea/world/palette/SimplexPalette.java rename to common/src/main/java/com/dfsek/terra/api/gaea/world/palette/SimplexPalette.java diff --git a/common/src/main/java/com/dfsek/terra/api/generic/CommandSender.java b/common/src/main/java/com/dfsek/terra/api/generic/CommandSender.java new file mode 100644 index 000000000..82a819579 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/CommandSender.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.api.generic; + +public interface CommandSender extends Handle { + void sendMessage(String message); +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/Entity.java b/common/src/main/java/com/dfsek/terra/api/generic/Entity.java new file mode 100644 index 000000000..0ba6db725 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/Entity.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.generic; + +public interface Entity extends Handle { +} diff --git a/src/main/java/com/dfsek/terra/api/generic/Handle.java b/common/src/main/java/com/dfsek/terra/api/generic/Handle.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/Handle.java rename to common/src/main/java/com/dfsek/terra/api/generic/Handle.java diff --git a/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java b/common/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java similarity index 56% rename from src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java rename to common/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java index c96f2b94e..4b99eede7 100644 --- a/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java @@ -2,14 +2,18 @@ package com.dfsek.terra.api.generic; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.LoaderRegistrar; +import com.dfsek.terra.api.gaea.lang.Language; +import com.dfsek.terra.api.generic.inventory.ItemHandle; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.config.base.PluginConfig; +import com.dfsek.terra.registry.ConfigRegistry; +import java.io.File; import java.util.logging.Logger; public interface TerraPlugin extends LoaderRegistrar { - WorldHandle getHandle(); + WorldHandle getWorldHandle(); boolean isEnabled(); @@ -18,4 +22,16 @@ public interface TerraPlugin extends LoaderRegistrar { Logger getLogger(); PluginConfig getTerraConfig(); + + File getDataFolder(); + + boolean isDebug(); + + Language getLanguage(); + + ConfigRegistry getRegistry(); + + void reload(); + + ItemHandle getItemHandle(); } diff --git a/common/src/main/java/com/dfsek/terra/api/generic/Tree.java b/common/src/main/java/com/dfsek/terra/api/generic/Tree.java new file mode 100644 index 000000000..d3f584d9f --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/Tree.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.generic; + +public interface Tree extends Handle { +} diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java b/common/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java rename to common/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/TerraBlockPopulator.java b/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraBlockPopulator.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/generator/TerraBlockPopulator.java rename to common/src/main/java/com/dfsek/terra/api/generic/generator/TerraBlockPopulator.java diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java b/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java rename to common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java diff --git a/common/src/main/java/com/dfsek/terra/api/generic/inventory/Inventory.java b/common/src/main/java/com/dfsek/terra/api/generic/inventory/Inventory.java new file mode 100644 index 000000000..ab6148c75 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/inventory/Inventory.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.generic.inventory; + +import com.dfsek.terra.api.generic.Handle; + +public interface Inventory extends Handle { + int getSize(); + + ItemStack getItem(int slot); + + void setItem(int slot, ItemStack newStack); +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemHandle.java b/common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemHandle.java new file mode 100644 index 000000000..d554cb169 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemHandle.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.api.generic.inventory; + +import com.dfsek.terra.api.generic.world.block.MaterialData; + +public interface ItemHandle { + ItemStack newItemStack(MaterialData material, int amount); +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemStack.java b/common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemStack.java new file mode 100644 index 000000000..f6040bea1 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemStack.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.api.generic.inventory; + +import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.generic.inventory.item.ItemMeta; +import com.dfsek.terra.api.generic.world.block.MaterialData; + +public interface ItemStack extends Handle, Cloneable { + int getAmount(); + + void setAmount(int i); + + MaterialData getType(); + + ItemStack clone(); + + ItemMeta getItemMeta(); + + void setItemMeta(ItemMeta meta); +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/inventory/item/Damageable.java b/common/src/main/java/com/dfsek/terra/api/generic/inventory/item/Damageable.java new file mode 100644 index 000000000..35e97ac22 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/inventory/item/Damageable.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.generic.inventory.item; + +import com.dfsek.terra.api.generic.Handle; + +public interface Damageable extends Handle, Cloneable { + Damageable clone(); + int getDamage(); + void setDamage(int damage); + boolean hasDamage(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/inventory/item/ItemMeta.java b/common/src/main/java/com/dfsek/terra/api/generic/inventory/item/ItemMeta.java new file mode 100644 index 000000000..3a6a89d9d --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/inventory/item/ItemMeta.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.api.generic.inventory.item; + +import com.dfsek.terra.api.generic.Handle; + +public interface ItemMeta extends Handle { +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/Biome.java b/common/src/main/java/com/dfsek/terra/api/generic/world/Biome.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/world/Biome.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/Biome.java diff --git a/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java b/common/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java diff --git a/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java b/common/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/world/Chunk.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java diff --git a/src/main/java/com/dfsek/terra/api/generic/world/World.java b/common/src/main/java/com/dfsek/terra/api/generic/world/World.java similarity index 78% rename from src/main/java/com/dfsek/terra/api/generic/world/World.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/World.java index 74624e8ce..402ac478e 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/World.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/World.java @@ -1,15 +1,15 @@ package com.dfsek.terra.api.generic.world; +import com.dfsek.terra.api.generic.Entity; import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.generic.Tree; import com.dfsek.terra.api.generic.generator.ChunkGenerator; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; -import org.bukkit.TreeType; -import org.bukkit.entity.Entity; -import org.bukkit.util.Consumer; import java.io.File; import java.util.UUID; +import java.util.function.Consumer; public interface World extends Handle { long getSeed(); @@ -32,7 +32,7 @@ public interface World extends Handle { Block getBlockAt(Location l); - boolean generateTree(Location l, TreeType vanillaTreeType); // TODO: Bukkit treetype is bad + boolean generateTree(Location l, Tree vanillaTreeType); // TODO: Bukkit treetype is bad void spawn(Location location, Class entity, Consumer consumer); // TODO: Bukkit Entity is bad } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java b/common/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/Axis.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/Axis.java new file mode 100644 index 000000000..e6de705b5 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/block/Axis.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.api.generic.world.block; + +public enum Axis { + X, Y, Z +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/world/block/Block.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/BlockFace.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/BlockFace.java similarity index 68% rename from src/main/java/com/dfsek/terra/api/generic/world/block/BlockFace.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/block/BlockFace.java index 6a16eea70..d1f48544d 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/block/BlockFace.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/block/BlockFace.java @@ -82,67 +82,67 @@ public enum BlockFace { } @NotNull - public org.bukkit.block.BlockFace getOppositeFace() { + public BlockFace getOppositeFace() { switch(this) { case NORTH: - return org.bukkit.block.BlockFace.SOUTH; + return BlockFace.SOUTH; case SOUTH: - return org.bukkit.block.BlockFace.NORTH; + return BlockFace.NORTH; case EAST: - return org.bukkit.block.BlockFace.WEST; + return BlockFace.WEST; case WEST: - return org.bukkit.block.BlockFace.EAST; + return BlockFace.EAST; case UP: - return org.bukkit.block.BlockFace.DOWN; + return BlockFace.DOWN; case DOWN: - return org.bukkit.block.BlockFace.UP; + return BlockFace.UP; case NORTH_EAST: - return org.bukkit.block.BlockFace.SOUTH_WEST; + return BlockFace.SOUTH_WEST; case NORTH_WEST: - return org.bukkit.block.BlockFace.SOUTH_EAST; + return BlockFace.SOUTH_EAST; case SOUTH_EAST: - return org.bukkit.block.BlockFace.NORTH_WEST; + return BlockFace.NORTH_WEST; case SOUTH_WEST: - return org.bukkit.block.BlockFace.NORTH_EAST; + return BlockFace.NORTH_EAST; case WEST_NORTH_WEST: - return org.bukkit.block.BlockFace.EAST_SOUTH_EAST; + return BlockFace.EAST_SOUTH_EAST; case NORTH_NORTH_WEST: - return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST; + return BlockFace.SOUTH_SOUTH_EAST; case NORTH_NORTH_EAST: - return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST; + return BlockFace.SOUTH_SOUTH_WEST; case EAST_NORTH_EAST: - return org.bukkit.block.BlockFace.WEST_SOUTH_WEST; + return BlockFace.WEST_SOUTH_WEST; case EAST_SOUTH_EAST: - return org.bukkit.block.BlockFace.WEST_NORTH_WEST; + return BlockFace.WEST_NORTH_WEST; case SOUTH_SOUTH_EAST: - return org.bukkit.block.BlockFace.NORTH_NORTH_WEST; + return BlockFace.NORTH_NORTH_WEST; case SOUTH_SOUTH_WEST: - return org.bukkit.block.BlockFace.NORTH_NORTH_EAST; + return BlockFace.NORTH_NORTH_EAST; case WEST_SOUTH_WEST: - return org.bukkit.block.BlockFace.EAST_NORTH_EAST; + return BlockFace.EAST_NORTH_EAST; case SELF: - return org.bukkit.block.BlockFace.SELF; + return BlockFace.SELF; } - return org.bukkit.block.BlockFace.SELF; + return BlockFace.SELF; } } diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java similarity index 89% rename from src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java index c0a724a0d..b3f18f746 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java @@ -10,4 +10,6 @@ public interface MaterialData extends Handle { boolean isSolid(); boolean isAir(); + + double getMaxDurability(); } diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/AnaloguePowerable.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/AnaloguePowerable.java new file mode 100644 index 000000000..d3b702234 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/AnaloguePowerable.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.api.generic.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockData; + +public interface AnaloguePowerable extends BlockData { + int getMaximumPower(); + int getPower(); + void setPower(int power); +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/data/Bisected.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Bisected.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/world/block/data/Bisected.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Bisected.java diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/data/Directional.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Directional.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/world/block/data/Directional.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Directional.java diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/data/MultipleFacing.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/MultipleFacing.java similarity index 81% rename from src/main/java/com/dfsek/terra/api/generic/world/block/data/MultipleFacing.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/block/data/MultipleFacing.java index e07b1ce02..9caeea20b 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/block/data/MultipleFacing.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/MultipleFacing.java @@ -9,4 +9,8 @@ public interface MultipleFacing extends BlockData { Set getFaces(); void setFace(BlockFace face, boolean facing); + + Set getAllowedFaces(); + + boolean hasFace(BlockFace f); } diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Orientable.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Orientable.java new file mode 100644 index 000000000..4daf84992 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Orientable.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.api.generic.world.block.data; + +import com.dfsek.terra.api.generic.world.block.Axis; +import com.dfsek.terra.api.generic.world.block.BlockData; + +import java.util.Set; + +public interface Orientable extends BlockData { + Set getAxes(); + void setAxis(Axis axis); + Axis getAxis(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rail.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rail.java new file mode 100644 index 000000000..d0f9dc14c --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rail.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.api.generic.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockData; + +public interface Rail extends BlockData { + Shape getShape(); + + void setShape(Shape newShape); + + enum Shape { + ASCENDING_EAST, + ASCENDING_NORTH, + ASCENDING_SOUTH, + ASCENDING_WEST, + EAST_WEST, + NORTH_EAST, + NORTH_SOUTH, + NORTH_WEST, + SOUTH_EAST, + SOUTH_WEST + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/RedstoneWire.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/RedstoneWire.java new file mode 100644 index 000000000..8a680ecbc --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/RedstoneWire.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.api.generic.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; + +import java.util.Set; + +public interface RedstoneWire extends BlockData, AnaloguePowerable { + Set getAllowedFaces(); + Connection getFace(BlockFace face); + void setFace(BlockFace face, Connection connection); + enum Connection { + NONE, SIDE, UP + } +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rotatable.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rotatable.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/world/block/data/Rotatable.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rotatable.java diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/data/Stairs.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Stairs.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/world/block/data/Stairs.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Stairs.java diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Wall.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Wall.java new file mode 100644 index 000000000..f52aa8fdc --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Wall.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.api.generic.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; + +public interface Wall extends BlockData, Waterlogged { + boolean isUp(); + void setHeight(BlockFace face, Height height); + Height getHeight(BlockFace face); + void setUp(boolean up); + + enum Height { + LOW, NONE, TALL + } +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/block/data/Waterlogged.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Waterlogged.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/world/block/data/Waterlogged.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Waterlogged.java diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/state/BlockState.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/state/BlockState.java new file mode 100644 index 000000000..d09ebc1e0 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/block/state/BlockState.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.generic.world.block.state; + +public interface BlockState { +} diff --git a/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java b/common/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java diff --git a/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector2.java b/common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector2.java similarity index 100% rename from src/main/java/com/dfsek/terra/api/generic/world/vector/Vector2.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector2.java diff --git a/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java b/common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java similarity index 91% rename from src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java rename to common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java index fbde7e7fc..64316f16d 100644 --- a/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java @@ -2,8 +2,6 @@ package com.dfsek.terra.api.generic.world.vector; import com.dfsek.terra.api.generic.world.World; import net.jafama.FastMath; -import org.bukkit.util.NumberConversions; -import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; public class Vector3 implements Cloneable { @@ -201,7 +199,7 @@ public class Vector3 implements Cloneable { * @return the distance */ public double distance(@NotNull Vector3 o) { - return FastMath.sqrt(NumberConversions.square(x - o.x) + NumberConversions.square(y - o.y) + NumberConversions.square(z - o.z)); + return FastMath.sqrt(FastMath.pow2(x - o.x) + FastMath.pow2(y - o.y) + FastMath.pow2(z - o.z)); } /** @@ -211,7 +209,7 @@ public class Vector3 implements Cloneable { * @return the distance */ public double distanceSquared(@NotNull Vector3 o) { - return NumberConversions.square(x - o.x) + NumberConversions.square(y - o.y) + NumberConversions.square(z - o.z); + return FastMath.pow2(x - o.x) + FastMath.pow2(y - o.y) + FastMath.pow2(z - o.z); } /** @@ -222,13 +220,11 @@ public class Vector3 implements Cloneable { * will be counterclockwise when the axis is pointing towards the observer. *

* This method will always make sure the provided axis is a unit vector, to - * not modify the length of the vector when rotating. If you are experienced - * with the scaling of a non-unit axis vector, you can use - * {@link Vector#rotateAroundNonUnitAxis(Vector, double)}. + * not modify the length of the vector when rotating. * * @param axis the axis to rotate the vector around. If the passed vector is * not of length 1, it gets copied and normalized before using it for the - * rotation. Please use {@link Vector#normalize()} on the instance before + * rotation. Please use {@link Vector3#normalize()} on the instance before * passing it to this method * @param angle the angle to rotate the vector around the axis * @return the same vector @@ -250,9 +246,7 @@ public class Vector3 implements Cloneable { * Note that the vector length will change accordingly to the axis vector * length. If the provided axis is not a unit vector, the rotated vector * will not have its previous length. The scaled length of the resulting - * vector will be related to the axis vector. If you are not perfectly sure - * about the scaling of the vector, use - * {@link Vector#rotateAroundAxis(Vector, double)} + * vector will be related to the axis vector. * * @param axis the axis to rotate the vector around. * @param angle the angle to rotate the vector around the axis @@ -307,4 +301,11 @@ public class Vector3 implements Cloneable { this.z = -z; return this; } + + public Vector3 subtract(Vector3 end) { + x-=end.x; + y-=end.y; + z-=end.z; + return this; + } } diff --git a/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java b/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java similarity index 89% rename from src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java rename to common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java index 4a0652583..22ddfd603 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java +++ b/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java @@ -2,10 +2,10 @@ package com.dfsek.terra.async; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector3; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import org.bukkit.Location; import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; @@ -15,7 +15,7 @@ import java.util.function.Consumer; */ public class AsyncBiomeFinder extends AsyncFeatureFinder { - public AsyncBiomeFinder(TerraBiomeGrid grid, Biome target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraBukkitPlugin main) { + public AsyncBiomeFinder(TerraBiomeGrid grid, Biome target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraPlugin main) { super(grid, target, origin, startRadius, maxRadius, callback, main); } diff --git a/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java b/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java similarity index 88% rename from src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java rename to common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java index aca7eccda..9b6383134 100644 --- a/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java +++ b/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java @@ -1,11 +1,10 @@ package com.dfsek.terra.async; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector3; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import org.bukkit.Bukkit; -import org.bukkit.Location; -import org.bukkit.World; import org.jetbrains.annotations.NotNull; import java.util.function.Consumer; @@ -20,9 +19,9 @@ public abstract class AsyncFeatureFinder implements Runnable { protected final World world; private final Consumer callback; protected int searchSize = 1; - protected final TerraBukkitPlugin main; + protected final TerraPlugin main; - public AsyncFeatureFinder(TerraBiomeGrid grid, T target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraBukkitPlugin main) { + public AsyncFeatureFinder(TerraBiomeGrid grid, T target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraPlugin main) { this.grid = grid; this.target = target; this.main = main; @@ -68,7 +67,7 @@ public abstract class AsyncFeatureFinder implements Runnable { toggle = !toggle; } Vector3 finalSpawn = found ? finalizeVector(new Vector3(x, 0, z)) : null; - Bukkit.getScheduler().runTask(main, () -> callback.accept(finalSpawn)); + callback.accept(finalSpawn); } diff --git a/src/main/java/com/dfsek/terra/biome/BiomeZone.java b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java similarity index 100% rename from src/main/java/com/dfsek/terra/biome/BiomeZone.java rename to common/src/main/java/com/dfsek/terra/biome/BiomeZone.java diff --git a/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java b/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java similarity index 97% rename from src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java rename to common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java index 3ea850369..cbc77e328 100644 --- a/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java +++ b/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java @@ -3,11 +3,11 @@ package com.dfsek.terra.biome; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.Decorator; import com.dfsek.terra.api.gaea.biome.Generator; +import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.builder.GeneratorBuilder; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.UserDefinedDecorator; -import org.bukkit.World; /** * Class representing a config-defined biome diff --git a/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java similarity index 100% rename from src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java rename to common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java diff --git a/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java similarity index 100% rename from src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java rename to common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java diff --git a/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java similarity index 100% rename from src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java rename to common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java diff --git a/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java similarity index 100% rename from src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java rename to common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java diff --git a/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java similarity index 100% rename from src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java rename to common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java diff --git a/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java similarity index 100% rename from src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java rename to common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java diff --git a/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java similarity index 100% rename from src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java rename to common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java diff --git a/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java similarity index 100% rename from src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java rename to common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java diff --git a/src/main/java/com/dfsek/terra/biome/palette/SinglePalette.java b/common/src/main/java/com/dfsek/terra/biome/palette/SinglePalette.java similarity index 100% rename from src/main/java/com/dfsek/terra/biome/palette/SinglePalette.java rename to common/src/main/java/com/dfsek/terra/biome/palette/SinglePalette.java diff --git a/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java b/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java similarity index 100% rename from src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java rename to common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java diff --git a/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java b/common/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java similarity index 100% rename from src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java rename to common/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java diff --git a/src/main/java/com/dfsek/terra/carving/CarverCache.java b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java similarity index 100% rename from src/main/java/com/dfsek/terra/carving/CarverCache.java rename to common/src/main/java/com/dfsek/terra/carving/CarverCache.java diff --git a/src/main/java/com/dfsek/terra/carving/CarverPalette.java b/common/src/main/java/com/dfsek/terra/carving/CarverPalette.java similarity index 81% rename from src/main/java/com/dfsek/terra/carving/CarverPalette.java rename to common/src/main/java/com/dfsek/terra/carving/CarverPalette.java index 131b8fa8d..afa30729a 100644 --- a/src/main/java/com/dfsek/terra/carving/CarverPalette.java +++ b/common/src/main/java/com/dfsek/terra/carving/CarverPalette.java @@ -1,9 +1,9 @@ package com.dfsek.terra.carving; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.util.MaterialSet; -import org.bukkit.Material; -import org.bukkit.block.data.BlockData; import java.util.Map; import java.util.TreeMap; @@ -29,7 +29,7 @@ public class CarverPalette { return layers[y]; } - public boolean canReplace(Material material) { + public boolean canReplace(MaterialData material) { return blacklist != replace.contains(material); } @@ -40,13 +40,14 @@ public class CarverPalette { int size = map.lastKey() + 1; layers = new ProbabilityCollection[size]; for(int y = 0; y < size; y++) { - ProbabilityCollection d = new ProbabilityCollection().add(Material.AIR.createBlockData(), 1); // Blank layer + ProbabilityCollection d = null; for(Map.Entry> e : map.entrySet()) { if(e.getKey() >= y) { d = e.getValue(); break; } } + if(d == null) throw new IllegalArgumentException("Null collection at Y=" + y); layers[y] = d; } } diff --git a/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java b/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java similarity index 100% rename from src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java rename to common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java diff --git a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java similarity index 86% rename from src/main/java/com/dfsek/terra/config/base/ConfigPack.java rename to common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 83637f11d..c73fbeedb 100644 --- a/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -23,15 +23,12 @@ import com.dfsek.terra.config.factories.CarverFactory; import com.dfsek.terra.config.factories.FloraFactory; import com.dfsek.terra.config.factories.OreFactory; import com.dfsek.terra.config.factories.PaletteFactory; -import com.dfsek.terra.config.factories.StructureFactory; import com.dfsek.terra.config.factories.TerraFactory; -import com.dfsek.terra.config.factories.TreeFactory; import com.dfsek.terra.config.files.FolderLoader; import com.dfsek.terra.config.files.Loader; import com.dfsek.terra.config.files.ZIPLoader; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.loaders.LootTableLoader; -import com.dfsek.terra.config.loaders.StructureLoader; import com.dfsek.terra.config.templates.AbstractableTemplate; import com.dfsek.terra.config.templates.BiomeGridTemplate; import com.dfsek.terra.config.templates.BiomeTemplate; @@ -39,8 +36,6 @@ import com.dfsek.terra.config.templates.CarverTemplate; import com.dfsek.terra.config.templates.FloraTemplate; import com.dfsek.terra.config.templates.OreTemplate; import com.dfsek.terra.config.templates.PaletteTemplate; -import com.dfsek.terra.config.templates.StructureTemplate; -import com.dfsek.terra.config.templates.TreeTemplate; import com.dfsek.terra.generation.items.TerraStructure; import com.dfsek.terra.generation.items.ores.Ore; import com.dfsek.terra.registry.BiomeGridRegistry; @@ -52,8 +47,6 @@ import com.dfsek.terra.registry.PaletteRegistry; import com.dfsek.terra.registry.StructureRegistry; import com.dfsek.terra.registry.TerraRegistry; import com.dfsek.terra.registry.TreeRegistry; -import com.dfsek.terra.structure.Structure; -import com.dfsek.terra.util.StructureTypeEnum; import parsii.eval.Scope; import java.io.File; @@ -64,7 +57,6 @@ import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; @@ -82,7 +74,7 @@ public class ConfigPack implements LoaderRegistrar { private final BiomeGridRegistry biomeGridRegistry = new BiomeGridRegistry(biomeRegistry); private final StructureRegistry structureRegistry = new StructureRegistry(); private final CarverRegistry carverRegistry = new CarverRegistry(); - private final PaletteRegistry paletteRegistry = new PaletteRegistry(); + private final PaletteRegistry paletteRegistry; private final FloraRegistry floraRegistry; private final OreRegistry oreRegistry = new OreRegistry(); private final TreeRegistry treeRegistry = new TreeRegistry(); @@ -91,12 +83,12 @@ public class ConfigPack implements LoaderRegistrar { private final ConfigLoader selfLoader = new ConfigLoader(); private final Scope varScope = new Scope(); - private final Map structureMap = new HashMap<>(); public ConfigPack(File folder, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); floraRegistry = new FloraRegistry(main); + paletteRegistry = new PaletteRegistry(main); register(abstractConfigLoader); main.register(selfLoader); @@ -116,6 +108,7 @@ public class ConfigPack implements LoaderRegistrar { public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); floraRegistry = new FloraRegistry(main); + paletteRegistry = new PaletteRegistry(main); register(abstractConfigLoader); main.register(selfLoader); @@ -143,15 +136,13 @@ public class ConfigPack implements LoaderRegistrar { for(Map.Entry var : template.getVariables().entrySet()) { varScope.create(var.getKey()).setValue(var.getValue()); } - abstractConfigLoader.registerLoader(Structure.class, new StructureLoader(loader)) - .registerLoader(LootTable.class, new LootTableLoader(loader)); // These loaders need access to the Loader instance to get files. + abstractConfigLoader + .registerLoader(LootTable.class, new LootTableLoader(loader, main)); // These loaders need access to the Loader instance to get files. loader .open("palettes").then(streams -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.load(streams, PaletteTemplate::new), main)).close() .open("ores").then(streams -> buildAll(new OreFactory(), oreRegistry, abstractConfigLoader.load(streams, OreTemplate::new), main)).close() .open("flora").then(streams -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.load(streams, FloraTemplate::new), main)).close() .open("carving").then(streams -> buildAll(new CarverFactory(this), carverRegistry, abstractConfigLoader.load(streams, CarverTemplate::new), main)).close() - .open("structures/trees").then(streams -> buildAll(new TreeFactory(), treeRegistry, abstractConfigLoader.load(streams, TreeTemplate::new), main)).close() - .open("structures/single").then(streams -> buildAll(new StructureFactory(), structureRegistry, abstractConfigLoader.load(streams, StructureTemplate::new), main)).close() .open("biomes").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this)), main)).close() .open("grids").then(streams -> buildAll(new BiomeGridFactory(), biomeGridRegistry, abstractConfigLoader.load(streams, BiomeGridTemplate::new), main)).close(); for(UserDefinedBiome b : biomeRegistry.entries()) { @@ -170,8 +161,6 @@ public class ConfigPack implements LoaderRegistrar { throw new LoadException("No such BiomeGrid \"" + template.getRadialInternalGrid() + "\""); } - template.getStructureLocatables().forEach((type, name) -> structureMap.put(Objects.requireNonNull(type), Objects.requireNonNull(structureRegistry.get(name)))); - LangUtil.log("config-pack.loaded", Level.INFO, template.getID(), String.valueOf((System.nanoTime() - start) / 1000000D), template.getAuthor(), template.getVersion()); } @@ -227,9 +216,6 @@ public class ConfigPack implements LoaderRegistrar { return varScope; } - public TerraStructure getStructureLocatable(StructureTypeEnum type) { - return structureMap.get(type); - } @Override public void register(TypeRegistry registry) { @@ -239,7 +225,6 @@ public class ConfigPack implements LoaderRegistrar { .registerLoader(UserDefinedCarver.class, carverRegistry) .registerLoader(Flora.class, floraRegistry) .registerLoader(Ore.class, oreRegistry) - .registerLoader(Tree.class, treeRegistry) - .registerLoader(TerraStructure.class, structureRegistry); + .registerLoader(Tree.class, treeRegistry); } } diff --git a/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java similarity index 95% rename from src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java rename to common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java index a916ca01a..3ab396c95 100644 --- a/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java @@ -7,7 +7,6 @@ import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.config.NoiseBuilder; import com.dfsek.terra.image.ImageLoader; -import com.dfsek.terra.util.StructureTypeEnum; import java.util.HashMap; import java.util.List; @@ -25,10 +24,6 @@ public class ConfigPackTemplate implements ValidatedConfigTemplate { @Default private Map variables = new HashMap<>(); - @Value("locatable") - @Default - private Map structureLocatables = new HashMap<>(); - @Value("grids") private List grids; @@ -171,9 +166,6 @@ public class ConfigPackTemplate implements ValidatedConfigTemplate { return variables; } - public Map getStructureLocatables() { - return structureLocatables; - } public List getGrids() { return grids; diff --git a/src/main/java/com/dfsek/terra/config/base/PluginConfig.java b/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java similarity index 89% rename from src/main/java/com/dfsek/terra/config/base/PluginConfig.java rename to common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java index 8e1ad77fe..d8f3de9dc 100644 --- a/src/main/java/com/dfsek/terra/config/base/PluginConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java @@ -5,9 +5,8 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.terra.api.gaea.GaeaPlugin; import com.dfsek.terra.api.gaea.util.JarUtil; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.debug.Debug; import java.io.File; @@ -44,14 +43,14 @@ public class PluginConfig implements ConfigTemplate { @Default private boolean dumpDefaultConfig = true; - public void load(GaeaPlugin main) { + public void load(TerraPlugin main) { Logger logger = main.getLogger(); logger.info("Loading config values"); try(FileInputStream file = new FileInputStream(new File(main.getDataFolder(), "config.yml"))) { ConfigLoader loader = new ConfigLoader(); loader.load(this, file); if(dumpDefaultConfig) { // Don't dump default config if already loaded. - try(JarFile jar = new JarFile(new File(TerraBukkitPlugin.class.getProtectionDomain().getCodeSource().getLocation().toURI()))) { + try(JarFile jar = new JarFile(new File(TerraPlugin.class.getProtectionDomain().getCodeSource().getLocation().toURI()))) { JarUtil.copyResourcesToDirectory(jar, "packs", new File(main.getDataFolder(), "packs").toString()); } catch(IOException | URISyntaxException e) { Debug.error("Failed to dump default config files!"); diff --git a/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java rename to common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java diff --git a/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java rename to common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java diff --git a/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java rename to common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java diff --git a/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java rename to common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java diff --git a/src/main/java/com/dfsek/terra/config/exception/FileMissingException.java b/common/src/main/java/com/dfsek/terra/config/exception/FileMissingException.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/exception/FileMissingException.java rename to common/src/main/java/com/dfsek/terra/config/exception/FileMissingException.java diff --git a/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java rename to common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java diff --git a/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java rename to common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java diff --git a/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/factories/CarverFactory.java rename to common/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java diff --git a/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/factories/FloraFactory.java rename to common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java diff --git a/src/main/java/com/dfsek/terra/config/factories/OreFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/OreFactory.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/factories/OreFactory.java rename to common/src/main/java/com/dfsek/terra/config/factories/OreFactory.java diff --git a/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java rename to common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java diff --git a/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java similarity index 77% rename from src/main/java/com/dfsek/terra/config/factories/StructureFactory.java rename to common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java index 9dbb2f347..7421eb8ba 100644 --- a/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java @@ -8,6 +8,6 @@ import com.dfsek.terra.generation.items.TerraStructure; public class StructureFactory implements TerraFactory { @Override public TerraStructure build(StructureTemplate config, TerraPlugin main) throws LoadException { - return new TerraStructure(config.getStructures(), config.getBound(), config.getY(), config.getSpawn(), config.getLoot(), config); + return new TerraStructure(null, config.getBound(), config.getY(), config.getSpawn(), config.getLoot(), config); } } diff --git a/src/main/java/com/dfsek/terra/config/factories/TerraFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/TerraFactory.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/factories/TerraFactory.java rename to common/src/main/java/com/dfsek/terra/config/factories/TerraFactory.java diff --git a/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/factories/TreeFactory.java rename to common/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java diff --git a/src/main/java/com/dfsek/terra/config/files/ExceptionalConsumer.java b/common/src/main/java/com/dfsek/terra/config/files/ExceptionalConsumer.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/files/ExceptionalConsumer.java rename to common/src/main/java/com/dfsek/terra/config/files/ExceptionalConsumer.java diff --git a/src/main/java/com/dfsek/terra/config/files/FolderLoader.java b/common/src/main/java/com/dfsek/terra/config/files/FolderLoader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/files/FolderLoader.java rename to common/src/main/java/com/dfsek/terra/config/files/FolderLoader.java diff --git a/src/main/java/com/dfsek/terra/config/files/Loader.java b/common/src/main/java/com/dfsek/terra/config/files/Loader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/files/Loader.java rename to common/src/main/java/com/dfsek/terra/config/files/Loader.java diff --git a/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java b/common/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/files/ZIPLoader.java rename to common/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java diff --git a/src/main/java/com/dfsek/terra/config/lang/LangUtil.java b/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java similarity index 76% rename from src/main/java/com/dfsek/terra/config/lang/LangUtil.java rename to common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java index 9c372aad0..ad86c6775 100644 --- a/src/main/java/com/dfsek/terra/config/lang/LangUtil.java +++ b/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java @@ -1,11 +1,9 @@ package com.dfsek.terra.config.lang; import com.dfsek.terra.api.gaea.lang.Language; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.generic.CommandSender; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.debug.Debug; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.plugin.java.JavaPlugin; import java.io.File; import java.io.IOException; @@ -20,10 +18,10 @@ public final class LangUtil { private static Language language; private static Logger logger; - public static void load(String langID, JavaPlugin main) { + public static void load(String langID, TerraPlugin main) { logger = main.getLogger(); File file = new File(main.getDataFolder(), "lang"); - try(JarFile jar = new JarFile(new File(TerraBukkitPlugin.class.getProtectionDomain().getCodeSource().getLocation().toURI()))) { + try(JarFile jar = new JarFile(new File(TerraPlugin.class.getProtectionDomain().getCodeSource().getLocation().toURI()))) { copyResourcesToDirectory(jar, "lang", file.toString()); } catch(IOException | URISyntaxException e) { Debug.error("Failed to dump language files!"); @@ -32,7 +30,7 @@ public final class LangUtil { } try { language = new Language(new File(main.getDataFolder(), "lang" + File.separator + langID + ".yml")); - } catch(InvalidConfigurationException | IOException e) { + } catch(IOException e) { logger.severe("Unable to load language: " + langID); e.printStackTrace(); logger.severe("Double-check your configuration before reporting this to Terra!"); diff --git a/src/main/java/com/dfsek/terra/config/loaders/ImageLoaderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/ImageLoaderLoader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/loaders/ImageLoaderLoader.java rename to common/src/main/java/com/dfsek/terra/config/loaders/ImageLoaderLoader.java diff --git a/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java similarity index 84% rename from src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java rename to common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java index 4d66da362..cfa3dcb3e 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java @@ -4,6 +4,7 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.gaea.structures.loot.LootTable; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.config.files.Loader; import org.apache.commons.io.IOUtils; import org.json.simple.parser.ParseException; @@ -15,15 +16,17 @@ import java.nio.charset.StandardCharsets; public class LootTableLoader implements TypeLoader { private final Loader loader; + private final TerraPlugin main; - public LootTableLoader(Loader loader) { + public LootTableLoader(Loader loader, TerraPlugin main) { this.loader = loader; + this.main = main; } @Override public LootTable load(Type type, Object o, ConfigLoader configLoader) throws LoadException { try(InputStream stream = loader.get("structures/loot/" + o + ".json")) { - return new LootTable(IOUtils.toString(stream, StandardCharsets.UTF_8)); + return new LootTable(IOUtils.toString(stream, StandardCharsets.UTF_8), main); } catch(IOException | ParseException | NullPointerException e) { throw new LoadException("Unable to load loot", e); } diff --git a/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java rename to common/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java diff --git a/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java rename to common/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java diff --git a/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java rename to common/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java diff --git a/src/main/java/com/dfsek/terra/config/loaders/Types.java b/common/src/main/java/com/dfsek/terra/config/loaders/Types.java similarity index 91% rename from src/main/java/com/dfsek/terra/config/loaders/Types.java rename to common/src/main/java/com/dfsek/terra/config/loaders/Types.java index 6271084a2..fdd0fefcb 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/Types.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/Types.java @@ -5,7 +5,7 @@ import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.world.Flora; import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.api.generic.world.block.BlockData; -import org.bukkit.Material; +import com.dfsek.terra.api.generic.world.block.MaterialData; import java.lang.reflect.Type; import java.util.Set; @@ -31,9 +31,9 @@ public final class Types { TREE_PROBABILITY_COLLECTION_TYPE = getType("treeProbabilityCollection"); } - private Set materialSet; + private Set materialSet; private Palette blockDataPalette; - private ProbabilityCollection materialProbabilityCollection; + private ProbabilityCollection materialProbabilityCollection; private ProbabilityCollection blockDataProbabilityCollection; private ProbabilityCollection floraProbabilityCollection; private ProbabilityCollection treeProbabilityCollection; diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java rename to common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java rename to common/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java rename to common/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java rename to common/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java rename to common/src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java rename to common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java diff --git a/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java similarity index 96% rename from src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java rename to common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java index 452f1679c..9fe397513 100644 --- a/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java @@ -5,10 +5,10 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.config.loaders.Types; import com.dfsek.terra.util.MaterialSet; -import org.bukkit.block.data.BlockData; import java.lang.reflect.Type; import java.util.List; diff --git a/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java rename to common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java diff --git a/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java rename to common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java diff --git a/src/main/java/com/dfsek/terra/config/templates/AbstractableTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/AbstractableTemplate.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/templates/AbstractableTemplate.java rename to common/src/main/java/com/dfsek/terra/config/templates/AbstractableTemplate.java diff --git a/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java rename to common/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java diff --git a/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java similarity index 95% rename from src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java rename to common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java index bf799a005..782d81355 100644 --- a/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java @@ -4,9 +4,9 @@ import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.util.MaterialSet; -import org.bukkit.Material; import java.util.HashMap; import java.util.Map; @@ -104,7 +104,7 @@ public class CarverTemplate extends AbstractableTemplate { @Value("shift") @Abstractable @Default - private Map shift = new HashMap<>(); + private Map shift = new HashMap<>(); @Value("update") @Abstractable @@ -187,7 +187,7 @@ public class CarverTemplate extends AbstractableTemplate { return inner; } - public Map getShift() { + public Map getShift() { return shift; } diff --git a/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java similarity index 91% rename from src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java rename to common/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java index 125b51e7e..f6bdf1c8a 100644 --- a/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java @@ -3,11 +3,9 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.generation.items.flora.TerraFlora; import com.dfsek.terra.util.MaterialSet; -import org.bukkit.Material; import java.util.List; @@ -29,7 +27,7 @@ public class FloraTemplate extends AbstractableTemplate { @Value("replaceable") @Abstractable @Default - private MaterialSet replaceable = MaterialSet.singleton(new BukkitMaterialData(Material.AIR)); + private MaterialSet replaceable = new MaterialSet(); @Value("irrigable") @Abstractable diff --git a/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/templates/OreTemplate.java rename to common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java diff --git a/src/main/java/com/dfsek/terra/config/templates/PaletteTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/PaletteTemplate.java similarity index 100% rename from src/main/java/com/dfsek/terra/config/templates/PaletteTemplate.java rename to common/src/main/java/com/dfsek/terra/config/templates/PaletteTemplate.java diff --git a/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java similarity index 81% rename from src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java rename to common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java index 281baa12d..52928dae2 100644 --- a/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java @@ -8,8 +8,6 @@ import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.structures.loot.LootTable; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.procgen.GridSpawn; -import com.dfsek.terra.structure.Structure; -import com.dfsek.terra.structure.features.Feature; import java.util.List; import java.util.Map; @@ -21,7 +19,7 @@ public class StructureTemplate extends AbstractableTemplate { @Value("files") @Abstractable - private ProbabilityCollection structures; + private ProbabilityCollection structures; @Value("spawn.start") @Abstractable @@ -42,7 +40,7 @@ public class StructureTemplate extends AbstractableTemplate { @Value("features") @Abstractable @Default - private List features = new GlueList<>(); + private List features = new GlueList<>(); public Map getLoot() { return loot; @@ -52,7 +50,7 @@ public class StructureTemplate extends AbstractableTemplate { return id; } - public ProbabilityCollection getStructures() { + public ProbabilityCollection getStructures() { return structures; } @@ -64,7 +62,7 @@ public class StructureTemplate extends AbstractableTemplate { return bound; } - public List getFeatures() { + public List getFeatures() { return features; } diff --git a/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java similarity index 84% rename from src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java rename to common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java index deef3ed5c..66651bb47 100644 --- a/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java @@ -4,14 +4,13 @@ import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.structure.Structure; import com.dfsek.terra.util.MaterialSet; @SuppressWarnings({"unused", "FieldMayBeFinal"}) public class TreeTemplate extends AbstractableTemplate { @Value("files") @Abstractable - private ProbabilityCollection structures; + private ProbabilityCollection structures; @Value("id") private String id; @@ -25,7 +24,7 @@ public class TreeTemplate extends AbstractableTemplate { @Abstractable private MaterialSet spawnable; - public ProbabilityCollection getStructures() { + public ProbabilityCollection getStructures() { return structures; } diff --git a/src/main/java/com/dfsek/terra/debug/Debug.java b/common/src/main/java/com/dfsek/terra/debug/Debug.java similarity index 100% rename from src/main/java/com/dfsek/terra/debug/Debug.java rename to common/src/main/java/com/dfsek/terra/debug/Debug.java diff --git a/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java b/common/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java similarity index 91% rename from src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java rename to common/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java index 3e3cdf559..c89a2eb43 100644 --- a/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java +++ b/common/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java @@ -1,6 +1,6 @@ package com.dfsek.terra.debug.gui; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.generic.TerraPlugin; import javax.swing.*; import java.awt.*; @@ -13,9 +13,9 @@ public class DebugFrame extends JFrame implements ActionListener { private final int x; private final int z; private final BufferedImage img; - private final TerraBukkitPlugin main; + private final TerraPlugin main; - public DebugFrame(BufferedImage image, String s, TerraBukkitPlugin main) { + public DebugFrame(BufferedImage image, String s, TerraPlugin main) { super(s); this.x = image.getWidth(); this.z = image.getHeight(); diff --git a/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java b/common/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java similarity index 82% rename from src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java rename to common/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java index 994ffac9d..c1e2e3144 100644 --- a/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java +++ b/common/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java @@ -1,6 +1,6 @@ package com.dfsek.terra.debug.gui; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.generic.TerraPlugin; import javax.swing.*; import java.awt.*; @@ -9,9 +9,9 @@ import java.awt.image.BufferedImage; public class DebugGUI extends Thread { private final BufferedImage img; - private final TerraBukkitPlugin main; + private final TerraPlugin main; - public DebugGUI(BufferedImage img, TerraBukkitPlugin main) { + public DebugGUI(BufferedImage img, TerraPlugin main) { this.img = img; this.main = main; } diff --git a/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java b/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java similarity index 100% rename from src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java rename to common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java diff --git a/src/main/java/com/dfsek/terra/generation/Sampler.java b/common/src/main/java/com/dfsek/terra/generation/Sampler.java similarity index 100% rename from src/main/java/com/dfsek/terra/generation/Sampler.java rename to common/src/main/java/com/dfsek/terra/generation/Sampler.java diff --git a/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java similarity index 100% rename from src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java rename to common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java diff --git a/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java b/common/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java similarity index 91% rename from src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java rename to common/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java index e3088f6de..15a59cb55 100644 --- a/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java +++ b/common/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java @@ -4,7 +4,6 @@ import com.dfsek.terra.api.gaea.biome.Decorator; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.world.Flora; -import org.bukkit.block.Biome; public class UserDefinedDecorator extends Decorator { @@ -36,11 +35,6 @@ public class UserDefinedDecorator extends Decorator { return false; } - @Override - public Biome getVanillaBiome() { - return null; - } - @Override public ProbabilityCollection getFlora() { return flora; diff --git a/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java b/common/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java similarity index 100% rename from src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java rename to common/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java diff --git a/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java similarity index 100% rename from src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java rename to common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java diff --git a/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java b/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java similarity index 100% rename from src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java rename to common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java diff --git a/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java similarity index 76% rename from src/main/java/com/dfsek/terra/generation/items/TerraStructure.java rename to common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java index 5ef80194d..31ea03cc2 100644 --- a/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java @@ -5,20 +5,19 @@ import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.structures.loot.LootTable; import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.procgen.GridSpawn; -import com.dfsek.terra.structure.Structure; import java.util.Map; // TODO: implementation public class TerraStructure { - private final ProbabilityCollection structures; + private final ProbabilityCollection structures; private final Range bound; private final Range spawnStart; private final GridSpawn spawn; private final Map loot; private final StructureTemplate template; - public TerraStructure(ProbabilityCollection structures, Range bound, Range spawnStart, GridSpawn spawn, Map loot, StructureTemplate template) { + public TerraStructure(ProbabilityCollection structures, Range bound, Range spawnStart, GridSpawn spawn, Map loot, StructureTemplate template) { this.structures = structures; this.bound = bound; this.spawnStart = spawnStart; @@ -31,7 +30,7 @@ public class TerraStructure { return template; } - public ProbabilityCollection getStructures() { + public ProbabilityCollection getStructures() { return structures; } diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java similarity index 100% rename from src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java rename to common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java similarity index 100% rename from src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java rename to common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java similarity index 100% rename from src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java rename to common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java diff --git a/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java similarity index 99% rename from src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java rename to common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java index 936e320c5..fb5e60ce8 100644 --- a/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java @@ -94,7 +94,7 @@ public class TerraFlora implements Flora { @Override public boolean plant(Location location) { - WorldHandle handle = main.getHandle(); + WorldHandle handle = main.getWorldHandle(); boolean doRotation = testRotation.size() > 0; int size = floraPalette.getSize(); diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java similarity index 97% rename from src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java rename to common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java index b02cea6d3..027b1e160 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java @@ -27,7 +27,7 @@ public class DeformedSphereOre extends Ore { @Override public void generate(Vector3 origin, Chunk c, Random r) { - WorldHandle handle = main.getHandle(); + WorldHandle handle = main.getWorldHandle(); FastNoiseLite ore = new FastNoiseLite(r.nextInt()); ore.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); ore.setFrequency(deformFrequency); diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java similarity index 100% rename from src/main/java/com/dfsek/terra/generation/items/ores/Ore.java rename to common/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java similarity index 100% rename from src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java rename to common/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java similarity index 100% rename from src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java rename to common/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java diff --git a/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java similarity index 98% rename from src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java rename to common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java index c030a8c06..defb508e4 100644 --- a/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java @@ -23,7 +23,7 @@ public class VanillaOre extends Ore { @Override public void generate(Vector3 location, Chunk chunk, Random random) { - WorldHandle handle = main.getHandle(); + WorldHandle handle = main.getWorldHandle(); double size = sizeRange.get(random); int centerX = location.getBlockX(); diff --git a/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java similarity index 80% rename from src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java rename to common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index f865b5d74..3176d3a6e 100644 --- a/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -2,24 +2,18 @@ package com.dfsek.terra.generation.items.tree; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.tree.Tree; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.generic.world.vector.Vector2; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; -import com.dfsek.terra.structure.Rotation; -import com.dfsek.terra.structure.Structure; -import com.dfsek.terra.structure.StructureContainedBlock; -import com.dfsek.terra.structure.StructureInfo; import com.dfsek.terra.util.MaterialSet; -import com.dfsek.terra.util.structure.RotationUtil; import java.util.Random; public class TerraTree implements Tree { private final MaterialSet spawnable; private final int yOffset; - private final ProbabilityCollection structure; + private final ProbabilityCollection structure; - public TerraTree(MaterialSet spawnable, int yOffset, ProbabilityCollection structure) { + public TerraTree(MaterialSet spawnable, int yOffset, ProbabilityCollection structure) { this.spawnable = spawnable; this.yOffset = yOffset; this.structure = structure; @@ -27,13 +21,16 @@ public class TerraTree implements Tree { @Override public boolean plant(Location location, Random random) { + /* Location mut = location.clone().subtract(0, yOffset, 0); if(!spawnable.contains(location.getBlock().getType())) return false; Structure struc = structure.get(random); Rotation rotation = Rotation.fromDegrees(random.nextInt(4) * 90); if(!struc.checkSpawns(mut, rotation, null)) return false; - struc.paste(mut, rotation, null); + struc.paste(mut, rotation, null);*/ return true; + + } @Override @@ -41,7 +38,8 @@ public class TerraTree implements Tree { return spawnable; } - public boolean plantBlockCheck(Location location, Random random, TerraBukkitPlugin main) { + public boolean plantBlockCheck(Location location, Random random, TerraPlugin main) { + /* Location mut = location.clone().subtract(0, yOffset, 0); if(!spawnable.contains(location.getBlock().getType())) return false; Structure struc = structure.get(random); @@ -61,6 +59,8 @@ public class TerraTree implements Tree { } } struc.paste(mut, rotation, main); + + */ return true; } } diff --git a/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java b/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java similarity index 79% rename from src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java rename to common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java index d247da2ed..29ddaa480 100644 --- a/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java @@ -4,7 +4,6 @@ import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.tree.Tree; -import com.dfsek.terra.api.gaea.tree.TreeType; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockFace; @@ -26,9 +25,7 @@ public class TreeLayer extends PlaceableLayer { for(int ignored : level) { current = current.getRelative(BlockFace.DOWN); if(item.getSpawnable().contains(current.getType())) { - if(item instanceof TreeType && current.getRelative(BlockFace.UP).isEmpty()) - item.plant(current.getLocation().add(0, 1, 0), random); - else if(!(item instanceof TreeType)) item.plant(current.getLocation(), random); + item.plant(current.getLocation().add(0, 1, 0), random); } } } diff --git a/src/main/java/com/dfsek/terra/image/ImageLoader.java b/common/src/main/java/com/dfsek/terra/image/ImageLoader.java similarity index 95% rename from src/main/java/com/dfsek/terra/image/ImageLoader.java rename to common/src/main/java/com/dfsek/terra/image/ImageLoader.java index 9328cc351..70a1757f6 100644 --- a/src/main/java/com/dfsek/terra/image/ImageLoader.java +++ b/common/src/main/java/com/dfsek/terra/image/ImageLoader.java @@ -1,8 +1,8 @@ package com.dfsek.terra.image; import com.dfsek.terra.api.gaea.biome.NormalizationUtil; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.debug.gui.DebugGUI; @@ -24,7 +24,7 @@ public class ImageLoader { this.align = align; } - public static void debugWorld(boolean genStep, World w, TerraBukkitPlugin main) { + public static void debugWorld(boolean genStep, World w, TerraPlugin main) { if(!main.isDebug()) return; BufferedImage newImg = new WorldImageGenerator(w, 1024, 1024, main).drawWorld(0, 0).getDraw(); if(genStep) newImg = redrawStepped(newImg, w, Align.CENTER, main); @@ -32,7 +32,7 @@ public class ImageLoader { debugGUI.start(); } - private static BufferedImage redrawStepped(BufferedImage original, World w, Align align, TerraBukkitPlugin main) { + private static BufferedImage redrawStepped(BufferedImage original, World w, Align align, TerraPlugin main) { BufferedImage newImg = copyImage(original); TerraBiomeGrid tb = main.getWorld(w).getGrid(); BiomeZone z = main.getWorld(w).getZone(); @@ -59,7 +59,7 @@ public class ImageLoader { return b; } - public void debug(boolean genStep, World w, TerraBukkitPlugin main) { + public void debug(boolean genStep, World w, TerraPlugin main) { if(!main.isDebug()) return; BufferedImage newImg = copyImage(image); if(genStep) { diff --git a/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java b/common/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java similarity index 92% rename from src/main/java/com/dfsek/terra/image/WorldImageGenerator.java rename to common/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java index 9fb3364bc..9c06ba049 100644 --- a/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java +++ b/common/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java @@ -2,8 +2,8 @@ package com.dfsek.terra.image; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.gaea.biome.NormalizationUtil; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import javax.imageio.ImageIO; @@ -15,9 +15,9 @@ import java.io.IOException; public class WorldImageGenerator { private final World w; private final BufferedImage draw; - private final TerraBukkitPlugin main; + private final TerraPlugin main; - public WorldImageGenerator(World w, int width, int height, TerraBukkitPlugin main) { + public WorldImageGenerator(World w, int width, int height, TerraPlugin main) { draw = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); this.w = w; this.main = main; diff --git a/src/main/java/com/dfsek/terra/math/BlankFunction.java b/common/src/main/java/com/dfsek/terra/math/BlankFunction.java similarity index 100% rename from src/main/java/com/dfsek/terra/math/BlankFunction.java rename to common/src/main/java/com/dfsek/terra/math/BlankFunction.java diff --git a/src/main/java/com/dfsek/terra/math/MathUtil.java b/common/src/main/java/com/dfsek/terra/math/MathUtil.java similarity index 100% rename from src/main/java/com/dfsek/terra/math/MathUtil.java rename to common/src/main/java/com/dfsek/terra/math/MathUtil.java diff --git a/src/main/java/com/dfsek/terra/math/NoiseFunction.java b/common/src/main/java/com/dfsek/terra/math/NoiseFunction.java similarity index 100% rename from src/main/java/com/dfsek/terra/math/NoiseFunction.java rename to common/src/main/java/com/dfsek/terra/math/NoiseFunction.java diff --git a/src/main/java/com/dfsek/terra/math/NoiseFunction2.java b/common/src/main/java/com/dfsek/terra/math/NoiseFunction2.java similarity index 100% rename from src/main/java/com/dfsek/terra/math/NoiseFunction2.java rename to common/src/main/java/com/dfsek/terra/math/NoiseFunction2.java diff --git a/src/main/java/com/dfsek/terra/math/NoiseFunction3.java b/common/src/main/java/com/dfsek/terra/math/NoiseFunction3.java similarity index 100% rename from src/main/java/com/dfsek/terra/math/NoiseFunction3.java rename to common/src/main/java/com/dfsek/terra/math/NoiseFunction3.java diff --git a/src/main/java/com/dfsek/terra/math/RandomFunction.java b/common/src/main/java/com/dfsek/terra/math/RandomFunction.java similarity index 100% rename from src/main/java/com/dfsek/terra/math/RandomFunction.java rename to common/src/main/java/com/dfsek/terra/math/RandomFunction.java diff --git a/src/main/java/com/dfsek/terra/population/CavePopulator.java b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java similarity index 98% rename from src/main/java/com/dfsek/terra/population/CavePopulator.java rename to common/src/main/java/com/dfsek/terra/population/CavePopulator.java index 7ecbb3cb8..fc2403c38 100644 --- a/src/main/java/com/dfsek/terra/population/CavePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java @@ -25,7 +25,7 @@ public class CavePopulator implements TerraBlockPopulator { public void populate(@NotNull World world, @NotNull Random r, @NotNull Chunk chunk) { /* TerraWorld tw = main.getWorld(world); - WorldHandle handle = main.getHandle(); + WorldHandle handle = main.getWorldHandle(); try(ProfileFuture ignored = tw.getProfiler().measure("CaveTime")) { Random random = PopulationUtil.getRandom(chunk); if(!tw.isSafe()) return; diff --git a/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java similarity index 100% rename from src/main/java/com/dfsek/terra/population/FloraPopulator.java rename to common/src/main/java/com/dfsek/terra/population/FloraPopulator.java diff --git a/src/main/java/com/dfsek/terra/population/OrePopulator.java b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java similarity index 100% rename from src/main/java/com/dfsek/terra/population/OrePopulator.java rename to common/src/main/java/com/dfsek/terra/population/OrePopulator.java diff --git a/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java similarity index 100% rename from src/main/java/com/dfsek/terra/population/StructurePopulator.java rename to common/src/main/java/com/dfsek/terra/population/StructurePopulator.java diff --git a/src/main/java/com/dfsek/terra/population/TreePopulator.java b/common/src/main/java/com/dfsek/terra/population/TreePopulator.java similarity index 100% rename from src/main/java/com/dfsek/terra/population/TreePopulator.java rename to common/src/main/java/com/dfsek/terra/population/TreePopulator.java diff --git a/src/main/java/com/dfsek/terra/procgen/GridSpawn.java b/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java similarity index 100% rename from src/main/java/com/dfsek/terra/procgen/GridSpawn.java rename to common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java diff --git a/src/main/java/com/dfsek/terra/procgen/pixel/Distribution.java b/common/src/main/java/com/dfsek/terra/procgen/pixel/Distribution.java similarity index 100% rename from src/main/java/com/dfsek/terra/procgen/pixel/Distribution.java rename to common/src/main/java/com/dfsek/terra/procgen/pixel/Distribution.java diff --git a/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java b/common/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java similarity index 100% rename from src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java rename to common/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java diff --git a/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java b/common/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java similarity index 100% rename from src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java rename to common/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java new file mode 100644 index 000000000..3ba238ac6 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.procgen.voxel; + + +import com.dfsek.terra.api.generic.world.vector.Vector3; + +public class Cylinder extends VoxelGeometry { + public Cylinder(Vector3 start, int rad, int height) { + + } +} diff --git a/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java similarity index 71% rename from src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java rename to common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java index 5e94f5326..6236594d5 100644 --- a/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java @@ -1,14 +1,14 @@ package com.dfsek.terra.procgen.voxel; import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import org.bukkit.util.Vector; +import com.dfsek.terra.api.generic.world.vector.Vector3; public class DeformedSphere extends VoxelGeometry { - public DeformedSphere(Vector start, int rad, double deform, FastNoiseLite noise) { + public DeformedSphere(Vector3 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++) { - Vector c = new Vector(x, y, z); + Vector3 c = new Vector3(x, y, z); if(c.length() < (rad + 0.5) * ((noise.getNoise(x, y, z) + 1) * deform)) { addVector(c.add(start)); } diff --git a/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java similarity index 71% rename from src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java rename to common/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java index 8ed97dec7..f1ed10b19 100644 --- a/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java @@ -1,13 +1,13 @@ package com.dfsek.terra.procgen.voxel; -import org.bukkit.util.Vector; +import com.dfsek.terra.api.generic.world.vector.Vector3; public class Sphere extends VoxelGeometry { - public Sphere(Vector start, int rad) { + public Sphere(Vector3 start, int rad) { 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); + Vector3 c = new Vector3(x, y, z); if(c.length() < rad + 0.5) { addVector(c.add(start)); } diff --git a/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java similarity index 54% rename from src/main/java/com/dfsek/terra/procgen/voxel/Tube.java rename to common/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java index 4fd131c1d..75a528d68 100644 --- a/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java @@ -1,11 +1,11 @@ package com.dfsek.terra.procgen.voxel; -import org.bukkit.util.Vector; +import com.dfsek.terra.api.generic.world.vector.Vector3; public class Tube extends VoxelGeometry { - public Tube(Vector start, Vector end, int radius) { - Vector step = start.clone().subtract(end).normalize(); - Vector run = start.clone(); + public Tube(Vector3 start, Vector3 end, int radius) { + Vector3 step = start.clone().subtract(end).normalize(); + Vector3 run = start.clone(); int steps = (int) start.distance(end); for(int i = 0; i < steps; i++) { merge(new Sphere(run, radius)); diff --git a/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java similarity index 67% rename from src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java rename to common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java index ded1dab11..3e186cab4 100644 --- a/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java @@ -1,23 +1,23 @@ package com.dfsek.terra.procgen.voxel; import com.dfsek.terra.api.gaea.util.GlueList; -import org.bukkit.util.Vector; +import com.dfsek.terra.api.generic.world.vector.Vector3; import java.util.List; public abstract class VoxelGeometry { - private final List geometry = new GlueList<>(); + private final List geometry = new GlueList<>(); public static VoxelGeometry getBlank() { return new VoxelGeometry() { }; } - public List getGeometry() { + public List getGeometry() { return geometry; } - protected void addVector(Vector v) { + protected void addVector(Vector3 v) { geometry.add(v); } diff --git a/src/main/java/com/dfsek/terra/registry/BiomeGridRegistry.java b/common/src/main/java/com/dfsek/terra/registry/BiomeGridRegistry.java similarity index 100% rename from src/main/java/com/dfsek/terra/registry/BiomeGridRegistry.java rename to common/src/main/java/com/dfsek/terra/registry/BiomeGridRegistry.java diff --git a/src/main/java/com/dfsek/terra/registry/BiomeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/BiomeRegistry.java similarity index 100% rename from src/main/java/com/dfsek/terra/registry/BiomeRegistry.java rename to common/src/main/java/com/dfsek/terra/registry/BiomeRegistry.java diff --git a/src/main/java/com/dfsek/terra/registry/CarverRegistry.java b/common/src/main/java/com/dfsek/terra/registry/CarverRegistry.java similarity index 100% rename from src/main/java/com/dfsek/terra/registry/CarverRegistry.java rename to common/src/main/java/com/dfsek/terra/registry/CarverRegistry.java diff --git a/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java b/common/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java similarity index 80% rename from src/main/java/com/dfsek/terra/registry/ConfigRegistry.java rename to common/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java index acb56beb4..626e697f9 100644 --- a/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.registry; import com.dfsek.tectonic.exception.ConfigException; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.debug.Debug; @@ -13,12 +13,12 @@ import java.util.zip.ZipFile; * Class to hold config packs */ public class ConfigRegistry extends TerraRegistry { - public void load(File folder, TerraBukkitPlugin main) throws ConfigException { + public void load(File folder, TerraPlugin main) throws ConfigException { ConfigPack pack = new ConfigPack(folder, main); add(pack.getTemplate().getID(), pack); } - public boolean loadAll(TerraBukkitPlugin main) { + public boolean loadAll(TerraPlugin main) { boolean valid = true; File packsFolder = new File(main.getDataFolder(), "packs"); for(File dir : packsFolder.listFiles(File::isDirectory)) { @@ -29,7 +29,7 @@ public class ConfigRegistry extends TerraRegistry { valid = false; } } - for(File zip : packsFolder.listFiles(file -> file.getName().endsWith(".zip") || file.getName().endsWith(".jar") || file.getName().endsWith(".terra"))) { + for(File zip : packsFolder.listFiles(file -> file.getName().endsWith(".zip") || file.getName().endsWith(".jar") || file.getName().endsWith(".com.dfsek.terra"))) { try { Debug.info("Loading ZIP archive: " + zip.getName()); load(new ZipFile(zip), main); @@ -41,7 +41,7 @@ public class ConfigRegistry extends TerraRegistry { return valid; } - public void load(ZipFile file, TerraBukkitPlugin main) throws ConfigException { + public void load(ZipFile file, TerraPlugin main) throws ConfigException { ConfigPack pack = new ConfigPack(file, main); add(pack.getTemplate().getID(), pack); } diff --git a/src/main/java/com/dfsek/terra/registry/FloraRegistry.java b/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java similarity index 97% rename from src/main/java/com/dfsek/terra/registry/FloraRegistry.java rename to common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java index 64c09a11d..35ac8d916 100644 --- a/src/main/java/com/dfsek/terra/registry/FloraRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java @@ -51,7 +51,7 @@ public class FloraRegistry extends TerraRegistry { } private MaterialData create(String s) { - return main.getHandle().createMaterialData(s); + return main.getWorldHandle().createMaterialData(s); } private void addItem(String id, ConstantFlora flora) { @@ -63,7 +63,7 @@ public class FloraRegistry extends TerraRegistry { } private BlockData data(String s) { - return main.getHandle().createBlockData(s); + return main.getWorldHandle().createBlockData(s); } diff --git a/src/main/java/com/dfsek/terra/registry/OreRegistry.java b/common/src/main/java/com/dfsek/terra/registry/OreRegistry.java similarity index 100% rename from src/main/java/com/dfsek/terra/registry/OreRegistry.java rename to common/src/main/java/com/dfsek/terra/registry/OreRegistry.java diff --git a/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java b/common/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java similarity index 57% rename from src/main/java/com/dfsek/terra/registry/PaletteRegistry.java rename to common/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java index 52e43aaeb..0e620dcd4 100644 --- a/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java @@ -1,16 +1,21 @@ package com.dfsek.terra.registry; import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.biome.palette.SinglePalette; -import org.bukkit.Bukkit; public class PaletteRegistry extends TerraRegistry> { + private final TerraPlugin main; + public PaletteRegistry(TerraPlugin main) { + this.main = main; + } + + @Override public Palette get(String id) { if(id.startsWith("BLOCK:")) - return new SinglePalette<>(new BukkitBlockData(Bukkit.createBlockData(id.substring(6)))); // Return single palette for BLOCK: shortcut. + return new SinglePalette<>(main.getWorldHandle().createBlockData(id.substring(6))); // Return single palette for BLOCK: shortcut. return super.get(id); } } diff --git a/src/main/java/com/dfsek/terra/registry/StructureRegistry.java b/common/src/main/java/com/dfsek/terra/registry/StructureRegistry.java similarity index 100% rename from src/main/java/com/dfsek/terra/registry/StructureRegistry.java rename to common/src/main/java/com/dfsek/terra/registry/StructureRegistry.java diff --git a/src/main/java/com/dfsek/terra/registry/TerraRegistry.java b/common/src/main/java/com/dfsek/terra/registry/TerraRegistry.java similarity index 100% rename from src/main/java/com/dfsek/terra/registry/TerraRegistry.java rename to common/src/main/java/com/dfsek/terra/registry/TerraRegistry.java diff --git a/src/main/java/com/dfsek/terra/registry/TreeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java similarity index 52% rename from src/main/java/com/dfsek/terra/registry/TreeRegistry.java rename to common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java index 3a97e81b6..93e7c4dbd 100644 --- a/src/main/java/com/dfsek/terra/registry/TreeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java @@ -1,10 +1,9 @@ package com.dfsek.terra.registry; import com.dfsek.terra.api.gaea.tree.Tree; -import com.dfsek.terra.api.gaea.tree.TreeType; public class TreeRegistry extends TerraRegistry { public TreeRegistry() { - for(TreeType t : TreeType.values()) add(t.toString(), t); // Populate registry with default trees. + } } diff --git a/src/main/java/com/dfsek/terra/structure/Rotation.java b/common/src/main/java/com/dfsek/terra/structure/Rotation.java similarity index 99% rename from src/main/java/com/dfsek/terra/structure/Rotation.java rename to common/src/main/java/com/dfsek/terra/structure/Rotation.java index e9aac096e..63d910b03 100644 --- a/src/main/java/com/dfsek/terra/structure/Rotation.java +++ b/common/src/main/java/com/dfsek/terra/structure/Rotation.java @@ -3,6 +3,7 @@ package com.dfsek.terra.structure; import net.jafama.FastMath; public enum Rotation { + CW_90(90), CW_180(180), CCW_90(270), NONE(0); private final int degrees; diff --git a/src/main/java/com/dfsek/terra/util/MaterialSet.java b/common/src/main/java/com/dfsek/terra/util/MaterialSet.java similarity index 100% rename from src/main/java/com/dfsek/terra/util/MaterialSet.java rename to common/src/main/java/com/dfsek/terra/util/MaterialSet.java diff --git a/src/main/java/com/dfsek/terra/util/PaletteUtil.java b/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java similarity index 100% rename from src/main/java/com/dfsek/terra/util/PaletteUtil.java rename to common/src/main/java/com/dfsek/terra/util/PaletteUtil.java diff --git a/src/main/java/com/dfsek/terra/util/PopulationUtil.java b/common/src/main/java/com/dfsek/terra/util/PopulationUtil.java similarity index 87% rename from src/main/java/com/dfsek/terra/util/PopulationUtil.java rename to common/src/main/java/com/dfsek/terra/util/PopulationUtil.java index 3365397cd..3c47c7d52 100644 --- a/src/main/java/com/dfsek/terra/util/PopulationUtil.java +++ b/common/src/main/java/com/dfsek/terra/util/PopulationUtil.java @@ -2,7 +2,7 @@ package com.dfsek.terra.util; import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.util.FastRandom; -import org.bukkit.Chunk; +import com.dfsek.terra.api.generic.world.Chunk; public final class PopulationUtil { public static FastRandom getRandom(Chunk c) { diff --git a/src/main/java/com/dfsek/terra/util/SlabUtil.java b/common/src/main/java/com/dfsek/terra/util/SlabUtil.java similarity index 100% rename from src/main/java/com/dfsek/terra/util/SlabUtil.java rename to common/src/main/java/com/dfsek/terra/util/SlabUtil.java diff --git a/src/main/java/com/dfsek/terra/util/TagUtil.java b/common/src/main/java/com/dfsek/terra/util/TagUtil.java similarity index 96% rename from src/main/java/com/dfsek/terra/util/TagUtil.java rename to common/src/main/java/com/dfsek/terra/util/TagUtil.java index e05cb67e7..9e96b04e0 100644 --- a/src/main/java/com/dfsek/terra/util/TagUtil.java +++ b/common/src/main/java/com/dfsek/terra/util/TagUtil.java @@ -53,8 +53,8 @@ public final class TagUtil { || name.equals("pane") || !m.isSolid()) snow.add(m); } - tagMap.put("terra:snow_blacklist", snow); - tagMap.put("terra:solid", solid); + tagMap.put("com.dfsek.terra:snow_blacklist", snow); + tagMap.put("com.dfsek.terra:solid", solid); Debug.info("Added " + snow.size() + " materials to snow blacklist"); Debug.info("Added " + solid.size() + " materials to solid list"); Debug.info("Loaded " + tagMap.size() + " tags."); diff --git a/src/main/java/com/dfsek/terra/util/hash/HashIntrinsic.java b/common/src/main/java/com/dfsek/terra/util/hash/HashIntrinsic.java similarity index 100% rename from src/main/java/com/dfsek/terra/util/hash/HashIntrinsic.java rename to common/src/main/java/com/dfsek/terra/util/hash/HashIntrinsic.java diff --git a/src/main/java/com/dfsek/terra/util/hash/HashMapDoubleDouble.java b/common/src/main/java/com/dfsek/terra/util/hash/HashMapDoubleDouble.java similarity index 100% rename from src/main/java/com/dfsek/terra/util/hash/HashMapDoubleDouble.java rename to common/src/main/java/com/dfsek/terra/util/hash/HashMapDoubleDouble.java diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts new file mode 100644 index 000000000..b9a051d8b --- /dev/null +++ b/platforms/bukkit/build.gradle.kts @@ -0,0 +1,64 @@ +plugins { + java + maven + idea + id("com.github.johnrengelman.shadow") +} + +group = "com.dfsek.terra.bukkit" + +repositories { + mavenCentral() + maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") } + maven { url = uri("http://maven.enginehub.org/repo/") } + maven { url = uri("https://repo.codemc.org/repository/maven-public") } + maven { url = uri("https://papermc.io/repo/repository/maven-public/") } +} + +dependencies { + testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0") + implementation(project(":common")) + implementation("org.apache.commons:commons-rng-core:1.3") + + compileOnly("org.spigotmc:spigot-api:1.16.2-R0.1-SNAPSHOT") + implementation("io.papermc:paperlib:1.0.5") + + implementation("com.scireum:parsii:1.2.1") + implementation("com.dfsek:Tectonic:1.0.3") + implementation("net.jafama:jafama:2.3.2") + + compileOnly("com.googlecode.json-simple:json-simple:1.1") + + implementation("com.google.guava:guava:30.0-jre") + implementation("org.bstats:bstats-bukkit:1.7") + + compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.0-SNAPSHOT") + + compileOnly("org.jetbrains:annotations:20.1.0") + +} + +tasks.withType { + include("**/*.yml") + filter( + "tokens" to mapOf( + "VERSION" to project.version.toString() + ) + ) +} + +tasks.named("shadowJar") { + + archiveClassifier.set("") + archiveBaseName.set("Terra") + setVersion(project.version) + relocate("org.apache.commons", "com.dfsek.terra.lib.commons") + relocate("org.bstats.bukkit", "com.dfsek.terra.lib.bstats") + relocate("parsii", "com.dfsek.terra.lib.parsii") + relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") + relocate("net.jafama", "com.dfsek.terra.lib.jafama") + relocate("com.dfsek.tectonic", "com.dfsek.terra.lib.tectonic") + relocate("net.jafama", "com.dfsek.terra.lib.jafama") + minimize() +} \ No newline at end of file diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitBiomeGrid.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitBiomeGrid.java similarity index 89% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitBiomeGrid.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitBiomeGrid.java index 7f637ec62..f68c67b4b 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitBiomeGrid.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitBiomeGrid.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.api.implementations.bukkit; +package com.dfsek.terra.bukkit; import com.dfsek.terra.api.generic.world.Biome; import com.dfsek.terra.api.generic.world.BiomeGrid; -import com.dfsek.terra.api.implementations.bukkit.world.BukkitBiome; +import com.dfsek.terra.bukkit.world.BukkitBiome; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitChunk.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitChunk.java similarity index 86% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitChunk.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitChunk.java index 94a9f8f61..11cbc6832 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitChunk.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitChunk.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.api.implementations.bukkit; +package com.dfsek.terra.bukkit; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlock; +import com.dfsek.terra.bukkit.world.block.BukkitBlock; public class BukkitChunk implements Chunk { private final org.bukkit.Chunk delegate; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java new file mode 100644 index 000000000..71c1aed3b --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.bukkit; + +import com.dfsek.terra.api.generic.CommandSender; +import org.bukkit.ChatColor; + +public class BukkitCommandSender implements CommandSender { + private final org.bukkit.command.CommandSender delegate; + + public BukkitCommandSender(org.bukkit.command.CommandSender delegate) { + this.delegate = delegate; + } + + @Override + public void sendMessage(String message) { + delegate.sendMessage(ChatColor.translateAlternateColorCodes('&', message)); + } + + @Override + public org.bukkit.command.CommandSender getHandle() { + return delegate; + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java new file mode 100644 index 000000000..c600c474e --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.bukkit; + +import com.dfsek.terra.api.generic.Entity; + +public class BukkitEntity implements Entity { + private final org.bukkit.entity.Entity entity; + + public BukkitEntity(org.bukkit.entity.Entity entity) { + this.entity = entity; + } + + @Override + public org.bukkit.entity.Entity getHandle() { + return entity; + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java new file mode 100644 index 000000000..a29c92528 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.bukkit; + +import com.dfsek.terra.api.generic.inventory.ItemHandle; +import com.dfsek.terra.api.generic.inventory.ItemStack; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; + +public class BukkitItemHandle implements ItemHandle { + @Override + public ItemStack newItemStack(MaterialData material, int amount) { + return new BukkitItemStack(new org.bukkit.inventory.ItemStack(((BukkitMaterialData) material).getHandle(), amount)); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemMeta.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemMeta.java new file mode 100644 index 000000000..519beb3cb --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemMeta.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.bukkit; + +import com.dfsek.terra.api.generic.inventory.item.ItemMeta; + +public class BukkitItemMeta implements ItemMeta { + private final org.bukkit.inventory.meta.ItemMeta delegate; + + public BukkitItemMeta(org.bukkit.inventory.meta.ItemMeta delegate) { + this.delegate = delegate; + } + + @Override + public org.bukkit.inventory.meta.ItemMeta getHandle() { + return delegate; + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java new file mode 100644 index 000000000..8c0ce2a33 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java @@ -0,0 +1,56 @@ +package com.dfsek.terra.bukkit; + +import com.dfsek.terra.api.generic.inventory.ItemStack; +import com.dfsek.terra.api.generic.inventory.item.ItemMeta; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; + +public class BukkitItemStack implements ItemStack { + protected org.bukkit.inventory.ItemStack delegate; + + public BukkitItemStack(org.bukkit.inventory.ItemStack delegate) { + this.delegate = delegate; + } + + @Override + public int getAmount() { + return delegate.getAmount(); + } + + @Override + public void setAmount(int i) { + delegate.setAmount(i); + } + + @Override + public MaterialData getType() { + return new BukkitMaterialData(delegate.getType()); + } + + @Override + public ItemStack clone() { + BukkitItemStack clone; + try { + clone = (BukkitItemStack) super.clone(); + clone.delegate = delegate.clone(); + } catch(CloneNotSupportedException e) { + throw new Error(e); + } + return clone; + } + + @Override + public ItemMeta getItemMeta() { + return new BukkitItemMeta(delegate.getItemMeta()); + } + + @Override + public void setItemMeta(ItemMeta meta) { + delegate.setItemMeta(((BukkitItemMeta) meta).getHandle()); + } + + @Override + public org.bukkit.inventory.ItemStack getHandle() { + return delegate; + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java new file mode 100644 index 000000000..ae419c4b0 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java @@ -0,0 +1,23 @@ +package com.dfsek.terra.bukkit; + +import com.dfsek.terra.api.Player; +import com.dfsek.terra.api.generic.world.vector.Location; + +public class BukkitPlayer implements Player { + private final org.bukkit.entity.Player delegate; + + public BukkitPlayer(org.bukkit.entity.Player delegate) { + this.delegate = delegate; + } + + @Override + public org.bukkit.entity.Player getHandle() { + return delegate; + } + + @Override + public Location getLocation() { + org.bukkit.Location bukkit = delegate.getLocation(); + return new Location(new BukkitWorld(bukkit.getWorld()), bukkit.getX(), bukkit.getY(), bukkit.getZ()); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java new file mode 100644 index 000000000..b931c904f --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.bukkit; + +import com.dfsek.terra.api.generic.Tree; +import org.bukkit.TreeType; + +public class BukkitTree implements Tree { + private final TreeType delegate; + + public BukkitTree(TreeType delegate) { + this.delegate = delegate; + } + + @Override + public TreeType getHandle() { + return delegate; + } +} diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorld.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorld.java similarity index 73% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorld.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorld.java index ef51bbeea..f6cfd8765 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorld.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorld.java @@ -1,15 +1,13 @@ -package com.dfsek.terra.api.implementations.bukkit; +package com.dfsek.terra.bukkit; +import com.dfsek.terra.api.generic.Tree; import com.dfsek.terra.api.generic.generator.ChunkGenerator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.implementations.bukkit.generator.BukkitChunkGenerator; -import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlock; -import org.bukkit.TreeType; -import org.bukkit.entity.Entity; -import org.bukkit.util.Consumer; +import com.dfsek.terra.bukkit.generator.BukkitChunkGenerator; +import com.dfsek.terra.bukkit.world.block.BukkitBlock; import java.io.File; import java.util.UUID; @@ -72,13 +70,12 @@ public class BukkitWorld implements World { } @Override - public boolean generateTree(Location l, TreeType vanillaTreeType) { - return delegate.generateTree(new org.bukkit.Location(((BukkitWorld) l.getWorld()).getHandle(), l.getX(), l.getY(), l.getZ()), vanillaTreeType); + public boolean generateTree(Location l, Tree vanillaTreeType) { + return delegate.generateTree(new org.bukkit.Location(delegate, l.getX(), l.getY(), l.getZ()), ((BukkitTree) vanillaTreeType).getHandle()); } @Override - public void spawn(Location l, Class entity, Consumer consumer) { - delegate.spawn(new org.bukkit.Location(((BukkitWorld) l.getWorld()).getHandle(), l.getX(), l.getY(), l.getZ()), entity, consumer); + public void spawn(Location l, Class entity, java.util.function.Consumer consumer) { } @Override diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java similarity index 77% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorldHandle.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java index f0285167b..67f155368 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java @@ -1,14 +1,14 @@ -package com.dfsek.terra.api.implementations.bukkit; +package com.dfsek.terra.bukkit; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.generic.world.block.data.Waterlogged; -import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; -import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitMaterialData; -import com.dfsek.terra.api.implementations.bukkit.world.block.data.BukkitStairs; -import com.dfsek.terra.api.implementations.bukkit.world.block.data.BukkitWaterlogged; +import com.dfsek.terra.bukkit.world.block.BukkitBlockData; +import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; +import com.dfsek.terra.bukkit.world.block.data.BukkitStairs; +import com.dfsek.terra.bukkit.world.block.data.BukkitWaterlogged; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.type.Stairs; diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java similarity index 88% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/TerraBukkitPlugin.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 638269366..53d4aed51 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -1,35 +1,36 @@ -package com.dfsek.terra.api.implementations.bukkit; +package com.dfsek.terra.bukkit; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.GenericLoaders; -import com.dfsek.terra.api.gaea.GaeaPlugin; import com.dfsek.terra.api.gaea.lang.Language; import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.inventory.ItemHandle; import com.dfsek.terra.api.generic.world.Biome; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.implementations.bukkit.generator.BukkitChunkGenerator; -import com.dfsek.terra.api.implementations.bukkit.generator.BukkitChunkGeneratorWrapper; -import com.dfsek.terra.api.implementations.bukkit.world.BukkitBiome; -import com.dfsek.terra.command.TerraCommand; -import com.dfsek.terra.command.structure.LocateCommand; +import com.dfsek.terra.bukkit.command.command.TerraCommand; +import com.dfsek.terra.bukkit.command.command.structure.LocateCommand; +import com.dfsek.terra.bukkit.generator.BukkitChunkGenerator; +import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; +import com.dfsek.terra.bukkit.listeners.EventListener; +import com.dfsek.terra.bukkit.listeners.SpigotListener; +import com.dfsek.terra.bukkit.util.PaperUtil; +import com.dfsek.terra.bukkit.world.BukkitBiome; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.PluginConfig; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.TerraChunkGenerator; -import com.dfsek.terra.listeners.EventListener; -import com.dfsek.terra.listeners.SpigotListener; import com.dfsek.terra.registry.ConfigRegistry; -import com.dfsek.terra.util.PaperUtil; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.command.PluginCommand; import org.bukkit.entity.EntityType; import org.bukkit.generator.ChunkGenerator; +import org.bukkit.plugin.java.JavaPlugin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -38,7 +39,7 @@ import java.util.Map; import java.util.Objects; -public class TerraBukkitPlugin extends GaeaPlugin implements TerraPlugin { +public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { private final Map generatorMap = new HashMap<>(); private final Map worldMap = new HashMap<>(); private final Map worlds = new HashMap<>(); @@ -47,6 +48,7 @@ public class TerraBukkitPlugin extends GaeaPlugin implements TerraPlugin { private WorldHandle handle = new BukkitWorldHandle(); private final GenericLoaders genericLoaders = new GenericLoaders(this); + public void reload() { Map newMap = new HashMap<>(); worldMap.forEach((world, tw) -> { @@ -57,6 +59,11 @@ public class TerraBukkitPlugin extends GaeaPlugin implements TerraPlugin { worldMap.putAll(newMap); } + @Override + public ItemHandle getItemHandle() { + return null; + } + public void setHandle(WorldHandle handle) { getLogger().warning("|-------------------------------------------------------|"); getLogger().warning("A third-party addon has injected a custom WorldHandle!"); @@ -148,10 +155,11 @@ public class TerraBukkitPlugin extends GaeaPlugin implements TerraPlugin { } @Override - public WorldHandle getHandle() { + public WorldHandle getWorldHandle() { return handle; } + @Override public void register(TypeRegistry registry) { registry diff --git a/src/main/java/com/dfsek/terra/api/gaea/command/Command.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/Command.java similarity index 80% rename from src/main/java/com/dfsek/terra/api/gaea/command/Command.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/Command.java index b9d831fd3..77abc1cda 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/command/Command.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/Command.java @@ -1,6 +1,7 @@ -package com.dfsek.terra.api.gaea.command; +package com.dfsek.terra.bukkit.command; -import com.dfsek.terra.api.gaea.GaeaPlugin; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.bukkit.BukkitCommandSender; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; @@ -15,15 +16,15 @@ import java.util.List; * Represents a command or subcommand, can be nested via getSubCommands. */ public abstract class Command implements CommandExecutor, TabCompleter { - private final GaeaPlugin main; - public Command(GaeaPlugin main) { + private final TerraPlugin main; + public Command(TerraPlugin main) { this.main = main; } - public Command(com.dfsek.terra.api.gaea.command.Command parent) { + public Command(Command parent) { main = parent.getMain(); } - public GaeaPlugin getMain() { + public TerraPlugin getMain() { return main; } @@ -37,7 +38,7 @@ public abstract class Command implements CommandExecutor, TabCompleter { * Gets a list of subcommands * @return List of subcommands */ - public abstract List getSubCommands(); + public abstract List getSubCommands(); /** * Executes the given command, returning its success. @@ -74,23 +75,23 @@ public abstract class Command implements CommandExecutor, TabCompleter { @Override public final boolean onCommand(@NotNull CommandSender sender, @NotNull org.bukkit.command.Command command, @NotNull String label, @NotNull String[] args) { if(this instanceof DebugCommand && ! main.isDebug()) { - main.getLanguage().send("command.debug-only", sender); + main.getLanguage().send("command.debug-only", new BukkitCommandSender(sender)); return true; } if(args.length > 0) { - for(com.dfsek.terra.api.gaea.command.Command c : getSubCommands()) { + for(Command c : getSubCommands()) { if(c.getName().equals(args[0])) { return c.onCommand(sender, command, label, Arrays.stream(args, 1, args.length).toArray(String[]::new)); } } if(args.length != arguments()) { - main.getLanguage().send("command.invalid", sender, String.valueOf(arguments()), String.valueOf(args.length)); + main.getLanguage().send("command.invalid", new BukkitCommandSender(sender), String.valueOf(arguments()), String.valueOf(args.length)); return true; } return execute(sender, command, label, args); } if(args.length != arguments()) { - main.getLanguage().send("command.invalid", sender, String.valueOf(arguments()), String.valueOf(args.length)); + main.getLanguage().send("command.invalid", new BukkitCommandSender(sender), String.valueOf(arguments()), String.valueOf(args.length)); return true; } return execute(sender, command, label, new String[] {}); @@ -101,7 +102,7 @@ public abstract class Command implements CommandExecutor, TabCompleter { @Override public final @Nullable List onTabComplete(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String alias, @NotNull String[] args) { List complete = new ArrayList<>(); - if(args.length > 0) for(com.dfsek.terra.api.gaea.command.Command c : getSubCommands()) { + if(args.length > 0) for(Command c : getSubCommands()) { if(c.getName().startsWith(args[0])) complete.add(c.getName()); if(c.getName().equals(args[0])) return c.onTabComplete(sender, command, alias, Arrays.stream(args, 1, args.length).toArray(String[]::new)); } diff --git a/src/main/java/com/dfsek/terra/api/gaea/command/DebugCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/DebugCommand.java similarity index 86% rename from src/main/java/com/dfsek/terra/api/gaea/command/DebugCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/DebugCommand.java index 5364a3cff..738dde4fc 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/command/DebugCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/DebugCommand.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.command; +package com.dfsek.terra.bukkit.command; /** * Implementing this interface marks a command as debug-only. diff --git a/src/main/java/com/dfsek/terra/api/gaea/command/PlayerCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/PlayerCommand.java similarity index 93% rename from src/main/java/com/dfsek/terra/api/gaea/command/PlayerCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/PlayerCommand.java index 608f46725..4f19eb741 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/command/PlayerCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/PlayerCommand.java @@ -1,5 +1,6 @@ -package com.dfsek.terra.api.gaea.command; +package com.dfsek.terra.bukkit.command; +import com.dfsek.terra.bukkit.BukkitCommandSender; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; @@ -27,7 +28,7 @@ public abstract class PlayerCommand extends Command { @Override public final boolean execute(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { if(!(sender instanceof Player)) { - getMain().getLanguage().send("command.players-only", sender); + getMain().getLanguage().send("command.players-only", new BukkitCommandSender(sender)); return true; } Player p = (Player) sender; diff --git a/src/main/java/com/dfsek/terra/api/gaea/command/WorldCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/WorldCommand.java similarity index 77% rename from src/main/java/com/dfsek/terra/api/gaea/command/WorldCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/WorldCommand.java index 08a5aa5b3..65738d220 100644 --- a/src/main/java/com/dfsek/terra/api/gaea/command/WorldCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/WorldCommand.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.gaea.command; +package com.dfsek.terra.bukkit.command; +import com.dfsek.terra.bukkit.BukkitCommandSender; import org.bukkit.World; -import org.bukkit.command.Command; import org.bukkit.entity.Player; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; @@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull; * A command that must be executed by a player, in a Terra world. */ public abstract class WorldCommand extends PlayerCommand { - public WorldCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public WorldCommand(Command parent) { super(parent); } @@ -27,11 +27,11 @@ public abstract class WorldCommand extends PlayerCommand { * @return true if a valid command, otherwise false */ @Override - public final boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + public boolean execute(@NotNull Player sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { if(sender.getWorld().getGenerator() instanceof ChunkGenerator) { // TODO: implementation return execute(sender, command, label, args, sender.getWorld()); } else { - getMain().getLanguage().send("command.world", sender); + getMain().getLanguage().send("command.world", new BukkitCommandSender(sender)); } return true; } @@ -49,5 +49,5 @@ public abstract class WorldCommand extends PlayerCommand { * @param world World in which command was executed * @return true if a valid command, otherwise false */ - public abstract boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world); + public abstract boolean execute(@NotNull Player sender, @NotNull org.bukkit.command.Command command, @NotNull String label, @NotNull String[] args, World world); } diff --git a/src/main/java/com/dfsek/terra/command/FixChunkCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/FixChunkCommand.java similarity index 79% rename from src/main/java/com/dfsek/terra/command/FixChunkCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/FixChunkCommand.java index 83d721333..737ffa0ea 100644 --- a/src/main/java/com/dfsek/terra/command/FixChunkCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/FixChunkCommand.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.command; +package com.dfsek.terra.bukkit.command.command; -import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.bukkit.command.WorldCommand; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -11,7 +11,7 @@ import java.util.Collections; import java.util.List; public class FixChunkCommand extends WorldCommand { - public FixChunkCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public FixChunkCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @@ -27,7 +27,7 @@ public class FixChunkCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/OreCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/OreCommand.java similarity index 87% rename from src/main/java/com/dfsek/terra/command/OreCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/OreCommand.java index 9435e4038..145f5dc8e 100644 --- a/src/main/java/com/dfsek/terra/command/OreCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/OreCommand.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.command; +package com.dfsek.terra.bukkit.command.command; -import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.bukkit.command.WorldCommand; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -11,7 +11,7 @@ import java.util.Collections; import java.util.List; public class OreCommand extends WorldCommand { - public OreCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public OreCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @@ -47,7 +47,7 @@ public class OreCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/PacksCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/PacksCommand.java similarity index 70% rename from src/main/java/com/dfsek/terra/command/PacksCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/PacksCommand.java index 0d514ada6..4b0e08e04 100644 --- a/src/main/java/com/dfsek/terra/command/PacksCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/PacksCommand.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.command; +package com.dfsek.terra.bukkit.command.command; -import com.dfsek.terra.api.gaea.command.Command; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.command.Command; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.registry.ConfigRegistry; @@ -29,17 +29,17 @@ public class PacksCommand extends Command { @Override public boolean execute(@NotNull CommandSender commandSender, org.bukkit.command.@NotNull Command command, @NotNull String s, @NotNull String[] strings) { - ConfigRegistry registry = ((TerraBukkitPlugin) getMain()).getRegistry(); + ConfigRegistry registry = getMain().getRegistry(); if(registry.entries().size() == 0) { - LangUtil.send("command.packs.none", commandSender); + LangUtil.send("command.packs.none", new BukkitCommandSender(commandSender)); return true; } - LangUtil.send("command.packs.main", commandSender); + LangUtil.send("command.packs.main", new BukkitCommandSender(commandSender)); registry.entries().forEach(entry -> { ConfigPackTemplate template = entry.getTemplate(); - LangUtil.send("command.packs.pack", commandSender, template.getID(), template.getAuthor(), template.getVersion()); + LangUtil.send("command.packs.pack", new BukkitCommandSender(commandSender), template.getID(), template.getAuthor(), template.getVersion()); }); return true; diff --git a/src/main/java/com/dfsek/terra/command/ReloadCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/ReloadCommand.java similarity index 60% rename from src/main/java/com/dfsek/terra/command/ReloadCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/ReloadCommand.java index e62ded0c1..b6b4093ac 100644 --- a/src/main/java/com/dfsek/terra/command/ReloadCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/ReloadCommand.java @@ -1,8 +1,9 @@ -package com.dfsek.terra.command; +package com.dfsek.terra.bukkit.command.command; -import com.dfsek.terra.api.gaea.command.Command; -import com.dfsek.terra.api.gaea.command.DebugCommand; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; + +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.command.Command; +import com.dfsek.terra.bukkit.command.DebugCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; @@ -27,14 +28,14 @@ public class ReloadCommand extends Command implements DebugCommand { @Override public boolean execute(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { - ((TerraBukkitPlugin) getMain()).getTerraConfig().load(getMain()); - LangUtil.load(((TerraBukkitPlugin) getMain()).getTerraConfig().getLanguage(), getMain()); // Load language. - if(!((TerraBukkitPlugin) getMain()).getRegistry().loadAll((TerraBukkitPlugin) getMain())) { - LangUtil.send("command.reload-error", sender); + getMain().getTerraConfig().load(getMain()); + LangUtil.load(getMain().getTerraConfig().getLanguage(), getMain()); // Load language. + if(!getMain().getRegistry().loadAll(getMain())) { + LangUtil.send("command.reload-error", new BukkitCommandSender(sender)); return true; } - ((TerraBukkitPlugin) getMain()).reload(); - LangUtil.send("command.reload", sender); + getMain().reload(); + LangUtil.send("command.reload", new BukkitCommandSender(sender)); return true; } diff --git a/src/main/java/com/dfsek/terra/command/SaveDataCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/SaveDataCommand.java similarity index 78% rename from src/main/java/com/dfsek/terra/command/SaveDataCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/SaveDataCommand.java index fb34002d2..d996539ec 100644 --- a/src/main/java/com/dfsek/terra/command/SaveDataCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/SaveDataCommand.java @@ -1,7 +1,8 @@ -package com.dfsek.terra.command; +package com.dfsek.terra.bukkit.command.command; -import com.dfsek.terra.api.gaea.command.Command; -import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.command.Command; +import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.CommandSender; @@ -39,7 +40,7 @@ public class SaveDataCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args, World w) { //TerraChunkGenerator.saveAll(); - LangUtil.send("debug.data-save", sender, w.getName()); + LangUtil.send("debug.data-save", new BukkitCommandSender(sender), w.getName()); return true; } } diff --git a/src/main/java/com/dfsek/terra/command/TerraCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java similarity index 65% rename from src/main/java/com/dfsek/terra/command/TerraCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java index 4d64bf834..2e4a4db46 100644 --- a/src/main/java/com/dfsek/terra/command/TerraCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java @@ -1,12 +1,13 @@ -package com.dfsek.terra.command; +package com.dfsek.terra.bukkit.command.command; -import com.dfsek.terra.api.gaea.GaeaPlugin; -import com.dfsek.terra.api.gaea.command.Command; -import com.dfsek.terra.command.biome.BiomeCommand; -import com.dfsek.terra.command.geometry.GeometryCommand; -import com.dfsek.terra.command.image.ImageCommand; -import com.dfsek.terra.command.profile.ProfileCommand; -import com.dfsek.terra.command.structure.StructureCommand; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.command.Command; +import com.dfsek.terra.bukkit.command.command.biome.BiomeCommand; +import com.dfsek.terra.bukkit.command.command.geometry.GeometryCommand; +import com.dfsek.terra.bukkit.command.command.image.ImageCommand; +import com.dfsek.terra.bukkit.command.command.profile.ProfileCommand; +import com.dfsek.terra.bukkit.command.command.structure.StructureCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; @@ -28,13 +29,13 @@ public class TerraCommand extends Command { new VersionCommand(this), new PacksCommand(this)); - public TerraCommand(GaeaPlugin main) { + public TerraCommand(TerraPlugin main) { super(main); } @Override public String getName() { - return "terra"; + return "com/dfsek/terra"; } @Override @@ -44,7 +45,7 @@ public class TerraCommand extends Command { @Override public boolean execute(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { - LangUtil.send("command.main-menu", sender); + LangUtil.send("command.main-menu", new BukkitCommandSender(sender)); return true; } diff --git a/src/main/java/com/dfsek/terra/command/VersionCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/VersionCommand.java similarity index 71% rename from src/main/java/com/dfsek/terra/command/VersionCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/VersionCommand.java index 60c2dce80..6513fe48d 100644 --- a/src/main/java/com/dfsek/terra/command/VersionCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/VersionCommand.java @@ -1,6 +1,8 @@ -package com.dfsek.terra.command; +package com.dfsek.terra.bukkit.command.command; -import com.dfsek.terra.api.gaea.command.Command; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.bukkit.command.Command; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.command.CommandSender; import org.jetbrains.annotations.NotNull; @@ -25,8 +27,8 @@ public class VersionCommand extends Command { @Override public boolean execute(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { - String terraVersion = getMain().getDescription().getVersion(); - LangUtil.send("command.version", sender, terraVersion); + String terraVersion = ((TerraBukkitPlugin) getMain()).getDescription().getVersion(); + LangUtil.send("command.version", new BukkitCommandSender(sender), terraVersion); return true; } diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java similarity index 83% rename from src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java index 24b70bf33..06e1b0b15 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.command.biome; +package com.dfsek.terra.bukkit.command.command.biome; -import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.bukkit.command.WorldCommand; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.List; public class BiomeCommand extends WorldCommand { - public BiomeCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public BiomeCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @@ -33,7 +33,7 @@ public class BiomeCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Arrays.asList(new BiomeLocateCommand(this, true), new BiomeLocateCommand(this, false), new BiomeInfoCommand(this)); } diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java similarity index 84% rename from src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java index a50676604..7208bf296 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeInfoCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.command.biome; +package com.dfsek.terra.bukkit.command.command.biome; -import com.dfsek.terra.api.gaea.command.WorldCommand; -import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.lang.LangUtil; @@ -20,19 +20,19 @@ import java.util.List; import java.util.Map; public class BiomeInfoCommand extends WorldCommand { - public BiomeInfoCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public BiomeInfoCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { String id = args[0]; - ConfigPack cfg = ((TerraBukkitPlugin) getMain()).getWorld(new BukkitWorld(world)).getConfig(); + ConfigPack cfg = getMain().getWorld(new BukkitWorld(world)).getConfig(); UserDefinedBiome b; try { b = cfg.getBiome(id); } catch(IllegalArgumentException | NullPointerException e) { - LangUtil.send("command.biome.invalid", sender, id); + LangUtil.send("command.biome.invalid", new BukkitCommandSender(sender), id); return true; } sender.sendMessage("Biome info for \"" + b.getID() + "\"."); @@ -73,7 +73,7 @@ public class BiomeInfoCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java similarity index 92% rename from src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java index b75eebf1d..8e29c25a3 100644 --- a/src/main/java/com/dfsek/terra/command/biome/BiomeLocateCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.command.biome; +package com.dfsek.terra.bukkit.command.command.biome; -import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.bukkit.command.WorldCommand; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -13,7 +13,7 @@ import java.util.List; public class BiomeLocateCommand extends WorldCommand { private final boolean tp; - public BiomeLocateCommand(com.dfsek.terra.api.gaea.command.Command parent, boolean teleport) { + public BiomeLocateCommand(com.dfsek.terra.bukkit.command.Command parent, boolean teleport) { super(parent); this.tp = teleport; } @@ -60,7 +60,7 @@ public class BiomeLocateCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/geometry/DeformedSphereCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java similarity index 66% rename from src/main/java/com/dfsek/terra/command/geometry/DeformedSphereCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java index 8e1f690dd..ea56bd1e9 100644 --- a/src/main/java/com/dfsek/terra/command/geometry/DeformedSphereCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java @@ -1,21 +1,23 @@ -package com.dfsek.terra.command.geometry; +package com.dfsek.terra.bukkit.command.command.geometry; -import com.dfsek.terra.api.gaea.command.PlayerCommand; import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.BukkitPlayer; +import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.command.PlayerCommand; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.procgen.voxel.DeformedSphere; -import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; public class DeformedSphereCommand extends PlayerCommand { - public DeformedSphereCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public DeformedSphereCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @@ -25,14 +27,14 @@ public class DeformedSphereCommand extends PlayerCommand { try { radius = Integer.parseInt(args[0]); } catch(NumberFormatException e) { - LangUtil.send("command.geometry.deform.invalid-radius", sender, args[0]); + LangUtil.send("command.geometry.deform.invalid-radius", new BukkitCommandSender(sender), args[0]); return true; } double deform; try { deform = Double.parseDouble(args[1]); } catch(NumberFormatException e) { - LangUtil.send("command.geometry.deform.invalid-deform", sender, args[1]); + LangUtil.send("command.geometry.deform.invalid-deform", new BukkitCommandSender(sender), args[1]); return true; } @@ -40,15 +42,15 @@ public class DeformedSphereCommand extends PlayerCommand { try { freq = Float.parseFloat(args[2]); } catch(NumberFormatException e) { - LangUtil.send("command.geometry.deform.invalid-frequency", sender, args[2]); + LangUtil.send("command.geometry.deform.invalid-frequency", new BukkitCommandSender(sender), args[2]); return true; } FastNoiseLite n = new FastNoiseLite((int) sender.getWorld().getSeed()); n.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); n.setFrequency(freq); - DeformedSphere sphere = new DeformedSphere(sender.getLocation().toVector(), radius, deform, n); - for(Vector v : sphere.getGeometry()) { - v.toLocation(sender.getWorld()).getBlock().setType(Material.STONE); + DeformedSphere sphere = new DeformedSphere(new BukkitPlayer(sender).getLocation().toVector(), radius, deform, n); + for(Vector3 v : sphere.getGeometry()) { + v.toLocation(new BukkitWorld(sender.getWorld())).getBlock().setBlockData(getMain().getWorldHandle().createBlockData("minecraft:stone"), false); } return true; } @@ -59,7 +61,7 @@ public class DeformedSphereCommand extends PlayerCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/geometry/GeometryCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/GeometryCommand.java similarity index 69% rename from src/main/java/com/dfsek/terra/command/geometry/GeometryCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/GeometryCommand.java index 1bf352da2..8e9b2d89e 100644 --- a/src/main/java/com/dfsek/terra/command/geometry/GeometryCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/GeometryCommand.java @@ -1,7 +1,8 @@ -package com.dfsek.terra.command.geometry; +package com.dfsek.terra.bukkit.command.command.geometry; -import com.dfsek.terra.api.gaea.command.DebugCommand; -import com.dfsek.terra.api.gaea.command.PlayerCommand; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.command.DebugCommand; +import com.dfsek.terra.bukkit.command.PlayerCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -13,13 +14,13 @@ import java.util.Collections; import java.util.List; public class GeometryCommand extends PlayerCommand implements DebugCommand { - public GeometryCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public GeometryCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - LangUtil.send("command.geometry.main-menu", sender); + LangUtil.send("command.geometry.main-menu", new BukkitCommandSender(sender)); return true; } @@ -29,7 +30,7 @@ public class GeometryCommand extends PlayerCommand implements DebugCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Arrays.asList(new SphereCommand(this), new TubeCommand(this), new DeformedSphereCommand(this)); } diff --git a/src/main/java/com/dfsek/terra/command/geometry/SphereCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java similarity index 59% rename from src/main/java/com/dfsek/terra/command/geometry/SphereCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java index 4aabb8bab..8f4f20da7 100644 --- a/src/main/java/com/dfsek/terra/command/geometry/SphereCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java @@ -1,20 +1,22 @@ -package com.dfsek.terra.command.geometry; +package com.dfsek.terra.bukkit.command.command.geometry; -import com.dfsek.terra.api.gaea.command.PlayerCommand; +import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.BukkitPlayer; +import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.command.PlayerCommand; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.procgen.voxel.Sphere; -import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; public class SphereCommand extends PlayerCommand { - public SphereCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public SphereCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @@ -24,12 +26,12 @@ public class SphereCommand extends PlayerCommand { try { radius = Integer.parseInt(args[0]); } catch(NumberFormatException e) { - LangUtil.send("command.geometry.sphere.invalid-radius", sender, args[0]); + LangUtil.send("command.geometry.sphere.invalid-radius", new BukkitCommandSender(sender), args[0]); return true; } - Sphere sphere = new Sphere(sender.getLocation().toVector(), radius); - for(Vector v : sphere.getGeometry()) { - v.toLocation(sender.getWorld()).getBlock().setType(Material.STONE); + Sphere sphere = new Sphere(new BukkitPlayer(sender).getLocation().toVector(), radius); + for(Vector3 v : sphere.getGeometry()) { + v.toLocation(new BukkitWorld(sender.getWorld())).getBlock().setBlockData(getMain().getWorldHandle().createBlockData("minecraft:stone"), false); } return true; } @@ -40,7 +42,7 @@ public class SphereCommand extends PlayerCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/geometry/TubeCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java similarity index 58% rename from src/main/java/com/dfsek/terra/command/geometry/TubeCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java index 3d771fa15..29583380b 100644 --- a/src/main/java/com/dfsek/terra/command/geometry/TubeCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java @@ -1,22 +1,24 @@ -package com.dfsek.terra.command.geometry; +package com.dfsek.terra.bukkit.command.command.geometry; -import com.dfsek.terra.api.gaea.command.PlayerCommand; +import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.command.PlayerCommand; +import com.dfsek.terra.bukkit.structure.WorldEditUtil; +import com.dfsek.terra.bukkit.util.BukkitConversions; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.procgen.voxel.Tube; -import com.dfsek.terra.util.structure.WorldEditUtil; import org.bukkit.Location; -import org.bukkit.Material; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; public class TubeCommand extends PlayerCommand { - public TubeCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public TubeCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @@ -28,12 +30,12 @@ public class TubeCommand extends PlayerCommand { try { radius = Integer.parseInt(args[0]); } catch(NumberFormatException e) { - LangUtil.send("command.geometry.tube.invalid-radius", sender, args[0]); + LangUtil.send("command.geometry.tube.invalid-radius", new BukkitCommandSender(sender), args[0]); return true; } - Tube tube = new Tube(l[0].toVector(), l[1].toVector(), radius); - for(Vector v : tube.getGeometry()) { - v.toLocation(sender.getWorld()).getBlock().setType(Material.STONE); + Tube tube = new Tube(BukkitConversions.toTerraVector(l[0].toVector()), BukkitConversions.toTerraVector(l[1].toVector()), radius); + for(Vector3 v : tube.getGeometry()) { + v.toLocation(new BukkitWorld(sender.getWorld())).getBlock().setBlockData(getMain().getWorldHandle().createBlockData("minecraft:stone"), false); } return true; } @@ -44,7 +46,7 @@ public class TubeCommand extends PlayerCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/image/ImageCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/ImageCommand.java similarity index 68% rename from src/main/java/com/dfsek/terra/command/image/ImageCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/ImageCommand.java index 145d757e6..8f9f2cb08 100644 --- a/src/main/java/com/dfsek/terra/command/image/ImageCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/ImageCommand.java @@ -1,7 +1,8 @@ -package com.dfsek.terra.command.image; +package com.dfsek.terra.bukkit.command.command.image; -import com.dfsek.terra.api.gaea.command.WorldCommand; -import com.dfsek.terra.command.image.gui.GUICommand; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.command.command.image.gui.GUICommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; @@ -14,13 +15,13 @@ import java.util.Collections; import java.util.List; public class ImageCommand extends WorldCommand { - public ImageCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public ImageCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World w) { - LangUtil.send("command.image.main-menu", sender); + LangUtil.send("command.image.main-menu", new BukkitCommandSender(sender)); return true; } @@ -30,7 +31,7 @@ public class ImageCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Arrays.asList(new RenderCommand(this), new GUICommand(this)); } diff --git a/src/main/java/com/dfsek/terra/command/image/RenderCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/RenderCommand.java similarity index 87% rename from src/main/java/com/dfsek/terra/command/image/RenderCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/RenderCommand.java index bc913384b..8ca2d6ab6 100644 --- a/src/main/java/com/dfsek/terra/command/image/RenderCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/RenderCommand.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.command.image; +package com.dfsek.terra.bukkit.command.command.image; -import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.bukkit.command.WorldCommand; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -11,7 +11,7 @@ import java.util.Collections; import java.util.List; public class RenderCommand extends WorldCommand { - public RenderCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public RenderCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @@ -45,7 +45,7 @@ public class RenderCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/image/gui/GUICommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/GUICommand.java similarity index 69% rename from src/main/java/com/dfsek/terra/command/image/gui/GUICommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/GUICommand.java index 9a592d6b6..13d9fee7f 100644 --- a/src/main/java/com/dfsek/terra/command/image/gui/GUICommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/GUICommand.java @@ -1,7 +1,8 @@ -package com.dfsek.terra.command.image.gui; +package com.dfsek.terra.bukkit.command.command.image.gui; -import com.dfsek.terra.api.gaea.command.DebugCommand; -import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.command.DebugCommand; +import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; @@ -14,13 +15,13 @@ import java.util.Collections; import java.util.List; public class GUICommand extends WorldCommand implements DebugCommand { - public GUICommand(com.dfsek.terra.api.gaea.command.Command parent) { + public GUICommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - LangUtil.send("command.image.gui.main-menu", sender); + LangUtil.send("command.image.gui.main-menu", new BukkitCommandSender(sender)); return true; } @@ -30,7 +31,7 @@ public class GUICommand extends WorldCommand implements DebugCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Arrays.asList(new StepGUICommand(this), new RawGUICommand(this)); } diff --git a/src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/RawGUICommand.java similarity index 83% rename from src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/RawGUICommand.java index 52f2a6472..f4b8d388b 100644 --- a/src/main/java/com/dfsek/terra/command/image/gui/RawGUICommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/RawGUICommand.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.command.image.gui; +package com.dfsek.terra.bukkit.command.command.image.gui; -import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.bukkit.command.WorldCommand; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -11,7 +11,7 @@ import java.util.Collections; import java.util.List; public class RawGUICommand extends WorldCommand { - public RawGUICommand(com.dfsek.terra.api.gaea.command.Command parent) { + public RawGUICommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @@ -36,7 +36,7 @@ public class RawGUICommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/StepGUICommand.java similarity index 83% rename from src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/StepGUICommand.java index 1d838aebb..9c4be327e 100644 --- a/src/main/java/com/dfsek/terra/command/image/gui/StepGUICommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/StepGUICommand.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.command.image.gui; +package com.dfsek.terra.bukkit.command.command.image.gui; -import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.bukkit.command.WorldCommand; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -11,7 +11,7 @@ import java.util.Collections; import java.util.List; public class StepGUICommand extends WorldCommand { - public StepGUICommand(com.dfsek.terra.api.gaea.command.Command parent) { + public StepGUICommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @@ -36,7 +36,7 @@ public class StepGUICommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/profile/ProfileCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ProfileCommand.java similarity index 72% rename from src/main/java/com/dfsek/terra/command/profile/ProfileCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ProfileCommand.java index 8283dd45f..5eb4b4ec1 100644 --- a/src/main/java/com/dfsek/terra/command/profile/ProfileCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ProfileCommand.java @@ -1,6 +1,7 @@ -package com.dfsek.terra.command.profile; +package com.dfsek.terra.bukkit.command.command.profile; -import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; @@ -13,13 +14,13 @@ import java.util.Collections; import java.util.List; public class ProfileCommand extends WorldCommand { - public ProfileCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public ProfileCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World w) { - LangUtil.send("command.profile.main-menu", sender); + LangUtil.send("command.profile.main-menu", new BukkitCommandSender(sender)); return true; } @@ -29,7 +30,7 @@ public class ProfileCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Arrays.asList(new QueryCommand(this), new ResetCommand(this), new StartCommand(this), new StopCommand(this)); } diff --git a/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java similarity index 66% rename from src/main/java/com/dfsek/terra/command/profile/QueryCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java index 053341579..49f65acec 100644 --- a/src/main/java/com/dfsek/terra/command/profile/QueryCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java @@ -1,9 +1,8 @@ -package com.dfsek.terra.command.profile; +package com.dfsek.terra.bukkit.command.command.profile; -import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; -import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.command.WorldCommand; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -14,13 +13,13 @@ import java.util.Collections; import java.util.List; public class QueryCommand extends WorldCommand { - public QueryCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public QueryCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(new BukkitWorld(world)).getProfiler(); + WorldProfiler profile = getMain().getWorld(new BukkitWorld(world)).getProfiler(); sender.sendMessage(profile.getResultsFormatted()); return true; } @@ -31,7 +30,7 @@ public class QueryCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java similarity index 64% rename from src/main/java/com/dfsek/terra/command/profile/ResetCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java index 18e73db79..bf0c812f8 100644 --- a/src/main/java/com/dfsek/terra/command/profile/ResetCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.command.profile; +package com.dfsek.terra.bukkit.command.command.profile; -import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; -import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; @@ -15,15 +15,15 @@ import java.util.Collections; import java.util.List; public class ResetCommand extends WorldCommand { - public ResetCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public ResetCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(new BukkitWorld(world)).getProfiler(); + WorldProfiler profile = getMain().getWorld(new BukkitWorld(world)).getProfiler(); profile.reset(); - LangUtil.send("command.profile.reset", sender); + LangUtil.send("command.profile.reset", new BukkitCommandSender(sender)); return true; } @@ -33,7 +33,7 @@ public class ResetCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/profile/StartCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java similarity index 65% rename from src/main/java/com/dfsek/terra/command/profile/StartCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java index 3ea69a242..2a9f36b96 100644 --- a/src/main/java/com/dfsek/terra/command/profile/StartCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.command.profile; +package com.dfsek.terra.bukkit.command.command.profile; -import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; -import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; @@ -15,15 +15,15 @@ import java.util.Collections; import java.util.List; public class StartCommand extends WorldCommand { - public StartCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public StartCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(new BukkitWorld(world)).getProfiler(); + WorldProfiler profile = getMain().getWorld(new BukkitWorld(world)).getProfiler(); profile.setProfiling(true); - LangUtil.send("command.profile.start", sender); + LangUtil.send("command.profile.start", new BukkitCommandSender(sender)); return true; } @@ -33,7 +33,7 @@ public class StartCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/profile/StopCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java similarity index 65% rename from src/main/java/com/dfsek/terra/command/profile/StopCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java index 0a9ccf7b9..c6be1276b 100644 --- a/src/main/java/com/dfsek/terra/command/profile/StopCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.command.profile; +package com.dfsek.terra.bukkit.command.command.profile; -import com.dfsek.terra.api.gaea.command.WorldCommand; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; -import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; @@ -15,15 +15,15 @@ import java.util.Collections; import java.util.List; public class StopCommand extends WorldCommand { - public StopCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public StopCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = ((TerraBukkitPlugin) getMain()).getWorld(new BukkitWorld(world)).getProfiler(); + WorldProfiler profile = getMain().getWorld(new BukkitWorld(world)).getProfiler(); profile.setProfiling(false); - LangUtil.send("command.profile.stop", sender); + LangUtil.send("command.profile.stop", new BukkitCommandSender(sender)); return true; } @@ -33,7 +33,7 @@ public class StopCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/structure/ExportCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java similarity index 85% rename from src/main/java/com/dfsek/terra/command/structure/ExportCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java index d3bbcb15b..d405787dc 100644 --- a/src/main/java/com/dfsek/terra/command/structure/ExportCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.command.structure; +package com.dfsek.terra.bukkit.command.command.structure; -import com.dfsek.terra.api.gaea.command.PlayerCommand; -import com.dfsek.terra.util.structure.WorldEditUtil; +import com.dfsek.terra.bukkit.command.PlayerCommand; +import com.dfsek.terra.bukkit.structure.WorldEditUtil; import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -12,7 +12,7 @@ import java.util.Collections; import java.util.List; public class ExportCommand extends PlayerCommand { - public ExportCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public ExportCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @@ -52,7 +52,7 @@ public class ExportCommand extends PlayerCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java similarity index 89% rename from src/main/java/com/dfsek/terra/command/structure/LocateCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java index 871123f2a..342880ef9 100644 --- a/src/main/java/com/dfsek/terra/command/structure/LocateCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java @@ -1,6 +1,7 @@ -package com.dfsek.terra.command.structure; +package com.dfsek.terra.bukkit.command.command.structure; -import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; @@ -14,7 +15,7 @@ import java.util.List; public class LocateCommand extends WorldCommand { private final boolean tp; - public LocateCommand(com.dfsek.terra.api.gaea.command.Command parent, boolean tp) { + public LocateCommand(com.dfsek.terra.bukkit.command.Command parent, boolean tp) { super(parent); this.tp = tp; } @@ -28,7 +29,7 @@ public class LocateCommand extends WorldCommand { try { maxRadius = Integer.parseInt(args[1]); } catch(NumberFormatException e) { - LangUtil.send("command.structure.invalid-radius", sender, args[1]); + LangUtil.send("command.structure.invalid-radius", new BukkitCommandSender(sender), args[1]); return true; } /* @@ -64,7 +65,7 @@ public class LocateCommand extends WorldCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java similarity index 83% rename from src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java index dae0e5a04..bf8462ae7 100644 --- a/src/main/java/com/dfsek/terra/command/structure/SpawnCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.command.structure; +package com.dfsek.terra.bukkit.command.command.structure; -import com.dfsek.terra.api.gaea.command.DebugCommand; -import com.dfsek.terra.api.gaea.command.WorldCommand; +import com.dfsek.terra.bukkit.command.DebugCommand; +import com.dfsek.terra.bukkit.command.WorldCommand; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.Command; @@ -13,7 +13,7 @@ import java.util.Collections; import java.util.List; public class SpawnCommand extends WorldCommand implements DebugCommand { - public SpawnCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public SpawnCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @@ -40,7 +40,7 @@ public class SpawnCommand extends WorldCommand implements DebugCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/structure/StructureCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/StructureCommand.java similarity index 68% rename from src/main/java/com/dfsek/terra/command/structure/StructureCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/StructureCommand.java index 325f93363..a1991af62 100644 --- a/src/main/java/com/dfsek/terra/command/structure/StructureCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/StructureCommand.java @@ -1,7 +1,8 @@ -package com.dfsek.terra.command.structure; +package com.dfsek.terra.bukkit.command.command.structure; -import com.dfsek.terra.api.gaea.command.PlayerCommand; -import com.dfsek.terra.command.structure.load.LoadCommand; +import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.command.PlayerCommand; +import com.dfsek.terra.bukkit.command.command.structure.load.LoadCommand; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -13,13 +14,13 @@ import java.util.Collections; import java.util.List; public class StructureCommand extends PlayerCommand { - public StructureCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public StructureCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - LangUtil.send("command.structure.main-menu", sender); + LangUtil.send("command.structure.main-menu", new BukkitCommandSender(sender)); return true; } @@ -29,7 +30,7 @@ public class StructureCommand extends PlayerCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Arrays.asList(new ExportCommand(this), new LoadCommand(this), new LocateCommand(this, false), new LocateCommand(this, true), new SpawnCommand(this)); } diff --git a/src/main/java/com/dfsek/terra/command/structure/load/LoadCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadCommand.java similarity index 84% rename from src/main/java/com/dfsek/terra/command/structure/load/LoadCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadCommand.java index 7cdfe8a78..0b9f2d096 100644 --- a/src/main/java/com/dfsek/terra/command/structure/load/LoadCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadCommand.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.command.structure.load; +package com.dfsek.terra.bukkit.command.command.structure.load; -import com.dfsek.terra.api.gaea.command.DebugCommand; -import com.dfsek.terra.api.gaea.command.PlayerCommand; +import com.dfsek.terra.bukkit.command.DebugCommand; +import com.dfsek.terra.bukkit.command.PlayerCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -16,7 +16,7 @@ import java.util.Collections; import java.util.List; public class LoadCommand extends PlayerCommand implements DebugCommand { - public LoadCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public LoadCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @@ -45,7 +45,7 @@ public class LoadCommand extends PlayerCommand implements DebugCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Arrays.asList(new LoadRawCommand(this), new LoadFullCommand(this, true), new LoadFullCommand(this, false)); } diff --git a/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java similarity index 89% rename from src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java index 31a31fd46..c0ab64660 100644 --- a/src/main/java/com/dfsek/terra/command/structure/load/LoadFullCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.command.structure.load; +package com.dfsek.terra.bukkit.command.command.structure.load; -import com.dfsek.terra.api.gaea.command.DebugCommand; +import com.dfsek.terra.bukkit.command.DebugCommand; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -14,7 +14,7 @@ import java.util.stream.Stream; public class LoadFullCommand extends LoadCommand implements DebugCommand { private final boolean chunk; - public LoadFullCommand(com.dfsek.terra.api.gaea.command.Command parent, boolean chunk) { + public LoadFullCommand(com.dfsek.terra.bukkit.command.Command parent, boolean chunk) { super(parent); this.chunk = chunk; } @@ -49,7 +49,7 @@ public class LoadFullCommand extends LoadCommand implements DebugCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java similarity index 94% rename from src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index f3ac6c8dd..69b955da0 100644 --- a/src/main/java/com/dfsek/terra/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.command.structure.load; +package com.dfsek.terra.bukkit.command.command.structure.load; -import com.dfsek.terra.api.gaea.command.DebugCommand; +import com.dfsek.terra.bukkit.command.DebugCommand; import org.bukkit.block.Sign; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -12,7 +12,7 @@ import java.util.List; import java.util.stream.Collectors; public class LoadRawCommand extends LoadCommand implements DebugCommand { - public LoadRawCommand(com.dfsek.terra.api.gaea.command.Command parent) { + public LoadRawCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @@ -28,7 +28,7 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { /* try { - WorldHandle handle = ((TerraBukkitPlugin) getMain()).getHandle(); + WorldHandle handle = ((TerraBukkitPlugin) getMain()).getWorldHandle(); Structure struc = Structure.load(new File(getMain().getDataFolder() + File.separator + "export" + File.separator + "structures", args[0] + ".tstructure")); StructureInfo info = struc.getStructureInfo(); int centerX = info.getCenterX(); @@ -89,7 +89,7 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { } @Override - public List getSubCommands() { + public List getSubCommands() { return Collections.emptyList(); } diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGenerator.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java similarity index 83% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGenerator.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java index 83a4f1a26..1478afab8 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGenerator.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java @@ -1,14 +1,16 @@ -package com.dfsek.terra.api.implementations.bukkit.generator; +package com.dfsek.terra.bukkit.generator; import com.dfsek.terra.api.generic.generator.BlockPopulator; +import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; import com.dfsek.terra.api.generic.world.BiomeGrid; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.implementations.bukkit.BukkitBiomeGrid; -import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; -import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; +import com.dfsek.terra.bukkit.BukkitBiomeGrid; +import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Random; @@ -61,6 +63,11 @@ public class BukkitChunkGenerator implements com.dfsek.terra.api.generic.generat return delegate.getDefaultPopulators(((BukkitWorld) world).getHandle()).stream().map(BukkitPopulator::new).collect(Collectors.toList()); } + @Override + public @Nullable TerraChunkGenerator getTerraGenerator() { + return delegate instanceof BukkitChunkGeneratorWrapper ? ((BukkitChunkGeneratorWrapper) delegate).getHandle() : null; + } + public static class BukkitChunkData implements ChunkData { private final ChunkGenerator.ChunkData delegate; diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java similarity index 87% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGeneratorWrapper.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index a45ee4b03..3db599504 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -1,8 +1,9 @@ -package com.dfsek.terra.api.implementations.bukkit.generator; +package com.dfsek.terra.bukkit.generator; +import com.dfsek.terra.api.generic.Handle; import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; -import com.dfsek.terra.api.implementations.bukkit.BukkitBiomeGrid; -import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.BukkitBiomeGrid; +import com.dfsek.terra.bukkit.BukkitWorld; import org.bukkit.World; import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.ChunkGenerator; @@ -12,7 +13,7 @@ import java.util.List; import java.util.Random; import java.util.stream.Collectors; -public class BukkitChunkGeneratorWrapper extends ChunkGenerator { +public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Handle { private final TerraChunkGenerator delegate; public BukkitChunkGeneratorWrapper(TerraChunkGenerator delegate) { @@ -26,10 +27,6 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator { return (ChunkData) delegate.generateChunkData(bukkitWorld, random, x, z, new BukkitBiomeGrid(biome), new BukkitChunkGenerator.BukkitChunkData(createChunkData(world))).getHandle(); } - public TerraChunkGenerator getDelegate() { - return delegate; - } - @Override public @NotNull List getDefaultPopulators(@NotNull World world) { return delegate.getPopulators().stream().map(BukkitPopulatorWrapper::new).collect(Collectors.toList()); @@ -59,4 +56,9 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator { public boolean shouldGenerateStructures() { return super.shouldGenerateStructures(); } + + @Override + public TerraChunkGenerator getHandle() { + return delegate; + } } diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitPopulator.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulator.java similarity index 79% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitPopulator.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulator.java index 2562f0f62..64eb84c63 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitPopulator.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulator.java @@ -1,10 +1,10 @@ -package com.dfsek.terra.api.implementations.bukkit.generator; +package com.dfsek.terra.bukkit.generator; import com.dfsek.terra.api.generic.generator.BlockPopulator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.implementations.bukkit.BukkitChunk; -import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.BukkitChunk; +import com.dfsek.terra.bukkit.BukkitWorld; import java.util.Random; diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitPopulatorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java similarity index 77% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitPopulatorWrapper.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java index 2470dab16..efa7b6d78 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/generator/BukkitPopulatorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.api.implementations.bukkit.generator; +package com.dfsek.terra.bukkit.generator; import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; -import com.dfsek.terra.api.implementations.bukkit.BukkitChunk; -import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.BukkitChunk; +import com.dfsek.terra.bukkit.BukkitWorld; import org.bukkit.Chunk; import org.bukkit.World; import org.bukkit.generator.BlockPopulator; diff --git a/src/main/java/com/dfsek/terra/listeners/EventListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java similarity index 86% rename from src/main/java/com/dfsek/terra/listeners/EventListener.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java index d5b6a5a77..a2ca4fadd 100644 --- a/src/main/java/com/dfsek/terra/listeners/EventListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.listeners; +package com.dfsek.terra.bukkit.listeners; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.generic.TerraPlugin; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.StructureGrowEvent; @@ -9,9 +9,9 @@ import org.bukkit.event.world.StructureGrowEvent; * Listener for events on all implementations. */ public class EventListener implements Listener { - private final TerraBukkitPlugin main; + private final TerraPlugin main; - public EventListener(TerraBukkitPlugin main) { + public EventListener(TerraPlugin main) { this.main = main; } diff --git a/src/main/java/com/dfsek/terra/listeners/PaperListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java similarity index 80% rename from src/main/java/com/dfsek/terra/listeners/PaperListener.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java index 97f38ef04..ae8e74b06 100644 --- a/src/main/java/com/dfsek/terra/listeners/PaperListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/PaperListener.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.listeners; +package com.dfsek.terra.bukkit.listeners; import org.bukkit.event.Listener; diff --git a/src/main/java/com/dfsek/terra/listeners/SpigotListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java similarity index 92% rename from src/main/java/com/dfsek/terra/listeners/SpigotListener.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java index 526c5ddd8..1efe86781 100644 --- a/src/main/java/com/dfsek/terra/listeners/SpigotListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.listeners; +package com.dfsek.terra.bukkit.listeners; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; +import com.dfsek.terra.api.generic.TerraPlugin; import org.bukkit.event.Listener; /** @@ -10,9 +10,9 @@ import org.bukkit.event.Listener; * StructureLocateEvent). */ public class SpigotListener implements Listener { - private final TerraBukkitPlugin main; + private final TerraPlugin main; - public SpigotListener(TerraBukkitPlugin main) { + public SpigotListener(TerraPlugin main) { this.main = main; } /* diff --git a/src/main/java/com/dfsek/terra/util/structure/RotationUtil.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/RotationUtil.java similarity index 89% rename from src/main/java/com/dfsek/terra/util/structure/RotationUtil.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/RotationUtil.java index cd563e73e..082e5ff1b 100644 --- a/src/main/java/com/dfsek/terra/util/structure/RotationUtil.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/RotationUtil.java @@ -1,20 +1,21 @@ -package com.dfsek.terra.util.structure; +package com.dfsek.terra.bukkit.structure; +import com.dfsek.terra.api.generic.world.block.Axis; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.data.Directional; +import com.dfsek.terra.api.generic.world.block.data.MultipleFacing; +import com.dfsek.terra.api.generic.world.block.data.Orientable; +import com.dfsek.terra.api.generic.world.block.data.Rail; +import com.dfsek.terra.api.generic.world.block.data.RedstoneWire; +import com.dfsek.terra.api.generic.world.block.data.Rotatable; +import com.dfsek.terra.api.generic.world.block.data.Wall; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.structure.Rotation; -import com.google.common.collect.Sets; import net.jafama.FastMath; -import org.bukkit.block.BlockFace; -import org.bukkit.block.data.BlockData; -import org.bukkit.block.data.Directional; -import org.bukkit.block.data.MultipleFacing; -import org.bukkit.block.data.Orientable; -import org.bukkit.block.data.Rail; -import org.bukkit.block.data.Rotatable; -import org.bukkit.block.data.type.RedstoneWire; -import org.bukkit.block.data.type.Wall; import java.util.EnumMap; +import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -149,15 +150,15 @@ public final class RotationUtil { } } - public static org.bukkit.Axis getRotatedAxis(org.bukkit.Axis orig, Rotation r) { - org.bukkit.Axis other = orig; + public static Axis getRotatedAxis(Axis orig, Rotation r) { + Axis other = orig; final boolean shouldSwitch = r.equals(Rotation.CW_90) || r.equals(Rotation.CCW_90); switch(orig) { case X: - if(shouldSwitch) other = org.bukkit.Axis.Z; + if(shouldSwitch) other = Axis.Z; break; case Z: - if(shouldSwitch) other = org.bukkit.Axis.X; + if(shouldSwitch) other = Axis.X; break; } return other; @@ -246,7 +247,13 @@ public final class RotationUtil { return orig; } - private static final Set CARDINALS = Sets.newHashSet(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST); + private static final Set CARDINALS = new HashSet<>(); + static { + CARDINALS.add(BlockFace.NORTH); + CARDINALS.add(BlockFace.SOUTH); + CARDINALS.add(BlockFace.EAST); + CARDINALS.add(BlockFace.WEST); + } public static void rotateBlockData(BlockData data, Rotation r) { if(data instanceof Rotatable) { @@ -268,7 +275,7 @@ public final class RotationUtil { Rail.Shape newShape = getRotatedRail(((Rail) data).getShape(), r); ((Rail) data).setShape(newShape); } else if(data instanceof Orientable) { - org.bukkit.Axis newAxis = getRotatedAxis(((Orientable) data).getAxis(), r); + Axis newAxis = getRotatedAxis(((Orientable) data).getAxis(), r); ((Orientable) data).setAxis(newAxis); } else if(data instanceof RedstoneWire) { Map connections = new EnumMap<>(BlockFace.class); diff --git a/src/main/java/com/dfsek/terra/util/structure/WorldEditNotFoundException.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/WorldEditNotFoundException.java similarity index 93% rename from src/main/java/com/dfsek/terra/util/structure/WorldEditNotFoundException.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/WorldEditNotFoundException.java index a5f08d649..5b7ec6e0d 100644 --- a/src/main/java/com/dfsek/terra/util/structure/WorldEditNotFoundException.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/WorldEditNotFoundException.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.util.structure; +package com.dfsek.terra.bukkit.structure; public class WorldEditNotFoundException extends RuntimeException { public WorldEditNotFoundException() { diff --git a/src/main/java/com/dfsek/terra/util/structure/WorldEditUtil.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/WorldEditUtil.java similarity index 98% rename from src/main/java/com/dfsek/terra/util/structure/WorldEditUtil.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/WorldEditUtil.java index a5518bcc7..e1a15dc4b 100644 --- a/src/main/java/com/dfsek/terra/util/structure/WorldEditUtil.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/WorldEditUtil.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.util.structure; +package com.dfsek.terra.bukkit.structure; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.bukkit.BukkitAdapter; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java new file mode 100644 index 000000000..31aea01c9 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.bukkit.util; + +import com.dfsek.terra.api.generic.world.vector.Vector3; +import org.bukkit.util.Vector; + +public final class BukkitConversions { + public static Vector3 toTerraVector(Vector bukkit) { + return new Vector3(bukkit.getX(), bukkit.getY(), bukkit.getZ()); + } +} diff --git a/src/main/java/com/dfsek/terra/util/PaperUtil.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java similarity index 91% rename from src/main/java/com/dfsek/terra/util/PaperUtil.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java index 08f1fc2bc..05eba8c9b 100644 --- a/src/main/java/com/dfsek/terra/util/PaperUtil.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/PaperUtil.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.util; +package com.dfsek.terra.bukkit.util; import io.papermc.lib.PaperLib; import org.bukkit.Bukkit; diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/BukkitBiome.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiome.java similarity index 84% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/world/BukkitBiome.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiome.java index 600e18be9..eac3332e6 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/BukkitBiome.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiome.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.implementations.bukkit.world; +package com.dfsek.terra.bukkit.world; import com.dfsek.terra.api.generic.world.Biome; diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitBlock.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java similarity index 80% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitBlock.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java index 4cf0129f0..421c110c2 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitBlock.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java @@ -1,12 +1,12 @@ -package com.dfsek.terra.api.implementations.bukkit.world.block; +package com.dfsek.terra.bukkit.world.block; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; -import com.dfsek.terra.api.implementations.bukkit.world.block.data.BukkitEnumAdapter; +import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.world.block.data.TerraEnumAdapter; public class BukkitBlock implements Block { private final org.bukkit.block.Block delegate; @@ -27,12 +27,12 @@ public class BukkitBlock implements Block { @Override public Block getRelative(BlockFace face) { - return new BukkitBlock(delegate.getRelative(BukkitEnumAdapter.fromTerraBlockFace(face))); + return new BukkitBlock(delegate.getRelative(TerraEnumAdapter.fromTerraBlockFace(face))); } @Override public Block getRelative(BlockFace face, int len) { - return new BukkitBlock(delegate.getRelative(BukkitEnumAdapter.fromTerraBlockFace(face), len)); + return new BukkitBlock(delegate.getRelative(TerraEnumAdapter.fromTerraBlockFace(face), len)); } @Override diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitBlockData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java similarity index 93% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitBlockData.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java index a4760521b..e89e069ac 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitBlockData.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.implementations.bukkit.world.block; +package com.dfsek.terra.bukkit.world.block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitMaterialData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java similarity index 89% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitMaterialData.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java index a3bd6f1b8..7c561a8fe 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/BukkitMaterialData.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.implementations.bukkit.world.block; +package com.dfsek.terra.bukkit.world.block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; @@ -31,6 +31,11 @@ public class BukkitMaterialData implements MaterialData { return delegate.isAir(); } + @Override + public double getMaxDurability() { + return delegate.getMaxDurability(); + } + @Override public Material getHandle() { return delegate; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java new file mode 100644 index 000000000..da2a6a54c --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java @@ -0,0 +1,82 @@ +package com.dfsek.terra.bukkit.world.block.data; + + +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.data.Bisected; +import com.dfsek.terra.api.generic.world.block.data.Stairs; + +public final class BukkitEnumAdapter { + public static Stairs.Shape fromBukkitStair(org.bukkit.block.data.type.Stairs.Shape shape) { + switch(shape) { + case STRAIGHT: + return Stairs.Shape.STRAIGHT; + case INNER_LEFT: + return Stairs.Shape.INNER_LEFT; + case OUTER_LEFT: + return Stairs.Shape.OUTER_LEFT; + case INNER_RIGHT: + return Stairs.Shape.INNER_RIGHT; + case OUTER_RIGHT: + return Stairs.Shape.OUTER_RIGHT; + default: + throw new IllegalStateException(); + } + } + + public static Bisected.Half fromBukkitHalf(org.bukkit.block.data.Bisected.Half half) { + switch(half) { + case BOTTOM: + return Bisected.Half.BOTTOM; + case TOP: + return Bisected.Half.TOP; + default: + throw new IllegalStateException(); + } + } + + public static BlockFace fromBukkitBlockFace(org.bukkit.block.BlockFace face) { + switch(face) { + case DOWN: + return BlockFace.DOWN; + case UP: + return BlockFace.UP; + case NORTH_WEST: + return BlockFace.NORTH_WEST; + case NORTH_EAST: + return BlockFace.NORTH_EAST; + case SOUTH_EAST: + return BlockFace.SOUTH_EAST; + case SOUTH_WEST: + return BlockFace.SOUTH_WEST; + case NORTH_NORTH_WEST: + return BlockFace.NORTH_NORTH_WEST; + case WEST_NORTH_WEST: + return BlockFace.WEST_NORTH_WEST; + case WEST_SOUTH_WEST: + return BlockFace.WEST_SOUTH_WEST; + case SOUTH_SOUTH_WEST: + return BlockFace.SOUTH_SOUTH_WEST; + case EAST_NORTH_EAST: + return BlockFace.EAST_NORTH_EAST; + case WEST: + return BlockFace.WEST; + case SOUTH: + return BlockFace.SOUTH; + case EAST: + return BlockFace.EAST; + case NORTH: + return BlockFace.NORTH; + case SELF: + return BlockFace.SELF; + case EAST_SOUTH_EAST: + return BlockFace.EAST_SOUTH_EAST; + case NORTH_NORTH_EAST: + return BlockFace.NORTH_NORTH_EAST; + case SOUTH_SOUTH_EAST: + return BlockFace.SOUTH_SOUTH_EAST; + default: + throw new IllegalStateException(); + } + } + +} diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitStairs.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java similarity index 77% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitStairs.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java index b09142ce8..8b0f86879 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitStairs.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.api.implementations.bukkit.world.block.data; +package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.data.Stairs; -import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; +import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import org.bukkit.block.data.BlockData; public class BukkitStairs extends BukkitBlockData implements Stairs { @@ -20,7 +20,7 @@ public class BukkitStairs extends BukkitBlockData implements Stairs { @Override public void setShape(Shape shape) { - stairs.setShape(BukkitEnumAdapter.fromTerraStair(shape)); + stairs.setShape(TerraEnumAdapter.fromTerraStair(shape)); } @Override @@ -30,7 +30,7 @@ public class BukkitStairs extends BukkitBlockData implements Stairs { @Override public void setHalf(Half half) { - stairs.setHalf(BukkitEnumAdapter.fromTerraHalf(half)); + stairs.setHalf(TerraEnumAdapter.fromTerraHalf(half)); } @Override @@ -40,7 +40,7 @@ public class BukkitStairs extends BukkitBlockData implements Stairs { @Override public void setFacing(BlockFace facing) { - stairs.setFacing(BukkitEnumAdapter.fromTerraBlockFace(facing)); + stairs.setFacing(TerraEnumAdapter.fromTerraBlockFace(facing)); } @Override diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitWaterlogged.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java similarity index 77% rename from src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitWaterlogged.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java index 076c89e4b..3f0f8e1d9 100644 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitWaterlogged.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.implementations.bukkit.world.block.data; +package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.generic.world.block.data.Waterlogged; -import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitBlockData; +import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import org.bukkit.block.data.BlockData; public class BukkitWaterlogged extends BukkitBlockData implements Waterlogged { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java new file mode 100644 index 000000000..317284259 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java @@ -0,0 +1,81 @@ +package com.dfsek.terra.bukkit.world.block.data; + + +import com.dfsek.terra.api.generic.world.block.BlockFace; +import org.bukkit.block.data.Bisected; +import org.bukkit.block.data.type.Stairs; + +public final class TerraEnumAdapter { + public static Stairs.Shape fromTerraStair(com.dfsek.terra.api.generic.world.block.data.Stairs.Shape shape) { + switch(shape) { + case STRAIGHT: + return Stairs.Shape.STRAIGHT; + case INNER_LEFT: + return Stairs.Shape.INNER_LEFT; + case OUTER_LEFT: + return Stairs.Shape.OUTER_LEFT; + case INNER_RIGHT: + return Stairs.Shape.INNER_RIGHT; + case OUTER_RIGHT: + return Stairs.Shape.OUTER_RIGHT; + default: + throw new IllegalStateException(); + } + } + + public static Bisected.Half fromTerraHalf(com.dfsek.terra.api.generic.world.block.data.Bisected.Half half) { + switch(half) { + case TOP: + return Bisected.Half.TOP; + case BOTTOM: + return Bisected.Half.BOTTOM; + default: + throw new IllegalStateException(); + } + } + + public static org.bukkit.block.BlockFace fromTerraBlockFace(BlockFace face) { + switch(face) { + case DOWN: + return org.bukkit.block.BlockFace.DOWN; + case UP: + return org.bukkit.block.BlockFace.UP; + case NORTH_WEST: + return org.bukkit.block.BlockFace.NORTH_WEST; + case NORTH_EAST: + return org.bukkit.block.BlockFace.NORTH_EAST; + case SOUTH_EAST: + return org.bukkit.block.BlockFace.SOUTH_EAST; + case SOUTH_WEST: + return org.bukkit.block.BlockFace.SOUTH_WEST; + case NORTH_NORTH_WEST: + return org.bukkit.block.BlockFace.NORTH_NORTH_WEST; + case WEST_NORTH_WEST: + return org.bukkit.block.BlockFace.WEST_NORTH_WEST; + case WEST_SOUTH_WEST: + return org.bukkit.block.BlockFace.WEST_SOUTH_WEST; + case SOUTH_SOUTH_WEST: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST; + case EAST_NORTH_EAST: + return org.bukkit.block.BlockFace.EAST_NORTH_EAST; + case WEST: + return org.bukkit.block.BlockFace.WEST; + case SOUTH: + return org.bukkit.block.BlockFace.SOUTH; + case EAST: + return org.bukkit.block.BlockFace.EAST; + case NORTH: + return org.bukkit.block.BlockFace.NORTH; + case SELF: + return org.bukkit.block.BlockFace.SELF; + case EAST_SOUTH_EAST: + return org.bukkit.block.BlockFace.EAST_SOUTH_EAST; + case NORTH_NORTH_EAST: + return org.bukkit.block.BlockFace.NORTH_NORTH_EAST; + case SOUTH_SOUTH_EAST: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST; + default: + throw new IllegalStateException(); + } + } +} diff --git a/src/main/resources/config.yml b/platforms/bukkit/src/main/resources/config.yml similarity index 100% rename from src/main/resources/config.yml rename to platforms/bukkit/src/main/resources/config.yml diff --git a/src/main/resources/lang/afr_sa.yml b/platforms/bukkit/src/main/resources/lang/afr_sa.yml similarity index 100% rename from src/main/resources/lang/afr_sa.yml rename to platforms/bukkit/src/main/resources/lang/afr_sa.yml diff --git a/src/main/resources/lang/de_de.yml b/platforms/bukkit/src/main/resources/lang/de_de.yml similarity index 100% rename from src/main/resources/lang/de_de.yml rename to platforms/bukkit/src/main/resources/lang/de_de.yml diff --git a/src/main/resources/lang/en_us.yml b/platforms/bukkit/src/main/resources/lang/en_us.yml similarity index 100% rename from src/main/resources/lang/en_us.yml rename to platforms/bukkit/src/main/resources/lang/en_us.yml diff --git a/src/main/resources/lang/es.yml b/platforms/bukkit/src/main/resources/lang/es.yml similarity index 100% rename from src/main/resources/lang/es.yml rename to platforms/bukkit/src/main/resources/lang/es.yml diff --git a/src/main/resources/lang/ja_jp.yml b/platforms/bukkit/src/main/resources/lang/ja_jp.yml similarity index 100% rename from src/main/resources/lang/ja_jp.yml rename to platforms/bukkit/src/main/resources/lang/ja_jp.yml diff --git a/src/main/resources/lang/pl.yml b/platforms/bukkit/src/main/resources/lang/pl.yml similarity index 100% rename from src/main/resources/lang/pl.yml rename to platforms/bukkit/src/main/resources/lang/pl.yml diff --git a/src/main/resources/lang/zh_cn.yml b/platforms/bukkit/src/main/resources/lang/zh_cn.yml similarity index 100% rename from src/main/resources/lang/zh_cn.yml rename to platforms/bukkit/src/main/resources/lang/zh_cn.yml diff --git a/src/main/resources/plugin.yml b/platforms/bukkit/src/main/resources/plugin.yml similarity index 86% rename from src/main/resources/plugin.yml rename to platforms/bukkit/src/main/resources/plugin.yml index b6edcf3a1..985ddc05f 100644 --- a/src/main/resources/plugin.yml +++ b/platforms/bukkit/src/main/resources/plugin.yml @@ -1,7 +1,8 @@ name: "Terra" -main: "com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin" +main: "com.dfsek.terra.bukkit.TerraBukkitPlugin" version: "@VERSION@" load: "STARTUP" +author: dfsek api-version: "1.16" description: "An insanely powerful free & open-source data-driven world generator." softdepend: [ "WorldEdit" ] diff --git a/platforms/bukkit/src/main/resources/world.yml b/platforms/bukkit/src/main/resources/world.yml new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/platforms/bukkit/src/main/resources/world.yml @@ -0,0 +1 @@ + diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts new file mode 100644 index 000000000..9a963f72d --- /dev/null +++ b/platforms/fabric/build.gradle.kts @@ -0,0 +1,20 @@ +plugins { + java + maven + idea +} + +group = "com.dfsek.terra.bukkit" + +repositories { + mavenCentral() + maven { url = uri("http://maven.enginehub.org/repo/") } + maven { url = uri("https://repo.codemc.org/repository/maven-public") } + maven { url = uri("https://papermc.io/repo/repository/maven-public/") } +} + +dependencies { + testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0") + implementation(project(":common")) +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 2f7b22af2..05ab1d83b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -8,3 +8,6 @@ */ rootProject.name = "Terra" +include("common") +include("platforms:bukkit") +include("platforms:fabric") diff --git a/src/main/java/com/dfsek/terra/api/gaea/GaeaPlugin.java b/src/main/java/com/dfsek/terra/api/gaea/GaeaPlugin.java deleted file mode 100644 index 69db4158c..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/GaeaPlugin.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.dfsek.terra.api.gaea; - -import com.dfsek.terra.api.gaea.lang.Language; -import org.bukkit.plugin.java.JavaPlugin; - -public abstract class GaeaPlugin extends JavaPlugin { - public abstract boolean isDebug(); - public abstract Language getLanguage(); -} diff --git a/src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java b/src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java deleted file mode 100644 index bde14d87f..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.dfsek.terra.api.gaea.profiler; - -import net.md_5.bungee.api.ChatColor; - -/** - * Enum to represent the "goal" of a value, whether it is desirable for the value to be high (e.g. Frequency), or low (e.g. Period) - */ -public enum Desire { - LOW(ChatColor.RED, ChatColor.GREEN), HIGH(ChatColor.GREEN, ChatColor.RED); - - private final ChatColor high; - private final ChatColor low; - - Desire(ChatColor high, ChatColor low) { - this.high = high; - this.low = low; - } - - /** - * Gets the color to display when the numerical value is higher than desired. - * - * @return ChatColor - color of the value. - */ - public ChatColor getHighColor() { - return high; - } - - /** - * Gets the color to display when the numerical value is lower than desired. - * - * @return ChatColor - color of the value. - */ - public ChatColor getLowColor() { - return low; - } -} diff --git a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/EnchantWithLevelsFunction.java b/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/EnchantWithLevelsFunction.java deleted file mode 100644 index c79ee28cb..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/EnchantWithLevelsFunction.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.dfsek.terra.api.gaea.structures.loot.functions; - -import com.dfsek.terra.api.gaea.util.GlueList; -import net.jafama.FastMath; -import org.bukkit.Bukkit; -import org.bukkit.enchantments.Enchantment; -import org.bukkit.inventory.ItemStack; -import org.json.simple.JSONArray; - -import java.util.Collections; -import java.util.List; -import java.util.Random; - -public class EnchantWithLevelsFunction implements Function { - private final int min; - private final int max; - private final JSONArray disabled; - - - public EnchantWithLevelsFunction(int min, int max, JSONArray disabled) { - this.max = max; - this.min = min; - this.disabled = disabled; - } - - /** - * Applies the function to an ItemStack. - * - * @param original The ItemStack on which to apply the function. - * @param r The Random instance to use. - * @return - ItemStack - The mutated ItemStack. - */ - @Override - public ItemStack apply(ItemStack original, Random r) { - double enchant = (r.nextDouble() * (max - min)) + min; - List possible = new GlueList<>(); - for(Enchantment ench : Enchantment.values()) { - if(ench.canEnchantItem(original) && (disabled == null || !this.disabled.contains(ench.getName()))) { - possible.add(ench); - } - } - int numEnchant = (r.nextInt((int) FastMath.abs(enchant)) / 10 + 1); - if(possible.size() >= numEnchant) { - Collections.shuffle(possible); - iter: - for(int i = 0; i < numEnchant; i++) { - Enchantment chosen = possible.get(i); - for(Enchantment ench : original.getEnchantments().keySet()) { - if(chosen.conflictsWith(ench)) continue iter; - } - int lvl = r.nextInt(1 + (int) (((enchant / 40 > 1) ? 1 : enchant / 40) * (chosen.getMaxLevel()))); - try { - original.addEnchantment(chosen, FastMath.max(lvl, 1)); - } catch(IllegalArgumentException e) { - Bukkit.getLogger().warning("[Gaea] Attempted to enchant " + original.getType() + " with " + chosen + " at level " + FastMath.max(lvl, 1) + ", but an unexpected exception occurred! Usually this is caused by a misbehaving enchantment plugin."); - } - } - } - return original; - } -} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/CustomTreeType.java b/src/main/java/com/dfsek/terra/api/gaea/tree/CustomTreeType.java deleted file mode 100755 index 275668bd3..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/CustomTreeType.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.dfsek.terra.api.gaea.tree; - -import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import com.dfsek.terra.api.gaea.tree.fractal.TreeGetter; -import com.dfsek.terra.api.gaea.tree.fractal.trees.Cactus; -import com.dfsek.terra.api.gaea.tree.fractal.trees.IceSpike; -import com.dfsek.terra.api.gaea.tree.fractal.trees.OakTree; -import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredPillar; -import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredTree; -import com.dfsek.terra.api.gaea.tree.fractal.trees.SmallShatteredPillar; -import com.dfsek.terra.api.gaea.tree.fractal.trees.SmallShatteredTree; -import com.dfsek.terra.api.gaea.tree.fractal.trees.SpruceTree; -import com.dfsek.terra.api.generic.world.vector.Location; - -import java.util.Random; - -public enum CustomTreeType implements TreeGetter { - SHATTERED_SMALL { - @Override - public FractalTree getTree(Location l, Random r) { - return new SmallShatteredTree(l, r); - } - }, - SHATTERED_LARGE { - @Override - public FractalTree getTree(Location l, Random r) { - return new ShatteredTree(l, r); - } - }, - GIANT_OAK { - @Override - public FractalTree getTree(Location l, Random r) { - return new OakTree(l, r); - } - }, - GIANT_SPRUCE { - @Override - public FractalTree getTree(Location l, Random r) { - return new SpruceTree(l, r); - } - }, - SMALL_SHATTERED_PILLAR { - @Override - public FractalTree getTree(Location l, Random r) { - return new SmallShatteredPillar(l, r); - } - }, - LARGE_SHATTERED_PILLAR { - @Override - public FractalTree getTree(Location l, Random r) { - return new ShatteredPillar(l, r); - } - }, - CACTUS { - @Override - public FractalTree getTree(Location l, Random r) { - return new Cactus(l, r); - } - }, - ICE_SPIKE { - @Override - public FractalTree getTree(Location l, Random r) { - return new IceSpike(l, r); - } - } -} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java b/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java deleted file mode 100644 index d19c5b14b..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/TreeType.java +++ /dev/null @@ -1,105 +0,0 @@ -package com.dfsek.terra.api.gaea.tree; - -import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.implementations.bukkit.world.block.BukkitMaterialData; -import com.google.common.collect.Sets; -import org.bukkit.Material; - -import java.util.Collections; -import java.util.Random; -import java.util.Set; -import java.util.stream.Collectors; - -public enum TreeType implements Tree { - SHATTERED_SMALL(null, Collections.singleton(Material.END_STONE)), - SHATTERED_LARGE(null, Collections.singleton(Material.END_STONE)), - GIANT_OAK(null, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - GIANT_SPRUCE(null, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - SMALL_SHATTERED_PILLAR(null, Collections.singleton(Material.END_STONE)), - LARGE_SHATTERED_PILLAR(null, Collections.singleton(Material.END_STONE)), - CACTUS(null, Sets.newHashSet(Material.SAND, Material.RED_SAND)), - ICE_SPIKE(null, Sets.newHashSet(Material.SNOW_BLOCK, Material.SNOW, Material.STONE, Material.GRASS_BLOCK)), - OAK(org.bukkit.TreeType.TREE, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - LARGE_OAK(org.bukkit.TreeType.BIG_TREE, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - SPRUCE(org.bukkit.TreeType.REDWOOD, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - LARGE_SPRUCE(org.bukkit.TreeType.TALL_REDWOOD, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - MEGA_SPRUCE(org.bukkit.TreeType.MEGA_REDWOOD, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - BIRCH(org.bukkit.TreeType.BIRCH, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - CHORUS_PLANT(org.bukkit.TreeType.CHORUS_PLANT, Sets.newHashSet(Material.END_STONE)), - ACACIA(org.bukkit.TreeType.ACACIA, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - TALL_BIRCH(org.bukkit.TreeType.TALL_BIRCH, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - JUNGLE(org.bukkit.TreeType.JUNGLE, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - SMALL_JUNGLE(org.bukkit.TreeType.SMALL_JUNGLE, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - JUNGLE_COCOA(org.bukkit.TreeType.COCOA_TREE, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - JUNGLE_BUSH(org.bukkit.TreeType.JUNGLE_BUSH, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - DARK_OAK(org.bukkit.TreeType.DARK_OAK, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - BROWN_MUSHROOM(org.bukkit.TreeType.BROWN_MUSHROOM, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL, Material.MYCELIUM, Material.NETHERRACK, Material.CRIMSON_NYLIUM, Material.WARPED_NYLIUM)), - RED_MUSHROOM(org.bukkit.TreeType.RED_MUSHROOM, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL, Material.MYCELIUM, Material.NETHERRACK, Material.CRIMSON_NYLIUM, Material.WARPED_NYLIUM)), - SWAMP_OAK(org.bukkit.TreeType.SWAMP, Sets.newHashSet(Material.GRASS_BLOCK, Material.DIRT, Material.PODZOL)), - WARPED_FUNGUS(org.bukkit.TreeType.WARPED_FUNGUS, Collections.singleton(Material.WARPED_NYLIUM)), - CRIMSON_FUNGUS(org.bukkit.TreeType.CRIMSON_FUNGUS, Collections.singleton(Material.CRIMSON_NYLIUM)); - - private final org.bukkit.TreeType vanillaType; - private final Set spawnable; - - TreeType(org.bukkit.TreeType vanillaType, Set spawnable) { - this.vanillaType = vanillaType; - this.spawnable = spawnable; - } - - public static com.dfsek.terra.api.gaea.tree.TreeType fromBukkit(org.bukkit.TreeType type) { - switch(type) { - case TREE: return OAK; - case BIRCH: return BIRCH; - case ACACIA: return ACACIA; - case SWAMP: return SWAMP_OAK; - case JUNGLE: return JUNGLE; - case REDWOOD: return SPRUCE; - case BIG_TREE: return LARGE_OAK; - case DARK_OAK: return DARK_OAK; - case COCOA_TREE: return JUNGLE_COCOA; - case TALL_BIRCH: return TALL_BIRCH; - case JUNGLE_BUSH: return JUNGLE_BUSH; - case CHORUS_PLANT: return CHORUS_PLANT; - case MEGA_REDWOOD: return MEGA_SPRUCE; - case RED_MUSHROOM: return RED_MUSHROOM; - case SMALL_JUNGLE: return SMALL_JUNGLE; - case TALL_REDWOOD: return LARGE_SPRUCE; - case WARPED_FUNGUS: return WARPED_FUNGUS; - case BROWN_MUSHROOM: return BROWN_MUSHROOM; - case CRIMSON_FUNGUS: return CRIMSON_FUNGUS; - default: throw new IllegalArgumentException(); - } - } - - public boolean isCustom() { - return this.vanillaType == null; - } - - public org.bukkit.TreeType getVanillaTreeType() { - return vanillaType; - } - - public CustomTreeType getCustomTreeType() { - if(getVanillaTreeType() != null) return null; - return CustomTreeType.valueOf(this.toString()); - } - - public boolean plant(Location l, Random r) { - if(this.getVanillaTreeType() == null) { - if(!spawnable.contains(l.subtract(0, 1, 0).getBlock().getType())) return false; - FractalTree tree = getCustomTreeType().getTree(l, r); - tree.grow(); - tree.plant(); - return true; - } - return l.getWorld().generateTree(l, this.getVanillaTreeType()); - } - - @Override - public Set getSpawnable() { - return spawnable.stream().map(BukkitMaterialData::new).collect(Collectors.toSet()); - } -} diff --git a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGetter.java b/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGetter.java deleted file mode 100644 index bd169bf22..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGetter.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.dfsek.terra.api.gaea.tree.fractal; - -import com.dfsek.terra.api.generic.world.vector.Location; - -import java.util.Random; - -public interface TreeGetter { - FractalTree getTree(Location l, Random r); -} diff --git a/src/main/java/com/dfsek/terra/api/gaea/util/WorldUtil.java b/src/main/java/com/dfsek/terra/api/gaea/util/WorldUtil.java deleted file mode 100644 index 757171aed..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/util/WorldUtil.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.dfsek.terra.api.gaea.util; - -import net.jafama.FastMath; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.Material; - -import java.util.List; - -public class WorldUtil { - public static int getHighestValidSpawnAt(Chunk chunk, int x, int z) { - int y; - for(y = chunk.getWorld().getMaxHeight() - 1; (chunk.getBlock(x, y, z).getType() != Material.GRASS_BLOCK - && chunk.getBlock(x, y, z).getType() != Material.GRAVEL - && chunk.getBlock(x, y, z).getType() != Material.PODZOL - && chunk.getBlock(x, y, z).getType() != Material.END_STONE - && chunk.getBlock(x, y, z).getType() != Material.DIRT - && chunk.getBlock(x, y, z).getType() != Material.STONE - && chunk.getBlock(x, y, z).getType() != Material.SAND - && chunk.getBlock(x, y, z).getType() != Material.RED_SAND - && chunk.getBlock(x, y, z).getType() != Material.COARSE_DIRT) && y > 0; y--) - ; - return y; - } - - public static int getHighestBlockAt(Chunk chunk, int x, int z) { - int y; - for(y = chunk.getWorld().getMaxHeight() - 1; (chunk.getBlock(x, y, z).getType().isAir()) && y > 0; y--) ; - return y; - } - - public static List getLocationListBetween(Location loc1, Location loc2) { - int lowX = FastMath.min(loc1.getBlockX(), loc2.getBlockX()); - int lowY = FastMath.min(loc1.getBlockY(), loc2.getBlockY()); - int lowZ = FastMath.min(loc1.getBlockZ(), loc2.getBlockZ()); - List locs = new GlueList<>(); - for(int x = 0; x <= FastMath.abs(loc1.getBlockX() - loc2.getBlockX()); x++) { - for(int y = 0; y <= FastMath.abs(loc1.getBlockY() - loc2.getBlockY()); y++) { - for(int z = 0; z <= FastMath.abs(loc1.getBlockZ() - loc2.getBlockZ()); z++) { - locs.add(new Location(loc1.getWorld(), (double) lowX + x, (double) lowY + y, (double) lowZ + z)); - } - } - } - return locs; - } -} diff --git a/src/main/java/com/dfsek/terra/api/gaea/world/Ore.java b/src/main/java/com/dfsek/terra/api/gaea/world/Ore.java deleted file mode 100755 index ad5b38472..000000000 --- a/src/main/java/com/dfsek/terra/api/gaea/world/Ore.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.dfsek.terra.api.gaea.world; - -import org.bukkit.block.data.BlockData; - -public class Ore { - private final int contChance; - private final BlockData oreMaterial; - - public Ore(BlockData oreMaterial, int contChance) { - this.contChance = contChance; - this.oreMaterial = oreMaterial; - } - - public int getContChance() { - return contChance; - } - - public BlockData getType() { - return oreMaterial; - } -} diff --git a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitEnumAdapter.java b/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitEnumAdapter.java deleted file mode 100644 index 550c3def7..000000000 --- a/src/main/java/com/dfsek/terra/api/implementations/bukkit/world/block/data/BukkitEnumAdapter.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.dfsek.terra.api.implementations.bukkit.world.block.data; - -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.data.Bisected; -import com.dfsek.terra.api.generic.world.block.data.Stairs; - -public final class BukkitEnumAdapter { - public static Stairs.Shape fromBukkitStair(org.bukkit.block.data.type.Stairs.Shape shape) { - switch(shape) { - case STRAIGHT: - return Stairs.Shape.STRAIGHT; - case INNER_LEFT: - return Stairs.Shape.INNER_LEFT; - case OUTER_LEFT: - return Stairs.Shape.OUTER_LEFT; - case INNER_RIGHT: - return Stairs.Shape.INNER_RIGHT; - case OUTER_RIGHT: - return Stairs.Shape.OUTER_RIGHT; - default: - throw new IllegalStateException(); - } - } - - public static org.bukkit.block.data.type.Stairs.Shape fromTerraStair(Stairs.Shape shape) { - switch(shape) { - case STRAIGHT: - return org.bukkit.block.data.type.Stairs.Shape.STRAIGHT; - case INNER_LEFT: - return org.bukkit.block.data.type.Stairs.Shape.INNER_LEFT; - case OUTER_LEFT: - return org.bukkit.block.data.type.Stairs.Shape.OUTER_LEFT; - case INNER_RIGHT: - return org.bukkit.block.data.type.Stairs.Shape.INNER_RIGHT; - case OUTER_RIGHT: - return org.bukkit.block.data.type.Stairs.Shape.OUTER_RIGHT; - default: - throw new IllegalStateException(); - } - } - - public static Bisected.Half fromBukkitHalf(org.bukkit.block.data.Bisected.Half half) { - switch(half) { - case BOTTOM: - return Bisected.Half.BOTTOM; - case TOP: - return Bisected.Half.TOP; - default: - throw new IllegalStateException(); - } - } - - public static org.bukkit.block.data.Bisected.Half fromTerraHalf(Bisected.Half half) { - switch(half) { - case TOP: - return org.bukkit.block.data.Bisected.Half.TOP; - case BOTTOM: - return org.bukkit.block.data.Bisected.Half.BOTTOM; - default: - throw new IllegalStateException(); - } - } - - public static BlockFace fromBukkitBlockFace(org.bukkit.block.BlockFace face) { - switch(face) { - case DOWN: - return BlockFace.DOWN; - case UP: - return BlockFace.UP; - case NORTH_WEST: - return BlockFace.NORTH_WEST; - case NORTH_EAST: - return BlockFace.NORTH_EAST; - case SOUTH_EAST: - return BlockFace.SOUTH_EAST; - case SOUTH_WEST: - return BlockFace.SOUTH_WEST; - case NORTH_NORTH_WEST: - return BlockFace.NORTH_NORTH_WEST; - case WEST_NORTH_WEST: - return BlockFace.WEST_NORTH_WEST; - case WEST_SOUTH_WEST: - return BlockFace.WEST_SOUTH_WEST; - case SOUTH_SOUTH_WEST: - return BlockFace.SOUTH_SOUTH_WEST; - case EAST_NORTH_EAST: - return BlockFace.EAST_NORTH_EAST; - case WEST: - return BlockFace.WEST; - case SOUTH: - return BlockFace.SOUTH; - case EAST: - return BlockFace.EAST; - case NORTH: - return BlockFace.NORTH; - case SELF: - return BlockFace.SELF; - case EAST_SOUTH_EAST: - return BlockFace.EAST_SOUTH_EAST; - case NORTH_NORTH_EAST: - return BlockFace.NORTH_NORTH_EAST; - case SOUTH_SOUTH_EAST: - return BlockFace.SOUTH_SOUTH_EAST; - default: - throw new IllegalStateException(); - } - } - - public static org.bukkit.block.BlockFace fromTerraBlockFace(BlockFace face) { - switch(face) { - case DOWN: - return org.bukkit.block.BlockFace.DOWN; - case UP: - return org.bukkit.block.BlockFace.UP; - case NORTH_WEST: - return org.bukkit.block.BlockFace.NORTH_WEST; - case NORTH_EAST: - return org.bukkit.block.BlockFace.NORTH_EAST; - case SOUTH_EAST: - return org.bukkit.block.BlockFace.SOUTH_EAST; - case SOUTH_WEST: - return org.bukkit.block.BlockFace.SOUTH_WEST; - case NORTH_NORTH_WEST: - return org.bukkit.block.BlockFace.NORTH_NORTH_WEST; - case WEST_NORTH_WEST: - return org.bukkit.block.BlockFace.WEST_NORTH_WEST; - case WEST_SOUTH_WEST: - return org.bukkit.block.BlockFace.WEST_SOUTH_WEST; - case SOUTH_SOUTH_WEST: - return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST; - case EAST_NORTH_EAST: - return org.bukkit.block.BlockFace.EAST_NORTH_EAST; - case WEST: - return org.bukkit.block.BlockFace.WEST; - case SOUTH: - return org.bukkit.block.BlockFace.SOUTH; - case EAST: - return org.bukkit.block.BlockFace.EAST; - case NORTH: - return org.bukkit.block.BlockFace.NORTH; - case SELF: - return org.bukkit.block.BlockFace.SELF; - case EAST_SOUTH_EAST: - return org.bukkit.block.BlockFace.EAST_SOUTH_EAST; - case NORTH_NORTH_EAST: - return org.bukkit.block.BlockFace.NORTH_NORTH_EAST; - case SOUTH_SOUTH_EAST: - return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST; - default: - throw new IllegalStateException(); - } - } -} diff --git a/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java b/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java deleted file mode 100644 index ef2f3afbc..000000000 --- a/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.dfsek.terra.async; - -import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.api.generic.world.vector.Vector3; -import com.dfsek.terra.api.implementations.bukkit.BukkitWorld; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import com.dfsek.terra.generation.items.TerraStructure; -import com.dfsek.terra.procgen.GridSpawn; -import com.dfsek.terra.structure.Rotation; -import com.dfsek.terra.structure.Structure; -import org.bukkit.Location; -import org.bukkit.World; -import org.jetbrains.annotations.NotNull; - -import java.util.Random; -import java.util.function.Consumer; - -/** - * Runnable to locate structures asynchronously - */ -public class AsyncStructureFinder extends AsyncFeatureFinder { - public AsyncStructureFinder(TerraBiomeGrid grid, TerraStructure target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraBukkitPlugin main) { - super(grid, target, origin, startRadius, maxRadius, callback, main); - setSearchSize(target.getSpawn().getWidth() + 2 * target.getSpawn().getSeparation()); - } - - /** - * 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 - */ - public boolean isValid(int x, int z, TerraStructure target) { - World world = getWorld(); - com.dfsek.terra.api.generic.world.vector.Location spawn = target.getSpawn().getChunkSpawn(x, z, world.getSeed()).toLocation(new BukkitWorld(world)); - if(!((UserDefinedBiome) grid.getBiome(spawn)).getConfig().getStructures().contains(target)) return false; - Random r2 = new FastRandom(spawn.hashCode()); - Structure struc = target.getStructures().get(r2); - Rotation rotation = Rotation.fromDegrees(r2.nextInt(4) * 90); - for(int y = target.getSpawnStart().get(r2); y > target.getBound().getMin(); y--) { - if(!target.getBound().isInRange(y)) return false; - spawn.setY(y); - if(!struc.checkSpawns(spawn, rotation, main)) continue; - return true; - } - return false; - } - - @Override - public Vector3 finalizeVector(Vector3 orig) { - GridSpawn spawn = target.getSpawn(); - return spawn.getChunkSpawn(orig.getBlockX(), orig.getBlockZ(), world.getSeed()); - } -} diff --git a/src/main/java/com/dfsek/terra/config/loaders/StructureLoader.java b/src/main/java/com/dfsek/terra/config/loaders/StructureLoader.java deleted file mode 100644 index 3f29eca06..000000000 --- a/src/main/java/com/dfsek/terra/config/loaders/StructureLoader.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.dfsek.terra.config.loaders; - -import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.config.files.Loader; -import com.dfsek.terra.structure.Structure; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Type; - -public class StructureLoader implements TypeLoader { - private final Loader loader; - - public StructureLoader(Loader loader) { - this.loader = loader; - } - - @Override - public Structure load(Type type, Object o, ConfigLoader configLoader) throws LoadException { - try(InputStream stream = loader.get("structures/data/" + o + ".tstructure")) { - return Structure.fromStream(stream); - } catch(IOException | ClassNotFoundException e) { - throw new LoadException("Unable to load structure", e); - } - } -} diff --git a/src/main/java/com/dfsek/terra/config/loaders/config/StructureFeatureLoader.java b/src/main/java/com/dfsek/terra/config/loaders/config/StructureFeatureLoader.java deleted file mode 100644 index 3621fb395..000000000 --- a/src/main/java/com/dfsek/terra/config/loaders/config/StructureFeatureLoader.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.dfsek.terra.config.loaders.config; - -import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.structure.features.EntityFeature; -import com.dfsek.terra.structure.features.Feature; -import com.dfsek.terra.util.MaterialSet; -import org.bukkit.entity.EntityType; - -import java.lang.reflect.Type; -import java.util.Map; - -@SuppressWarnings({"unchecked", "SwitchStatementWithTooFewBranches"}) // We will do more features laterTM -public class StructureFeatureLoader implements TypeLoader { - @Override - public Feature load(Type type, Object o, ConfigLoader configLoader) throws LoadException { - Map map = (Map) o; - switch((String) map.get("type")) { - case "ENTITY_FEATURE": - MaterialSet stand = (MaterialSet) configLoader.loadType(MaterialSet.class, map.get("spawnable-on")); - MaterialSet in = (MaterialSet) configLoader.loadType(MaterialSet.class, map.get("spawnable-in")); - Range amount = (Range) configLoader.loadType(Range.class, map.get("amount")); - EntityType entityType = (EntityType) configLoader.loadType(EntityType.class, map.get("entity")); - Integer height = (Integer) configLoader.loadType(Integer.class, map.get("in-height")); - return new EntityFeature(entityType, amount, stand, in, height); - default: - throw new LoadException("Invalid feature type: \"" + map.get("type") + "\""); - } - } -} diff --git a/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java b/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java deleted file mode 100644 index dfe02f06a..000000000 --- a/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.dfsek.terra.procgen.voxel; - -import org.bukkit.util.Vector; - -public class Cylinder extends VoxelGeometry { - public Cylinder(Vector start, int rad, int height) { - - } -} diff --git a/src/main/java/com/dfsek/terra/structure/InitializationException.java b/src/main/java/com/dfsek/terra/structure/InitializationException.java deleted file mode 100644 index 6d38ede96..000000000 --- a/src/main/java/com/dfsek/terra/structure/InitializationException.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dfsek.terra.structure; - -import org.bukkit.Location; -import org.jetbrains.annotations.Nullable; - -@SuppressWarnings("unused") -public class InitializationException extends Exception { - private static final long serialVersionUID = -3817726044758088486L; - private final Location worldLoc; - - public InitializationException(String message, @Nullable Location worldLoc) { - super(message); - this.worldLoc = worldLoc == null ? null : worldLoc.clone(); - } - - @Override - public String getMessage() { - return super.getMessage() + " (at location: " + worldLoc.toString() + ")"; - } - - @Nullable - public Location getWorldLoc() { - return worldLoc; - } -} diff --git a/src/main/java/com/dfsek/terra/structure/Structure.java b/src/main/java/com/dfsek/terra/structure/Structure.java deleted file mode 100644 index 7c7e0dac7..000000000 --- a/src/main/java/com/dfsek/terra/structure/Structure.java +++ /dev/null @@ -1,353 +0,0 @@ -package com.dfsek.terra.structure; - -import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.generic.world.vector.Vector2; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; -import com.dfsek.terra.debug.Debug; -import net.jafama.FastMath; -import org.bukkit.Chunk; -import org.jetbrains.annotations.NotNull; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; -import java.util.HashSet; -import java.util.UUID; -import java.util.function.Consumer; - -import static com.dfsek.terra.util.structure.RotationUtil.getRotatedCoords; - -@SuppressWarnings("unused") -public class Structure implements Serializable { - private static final long serialVersionUID = -6664585217063842035L; - private final StructureContainedBlock[][][] structure; - private final StructureInfo structureInfo; - private final String id; - private final UUID uuid; - private final HashSet spawns; - private final HashSet inventories; - - public Structure(@NotNull Location l1, @NotNull Location l2, @NotNull String id) throws InitializationException { - 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++) { - Block b = Objects.requireNonNull(l1.getWorld()).getBlockAt(l1.clone().add(x, y, z)); - BlockState state = b.getState(); - BlockData d = b.getBlockData(); - boolean useState = true; - StructureContainedBlock.Pull pull = StructureContainedBlock.Pull.NONE; - int pullOffset = 0; - StructureSpawnRequirement requirement = StructureSpawnRequirement.BLANK; - try { - if(state instanceof Sign) { // Magic sign stuff - Sign s = (Sign) b.getState(); - if(s.getLine(0).equals("[TERRA]")) { - try { - d = Bukkit.createBlockData(s.getLine(2) + s.getLine(3)); - useState = false; - if(s.getLine(1).equals("[CENTER]")) { - centerX = x; - centerZ = z; - } else if(s.getLine(1).startsWith("[SPAWN=") && s.getLine(1).endsWith("]")) { - String og = s.getLine(1); - String spawn = og.substring(og.indexOf("=") + 1, og.length() - 1); - try { - requirement = StructureSpawnRequirement.valueOf(spawn.toUpperCase()); - } catch(IllegalArgumentException e) { - throw new InitializationException("Invalid spawn type: " + spawn, b.getLocation()); - } - } else if(s.getLine(1).startsWith("[PULL=") && s.getLine(1).endsWith("]")) { - String og = s.getLine(1); - String spawn = og.substring(og.indexOf("=") + 1, og.indexOf("_")); - pullOffset = Integer.parseInt(og.substring(og.indexOf("_") + 1, og.length() - 1)); - try { - pull = StructureContainedBlock.Pull.valueOf(spawn); - } catch(IllegalArgumentException e) { - throw new InitializationException("Invalid pull type: " + spawn, b.getLocation()); - } - } else { - throw new InitializationException("Invalid Magic Sign: \"" + s.getLine(1) + "\"", b.getLocation()); - } - } catch(IllegalArgumentException e) { - throw new InitializationException("Invalid Block Data on sign: \"" + s.getLine(2) + s.getLine(3) + "\"", b.getLocation()); - } - } - } - } catch(StringIndexOutOfBoundsException e) { - throw new InitializationException("Invalid sign.", b.getLocation()); - } - StructureContainedBlock block = new StructureContainedBlock(x, y, z, useState ? state : null, d, requirement, pull, pullOffset); - if(state instanceof BlockInventoryHolder) { - inventories.add(new StructureContainedInventory(((BlockInventoryHolder) state).getInventory(), 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)); - } - - @NotNull - public static Structure load(@NotNull File f) throws IOException { - try { - return fromFile(f); - } catch(ClassNotFoundException e) { - throw new IllegalArgumentException("Provided file does not contain a GaeaStructure."); - } - } - - /** - * Load a structure from a file. - * - * @param f File to load from - * @return The structure loaded - * @throws IOException If file access error occurs - * @throws ClassNotFoundException If structure data is invalid. - */ - @NotNull - private static Structure fromFile(@NotNull File f) throws IOException, ClassNotFoundException { - ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f)); - Object o = ois.readObject(); - ois.close(); - return (Structure) o; - } - - @NotNull - public static Structure fromStream(@NotNull InputStream f) throws IOException, ClassNotFoundException { - ObjectInputStream ois = new ObjectInputStream(f); - Object o = ois.readObject(); - ois.close(); - return (Structure) o; - } - - private static void toFile(@NotNull Serializable o, @NotNull File f) throws IOException { - ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f)); - oos.writeObject(o); - oos.close(); - } - - public StructureContainedBlock[][][] getRawStructure() { - return structure; - } - - /** - * Paste the structure at a Location, ignoring chunk boundaries. - * - * @param origin Origin location - * @param r Rotation - */ - public void paste(@NotNull Location origin, Rotation r, TerraBukkitPlugin main) { - Range xRange = getRange(Rotation.Axis.X, r); - Range zRange = getRange(Rotation.Axis.Z, r); - this.executeForBlocksInRange(xRange, getRange(Rotation.Axis.Y, r), zRange, block -> pasteBlock(block, origin, r, main.getHandle()), r); - } - - /** - * Paste a single StructureDefinedBlock at an origin location, offset by its coordinates. - * - * @param block The block to paste - * @param origin The origin location - * @param r The rotation of the structure - */ - private void pasteBlock(StructureContainedBlock block, Location origin, Rotation r, WorldHandle handle) { - /* - BlockData data = block.getBlockData().clone(); - if(!data.getMaterial().equals(Material.STRUCTURE_VOID)) { - - Location loc = origin.clone().add(block.getX(), block.getY(), block.getZ()); - Block worldBlock = loc.getBlock(); - - main: - while(worldBlock.isEmpty()) { - if(worldBlock.getY() > 255 || worldBlock.getY() < 0) return; - if(block.getPull() == null) break; - switch(block.getPull()) { - case UP: - worldBlock = worldBlock.getRelative(BlockFace.UP); - break; - case DOWN: - worldBlock = worldBlock.getRelative(BlockFace.DOWN); - break; - default: - break main; - } - } - int offset = block.getPullOffset(); - if(offset != 0) - worldBlock = worldBlock.getRelative((offset > 0) ? BlockFace.UP : BlockFace.DOWN, FastMath.abs(offset)); - - RotationUtil.rotateBlockData(data, r); - - handle.setBlockData(worldBlock, data, false); - if(block.getState() != null) { - block.getState().getState(worldBlock.getState()).update(true, false); - } - } - - */ - } - - /** - * 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 exec Consumer to execute for each block. - * @param r Rotation - */ - private void executeForBlocksInRange(Range xM, Range yM, Range zM, Consumer 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); - 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]; - exec.accept(new StructureContainedBlock(x - getStructureInfo().getCenterX(), y, z - getStructureInfo().getCenterZ(), b.getState(), b.getBlockData(), b.getRequirement(), b.getPull(), b.getPullOffset())); - } - } - } - } - } - - /** - * Get GaeaStructureInfo object - * - * @return Structure Info - */ - @NotNull - public StructureInfo getStructureInfo() { - return structureInfo; - } - - /** - * Test whether a set of coordinates is within the current structure - * - * @param x X coordinate - * @param y Y coordinate - * @param z Z coordinate - * @return True if coordinate set is in structure, false if it is not. - */ - private boolean isInStructure(int x, int y, int z) { - return x < structureInfo.getSizeX() && y < structureInfo.getSizeY() && z < structureInfo.getSizeZ() && x >= 0 && y >= 0 && z >= 0; - } - - @NotNull - public Range getRange(@NotNull Rotation.Axis a, @NotNull Rotation r) { - if(a.equals(Rotation.Axis.Y)) return getRawRange(a); - Vector2 center = new Vector2(structureInfo.getCenterX(), structureInfo.getCenterZ()); - Range x = getRawRange(Rotation.Axis.X); - Range z = getRawRange(Rotation.Axis.Z); - 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(Rotation.Axis.X)) - return new Range((int) FastMath.floor(FastMath.min(min.getX(), max.getX())), (int) FastMath.ceil(FastMath.max(min.getX(), max.getX())) + 1); - else - return new Range((int) FastMath.floor(FastMath.min(min.getZ(), max.getZ())), (int) FastMath.ceil(FastMath.max(min.getZ(), max.getZ())) + 1); - } - - @NotNull - private Range getRawRange(@NotNull Rotation.Axis a) { - switch(a) { - case X: - return new Range(0, structureInfo.getSizeX()); - case Y: - return new Range(0, structureInfo.getSizeY()); - case Z: - return new Range(0, structureInfo.getSizeZ()); - default: - throw new IllegalArgumentException(); - } - } - - public boolean checkSpawns(Location origin, Rotation r, TerraBukkitPlugin main) { - /* - for(StructureContainedBlock b : spawns) { - Vector2 rot = getRotatedCoords(new Vector2(b.getX() - structureInfo.getCenterX(), b.getZ() - structureInfo.getCenterZ()), r); - if(!b.getRequirement().getInstance(origin.getWorld(), main).matches((int) rot.getX() + origin.getBlockX(), origin.getBlockY() + b.getY(), (int) rot.getZ() + origin.getBlockZ())) - return false; - } - return true; - - */ - return false; - } - - public HashSet getSpawns() { - return spawns; - } - - public HashSet getInventories() { - return inventories; - } - - /** - * 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 - */ - public void paste(Location origin, Chunk chunk, Rotation r, TerraBukkitPlugin main) { - 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()); - if(intersectX == null || intersectZ == null) return; - executeForBlocksInRange(intersectX, getRange(Rotation.Axis.Y, r), intersectZ, block -> pasteBlock(block, origin, r, main.getHandle()), r); - Debug.info(intersectX.toString() + " : " + intersectZ.toString()); - } - - /** - * From an origin location (First bound) fetch the second bound. - * - * @param origin Origin location - * @return Other bound location - */ - public Location getOtherBound(Location origin) { - return origin.clone().add(structureInfo.getSizeX(), structureInfo.getSizeY(), structureInfo.getSizeZ()); - } - - /** - * Save the structure to a file - * - * @param f File to save to - * @throws IOException If file access error occurs - */ - public void save(@NotNull File f) throws IOException { - toFile(this, f); - } - - @NotNull - public String getId() { - return id; - } - - @NotNull - public UUID getUuid() { - return uuid; - } - -} diff --git a/src/main/java/com/dfsek/terra/structure/StructureContainedBlock.java b/src/main/java/com/dfsek/terra/structure/StructureContainedBlock.java deleted file mode 100644 index 0660288ee..000000000 --- a/src/main/java/com/dfsek/terra/structure/StructureContainedBlock.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.dfsek.terra.structure; - -import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.structure.serialize.SerializableBlockData; -import com.dfsek.terra.structure.serialize.block.SerializableBanner; -import com.dfsek.terra.structure.serialize.block.SerializableBlockState; -import com.dfsek.terra.structure.serialize.block.SerializableMonsterCage; -import com.dfsek.terra.structure.serialize.block.SerializableSign; -import org.bukkit.block.Banner; -import org.bukkit.block.BlockState; -import org.bukkit.block.CreatureSpawner; -import org.bukkit.block.Sign; -import org.bukkit.block.data.BlockData; - -import java.io.Serializable; - -public class StructureContainedBlock implements Serializable { - private static final long serialVersionUID = 6143969483382710947L; - private final SerializableBlockData bl; - private final Pull pull; - private final int pullOffset; - private final int x; - private final int y; - private final int z; - private final SerializableBlockState state; - private final StructureSpawnRequirement requirement; - private transient BlockData data; - - 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 + ")."); - this.state = new SerializableSign((org.bukkit.block.Sign) state); - } else if(state instanceof CreatureSpawner) { - 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 + ")."); - this.state = new SerializableBanner((Banner) state); - } else this.state = null; - this.x = x; - this.y = y; - this.z = z; - this.bl = new SerializableBlockData(d); - this.requirement = spawn; - 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; - this.y = y; - this.z = z; - this.bl = new SerializableBlockData(d); - this.requirement = spawn; - this.pull = pull; - this.pullOffset = pullOffset; - } - - public StructureSpawnRequirement getRequirement() { - return requirement; - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public int getZ() { - return z; - } - - public BlockData getBlockData() { - if(data == null) { - data = bl.getData(); - } - return data; - } - - public Pull getPull() { - return pull; - } - - public int getPullOffset() { - return pullOffset; - } - - public SerializableBlockState getState() { - return state; - } - - public enum Pull { - UP, NONE, DOWN - } -} diff --git a/src/main/java/com/dfsek/terra/structure/StructureContainedInventory.java b/src/main/java/com/dfsek/terra/structure/StructureContainedInventory.java deleted file mode 100644 index 3e2527f4d..000000000 --- a/src/main/java/com/dfsek/terra/structure/StructureContainedInventory.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.dfsek.terra.structure; - -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; - -import java.io.Serializable; - -public class StructureContainedInventory implements Serializable { - private 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(); - y = link.getY(); - z = link.getZ(); - if(stack == null) { - uid = 0; - return; - } - uid = stack.getAmount(); - } - - public int getUid() { - return uid; - } - - public int getX() { - return x; - } - - public int getY() { - return y; - } - - public int getZ() { - return z; - } -} diff --git a/src/main/java/com/dfsek/terra/structure/StructureInfo.java b/src/main/java/com/dfsek/terra/structure/StructureInfo.java deleted file mode 100644 index 0cff30ca6..000000000 --- a/src/main/java/com/dfsek/terra/structure/StructureInfo.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.dfsek.terra.structure; - -import com.dfsek.terra.api.generic.world.vector.Vector2; -import net.jafama.FastMath; - -import java.io.Serializable; - -public class StructureInfo implements Serializable { - private 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; - this.sizeZ = sizeZ; - this.centerX = (int) center.getX(); - this.centerZ = (int) center.getZ(); - } - - public int getSizeX() { - return sizeX; - } - - public int getSizeZ() { - return sizeZ; - } - - public int getSizeY() { - return sizeY; - } - - public int getCenterX() { - return centerX; - } - - public int getCenterZ() { - return centerZ; - } - - public double getMaxHorizontal() { - return FastMath.sqrt(FastMath.pow(sizeX, 2) + FastMath.pow(sizeZ, 2)); - } -} diff --git a/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java b/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java deleted file mode 100644 index fd46c53f3..000000000 --- a/src/main/java/com/dfsek/terra/structure/StructureSpawnRequirement.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.dfsek.terra.structure; - -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; -import com.dfsek.terra.structure.spawn.AirSpawn; -import com.dfsek.terra.structure.spawn.BlankSpawn; -import com.dfsek.terra.structure.spawn.LandSpawn; -import com.dfsek.terra.structure.spawn.OceanSpawn; -import com.dfsek.terra.structure.spawn.Requirement; - -import java.io.Serializable; - -public enum StructureSpawnRequirement implements Serializable { - AIR { - @Override - public Requirement getInstance(World world, TerraBukkitPlugin main) { - return new AirSpawn(world, main); - } - }, OCEAN { - @Override - public Requirement getInstance(World world, TerraBukkitPlugin main) { - return new OceanSpawn(world, main); - } - }, LAND { - @Override - public Requirement getInstance(World world, TerraBukkitPlugin main) { - return new LandSpawn(world, main); - } - }, BLANK { - @Override - public Requirement getInstance(World world, TerraBukkitPlugin main) { - return new BlankSpawn(); - } - }; - private static final long serialVersionUID = -175639605885943679L; - - public abstract Requirement getInstance(World world, TerraBukkitPlugin main); -} diff --git a/src/main/java/com/dfsek/terra/structure/features/EntityFeature.java b/src/main/java/com/dfsek/terra/structure/features/EntityFeature.java deleted file mode 100644 index df7391a73..000000000 --- a/src/main/java/com/dfsek/terra/structure/features/EntityFeature.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.dfsek.terra.structure.features; - -import com.dfsek.terra.api.gaea.math.MathUtil; -import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.api.gaea.util.GlueList; -import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.structure.Rotation; -import com.dfsek.terra.structure.Structure; -import com.dfsek.terra.structure.StructureInfo; -import com.dfsek.terra.util.MaterialSet; -import net.jafama.FastMath; -import org.bukkit.Chunk; -import org.bukkit.Location; -import org.bukkit.block.Block; -import org.bukkit.block.BlockFace; -import org.bukkit.entity.EntityType; - -import java.util.List; -import java.util.Objects; -import java.util.Random; - -public class EntityFeature implements Feature { - private final EntityType type; - private final Range amount; - private final MaterialSet in; - private final MaterialSet stand; - private final int inSize; - - public EntityFeature(EntityType type, Range amount, MaterialSet stand, MaterialSet in, int inSize) { - this.type = type; - this.amount = amount; - this.in = in; - this.stand = stand; - this.inSize = inSize; - } - - private static boolean isInChunk(Chunk c, Location l) { - return FastMath.floorDiv(l.getBlockX(), 16) == c.getX() && FastMath.floorDiv(l.getBlockZ(), 16) == c.getZ(); - } - - private static List getLocations(Structure structure, Rotation r, Location origin, Random random, int number) { - StructureInfo info = structure.getStructureInfo(); - Range x = structure.getRange(Rotation.Axis.X, r); - Range y = structure.getRange(Rotation.Axis.Y, r); - Range z = structure.getRange(Rotation.Axis.Z, r); - - int cx = info.getCenterX(); - int cz = info.getCenterZ(); - List locations = new GlueList<>(); - for(int i = 0; i < number; i++) - locations.add(origin.clone().add(x.get(random) - cx, y.get(random), z.get(random) - cz)); - return locations; - } - - @Override - public void apply(Structure structure, Rotation r, Location l, Chunk chunk) { - Random random = new FastRandom(MathUtil.getCarverChunkSeed(chunk.getX(), chunk.getZ(), chunk.getWorld().getSeed())); - for(Location attempt : getLocations(structure, r, l, random, amount.get(random))) { - if(!isInChunk(chunk, attempt)) continue; // Don't attempt spawn if not in current chunk. - attemptSpawn(attempt, l); - } - } - - private void attemptSpawn(Location attempt, Location origin) { - boolean canSpawn = false; - while(attempt.getBlockY() >= origin.getBlockY()) { // Go down, see if valid spawns exist. - canSpawn = true; - Block on = attempt.getBlock(); - attempt.subtract(0, 1, 0); - - if(!stand.contains(on.getType())) { - canSpawn = false; - continue; - } - - for(int j = 1; j < inSize + 1; j++) - if(!in.contains(on.getRelative(BlockFace.UP, j).getType())) canSpawn = false; - - if(canSpawn) break; - } - if(canSpawn) { - Debug.info("Spawning entity at " + attempt); - Objects.requireNonNull(attempt.getWorld()).spawnEntity(attempt.add(0.5, 2, 0.5), type); // Add 0.5 to X & Z so entity spawns in center of block. - } - } - - @Override - public void apply(Structure structure, Rotation r, Location l, Random random) { - for(Location attempt : getLocations(structure, r, l, random, amount.get(random))) { - attemptSpawn(attempt, l); - } - } -} diff --git a/src/main/java/com/dfsek/terra/structure/features/Feature.java b/src/main/java/com/dfsek/terra/structure/features/Feature.java deleted file mode 100644 index 8046dac67..000000000 --- a/src/main/java/com/dfsek/terra/structure/features/Feature.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dfsek.terra.structure.features; - -import com.dfsek.terra.structure.Rotation; -import com.dfsek.terra.structure.Structure; -import org.bukkit.Chunk; -import org.bukkit.Location; - -import java.util.Random; - -public interface Feature { - void apply(Structure structure, Rotation r, Location l, Chunk chunk); - - void apply(Structure structure, Rotation r, Location l, Random random); -} diff --git a/src/main/java/com/dfsek/terra/structure/serialize/SerializableBlockData.java b/src/main/java/com/dfsek/terra/structure/serialize/SerializableBlockData.java deleted file mode 100644 index a22d0a2ae..000000000 --- a/src/main/java/com/dfsek/terra/structure/serialize/SerializableBlockData.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dfsek.terra.structure.serialize; - -import org.bukkit.Bukkit; -import org.bukkit.block.data.BlockData; - -import java.io.Serializable; - -public class SerializableBlockData implements Serializable { - private 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); - } -} diff --git a/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableBanner.java b/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableBanner.java deleted file mode 100644 index 36a2ae145..000000000 --- a/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableBanner.java +++ /dev/null @@ -1,52 +0,0 @@ -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.banner.PatternType; - -import java.io.Serializable; -import java.util.ArrayList; - -public class SerializableBanner implements SerializableBlockState { - private static final long serialVersionUID = 5298928608478640004L; - private final DyeColor base; - private final ArrayList patterns = new ArrayList<>(); - - public SerializableBanner(Banner banner) { - this.base = banner.getBaseColor(); - for(org.bukkit.block.banner.Pattern bukkitPattern : banner.getPatterns()) { - patterns.add(new Pattern(bukkitPattern.getPattern(), bukkitPattern.getColor())); - } - } - - @Override - public BlockState getState(BlockState orig) { - if(!(orig instanceof Banner)) throw new IllegalArgumentException("Provided BlockState is not a banner."); - Banner banner = (Banner) orig; - banner.setBaseColor(base); - for(Pattern pattern : patterns) { - banner.addPattern(new org.bukkit.block.banner.Pattern(pattern.getColor(), pattern.getType())); - } - return banner; - } - - private static final class Pattern implements Serializable { - private static final long serialVersionUID = -7802163816361757171L; - private final DyeColor color; - private final PatternType type; - - public Pattern(PatternType type, DyeColor color) { - this.color = color; - this.type = type; - } - - public DyeColor getColor() { - return color; - } - - public PatternType getType() { - return type; - } - } -} diff --git a/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableBlockState.java b/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableBlockState.java deleted file mode 100644 index 218db7cef..000000000 --- a/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableBlockState.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dfsek.terra.structure.serialize.block; - -import org.bukkit.block.BlockState; - -import java.io.Serializable; - -public interface SerializableBlockState extends Serializable { - long serialVersionUID = 5298928608478640000L; - - BlockState getState(BlockState orig); -} diff --git a/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableMonsterCage.java b/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableMonsterCage.java deleted file mode 100644 index 66d5d07af..000000000 --- a/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableMonsterCage.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.dfsek.terra.structure.serialize.block; - -import org.bukkit.block.BlockState; -import org.bukkit.block.CreatureSpawner; -import org.bukkit.entity.EntityType; - -public class SerializableMonsterCage implements SerializableBlockState { - private static final long serialVersionUID = 529892860847864007L; - private final EntityType type; - private final int minDelay; - private final int maxDelay; - private final int maxNear; - private final int playerRange; - private final int delay; - private final int count; - - public SerializableMonsterCage(CreatureSpawner orig) { - this.type = orig.getSpawnedType(); - this.minDelay = orig.getMinSpawnDelay(); - this.maxDelay = orig.getMaxSpawnDelay(); - this.maxNear = orig.getMaxNearbyEntities(); - this.playerRange = orig.getRequiredPlayerRange(); - 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!"); - CreatureSpawner spawner = (CreatureSpawner) orig; - spawner.setSpawnedType(type); - spawner.setMinSpawnDelay(minDelay); - spawner.setMaxSpawnDelay(maxDelay); - spawner.setMaxNearbyEntities(maxNear); - spawner.setRequiredPlayerRange(playerRange); - spawner.setDelay(delay); - spawner.setSpawnCount(count); - return spawner; - } -} diff --git a/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableSign.java b/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableSign.java deleted file mode 100644 index 9786e5c76..000000000 --- a/src/main/java/com/dfsek/terra/structure/serialize/block/SerializableSign.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.dfsek.terra.structure.serialize.block; - -import org.bukkit.block.BlockState; -import org.bukkit.block.Sign; - -public class SerializableSign implements SerializableBlockState { - private 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."); - Sign sign = (Sign) orig; - for(int i = 0; i < text.length; i++) { - sign.setLine(i, text[i]); - } - sign.setEditable(isEditable); - return sign; - } - - public String[] getLines() { - return text; - } - - public String getLine(int index) { - return text[index]; - } - - public boolean isEditable() { - return isEditable; - } -} diff --git a/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java deleted file mode 100644 index 6aaf48b97..000000000 --- a/src/main/java/com/dfsek/terra/structure/spawn/AirSpawn.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dfsek.terra.structure.spawn; - -import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.generation.config.WorldGenerator; - -public class AirSpawn extends Requirement { - public AirSpawn(World world, TerraBukkitPlugin main) { - super(world, main); - } - - @Override - public boolean matches(int x, int y, int z) { - TerraWorld tw = main.getWorld(world); - UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); - BiomeTemplate c = b.getConfig(); - if(y <= c.getSeaLevel()) return false; - double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); - return b.getGenerator().getNoise(world, x, y, z) + elevation <= 0; - } -} diff --git a/src/main/java/com/dfsek/terra/structure/spawn/BlankSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/BlankSpawn.java deleted file mode 100644 index 910d53cee..000000000 --- a/src/main/java/com/dfsek/terra/structure/spawn/BlankSpawn.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dfsek.terra.structure.spawn; - -public class BlankSpawn extends Requirement { - public BlankSpawn() { - super(null, null); - } - - @Override - public boolean matches(int x, int y, int z) { - return true; - } -} diff --git a/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java deleted file mode 100644 index bf891470f..000000000 --- a/src/main/java/com/dfsek/terra/structure/spawn/LandSpawn.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.dfsek.terra.structure.spawn; - -import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.generation.config.WorldGenerator; - -public class LandSpawn extends Requirement { - public LandSpawn(World world, TerraBukkitPlugin main) { - super(world, main); - } - - @Override - public boolean matches(int x, int y, int z) { - TerraWorld tw = main.getWorld(world); - UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); - double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); - return b.getGenerator().getNoise(world, x, y, z) + elevation > 0; - } -} diff --git a/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java b/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java deleted file mode 100644 index ba71262d0..000000000 --- a/src/main/java/com/dfsek/terra/structure/spawn/OceanSpawn.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dfsek.terra.structure.spawn; - -import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.generation.config.WorldGenerator; - -public class OceanSpawn extends Requirement { - public OceanSpawn(World world, TerraBukkitPlugin main) { - super(world, main); - } - - @Override - public boolean matches(int x, int y, int z) { - TerraWorld tw = main.getWorld(world); - UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); - BiomeTemplate c = b.getConfig(); - if(y > c.getSeaLevel()) return false; - double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); - return b.getGenerator().getNoise(world, x, y, z) + elevation <= 0; - } -} diff --git a/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java b/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java deleted file mode 100644 index 124f4a340..000000000 --- a/src/main/java/com/dfsek/terra/structure/spawn/Requirement.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.dfsek.terra.structure.spawn; - -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.implementations.bukkit.TerraBukkitPlugin; - -public abstract class Requirement { - protected final World world; - protected final TerraBukkitPlugin main; - - public Requirement(World world, TerraBukkitPlugin main) { - this.world = world; - this.main = main; - } - - public abstract boolean matches(int x, int y, int z); - - - public World getWorld() { - return world; - } -} diff --git a/src/main/java/com/dfsek/terra/util/StructureTypeEnum.java b/src/main/java/com/dfsek/terra/util/StructureTypeEnum.java deleted file mode 100644 index 0cbfdbdcf..000000000 --- a/src/main/java/com/dfsek/terra/util/StructureTypeEnum.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.dfsek.terra.util; - -import org.bukkit.StructureType; - -/** - * Enum to represent StructureType, which is a class for some reason. - */ -@SuppressWarnings("unused") -public enum StructureTypeEnum { - MINESHAFT(StructureType.MINESHAFT), - VILLAGE(StructureType.VILLAGE), - NETHER_FORTRESS(StructureType.NETHER_FORTRESS), - /** - * Currently the only one used. - */ - STRONGHOLD(StructureType.STRONGHOLD), - JUNGLE_PYRAMID(StructureType.JUNGLE_PYRAMID), - OCEAN_RUIN(StructureType.OCEAN_RUIN), - DESERT_PYRAMID(StructureType.DESERT_PYRAMID), - IGLOO(StructureType.IGLOO), - SWAMP_HUT(StructureType.SWAMP_HUT), - OCEAN_MONUMENT(StructureType.OCEAN_MONUMENT), - END_CITY(StructureType.END_CITY), - WOODLAND_MANSION(StructureType.WOODLAND_MANSION), - BURIED_TREASURE(StructureType.BURIED_TREASURE), - SHIPWRECK(StructureType.SHIPWRECK), - PILLAGER_OUTPOST(StructureType.PILLAGER_OUTPOST), - NETHER_FOSSIL(StructureType.NETHER_FOSSIL), - RUINED_PORTAL(StructureType.RUINED_PORTAL), - BASTION_REMNANT(StructureType.BASTION_REMNANT); - - private final StructureType type; - - StructureTypeEnum(StructureType type) { - this.type = type; - } - - public StructureType getType() { - return type; - } -} diff --git a/src/test/java/DistributionTest.java b/src/test/java/DistributionTest.java deleted file mode 100644 index 1d5928fc4..000000000 --- a/src/test/java/DistributionTest.java +++ /dev/null @@ -1,83 +0,0 @@ -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import net.jafama.FastMath; -import org.junit.jupiter.api.Test; - -class DistributionTest { - private static final double[] normalMap = new double[] {-0.8408907651901245D, -0.8200346231460571D, -0.8070776462554932D, -0.7970088720321655D, -0.7890776991844177D, -0.7819743156433105D, -0.7759857773780823D, -0.7706204056739807D, -0.765608549118042D, -0.7611993551254272D, -0.7569039463996887D, -0.7528656125068665D, -0.7492497563362122D, -0.7458332777023315D, -0.7424643039703369D, -0.7392163872718811D, -0.736059844493866D, -0.7332375049591064D, -0.7305010557174683D, -0.7277776598930359D, -0.7251102924346924D, -0.7227165699005127D, -0.7203239798545837D, -0.7179931998252869D, -0.7157421112060547D, -0.7135322690010071D, -0.71131432056427D, -0.7092097997665405D, -0.7071162462234497D, -0.7050217390060425D, -0.703119695186615D, -0.7011850476264954D, -0.6992706060409546D, -0.6974170207977295D, -0.6955324411392212D, -0.6937324404716492D, -0.6919872760772705D, -0.690233588218689D, -0.6885692477226257D, -0.6869722008705139D, -0.6852975487709045D, -0.683682382106781D, -0.6821723580360413D, -0.6806833744049072D, -0.679179310798645D, -0.6776503324508667D, -0.676136314868927D, -0.6746450662612915D, -0.6731522083282471D, -0.6717588305473328D, -0.6702994704246521D, -0.6689524054527283D, -0.6675862073898315D, -0.6662633419036865D, -0.6649606823921204D, -0.6636543273925781D, -0.6623714566230774D, -0.6610865592956543D, -0.6598274111747742D, -0.6585804224014282D, -0.6573819518089294D, -0.6561920642852783D, -0.6549379825592041D, -0.6537073254585266D, -0.6525376439094543D, -0.6513495445251465D, -0.650168240070343D, -0.649040162563324D, -0.6479091048240662D, -0.6467820405960083D, -0.6456737518310547D, -0.6445609331130981D, -0.6434952020645142D, -0.6424031257629395D, -0.6413089632987976D, -0.640256941318512D, -0.6391684412956238D, -0.638137936592102D, -0.6371254324913025D, -0.6361099481582642D, -0.6350630521774292D, -0.6339953541755676D, -0.6330388188362122D, -0.632024347782135D, -0.6310704946517944D, -0.6300620436668396D, -0.6290494799613953D, -0.6280747056007385D, -0.6271024346351624D, -0.6261362433433533D, -0.6251688599586487D, -0.6242944002151489D, -0.6233505606651306D, -0.622406542301178D, -0.6214921474456787D, -0.6205630302429199D, -0.619683563709259D, -0.6187522411346436D, -0.6178513169288635D, -0.6170046925544739D, -0.6161392331123352D, -0.615269660949707D, -0.6144152879714966D, -0.6135557293891907D, -0.6127009391784668D, -0.6117991209030151D, -0.6109536290168762D, -0.6101033091545105D, -0.6092590689659119D, -0.6084139347076416D, -0.6075553894042969D, -0.6067432165145874D, -0.6058894991874695D, -0.6050370335578918D, -0.6042441725730896D, -0.6034530401229858D, -0.6026210784912109D, -0.6018084287643433D, -0.6010326743125916D, -0.6002528071403503D, -0.5994450449943542D, -0.5986629128456116D, -0.5978666543960571D, -0.5971032977104187D, -0.5963031649589539D, -0.5955566167831421D, -0.5947844982147217D, -0.5940142869949341D, -0.5932715535163879D, -0.5925368666648865D, -0.5917928218841553D, -0.591031014919281D, -0.5903055667877197D, -0.5895851850509644D, -0.5888315439224243D, -0.5880893468856812D, -0.5873630046844482D, -0.5866444110870361D, -0.5859208106994629D, -0.5852057933807373D, -0.5844889879226685D, -0.5837893486022949D, -0.5830587148666382D, -0.582359254360199D, -0.5816157460212708D, -0.5809139013290405D, -0.5802302956581116D, -0.5795474052429199D, -0.5788565874099731D, -0.5781614184379578D, -0.5774743556976318D, -0.5767905712127686D, -0.5760961771011353D, -0.5754467248916626D, -0.5747898817062378D, -0.5741211175918579D, -0.5734619498252869D, -0.5728112459182739D, -0.5721414089202881D, -0.5714717507362366D, -0.5708272457122803D, -0.5701769590377808D, -0.5695428252220154D, -0.568885087966919D, -0.5682525038719177D, -0.5675948262214661D, -0.5669249296188354D, -0.5663014054298401D, -0.5656630992889404D, -0.5650165677070618D, -0.5643728971481323D, -0.5637710094451904D, -0.5631371736526489D, -0.562507152557373D, -0.5618733167648315D, -0.5612503290176392D, -0.560631513595581D, -0.5600159168243408D, -0.559416651725769D, -0.5587995052337646D, -0.5581864714622498D, -0.5575871467590332D, -0.556957483291626D, -0.5563494563102722D, -0.555757999420166D, -0.5551457405090332D, -0.5545571446418762D, -0.5539442300796509D, -0.5533522367477417D, -0.5527352094650269D, -0.5521476864814758D, -0.5515644550323486D, -0.5509964823722839D, -0.550428032875061D, -0.5498668551445007D, -0.5492658615112305D, -0.5486577749252319D, -0.5480945110321045D, -0.5475296378135681D, -0.5469772815704346D, -0.5463858246803284D, -0.5458088517189026D, -0.545259952545166D, -0.5447098016738892D, -0.5441542863845825D, -0.5436179041862488D, -0.5430275201797485D, -0.5424584746360779D, -0.5419116616249084D, -0.5413541197776794D, -0.5408090353012085D, -0.5402546525001526D, -0.5396901369094849D, -0.539120078086853D, -0.5385692715644836D, -0.5380025506019592D, -0.5374376773834229D, -0.5369035601615906D, -0.5363785624504089D, -0.5358348488807678D, -0.5352905988693237D, -0.5347356796264648D, -0.5341591238975525D, -0.5336212515830994D, -0.5330695509910583D, -0.5325397849082947D, -0.5319978594779968D, -0.5314696431159973D, -0.530921220779419D, -0.530373752117157D, -0.5298687219619751D, -0.529342770576477D, -0.5288130044937134D, -0.5282856822013855D, -0.5277521014213562D, -0.5272186994552612D, -0.526702880859375D, -0.5261659026145935D, -0.5256563425064087D, -0.5251585245132446D, -0.524644136428833D, -0.5240897536277771D, -0.5235958695411682D, -0.5230914354324341D, -0.5225777626037598D, -0.5220786929130554D, -0.5215602517127991D, -0.5210496187210083D, -0.5205234885215759D, -0.5199909210205078D, -0.5194736123085022D, -0.5189557075500488D, -0.5184388160705566D, -0.517956018447876D, -0.5174460411071777D, -0.5169391632080078D, -0.5164353251457214D, -0.5159274935722351D, -0.5154002904891968D, -0.5149046778678894D, -0.5143994092941284D, -0.5139294862747192D, -0.5134499669075012D, -0.5129679441452026D, -0.5124912261962891D, -0.511996328830719D, -0.5114986300468445D, -0.5110247135162354D, -0.5105308294296265D, -0.5100609064102173D, -0.5095614194869995D, -0.5090870261192322D, -0.5085906982421875D, -0.5081197619438171D, -0.5076301097869873D, -0.507135808467865D, -0.5066789388656616D, -0.5062170624732971D, -0.5057358145713806D, -0.5052729845046997D, -0.5048062205314636D, -0.5043444037437439D, -0.5038503408432007D, -0.5033678412437439D, -0.5029129981994629D, -0.5024451017379761D, -0.5019713640213013D, -0.501503586769104D, -0.5010541677474976D, -0.500596284866333D, -0.5001118183135986D, -0.49962663650512695D, -0.4991636574268341D, -0.49869197607040405D, -0.4982263445854187D, -0.4977402091026306D, -0.49727755784988403D, -0.496805876493454D, -0.49637076258659363D, -0.4958948493003845D, -0.49544137716293335D, -0.49501892924308777D, -0.4945528209209442D, -0.49409356713294983D, -0.49364787340164185D, -0.49319401383399963D, -0.49275630712509155D, -0.4923110902309418D, -0.4918690621852875D, -0.49141621589660645D, -0.49096524715423584D, -0.4905273914337158D, -0.4900781512260437D, -0.48962411284446716D, -0.4891759753227234D, -0.48872804641723633D, -0.4882771670818329D, -0.48784005641937256D, -0.48739326000213623D, -0.48694151639938354D, -0.48648712038993835D, -0.48605871200561523D, -0.4856131374835968D, -0.4851803183555603D, -0.4847318232059479D, -0.4842924177646637D, -0.48386046290397644D, -0.4834265112876892D, -0.4829675257205963D, -0.482522189617157D, -0.4820839762687683D, -0.48165363073349D, -0.4812239706516266D, -0.4807860255241394D, -0.4803447425365448D, -0.4798981845378876D, -0.4794575572013855D, -0.4790170192718506D, -0.47858935594558716D, -0.4781353175640106D, -0.477681040763855D, -0.477261483669281D, -0.4768490791320801D, -0.4764252305030823D, -0.47600477933883667D, -0.47555917501449585D, -0.4751377999782562D, -0.47470518946647644D, -0.47426924109458923D, -0.4738460183143616D, -0.47342449426651D, -0.4730163812637329D, -0.4726114571094513D, -0.4721759557723999D, -0.4717848598957062D, -0.4713689088821411D, -0.4709392488002777D, -0.47049304842948914D, -0.4700826108455658D, -0.4696255028247833D, -0.46921586990356445D, -0.46877801418304443D, -0.46836233139038086D, -0.46794429421424866D, -0.46752703189849854D, -0.4670995771884918D, -0.4666939377784729D, -0.46625566482543945D, -0.4658403992652893D, -0.4654417932033539D, -0.465023398399353D, -0.46460986137390137D, -0.46419557929039D, -0.46378859877586365D, -0.46336546540260315D, -0.46295180916786194D, -0.4625388979911804D, -0.46212026476860046D, -0.4617091715335846D, -0.46131056547164917D, -0.46089276671409607D, -0.4604875445365906D, -0.46008041501045227D, -0.4596766233444214D, -0.4592905044555664D, -0.45886731147766113D, -0.4584708511829376D, -0.458060622215271D, -0.457650750875473D, -0.4572262763977051D, -0.45681101083755493D, -0.4564330577850342D, -0.4560151696205139D, -0.4556240141391754D, -0.4552316963672638D, -0.4548242688179016D, -0.4544048309326172D, -0.4539957046508789D, -0.45359495282173157D, -0.4532042443752289D, -0.4528181552886963D, -0.4524168372154236D, -0.4519919157028198D, -0.4515584409236908D, -0.45118191838264465D, -0.45078909397125244D, -0.4504043459892273D, -0.4500110447406769D, -0.44961291551589966D, -0.44922786951065063D, -0.4488254189491272D, -0.448411762714386D, -0.44801002740859985D, -0.4476070702075958D, -0.4472062289714813D, -0.44680875539779663D, -0.44641414284706116D, -0.44601938128471375D, -0.4456106126308441D, -0.4452301263809204D, -0.44483858346939087D, -0.44447171688079834D, -0.44407233595848083D, -0.44368883967399597D, -0.44329920411109924D, -0.4429243206977844D, -0.4425082802772522D, -0.4421197474002838D, -0.4417261481285095D, -0.4413236379623413D, -0.44093117117881775D, -0.4405667185783386D, -0.4401840567588806D, -0.43980535864830017D, -0.43940675258636475D, -0.439028263092041D, -0.43865975737571716D, -0.4382753372192383D, -0.43788960576057434D, -0.4374869465827942D, -0.4371262192726135D, -0.4367597997188568D, -0.43636399507522583D, -0.4359838366508484D, -0.4355921745300293D, -0.4352045953273773D, -0.43481752276420593D, -0.4344243109226227D, -0.4340437948703766D, -0.433651864528656D, -0.43328702449798584D, -0.43291205167770386D, -0.43252551555633545D, -0.4321480095386505D, -0.4317898750305176D, -0.4314233064651489D, -0.43104124069213867D, -0.43066880106925964D, -0.430292546749115D, -0.4299023747444153D, -0.4295300245285034D, -0.42915427684783936D, -0.4287806749343872D, -0.42839178442955017D, -0.4280126392841339D, -0.427650511264801D, -0.4272746443748474D, -0.426890105009079D, -0.4265204966068268D, -0.4261537194252014D, -0.42576107382774353D, -0.4253731369972229D, -0.4249960482120514D, -0.424624502658844D, -0.424255907535553D, -0.42388004064559937D, -0.42350152134895325D, -0.42311522364616394D, -0.4227565824985504D, -0.42240461707115173D, -0.4220307767391205D, -0.4216674268245697D, -0.42131006717681885D, -0.420943945646286D, -0.4205697178840637D, -0.42019638419151306D, -0.41983455419540405D, -0.4194658100605011D, -0.4190995693206787D, -0.41873085498809814D, -0.4183567464351654D, -0.4179975688457489D, -0.4176383316516876D, -0.41729846596717834D, -0.41692838072776794D, -0.41655758023262024D, -0.41620612144470215D, -0.4158278703689575D, -0.4154700040817261D, -0.4151083528995514D, -0.4147477149963379D, -0.4143727421760559D, -0.41399645805358887D, -0.41361644864082336D, -0.41325125098228455D, -0.4128910303115845D, -0.4125325381755829D, -0.412177711725235D, -0.41182252764701843D, -0.41146835684776306D, -0.411092609167099D, -0.4107370972633362D, -0.41037485003471375D, -0.41001537442207336D, -0.40966421365737915D, -0.4093012511730194D, -0.40894198417663574D, -0.40859392285346985D, -0.4082479178905487D, -0.4078933000564575D, -0.4075292944908142D, -0.40716227889060974D, -0.4068087041378021D, -0.4064478874206543D, -0.406091570854187D, -0.40573540329933167D, -0.40538454055786133D, -0.40504181385040283D, -0.4047034680843353D, -0.4043614864349365D, -0.40400779247283936D, -0.4036547839641571D, -0.4032823443412781D, -0.4029378592967987D, -0.4025970697402954D, -0.402246356010437D, -0.40188851952552795D, -0.40156131982803345D, -0.40120363235473633D, -0.4008401036262512D, -0.40048736333847046D, -0.4001263976097107D, -0.39976367354393005D, -0.39942193031311035D, -0.3990681767463684D, -0.3987242877483368D, -0.398363322019577D, -0.39801621437072754D, -0.39766016602516174D, -0.39731889963150024D, -0.39698633551597595D, -0.39662742614746094D, -0.39628860354423523D, -0.39593571424484253D, -0.395590215921402D, -0.3952309787273407D, -0.3948807716369629D, -0.39455100893974304D, -0.3942095935344696D, -0.39386501908302307D, -0.3935443162918091D, -0.3931947946548462D, -0.39285120368003845D, -0.3925047814846039D, -0.39214301109313965D, -0.39179378747940063D, -0.3914482891559601D, -0.39108943939208984D, -0.3907601833343506D, -0.3904222249984741D, -0.3900834023952484D, -0.38973814249038696D, -0.3894020617008209D, -0.38905972242355347D, -0.38871514797210693D, -0.3883773684501648D, -0.3880293369293213D, -0.3876887559890747D, -0.38734734058380127D, -0.386979341506958D, -0.38662150502204895D, -0.38627174496650696D, -0.3859280049800873D, -0.38558584451675415D, -0.3852563500404358D, -0.3849097490310669D, -0.38456815481185913D, -0.38420337438583374D, -0.38386270403862D, -0.38352808356285095D, -0.3831936717033386D, -0.3828587532043457D, -0.3825334906578064D, -0.3822133243083954D, -0.38188061118125916D, -0.3815428614616394D, -0.3812029957771301D, -0.38088124990463257D, -0.38053950667381287D, -0.38019588589668274D, -0.37985116243362427D, -0.3795320689678192D, -0.379200279712677D, -0.37889277935028076D, -0.37856200337409973D, -0.3782331347465515D, -0.3779050409793854D, -0.3775690197944641D, -0.3772413730621338D, -0.3769242763519287D, -0.3765946924686432D, -0.37626904249191284D, -0.3759467601776123D, -0.37560951709747314D, -0.3752872347831726D, -0.37494587898254395D, -0.3746064007282257D, -0.3742677569389343D, -0.3739333748817444D, -0.3736076056957245D, -0.37326452136039734D, -0.37293750047683716D, -0.3725985884666443D, -0.3722609877586365D, -0.37193018198013306D, -0.3715952932834625D, -0.3712655007839203D, -0.3709229826927185D, -0.3705999255180359D, -0.37027597427368164D, -0.369951069355011D, -0.3696173429489136D, -0.3692963123321533D, -0.36897599697113037D, -0.36867132782936096D, -0.3683592677116394D, -0.3680408298969269D, -0.3677233159542084D, -0.367404967546463D, -0.36708003282546997D, -0.36677178740501404D, -0.3664388358592987D, -0.36611905694007874D, -0.3658014237880707D, -0.36547884345054626D, -0.3651513159275055D, -0.36481767892837524D, -0.3644823729991913D, -0.364155650138855D, -0.36383169889450073D, -0.36351490020751953D, -0.3631979823112488D, -0.3628738224506378D, -0.36254048347473145D, -0.3622121512889862D, -0.3618980348110199D, -0.3615726828575134D, -0.3612515330314636D, -0.3609353005886078D, -0.36061736941337585D, -0.36030900478363037D, -0.3599989712238312D, -0.3596540689468384D, -0.35933634638786316D, -0.35900697112083435D, -0.3586837351322174D, -0.35836634039878845D, -0.3580488860607147D, -0.35772836208343506D, -0.3574066162109375D, -0.3570963144302368D, -0.3567792475223541D, -0.356449693441391D, -0.35615187883377075D, -0.3558260202407837D, -0.3555348217487335D, -0.3552199602127075D, -0.3548942804336548D, -0.3545764684677124D, -0.35425788164138794D, -0.3539428114891052D, -0.3536147177219391D, -0.35328033566474915D, -0.3529603183269501D, -0.3526480793952942D, -0.35232388973236084D, -0.35200271010398865D, -0.35168105363845825D, -0.35135796666145325D, -0.3510427176952362D, -0.3507138788700104D, -0.35040056705474854D, -0.3500818610191345D, -0.34976863861083984D, -0.34945595264434814D, -0.34914907813072205D, -0.3488360345363617D, -0.34851935505867004D, -0.3481927514076233D, -0.3478827476501465D, -0.3475636839866638D, -0.34725847840309143D, -0.3469395339488983D, -0.34662553668022156D, -0.34631386399269104D, -0.3460105359554291D, -0.3456878960132599D, -0.345344603061676D, -0.34503841400146484D, -0.3447076678276062D, -0.344401091337204D, -0.3441048264503479D, -0.3437953293323517D, -0.343493789434433D, -0.34316104650497437D, -0.34285077452659607D, -0.3425139784812927D, -0.34221309423446655D, -0.341905802488327D, -0.3415932357311249D, -0.3412908911705017D, -0.34100088477134705D, -0.34069502353668213D, -0.3403867483139038D, -0.3400827944278717D, -0.3397866189479828D, -0.3394818603992462D, -0.33916914463043213D, -0.3388570249080658D, -0.3385341763496399D, -0.33820855617523193D, -0.3379049599170685D, -0.3375984728336334D, -0.33730369806289673D, -0.33700433373451233D, -0.33670154213905334D, -0.33638641238212585D, -0.33607667684555054D, -0.33575505018234253D, -0.3354572057723999D, -0.3351454734802246D, -0.3348299264907837D, -0.334527850151062D, -0.3342225253582001D, -0.33391332626342773D, -0.3336237072944641D, -0.3332982063293457D, -0.3329954445362091D, -0.3326762020587921D, -0.3323662281036377D, -0.3320602774620056D, -0.33175498247146606D, -0.3314487636089325D, -0.33115020394325256D, -0.330841064453125D, -0.3305378258228302D, -0.3302415609359741D, -0.329933226108551D, -0.329643577337265D, -0.32934796810150146D, -0.32905206084251404D, -0.3287571668624878D, -0.328460156917572D, -0.32815226912498474D, -0.3278505206108093D, -0.3275279998779297D, -0.32723256945610046D, -0.3269461989402771D, -0.3266374468803406D, -0.32633867859840393D, -0.32603901624679565D, -0.32573506236076355D, -0.3254241645336151D, -0.3251294791698456D, -0.3248370289802551D, -0.32453545928001404D, -0.3242391347885132D, -0.32394152879714966D, -0.32363662123680115D, -0.32332345843315125D, -0.323017418384552D, -0.32272642850875854D, -0.32241278886795044D, -0.32211995124816895D, -0.321819007396698D, -0.3215320408344269D, -0.3212323486804962D, -0.3209359347820282D, -0.3206302225589752D, -0.32032862305641174D, -0.3200341463088989D, -0.3197453022003174D, -0.31943413615226746D, -0.31913426518440247D, -0.3188168704509735D, -0.3185330033302307D, -0.3182430863380432D, -0.3179488778114319D, -0.3176538050174713D, -0.31735554337501526D, -0.3170680105686188D, -0.3167757987976074D, -0.3164826035499573D, -0.3161925673484802D, -0.31590309739112854D, -0.3156057894229889D, -0.3153114318847656D, -0.3150043487548828D, -0.3147113621234894D, -0.3144054412841797D, -0.3141002655029297D, -0.3138138949871063D, -0.3135177195072174D, -0.3132264018058777D, -0.31294235587120056D, -0.3126477599143982D, -0.3123481869697571D, -0.31204888224601746D, -0.3117561936378479D, -0.3114587366580963D, -0.3111598491668701D, -0.31085237860679626D, -0.31057536602020264D, -0.31028178334236145D, -0.30997639894485474D, -0.30967190861701965D, -0.30936843156814575D, -0.30909404158592224D, -0.3088019788265228D, -0.30850961804389954D, -0.3082248866558075D, -0.3079489469528198D, -0.3076601028442383D, -0.3073663115501404D, -0.30707186460494995D, -0.306782066822052D, -0.3064883351325989D, -0.3061949610710144D, -0.30590012669563293D, -0.30561313033103943D, -0.3053309917449951D, -0.3050406575202942D, -0.304754376411438D, -0.30446040630340576D, -0.3041768968105316D, -0.3038821816444397D, -0.3035893738269806D, -0.30328431725502014D, -0.3030011057853699D, -0.3027121424674988D, -0.3024280369281769D, -0.30212947726249695D, -0.3018357753753662D, -0.30154919624328613D, -0.30126914381980896D, -0.30098485946655273D, -0.30068662762641907D, -0.30040308833122253D, -0.30009666085243225D, -0.2998005747795105D, -0.2994982898235321D, -0.29921627044677734D, -0.29892295598983765D, -0.2986327111721039D, -0.29834234714508057D, -0.2980586290359497D, -0.29778116941452026D, -0.2974989116191864D, -0.29720795154571533D, -0.2969287931919098D, -0.2966563403606415D, -0.2963668704032898D, -0.2960667610168457D, -0.29577767848968506D, -0.29548513889312744D, -0.29519715905189514D, -0.29489442706108093D, -0.2946091890335083D, -0.2943197190761566D, -0.29404720664024353D, -0.2937503457069397D, -0.2934649586677551D, -0.2931755483150482D, -0.29288724064826965D, -0.29261279106140137D, -0.29232826828956604D, -0.29203593730926514D, -0.2917509078979492D, -0.291476309299469D, -0.2911933362483978D, -0.29089832305908203D, -0.29060450196266174D, -0.29032155871391296D, -0.2900330424308777D, -0.28975367546081543D, -0.28948378562927246D, -0.28919175267219543D, -0.28892582654953003D, -0.28864026069641113D, -0.28835973143577576D, -0.28808465600013733D, -0.28779277205467224D, -0.2875235378742218D, -0.287244975566864D, -0.2869555354118347D, -0.28667202591896057D, -0.2863847613334656D, -0.28609588742256165D, -0.28580570220947266D, -0.28554603457450867D, -0.2852514386177063D, -0.2849790155887604D, -0.28469184041023254D, -0.28441160917282104D, -0.2841390371322632D, -0.2838601768016815D, -0.2835925221443176D, -0.28331464529037476D, -0.28303512930870056D, -0.28274592757225037D, -0.28246626257896423D, -0.28217896819114685D, -0.28188076615333557D, -0.28161147236824036D, -0.2813378572463989D, -0.2810610234737396D, -0.2807842195034027D, -0.2804943323135376D, -0.28019919991493225D, -0.2799144983291626D, -0.27964210510253906D, -0.2793615162372589D, -0.2790962755680084D, -0.27882760763168335D, -0.27854248881340027D, -0.27825871109962463D, -0.2779737710952759D, -0.2777007222175598D, -0.27742964029312134D, -0.27714890241622925D, -0.27688339352607727D, -0.2765926122665405D, -0.2763076424598694D, -0.2760260999202728D, -0.2757579982280731D, -0.27548402547836304D, -0.2751961052417755D, -0.274922251701355D, -0.2746416926383972D, -0.27436795830726624D, -0.2740943133831024D, -0.2738019824028015D, -0.27353906631469727D, -0.27326154708862305D, -0.2729891836643219D, -0.27270472049713135D, -0.27243277430534363D, -0.2721635699272156D, -0.2718750536441803D, -0.2715913951396942D, -0.27133479714393616D, -0.2710684835910797D, -0.2707928419113159D, -0.2705102860927582D, -0.2702246606349945D, -0.26995614171028137D, -0.269681841135025D, -0.26940596103668213D, -0.26912009716033936D, -0.26884424686431885D, -0.2685716450214386D, -0.2682885527610779D, -0.2680133283138275D, -0.2677347660064697D, -0.26747408509254456D, -0.2672025263309479D, -0.26692694425582886D, -0.2666434049606323D, -0.2663731873035431D, -0.26609575748443604D, -0.2658277153968811D, -0.265566885471344D, -0.2652873694896698D, -0.265009343624115D, -0.2647358775138855D, -0.26447242498397827D, -0.2642005383968353D, -0.2639273405075073D, -0.26365959644317627D, -0.26338252425193787D, -0.26311179995536804D, -0.2628440260887146D, -0.26257866621017456D, -0.2623051702976227D, -0.2620226740837097D, -0.26175981760025024D, -0.2614777684211731D, -0.26120269298553467D, -0.2609373927116394D, -0.2606671154499054D, -0.26038432121276855D, -0.2601143717765808D, -0.25984737277030945D, -0.2595686912536621D, -0.2592966556549072D, -0.25902673602104187D, -0.25875210762023926D, -0.25847649574279785D, -0.25820842385292053D, -0.2579323947429657D, -0.25765854120254517D, -0.2574003040790558D, -0.25713491439819336D, -0.2568623721599579D, -0.25658881664276123D, -0.2563152313232422D, -0.25604572892189026D, -0.2557758390903473D, -0.2554943561553955D, -0.25521519780158997D, -0.25494012236595154D, -0.2546757459640503D, -0.2544080913066864D, -0.25414639711380005D, -0.253864049911499D, -0.2535991072654724D, -0.25332823395729065D, -0.25306326150894165D, -0.25280603766441345D, -0.2525345981121063D, -0.25226184725761414D, -0.2519981563091278D, -0.2517358958721161D, -0.2514859139919281D, -0.25121521949768066D, -0.2509450614452362D, -0.2506673038005829D, -0.25037816166877747D, -0.2501011788845062D, -0.24982967972755432D, -0.24956010282039642D, -0.24929192662239075D, -0.24902109801769257D, -0.24874456226825714D, -0.24847736954689026D, -0.2482159286737442D, -0.24794703722000122D, -0.24767209589481354D, -0.24741970002651215D, -0.24716982245445251D, -0.24689742922782898D, -0.24662908911705017D, -0.2463528960943222D, -0.2460920661687851D, -0.2458297461271286D, -0.2455553114414215D, -0.2452864646911621D, -0.24501584470272064D, -0.24475401639938354D, -0.24448587000370026D, -0.24422040581703186D, -0.24395723640918732D, -0.24368800222873688D, -0.24342411756515503D, -0.24315224587917328D, -0.2428782880306244D, -0.24262136220932007D, -0.2423519641160965D, -0.242094025015831D, -0.24183285236358643D, -0.24157416820526123D, -0.24128861725330353D, -0.2410109043121338D, -0.24074263870716095D, -0.24047909677028656D, -0.2402070164680481D, -0.23994535207748413D, -0.23968873918056488D, -0.23940715193748474D, -0.23913469910621643D, -0.23886923491954803D, -0.23860231041908264D, -0.23833289742469788D, -0.23806728422641754D, -0.23780885338783264D, -0.23753899335861206D, -0.23726941645145416D, -0.2369997203350067D, -0.23672956228256226D, -0.23645663261413574D, -0.23618397116661072D, -0.23593071103096008D, -0.23566082119941711D, -0.2354077845811844D, -0.2351534217596054D, -0.23488231003284454D, -0.2346220165491104D, -0.23435726761817932D, -0.2340918332338333D, -0.2338235080242157D, -0.2335655242204666D, -0.2333153784275055D, -0.23306378722190857D, -0.2328043133020401D, -0.23254400491714478D, -0.23228463530540466D, -0.2320064902305603D, -0.23174738883972168D, -0.23149773478507996D, -0.23124253749847412D, -0.23097634315490723D, -0.23071180284023285D, -0.23045700788497925D, -0.230192169547081D, -0.22991830110549927D, -0.22963789105415344D, -0.22937417030334473D, -0.22910505533218384D, -0.22883500158786774D, -0.2285711020231247D, -0.22831669449806213D, -0.2280465066432953D, -0.2277848720550537D, -0.22753745317459106D, -0.22728675603866577D, -0.22702650725841522D, -0.22676996886730194D, -0.22651082277297974D, -0.22624187171459198D, -0.22597870230674744D, -0.22570855915546417D, -0.22543907165527344D, -0.22518296539783478D, -0.22492025792598724D, -0.22467266023159027D, -0.22439832985401154D, -0.22413182258605957D, -0.2238631248474121D, -0.22359998524188995D, -0.22333964705467224D, -0.2230590581893921D, -0.22280718386173248D, -0.22254756093025208D, -0.22228197753429413D, -0.22201159596443176D, -0.22175270318984985D, -0.22150228917598724D, -0.22124618291854858D, -0.22099649906158447D, -0.22074392437934875D, -0.22047969698905945D, -0.22022272646427155D, -0.21997378766536713D, -0.2197091281414032D, -0.21945351362228394D, -0.2192097306251526D, -0.21894562244415283D, -0.21867841482162476D, -0.2184201329946518D, -0.2181641310453415D, -0.21789231896400452D, -0.21763677895069122D, -0.21738234162330627D, -0.2171180546283722D, -0.2168525755405426D, -0.21659737825393677D, -0.2163332849740982D, -0.21607044339179993D, -0.21581339836120605D, -0.21555018424987793D, -0.2152981460094452D, -0.21504613757133484D, -0.21478135883808136D, -0.21452942490577698D, -0.21428382396697998D, -0.21401828527450562D, -0.21376505494117737D, -0.2135121375322342D, -0.21325898170471191D, -0.21300353109836578D, -0.2127491533756256D, -0.21248602867126465D, -0.212227463722229D, -0.21197248995304108D, -0.211714506149292D, -0.21144689619541168D, -0.21119168400764465D, -0.21092993021011353D, -0.2106601893901825D, -0.2104104608297348D, -0.2101590931415558D, -0.2099045366048813D, -0.20964594185352325D, -0.209390327334404D, -0.20913049578666687D, -0.20888525247573853D, -0.20861712098121643D, -0.20835545659065247D, -0.20807304978370667D, -0.20782627165317535D, -0.20756679773330688D, -0.2073090374469757D, -0.20704127848148346D, -0.20678317546844482D, -0.20653437077999115D, -0.20627987384796143D, -0.2060208022594452D, -0.2057662308216095D, -0.20550277829170227D, -0.20525488257408142D, -0.20500688254833221D, -0.20475590229034424D, -0.204499751329422D, -0.20424525439739227D, -0.2039918303489685D, -0.20372796058654785D, -0.2034660130739212D, -0.20319855213165283D, -0.2029460072517395D, -0.20268212258815765D, -0.20242102444171906D, -0.20215927064418793D, -0.20190972089767456D, -0.2016443908214569D, -0.20138707756996155D, -0.20113015174865723D, -0.20087777078151703D, -0.20062702894210815D, -0.2003677785396576D, -0.20011863112449646D, -0.1998559683561325D, -0.19960248470306396D, -0.19935469329357147D, -0.19909074902534485D, -0.19882997870445251D, -0.19857299327850342D, -0.1983131766319275D, -0.1980532854795456D, -0.19780057668685913D, -0.19753916561603546D, -0.19728423655033112D, -0.1970248520374298D, -0.19676361978054047D, -0.19650912284851074D, -0.19625143706798553D, -0.19600039720535278D, -0.1957373321056366D, -0.19547948241233826D, -0.1952110230922699D, -0.19495542347431183D, -0.19469761848449707D, -0.19444851577281952D, -0.19418317079544067D, -0.19392995536327362D, -0.19367724657058716D, -0.19342119991779327D, -0.193157359957695D, -0.19289681315422058D, -0.19262950122356415D, -0.19238001108169556D, -0.19211608171463013D, -0.1918654441833496D, -0.19162078201770782D, -0.19136491417884827D, -0.19111116230487823D, -0.1908569037914276D, -0.19059760868549347D, -0.19035883247852325D, -0.19009436666965485D, -0.18983271718025208D, -0.18957246840000153D, -0.1893143355846405D, -0.18905536830425262D, -0.1888037919998169D, -0.18855144083499908D, -0.18828624486923218D, -0.18803848326206207D, -0.18779553472995758D, -0.18753254413604736D, -0.18728092312812805D, -0.18703658878803253D, -0.18677440285682678D, -0.1865210384130478D, -0.18627333641052246D, -0.1860176920890808D, -0.18575197458267212D, -0.18549758195877075D, -0.18524503707885742D, -0.18499478697776794D, -0.18474870920181274D, -0.18449726700782776D, -0.1842447966337204D, -0.18398450314998627D, -0.18373912572860718D, -0.18347981572151184D, -0.1832396537065506D, -0.1829894334077835D, -0.1827465295791626D, -0.1824868768453598D, -0.18223384022712708D, -0.181983083486557D, -0.18173179030418396D, -0.18149229884147644D, -0.18125100433826447D, -0.1810166984796524D, -0.18076547980308533D, -0.18052025139331818D, -0.18028059601783752D, -0.18003447353839874D, -0.17976894974708557D, -0.1795182228088379D, -0.17926038801670074D, -0.17900227010250092D, -0.17875243723392487D, -0.17849260568618774D, -0.1782395988702774D, -0.17798492312431335D, -0.17773054540157318D, -0.1774715632200241D, -0.17721407115459442D, -0.17695027589797974D, -0.17670336365699768D, -0.17644056677818298D, -0.17620298266410828D, -0.17594093084335327D, -0.17569057643413544D, -0.17543667554855347D, -0.17517289519309998D, -0.17491887509822845D, -0.17465627193450928D, -0.17440259456634521D, -0.17415493726730347D, -0.17391294240951538D, -0.17365816235542297D, -0.1734064668416977D, -0.1731625646352768D, -0.17290157079696655D, -0.1726544052362442D, -0.17240196466445923D, -0.1721460521221161D, -0.17188984155654907D, -0.17164205014705658D, -0.1714034527540207D, -0.17115624248981476D, -0.17089448869228363D, -0.17063680291175842D, -0.17039979994297028D, -0.17014959454536438D, -0.1698901206254959D, -0.16964471340179443D, -0.1694014072418213D, -0.16913889348506927D, -0.16887636482715607D, -0.16862861812114716D, -0.16837315261363983D, -0.1681090146303177D, -0.1678696870803833D, -0.16762171685695648D, -0.16737119853496552D, -0.1671179234981537D, -0.16687534749507904D, -0.16663305461406708D, -0.1663946509361267D, -0.16613495349884033D, -0.16588224470615387D, -0.16563618183135986D, -0.16538074612617493D, -0.1651364266872406D, -0.16490191221237183D, -0.16465792059898376D, -0.16440246999263763D, -0.16415110230445862D, -0.16390496492385864D, -0.16366207599639893D, -0.1634174883365631D, -0.16316935420036316D, -0.1629198044538498D, -0.16267001628875732D, -0.16242310404777527D, -0.16217178106307983D, -0.16191552579402924D, -0.16166867315769196D, -0.1614210307598114D, -0.1611790955066681D, -0.16093122959136963D, -0.1606772541999817D, -0.16043275594711304D, -0.16018515825271606D, -0.15993653237819672D, -0.1596994400024414D, -0.15944430232048035D, -0.15919804573059082D, -0.15895970165729523D, -0.1587119996547699D, -0.15847010910511017D, -0.15822650492191315D, -0.15797394514083862D, -0.15772566199302673D, -0.15748535096645355D, -0.15724743902683258D, -0.15699094533920288D, -0.15675128996372223D, -0.15649347007274628D, -0.15624989569187164D, -0.15599365532398224D, -0.15574221312999725D, -0.15548446774482727D, -0.15522776544094086D, -0.15496757626533508D, -0.1547342836856842D, -0.1544916033744812D, -0.15425007045269012D, -0.1540067493915558D, -0.15374967455863953D, -0.15350456535816193D, -0.15324702858924866D, -0.15298958122730255D, -0.15275487303733826D, -0.15251053869724274D, -0.152267724275589D, -0.15201044082641602D, -0.15175509452819824D, -0.151505246758461D, -0.15124619007110596D, -0.15099188685417175D, -0.1507432460784912D, -0.15049618482589722D, -0.15025031566619873D, -0.1499987542629242D, -0.14975327253341675D, -0.1495012789964676D, -0.14925517141819D, -0.14899614453315735D, -0.14874862134456635D, -0.14850221574306488D, -0.14825864136219025D, -0.14800988137722015D, -0.14776690304279327D, -0.14751356840133667D, -0.14725728332996368D, -0.14701828360557556D, -0.1467764675617218D, -0.14652809500694275D, -0.1462775468826294D, -0.14603087306022644D, -0.14578372240066528D, -0.1455492079257965D, -0.14530538022518158D, -0.1450677067041397D, -0.1448247730731964D, -0.14457790553569794D, -0.14433254301548004D, -0.14408448338508606D, -0.14383292198181152D, -0.14358893036842346D, -0.14333432912826538D, -0.14308729767799377D, -0.1428370475769043D, -0.14258548617362976D, -0.14234289526939392D, -0.14209994673728943D, -0.14185495674610138D, -0.14160139858722687D, -0.14135192334651947D, -0.14110565185546875D, -0.14085626602172852D, -0.14060232043266296D, -0.14035870134830475D, -0.14011816680431366D, -0.1398662030696869D, -0.1396220326423645D, -0.13937823474407196D, -0.1391391158103943D, -0.1388905644416809D, -0.13864193856716156D, -0.13839447498321533D, -0.13814809918403625D, -0.13790713250637054D, -0.1376522183418274D, -0.13741502165794373D, -0.13717547059059143D, -0.13693785667419434D, -0.13668829202651978D, -0.13643985986709595D, -0.1362117975950241D, -0.1359674036502838D, -0.13571487367153168D, -0.13547922670841217D, -0.13521651923656464D, -0.13495062291622162D, -0.1347016990184784D, -0.13445797562599182D, -0.13421109318733215D, -0.13394372165203094D, -0.13369591534137726D, -0.1334560066461563D, -0.13321466743946075D, -0.1329614669084549D, -0.13270504772663116D, -0.13244760036468506D, -0.13218137621879578D, -0.1319417953491211D, -0.13170531392097473D, -0.1314602643251419D, -0.13120467960834503D, -0.13096478581428528D, -0.1307184249162674D, -0.13046908378601074D, -0.1302255094051361D, -0.12998691201210022D, -0.12974600493907928D, -0.1295071542263031D, -0.1292717605829239D, -0.12903152406215668D, -0.12879106402397156D, -0.12854063510894775D, -0.12829795479774475D, -0.12804800271987915D, -0.1277998685836792D, -0.12754665315151215D, -0.12730130553245544D, -0.12706024944782257D, -0.12681734561920166D, -0.12656420469284058D, -0.12631171941757202D, -0.1260722577571869D, -0.12582357227802277D, -0.1255764663219452D, -0.12533816695213318D, -0.12509363889694214D, -0.12485770136117935D, -0.12460377812385559D, -0.12436322122812271D, -0.12412640452384949D, -0.12387391924858093D, -0.12363933771848679D, -0.12340278923511505D, -0.12317416071891785D, -0.12292548269033432D, -0.12268528342247009D, -0.12244031578302383D, -0.12219351530075073D, -0.12195321917533875D, -0.1217072457075119D, -0.12145407497882843D, -0.12118937075138092D, -0.12093839049339294D, -0.12068343162536621D, -0.12044784426689148D, -0.12020371109247208D, -0.1199624091386795D, -0.11971180886030197D, -0.11945878714323044D, -0.11921756714582443D, -0.11896989494562149D, -0.11871515214443207D, -0.11847058683633804D, -0.11823519319295883D, -0.1179933100938797D, -0.11774738132953644D, -0.11750373244285583D, -0.1172565147280693D, -0.11700785160064697D, -0.11676418781280518D, -0.11652734875679016D, -0.11627509444952011D, -0.11602754890918732D, -0.11577780544757843D, -0.11553701758384705D, -0.11528782546520233D, -0.11505863815546036D, -0.11480346322059631D, -0.11456599831581116D, -0.11431010812520981D, -0.11407358199357986D, -0.11383143067359924D, -0.11360126733779907D, -0.11336424946784973D, -0.1131257489323616D, -0.11287946999073029D, -0.11264096945524216D, -0.11240296065807343D, -0.11215709149837494D, -0.11191694438457489D, -0.11166784912347794D, -0.1114199161529541D, -0.11117790639400482D, -0.110927514731884D, -0.11067363619804382D, -0.11044003069400787D, -0.11019321531057358D, -0.10995994508266449D, -0.10971911251544952D, -0.10947442054748535D, -0.10922731459140778D, -0.10898025333881378D, -0.10874222218990326D, -0.10849777609109879D, -0.1082630529999733D, -0.10802622139453888D, -0.1077839732170105D, -0.10753330588340759D, -0.10729499161243439D, -0.1070358008146286D, -0.10678865760564804D, -0.10653838515281677D, -0.10629342496395111D, -0.10604272782802582D, -0.10579723864793777D, -0.10554585605859756D, -0.10529976338148117D, -0.10505616664886475D, -0.1048198938369751D, -0.10458079725503922D, -0.10433512926101685D, -0.10408937931060791D, -0.10384517908096313D, -0.10361005365848541D, -0.10336779057979584D, -0.1031176820397377D, -0.10287676751613617D, -0.10262610018253326D, -0.10237167030572891D, -0.10212275385856628D, -0.10188750922679901D, -0.10163980722427368D, -0.10139568150043488D, -0.10115278512239456D, -0.10089636594057083D, -0.10065758973360062D, -0.10040846467018127D, -0.10017679631710052D, -0.09993906319141388D, -0.09969222545623779D, -0.0994405448436737D, -0.099197156727314D, -0.09895378351211548D, -0.09871632605791092D, -0.09848727285861969D, -0.09823883324861526D, -0.09799803793430328D, -0.09774011373519897D, -0.09750278294086456D, -0.09725803881883621D, -0.0970136970281601D, -0.09676622599363327D, -0.09651307016611099D, -0.09627290070056915D, -0.09603053331375122D, -0.09578799456357956D, -0.09554785490036011D, -0.09530899673700333D, -0.09506220370531082D, -0.09481719136238098D, -0.09456701576709747D, -0.09431912004947662D, -0.09408935904502869D, -0.09383450448513031D, -0.09358792006969452D, -0.09333662688732147D, -0.09308815002441406D, -0.09284839779138565D, -0.09261038154363632D, -0.09236297011375427D, -0.09211356192827225D, -0.09187184274196625D, -0.09162575006484985D, -0.0913834348320961D, -0.09114708006381989D, -0.09090118110179901D, -0.09066314250230789D, -0.09040945768356323D, -0.09017443656921387D, -0.08994124084711075D, -0.089698925614357D, -0.08944778144359589D, -0.08919527381658554D, -0.08896385133266449D, -0.08871737867593765D, -0.08848631381988525D, -0.08825340867042542D, -0.08800895512104034D, -0.0877874493598938D, -0.08753707259893417D, -0.08728936314582825D, -0.08704547584056854D, -0.08680916577577591D, -0.08656804263591766D, -0.08632045984268188D, -0.08607527613639832D, -0.08583015948534012D, -0.08558361977338791D, -0.08533721417188644D, -0.08509048074483871D, -0.08485028147697449D, -0.08460789173841476D, -0.08436190336942673D, -0.08410844951868057D, -0.0838729739189148D, -0.08363857865333557D, -0.08339942991733551D, -0.0831519365310669D, -0.08291947841644287D, -0.0826779305934906D, -0.08242892473936081D, -0.08219455182552338D, -0.08195057511329651D, -0.08170703053474426D, -0.081464022397995D, -0.08122886717319489D, -0.08100023120641708D, -0.08075392991304398D, -0.0805170014500618D, -0.08027160912752151D, -0.08002904802560806D, -0.07978925108909607D, -0.07955169677734375D, -0.07930881530046463D, -0.0790669322013855D, -0.07882830500602722D, -0.0785798504948616D, -0.07833991944789886D, -0.07809559255838394D, -0.07786226272583008D, -0.0776219591498375D, -0.07737678289413452D, -0.07714521139860153D, -0.07691224664449692D, -0.07665777206420898D, -0.07641151547431946D, -0.07617313414812088D, -0.07592753320932388D, -0.07569229602813721D, -0.0754416435956955D, -0.07519475370645523D, -0.07494813203811646D, -0.0747164636850357D, -0.07448276877403259D, -0.07423548400402069D, -0.07399512827396393D, -0.07376088201999664D, -0.07351675629615784D, -0.07327954471111298D, -0.07303505390882492D, -0.07279020547866821D, -0.07253576070070267D, -0.07229600846767426D, -0.07204475998878479D, -0.07179662585258484D, -0.07155118137598038D, -0.07129927724599838D, -0.07106245309114456D, -0.07081857323646545D, -0.07056738436222076D, -0.07032652199268341D, -0.07008545845746994D, -0.06985671073198318D, -0.06962361931800842D, -0.06937389075756073D, -0.06912381947040558D, -0.06887900829315186D, -0.0686340481042862D, -0.06838493049144745D, -0.0681314691901207D, -0.06789498031139374D, -0.06765970587730408D, -0.06742730736732483D, -0.06719651073217392D, -0.06694657355546951D, -0.06670555472373962D, -0.06645660102367401D, -0.06621503829956055D, -0.06598034501075745D, -0.06574320793151855D, -0.06549137830734253D, -0.06525201350450516D, -0.06501458585262299D, -0.06479227542877197D, -0.06455428898334503D, -0.06431309133768082D, -0.06407991051673889D, -0.0638367235660553D, -0.06359873712062836D, -0.06334324926137924D, -0.06310774385929108D, -0.06286437809467316D, -0.06262777745723724D, -0.06237030401825905D, -0.0621323436498642D, -0.06189025938510895D, -0.061647746711969376D, -0.06140772998332977D, -0.06117217615246773D, -0.060926057398319244D, -0.06067296862602234D, -0.06043364480137825D, -0.06018991395831108D, -0.05995730683207512D, -0.05970904603600502D, -0.05945960804820061D, -0.059217669069767D, -0.05897081643342972D, -0.05872904509305954D, -0.05849192291498184D, -0.058252234011888504D, -0.058004919439554214D, -0.057772375643253326D, -0.057538487017154694D, -0.05728022754192352D, -0.05705133080482483D, -0.0568150132894516D, -0.05658133700489998D, -0.05634107068181038D, -0.05609507858753204D, -0.05584454536437988D, -0.05560510605573654D, -0.055361032485961914D, -0.05511125177145004D, -0.05486954376101494D, -0.0546349361538887D, -0.054383497685194016D, -0.054135002195835114D, -0.05389668419957161D, -0.05365772172808647D, -0.053429946303367615D, -0.05319244787096977D, -0.05295149236917496D, -0.05270173400640488D, -0.05245363712310791D, -0.052212126553058624D, -0.05197114497423172D, -0.05172385275363922D, -0.05147520452737808D, -0.05123189836740494D, -0.050989679992198944D, -0.05073939263820648D, -0.050494953989982605D, -0.050253815948963165D, -0.05001272261142731D, -0.04977148026227951D, -0.049528926610946655D, -0.0492960549890995D, -0.049062661826610565D, -0.04881996288895607D, -0.04857254773378372D, -0.04833959415555D, -0.04808736592531204D, -0.04785143956542015D, -0.04761652648448944D, -0.04738566651940346D, -0.047138575464487076D, -0.046896256506443024D, -0.04665457457304001D, -0.046410854905843735D, -0.046181485056877136D, -0.04594765976071358D, -0.045701175928115845D, -0.04545196518301964D, -0.04520288109779358D, -0.04497365653514862D, -0.04473564028739929D, -0.044497597962617874D, -0.04426290839910507D, -0.04401934891939163D, -0.04377321898937225D, -0.04354047775268555D, -0.04330435022711754D, -0.04306349903345108D, -0.04282412305474281D, -0.042600978165864944D, -0.04235575720667839D, -0.042125359177589417D, -0.0418863445520401D, -0.04164663329720497D, -0.041397858411073685D, -0.04115602374076843D, -0.04090924188494682D, -0.040665313601493835D, -0.040422823280096054D, -0.04018530994653702D, -0.03994182497262955D, -0.03970673680305481D, -0.039466261863708496D, -0.03923157975077629D, -0.03900260105729103D, -0.03876923769712448D, -0.03853490203619003D, -0.03827759623527527D, -0.038032952696084976D, -0.03779587149620056D, -0.03755195438861847D, -0.037318892776966095D, -0.0370723120868206D, -0.03683407977223396D, -0.03659613057971001D, -0.036354124546051025D, -0.03612060472369194D, -0.035871125757694244D, -0.0356329046189785D, -0.03540351986885071D, -0.03516382724046707D, -0.03492915630340576D, -0.03468974679708481D, -0.03444032371044159D, -0.03418684005737305D, -0.033952150493860245D, -0.0337207056581974D, -0.03348376974463463D, -0.03324819356203079D, -0.03300824016332626D, -0.03275500610470772D, -0.03251590207219124D, -0.032279904931783676D, -0.032043423503637314D, -0.031806062906980515D, -0.03156071901321411D, -0.03131228685379028D, -0.031079325824975967D, -0.030846213921904564D, -0.030607648193836212D, -0.030370527878403664D, -0.03013504482805729D, -0.02989460527896881D, -0.029653780162334442D, -0.02942124754190445D, -0.02915763482451439D, -0.02890888601541519D, -0.028668014332652092D, -0.02843261882662773D, -0.028197886422276497D, -0.027968186885118484D, -0.027727065607905388D, -0.027480654418468475D, -0.027245230972766876D, -0.027006402611732483D, -0.02677249163389206D, -0.02654179185628891D, -0.026293570175766945D, -0.026052728295326233D, -0.02581942081451416D, -0.025574829429388046D, -0.025324739515781403D, -0.02508126199245453D, -0.02484128810465336D, -0.024607401341199875D, -0.024367906153202057D, -0.024130383506417274D, -0.023888912051916122D, -0.023636002093553543D, -0.02339264750480652D, -0.023146748542785645D, -0.022916993126273155D, -0.022678110748529434D, -0.022439364343881607D, -0.02219318598508835D, -0.02194978855550289D, -0.02171243354678154D, -0.021477043628692627D, -0.02123437076807022D, -0.02098814956843853D, -0.02074434421956539D, -0.020506832748651505D, -0.020272759720683098D, -0.02004285529255867D, -0.019803741946816444D, -0.01955583691596985D, -0.019311942160129547D, -0.019074883311986923D, -0.018838535994291306D, -0.018599458038806915D, -0.018360331654548645D, -0.01811789721250534D, -0.01788494735956192D, -0.017648138105869293D, -0.017405608668923378D, -0.017160717397928238D, -0.016933269798755646D, -0.016701746731996536D, -0.016470860689878464D, -0.016230151057243347D, -0.01599072851240635D, -0.01574883423745632D, -0.015508405864238739D, -0.015284917317330837D, -0.01503007858991623D, -0.014800170436501503D, -0.01455119252204895D, -0.014315657317638397D, -0.014065643772482872D, -0.013827585615217686D, -0.013587378896772861D, -0.013347174972295761D, -0.013102564960718155D, -0.012854132801294327D, -0.012623535469174385D, -0.012376610189676285D, -0.012131456285715103D, -0.01189560629427433D, -0.011651847511529922D, -0.01142079383134842D, -0.011175703257322311D, -0.010937604121863842D, -0.010689251124858856D, -0.010437887161970139D, -0.010197514668107033D, -0.009952478110790253D, -0.009725537151098251D, -0.009491712786257267D, -0.009257838129997253D, -0.009027864784002304D, -0.008777694776654243D, -0.008550971746444702D, -0.00831599161028862D, -0.008069436997175217D, -0.007820136845111847D, -0.007574319839477539D, -0.007336270064115524D, -0.007096525281667709D, -0.006860194727778435D, -0.00662708654999733D, -0.006389433518052101D, -0.006162447854876518D, -0.005919415503740311D, -0.005667705088853836D, -0.005427785217761993D, -0.005184531211853027D, -0.004940364509820938D, -0.00468367338180542D, -0.004453904926776886D, -0.004206191748380661D, -0.003969529643654823D, -0.0037299059331417084D, -0.003492492251098156D, -0.003242732025682926D, -0.0030055344104766846D, -0.0027720071375370026D, -0.00253082811832428D, -0.00228659575805068D, -0.002054929733276367D, -0.0018176455050706863D, -0.001599922776222229D, -0.0013567134737968445D, -0.0011234097182750702D, -9.045042097568512E-4D, -6.500082090497017E-4D, -4.1660130955278873E-4D, -1.7212703824043274E-4D, 1.8030405044555664E-5D, 2.5004614144563675E-4D, 4.7913193702697754E-4D, 7.338970899581909E-4D, 9.82176512479782E-4D, 0.0012129582464694977D, 0.0014488585293293D, 0.0016867630183696747D, 0.0019273310899734497D, 0.0021613668650388718D, 0.002390991896390915D, 0.0026295240968465805D, 0.0028657931834459305D, 0.0031123533844947815D, 0.003348197788000107D, 0.003588378429412842D, 0.0038277730345726013D, 0.0040658749639987946D, 0.004302076995372772D, 0.004537015222012997D, 0.00477440282702446D, 0.005008077248930931D, 0.005255784839391708D, 0.0054915063083171844D, 0.005724627524614334D, 0.00595773383975029D, 0.006182271987199783D, 0.006420166231691837D, 0.006653249729424715D, 0.00689283199608326D, 0.007140390574932098D, 0.007379662245512009D, 0.0076194386929273605D, 0.007851885631680489D, 0.008095469325780869D, 0.008320674300193787D, 0.008559394627809525D, 0.008799819275736809D, 0.009034939110279083D, 0.009275494143366814D, 0.009523751214146614D, 0.00976627878844738D, 0.009996486827731133D, 0.01023360900580883D, 0.010484512895345688D, 0.010711602866649628D, 0.010940506123006344D, 0.011187344789505005D, 0.011436786502599716D, 0.011673590168356895D, 0.01189296692609787D, 0.012140963226556778D, 0.012369673699140549D, 0.012593931518495083D, 0.012840654700994492D, 0.013081846758723259D, 0.013317383825778961D, 0.013564608991146088D, 0.013808630406856537D, 0.014055570587515831D, 0.014296349138021469D, 0.01453232578933239D, 0.014765492640435696D, 0.015003692358732224D, 0.015242312103509903D, 0.015490015037357807D, 0.015726767480373383D, 0.01596280187368393D, 0.01620377227663994D, 0.01644257828593254D, 0.01667718216776848D, 0.016922373324632645D, 0.017163371667265892D, 0.017399052157998085D, 0.01764657348394394D, 0.017877236008644104D, 0.01812145859003067D, 0.01835670694708824D, 0.018597178161144257D, 0.01882927119731903D, 0.019075646996498108D, 0.019314182922244072D, 0.019556086510419846D, 0.019792847335338593D, 0.02003338560461998D, 0.020272035151720047D, 0.02050381898880005D, 0.020733200013637543D, 0.020976442843675613D, 0.021210378035902977D, 0.02143765240907669D, 0.021682390943169594D, 0.021919602528214455D, 0.0221518874168396D, 0.022384680807590485D, 0.022622741758823395D, 0.022860225290060043D, 0.02310165762901306D, 0.023336874321103096D, 0.023573121055960655D, 0.02379993349313736D, 0.02404947392642498D, 0.024299774318933487D, 0.024536117911338806D, 0.02478577382862568D, 0.025020964443683624D, 0.025249026715755463D, 0.025489892810583115D, 0.025740530341863632D, 0.025998929515480995D, 0.026246890425682068D, 0.02648969367146492D, 0.026718705892562866D, 0.026957036927342415D, 0.027204863727092743D, 0.027444452047348022D, 0.027704622596502304D, 0.027947325259447098D, 0.02819725126028061D, 0.02844608575105667D, 0.028680214658379555D, 0.028920786455273628D, 0.029158281162381172D, 0.029388519003987312D, 0.029632214456796646D, 0.029864804819226265D, 0.030107151716947556D, 0.030348382890224457D, 0.030580196529626846D, 0.03082174062728882D, 0.031057609245181084D, 0.03129713609814644D, 0.031536027789115906D, 0.03177642449736595D, 0.032016344368457794D, 0.032250333577394485D, 0.03248574212193489D, 0.03272556513547897D, 0.032981544733047485D, 0.03322865441441536D, 0.03346912935376167D, 0.0337110199034214D, 0.033949390053749084D, 0.034183282405138016D, 0.034417230635881424D, 0.03465258330106735D, 0.0348886139690876D, 0.035128623247146606D, 0.03536383435130119D, 0.03560587763786316D, 0.03585127741098404D, 0.036084286868572235D, 0.03631396219134331D, 0.036562442779541016D, 0.03680244833230972D, 0.03704371303319931D, 0.037276409566402435D, 0.03751538693904877D, 0.037762030959129333D, 0.03801950067281723D, 0.03826010972261429D, 0.038504309952259064D, 0.0387469083070755D, 0.03899405896663666D, 0.039229098707437515D, 0.03947621211409569D, 0.039711613208055496D, 0.03995666652917862D, 0.040196262300014496D, 0.040436677634716034D, 0.04066110774874687D, 0.04089445620775223D, 0.04114403575658798D, 0.04137770086526871D, 0.04162734001874924D, 0.04187489300966263D, 0.04212113842368126D, 0.04237997904419899D, 0.04263453558087349D, 0.04288449138402939D, 0.04311514273285866D, 0.04335115849971771D, 0.04357973113656044D, 0.04382624477148056D, 0.04406590759754181D, 0.04431349039077759D, 0.04456290230154991D, 0.044805336743593216D, 0.0450420007109642D, 0.04527563601732254D, 0.04551904648542404D, 0.045769836753606796D, 0.04600602388381958D, 0.046249911189079285D, 0.04649045318365097D, 0.0467350110411644D, 0.0469646230340004D, 0.04720987752079964D, 0.0474463514983654D, 0.04768086224794388D, 0.047928351908922195D, 0.048162274062633514D, 0.048396602272987366D, 0.04864221811294556D, 0.048878930509090424D, 0.0491228923201561D, 0.0493641197681427D, 0.0496056005358696D, 0.049858272075653076D, 0.050106972455978394D, 0.0503457672894001D, 0.05058106780052185D, 0.050811801105737686D, 0.051054518669843674D, 0.051300615072250366D, 0.051533062011003494D, 0.051776714622974396D, 0.05200812220573425D, 0.052254874259233475D, 0.05247935280203819D, 0.05271238088607788D, 0.05296379327774048D, 0.053211115300655365D, 0.053449779748916626D, 0.05368578061461449D, 0.05392590910196304D, 0.05417390167713165D, 0.05440376326441765D, 0.05464910343289375D, 0.054876476526260376D, 0.055116206407547D, 0.05535535141825676D, 0.05559191852807999D, 0.05583671107888222D, 0.05606665462255478D, 0.05629488080739975D, 0.056531038135290146D, 0.05677127465605736D, 0.05701253190636635D, 0.05725562572479248D, 0.05749615281820297D, 0.05773595720529556D, 0.05798366293311119D, 0.05822004750370979D, 0.05847081169486046D, 0.05871637910604477D, 0.05896701663732529D, 0.05920988693833351D, 0.05945613235235214D, 0.059691719710826874D, 0.059922900050878525D, 0.06016569584608078D, 0.060413725674152374D, 0.06065669655799866D, 0.06089803948998451D, 0.061139024794101715D, 0.061384011059999466D, 0.061639074236154556D, 0.06188543885946274D, 0.06213250756263733D, 0.062370769679546356D, 0.06261318922042847D, 0.0628569945693016D, 0.06309330463409424D, 0.06332416087388992D, 0.06356460601091385D, 0.06382028758525848D, 0.06406866014003754D, 0.06430210918188095D, 0.06454354524612427D, 0.06478959321975708D, 0.06503751873970032D, 0.06529387086629868D, 0.06553513556718826D, 0.06577916443347931D, 0.06601770222187042D, 0.06625692546367645D, 0.06650961935520172D, 0.06674687564373016D, 0.0669788122177124D, 0.06722482293844223D, 0.0674588531255722D, 0.06768260151147842D, 0.06790776550769806D, 0.06814801692962646D, 0.06838471442461014D, 0.06863133609294891D, 0.06886210292577744D, 0.06910943239927292D, 0.06934362649917603D, 0.06958003342151642D, 0.06981192529201508D, 0.07004958391189575D, 0.07029459625482559D, 0.07055052369832993D, 0.07078401744365692D, 0.07101749628782272D, 0.07126064598560333D, 0.07150739431381226D, 0.07175813615322113D, 0.0720054879784584D, 0.07224322110414505D, 0.07248044013977051D, 0.07271689921617508D, 0.07295949757099152D, 0.0732078030705452D, 0.07345090061426163D, 0.07368715852499008D, 0.07393429428339005D, 0.07417695224285126D, 0.07441578805446625D, 0.07466088980436325D, 0.07489414513111115D, 0.07513600587844849D, 0.0753738135099411D, 0.07561701536178589D, 0.0758667066693306D, 0.07612309604883194D, 0.07638232409954071D, 0.076628178358078D, 0.07686847448348999D, 0.07710824906826019D, 0.07734467834234238D, 0.07758921384811401D, 0.07784561812877655D, 0.07808583974838257D, 0.07834410667419434D, 0.07858625054359436D, 0.07882437855005264D, 0.07906801998615265D, 0.0793083980679512D, 0.07955463230609894D, 0.07981622219085693D, 0.08005615323781967D, 0.08030057698488235D, 0.0805463120341301D, 0.08078382909297943D, 0.08103151619434357D, 0.08126095682382584D, 0.0815000832080841D, 0.08173040300607681D, 0.08196523785591125D, 0.08220580220222473D, 0.08243486285209656D, 0.08268188685178757D, 0.08292843401432037D, 0.0831647738814354D, 0.08339834958314896D, 0.0836380124092102D, 0.08387906104326248D, 0.08412414789199829D, 0.08436859399080276D, 0.0846082791686058D, 0.08485112339258194D, 0.08509281277656555D, 0.08533436059951782D, 0.08558444678783417D, 0.08581666648387909D, 0.08605876564979553D, 0.08630654215812683D, 0.08654367923736572D, 0.08678770065307617D, 0.08702260255813599D, 0.08725456148386002D, 0.08750993013381958D, 0.08773811906576157D, 0.08798518031835556D, 0.0882255807518959D, 0.08847689628601074D, 0.0887211263179779D, 0.08896452188491821D, 0.08920910954475403D, 0.08945497870445251D, 0.08969209343194962D, 0.08994311094284058D, 0.09017997980117798D, 0.09042559564113617D, 0.0906810313463211D, 0.09092381596565247D, 0.0911625400185585D, 0.09141795337200165D, 0.09166523069143295D, 0.09191490709781647D, 0.0921562910079956D, 0.09239944815635681D, 0.09264124929904938D, 0.09289426356554031D, 0.09314051270484924D, 0.09336643666028976D, 0.09361747652292252D, 0.09384654462337494D, 0.09409788250923157D, 0.0943448394536972D, 0.09459105134010315D, 0.0948304533958435D, 0.09507936984300613D, 0.09532738476991653D, 0.09556381404399872D, 0.09580858051776886D, 0.09604042023420334D, 0.09626977145671844D, 0.09650926291942596D, 0.0967506468296051D, 0.09699468314647675D, 0.09725047647953033D, 0.09750711917877197D, 0.09776434302330017D, 0.09801188111305237D, 0.09824371337890625D, 0.09848768264055252D, 0.09872874617576599D, 0.09896586090326309D, 0.09920790046453476D, 0.09944957494735718D, 0.09968200325965881D, 0.09992703795433044D, 0.10018682479858398D, 0.10043767094612122D, 0.10069596767425537D, 0.10094213485717773D, 0.10119457542896271D, 0.10144343972206116D, 0.10168857872486115D, 0.1019381657242775D, 0.1021813377737999D, 0.10242380201816559D, 0.10266663134098053D, 0.1029038205742836D, 0.10315491259098053D, 0.1034012958407402D, 0.10365647822618484D, 0.10389219224452972D, 0.104132741689682D, 0.10438927263021469D, 0.10462994873523712D, 0.10488337278366089D, 0.10512462258338928D, 0.10537828505039215D, 0.1056293249130249D, 0.10587567090988159D, 0.10612065345048904D, 0.10636690258979797D, 0.10661175101995468D, 0.10686026513576508D, 0.10710041970014572D, 0.10735155642032623D, 0.10758167505264282D, 0.10782761126756668D, 0.10806737840175629D, 0.1083139032125473D, 0.10856615751981735D, 0.108811154961586D, 0.10905927419662476D, 0.10930319875478745D, 0.10955643653869629D, 0.10979588329792023D, 0.11004279553890228D, 0.1102958396077156D, 0.11054527759552002D, 0.11079119145870209D, 0.11103609204292297D, 0.11127711832523346D, 0.1115172803401947D, 0.1117594912648201D, 0.1120046079158783D, 0.11223725229501724D, 0.11248401552438736D, 0.11272372305393219D, 0.11297810077667236D, 0.11322519183158875D, 0.11346785724163055D, 0.11372040957212448D, 0.11395683884620667D, 0.11420010775327682D, 0.11444250494241714D, 0.11468120664358139D, 0.11492819339036942D, 0.11517039686441422D, 0.11540466547012329D, 0.11564680933952332D, 0.11589252948760986D, 0.11613063514232635D, 0.11639325320720673D, 0.11663356423377991D, 0.11688605695962906D, 0.11712798476219177D, 0.11737510561943054D, 0.11761916428804398D, 0.11786546558141708D, 0.11810825765132904D, 0.11834405362606049D, 0.11859436333179474D, 0.11883425712585449D, 0.11908208578824997D, 0.11933384835720062D, 0.11957629024982452D, 0.11981932073831558D, 0.12006602436304092D, 0.1203235313296318D, 0.12056553363800049D, 0.12080793082714081D, 0.12105826288461685D, 0.12129639089107513D, 0.12155969440937042D, 0.12180247157812119D, 0.12205307930707932D, 0.12229906022548676D, 0.12254200130701065D, 0.12278658151626587D, 0.12303048372268677D, 0.12327433377504349D, 0.12352501600980759D, 0.12377308309078217D, 0.12401439994573593D, 0.12425234913825989D, 0.12449690699577332D, 0.12473757565021515D, 0.12498489767313004D, 0.12522444128990173D, 0.1254711002111435D, 0.1257123202085495D, 0.1259474903345108D, 0.12619467079639435D, 0.12644141912460327D, 0.12670068442821503D, 0.12694254517555237D, 0.12717880308628082D, 0.12742914259433746D, 0.12767036259174347D, 0.12791737914085388D, 0.12815646827220917D, 0.12838824093341827D, 0.1286291480064392D, 0.12887807190418243D, 0.1291383057832718D, 0.12939326465129852D, 0.1296338587999344D, 0.1298784613609314D, 0.1301174759864807D, 0.13036495447158813D, 0.130618155002594D, 0.13086116313934326D, 0.13110719621181488D, 0.13135799765586853D, 0.1315925568342209D, 0.1318426877260208D, 0.13207705318927765D, 0.13231460750102997D, 0.13256874680519104D, 0.1328187882900238D, 0.13305653631687164D, 0.13330477476119995D, 0.13354620337486267D, 0.13378751277923584D, 0.13402922451496124D, 0.1342799961566925D, 0.13453587889671326D, 0.13477690517902374D, 0.13502594828605652D, 0.13527695834636688D, 0.13551442325115204D, 0.13576547801494598D, 0.1360103189945221D, 0.1362583041191101D, 0.13651292026042938D, 0.13675719499588013D, 0.13699865341186523D, 0.13724200427532196D, 0.13749007880687714D, 0.1377292424440384D, 0.1379738599061966D, 0.13822335004806519D, 0.13847866654396057D, 0.13873206079006195D, 0.13898490369319916D, 0.13923271000385284D, 0.1394839584827423D, 0.13973473012447357D, 0.13997481763362885D, 0.1402241587638855D, 0.1404787302017212D, 0.14072586596012115D, 0.14096570014953613D, 0.14121803641319275D, 0.14146292209625244D, 0.14170925319194794D, 0.14195016026496887D, 0.14219069480895996D, 0.14244592189788818D, 0.14269237220287323D, 0.1429404616355896D, 0.1431778520345688D, 0.14341974258422852D, 0.14366695284843445D, 0.143928661942482D, 0.14417223632335663D, 0.144425168633461D, 0.14466984570026398D, 0.144924595952034D, 0.14517496526241302D, 0.14541681110858917D, 0.14565762877464294D, 0.14590227603912354D, 0.14615565538406372D, 0.146397665143013D, 0.14664502441883087D, 0.14689862728118896D, 0.14715076982975006D, 0.14740772545337677D, 0.14766333997249603D, 0.1479138731956482D, 0.14816024899482727D, 0.14840947091579437D, 0.14864777028560638D, 0.14889664947986603D, 0.1491481214761734D, 0.1493992805480957D, 0.14964887499809265D, 0.14990657567977905D, 0.150163471698761D, 0.15041270852088928D, 0.1506699174642563D, 0.1509278118610382D, 0.1511797457933426D, 0.15143243968486786D, 0.15168344974517822D, 0.15193966031074524D, 0.15217027068138123D, 0.1524168848991394D, 0.15265515446662903D, 0.15290214121341705D, 0.1531422883272171D, 0.1533876657485962D, 0.15364302694797516D, 0.15389402210712433D, 0.15414564311504364D, 0.15439721941947937D, 0.15463466942310333D, 0.15488171577453613D, 0.15513262152671814D, 0.15537695586681366D, 0.15562325716018677D, 0.1558755785226822D, 0.15611112117767334D, 0.15636210143566132D, 0.1566154956817627D, 0.15687504410743713D, 0.15712611377239227D, 0.15738089382648468D, 0.15762266516685486D, 0.15787272155284882D, 0.15813465416431427D, 0.15839409828186035D, 0.15864822268486023D, 0.15889886021614075D, 0.15914614498615265D, 0.1593829244375229D, 0.15962837636470795D, 0.15988434851169586D, 0.16013933718204498D, 0.1603895127773285D, 0.1606409102678299D, 0.16089800000190735D, 0.16113731265068054D, 0.16138312220573425D, 0.16164162755012512D, 0.1619039922952652D, 0.16216659545898438D, 0.1624208390712738D, 0.16268286108970642D, 0.16292384266853333D, 0.16317801177501678D, 0.16342324018478394D, 0.16366511583328247D, 0.16390013694763184D, 0.16414274275302887D, 0.16438521444797516D, 0.16463032364845276D, 0.16487151384353638D, 0.1651274561882019D, 0.1653711199760437D, 0.16560332477092743D, 0.16584159433841705D, 0.16609609127044678D, 0.16633854806423187D, 0.16659075021743774D, 0.16683602333068848D, 0.16707871854305267D, 0.16732636094093323D, 0.16758735477924347D, 0.16783970594406128D, 0.16809149086475372D, 0.16834628582000732D, 0.16860048472881317D, 0.16885283589363098D, 0.16911184787750244D, 0.1693841814994812D, 0.16964191198349D, 0.1698930859565735D, 0.1701383739709854D, 0.1703755259513855D, 0.17063964903354645D, 0.17089423537254333D, 0.1711474359035492D, 0.171388179063797D, 0.17163044214248657D, 0.17187903821468353D, 0.17215164005756378D, 0.1724054217338562D, 0.17266374826431274D, 0.17292089760303497D, 0.1731615662574768D, 0.17340199649333954D, 0.17366479337215424D, 0.1739150434732437D, 0.17417052388191223D, 0.1744164675474167D, 0.17465999722480774D, 0.1749131977558136D, 0.17516209185123444D, 0.1754201203584671D, 0.17568381130695343D, 0.17593267560005188D, 0.17619283497333527D, 0.17645525932312012D, 0.17671234905719757D, 0.17696595191955566D, 0.17722009122371674D, 0.17747735977172852D, 0.17772412300109863D, 0.17797930538654327D, 0.17823158204555511D, 0.17848974466323853D, 0.17873625457286835D, 0.17898991703987122D, 0.1792307198047638D, 0.1794891506433487D, 0.17973554134368896D, 0.17999310791492462D, 0.18024954199790955D, 0.18050163984298706D, 0.18076446652412415D, 0.18102599680423737D, 0.18126806616783142D, 0.18151478469371796D, 0.18176385760307312D, 0.18201972544193268D, 0.1822776347398758D, 0.18253739178180695D, 0.18278411030769348D, 0.18303966522216797D, 0.1832965612411499D, 0.1835542917251587D, 0.1838156133890152D, 0.1840553879737854D, 0.18431082367897034D, 0.1845688670873642D, 0.18482251465320587D, 0.18506990373134613D, 0.18532750010490417D, 0.18557335436344147D, 0.18582487106323242D, 0.18608145415782928D, 0.18633334338665009D, 0.18658064305782318D, 0.18683351576328278D, 0.18709410727024078D, 0.18735168874263763D, 0.18761134147644043D, 0.18786972761154175D, 0.18811970949172974D, 0.18837547302246094D, 0.18862836062908173D, 0.18887996673583984D, 0.1891300231218338D, 0.18938672542572021D, 0.18964359164237976D, 0.18990398943424225D, 0.19015058875083923D, 0.19040174782276154D, 0.19066479802131653D, 0.19092917442321777D, 0.19117361307144165D, 0.19143356382846832D, 0.19168759882450104D, 0.1919550895690918D, 0.1922134906053543D, 0.19246909022331238D, 0.1927301287651062D, 0.19298666715621948D, 0.19325979053974152D, 0.19350659847259521D, 0.1937701553106308D, 0.19402582943439484D, 0.19428086280822754D, 0.19453628361225128D, 0.19479681551456451D, 0.19505488872528076D, 0.19530737400054932D, 0.1955641359090805D, 0.1958162784576416D, 0.1960599720478058D, 0.19630758464336395D, 0.19656088948249817D, 0.19681763648986816D, 0.19707539677619934D, 0.1973382830619812D, 0.19758382439613342D, 0.19783498346805573D, 0.19810113310813904D, 0.19836364686489105D, 0.198616623878479D, 0.19888028502464294D, 0.1991325318813324D, 0.19938108325004578D, 0.19963473081588745D, 0.19988803565502167D, 0.2001369297504425D, 0.20039276778697968D, 0.20064187049865723D, 0.2009114772081375D, 0.20116636157035828D, 0.20142139494419098D, 0.2016759216785431D, 0.20193830132484436D, 0.20219115912914276D, 0.2024461179971695D, 0.20269548892974854D, 0.20295751094818115D, 0.2032078355550766D, 0.20346446335315704D, 0.20372796058654785D, 0.20398731529712677D, 0.20425032079219818D, 0.20450064539909363D, 0.20475132763385773D, 0.20501857995986938D, 0.20528261363506317D, 0.20554444193840027D, 0.20581212639808655D, 0.20607292652130127D, 0.20632115006446838D, 0.20657122135162354D, 0.20683971047401428D, 0.2071026861667633D, 0.2073436677455902D, 0.20759855210781097D, 0.20785433053970337D, 0.20810873806476593D, 0.20837277173995972D, 0.2086334526538849D, 0.20889252424240112D, 0.2091631293296814D, 0.20941714942455292D, 0.20966646075248718D, 0.20992329716682434D, 0.210189089179039D, 0.2104564607143402D, 0.21071530878543854D, 0.2109697461128235D, 0.21122780442237854D, 0.21149942278862D, 0.21177108585834503D, 0.212026447057724D, 0.21229231357574463D, 0.21255123615264893D, 0.2128051221370697D, 0.2130669802427292D, 0.21332398056983948D, 0.21358664333820343D, 0.2138541340827942D, 0.2141055166721344D, 0.21435829997062683D, 0.21462669968605042D, 0.21488457918167114D, 0.21513977646827698D, 0.21538878977298737D, 0.2156517058610916D, 0.21592454612255096D, 0.216178759932518D, 0.216445192694664D, 0.21670177578926086D, 0.21695657074451447D, 0.21721142530441284D, 0.21747595071792603D, 0.21773701906204224D, 0.2179940938949585D, 0.2182585597038269D, 0.21852922439575195D, 0.2187880575656891D, 0.21905365586280823D, 0.21932736039161682D, 0.21959064900875092D, 0.2198474109172821D, 0.22009959816932678D, 0.22036632895469666D, 0.22063975036144257D, 0.2208988517522812D, 0.2211713194847107D, 0.22143341600894928D, 0.22171543538570404D, 0.22197507321834564D, 0.22224444150924683D, 0.2225213348865509D, 0.22277890145778656D, 0.22304566204547882D, 0.22330500185489655D, 0.22357644140720367D, 0.22383159399032593D, 0.22409124672412872D, 0.22433821856975555D, 0.22459536790847778D, 0.22486494481563568D, 0.22513198852539062D, 0.22539369761943817D, 0.22565101087093353D, 0.22591067850589752D, 0.22616182267665863D, 0.22642919421195984D, 0.22670313715934753D, 0.2269665002822876D, 0.2272244691848755D, 0.22747714817523956D, 0.2277398705482483D, 0.22800278663635254D, 0.22826018929481506D, 0.22853484749794006D, 0.22879329323768616D, 0.22905567288398743D, 0.22932875156402588D, 0.22959567606449127D, 0.22985166311264038D, 0.23012641072273254D, 0.23038911819458008D, 0.23065757751464844D, 0.2309347689151764D, 0.23118633031845093D, 0.23145408928394318D, 0.2317189872264862D, 0.23198048770427704D, 0.2322455197572708D, 0.23250694572925568D, 0.232782781124115D, 0.23303967714309692D, 0.2333066314458847D, 0.23356512188911438D, 0.23384179174900055D, 0.2341168224811554D, 0.23438036441802979D, 0.23465333878993988D, 0.23490497469902039D, 0.2351686954498291D, 0.23543143272399902D, 0.2357012927532196D, 0.23596397042274475D, 0.23622770607471466D, 0.23648853600025177D, 0.23676562309265137D, 0.23701412975788116D, 0.2372843474149704D, 0.23755553364753723D, 0.23782414197921753D, 0.2380770742893219D, 0.23833540081977844D, 0.23858565092086792D, 0.2388562709093094D, 0.2391243726015091D, 0.23939518630504608D, 0.2396606057882309D, 0.2399381399154663D, 0.24020333588123322D, 0.24046452343463898D, 0.24074232578277588D, 0.24100619554519653D, 0.24127767980098724D, 0.24153725802898407D, 0.24180150032043457D, 0.2420664131641388D, 0.24233688414096832D, 0.24260331690311432D, 0.24287430942058563D, 0.24314293265342712D, 0.2434246838092804D, 0.24368378520011902D, 0.24393977224826813D, 0.24419629573822021D, 0.24446481466293335D, 0.24473105370998383D, 0.24499809741973877D, 0.24526169896125793D, 0.24553239345550537D, 0.24579843878746033D, 0.24606765806674957D, 0.24634045362472534D, 0.24660402536392212D, 0.2468681037425995D, 0.2471298724412918D, 0.24741238355636597D, 0.2476801872253418D, 0.2479431927204132D, 0.2482285499572754D, 0.24848723411560059D, 0.24875469505786896D, 0.24903346598148346D, 0.24929732084274292D, 0.24957558512687683D, 0.24984514713287354D, 0.25010985136032104D, 0.25036337971687317D, 0.2506392002105713D, 0.2509065270423889D, 0.25119492411613464D, 0.25146934390068054D, 0.25174203515052795D, 0.25201404094696045D, 0.25227802991867065D, 0.252545565366745D, 0.252820760011673D, 0.2530921697616577D, 0.2533664405345917D, 0.25363945960998535D, 0.2539142072200775D, 0.25417646765708923D, 0.2544398903846741D, 0.2547091245651245D, 0.25498032569885254D, 0.2552673816680908D, 0.25553467869758606D, 0.2558070719242096D, 0.2560715973377228D, 0.2563423812389374D, 0.2566147446632385D, 0.256882905960083D, 0.2571600079536438D, 0.257426381111145D, 0.2576892673969269D, 0.2579575479030609D, 0.25823888182640076D, 0.258513867855072D, 0.2587907612323761D, 0.25906962156295776D, 0.2593492269515991D, 0.25961726903915405D, 0.25989121198654175D, 0.2601594924926758D, 0.26043808460235596D, 0.2607068121433258D, 0.2609749138355255D, 0.26124802231788635D, 0.2615189850330353D, 0.2617867887020111D, 0.2620628774166107D, 0.26233547925949097D, 0.262612521648407D, 0.2628844082355499D, 0.26317137479782104D, 0.26344573497772217D, 0.2637230157852173D, 0.2639881670475006D, 0.26426470279693604D, 0.2645290791988373D, 0.26480042934417725D, 0.26508674025535583D, 0.26537132263183594D, 0.26565036177635193D, 0.2659280598163605D, 0.26621153950691223D, 0.2664932310581207D, 0.266765296459198D, 0.2670402526855469D, 0.26732540130615234D, 0.2676064372062683D, 0.2678873836994171D, 0.26817184686660767D, 0.26845213770866394D, 0.2687281370162964D, 0.2689865827560425D, 0.2692733108997345D, 0.2695508897304535D, 0.26984232664108276D, 0.2701159417629242D, 0.27039632201194763D, 0.2706771194934845D, 0.2709551453590393D, 0.27123481035232544D, 0.2715044319629669D, 0.2717909812927246D, 0.2720479965209961D, 0.27231383323669434D, 0.2725817859172821D, 0.2728441059589386D, 0.27311280369758606D, 0.2733941972255707D, 0.27368631958961487D, 0.2739763855934143D, 0.274264395236969D, 0.2745394706726074D, 0.2748079299926758D, 0.2750902473926544D, 0.2753576934337616D, 0.27563992142677307D, 0.27591678500175476D, 0.2762015461921692D, 0.2764870226383209D, 0.2767705023288727D, 0.2770461440086365D, 0.2773202061653137D, 0.277586430311203D, 0.2778612971305847D, 0.2781475782394409D, 0.27842074632644653D, 0.27869942784309387D, 0.27898266911506653D, 0.27925804257392883D, 0.27953964471817017D, 0.2798300087451935D, 0.28011223673820496D, 0.28038647770881653D, 0.28068000078201294D, 0.280953049659729D, 0.2812424302101135D, 0.2815268635749817D, 0.28180745244026184D, 0.2820815443992615D, 0.28235483169555664D, 0.28263142704963684D, 0.28291577100753784D, 0.2831827402114868D, 0.28346097469329834D, 0.28373128175735474D, 0.28402161598205566D, 0.2842971086502075D, 0.2845851182937622D, 0.2848743200302124D, 0.28514111042022705D, 0.2854291498661041D, 0.28570130467414856D, 0.28598201274871826D, 0.2862635850906372D, 0.2865474224090576D, 0.2868312895298004D, 0.28711485862731934D, 0.287393182516098D, 0.28767767548561096D, 0.2879578173160553D, 0.28823962807655334D, 0.2885189354419708D, 0.28880178928375244D, 0.2890920341014862D, 0.28937217593193054D, 0.28966113924980164D, 0.2899322509765625D, 0.29023706912994385D, 0.2905227243900299D, 0.29082342982292175D, 0.29111379384994507D, 0.2913990020751953D, 0.29169899225234985D, 0.2919909954071045D, 0.2922763526439667D, 0.2925618588924408D, 0.2928437292575836D, 0.29313600063323975D, 0.29342198371887207D, 0.29370519518852234D, 0.293990820646286D, 0.29427266120910645D, 0.29455944895744324D, 0.2948371469974518D, 0.2951136827468872D, 0.29540109634399414D, 0.29569217562675476D, 0.29599061608314514D, 0.29627665877342224D, 0.2965618371963501D, 0.29685071110725403D, 0.29713842272758484D, 0.2974165678024292D, 0.2977107763290405D, 0.29799580574035645D, 0.29828667640686035D, 0.2985561192035675D, 0.29883459210395813D, 0.2991248369216919D, 0.29942139983177185D, 0.2997003495693207D, 0.2999816834926605D, 0.3002794682979584D, 0.300558477640152D, 0.3008628785610199D, 0.3011316657066345D, 0.30142825841903687D, 0.30170485377311707D, 0.30200570821762085D, 0.30228835344314575D, 0.30257362127304077D, 0.3028506934642792D, 0.3031497299671173D, 0.3034270107746124D, 0.3037080466747284D, 0.30399709939956665D, 0.3042883276939392D, 0.30455490946769714D, 0.3048365116119385D, 0.3051189184188843D, 0.305414617061615D, 0.30569401383399963D, 0.3059791922569275D, 0.3062690496444702D, 0.3065638244152069D, 0.30685165524482727D, 0.3071337342262268D, 0.30742549896240234D, 0.3077087104320526D, 0.307993084192276D, 0.308301717042923D, 0.3085950016975403D, 0.30887916684150696D, 0.30916836857795715D, 0.30946359038352966D, 0.3097575008869171D, 0.3100418746471405D, 0.3103356957435608D, 0.3106286823749542D, 0.3109305202960968D, 0.31121826171875D, 0.3115043640136719D, 0.3117966055870056D, 0.3120863735675812D, 0.31238704919815063D, 0.312675416469574D, 0.3129754364490509D, 0.3132772445678711D, 0.31357139348983765D, 0.3138739764690399D, 0.314156711101532D, 0.31446096301078796D, 0.314767062664032D, 0.3150571882724762D, 0.31536349654197693D, 0.31567034125328064D, 0.31597578525543213D, 0.31626302003860474D, 0.3165755569934845D, 0.31686896085739136D, 0.31716006994247437D, 0.3174631595611572D, 0.31774675846099854D, 0.3180374503135681D, 0.31833595037460327D, 0.3186424672603607D, 0.31892913579940796D, 0.3192225694656372D, 0.31952160596847534D, 0.31980904936790466D, 0.32011789083480835D, 0.32043129205703735D, 0.32072004675865173D, 0.32100987434387207D, 0.3213180601596832D, 0.3216226398944855D, 0.3219207525253296D, 0.32221996784210205D, 0.32251104712486267D, 0.3228189945220947D, 0.32310861349105835D, 0.32341235876083374D, 0.32371604442596436D, 0.3240188658237457D, 0.3243238031864166D, 0.3246264159679413D, 0.3249231278896332D, 0.32521936297416687D, 0.32550862431526184D, 0.32581818103790283D, 0.3261036276817322D, 0.32640382647514343D, 0.3267083168029785D, 0.327004998922348D, 0.3272927403450012D, 0.3275948762893677D, 0.32788318395614624D, 0.3281833529472351D, 0.3284815549850464D, 0.32878002524375916D, 0.3290672302246094D, 0.3293750286102295D, 0.3296642303466797D, 0.3299630880355835D, 0.3302602469921112D, 0.3305669128894806D, 0.33086422085762024D, 0.3311595916748047D, 0.33145591616630554D, 0.33177000284194946D, 0.33208441734313965D, 0.3323875963687897D, 0.33268964290618896D, 0.33300232887268066D, 0.33329537510871887D, 0.3335980772972107D, 0.3338931202888489D, 0.334201455116272D, 0.33450081944465637D, 0.33479708433151245D, 0.3350889980792999D, 0.3354017734527588D, 0.3356862962245941D, 0.33597806096076965D, 0.3362779915332794D, 0.33658143877983093D, 0.3368886709213257D, 0.3372003436088562D, 0.3374904990196228D, 0.33780431747436523D, 0.3381199836730957D, 0.3384174108505249D, 0.3387186527252197D, 0.33900177478790283D, 0.33931413292884827D, 0.33961257338523865D, 0.3399102985858917D, 0.34022054076194763D, 0.3405352234840393D, 0.3408523499965668D, 0.3411627411842346D, 0.3414681553840637D, 0.3417760133743286D, 0.3420804738998413D, 0.3423832356929779D, 0.34269484877586365D, 0.34302496910095215D, 0.34334123134613037D, 0.3436470329761505D, 0.34394562244415283D, 0.3442646265029907D, 0.34457018971443176D, 0.34488752484321594D, 0.3452032506465912D, 0.3455159664154053D, 0.34581413865089417D, 0.3461098074913025D, 0.34641650319099426D, 0.3467230796813965D, 0.34702906012535095D, 0.3473309278488159D, 0.34764036536216736D, 0.3479456901550293D, 0.3482525050640106D, 0.34856411814689636D, 0.3488941192626953D, 0.3492147624492645D, 0.34952324628829956D, 0.3498258590698242D, 0.35016393661499023D, 0.3504606783390045D, 0.3507762551307678D, 0.35109102725982666D, 0.3514126241207123D, 0.35172921419143677D, 0.3520503044128418D, 0.35238561034202576D, 0.3527106046676636D, 0.3530224859714508D, 0.3533511757850647D, 0.35365211963653564D, 0.3539552092552185D, 0.35427314043045044D, 0.3545979857444763D, 0.35491013526916504D, 0.355211466550827D, 0.35551631450653076D, 0.35583731532096863D, 0.3561674952507019D, 0.356503427028656D, 0.35681140422821045D, 0.35713064670562744D, 0.3574579656124115D, 0.3577730655670166D, 0.3580852746963501D, 0.35840508341789246D, 0.3587261736392975D, 0.3590567708015442D, 0.35936981439590454D, 0.35967788100242615D, 0.3599919378757477D, 0.36031630635261536D, 0.3606279492378235D, 0.360944539308548D, 0.3612835109233856D, 0.36159858107566833D, 0.36191561818122864D, 0.3622327446937561D, 0.36255162954330444D, 0.36288535594940186D, 0.3632265329360962D, 0.36356231570243835D, 0.36387547850608826D, 0.3641921877861023D, 0.3645060658454895D, 0.36482110619544983D, 0.36514586210250854D, 0.3654731512069702D, 0.3657870292663574D, 0.366103857755661D, 0.3664219379425049D, 0.3667573034763336D, 0.3670819103717804D, 0.36740440130233765D, 0.3677348494529724D, 0.3680580258369446D, 0.3683835566043854D, 0.36869534850120544D, 0.3690166771411896D, 0.36936962604522705D, 0.3697071671485901D, 0.3700341284275055D, 0.3703477680683136D, 0.3706650137901306D, 0.37098345160484314D, 0.3713064193725586D, 0.3716377019882202D, 0.3719581365585327D, 0.3722735345363617D, 0.3726058304309845D, 0.3729363977909088D, 0.37326177954673767D, 0.37356603145599365D, 0.3738855719566345D, 0.3742108941078186D, 0.37452539801597595D, 0.3748537600040436D, 0.3751770555973053D, 0.3755142092704773D, 0.37582820653915405D, 0.3761524558067322D, 0.3764798045158386D, 0.3767988681793213D, 0.37712106108665466D, 0.37743860483169556D, 0.3777543902397156D, 0.37809327244758606D, 0.37840941548347473D, 0.37875550985336304D, 0.37908700108528137D, 0.37941306829452515D, 0.3797505497932434D, 0.38008758425712585D, 0.3804277181625366D, 0.3807571530342102D, 0.3810791075229645D, 0.38141703605651855D, 0.3817656934261322D, 0.38210225105285645D, 0.3824288845062256D, 0.382769376039505D, 0.38310790061950684D, 0.38344258069992065D, 0.3837745189666748D, 0.3841177821159363D, 0.38443708419799805D, 0.3847852945327759D, 0.3851090669631958D, 0.3854374289512634D, 0.38577699661254883D, 0.38612180948257446D, 0.38646358251571655D, 0.3868139684200287D, 0.38715416193008423D, 0.3874974548816681D, 0.3878219425678253D, 0.3881516456604004D, 0.38848888874053955D, 0.3888251483440399D, 0.38917040824890137D, 0.38950109481811523D, 0.38981884717941284D, 0.3901572823524475D, 0.39050623774528503D, 0.39083072543144226D, 0.39116042852401733D, 0.3915018141269684D, 0.3918399214744568D, 0.39218366146087646D, 0.3925294280052185D, 0.3928794264793396D, 0.39322105050086975D, 0.39356595277786255D, 0.39390116930007935D, 0.39424818754196167D, 0.39459410309791565D, 0.39493328332901D, 0.39526739716529846D, 0.39559459686279297D, 0.39594566822052D, 0.3962780237197876D, 0.39662104845046997D, 0.3969428539276123D, 0.3972987234592438D, 0.39764490723609924D, 0.39799994230270386D, 0.3983498811721802D, 0.39869624376296997D, 0.3990347385406494D, 0.39939403533935547D, 0.39974305033683777D, 0.4000907838344574D, 0.40044382214546204D, 0.4007917642593384D, 0.40111610293388367D, 0.4014665186405182D, 0.40181636810302734D, 0.40216636657714844D, 0.40252143144607544D, 0.4028819799423218D, 0.40323081612586975D, 0.4035872519016266D, 0.40394827723503113D, 0.4042988121509552D, 0.4046299159526825D, 0.40498116612434387D, 0.4053340256214142D, 0.4056835174560547D, 0.40604034066200256D, 0.40639346837997437D, 0.40674713253974915D, 0.4070903956890106D, 0.4074479639530182D, 0.4077978730201721D, 0.40815556049346924D, 0.4085153043270111D, 0.4088471829891205D, 0.40920335054397583D, 0.409536749124527D, 0.40988242626190186D, 0.4102332293987274D, 0.41057583689689636D, 0.4109056293964386D, 0.4112517535686493D, 0.41158610582351685D, 0.411954402923584D, 0.4123139977455139D, 0.4126741290092468D, 0.41304558515548706D, 0.4134019911289215D, 0.413760781288147D, 0.414113849401474D, 0.4144744575023651D, 0.4148549735546112D, 0.4152146577835083D, 0.4155882000923157D, 0.41595014929771423D, 0.41632524132728577D, 0.41668492555618286D, 0.4170358180999756D, 0.417406290769577D, 0.4177599251270294D, 0.4181312918663025D, 0.4184896945953369D, 0.4188544452190399D, 0.41922518610954285D, 0.419583797454834D, 0.41994741559028625D, 0.42030736804008484D, 0.4206812381744385D, 0.4210386574268341D, 0.4214108884334564D, 0.42178136110305786D, 0.42215496301651D, 0.4225171208381653D, 0.4228813350200653D, 0.42325109243392944D, 0.423615962266922D, 0.4239715337753296D, 0.42434579133987427D, 0.42472386360168457D, 0.42510300874710083D, 0.4254789650440216D, 0.4258454144001007D, 0.4262089729309082D, 0.4265795052051544D, 0.4269504249095917D, 0.42731940746307373D, 0.4276832640171051D, 0.42804470658302307D, 0.4284045994281769D, 0.42876332998275757D, 0.4291493892669678D, 0.4295348823070526D, 0.4299010634422302D, 0.43027088046073914D, 0.43064936995506287D, 0.43101370334625244D, 0.4313836097717285D, 0.43177637457847595D, 0.43216753005981445D, 0.4325481057167053D, 0.43293753266334534D, 0.4333171844482422D, 0.4336993396282196D, 0.4340720772743225D, 0.43445608019828796D, 0.43482720851898193D, 0.43520474433898926D, 0.4355813264846802D, 0.435965895652771D, 0.4363478720188141D, 0.4367339015007019D, 0.43710440397262573D, 0.4374915361404419D, 0.43787166476249695D, 0.4382757544517517D, 0.4386570155620575D, 0.4390236437320709D, 0.43937790393829346D, 0.43978676199913025D, 0.4401753544807434D, 0.44054529070854187D, 0.4409463107585907D, 0.4413623809814453D, 0.44173145294189453D, 0.44210049510002136D, 0.44250327348709106D, 0.4428851902484894D, 0.44325748085975647D, 0.44363629817962646D, 0.4440159797668457D, 0.4443915784358978D, 0.4447783827781677D, 0.44518083333969116D, 0.4455743432044983D, 0.44597482681274414D, 0.44637376070022583D, 0.4467555284500122D, 0.4471644163131714D, 0.44755885004997253D, 0.44794702529907227D, 0.44833505153656006D, 0.44871219992637634D, 0.44911694526672363D, 0.44951802492141724D, 0.44992169737815857D, 0.45028671622276306D, 0.45069053769111633D, 0.4510745704174042D, 0.45147672295570374D, 0.4518676698207855D, 0.45226404070854187D, 0.4526667594909668D, 0.45307374000549316D, 0.45347461104393005D, 0.453886479139328D, 0.4542858898639679D, 0.45466384291648865D, 0.4550491273403168D, 0.45543593168258667D, 0.4558371901512146D, 0.45624276995658875D, 0.4566361904144287D, 0.457043319940567D, 0.45746922492980957D, 0.4578607976436615D, 0.458267480134964D, 0.45867159962654114D, 0.4590873718261719D, 0.459495484828949D, 0.4598916471004486D, 0.46029186248779297D, 0.46069759130477905D, 0.46110185980796814D, 0.4615064859390259D, 0.46192145347595215D, 0.46233877539634705D, 0.46276673674583435D, 0.46316519379615784D, 0.4635927677154541D, 0.4640122056007385D, 0.46440884470939636D, 0.4648398756980896D, 0.4652484059333801D, 0.4656558334827423D, 0.46607261896133423D, 0.4665050506591797D, 0.4669226109981537D, 0.46733230352401733D, 0.4677324891090393D, 0.46813610196113586D, 0.4685579836368561D, 0.4689575731754303D, 0.46935874223709106D, 0.4697929620742798D, 0.4702039957046509D, 0.4706023335456848D, 0.47102463245391846D, 0.4714542329311371D, 0.47186529636383057D, 0.47227713465690613D, 0.47273728251457214D, 0.47315338253974915D, 0.4735952317714691D, 0.4740048050880432D, 0.4744380712509155D, 0.47486940026283264D, 0.47530895471572876D, 0.47574278712272644D, 0.4761829376220703D, 0.47661855816841125D, 0.4770328402519226D, 0.4774709641933441D, 0.477912038564682D, 0.47833552956581116D, 0.47877728939056396D, 0.4792020618915558D, 0.47962984442710876D, 0.48004886507987976D, 0.48047083616256714D, 0.48091474175453186D, 0.48136579990386963D, 0.4817824363708496D, 0.48223716020584106D, 0.4826858341693878D, 0.483129620552063D, 0.48356717824935913D, 0.48402535915374756D, 0.4844686985015869D, 0.48492634296417236D, 0.4853666424751282D, 0.48579952120780945D, 0.48623910546302795D, 0.4866853952407837D, 0.4871336817741394D, 0.4875692129135132D, 0.4880107045173645D, 0.48845070600509644D, 0.4888957142829895D, 0.48936671018600464D, 0.4898100197315216D, 0.49028757214546204D, 0.4907471537590027D, 0.49118760228157043D, 0.49167636036872864D, 0.4921429753303528D, 0.49261200428009033D, 0.49306604266166687D, 0.4935230314731598D, 0.4939839243888855D, 0.49443933367729187D, 0.49487918615341187D, 0.495321661233902D, 0.49577128887176514D, 0.4962393343448639D, 0.4967193901538849D, 0.4971999526023865D, 0.4976634979248047D, 0.4981079697608948D, 0.4985779821872711D, 0.4990575909614563D, 0.4995216429233551D, 0.49998214840888977D, 0.5004438757896423D, 0.5009346604347229D, 0.5013915300369263D, 0.5018666386604309D, 0.5023337006568909D, 0.5028214454650879D, 0.5032830238342285D, 0.5037580728530884D, 0.5042566061019897D, 0.5047234296798706D, 0.5052047967910767D, 0.5056884288787842D, 0.506147027015686D, 0.5066317915916443D, 0.5071203708648682D, 0.5075882077217102D, 0.5080697536468506D, 0.5085747838020325D, 0.5090773105621338D, 0.5095798373222351D, 0.5100753307342529D, 0.5105835199356079D, 0.5110831260681152D, 0.5115672945976257D, 0.5120378136634827D, 0.5125263929367065D, 0.5130169987678528D, 0.5135247707366943D, 0.5140180587768555D, 0.5145205855369568D, 0.5150368213653564D, 0.5155346989631653D, 0.516032874584198D, 0.5165354609489441D, 0.5170459747314453D, 0.517546534538269D, 0.5180581212043762D, 0.5185604691505432D, 0.5190833210945129D, 0.5195894837379456D, 0.5200911164283752D, 0.5206009149551392D, 0.5211076736450195D, 0.5216162204742432D, 0.5221534967422485D, 0.5226559638977051D, 0.5232011079788208D, 0.5237134099006653D, 0.524222731590271D, 0.5247693657875061D, 0.5253021121025085D, 0.5258720517158508D, 0.5263900756835938D, 0.5269289612770081D, 0.527440071105957D, 0.527983546257019D, 0.5285229086875916D, 0.5290459990501404D, 0.5295710563659668D, 0.5301372408866882D, 0.5306873917579651D, 0.5312291383743286D, 0.5317577123641968D, 0.5322787761688232D, 0.5328095555305481D, 0.5333465933799744D, 0.5338669419288635D, 0.5344110131263733D, 0.5349779725074768D, 0.535515308380127D, 0.5360614657402039D, 0.5366105437278748D, 0.5371830463409424D, 0.5377721190452576D, 0.5383244156837463D, 0.5388537049293518D, 0.5394071340560913D, 0.5399731397628784D, 0.5405322909355164D, 0.5410723090171814D, 0.541620671749115D, 0.5421631336212158D, 0.5427330136299133D, 0.5433263778686523D, 0.543902575969696D, 0.5445014834403992D, 0.5451188087463379D, 0.54570472240448D, 0.5462703108787537D, 0.5468359589576721D, 0.5474085211753845D, 0.5479677319526672D, 0.5485826134681702D, 0.5491936206817627D, 0.5497756004333496D, 0.550329864025116D, 0.5509083271026611D, 0.5514797568321228D, 0.5520867705345154D, 0.5526585578918457D, 0.5532442331314087D, 0.5538352131843567D, 0.554451048374176D, 0.5550478100776672D, 0.5556716322898865D, 0.5562905669212341D, 0.5568975210189819D, 0.5575076937675476D, 0.55810546875D, 0.5587112903594971D, 0.5593138933181763D, 0.5599293112754822D, 0.560528576374054D, 0.5611559748649597D, 0.5618165731430054D, 0.5624411702156067D, 0.5630917549133301D, 0.5637422204017639D, 0.5643942356109619D, 0.565030038356781D, 0.5656741857528687D, 0.5663131475448608D, 0.5669856071472168D, 0.5676253437995911D, 0.5682467818260193D, 0.5688928961753845D, 0.5695339441299438D, 0.5701755881309509D, 0.5708367824554443D, 0.5714528560638428D, 0.5721008777618408D, 0.572792112827301D, 0.5734336972236633D, 0.5740956664085388D, 0.5747833847999573D, 0.5754809975624084D, 0.5761705636978149D, 0.5768662095069885D, 0.5775163769721985D, 0.5782217979431152D, 0.5789486169815063D, 0.5796666145324707D, 0.5803557634353638D, 0.581061065196991D, 0.5817610025405884D, 0.5824694633483887D, 0.5831955671310425D, 0.5839105844497681D, 0.5846039056777954D, 0.5852735042572021D, 0.585961639881134D, 0.5866875052452087D, 0.5874256491661072D, 0.5881643891334534D, 0.5888875722885132D, 0.5896194577217102D, 0.5903604030609131D, 0.5911058783531189D, 0.5918967723846436D, 0.5926496982574463D, 0.5934140086174011D, 0.5941669344902039D, 0.5949351787567139D, 0.5956904292106628D, 0.5964735746383667D, 0.5972592830657959D, 0.5980729460716248D, 0.5988597869873047D, 0.599652111530304D, 0.6004453897476196D, 0.6012773513793945D, 0.6020792722702026D, 0.6028953194618225D, 0.6037645936012268D, 0.6045876145362854D, 0.6053803563117981D, 0.6061732172966003D, 0.6070164442062378D, 0.607831597328186D, 0.6086806058883667D, 0.6095685958862305D, 0.6104097962379456D, 0.6112634539604187D, 0.6120801568031311D, 0.6129648685455322D, 0.61387699842453D, 0.6147569417953491D, 0.6155954599380493D, 0.616402268409729D, 0.6172897219657898D, 0.6181901693344116D, 0.6190983653068542D, 0.6199691891670227D, 0.6208701133728027D, 0.6217461824417114D, 0.6226446032524109D, 0.6236084699630737D, 0.6245348453521729D, 0.6254535913467407D, 0.6264715194702148D, 0.627429187297821D, 0.6283873319625854D, 0.6293536424636841D, 0.6303542852401733D, 0.6313357353210449D, 0.6323064565658569D, 0.6332805156707764D, 0.6342861652374268D, 0.6353551745414734D, 0.6363866329193115D, 0.6374404430389404D, 0.6384573578834534D, 0.6395328044891357D, 0.640578031539917D, 0.6416310667991638D, 0.6427513360977173D, 0.6438618302345276D, 0.6449521780014038D, 0.6460468173027039D, 0.6471554636955261D, 0.6482812166213989D, 0.6493995189666748D, 0.6506232619285583D, 0.6517972946166992D, 0.6529961228370667D, 0.6542066931724548D, 0.6553934216499329D, 0.6565525531768799D, 0.6577653288841248D, 0.659013569355011D, 0.6602596640586853D, 0.6615633964538574D, 0.6628472805023193D, 0.6642037034034729D, 0.6654988527297974D, 0.6668195128440857D, 0.6681184768676758D, 0.6694334149360657D, 0.6707931756973267D, 0.6722204685211182D, 0.6736778020858765D, 0.6750837564468384D, 0.6765458583831787D, 0.6780242919921875D, 0.6794694662094116D, 0.6809762716293335D, 0.6825757026672363D, 0.6842136383056641D, 0.6857424974441528D, 0.6873693466186523D, 0.6890041828155518D, 0.6906958222389221D, 0.6923577785491943D, 0.6941602230072021D, 0.6958938241004944D, 0.6976979374885559D, 0.6996030807495117D, 0.7014617919921875D, 0.7033551931381226D, 0.7053101062774658D, 0.7073088884353638D, 0.7093900442123413D, 0.7115321159362793D, 0.7136979699134827D, 0.7159866690635681D, 0.7184513211250305D, 0.7208492159843445D, 0.7233277559280396D, 0.725836992263794D, 0.7282920479774475D, 0.7309600114822388D, 0.7337514162063599D, 0.7369317412376404D, 0.7400341629981995D, 0.7431910634040833D, 0.7465731501579285D, 0.7502389550209045D, 0.7539366483688354D, 0.7578595280647278D, 0.7620136737823486D, 0.7664995193481445D, 0.7713850736618042D, 0.7766971588134766D, 0.7824797630310059D, 0.7896102666854858D, 0.7976230382919312D, 0.8072929978370667D, 0.8200995326042175D, 0.8393367528915405D, 0.8953311443328857D}; - - @Test - static void testDistribution() { - - FastNoiseLite noise = new FastNoiseLite(); - noise.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); - noise.setFrequency(0.02f); - noise.setFractalType(FastNoiseLite.FractalType.FBm); - noise.setFractalOctaves(4); - System.out.println(noise); - int attempts = 8; - int[] numbers = new int[attempts]; - double min = Integer.MAX_VALUE; - double max = Integer.MIN_VALUE; - - - for(int i = 0; i < attempts; i++) { - numbers[i] = 0; - } - - long l = System.nanoTime(); - for(int i = 0; i < 1000000; i++) { - double n = noise.getNoise(0, i); - max = FastMath.max(max, n); - min = FastMath.min(min, n); - numbers[normalize(n, attempts)]++; - } - long l2 = System.nanoTime() - l; - System.out.println("Took " + (double) l2 / 1000000 + "ms (" + ((double) l2 / 1000000) + "ns per."); - - l = System.nanoTime(); - for(int i = 0; i < 1000000; i++) { - double n = noise.getNoise(0, i); - max = FastMath.max(max, n); - min = FastMath.min(min, n); - } - l2 = System.nanoTime() - l; - System.out.println("Took " + (double) l2 / 1000000 + "ms (" + ((double) l2 / 1000000) + "ns per."); - - for(int i = 0; i < attempts; i++) { - System.out.println(i + ": " + numbers[i]); - } - for(int i = 0; i < attempts; i++) { - System.out.print(i + " |"); - for(int j = 0; j < numbers[i] / 250; j++) { - System.out.print("-"); - } - System.out.println("|"); - } - System.out.println("max: " + max); - System.out.println("min: " + min); - } - - public static int normalize(double d, int num) { - int start = 0; - int end = normalMap.length - 1; - while(start + 1 < end) { - int mid = start + (end - start) / 2; - if(normalMap[mid] <= d) { - start = mid; - } else { - end = mid; - } - } - double left = FastMath.abs(normalMap[start] - d); - double right = FastMath.abs(normalMap[end] - d); - if(left <= right) { - return start * (num) / (normalMap.length); - } - return end * (num) / (normalMap.length); - } - - public static int normal(double d, int max) { - double ranged = FastMath.max(0, FastMath.min((d + 1) / 2D, 1)); - return (int) (ranged * max); - } -} diff --git a/src/test/java/LookupGenerator.java b/src/test/java/LookupGenerator.java deleted file mode 100644 index 7063a0788..000000000 --- a/src/test/java/LookupGenerator.java +++ /dev/null @@ -1,136 +0,0 @@ -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.gaea.util.GlueList; -import net.jafama.FastMath; -import org.junit.jupiter.api.Test; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - -class LookupGenerator { - private static double[] lookup; - - @Test - static void main(String[] args) throws InterruptedException { - int dist = 4096; - - List vals = new GlueList<>(); - FastNoiseLite noise = new FastNoiseLite(); - noise.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); - noise.setFrequency(0.02f); - int[] numbers = new int[dist]; - double min = Integer.MAX_VALUE; - double max = Integer.MIN_VALUE; - for(int i = 0; i < dist; i++) { - numbers[i] = 0; - } - - int workerAmount = 16; - - List workers = new GlueList<>(); - - for(int i = 0; i < workerAmount; i++) { - workers.add(new Worker(new GlueList<>(), 5000000, noise)); - } - - for(Worker w : workers) { - w.start(); - } - for(Worker w : workers) { - System.out.println("Waiting for Worker " + workers.indexOf(w)); - w.join(); - } - - for(Worker w : workers) { - vals.addAll(w.getResult()); - } - - System.out.println("Generated " + vals.size() + " values."); - - for(int i = 0; i < dist; i++) { - System.out.println(i + ": " + numbers[i]); - } - for(int i = 0; i < dist; i++) { - System.out.print(i + (String.valueOf(i).length() == 1 ? " " : "") + " |"); - for(int j = 0; j < numbers[i] / 300; j++) { - System.out.print("-"); - } - System.out.println("|"); - } - System.out.println("max: " + max); - System.out.println("min: " + min); - Collections.sort(vals); - - lookup = new double[dist]; - StringBuilder s = new StringBuilder("{"); - for(int i = 0; i < dist; i++) { - int current = vals.size() / dist; - System.out.println(i + ", max: " + vals.get(current * (i + 1) - 1)); - lookup[i] = vals.get(current * (i + 1) - 1); - s.append(vals.get(current * (i + 1) - 1)).append("D, "); - } - s.delete(s.length() - 2, s.length()); - s.append("}"); - numbers = new int[dist]; - vals = new ArrayList<>(); - for(int i = 0; i < 10000000; i++) { - double n = noise.getNoise(0, i); - vals.add(n); - numbers[normalizeNew(n)]++; - } - - for(int i = 0; i < dist; i++) { - System.out.println(i + ": " + numbers[i]); - } - for(int i = 0; i < dist; i++) { - System.out.print(i + (String.valueOf(i).length() == 1 ? " " : "") + " |"); - for(int j = 0; j < numbers[i] / 100; j++) { - System.out.print("-"); - } - System.out.println("|"); - } - System.out.println(s.toString()); - - } - - public static int normalizeNew(double d) { - for(int i = 0; i < lookup.length; i++) { - if(d < lookup[i]) return i; - } - return lookup.length - 1; - } - - public static int normalize(double i, int n) { - i *= 1.42; // Magic simplex value (sqrt(2) plus a little) - i = FastMath.min(FastMath.max(i, -1), 1); - return FastMath.min((int) FastMath.floor((i + 1) * ((double) n / 2)), n - 1); - } - - private static class Worker extends Thread { - private final List l; - private final int searches; - private final FastNoiseLite noise; - - public Worker(List l, int searches, FastNoiseLite noise) { - this.l = l; - this.searches = searches; - this.noise = noise; - } - - @Override - public void run() { - for(int i = 0; i < searches; i++) { - double n = noise.getNoise(0, i); - l.add(n); - } - } - - public List getResult() { - return l; - } - - public String getStatus() { - return "Generating values. " + l.size() + "/" + searches + " (" + ((long) l.size() * 100L) / searches + "%)"; - } - } -} diff --git a/src/test/java/NoiseInstancePerformanceTest.java b/src/test/java/NoiseInstancePerformanceTest.java deleted file mode 100644 index 66693c40b..000000000 --- a/src/test/java/NoiseInstancePerformanceTest.java +++ /dev/null @@ -1,17 +0,0 @@ -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import org.junit.jupiter.api.Test; - -public class NoiseInstancePerformanceTest { - @Test - public void performance() { - FastNoiseLite noiseLite = new FastNoiseLite(2403); - long l = System.nanoTime(); - for(int i = 0; i < 10000000; i++) noiseLite.getNoise(i, i); - System.out.println("No instantiation: " + (System.nanoTime() - l) / 1000000 + "ms"); - for(int i = 0; i < 10000000; i++) { - FastNoiseLite noiseLite1 = new FastNoiseLite(2403); - noiseLite1.getNoise(i, i); - } - System.out.println("Instantiation: " + (System.nanoTime() - l) / 1000000 + "ms"); - } -} diff --git a/src/test/java/NoiseTest.java b/src/test/java/NoiseTest.java deleted file mode 100644 index 346b4e5a0..000000000 --- a/src/test/java/NoiseTest.java +++ /dev/null @@ -1,52 +0,0 @@ -import com.dfsek.terra.generation.config.NoiseBuilder; -import com.dfsek.terra.math.NoiseFunction2; -import org.junit.jupiter.api.Test; -import parsii.eval.Expression; - -import java.util.Arrays; - -public class NoiseTest { - @Test - public void noise() { - NoiseFunction2 noiseFunction = new NoiseFunction2(12345, new NoiseBuilder()); - System.out.println("Cache:"); - int a = 0; - for(int i = 0; i < 200; i++) { - long l = System.nanoTime(); - for(int j = 0; j < 1000; j++) { - for(int x = 0; x < 4; x++) { - for(int y = 0; y < 64; y++) { - for(int z = 0; z < 4; z++) { - noiseFunction.eval(Arrays.asList(get(j * 16 + (x * 4)), get(i * 16 + (z * 4)))); - } - } - } - } - double n = System.nanoTime() - l; - System.out.print((long) n / 1000000 + "ms" + ((a % 10 == 0) ? "\n" : " ")); - a++; - } - System.out.println(); - System.out.println(); - System.out.println("No Cache:"); - for(int i = 0; i < 200; i++) { - long l = System.nanoTime(); - for(int j = 0; j < 1000; j++) { - for(int x = 0; x < 4; x++) { - for(int y = 0; y < 64; y++) { - for(int z = 0; z < 4; z++) { - noiseFunction.evalNoCache(Arrays.asList(get(j * 16 + (x * 4)), get(i * 16 + (z * 4)))); - } - } - } - } - double n = System.nanoTime() - l; - System.out.print((long) n / 1000000 + "ms" + ((a % 10 == 0) ? "\n" : " ")); - a++; - } - } - - private Expression get(double val) { - return () -> val; - } -} diff --git a/src/test/java/RangeTest.java b/src/test/java/RangeTest.java deleted file mode 100644 index 74e10b23c..000000000 --- a/src/test/java/RangeTest.java +++ /dev/null @@ -1,39 +0,0 @@ -import com.dfsek.terra.api.gaea.math.Range; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; - -public class RangeTest { - @Test - public void iterator() { - Range m = new Range(0, 100); - int i = 0; - for(int mint : m) { - assertEquals(i, mint); - i++; - } - assertEquals(100, i); - } - - @Test - public void intersect() { - Range one = new Range(10, 100); - Range two = new Range(1, 20); - Range intersect = one.intersects(two); - assertEquals(20, intersect.getMax()); - assertEquals(10, intersect.getMin()); - assertEquals(one.intersects(two), two.intersects(one)); - - one = new Range(25, 50); - assertNull(one.intersects(two)); - } - - @Test - public void reflect() { - Range t = new Range(3, 10); - Range other = t.reflect(5); - assertEquals(7, other.getMax()); - assertEquals(0, other.getMin()); - } -} From 0261ecdcbb791b9a9af995a79885d97b9c88db08 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 11 Dec 2020 17:31:06 -0700 Subject: [PATCH 022/210] for some reason these werent in the changelist --- .../com/dfsek/terra/api/generic/generator/ChunkGenerator.java | 4 ++++ .../java/com/dfsek/terra/config/templates/BiomeTemplate.java | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) rename {src => common/src}/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java (95%) rename {src => common/src}/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java (99%) diff --git a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java b/common/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java similarity index 95% rename from src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java rename to common/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java index 09593b2f8..4b939c4ce 100644 --- a/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.generic.world.BiomeGrid; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.BlockData; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Random; @@ -25,6 +26,9 @@ public interface ChunkGenerator extends Handle { List getDefaultPopulators(World world); + @Nullable + TerraChunkGenerator getTerraGenerator(); + interface ChunkData { Object getHandle(); diff --git a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java similarity index 99% rename from src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java rename to common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index f31a012e4..2f9183dd6 100644 --- a/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -85,7 +85,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf @Default private List flora = new GlueList<>(); - @Value("trees") + //@Value("trees") @Abstractable @Default private List trees = new GlueList<>(); From 4e9c7e0b913c2e6cc6ec03b2a49d9cb5f84b1ac5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 11 Dec 2020 17:45:49 -0700 Subject: [PATCH 023/210] Carving --- .../api/generic/world/block/MaterialData.java | 2 + .../dfsek/terra/population/CavePopulator.java | 23 ++++-- .../world/block/BukkitMaterialData.java | 5 ++ platforms/fabric/build.gradle.kts | 12 +++ .../dfsek/terra/fabric/TerraFabricPlugin.java | 76 +++++++++++++++++++ 5 files changed, 111 insertions(+), 7 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java index b3f18f746..0180a65f0 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java @@ -12,4 +12,6 @@ public interface MaterialData extends Handle { boolean isAir(); double getMaxDurability(); + + BlockData createBlockData(); } diff --git a/common/src/main/java/com/dfsek/terra/population/CavePopulator.java b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java index fc2403c38..39215e784 100644 --- a/common/src/main/java/com/dfsek/terra/population/CavePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java @@ -1,16 +1,27 @@ package com.dfsek.terra.population; +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.carving.UserDefinedCarver; +import com.dfsek.terra.config.base.ConfigPack; +import com.dfsek.terra.config.templates.CarverTemplate; +import com.dfsek.terra.util.PopulationUtil; import org.jetbrains.annotations.NotNull; import java.util.HashMap; +import java.util.HashSet; import java.util.Map; import java.util.Random; +import java.util.Set; public class CavePopulator implements TerraBlockPopulator { private final TerraPlugin main; @@ -23,9 +34,9 @@ public class CavePopulator implements TerraBlockPopulator { @SuppressWarnings("try") @Override public void populate(@NotNull World world, @NotNull Random r, @NotNull Chunk chunk) { - /* TerraWorld tw = main.getWorld(world); WorldHandle handle = main.getWorldHandle(); + BlockData AIR = handle.createBlockData("minecraft:air"); try(ProfileFuture ignored = tw.getProfiler().measure("CaveTime")) { Random random = PopulationUtil.getRandom(chunk); if(!tw.isSafe()) return; @@ -33,7 +44,7 @@ public class CavePopulator implements TerraBlockPopulator { for(UserDefinedCarver c : config.getCarvers()) { CarverTemplate template = c.getConfig(); - Map shiftCandidate = new HashMap<>(); + Map shiftCandidate = new HashMap<>(); Set updateNeeded = new HashSet<>(); c.carve(chunk.getX(), chunk.getZ(), world, (v, type) -> { Block b = chunk.getBlock(v.getBlockX(), v.getBlockY(), v.getBlockZ()); @@ -69,15 +80,15 @@ public class CavePopulator implements TerraBlockPopulator { break; } }); - for(Map.Entry entry : shiftCandidate.entrySet()) { + for(Map.Entry entry : shiftCandidate.entrySet()) { Location l = entry.getKey(); Location mut = l.clone(); - Material orig = handle.getType(l.getBlock()); + MaterialData orig = handle.getType(l.getBlock()); do mut.subtract(0, 1, 0); while(handle.getType(mut.getBlock()).equals(orig)); try { if(template.getShift().get(entry.getValue()).contains(mut.getBlock().getType())) { - handle.setBlockData(mut.getBlock(), shiftStorage.computeIfAbsent(entry.getValue(), Material::createBlockData), false); + handle.setBlockData(mut.getBlock(), shiftStorage.computeIfAbsent(entry.getValue(), MaterialData::createBlockData), false); } } catch(NullPointerException ignore) { } @@ -90,7 +101,5 @@ public class CavePopulator implements TerraBlockPopulator { } } - - */ } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java index 7c561a8fe..9a7acf859 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java @@ -36,6 +36,11 @@ public class BukkitMaterialData implements MaterialData { return delegate.getMaxDurability(); } + @Override + public BlockData createBlockData() { + return new BukkitBlockData(delegate.createBlockData()); + } + @Override public Material getHandle() { return delegate; diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 9a963f72d..2f0900def 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -17,4 +17,16 @@ dependencies { testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0") implementation(project(":common")) + implementation("org.apache.commons:commons-rng-core:1.3") + + + implementation("com.scireum:parsii:1.2.1") + implementation("com.dfsek:Tectonic:1.0.3") + implementation("net.jafama:jafama:2.3.2") + + compileOnly("com.googlecode.json-simple:json-simple:1.1") + + implementation("com.google.guava:guava:30.0-jre") + + compileOnly("org.jetbrains:annotations:20.1.0") } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java new file mode 100644 index 000000000..6d74b8175 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -0,0 +1,76 @@ +package com.dfsek.terra.fabric; + +import com.dfsek.tectonic.loading.TypeRegistry; +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.lang.Language; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.inventory.ItemHandle; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.config.base.PluginConfig; +import com.dfsek.terra.registry.ConfigRegistry; + +import java.io.File; +import java.util.logging.Logger; + +public class TerraFabricPlugin implements TerraPlugin { + @Override + public WorldHandle getWorldHandle() { + return null; + } + + @Override + public boolean isEnabled() { + return false; + } + + @Override + public TerraWorld getWorld(World world) { + return null; + } + + @Override + public Logger getLogger() { + return null; + } + + @Override + public PluginConfig getTerraConfig() { + return null; + } + + @Override + public File getDataFolder() { + return null; + } + + @Override + public boolean isDebug() { + return false; + } + + @Override + public Language getLanguage() { + return null; + } + + @Override + public ConfigRegistry getRegistry() { + return null; + } + + @Override + public void reload() { + + } + + @Override + public ItemHandle getItemHandle() { + return null; + } + + @Override + public void register(TypeRegistry registry) { + + } +} From 15100caf32001217a5202eacf817ab7613979547 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 11 Dec 2020 17:51:09 -0700 Subject: [PATCH 024/210] Ocean --- .../java/com/dfsek/terra/config/base/ConfigPack.java | 2 +- .../com/dfsek/terra/config/templates/BiomeTemplate.java | 9 +++++++-- .../com/dfsek/terra/generation/TerraChunkGenerator.java | 2 +- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index c73fbeedb..664a2f3c7 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -143,7 +143,7 @@ public class ConfigPack implements LoaderRegistrar { .open("ores").then(streams -> buildAll(new OreFactory(), oreRegistry, abstractConfigLoader.load(streams, OreTemplate::new), main)).close() .open("flora").then(streams -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.load(streams, FloraTemplate::new), main)).close() .open("carving").then(streams -> buildAll(new CarverFactory(this), carverRegistry, abstractConfigLoader.load(streams, CarverTemplate::new), main)).close() - .open("biomes").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this)), main)).close() + .open("biomes").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this, main)), main)).close() .open("grids").then(streams -> buildAll(new BiomeGridFactory(), biomeGridRegistry, abstractConfigLoader.load(streams, BiomeGridTemplate::new), main)).close(); for(UserDefinedBiome b : biomeRegistry.entries()) { try { diff --git a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index 2f9183dd6..d82f72dc0 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -7,10 +7,12 @@ import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.Biome; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.biome.palette.PaletteHolder; +import com.dfsek.terra.biome.palette.SinglePalette; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.generation.items.TerraStructure; @@ -30,6 +32,8 @@ import java.util.Map; public class BiomeTemplate extends AbstractableTemplate implements ValidatedConfigTemplate { private final ConfigPack pack; + + @Value("id") private String id; @@ -73,7 +77,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf @Value("ocean.palette") @Abstractable @Default - private Palette oceanPalette = null; + private Palette oceanPalette; @Value("elevation.equation") @Default @@ -152,8 +156,9 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf return stairPalettes; } - public BiomeTemplate(ConfigPack pack) { + public BiomeTemplate(ConfigPack pack, TerraPlugin main) { this.pack = pack; + oceanPalette = new SinglePalette<>(main.getWorldHandle().createBlockData("minecraft:water")); } public String getElevationEquation() { diff --git a/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index 328d12e55..4fd96339c 100644 --- a/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -155,7 +155,7 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato } 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)); if(justSet && c.doSlabs()) { SlabUtil.prepareBlockPartCeiling(data, chunk.getBlockData(x, y, z), chunk, new Vector3(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); } From 27dbd494bdae613e08bf6d7b2a7d47405bd3a854 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 11 Dec 2020 19:31:25 -0700 Subject: [PATCH 025/210] Rotation & tree stuff --- .../api/gaea/tree/fractal/FractalTree.java | 12 ++++- .../com/dfsek/terra/api/generic/Tree.java | 2 +- .../terra/api/generic/world/WorldHandle.java | 3 ++ .../dfsek/terra/config/base/ConfigPack.java | 8 ++-- .../dfsek/terra/registry/TreeRegistry.java | 13 +++++- .../com/dfsek/terra/bukkit/BukkitTree.java | 44 ++++++++++++++++++- .../dfsek/terra/bukkit/BukkitWorldHandle.java | 22 ++++++++-- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 5 ++- .../terra/bukkit/util/BukkitConversions.java | 6 +++ .../world/block/data/BukkitEnumAdapter.java | 3 ++ .../block/data/BukkitMultipleFacing.java | 37 ++++++++++++++++ .../bukkit/world/block/data/BukkitStairs.java | 5 +-- .../world/block/data/BukkitWaterlogged.java | 3 +- .../world/block/data/TerraEnumAdapter.java | 3 ++ 14 files changed, 149 insertions(+), 17 deletions(-) create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java index f8fed6916..f2e58762d 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.gaea.tree.fractal; +import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.generic.Entity; import com.dfsek.terra.api.generic.TerraPlugin; @@ -12,10 +13,11 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Random; +import java.util.Set; import java.util.function.Consumer; -public abstract class FractalTree { +public abstract class FractalTree implements Tree { private final Map treeAssembler = new HashMap<>(); private final List entities = new GlueList<>(); private final Location origin; @@ -110,5 +112,13 @@ public abstract class FractalTree { return treeAssembler.getOrDefault(l, main.getWorldHandle().createBlockData("minecraft:air")).getMaterial(); } + @Override + public boolean plant(Location l, Random r) { + return false; + } + @Override + public Set getSpawnable() { + return null; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/generic/Tree.java b/common/src/main/java/com/dfsek/terra/api/generic/Tree.java index d3f584d9f..5dadfb11d 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/Tree.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/Tree.java @@ -1,4 +1,4 @@ package com.dfsek.terra.api.generic; -public interface Tree extends Handle { +public interface Tree extends Handle, com.dfsek.terra.api.gaea.tree.Tree { } diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java b/common/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java index 1e33c4f50..d438c5df3 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.generic.world; +import com.dfsek.terra.api.generic.Tree; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; @@ -17,4 +18,6 @@ public interface WorldHandle { BlockData createBlockData(String data); MaterialData createMaterialData(String data); + + Tree getTree(String id); } diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 664a2f3c7..f0bc3d7db 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -77,7 +77,7 @@ public class ConfigPack implements LoaderRegistrar { private final PaletteRegistry paletteRegistry; private final FloraRegistry floraRegistry; private final OreRegistry oreRegistry = new OreRegistry(); - private final TreeRegistry treeRegistry = new TreeRegistry(); + private final TreeRegistry treeRegistry; private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); private final ConfigLoader selfLoader = new ConfigLoader(); @@ -88,7 +88,8 @@ public class ConfigPack implements LoaderRegistrar { public ConfigPack(File folder, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); floraRegistry = new FloraRegistry(main); - paletteRegistry = new PaletteRegistry(main); + paletteRegistry = new PaletteRegistry(main); + treeRegistry = new TreeRegistry(main); register(abstractConfigLoader); main.register(selfLoader); @@ -108,7 +109,8 @@ public class ConfigPack implements LoaderRegistrar { public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); floraRegistry = new FloraRegistry(main); - paletteRegistry = new PaletteRegistry(main); + paletteRegistry = new PaletteRegistry(main); + treeRegistry = new TreeRegistry(main); register(abstractConfigLoader); main.register(selfLoader); diff --git a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java index 93e7c4dbd..8f4a6340b 100644 --- a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java @@ -1,9 +1,20 @@ package com.dfsek.terra.registry; import com.dfsek.terra.api.gaea.tree.Tree; +import com.dfsek.terra.api.generic.TerraPlugin; public class TreeRegistry extends TerraRegistry { - public TreeRegistry() { + private final TerraPlugin main; + public TreeRegistry(TerraPlugin main) { + this.main = main; + } + + private void addTree(String id) { + try { + add(id, main.getWorldHandle().getTree(id)); + } catch(IllegalArgumentException e) { + main.getLogger().warning("Unable to load tree " + id + ": " + e.getMessage()); + } } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java index b931c904f..fe35f0f7c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java @@ -1,17 +1,59 @@ package com.dfsek.terra.bukkit; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.Tree; +import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.bukkit.util.BukkitConversions; +import com.dfsek.terra.util.MaterialSet; import org.bukkit.TreeType; +import java.util.Random; +import java.util.Set; + public class BukkitTree implements Tree { private final TreeType delegate; + private final MaterialSet spawnable; + private final TerraPlugin main; - public BukkitTree(TreeType delegate) { + public BukkitTree(TreeType delegate, TerraPlugin main) { this.delegate = delegate; + this.main = main; + this.spawnable = getSpawnable(delegate); + } + + private MaterialSet getSpawnable(TreeType type) { + WorldHandle handle = main.getWorldHandle(); + switch(type) { + case CRIMSON_FUNGUS: + return MaterialSet.get(handle.createMaterialData("minecraft:crimson_nylium")); + case WARPED_FUNGUS: + return MaterialSet.get(handle.createMaterialData("minecraft:warped_nylium")); + case BROWN_MUSHROOM: + case RED_MUSHROOM: + return MaterialSet.get(handle.createMaterialData("minecraft:mycelium"), handle.createMaterialData("minecraft:grass_block"), + handle.createMaterialData("minecraft:podzol")); + case CHORUS_PLANT: + return MaterialSet.get(handle.createMaterialData("minecraft:end_stone")); + default: + return MaterialSet.get(handle.createMaterialData("minecraft:grass_block"), handle.createMaterialData("minecraft:dirt"), + handle.createMaterialData("minecraft:podzol")); + } } @Override public TreeType getHandle() { return delegate; } + + @Override + public boolean plant(Location l, Random r) { + return ((BukkitWorld) l.getWorld()).getHandle().generateTree(BukkitConversions.toBukkitLocation(l), delegate); + } + + @Override + public Set getSpawnable() { + return spawnable; + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java index 67f155368..2566a891d 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java @@ -1,19 +1,29 @@ package com.dfsek.terra.bukkit; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.Tree; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.generic.world.block.data.Waterlogged; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; +import com.dfsek.terra.bukkit.world.block.data.BukkitMultipleFacing; import com.dfsek.terra.bukkit.world.block.data.BukkitStairs; import com.dfsek.terra.bukkit.world.block.data.BukkitWaterlogged; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.TreeType; +import org.bukkit.block.data.MultipleFacing; +import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Stairs; public class BukkitWorldHandle implements WorldHandle { + private final TerraPlugin main; + + public BukkitWorldHandle(TerraPlugin main) { + this.main = main; + } @Override public void setBlockData(Block block, BlockData data, boolean physics) { @@ -33,8 +43,9 @@ public class BukkitWorldHandle implements WorldHandle { @Override public BlockData createBlockData(String data) { org.bukkit.block.data.BlockData bukkitData = Bukkit.createBlockData(data); - if(bukkitData instanceof Stairs) return new BukkitStairs(bukkitData); - if(bukkitData instanceof Waterlogged) return new BukkitWaterlogged(bukkitData); + if(bukkitData instanceof MultipleFacing) return new BukkitMultipleFacing((MultipleFacing) bukkitData); + if(bukkitData instanceof Stairs) return new BukkitStairs((Stairs) bukkitData); + if(bukkitData instanceof Waterlogged) return new BukkitWaterlogged((Waterlogged) bukkitData); return new BukkitBlockData(Bukkit.createBlockData(data)); } @@ -42,4 +53,9 @@ public class BukkitWorldHandle implements WorldHandle { public MaterialData createMaterialData(String data) { return new BukkitMaterialData(Material.matchMaterial(data)); } + + @Override + public Tree getTree(String id) { + return new BukkitTree(TreeType.valueOf(id), main); + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 53d4aed51..cc6127304 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -45,7 +45,8 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { private final Map worlds = new HashMap<>(); private final ConfigRegistry registry = new ConfigRegistry(); private final PluginConfig config = new PluginConfig(); - private WorldHandle handle = new BukkitWorldHandle(); + private final ItemHandle itemHandle = new BukkitItemHandle(); + private WorldHandle handle = new BukkitWorldHandle(this); private final GenericLoaders genericLoaders = new GenericLoaders(this); @@ -61,7 +62,7 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { @Override public ItemHandle getItemHandle() { - return null; + return itemHandle; } public void setHandle(WorldHandle handle) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java index 31aea01c9..674a22010 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java @@ -1,10 +1,16 @@ package com.dfsek.terra.bukkit.util; import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.bukkit.BukkitWorld; +import org.bukkit.Location; import org.bukkit.util.Vector; public final class BukkitConversions { public static Vector3 toTerraVector(Vector bukkit) { return new Vector3(bukkit.getX(), bukkit.getY(), bukkit.getZ()); } + + public static Location toBukkitLocation(com.dfsek.terra.api.generic.world.vector.Location terra) { + return new Location(((BukkitWorld) terra.getWorld()).getHandle(), terra.getX(), terra.getY(), terra.getZ()); + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java index da2a6a54c..7e4d70508 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java @@ -5,6 +5,9 @@ import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.data.Bisected; import com.dfsek.terra.api.generic.world.block.data.Stairs; +/** + * Utility class to adapt Bukkit enums to Terra enums. + */ public final class BukkitEnumAdapter { public static Stairs.Shape fromBukkitStair(org.bukkit.block.data.type.Stairs.Shape shape) { switch(shape) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java new file mode 100644 index 000000000..265599cba --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.bukkit.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.data.MultipleFacing; +import com.dfsek.terra.bukkit.world.block.BukkitBlockData; + +import java.util.Set; +import java.util.stream.Collectors; + +public class BukkitMultipleFacing extends BukkitBlockData implements MultipleFacing { + private final org.bukkit.block.data.MultipleFacing delegate; + + public BukkitMultipleFacing(org.bukkit.block.data.MultipleFacing delegate) { + super(delegate); + this.delegate = delegate; + } + + @Override + public Set getFaces() { + return delegate.getFaces().stream().map(BukkitEnumAdapter::fromBukkitBlockFace).collect(Collectors.toSet()); + } + + @Override + public void setFace(BlockFace face, boolean facing) { + delegate.setFace(TerraEnumAdapter.fromTerraBlockFace(face), facing); + } + + @Override + public Set getAllowedFaces() { + return delegate.getAllowedFaces().stream().map(BukkitEnumAdapter::fromBukkitBlockFace).collect(Collectors.toSet()); + } + + @Override + public boolean hasFace(BlockFace f) { + return delegate.hasFace(TerraEnumAdapter.fromTerraBlockFace(f)); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java index 8b0f86879..3d6cb4fac 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java @@ -3,14 +3,13 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.data.Stairs; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; -import org.bukkit.block.data.BlockData; public class BukkitStairs extends BukkitBlockData implements Stairs { private final org.bukkit.block.data.type.Stairs stairs; - public BukkitStairs(BlockData delegate) { + public BukkitStairs(org.bukkit.block.data.type.Stairs delegate) { super(delegate); - this.stairs = (org.bukkit.block.data.type.Stairs) delegate; + this.stairs = delegate; } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java index 3f0f8e1d9..905497237 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java @@ -2,12 +2,11 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.generic.world.block.data.Waterlogged; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; -import org.bukkit.block.data.BlockData; public class BukkitWaterlogged extends BukkitBlockData implements Waterlogged { private boolean waterlogged; - public BukkitWaterlogged(BlockData delegate) { + public BukkitWaterlogged(org.bukkit.block.data.Waterlogged delegate) { super(delegate); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java index 317284259..5a7bc923c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java @@ -5,6 +5,9 @@ import com.dfsek.terra.api.generic.world.block.BlockFace; import org.bukkit.block.data.Bisected; import org.bukkit.block.data.type.Stairs; +/** + * Utility class to adapt Terra enums to Bukkit enums + */ public final class TerraEnumAdapter { public static Stairs.Shape fromTerraStair(com.dfsek.terra.api.generic.world.block.data.Stairs.Shape shape) { switch(shape) { From d84dd3a52673f10a0ffafc777f2c7824f7b0770c Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 12 Dec 2020 01:44:56 -0700 Subject: [PATCH 026/210] Super basic Fabric stuff --- .gitignore | 2 + build.gradle.kts | 3 + platforms/fabric/build.gradle.kts | 33 +++++++ .../dfsek/terra/fabric/TerraFabricPlugin.java | 52 ++++++++++- .../fabric/inventory/FabricItemHandle.java | 12 +++ .../fabric/inventory/FabricItemStack.java | 44 +++++++++ .../terra/fabric/mixin/GeneratorAccessor.java | 15 +++ .../terra/fabric/world/BlockStorage.java | 29 ++++++ .../terra/fabric/world/FabricAdapters.java | 10 ++ .../dfsek/terra/fabric/world/FabricBlock.java | 75 +++++++++++++++ .../terra/fabric/world/FabricBlockData.java | 33 +++++++ .../dfsek/terra/fabric/world/FabricChunk.java | 38 ++++++++ .../fabric/world/FabricMaterialData.java | 48 ++++++++++ .../dfsek/terra/fabric/world/FabricWorld.java | 86 ++++++++++++++++++ .../terra/fabric/world/FabricWorldHandle.java | 39 ++++++++ .../world/generator/FabricChunkGenerator.java | 52 +++++++++++ .../src/main/resources/assets/terra/icon.png | Bin 0 -> 145505 bytes .../resources/assets/terra/lang/en_us.json | 4 + .../fabric/src/main/resources/fabric.mod.json | 30 ++++++ .../src/main/resources/terra.accesswidener | 3 + .../src/main/resources/terra.mixins.json | 14 +++ settings.gradle.kts | 22 +++++ 22 files changed, 642 insertions(+), 2 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorAccessor.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/BlockStorage.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlockData.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricChunk.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorld.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java create mode 100644 platforms/fabric/src/main/resources/assets/terra/icon.png create mode 100644 platforms/fabric/src/main/resources/assets/terra/lang/en_us.json create mode 100644 platforms/fabric/src/main/resources/fabric.mod.json create mode 100644 platforms/fabric/src/main/resources/terra.accesswidener create mode 100644 platforms/fabric/src/main/resources/terra.mixins.json diff --git a/.gitignore b/.gitignore index 6d85c9383..eb4cb9a50 100644 --- a/.gitignore +++ b/.gitignore @@ -137,3 +137,5 @@ build !lib/*.jar .idea/Terra.iml +/run/ +/run/ diff --git a/build.gradle.kts b/build.gradle.kts index 976352fbc..d0568a914 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -27,6 +27,9 @@ repositories { maven { url = uri("http://maven.enginehub.org/repo/") } maven { url = uri("https://repo.codemc.org/repository/maven-public") } maven { url = uri("https://papermc.io/repo/repository/maven-public/") } + maven { url = uri("https://maven.fabricmc.net/") } + gradlePluginPortal() + jcenter() } java { diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index 2f0900def..d653666dd 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -2,6 +2,8 @@ plugins { java maven idea + id("fabric-loom").version("0.5-SNAPSHOT") + id("com.github.johnrengelman.shadow") } group = "com.dfsek.terra.bukkit" @@ -11,6 +13,17 @@ repositories { maven { url = uri("http://maven.enginehub.org/repo/") } maven { url = uri("https://repo.codemc.org/repository/maven-public") } maven { url = uri("https://papermc.io/repo/repository/maven-public/") } + jcenter() + maven { + name = "Fabric" + url = uri("https://maven.fabricmc.net/") + } + gradlePluginPortal() +} + + +minecraft { + accessWidener("src/main/resources/terra.accesswidener") } dependencies { @@ -29,4 +42,24 @@ dependencies { implementation("com.google.guava:guava:30.0-jre") compileOnly("org.jetbrains:annotations:20.1.0") + + // To change the versions see the gradle.properties file + minecraft("com.mojang:minecraft:1.16.4") + mappings("net.fabricmc:yarn:1.16.4+build.6:v2") + modImplementation("net.fabricmc:fabric-loader:0.10.6+build.214") + + // Fabric API. This is technically optional, but you probably want it anyway. + modImplementation("net.fabricmc.fabric-api:fabric-api:0.25.1+build.416-1.16") } + +tasks.named("shadowJar") { + + archiveClassifier.set("") + archiveBaseName.set("Terra") + setVersion(project.version) + relocate("org.apache.commons", "com.dfsek.terra.lib.commons") + relocate("parsii", "com.dfsek.terra.lib.parsii") + relocate("net.jafama", "com.dfsek.terra.lib.jafama") + relocate("com.dfsek.tectonic", "com.dfsek.terra.lib.tectonic") + minimize() +} \ No newline at end of file diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 6d74b8175..8788d76d1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -8,12 +8,39 @@ import com.dfsek.terra.api.generic.inventory.ItemHandle; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.config.base.PluginConfig; +import com.dfsek.terra.fabric.inventory.FabricItemHandle; import com.dfsek.terra.registry.ConfigRegistry; +import net.fabricmc.api.ModInitializer; +import net.minecraft.client.world.GeneratorType; +import net.minecraft.util.registry.Registry; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; +import net.minecraft.world.gen.chunk.FlatChunkGenerator; +import net.minecraft.world.gen.chunk.FlatChunkGeneratorConfig; +import net.minecraft.world.gen.chunk.StructuresConfig; import java.io.File; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Collections; +import java.util.List; +import java.util.Optional; import java.util.logging.Logger; -public class TerraFabricPlugin implements TerraPlugin { +public class TerraFabricPlugin implements TerraPlugin, ModInitializer { + private static final GeneratorType TERRA = new GeneratorType("terra") { + @Override + protected ChunkGenerator getChunkGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed) { + FlatChunkGeneratorConfig config = new FlatChunkGeneratorConfig( + new StructuresConfig(Optional.empty(), Collections.emptyMap()), biomeRegistry); + config.updateLayerBlocks(); + return new FlatChunkGenerator(config); + } + }; + private final Logger logger = Logger.getLogger("Terra"); + private final ItemHandle itemHandle = new FabricItemHandle(); + @Override public WorldHandle getWorldHandle() { return null; @@ -31,7 +58,7 @@ public class TerraFabricPlugin implements TerraPlugin { @Override public Logger getLogger() { - return null; + return logger; } @Override @@ -73,4 +100,25 @@ public class TerraFabricPlugin implements TerraPlugin { public void register(TypeRegistry registry) { } + + @SuppressWarnings("unchecked") + @Override + public void onInitialize() { + logger.info("Initializing Terra..."); + Class generatorTypeClass = GeneratorType.class; + + try { + Field values = generatorTypeClass.getDeclaredField("VALUES"); + values.setAccessible(true); + + Field modifiersField = Field.class.getDeclaredField("modifiers"); + + modifiersField.setAccessible(true); + modifiersField.setInt(values, values.getModifiers() & ~Modifier.FINAL); + + ((List) values.get(null)).add(TERRA); // TODO: This is incredibly yucky and should be replaced by Mixin as soon as possible. + } catch(NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java new file mode 100644 index 000000000..312de6e83 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.fabric.inventory; + +import com.dfsek.terra.api.generic.inventory.ItemHandle; +import com.dfsek.terra.api.generic.inventory.ItemStack; +import com.dfsek.terra.api.generic.world.block.MaterialData; + +public class FabricItemHandle implements ItemHandle { + @Override + public ItemStack newItemStack(MaterialData material, int amount) { + return null; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java new file mode 100644 index 000000000..dc71067be --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java @@ -0,0 +1,44 @@ +package com.dfsek.terra.fabric.inventory; + +import com.dfsek.terra.api.generic.inventory.ItemStack; +import com.dfsek.terra.api.generic.inventory.item.ItemMeta; +import com.dfsek.terra.api.generic.world.block.MaterialData; + +public class FabricItemStack implements ItemStack { + net.minecraft.item.ItemStack delegate; + + @Override + public int getAmount() { + return delegate.getCount(); + } + + @Override + public void setAmount(int i) { + delegate.setCount(i); + } + + @Override + public MaterialData getType() { + return null; + } + + @Override + public ItemStack clone() { + return null; + } + + @Override + public ItemMeta getItemMeta() { + return null; + } + + @Override + public void setItemMeta(ItemMeta meta) { + + } + + @Override + public Object getHandle() { + return delegate; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorAccessor.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorAccessor.java new file mode 100644 index 000000000..1b4f1712a --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorAccessor.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.fabric.mixin; + +import net.minecraft.client.world.GeneratorType; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(GeneratorType.class) +public class GeneratorAccessor { + @Accessor("VALUES") + public static List getValues() { + throw new AssertionError(); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/BlockStorage.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/BlockStorage.java new file mode 100644 index 000000000..a0ad63b04 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/BlockStorage.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.api.generic.world.vector.Location; +import net.minecraft.block.Block; +import net.minecraft.world.World; + +public class BlockStorage { + private final Block block; + private final Location location; + + public BlockStorage(Block block, Location location) { + this.block = block; + this.location = location; + } + + public Block getBlock() { + return block; + } + + public Location getLocation() { + return location; + } + + public World getWorld() { + return ((FabricWorld) location.getWorld()).getHandle(); + } + + +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java new file mode 100644 index 000000000..068a21b4a --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.api.generic.world.vector.Vector3; +import net.minecraft.util.math.BlockPos; + +public final class FabricAdapters { + public static BlockPos fromVector(Vector3 v) { + return new BlockPos(v.getBlockX(), v.getBlockY(), v.getBlockZ()); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java new file mode 100644 index 000000000..616e59562 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java @@ -0,0 +1,75 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.vector.Location; + +public class FabricBlock implements Block { + private final BlockStorage delegate; + + public FabricBlock(BlockStorage block) { + this.delegate = block; + } + + @Override + public void setBlockData(BlockData data, boolean physics) { + delegate.getWorld().setBlockState(FabricAdapters.fromVector(delegate.getLocation().getVector()), ((FabricBlockData) data).getHandle(), 0, 0); + } + + @Override + public BlockData getBlockData() { + return null; + } + + @Override + public Block getRelative(BlockFace face) { + return null; + } + + @Override + public Block getRelative(BlockFace face, int len) { + return null; + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public Location getLocation() { + return delegate.getLocation(); + } + + @Override + public MaterialData getType() { + return null; + } + + @Override + public int getX() { + return delegate.getLocation().getBlockX(); + } + + @Override + public int getZ() { + return delegate.getLocation().getBlockZ(); + } + + @Override + public int getY() { + return delegate.getLocation().getBlockY(); + } + + @Override + public boolean isPassable() { + return false; + } + + @Override + public BlockStorage getHandle() { + return delegate; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlockData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlockData.java new file mode 100644 index 000000000..d09519002 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlockData.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import net.minecraft.block.BlockState; + +public class FabricBlockData implements BlockData { + private final BlockState delegate; + + public FabricBlockData(BlockState delegate) { + this.delegate = delegate; + } + + @Override + public MaterialData getMaterial() { + return null; + } + + @Override + public boolean matches(MaterialData materialData) { + return false; + } + + @Override + public BlockData clone() { + return null; + } + + @Override + public BlockState getHandle() { + return delegate; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricChunk.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricChunk.java new file mode 100644 index 000000000..927e81de7 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricChunk.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.Block; + +public class FabricChunk implements Chunk { + private final net.minecraft.world.chunk.Chunk chunk; + + public FabricChunk(net.minecraft.world.chunk.Chunk chunk) { + this.chunk = chunk; + } + + @Override + public int getX() { + return chunk.getPos().x; + } + + @Override + public int getZ() { + return chunk.getPos().z; + } + + @Override + public World getWorld() { + return null; + } + + @Override + public Block getBlock(int x, int y, int z) { + return null; + } + + @Override + public net.minecraft.world.chunk.Chunk getHandle() { + return chunk; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java new file mode 100644 index 000000000..75c18de15 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import net.minecraft.block.Material; + +public class FabricMaterialData implements MaterialData { + private final Material delegate; + + public FabricMaterialData(Material delegate) { + this.delegate = delegate; + } + + @Override + public boolean matches(MaterialData other) { + return delegate.equals(((FabricMaterialData) other).getHandle()); + } + + @Override + public boolean matches(BlockData other) { + return delegate.equals(((FabricMaterialData) other.getMaterial()).getHandle()); + } + + @Override + public boolean isSolid() { + return delegate.isSolid(); + } + + @Override + public boolean isAir() { + return delegate.blocksMovement(); // TODO: better impl + } + + @Override + public double getMaxDurability() { + return 0; + } + + @Override + public BlockData createBlockData() { + return null; + } + + @Override + public Material getHandle() { + return delegate; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorld.java new file mode 100644 index 000000000..a99da20d4 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorld.java @@ -0,0 +1,86 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.api.generic.Entity; +import com.dfsek.terra.api.generic.Tree; +import com.dfsek.terra.api.generic.generator.ChunkGenerator; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.vector.Location; + +import java.io.File; +import java.util.UUID; +import java.util.function.Consumer; + +public class FabricWorld implements World { + private final net.minecraft.world.World delegate; + + public FabricWorld(net.minecraft.world.World delegate) { + this.delegate = delegate; + } + + @Override + public long getSeed() { + return 1234; + } + + @Override + public int getMaxHeight() { + return delegate.getDimensionHeight(); + } + + @Override + public ChunkGenerator getGenerator() { + return null; + } + + @Override + public String getName() { + return delegate.toString(); + } + + @Override + public UUID getUID() { + return null; + } + + @Override + public boolean isChunkGenerated(int x, int z) { + return false; + } + + @Override + public Chunk getChunkAt(int x, int z) { + return null; + } + + @Override + public File getWorldFolder() { + return null; + } + + @Override + public Block getBlockAt(int x, int y, int z) { + return null; + } + + @Override + public Block getBlockAt(Location l) { + return null; + } + + @Override + public boolean generateTree(Location l, Tree vanillaTreeType) { + return false; + } + + @Override + public void spawn(Location location, Class entity, Consumer consumer) { + + } + + @Override + public net.minecraft.world.World getHandle() { + return delegate; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java new file mode 100644 index 000000000..87aeac210 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -0,0 +1,39 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.api.generic.Tree; +import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; + +public class FabricWorldHandle implements WorldHandle { + @Override + public void setBlockData(Block block, BlockData data, boolean physics) { + + } + + @Override + public BlockData getBlockData(Block block) { + return null; + } + + @Override + public MaterialData getType(Block block) { + return null; + } + + @Override + public BlockData createBlockData(String data) { + return null; + } + + @Override + public MaterialData createMaterialData(String data) { + return null; + } + + @Override + public Tree getTree(String id) { + return null; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java new file mode 100644 index 000000000..e8feffae0 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.fabric.world.generator; + +import com.mojang.serialization.Codec; +import net.minecraft.world.BlockView; +import net.minecraft.world.ChunkRegion; +import net.minecraft.world.Heightmap; +import net.minecraft.world.WorldAccess; +import net.minecraft.world.biome.source.BiomeSource; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.gen.StructureAccessor; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.chunk.StructuresConfig; + +public class FabricChunkGenerator extends ChunkGenerator { + public FabricChunkGenerator(BiomeSource biomeSource, StructuresConfig structuresConfig) { + super(biomeSource, structuresConfig); + } + + public FabricChunkGenerator(BiomeSource populationSource, BiomeSource biomeSource, StructuresConfig structuresConfig, long worldSeed) { + super(populationSource, biomeSource, structuresConfig, worldSeed); + } + + @Override + protected Codec getCodec() { + return null; + } + + @Override + public ChunkGenerator withSeed(long seed) { + return null; + } + + @Override + public void buildSurface(ChunkRegion region, Chunk chunk) { + + } + + @Override + public void populateNoise(WorldAccess world, StructureAccessor accessor, Chunk chunk) { + + } + + @Override + public int getHeight(int x, int z, Heightmap.Type heightmapType) { + return 0; + } + + @Override + public BlockView getColumnSample(int x, int z) { + return null; + } +} diff --git a/platforms/fabric/src/main/resources/assets/terra/icon.png b/platforms/fabric/src/main/resources/assets/terra/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..39b6d20f664e4bc854d0e51a3e06b9103fab0929 GIT binary patch literal 145505 zcmX_obyQr<7v#hs0Rn*l0|ZHMm*5@<5;i zbL!EmORUzV3&qXu$$j%&o9X%|jIVEB|9!Pd*2kfBM%d4Gw$vBSES=BI%RBu%!Z~d$ zJ${iixJ7D%;Z!G`+LOLu%54)d?bwo{Q#q=q^yc*k3&qQm;niK9_ImO6s)BiPiml7n zo87N;Bk7A>VUN7m*AHzGg1|IdrJ_iOD4X2fjFuislV;b5Akp%%xdlO##M!mW;P)Vq z^*8Z)2H+3>y(T55ug&$nYB(!8E3s>5^^mvG_AF>tg~TpHzorL2=0^7^kY{HugOPy` z@liH_K$+mAYHCeWtP3YhC%25GmU3%R-2~-{Kf-cS!nWk2p}b}qWF=FqVv#B~kt|a} zm|C*+4EVs4{>c5`C(7lkj!SpWt4h-EA015%eTk0@CSh=KE7<3PL3F{h?nBxoSemk;m2 zAkZI7`a%ui7$;8syJwDShVDV%aI-R)4YUwz8oCMTd-yr)^(PhS>6$~5upste;S5-4 znD+z<2&7^aO&UdFKIK`G+3safaos+)!sRM&G&YCz*!3Tdx$vApbw3Jk&Eg`7*hTV! zOeu%tfkd-rU=$+A+rjT;$#XH}gHw*o1+9?E?#GLsPM(Zeym?JUDD|J5(~4er^9mJ> z71pJ1HSuxSV^5%Otss?R)$%(K=m^Vu@DxXJjuwG7J;lcT*Z~d1%*MD$L;A3-5j|*==-kthG)C9JDqt~HFqb*!D zgXyg2$>cPxmjhzZ*atZrr3?!`{^yzlepcza=kGy#TEu2f_e;QDTVKpg1ABLe%P+rU zuYB9F*LJjwYCWO!EI^=6_!e?aFASfvNH47v60 z{acXtlbnL&tyJUaRfQD(2&|?bMR{`jq#mst6Raf=%_ehu`T075u$X81VY4vJJt+{o z$-@+Q+3R=PvcTbL4L~k#F&kj#h}j9~zcRKQx3u9wE!bNwKpuyg^_$-Ai(Fp#&RVfZ z*FIC8#}LVhlN~v~0(F>O9Fm{|aVDykTmYG-HG|O{S;MGLMkP}?%a-RM`Agf8*n~xd z>h9G~epiAwyEchDRV?kuen5zn;vfN&Z@|ni6<@wcy=!{F-kldIA2|ZvuWB?R+$Nfw zidE)r5Qxxz@o^SDaBNNmne3h2TXPVoLtGd2WrV+y7^8dP=l&~>yYm#NTWj1+4BX~B zmmkv#Ad@%kQr8NDX)L0nrH%yX$4Dtvu|oUA=#I_6v4$dCQ+)t|%>T>y%sCrtWm7O( zzva|WZ^XXLETSZj=%9Qk=v+U{5Foq#3vRMMcvpYWzvKmm#8`cn#eJE&#(*_1-7C;P zxxHv&O^b*<810d*7ghV}q9yjnpGpDulTkuc5b*2v3x&s`-u^>v^D#uPn7)0PK+3%< z$Scqf816{{IRFo6{9iO?V`20sXPyoQRz?B5MjXNP!_H>3`#l2`qw=2mPa6j@$Pu$o zv}P0;KU2N|A3=_g2HtqzzHeQrc*R-%sCGtEm311sp=vbw@Edo@!|GfrSv+#FW0jK2 zE;KN#guwh+TP)TyP0lR)^fd@1*a?KX#D6%r!U+}CqLwaFI9n)&i zqDr$Dr&=hKHFK}pAObI**;F&Da7xN1(zPl>Vd`(OMufxt9e{(}r$63-aHNY#r?E*& zTG^P5R~1)cIFF=LlCy_b+sgm@g!o}L0@Cd#TC!fkH-G1&{oz?Xd7?%L)8T)IL|-=m z8Kl!-eXk?Sw57aTx0I3Iz~*$l_jE+)HuBq_*Tb4_Fjz=LT7E^$E+%Q(@>h(##P0}S z7O~v~fAURtFsLK4V;T#jQJd<1}nD7_j4@{L$Vbiz?RKJHyTNjc|U(VQ#Pg(u}$YA-Mb z`I1_sU8Uqv97ZtkC_PsL(`S>~6RX7qHjRzv&npmux>8Lpz#(Izq7_3YP6Z>Odeng~ zFpTi1h-Di&uPja8%jqHC+1)SgM35=3%vkFGZMzDQ^A<1yp=va#ywdiYtHh_2&xm$T zTXo#Y*@GA-cf3Bx6^vpMGORu^*Kuug9LLZ7EaF7J*NM zuY*uVe>-92*T7b6x>t;^+C1;SuxYZ#!Oz1NW`j2qqu&ZEk4FY_V9Bv!eMfGJU4=HB z)Ve@ur&(pWne_RK=tp6}%^pPn9lQLteg(Q<7gO9GU1WkKuoERd^`t9Xd93ezDX4GO zkMEn@O3sh6Sk66cx(R696PN#!YX7-Fu-IQPxh&GCh_om=Fp3@Cl)Pvlqb~f&r5ar) zdaM%Wo9pue!;c?dF#M55zi}sQ+D&A=X8+&Jv3_%iywX}^9(;s;hnOam*lgxdp-ic0 z)+|VqVSyu>HmcOY5#ro&;Rn5Gysv59qX>zZk4U>S-A)0}zCCnl5G}AL960nBxR`)u zdJJ%aTwxiX!`57HcSl1zgGTSr%y$07U#U@~-8kP10UQ!?rb?Z#{o(+ln1I3!{q&lp(Io%1P1Jah3U&1Z|?F*er3Zm8S!P z?(GK@dwrhCZkLkh^6vr$=KtTo9_|&6lA`Svmg`&XOOEiPtSExpRHKpvUYU?(q?A!| zI(qtGei9XZi(eS^XhXT2NP{bU&Pm!7e2!q&?A!~3)`zavJfipv%LlC^if2iokC<8j zVSEI5{s#=2=%ij>yQ-gJd;Q0&H=cbIA7}WmylJQXH)g+HK}pMuQDB$31L=P0m4G}p zw}v@gp|Jh=(-bu5en{Ig{mP5|JVrFA(C=lk>{&0nz?(fWh2kJ#G}CG~KbpeF>ttfq zMaVSw2;PBfZrl2qL5gq8F|}xV{NjljAZXNJlpYm{uo%9yhe>GAXa1sxf=o;g)}UzP z>DXk-77)l4S#RSN$Tg(6@O)>*U}sbvRr-0Sjk~Vh?dmSb=fw2Oc?eCgV7y_JX)?4w zaoxejSZ_^Jk@Qn}fBD?)skE_C%_f(AUs!bPNyKs${;gP$T=5xG>&HfbG8-sg0-{wQ z+R$ZWblGX-IOAb2eYxJ#`fzkw*~p0J=bHCwbb>}8X;7o4hVvOd!%56$7me`7B?j>) zeV6q3vOuM-u#+zvu#e_56Ro)BF-h}ia)K#2Mx~^>w#mPa908_C$jbW!%DkuTo~uY% zU^^d^nwM&I)swM7Mx$Q~tg8*#xYb-yQvt)9&1Nj?D>uo|sgh}l*RXt%%TBz~R50>p zc(wz8cuwbhoF1At7ghHn2-uH^A9H#c`l3(%HAshJFn7v8mlWPa)8lQ4Cq9?R^!c$`KvbL?Cxur%L|edh~RB&4Uo!J%aE+W zRI>qYou2~P(pkM_z8Yv&6P#tU;-9k{2q+*qqf3)k3_J~|D#uQnjE{KeicKCCAW(OH zeFhEy#D3F=n%$GAQYSd~dt>VCt+s!hzEyCxYMZ2mIJGp4TI=cxVCuYCHX1ng#fP6z z<{luy#ICT)1G+_GY5COXT2H%st>(h(p1+>QxKZVCO`*I3v592xLSKRIVuiwW_uYc0 z7n|!e_~GS^hZMV|E#JgE>b&`tKmAoGQYus{LQx8BNi3K(B~lm}D_7!|h>2Z77I1|= zP1(WGl=#*;2t2=`_B@n}yl{uk#O3wpx1h}Hq~h{1qyCk7izcIklhJt@&7>5&S*`ay zDl{uf1I-%Swn=zl{**0ub+f+@NS~>i1dGX>$Xu*>Z7M}Bf01zAZVq*a0CJ$A6~~h< zXgWt|=Hx|BpiuX8y#bY?3CnI#RqU-WIn8brT&-4Z>Z_y5jB}CXuN>}r(PQ-w*txe@ zEF0jYZHzo}v`f6z+e0!9cikzS`--Jri)m=JP~X3J47KXW5p#t6fP66z`}_os;qZuz*!!P&KQKT#v1HlRI9&Fz)!~ z$6mPK+tUvV5ZQS#WMb70^2_XXd8cQZ^?zKZM;!EVwFbI}Hw8lw$;ZdXt^S0z{341K zvs09{{&;~~#)@&zM9^NZ;IW}Cu5Ffj>ctQg9gyI|dPno|9Vm17Q}Qd2H5KW1)}O2L zse`Rv*L3Qh_e0$E>uhxtR(2DwHSn*slJluBK5`o9uTG;RjGL+=?Wc>or=#}H4V}VL zxb<-trRK1L$yYJ!^%%@3@>sIII|5*m6n{FVp+x9aO0i zm3MEBeM>Tn50Y?Pq?xvq>R9Poa`O_Maz4Y$RgpeU9o2+&tuF)m`+Ld}lbb@jR`gzQ z1A#o0;*tf+5BvgI8gJA2Kp+O0ctcKOw;h`N>+n{$lchmr84X$5gK~fFJ-m&t9|;pR ziU4;1qvcqM0RB)-A7eI@MnH$zV@^VLUh<8OM@c==tMdHve0p>|VDyGtDEm|pz^jgT zI)J$R*JVHY8vt6a^9>rU*2~Y_T8%}YgLR82>*hYyW1mYW7$)oOhAg8ftJ~X{7Z^G1 zm^v&Wp82UUV?>!zZ%N|RvFpR82ric@3B!a(8{+frkzVrY-2e)7PzQsYf$)+>>QI|G z{F2!!d5yo0hWpsHI4B)RG%fsiYC@cv&1Q?=Qv9sk zAu8tcyz3lFP!H+cosLZx-gpN(m2)P21xgi;rrb3sV;|9Ey=*IEmnIsq8r)%3?-dzD z*widnDiH=i<>0dE=Ik~#si4;{-v6pItZ)BGmqff|oCP~#UAd|K!r*bd+vq$l@5Od_ zIqYAp1q>;RZF_s_Cf8TsOJz=>FnZ^v65>xe!wrx~vq%K6r&2J$rZW^Z8_jvb2jbRB0Q;s+g`}yrMShBNz%aUu+h8BNC|Cr;GDb5d z_rtAhO0s~jnt((thT!uCT(j)U7PRlohzq;6qRf52gr7N_!){S}reT~;Zki~l=W z?`Q6Mucu(x=i{rc97uum!!UHcZfFBMotXZWSYZmpI02~hj?6E!f3_`h+*+N&v=i17 zk|4;zy>z||&kSc{*kHAMqbPG{0~2z`W;PJajP-$Q_A!~V_NJeaqroyLg87*xQ9wVLGz9voLdq6gp6Va!uyjhrxMX*FU)}b`u~X-6ih&Z zF`E1lPPpd!e1}Mmx&^~)CX z&}tj$!Vf@J$5C=#{&0EPijdGYNkw@gMa4*8pFMhE)l#fdY>*D)FN48g7G2C*r_iIZ z6W+lJBKtk!MjaSapDPoYK=n8&`d_`x;mjJa~zOI1p)4{K8~ z@CZfzT?T)z7@_^3yjvhi@puu=7u-@xxu(1&YtgF)&qG^T4|I*kKez$YwURw4RwCT~$dh)!+9$-i9`bzi*40ynwOmX~tQei3^3-rJ)x%KCGb3 zjEz}Z&;<>jmf{TU?bQR@wf;0aHXn;agR`R1+|KJit6nyI`aM~wE2s&i9|o&^R?9<&IW8<5J!BkNZ`_`hTQ zY#K|cUXxo%agnmAukTJ`L~%)Tg3$kUs&8nWnA5DT9ebd6mfcN_Ur#E)VxtNa9BK6n z5f==Px_$(5dl`BjxkuMyzpM3L0aqd<2GAZm;5TMwSPQcnV_iB$oD8?v*n2r#r={CWs4Nk%Wy0jqln9f(3h%DVdjC}f?s1k6 z{!b;+y!fAYe)LoqcTj2A<}^FFV%V~dx!7Z$33eEEkI%i^{O3Fr#WZ;BSmFSQucY@s z9EhWzPatwx!*aq~kI-q993yln#VmEfU9+O1}BVAL)_g>LeC?`~~zS+EIFPdIid8GTEa z62>^c0u{mi*n?L^#;F%Y(A53yGO9;0Xrjc`t@kykI~XPfm}1<==#Odoh_*0X{>YT7 zVApZ5+Ag#!L>`6NC|+_FZ$alHUjY{RH`a%yUqqpdGRSl2U@ZVP_|7)ZC*{#%pQ~Ak z9vm?8WN6c1f&g3a8Zu@)fF{OS#Ii;mWxa+6)<&LLu8XVcL$zbRFnv!R>6PGz>b4zM zN{L~F*l9+SqK({^kMWfKN}VjOm4J>f%=%pRUB4cc-5yCzv!f_GB+WM0=g%65kcj;s zlx8Me>>j)WAw^6rcceQWuDQ{exXe>Udu zjiY1z`Ka6ce0IYFVT)zq<$I6np&A3{5A?uWZdbaq_5{Psf?U)*Su~ zlxF82mfCK&UwnD;7T{k*yS1D`v&DN_?k|B|;rP@G{=pEm3>a4RDR4AJBCbd4?PtK} z)Bd%2VcbHsd~E*4d*d$nw#qIwO44=;rZ_P1R2`E8w#Ft3 z1j=iuDnuo9+AR1=U~N+H{_90;Eae{|)5}|>+nG1p8T34A_a&Kx9%NGc9D=NXHGjD# zPXIzl%P+KNWHx_JDeCV1g2cU=y;J0oz}GM*^xnHP=)H@mlbB+yrFOJ+zDK2Ip5sh5 zsn`VHdyk(z1M}I=XF+#e$m{Aix|g>*UV$Wc=u0TCbVxp4BO!v=kYF17fIt4-ZfSLz z9gC0AMSoJBPWYsAG_@SMPKi2wT1vZ^yb6J94j=nMl>Cx)eW7oCL$bVVcFkvkW58|g zzuh+OL%gQS|7J))FKonn{~5Fhy!i8ZsGw4caw199C^mJM$1p$MwF+s%A(%adl%kyV zy$ffmmWc_ui-^A@-#SFV)PI-><}MNv00wlHE-#Yrw=j9Wbu2*EUi1JqIKO$EPrFR^ zh3W|GwfE)BGDYpH%nYh%!5Sl_=9-57`->5}-fL+>>JhbfnuJ$ZopJvN@+nb;xwWJ7 zv$rdmyUklYVK?(3!YyujirC#Do0!dNj4C&4`p(Izi+>{2gpawX;v4~QDY)Cf#S9sfH+ax(jNt=be)sB?@{8st7QE90eb;EEe6CY;3 z03O0P>^qN5n>lNHQ_`2wURaFhpSuD*X$1_}p?bjCmX;+=z2glTUYp>{icAajw z8I!#lTn}zq^D5>e>Yrhx(nMVkz?=J68VZ>8r@Y;fil$vdMMOBQ)Ynmf0ujrptow#) zz3=Q4GVWwJQfk7kV4(W2x}A6}@;k@1xegPK3ZnUj;Kkr?f8mDQFY{FUu$YPeD29v1D@|&@D<` zY33*!YN;-4hMm%WSrKrJ;aJZz$sIzvjf(hz;?0UNPi4x3HI_hFbp%ZFOefvOw;+aoMX6g6tECpZt)U}=Ufwk&^O@g=`pMsqB3k7#Oa4OjpS9mO9&W1=yJOL`G_?cZG$ug0K+Ruw=V z7)Sqbx@(tNEEc?9Qw$o8@PCv6x^W zMg>waa*3KjX5LAWf#bhm61^>RU6yABmyJOy!rL`CKlfR)?x#oZK(#Nnlc0&|%IMcP zmc%=nlUu8R&)#|Vrm;R$GcAP$o=i>EzzYIqRf(&~I>20GV2Vw3p2z+w&qln=_7j2I zzpb-^w&#@uX@2E94IH5e*BRW#Q_;=k9`RQ8T81yE%bW#S^p;xJ^7e$sIUtY#ckK(`>a zP{Dm;0?vt2_%z%V&w?cd>}D=i^Z^5%bZz!Ks|2R%LqJv;E#~IAr!4X8@7$x%6sj@9 zYc9^i;sqIzM}KV@sKI}M*_W+A#fgm;0z&vw!BCg%@;FMO>}-X%n6L^PRaG68JKab0 z&dR1v4s_W~qpQjxbJ!)vsUxQ5S1!SS92`W@izVHkUO0Y@qoHE^3WfaX zk9shDYg6Uw+BxaaxNbp(;eUBLKbLht5m z`+MKheaucg(3>o@6G4zQ`U-i&B9I#ruBP19r)crs&7GOUNtyzFpa3V{y?fdq48J=k zRq?BOy<4`2wJ<61s9avxj$|EULbH5AQ8URxXh~^8b(jm|tnwKR(ZzP&?%+43lE5kK5M@7dm+Jo<}nLs*;l+l7s zMnLAKCn^zjUo*j#5xa~6e%QK2l;&~TdfL?Hc^v8TvS9bU4=Vhx3z#Ed-ek60-~Xd; z&U`-T>0F^O(qcNl`yXv6#WZ2rpnxhTYyXa@_GH%h6;t~cShkmrAHoDtLpt89=H-h}Y3?f@IvF2X6dsi~oKbywD;_|q zV~ZmCSN~#^vurpDqkn)RM6?)reBBG$Y3%jTwQG(X)-E%B!Ggp9fO;O@57@MVW>aqp zgpbF?V*~3}bFCpt7OMw1WsFgzNs^lLGk*ysf@YA6Vkh}uz_Zx1l7JmF}q zkTsQvlPuf$LG4e-IpeP0j#7rdW@<+^^#}33c4G8ii&U1{#%iRy63w@wba&s`fkKi- z>+<%#`-9(fO#JH_lH-QgYLNVFD*lY2!XQ0qFi21n8bx<|Y}v_4`dRAsk}}Z8Br0%e zwT;hPH=r5khto?7&_?JND*`~|`%eNQe=L_u-0e9h~K20kA5v_28x36#__-2k?kAgHFDEB5EhU-(OtrTjO$7bc_!G z55MmPd1rkKGI5%>rqVY;v;K0sp-(INj?2ar{~L*5IO)@xKUr&T~qp zSn{T(As0bb__u45qSBsqvZkIS;nCBk$w23V3ZirC+sZ2gv23PMS<7Jy8$RCq;3&5p zEzYLlG{zUf@H>i3m=x`thi-fXI02aItNp^2aqPKOtA2||iB2@VwPYs#o;X5=;zfQs zAH5+!uaJ%fC*WY~$RrZsw{!KwYqew-j$Mk2biyXPozFUvJ2A}xeHE22B$gP7NwtMb zsG1*!-K9l>PSr&0^0_W8smduP3IA06$z&l^%~TRu2-EQ%;}ycY6Hk!2FHj_2AX!=k zD2s@QKeD-|aym^*nn>g6jcbTdn&9xH=Gj$R%v3Z>7OB`v8_pxu@mrRjvcxVUNm-g~ z#`jd=`f`}U5B~}DwUPktkFeA^BtAQAvXHeLHZN(Yy%H?i1=KA_kr-NnUN=Yr_6a>& z1-^)ayr-RKGhAIh0LhBs=&Wv;#J@8O$22v#7xB4K-X0zM3$M?59o$V_!;3#mJD>6q=djp2z?QL*={;2z;q(~WFO z@$vWBN4$4cGST7&*!HU_RYs{F;K?k~*9dWxQrWRTS=CnCjJ!SlC*n<+J0R?MmFpCy;G~DK}g=8f@ZgLkK zOiACO5TqbMHXA!>)X>R673Ne6d|R(>p4@N>Gukjpso7GSB<(ACJAO++rVD3k zh+-J>+)@ZMvNoEZXaJgng}LDFMF702S*s4HAM=^=f@G(aJ67{ z0~l)L+}KbFtxYGxAlsNDab8%u>q4hE}v`loUZB|?VXJC^5 zi*QRXBqVQGvx82wU%gm3I6JsKA@kJdTc;oPdP$cEtsqmw?4ME36Bev@V6c{kx6MYL zbtOV@xgxp%nb@z7?b2~dLCLyyqbKs!DWp6AnY`gZ z#l+gvpLANwP2ss?KnwQyGa|fV*use!-?@sgq1zYC=uYSpkIYbuTOM4F0}aK7nVfaZ zLed{e#J-yb)2n^H-IbnFs67IqkfQdy|6G-V#j1Zce+WtV)@A0Np;m^SC+355s~8wv zX(wHxnI$suDGTTDzc-mHro*-rqa_LwjpUa7w}t3&Q?WxP%x`am0X)zO&N#Lc5qX@2 zTEfx+@%O^*b&2mZ)vpaYW5;?17}|N`ITl`-hhc5}KoNE736HmE&|^1i#Wo|hkWv!b z$jhK=0oplz{l-mgq5uQ4A{N17_0~#IJXB)Pf(Btf&`~GxDn9b)Xe4{IzTQOwie1- z+!(x4mPYQGNaatfw}qwHS8(|nI7sn0S|hs<1=ZD4^MAeJUUOL&INVwj{XLvznKdP| zK`yX0h;?$7#d7SZ(Vz`Jrq=F1W>tYL`PB*_?qx9pG(TK!z;N3!$m5Jt3S?H)?*#UD zNBM(%Z`wc0dUP`&WFqQ*KY#?Xxj_G{2 zlUs6y&*U(ivbJf_wKmmgz$)qRnEEzq9b*1Uh0aDg1QColSPT@mmuy3MC~&cn-T_-1 zG_7)EWJ8Hik8#!IB6l)&I;`t_R}lAEw4M1mPl@$`Ab8)j7PqUi`{1L0TrDP?uY`Mu z8|X!g2qhXB#Z#3!9?TXQfklhiVanP2kv1-aXLzUN?lScows3Lfl%seW)^1kbGW^B! z4C|tAwLws+y6C;?EF`FKeko!TrfN`PQY8!r6aT>(cM7`d%$(+Uoitr5LjNf0L6)-SgOu~-V=sQYhMV-L$3@vy z#ceH5=a5)Nek`lBTdusUkf?+nPCAJiDl2gB*qj=oUTK_kN{&FjQ4ozWOztotC1^t1)eiEylJ6!+V}^D+E(!NAy{e>!D5Zg|eO~MM z6iTm(I{WWk%df};M1GNUV>nK+7%t6ETxNCEQ=h&)h1Jn2$x5r%Ob_uXuX9Gy0w?q?DYl1-UZLi!2_xKEy zS-rKb#Npd8(|M{1Q2B@-cfGtDPK<-P{WXz6Jy5Vv6k6fVSUzBX*#2i+#;)JE7TT(9 z7yCtze^6w!A&Hz=gm3SP^>rybrUv64i)y?h(5$!$G%NA~sANTT;@IyX6N9jkMT=BH z$qRQ(_T@v^Xb%zk>Ms(0BHK68f)hO1kCjJBh~)r+tqV^ObvPSVOz-|t++={nGm);rAG$_sGw(62N#(Y(k zlt(Aw|GFLpYJdL@j6xqIq9EaEZkYl5H|J z+NshDYKi?uGc|e=d-en*jrD+&31l&cVTsq5b(kdWJnbbJWBF$%SQ*o{QZlJ-a(C{c zhfod?K6K>bWbHi11)+_1=E3c04VQ`fYmE+-%Krld^KawFL)*3ns!H0JTDtgwE^1|& z-(EBMZ+Lbve0Y?@q34t3_B?MpucsDG@k)NX?-cajj#VcU<=hOxAB|sDG_3UM3!opJ zu&#}a%6#(CgtHvV6M6=&pC0HHYtfpv@aT)G*%-OiXsUqu?Xwr|C{qTL^bB-wt1exl zB07tjll9z+Nqznq(|8JPKk0Qtt_QEnKe-3kaznTb{UONp8(B3V|^tNve_x+ob5$JGI0Dtt9Dry><{+-Lq+$_;Kr*M?6S( z{K8|GAPT*IND0SYE?S@NRQ;guVGxWtd{eG1l47~KNy*s(smwcBK$G;-xiP+0aJMEl zVcD$AL*d1E97)-@U)W86DKSz-A>h?i;=LdB_S~jwa$f+9>F;&?cH=jY+c#^WhPGb_ zQbq5e5A;vw(n>Iq&=#EcrFdI-xI=23vi4aEu2eQpLX$nPu;M}}ENjmPdEV!ghG7gspZZ#ipcXT2E|Jkfruq=}*nBhkFfwmsF^T2Fw1$Ys^ zG00|_CzTgGS>^E1?M?(?kd8MF8P=|zdDI}25@IL7l-=Y_tNzbw5vE< zj94ZFzES#U>zp2+ghlnYW%wPqj>k9j`QN*5Fn0%RW0l`O3ns*KgfLZ!F-bbg=fugx zXroa$CmDl2pWUj#ZZ%UysK-p}Xn?L1FBFD|45{Rjp_AA+po6)DMPiW%5+k?}dcd*% z?h%28a1Z>@%9Y1`&K=U+DkFnG(w^h&S3gL-cktU^Pb0i`+OsxQtuF*c*12rjie!8o z`U8bfV}uFDqmA5qHbhsieU8gc-xZD7tobv{sU#*Annyr~9?V3#?`t0B)Cj03&#bJ{ z?gx5LFU{u8l;tSc|BRDHW@huiUOnhttc;eFf}I7 z0E1ZTcvPjG)1mORZSrx^q#E``lD_{6v0zB%vdmI@lw*zp72Q5qu1Vx#we!?wM1(*& z!vDe1SYzBognu;t;EM#)dGTV>xJuFxEtQ+>dkbfHl0}IHSn@OB=2S(!D4E?W(3cP}SkE&dCo;F~;Q^>d(! z*fYgL2Xry$g@EHK&u-d`RI#_uU2O3KW{`UZ>~yhuzbOix>%8$(0-qY^olBB%-j(^m zVlylrGGu9<5?HcaYViasI*Q-B{zojP@Ehfp+PKSETesjkA7BDit<#@QXG!#yObTIR z59M|+oa)@bL?_hle=cgj2#*N0wro0q)jkY>0deXjl!fIe2%wr$@KWPp!|8bo%C@cQ zcc~Bsh+W3!IDS2fZ3{P|-dC5(duN`mpnLJSX*8ua4eq5Ucp zdmUW*-d`)yUj=0 zPk;ccel~kpdiVn8Ud1KJq58rEMxqbn$jxx{VRbGjkvG{MV8geuL^g)F28>Xd2Y*9i zDF4;A0bx|)k} z3MCqVT^iB;WHK;y(M41P;FFy)?dgR=x$obVt5hNXc@-`|fw|z<)@kl=cvurXEJ} zmBT#j@2t;~M^cY%7~jB>PxZ7^&B!EA{p;`JF_0aU$wuXRPUgz7RL9KNp8;RqH|T{PUtWiuBNF+N5_&nQle|Ki$uSyH{~2U|}_DYW8pwmsJXH z?_|FpdmmG2rJi)zXqC{`#`7Ko4go3dPv39+4UUbrg5SXO*OZv z5uAIawVHf&hXLW1R5D#kzS!~pPUm!E?$x1KjDcwv;C9oVIP$Z&=trp|LgL1zp_=s4 z2f<4p$ZUMrTfcY{i4&uykN0T^T7O``pqs^p*Q1Pn+V`tu>iN$z-0#}lgGg*t7pKh6 z8=I(1UPFSCc{lj4r0fr|G|h^+qDVHYH6appxbYM3ncHu)y@BrjLhRVVRm(`#36oDo z*EYuA3b4|H0{T6yR~;PjxUU81U905qc-$+B2rT^iy(&)!y7Vvk&r2rP3&dPs`^ML|WF{BM3er>SHueckB!a8X^9pT(nLfOjU?{sZDlFH}25IOHQ89Z%(g3K29lzC3b= zI!#Za^#WU9P1aQOI1iISxE5Eh-~7=!s!;TCk>yRp|#l*Is1KS-IXw zeH*@w@4=*e3_Z~SNuqUTy} zE?E@&e&mMc*HB^N;DZm_=L~cWV-M@mLXLCU56T8p5SBaJ2ny8GKX^yfp$y-ZpViZ(h zMM@~DaaT>7eQx~~V~>4D7CG%a)%+>bybe;Hwx;|4EpS%0DAWYPP-~K`--eR9U?$N@eor)aZ;A{ubd|ad{;lCmCE*eO0jXm6n}73{ zV4!~c4@-4_6NaY3`gG@3Q@1OfJWrkM{`HDegs&+7LmU$e?%Zo6`UZ`b@O0q7FN;=; zxa-|vkpL~AF@PtRvXobgR(=EKKBTK~R!<{V*_2BQa@p;nGk-+&flEu`*d^v#m3dEJe1usCL-{&=%*3PwN&R=({2D|W&-zHvm_`S+t1v>1U+8TNz1IW6Etl#pB zw#+|Bk8t<5UFXFXYNDEKMB%Z9zsvoCmxQaCi>5VnQq0i}@$oUo1(U}cM;|T%N{u!A zUV(S<>*8LI@U_JTgr!~rg=BZUnzH5ewHX;uglt$49N}*H>nu$j&8xStR@&N2$cmaP z+q7OGGRlGtZ~j#Ls>H_!S?T9DKS$1-zV@WXyqm#Bby2kKI<8wg{k8e!q#J{^Gr6<) z>+REQNlZ0O4INS->;JUd?A(t4Z`LA2qqjtmDy|g=x_Pos4~Bn-#!{Z^Q$M!|@zUx0Wn z3!7m-FkSD#^=AE$>*vXTKywy?-r7bNP?AbxVoq5#fK6y@`)A^h`W@e>iWmKr!O@_` z)Uc+)6w5~+{q1RZzO?dObsQE`L9m)YFv)uvJ%u>0X6%_j>u7bu#c_sG-$nM_0UIZM zj|eO0OQdjE4c59UL-cTOv8@=-0)uH!f&yTKf|oD?7dDHR^oK~ZS(lGfaiYCwZMw44q1<+xTxaylvH=iW;^ff3)bUXM)8=7_fD=kr#^9Abcjkm zyQX1#<+g5)A@H;P6eL8uWuQ05c;z&5!rOT6hKX#@8e2Pi_E!SeZmlZ^skc)D?drGj zfynZMpRJo@Y7F|}Es(c2y#Xyw&9CXUwX^lE?VC`%o@DoJShG-)2eVm)?0@ zcP{Vnyl@TnQgF#Xa}(fw5=qX5o3Q>3=|ly$@C4Z==dDDq{_)V;*@==FTajBimR2ub z=_M!&LC^ZMBxgu-UV>ue7u03<=%zC2GW>f=C+pdL~E`Sw!G zdra=AMOMyu@%!-HZ^v#GT<7_B_zag@a43`aC|FFWxe$mLd7j_Z*NgR~^If9NP_z?E z1OEbw|2vmcSj9Z8uD4Ocpb>-CEk$ytEZ3Vh_o7` zG+B|hn|b~1WBarB%-uHnzOe(jakHQ+{j`8z_F|0uQkr4fX|)+7qQ_j!)9SR%^zT9N zR1_S3*S1>Vv&DQ ztN1>B*@A18Kj-ql!x8nlu?(4-ML{X1)}l{Q7?Ets{oQ6L(b8_$^8BvBdjTcx^WzF6jf7x zU17KP>$A5M-#dAIVXre~DSf@rSn^_ga%X;58V|tPE=dGW=4bR*M)lPs;ItaZ4#$DgGv}Bae5MMhOn%UA04oUH~`~1Z^ruI z#KGLHgDV(TD7Jmd?XbmXuiuH?{wSrW6^UKSek{C1+qkK85?BZ1g%k8Q4yb7_ zhW_GXwWB9~RQ^`&SnEG0QFE0U?dI2x-;&?yjv5)Q zFWU!Ks&klpsnt-CJ8yaWr0U|g(!7JPd=Ok3;9`rGc7!;skLP!Bu!iWJSG2y`?c(pP zcGRX)V?h*KynENL?Sn~}QuX;3ow~nD6v*ThZPHzh6!n~diA&wZx`Z$1CGBvnCJFJJ z-7b!iw>*oo#SBqXrqhp?DWODs2D>>9<8n#M^SiW8tDz{s`lRUMYgf;nr==q19eRV9 z-{q*PGierbTb(NuO?pMU6y#z*IYK1PcfpXtEowNak}TylTe>~J&HL?{+eY?g<}7tk zceE~s+Y9-PJ;x`fJsKn5IiJvJn-O29A^qg?0@%_V%9>dbBQN!E?-1``MR7zmze0_m zAqE-uD=xI!rGQG0Hz=$oLkb@8NbGb{vG~4(=CmPQ#mqai^@+o$ZrHB zsZ!^BXdmB4#m+ysDlf(1a{<;X-?q}3LQ5sxQ!i_9Ho!&_G4gp`9^Idv&|U4$#7}lc z?YNf4ROT7?2-X-LD7c0L2V!JYQ@-Atwmv*{sPO5z+edH6?{M{gZi!iIva(cosnUxH zUR_#n@B)LcMLlbdOb^u*UB?9s$He441}xaO$A$c6PP;xu}KV#oxE?l&NL6IJ;C!xheLOvA7*K zlUVF_1>L?rSbr$E2A?7;(ms34c+bRv+&wdgi+7Cf&yE{eP44#Mv==Q83zg4Gy4uil z4QDMdR0j);ixKC$qCgZnYO02vWj-}~^XNOruFdUmCQN-0V&2!=i*I>5iw%CwyWXL4XBHS@ zU?&zBE43W8&bwV<9Gw}Oyb&)Hcz2EGhVeYDTDu}4+3b z6~l|q-#&Q0LPWaocGgPIYOP>5Y}Ex9twYgurp-{N>}ZD6R1;_1nhR};<5+x-`?-r? zxy?}Q+AY8MS??E6T*!*^sw!zqNvwD|2!n*zU}izr-5G1f9y6|$71|TjBO~^c6GT++ z_VvN~K*2S5_{rochWyIhX8Tifw~pRDc|+kUZ_cuD$oLYSN%4|iY_C~|x4hE13k(el zjMeCbRD`0{FisOubjh+T`f1mLn5X5}M4{C=Q`VpDgM5O(uY|Ptc!Qcp1CmK4J8P2R zY8T&KJ@bE`T}@p^kjB}ai5K{1FRS2M>2<8)pXc8zj>va&E~$x5%~L)#7F%Lyva0v@ z%agNTKoNgW#Orguix;BWxhbpwgJ|iwZ;u+5H*0UP^7^$=E8Y?|<5n7{r}z=m?MsBU zg@S9a$dW|6ol*TaW)2rWHFx{y;oLT-sJSZI2QPzo%X?OP4Xxp@Q2zPEL2zezU?;v# zm+Sv$@4aGV$OS6=?D{#GEYRMH> zBnT1^KtO;VwBoZK^(F|Apf^HXthgen)y}M&X*1LA+H&bLd-aBP zAowEam5^vn^{$Tpos0cr^09Fk=5Axh%!P0zT?^ya8E-=}@{&Mdm`23_-Vx#W{RUWF z3)GF(DrYc(z5z<)Lo$T#f;XRWPg2@_nRk`X#es5M7|@)d34Gy_Qo{T$Sr^{0>&|7j z>wO9UCwZ9R`XHau)&sbo+?9*s&uo9L^k43MVdJU7uBr+$zbNDW#YL}H4HiwtTo>AK zWS9GzaPs~4AHw0|$544z18qxQ=`h0q zd;rh(!S1*ej+$v6>{=G7jdCEa;yjfdZ&W+L(_cl|D3#c_~(uP*>1W2OW?!9 zT+MLxkxy@{4fJSjikg6)tlzr)#f{HbZWlGo8_2O>1fgU$k}lWsXamcFzRWwS4+<+D zX0%E`F%4ZRfT0*5i%Kd_1LkR=7prBqD1^`pR=0dgDD&<>{lhkNAG%=d=pdu=;52U* zYwpzuf{25IDeYPNofF|oI7e)oqe{j3r9|r*(=frDuk%ttn zCXi88Bu#kLxT5{W{@WY>^!hh0J#8Fl(mE{QD}i2kO(-LuoZr>Yf#~NaP%cFNsLl+1 z8F|w+>35z%Mm{83E`<%&x~CLI7_8`8hnr%%?n3k9F4Vr)0nQbme7OjcCNc_Qq|LwL z#{QTPVi?tA{P$j)nL`R^sRzbNyvEw&I8zETY+bGbXNu7HtOJha(o8O_di}26+(zF6 zdICdnq-$8_-RPIQSl#cQBgdkE?}@&nNYy*V>r#RLrrY(meao-;ZqV$>$mgMkD~6nK ztrl=?Dhe|HLh+LFcXwZ_{K2)a?|ftH`En?Tk>l*q+dvEwyvOTz^$KS-x?*vxqX z!vHPE9LTl{NV+0~HIQhTZWkJ6ofHWBvhyp40KnOdXn|unz{}if7xV4scMTh$ z#_D&G3ac8P|rd6cBwewQ>*Z1Gr{K=h{t5>uQITyrO0^l#z%sZIfukDiaZ|Z-A19=DT1> zg%xvF^KutCa-;&4o-ic7xUX;OJIX79#69OUUDdUGR5NVk-mcX^KJBdrN^(K?@ye~j z-`sww@}=s{!meBv`Bh$+*BLzUAcIO9c^fS7awF8zf)t{75mZS7P13<~P3SsZB4fcK zbg$0@2412=s_9AtkUS2a=Rc~F4qvckIx~8YnEdZ2%2lUPu8ARew-mhF7Xo(_qJ zet7t2wSQmxu>HT7WJI~ekfQ2t4fN|>e;$)!qInHAOsSWcZ;A^ zRSIoQRM4Cyw2)P`FTBd>jTsdYiEx#Bglpc@;W(L!YmS4bTA9>a1x}!~OBQ5MC6&r(khgzD=f!mf)vhaueDShc zDc>wS2LNxG$CmCn!3O})Iq&PsF^PN@UoHq7&uxnu|DSE#E&l4km$zRqu4oc3<*V(o z0v9N>4wlq1NTNI;zAy~e_n>Lkp<}ne_1t_B%P}*MOj!*V4*#qHoXf-J%`$nk`oqwy z+u+*_BtI+Zns)4X8xF-ojt!sDTQT=|{EC8@u4i!!IIUlxP zD1lNE*Q0({j&lXq3m??wA{c5JL_Xf`j%$?T+9V#-wL4T)KF4yxcl@Avuj_pJe;s}I z~|UD;u};-@p3q&aWJNdFzJ0t%#hEldWY0 z)^$=v4a!=T$QD`(ld4Rk#|vZRWl^Qy{lHtwJZzO+r>S7 zQ~8Q-dw1QA*Y@22!wk*yzP=ne;aUb11&M#Lw6Ffc?(5axJ$QHft;(IEDkwtI{yoPz z07(;uUKmP=LI@Q}rN6O);;#jfa=q|h=!df93s?>YVCbOT^q_s;g60oQ;9U_mua`kB zM~EzNA>s0Sge!46Srp-#AQ!%@WfBa?(Es0JV^qUQFv91OrPK@4q2kCvg9K*nf{6k`Y5N}@#T7DjahRBLT@L$KEt zSWsN%xx${Rmagf~iHh(=-}X10j$aG>pwX+}mE)X{6Rz`v%8T4H+NS)|mtHFW-od*& zKeh96Wm7Im`69Z6K=vyMGFb&N-n~H9K_Str6^A}?Ls1R%mXYOfTIJ*%7aIYPhXaXL z>thStdH}|D5sH`eN%g@Y^gUduM(Ml>#zdIiIIEh{ZxZ2Ry^gG437s5opRr98;pzj0 zHM9){Bt?YIV++g^hltmp@Or*vtbRNZP)b3D>e+KSte~59V=pUxMDg=OSrPs#!3Q zpNwIKO;Gr6RBq_MdGOBGf3f$)jaSOo z3ni5J%q^752ecAlZ6+jIhGLLMDywxc={&fA$w<5eg?3uGjC>A+-EiULubN;!@<7#9 zC~j(?mK5fiM&#j&AzX>vBrR!3Lw2~>U#4FJdipw3WZ@S{yrQmWj%~+1Tyb9kW!6y` zg$Orr(0*t__sAmBg$0IlTx?*-pRN?3tX7~P7b!Ah5m7T?c)Uag!+w637vzqUr2|KW z$2omlDHsRZO>IMd#k0IScH6T8FZe9?cAXt^!gV&_frDoYmz3Y#e{1vC58l~&vvQ}n zt&}7oPkvrL;3fu%4~k(J7=|HgGldVbB9xKuSq_D;4vLqD8D2F zKB!e>5F~+3oS}zt!j+njEW)!h5?aW3f}!v1wqgj^qRAF4kZ_TTX+#cJ@87{!8u|c3 zNin}m)@AU`0O}vL>3Pcqkw{sNiv^63&?Jp=i;KNHtwk6JN6rZxg~TJNlO=@=hraLU z5#Jh*xNt_uUqx9T3+aP-|K z1T7BAmklUXH3}t*9Ea0fAyYhD%p-bHp>%_`<9h1JeNQcX9LrQ@Knj98aU5&Cu0G*1 zn~^#qk&l@Ry$qPgr5Nb(lA!y@g2ufrhzgIzQFArJ3j#FMmDMtlEzGgPb?hv|W@sE@ z{Vp-A--Tn<^YhXt%Lt5)kPS&JUDG#9*YsC>CwSAUIlk`(ALgPOi$y*gF9ztjs!AIF zwsD~S%KkfBZ*SZ+l$>NOFG#W-t%GWqSiDTYjaaR70$ryIejaMLmOudnyXBHc%Q^O- zvTuO4p|a)WOc8d#I$WL;P1YA8q%ll%;*N{G-tlV6L1cTX!*z|J4%ecm+cfutL3jh- z??<)!k!>Omi})j^e|C;csD0D|sVqR{mQKm@`P#F7=zEtmStFTuG!8BkOs7lryYS!K zV7R=%wddq}P3yCNcl1Zi&$|DU)Aj#d;0Lw5e%Jhwd${Hc3>~b9y6}baRqeO;-`f10 zYhT}azI32Vxgf@J0*Mw%yO-1ol=TY8f_&bWG=V-Dr2H-jdcqp#eN{Q;0rWmOO%EC$ zb)o)!6BI>(%^PKqi&8cbgmJ0y2oG0G)8u~B=4ho>?Bn7-82M9dNa6Uo7ady2(*Jn7 z2_=jtKMsc!PU~*sm!bY~%wR}iaYv6OZF?Z3VCwXJ83vQ!XrL5w8?Zah!~qlopi)CyS%7ai|D3rOY_6O=`T zR1=|JI60pSR}%q%({Z7759?`lA?WZ>!SKN??MWEeEb~U6oJ=8HV@;zMxG1H2;^(hN}_Lk z!yK)WS|VfNGLz`A{D};Tppqgl7ER8*T}ucow5|zU@v>Sh?rF~pGXI)y`DM53H3J_G zal3Kem$(kd3D@ipI38}QW$7n&UMm02{@YtWbLo}J0a^@luhwz`iHj~5DSWV?6e#|E zRah~GkdT@oDJBYNH_R8X6@zE_(0*V-6YFW62A~@{l=cdgrxlAd-lAczNdnSIp`k_+jRSqRu%mpQm-wfhrYm~3 zUx$F|cjXq|8L%2}>~aF#Asdn=d~@S&@z?g>-2C|~Z)`kYyrRh%zL8`3fYvq?!XOnV zl6hZ@T<)UrBtcoB5J>!9F6MUS3)oTv9}jMNYaevLIr1rdu(VSk!GlYYq`EQ5Ev~T}uv(Xu$OfiI(0s5U$`u8;;TtDRe)`%bzSM&JdFOq7tBRa(Wdr79y<%Kee{=t>t$%ps&CNF|w+j_f7guo} zybwUCb*iVOmPuxNnZpNJ(XWGo#1T~uF|W%Dyxa)2guuk)mv(P1?y?)pq6Cd zMLv1co+YHO$5&WF3WpDYc@wT_?U=srWG4f{RT&E@WFbBC&g&Y!X<44p5Jm`BLhjf2 zX(nXjBM{c_5~+q4h8H$J?SfTzK--jaHNz!DDD$pUZgEj5l7Vd@9Qq!f*P{VAm+z2daoYfi_*qRDxfVFu)cD;>}~epRW6zkKCO8~^(xOR#;Sx5vZB9$VQjy|OGLV`7D|ru2a=t}$6a{* zpBf4A=GRFDcUWBaLs{SF#nC4JW-@9d=k0K;wfZBY(5&paYJ8k zK)9mZjuCxFI?WQ!Kai0xNT8Hta9SQ5|8)b<{v?-H({r+JpgNGE0u`-FMna_*KE6&E zgc%A7<)NXBJw|EdVTQ{G+}p}UQ7m53HY+y^&x;E8RrAy~Jj?$WfWi!OFk-#l;>7{g z2g`Di|B0<%Vj8TYgD*+#G8Xo` z7ZVI3{G;3Upi-`aUR5WriIoU0ns~9cAG#+KA%(+jV$KokU`rxid`P_1vJ7%TCT~~s zzDc#a@b9_D>+FGZI7Td>>L8LWEMmNl2Et+V!{d=uI}>?#001BWNklsr*5ke2uj9Y=&K zqVVyc-x$K0mTZk2i+MGg0Q$B{Rd-H5Y=LL{ASgVAAm+qt@#uSdFu%B}ZBqE)s^)2B zMHn7063N6h+wX~L6mxJV1uIQk2iE)^*08a-V> zzJM(Z=ty*0F0?+ipz&S@cuR!M>t)a?O1e$!oXNt#!!l67JXAC8Tr<|E_rErnFCz&F7Q;kP+%km z)q&J1WF)+32EuWK(C4@S&j8Y(XwUS*_5&>mZ0R zFZAn;ApylOLtMPbK$-W}XI+wc_i6!@whB<((b)tsqL6e;R=w*U6l-@f!(<>|t%Cg)zQ2jf0 zPpe2uefgplje(537%DX83)t*H4?z22Sh(0Z4M0Vi_uV2$x)|-%N=q(S!tRo4J6XMu z!Zg<~)-+XKR~n=VD;)YcBwUqv!jJafl z;*P{C4>Qb;fq@WZ-nBBVUt+J2eU4G|qcp<$U7_dC&+B(BCD6Etng+&!c2(a|UgmhX z>$F_iv-}4D&_3_$TNdPmD}*7)+&krKh2OaPmF=Iu{Dtc0%hwA9th}A?-Fp3!wi=TIFvc@{O5q!7>;2`NlNil#iINHGo8XEgXcAa56rb*$Z` zm1Sst(uI=`TcDIB%;8|X*oz0M1F4mvqE`pyI&uSHb_~nNW8Pc90ToToqcoNexR;g< zNh)2_x63yQuYn)DW!4?ecY}`rz&!8kI}cp6Hy=G(Wlp8=7Vlx^^49ycP-p^PjA`3-uph_@E10H>wn7H8Kuk zH?R>z2Qm<@83>wLx50C!km!^-U5S@62a=f7uKU=5>({Qq*3Ige8!6_3Q}(|wB;3HR z(}hR%``H9mfGx)>6Cs}HBp?!xVYP?ftAnyBLHW84N;&snEr`@(It z&IU-dOxJ{_SqIBCY2C`PoIr7@lkc}W_y6Sh|E~YA^Kaa)_iuv$>K92^<06@+$^y!~ z@2kIc<;~6CyZY7b=gU`hnUt6Exp3*wucuW~OB6nc7Ok9YEe_!(K?GG&X@h`d%kN3@ zUPK_#LYepGCnhxB?}7vhY~QSef*4WbFs(;t=1ni#XNiT6GrUrXhomKnX^zEQr`E8C zi!tait;c9lVTMz#XQU2S7ShE^wx%{pI7jan%Gb~YFm^Stn=Z6IGr@B_5G0Ng=r5|U z2Gu~6G$?CTDqxHruAFQw4kYk``CXC5yw{m0Q(gF9{g&jqz+$!9Vbn#u+^mg2? ze;jy03jnP1zP_`-x)Uy(>k5L*J*)31f9KLmmH+12S9iX>{X(TEX#zK~P%Ubq&A|+k zG4H83m9+|m59aaiXNPbBlWEg{1gx)Scu^KGVJu4E1!-y<=+OWTbe6iRiE)BVh zh)=|KLaQnu7bTLB?;hD<{Vs{WQ1!dQI*24-hHil zRo_(jsq!7&6xyw>uetta8)pd@Mhx2kuFzq`i@vhqf765clY^Z&| z4ff*z6j>#ich!)eY!=gc9HLGV*FJL*;NLSYTLAc9ho06Y|#aiDW#k*5pmdac{KigP2%yVJUb^|S=( zye}!oP?%xAeitIoNnTC}63=N{ifUZZuWOs~%Yhr*c3N)Wd%?YR3^QCe!X@z%|Kk4L zOaJZlFYo^R?iVU=ly7Pqa#7@C>*Gwrnk^8^3Y5vkcz3O*KA2;&K->DAC61E*h7>Vy)M{Ihtv!O zc|E*8xT#0gK_pw4KZNRoIhG6k`dw7KyK9n~A?*Y6ece(4pNXUkeBqK(Hum+qN=16r z@A^-hP3JQR;CP+9UF)*DvQr;^5S5Lol>-RtRqqo0)`PrSFLRAw3K8UX|H2&g6 zZ3fa>pmU@KhO2p=N8uT`vFGxTjHLpGWLS;`O{+mlQ0ow)fq5pF=zsE8ZQv{sN}GjH z=3SmLC1&36GEO3_Bp?N8Sv28dZa&LA+9RasDNz(2f}<9gyboeYAR|C@i3o<9lqNqa z%XPE%-TOJShb!vyi2FTt=y1t-V3F+y{ZCpAkX*?HiKKx$k1ZlznDZqS#I*=B#CZ@s z{#a5YFH^F7a9tM~jRu^aoIQ>oa}dB6teR8s zZ2uDg3Nu`JtUBRB&s9m&mA`T8wS#~C@=reV_pX0&@2Xx=B~cPM^qgSwKTnot#&o-2dp3n?2tr=a`22xV@eb6xr%*Rf!FKJHPeexY;WS)$^rv+& z@B2{ME7;c`aN-u;kQ3(|Yo_UOg8@fP&{h z^|MD1d~^)$tulxPM^fs6?+*+$G-nJ5K*9-G=J^EYWNJittda=VEFqawoT`Z-iY(_y z3hCr}iiV0nULY*5(0OcvT9JU4`IX-I(z@k2&~-cHJ;CrbfjnKS`<>PSNUGZH4m^7N z7*0=5!M1Js8_t86r;A=!PQZDE&mYyYfg?3TPAN%Z^-giu*jL~3Oz%rp-Km2QSUA~P z<-*CUO1OBQ=PFuJd+X}6yZ_?lzxmAXKK1o$PnC8HGB5IjeL6{9b737PP15OMViIMd z)O8Z^%3sojAn0xIJH0wkDD#S80jsGFh9Szs?=(}g?pW&FO+r)fOf^my1o)Ql_ z=R)Q2F_b@k07|_L?M?ul-3?GHGWfm^rejhq9t0U`vdkH&3G|#W)NgD^VOlBoxG=<_ z`yK1$nk(rKKlGgdd@l%vH8y1M9e~5XXoBzhBrQ)KhZXjC;oNAu7If@RSWrG+x6TDL z7nmj-9v;Hu$B)6XtjKi>iI;2n6y<>9j_Vl(ax4*g#7o~&d{xa`Q`@H_I9cV#Fp2bF>g+jUiExr%PRr zFL1fH>&$`A1-&Vj7fzUHHOv>V#RKm<5?%Bf)Vnok*^QMCAH?<6X}cuzUVpC(Tvvpx z8x>GX5yC92A$@5vAZt-!Z!`4IKwJhMt}`NBOot_eui++0B%Q7F zG`wX35iXP??*qpzhPyhh6K;5E&Pc%^SVQRMJp~P|H=&VZN=P9!FPN5s*C3 z>R^=!mm-S7t?FL+CvSh@+CP5w>$iSt|K&^DN=f1)Ez}VRC0u1na>cMU<|28E+KAqZ1H27H~rws3^h(y^R-o$iqBC z%n9Wwzb27brwO5(H|ZMoaIp}s@oNEw>&X&TndY8E{_^DKVZzl1dbN~tC?k*gT~^(t zaVqqP*DAyHaSU2Crvj~8LM|1*0MPsHIM8f0;rRHN^0n~yRDEEWq3aX*f}TNOmA$R& z3Q|BdM80%Q-ze@VU*HAq1-I+*uIV>=GV&`yyjEfNDhL99xwKLE*3}m;|MGKRzx_)$ z-#WNe+|k9b5NY}l9Sk!>$xu`!Ln{<>jiKDzb>`@Y8HNj3NW27I%)MQ60$B$=3tCna znr6KhKDgRmE!^Cp^}O+eE;x?^@@$tb6)Ax~aoA+pRA+9RVEs{!=27b@eAh11q)@z;@hK4{Y z!j<-V6533BJd;sj)YBD3xS;3o6;*+XCVO2UI!87UFI?C0@2kA=#W@u7k#TONG05?> z@5tA!`2a<>TCEo4Xr0zhDU@)Quy+i*#@w#J3)emzgZZ;sK43ntwxx)bn}vO~BE1Dc zaLw&{g6~lMuFkTD87?*9;yBP$O?u<20Ds5I8ZHke?A~fkkgt!>mKs=?pBg zs|?Tb;OM(eFdw*}pv?Pbfx-uILr+K}inECKJjwuyNaO*!&a{+1_*BGKL#bj;S*7<29b*G zqPRvV^*ZHwrQM|Dm@ANM;R1#puK;}VcI69LI^Y=ZIBlqPPN8kLryCkp1fK0f{lhjK z|9KlUNrPgg09siEL5}fk%*&fG7mrxP#FUo!#k7khTr7QOxrT`5k++AG>v&K_fKt5y zmHUrDJ#K(#*^yqYVXzV|7%Dk|^962txn6CaSmSlt=Q+oDeuQvkImfi`1j*kmHaaj1 zhK^4nT+my~v3?g8NXF6(o)y5!doA)j$c9Lk?NvpX8|w}{UTEAE^C*qfupI|ZPEXqDEqz;1YwlKAiqn1mG-u-D|&_2g~Fb?QNFG}BNc=D=v7swLZlI6esa!YcrhmSHr${{9tmskBDlU6U%!j> zR9QA-ITF!dz$_Q7*A~8c`2xm(zM2*aVqmToF8-@dv~WY#J+$HIJ5BIwJe0Q$C{#64 zM5FOA?&(g5;u|2U-MmXiB+Xqjc^N{)%EGhWhw(lc=d;-6{qR9e0K+n&eD4ty4o^Ys zT8Tufj}gMfq9z;kCA?hkV$V=Bk^jpon3SdsBL;+PxbH<729k(Z+K7(GbA?}k zR0>_T8;j2a^Z1Z>36cQqM;5g1n;@tH{cV*uzNG%z3y;UKDCG6Kn1CU|jYboW4i70$ zt1t7uX!P^DNX;^xz8hfuF7v!EaTv=&xKQT3 zq!g4l51zUFuV4GA=YQ?ayH~I2o9c+ndmOll9~clt-iUaG`CVAQ3$3BJv1gKzPx?G3 zUULWKcli#OPKP!tLewTIM@UdThe%efdrC@LtDdKYM9Xe^aPrq}XuNMjxoSXpuLzRL zK)kaOqj{38G{>af{IU=(VB36;oS(ttHO-kw7D)^r6g;RrJc8244?u2pflC<@G$33R zCH4Ivql06S5+_iCut@WM2KY0UKjC;juRA#gBwF2W7Y-jE!tu#*tjznOfoly$ zP!RDFxSo{!nO{bZY2d;zL$xZ)o6j1T3){*!?S}KBXL^qUFF0A2`d#NuxWdB41^Lyz zn_IvAxo_P4XP^7gJ1>_HiV`QJ8`9j+rX(0FpbRGM7~+MNCnQ}+zWQp05cjgPY+Uje zbYUPFdCw-|g~hESt=AV2eVO-;)rQmV3AF9j>dU-i4VAVBjgL(@`HK$7fdX6C%AgeG z@Xck}BxePKCndW#V9H5m*jO_aK4#tA4_{}B?~JuzMUewt@Ss$$L*?TKpq@6EJzC>n z_Hd0~{{R8iV?=Kkk}py}#rcA4d)(xAWWgM!nnc2tw7z5^<-=`R>U5<+ul*Ckl^!G` zuZf^lWw4GNsDIR<@hqx*Sift9=XjrF0X?vi<7Rr= zyPcI3MfMxfSw<2tH^LRye%h3ZVhAD!D({2QX+!D35$KOkL9o+FH;-e4aAhJzPu2o_ zFD%ETNQPJ?xzvO%8zu@LkN25{7*A`L@VANOGcCBGI$Q(7mF-61SW-$dg%x%lTF^bR z0c}Si@rq72SQYeZ$hlO%i@&fk@_m_i3LiWQ!v~RkEgJ@^n?XQp4wnmSEF}bm2V-9= z82kDQyu`icb-e=0$Ok^0o|laLc@Qp65V(WNcIl^Xy?*fPPrrNfXRf}sccZYSiG#%0 zISt-uqj5s#5g+5^hZ6GW?ZU}0^ms8ouSHtib40?W1m!SJo(fQ2paraNHEmg8JuUos z)$_D4oTKx|g60n`upj%N=^B)GixhG+Y9JZ^fdQ;-(-5Alo70Iu3^Bw6dr=&i2v_9! z88F4DgqvVR1gfWnGVjGlCm^>?;O4M_8VM;JzK)DJc42O#P5F%j3GeaTnlqTkCkWRp zeY4yLM&kp=dVgau>EX&anEQ3wN)iN40G&e%tcFY1B_Q!yabXQCe}d~4sl{^Kh05_x&r3}wJM3FeQi(MQeNc*c-n1wvS<5; z0Fa>u$80!D!i8bV8-@fO>Ih}ao7lsKx;$xfu zv1oE%+LgRr^T_YYF?aM6l!*8I`_0gf2p4V&7Bvrz9fu2?B=MlT7L>7`*5hMPYc1g2 z`He*)T$dtL3TGnPVVEJ3F2@a3J8`}kc*xJd%Qcm7&9gRKO3zuOEg%KrLkcr`yD-cU zW#lyxoVG{aF1z6n$w!aZD$ntLuYMOQ@%G6-ty^olQ9utCO1qQHd+n5RwwBSW6^Wo% zzsn7%a5C5P#IExATUQ{*&@ZWK=|H=sZOESw9Dg6@4&Mz9&r(?9tO%DP$->K*u5bO) z(_gvyi+A3+{?7L8YDLmSws~ZZ#48x)TuHGpk$*x-SBYwONrFs&BVi2|FTxpq*Bl}G zbx>#l^LsM#YZhjR#HwwzsBm$IWZqXid=S5r>BH%J9cX=Iff&e8EbAom&P&rhl_ODu zi+JCXY&G0ig!s%vCZ>b5ge%Q)8SV**9LPL{50>i zhR}`9-7XQYaL%CbC5#ENEGT50*~4{aUe+nyr09Qwa1HL?Y@T<_;gWQLHdDBHYCkZ+ z>3HM;TlM-~UZ4DXHl>b>YgYb*!Ut`KJX%P$kaR6f=6%r^mXQy_{4Q>Vy{+pCDzvT% zTwzx&7O!Z}$VK60x9#q_9se{4;P@=U3>QtfIG*SBD%+)h`1ISi{_(Rva{HTm&u(AV zDvC5RAQuq=6n8imMY_g!Ny+CM$jFN-{Y&+`;x@Wz7R)Tx%p8dbi=bK*D<5v6q?NZs z;i82hgEbPwXi`YZs)rBacWU1=;qm|51i_NP*fc;ZDIhB1sLXo=22p<;BiVu(-ZK`D zQPy`kHoP!>G#2K)QAi;RQH(wR^kXp0OIA2A+AXT5r61KmG}&d|(}Ia`v3%Dlq!#ma z`}tk?USV{@NQl=0JchA^EB3k*&YxC9BVnw@db$#h^X;KJT!U+x&mu=M@-h#iCQ|(_ z^oZAf*d|YxWK5~IwgTvj9$B7AUN7`?twZ?}&+{oi>(S#!R8I@@ww6H@V^#!2ynGt( zIL>(?4>MdwkXo)GiN+Oet8`WW94~NRwChgMv;7|eKzpI*UR1vv#}#x#`S!u{mw)-r zTi0H$UNwq>D)LhcPNq7;94<2UmjqFaG4$&~wX7!nm*`#;u9t#lbRQ z=($t5h^_~%`yCLAJZwH!0;Mdj{KmJhVyMdnD5@nA^IElai^2!n9V%Yj>9naJ`MQE~ z$0ZI#^1uqPM$XB#0?tof*YoQiwcGdp_~cLPAGZFDZTkN^1Vp^%zL3q^!^LqtSC$p& zg)2{O|EpJi?74sR)VtT8GIk3JKhCvgC0=u!Yod!MPl>OHP&33$Jmz=N1|B#nu9>*; zU|pD3YhGP?gbB)aSOgXGyU=>Q0y6Ub;;l&PYn>CSCA1DQ?^sW({y_)of7OM8UV!R; zDXgazw@G5ycn)4IE_@A{<>Kd=E0d-T^R>uF`hR1eqSA{jfI17ayY001BWNklenV9^f692CUq}ZUXhekvwIYLW1yK921)k-Ts0Mmsmwk?(1{{Ny z8?IZp76`*RhD!`2TBd1I=-}beA(&=&Ej(IDAQ^efr+-6H4Or>%w~pX?^}FVXh-E1>@K~JTu+FH=VAs%%QwX{0~L}nG#*1;$=J*DOPSwA>Yug^^?DtSj*cjNaAgEB<_OI1 z@_J#0p@e*1ziSzR^MY|jQ!2L$&vQI{)i?d3=lHe2BjPoeWaN1eE?JbtJJn02pSbn< z!GHbSH}3rO!OOcla#5O15Mx0LCiCG;?zotBmgDfIfFda%a3W1SiS@e}PL-3c#egz>hngW!#K;h!rFzY0W(XTPKvIs(%cT8|^eqe#~H~^zs1Y<`BK}tCtG1x;! z^EHP)VCkFn{AoA6tn*r$Ylt}}QWk!^-#DXI?_Ub36FE?@o|e^x(&Hm2K0F4odp^?5 zOgUWRzo+u>Ot-^Sk+LDzSCX5yi%LVd(p+nnwQ<71L}Us*wnd0|kGE}UBi z-tqH)Tselp0Z0XrE8i$=6fY~E=Q()E?fQaeQ~j>ytil>I5iXA7HjQfG$8Nl||7&-@ zeB)=YzkcPev0IP_3PFn?N{h56M;$)H`EUY!QooBM(lwX*UHMD85a0ra%1|C{qRzJt z3Rwp|o5Ba1B=g=~i#)B)p$+v9yI?;IKvgs_wsnwoDO-+3ibEzy*PQxIz43(<8_kp+ zk|^>QTZfBr15PsUG6zN5r0~Jw;}ejZZQ#$*QqAPy>LU{|;fDT;zxf!w5K4GEWEkOl z!WvVrV+x3HnNtcMPwR6Lq3LP)V*oQj%)ZR+no77}K}N)3&n&8wsRDVtd^?Y2E7AkUK}>g?U-+PMD`vJ3XaP!W>UP^}A5b(0fued6mcCx&k?j zT9qYZU%R4i$gctiPuUF@pWOpYx6RsbR>Gw!n*7fG)4RX(?7O#q?$#RzU)s1{DM?y{ zC`J~q%)BhWa{xE;Q&fD?SmW{hE-nl+R78cOL@_9RcM1x>3C-8GPT$B0_2lT&-Y1Ll1fBwvPNwLt2FypS>EI8D3p=8Kv?=507i zdrSn8n_BpI%G^xhgR%g6;6UXB>uH^UT5E#fIOjgyq#|4}527(;zNby5+mrAPy(eLq zVfxyVRQ$CcQkZ7lWFeJlJgW@XI?`;Mn~q&~Ea8eg*BsqmW8IMPKo8Xn-L?njkxhk@ zQPEIPgq05S!kqCz`IF%6^SjVMh&8lMPisW9+U@lg#h3|0GV*>eziZXKt?LNdyK4fk zUs4U@igs7qkY4g_|Bl^sTY(P`amr5HXIjD~34(BE<8tK}p8fLe-+KDp8(-VGv$3NT zWuD1Goo1q+hs7?f1u&_r{{Kee&SM&nEj~!JuwXKJyHJum3^PojE|+_}&J^h7>Mvkn zg7V_)px~m}wL8%0)}iCH2IpR7VA62oqb@YwGl91yD3)~4D=H~BMIx&qfx#M|%FC6u z?OC)R9LJtylSsH=Y`)?`nRi75D7BhUdH5K#(*}s94cw9>x~C>w!$?|NCO&6dj6y?+ zGaz16HY7^Idm7>LQ+l|f`pvR#veXreBjyZYyXgp5>>tu2rVFg)hr|oR4V{Jyt@|c< z9HfG{()GJ&4EioOURb=F#9f3bETnUHj)Re*5lETzPTls$Nkg z{w(Tg&5LZzNVp~!mT_xb#Ns+`Wkce{%cN$Ao)erPDUpa!?>(qgV|Dg`vF$bkh0}2%tBqc$8Fc^Dpk~WYm*8Pa) zO#A38UIEs&S^FEAfW|-ICjLB?aE+fvEtf#eHV{t&ZDoXnM z$Re0BG4|L`g6}O7uQ0d9qxm8-%rK(MiIBoHr%v-8jJKJ?*dE;42ya&+;fm~YPUJrB zdVBS|`os%s|26M*L9IxX-?hr194Zu9a!vX-b_~wpJm|@K^yo1(8uhiQr*+oA`8jZX z@SI>!G&v75Ts|PzkxP%BT$ z^Y$zzj*WzzxS?Zlvs=u@Du-uEM>O{7g^Y$)Q7gF0ME<0)c& zjO=t4#C%sI3K(8k`?w9oD++8rU8EXH>)>&~ac3xHDAE`dXAU#$hYy~doIN-yr+ z-udn4zk28QpZ?mdm&*HwB#1ow`#P_7IBWCRuaS#5N1J$6 z)X3vSGV-iNZ0Bu7&yk3MI+<%yoP1Up`99I=SZ%0vPN8GBR({dK%XeBXG(R@s~9ZZ|SgyD}nS! z_dou?W?ayw9Nx><0DV&iyY9m24?7fQC@4IIAg=Ppm&l}RQVA3w0>)E{Lt5fRWmGH+ zPESwa@bHj|7q5EA`!a&+cj5a&!Wz9W!xbKXYl%<+mD9IXsd~F`TP}!Sbxm*2?RbYl z0JS(7`3b_saiGbH_*8Yb^3%6pzxq#K_~ujp`R=n@hNO$!Ocwp5g>IhYEX_5|fXD?V zsndx2fcF*iyO4OH1uD$%3g#;#pL@LK23mM9P97!NIp|69vJo$mpm(|yI@rSSL4U>L z-2(up>p|zC4UG>>@Qwj0J7p+t=oA_;eV4=V_XT*n`j3g_bsgz%Q6w;pr)#3`NI%11 ze;P%&Z~+$t9uy&flGTOsgF`4Bo`7Jl##kI7T#&(2n0c)kK1mGoh#9*`rou2opA>8P z-llgLb1QtD=KCexkEqXL-i5esmHLAG1yk88*3kxgMoN#)_1=wJ?>t;BOo0>ip6pUblYB3`Jn z3VbLp&j|~-o-;yUMm~(v@CL=Z6_ZIvdxiN;fGosorqBq-Ge($aAD##~gCTvVlly zmxCF7bu!#U`GZZ==mLhGu(s7AqSbXeD<3|HW5}vIaQgi=5iJ>1Ft&=I7Ui+UfWh0F zgavrG#+!{8O6D==WNAN>2QB`d_X!s%Ey+CSo&%-R8W@j{L8&)^U-Iz5D8v#jSm1mg z*^c4hh$a{|PW8K7n>MecfXegpC0tqCCbefAr^6o)2-i$GlXD6yjO{<72}Yi1B1oD5 zUe||iuYMPX9*T;v(rYNLK~%rX>yJTxL|9`uPYa0_{_HQAc+N#aFr;QkVTJGsf9csT-~PorZ(VzP`_{&`Qk3|q z4|ATxYoyN$yDn2P=a=1~1E zj}|X{R&BdQGVg7tO~h=~;dVVZeZK?E4=f^D1w#kDtir%JGj%*g%o*pkag6gyvl5>y z?@e6avl>E1jv1XF&^n5>&NSYKa=iwn!z0jY4G=9m)caXMOeI{fpfMGDk5jmMhI-T@Lc!4bPdB+SeA>N(r?P^z`0E>h!j$Y^Iz+pNnzAj zNEt&7R~gUp)f0 zJ_}a+feH2Rcc8RUg5pL2`0?_@RZ%gI98e1ixyqSiL}}t0ClWItiA>GgYs1oRo=&{JtULglL|RYfs?+Ym z;p0PSH{0M@;Ut)T#h*Y9$Dhe+5u0XH3j#zEt=4)~T2N?|;Vkj2Zz{^!_s za}NER*n=&?!^Lte$IvF>SgaRU)Jjk(Rzdyv6VN~T4CJo4^y-7GKo3`Y+`~1#K4kHx zu+EQz`84XlY#uKkeBe%+Q25JFf%60KH3#%Y=c3<+`t{e=&Wb(?b0+g=laQqidxc~lRsO*$LD}`Z&Y+>aQa{}w8G3_`_*`9g$ zFY17h%K?vIr_*x22G%4Gu-OoUIe21Rb@XRtgaA?@ZYu5Z>b z#w_Qa*4=RU(#XBSI$Qx*wnYU6>y0|tDAgPU!%afZm*a!o41l+IO6uk17?0OEgj42N zf8d5=>%|fnR~s1F3;Or&fwO6VeYpzGMgam*96kOV!*ORq zmc9qajK6I0MoT7e@$Vz9u~y3kt8N3YaB%sJ4N$7mO4sB{10-HbQ3Ov8bJs{MFZXzz zIdETx1Pi@dWMIE218~KF#u>ZmK=acsbPg@hcNExuu?&*>L|{i8wB|y|Q{%b-cHM!; zj~+p*-hz!w6)<)Rq}G#t@=alh8h4DvP0m>-?eX@Dw)`bwkjfH(W82Vbx5=Z`?RG|0 zfui=MC>e?>WUdc_8orF=Wnj(Y&2zhQ%mAGC)eQ-DUM)fEz6qWCZLqpFsJa4bNeLH* zw4Mg$lc#K-K#W+Nz=?flnM;y#Z>HQoEI}ZNGU$p91=Rpi5XV|v;1@Uz!5KaV7>|n_ ze^WO98TP51j}2t{TI-vzDD7z z>jtOgQi&W4Aw)yP_UFo=ZpstJnQ(<3^U})|2_z$c?qLTWd}c!9xCoWqG8kJrg%mMa zp9d5C_@;|tr<8UMoyF1@=LMU#5sGS`62sk~3J|IRVPU~`yA7U~kgPiVeS1lie%l4# z?!BB!@8z7fJ`C?LGq8KSvY4T+_IvV8Zm@a|{uj`3*3 z_~;O%lQ!6w%HV7p;1?7K_#sa+>;1^$>6-C=1X110a<3zq+kA)@3PzYU2YfC7byK7~ zE!h}1WL!K@m?3&tBn~{wC-OCtmzQIH;KCez+{e*=PFn4P+v^N`7upX^B3hW^Xh(G_TTO5=*P_3Zm^nc0RmR~{uNhlTRc<0U5LcO`Tk`C0zr z=ZFDrOsY>6z^aGDtA5k~rKv!1Q-_I~ej{KQ=jVwJ z{jCEy#>X;K_!>i-shGlqQa&RT(hzHH5IPn}r>&59ZI!@Rq|s|yWOyNDUsq!tY+2UW zagH^I@s8x7b7X;Id7y4dv~g0(Vy*x;3?u?l7)8U&KIL{H@#+`l%`rQ|JT0E0%`l8G zFLJz`z%k!FaiH-@hxXh0mW+yoWR#dTA5EHW#=Kql@U=Y&+^!GJ(^F`Ew+Wj&8?be| zk|I|l$|^O38J2ZHWZlTHF06C(cwxnMBwAR-9e*AUADplR4#?No$s(+lVVGeMdcACn z`xQg4WQuE>Ja@*=b6hy!1_i?mrJ?}li39CVEjawx1Y@%ZT3Lx%K*k1An((JAV=&>p zAL%lP_*=$)BQZV|#vF?tEXvc;N}xz82!arnnwWMi>;7(zeaER^IU%H!rT^GAeN3!x zQ^;1v=fl}9NJmY|@e+?)U|-n)XQP-+MjldJLz<;}ECK@}ma53e!0~HIx<}mjFX{Ib zC`N^e?d@X|lnn_sZWd|&8myT)Cc%Z`Nf>4*C_cCy4_rIN#LkIFR~8dys3-96nHUtzMY6JSVN2rm$>O_uIHMz*2E&lP&NbU z0zUxWbi(|uTAMsw=FM&JRXOaCk;D(KCGk7Nj476D=O%xR4KGYMcA|ac=Mii#22RI= z*26AvQUDuI7eU*RX|2rHH8%8B^C-^izSdtQYyt#F>+2C|6A{O?3gbJAQpMBPHp($FMbG>PpYu@>=xDI;gbeS z(I8Z^`lA!T%7mhwUhJsOm;)Vu-EQ~ge^WZ|t zjbV~iJPQ$F^<+m)XGw^epHKt?LkA751d=3A_h?;Uq~b1VpFNAyBywzUV}D4FPDl$3 zGZZ>D2%jErMQs2kFBaFr?uiX% z!y-Y9@>QMI#{Bil2C55%Qsq50LpPU^X9DiSFzq9(rPvW{2GLO!8o?j7r+ zxd>rQIno1(moC7@Gesy~ap2^y+wl0K4pjG0GF1X0X|aj1FAR|N{bn4m0Spx_XEnB@ zImd7`0bo5Xp27wVy+ktaxeV|W^!IgXo(mT<=P$ag^do(a<9 zI+zDr;8hCXledPO;o9TQm%{LoU_+VcCdzP{=3HFVS;Buj*C#U2xZk0$!M!)Cpp>MT zPIIIM8sssw3XN>&JtP_VJiluKeVKRMhcSuJHX5BXps3q}X+B4frXFjNm*Uq{AkNjV{jcQ`h8^exnF7p$gD>++>nE1+#lxgldgz+5D`#Di~n;B@_-jC@YKs5t#_J*`|2 zV<~}S)oyvvd1ONSfeBJUgez}u&PAZLMNt{BO+ z17e9wTzp^x#w}~py2;|biMo`revoLjd-b#?!Ur=FlL^bsJ$a=R}0 z4o{?OAR`Zq*A};7VGX;=aiM_=kG>;=R4ha5o(Zi-Z7|yw=p_y0Lcg%+*o%_VQn(CACYtk)PpOqCXhFkokkNTu|`TPh#`_M zudKye39`)FSxC{8Q_uW31{~{2xI7w1oVE*Q-G+b*K;P>riRrl^W6{8&hDynt$W!eu zH1tw_*G1%AT+p|GWm5-%3(@C5lvNxGu0GwSm+{Y_h3(0k;2&}ny| z(QFXm!unc4V!@bf7<{eB?#E)VVlDxtaGh39MqcU3$frr#Oj>MnuUC#Kz>QDkmJZgI z3+;OrG*6o#Hf1POwXiySlvzCOc*^R@W@(n-f>#rj<(@HHu(c#VWnFq~r!^Ly+mv#!xSVCZ1? z!~!1zP&Py=Tud_WxmV##L3#gz2!iB4DV*$Gocu1zZ|m1al^LRma-0j$3*IJ=mPKK( zNV0Iw5Y_n_XX1TiEF=RaCpvVM>X&7T;cXn&p#4D`%71u)g z6~^mnMa@(BJCuyRjbpBl>Hq*B07*naR4K_}&qb_ptoJxAF*!$Yt`E|26NFY5q|;vE zuHtuG*CC?xml=lWB_`2WF92)^6*54 z(c`twVTNco!+lh^pUT4rmlc5zVAUO{|F8|N>4RF4pmbFOskoS8=TBtefzk5>Y>N|G zuf=^H+_n!VN5|0k|C+FKZ41i#1_OlR&HnczJKy|-N`JkCF5r>=NIMzt$G(s9&=+%-$84TSZ&sL($d;ePU_a+$;&pUS7 z8D9_5jt`d4C;A&-zZMr(I1b)&K_VIX4mjHeSo@pcmek3?JC9Jod9D{J;B;K5f7%AA zB*4aVMbI|nT$EsmKr-@jn8)NRKG zP|e9gj>M|nX~FUF37FkpJ*_wo&$I!xtLn@xs9UOyriV^H=$3H~LoXI8 z4;C~7#9^W}ZEnclxok-Ca7AJKIi?A%i#l1{T0?n8!Dxdsc+Myz&vh)2KXpJnYJz>a z3f9$4@D*wFdb4uC84b5l+la`J`LX`dNZ5MN1>1CBcI5L}qUi_b?T z8F`oE$`xiNrn_Jy1jKsGgSDC7JhTvl&mc z#`}RO3vj|Y(;$++jr0{my2gH|5W}Vmp6Q38C^AES7t6*oYSGP+V+b78?-HPNO(V-w z?ZY-a{`eS*xL1W%hHC| zdSroa=%5sO^}CXg^<7FaR!1!HL&S^c1&~De+3OKC zhqD^oMmmY=@Qi`N8jUXKfB6{+YGC1H*U%u4dc=#>_?PCML>Uss`tSc~;+I0Fov?i5g@% z??}6hi`NuFfT9wP?Leo~hLh7%Fims1^5C@7M-Uoj4_nOjO~VAY8?icaLzdPUk5}Ii z?*mz&D9lg|6G3sJ87Z8cbP?m{kNUiieBI131YFn(I|}HVGSolmK=YF(SREO(qWYxJ zI_tZ{bix^o1Ob2`@E{8^XzCN0_nDCsuXKnY0dom48=o@AJvp;R0GtCj#{>BR%E+Ud zVTFV>JVOoZcd?ASwCmc$1+X2C8z-lW^|TyP1TJ1vp?p<8Qww#D#ekw3P|Z)2LN!D5 zcDc(*yr`ZQ3V^6R^}$?_Whv1w3(3xP_ zhN8}cb<%-{pPJBkT!78}DipVL_IS#P>x+tGV8qzs>3S~J(ZYIKB=hdM>G~SEu7q}J zyj@v0U*orC5SAHp&&CKey8Hc(3m(?*Qidj*d^4Ei41gP}%8ddPc06c&)P?483#66= zdRYZYm)JwaSlXpT&|8QlK>}UXsiu}hGVcs=iL4viCEc)}8(5+Q0=DLv`i}d38Y25- zaU(4lSlXpygYxlFC?kIF1ljeQM@y9#+x&l8iP88CyT znAO2Fv>4)`Rd;0Y3=g`s7To(m7Yg?c*txXMo8O*6$*BdSCW5?PfMB3C(e#fnkOl zPZywj;y~wt4fT^IC`|~x-Ji(&w z#iBUSlFx0N=M&+=953m(1=d~#oSjlABcFAwvV0!XH|A+!JuTPqK-~~Q-_t?ckaDlq znuEd&hlv-;$e&|=7bz?%XlU-$)5^nFmloY4oASPK&#rGPq<)MctIHsw6EB(pQx=`L zNpd`VEUL{g`Vnd9PS(R5A-m~9vsQ!lcU!QrvjNqE63Dv9z5qsrdQ8L!#lN_gWs}T% zv)Le`Mb?#R=S~y$$9msbNms@V!G!ZIvY#oQ!XOOq@cgiT7fy;Oa)8!@i9sE8eX&9M zIdZT8H(VHtt(3(7pS|~NavjOC1P`>LW~irMs>-UY?yBkT>F(K?vE5l4+pqhd_sh;& zn@#Ulb#-NBrF{CmP}BkhK&)K{$pAqJ2g!&a88~K{FCqvy9Doz>s7+=4j~FE%-cnlX1wi5IeiCqn3?vX9BGzq5ioEoowFkA@8EV{a|4u zFAMP0DT{V_6OW}h+*u!HHN^KpV0o)#iK8eQ9d*CyBWrA8=tpCQ7v*EWO-U6s;A|xoZNZ?_&8~PwMbYl~x+IJElYT z&a*xA-jCo5Q`CNC!8}pfg!jRY^#=}Sw@#5IMTBIF%toFTdT$#+o|Y6WCKopEI}0jh z)O$BV>-#>lcR%{346U}C#m>`3&^+=l-tFSHiOWs!gVk%bCPOayn6$_E@!x+z{cRnm zzdnLKw~^2NAdl`79E`$_BpMp1CJFEXI6O;l4W}pbUA)@r$fc02M>$^Ta{&<0Mt%UNa zm0Wx>?=xh!J;?=4-9p)@1UB!X@5|C~=ZWO5JI~%ir2C){w?-62`5IDKSZ-C>MEJy9#<<*lh=wf9k?>d>s9@0^>;C>3eoV zxOk%~+c*&(Y2B=Tmwu!$^3{9aLi>MoaQgfh4JI>GmUXnegm4BTR<>=U-EJ|fcgJ7TGrRFSC(%1D7GnwV_q1trku$CYJ>gz^WA}0-C=q zqx^!1*AVAFk5O(|(92q2BOi^Ff^$64YQH4HP)(He3N%e$UYJepE?XJ_T+wuI`{1_&R=cO8Ce+fJIb#J58}y8q1*m12MV`oojuv^h;bzEe-W4&Z4OSRp>@1jD>Ci>{ zry(=NsDEjp`qB(cOm-a0E`>bEBX`4^BrdXgOQFHiGaXLD#izF)(QEb4cw9&2IB+Tw z!uw?OkG`0co7Erm(dl$%Ht*9IO$rCnR+;0PSoh7IhqUqTlXbX+BCe}UGP2`b7BZPK zS3`31p$DTt#4EPFgbt+L%iEIq6gUi!G`Xzc`1h5-sp!=J_Gkjb(xH{rKpqlCMzo0X zv=l`}NiV_FOMxKFbQgq z*07$9JX@%f#Xy;(6?s}a3qQ!y8hi@e2dU8XlmF6$R^Fe*nfxw=So1}aMZ7px0m*5k z`n8PF#R%_TkI}oXpmtV4sbL0_`jm+}Ne5jguz4qTP3d}(-_(&0-fE6x6_w&l>pr0+1BcjHt=<%Pi}yafv60Tml& zdE<)6h!?pTGUAn1D|NB+EKf_F^- z6Jg(n+!;X{OdwzNF*&QkCE{hMH!q6N*mox$a}o2rz~;UD!eUX1B2TNpCLppTN-`vM z3U@q(YkSO0Aqh19xUqRJ@&tDkG^XVgDLu*4*Gu?pjN5k_^Sq#*-9C$a*S=86)x`gdax&U_R7biUmHZb(sC>E zzJPh}L!JoYHYNeQ$DRF4Kh9-_(j*Aqi<*EXU$;$VI)^^FDX=!^g{oB*DBsAePRH>5 z1g-ZrjFJhfsW0+DDXL{?29pnJ3N7GB5N=~oZSqVgkPV(|8bg}7ZbRPZ&jXM^3$DlN zc9FS;dllHov-~bGm>7}Tf$C}50|#0|M&*e$OK?Bni&EfjAp~_@6(UoM`d!O5@}z2@ zI$ErLs8YxWcNw%ufBkI_u04fuq%k*Q%H7-N8fe+2+BbPwL?;!|zik3P`0^+v36deg z9Zu0|U7_`Vckt-TQ&=Y&`okVN-7Yi7U^eerFT|C8ZxHRu=sOVMbhj9(S~=#X2+Ian zB3^MP7uw$S;d*l$d2t~JSZX`ZM2SO+TA;ujG{Lh@HE7kKepmnX5W`fxO?m(2TVx95`T@Zt z+xq=fHyu1EdPT%u)l^8n3{UVd72L!A?(H$i@ML`9p!=f@Z|dOm@2afW`5_RkIhJkV zk#m(UZKZFUl9}ksErD#%jiCvYQkKwvKgH#D9ms}^%2N{xt*D7JaZnyoD8&6SJ&Kds zCeJbF$dVDpz4Y@2<2G0YUV;#fc7;3Uul~r28H$iCdD%5C?cB0Dw2ADpz=H#gRdPA4 zeJL|t`1QA+(E67)KKu1clxtQnnc~rz&Bq?c_*$g3_&2VF@!y-A?LV+QF7wCtFvTIp zPmVD))P;0y33;wbQI{(A-gw+?W(<{hw?o zBLkoR%^B=+7cPrI~)u`^|aQr6|d>23!=21lB#p`=$}D%L_8u1YGJ))7qALU-K3#2vGG ztp1@tEO!*_J2jYM{KODo=EZcl<;Zjd5)iD3Ab}AfEhF1%vkky#DYDDy=#iM-5mNgB3nb z#JW=5yixDGIOH);=1C(P#;Z?I+5=2ZYM3<2m}*LL$S~`9Da7j+5^vFMDLM8C6ww;F z0=lAt!Ep)dS2dhIH(8GEzJpfZDW}96PXhynn0pkg&{O#npBZ+M>)j#Ap!NkstcX+@ zip5NiSRQW77t&A+=0ZD~3^ADWF>!5Ho}j?pft)05B3c~@C8LJZe`><0t4#UidWU;2 z7w`k3ZoBwlv-6ZPa3R-S0dIKOY26hc=vk%<6H2iP_Da>1|!JrJ|kXE)q<}?JfV1{ zJ#@>vN=WqXD*_XQ$W(@9`2PPLtgRAp`NJ5x-^ zg;x#Ucl2-Jf_M8MQYA|YBT^K-(quhz{K=w>l2(Q)YZy%i7&${sya`|Zt^#X=oT}|h z7hYR{DV5Otyv`g;AIbtn#598=B)}7mh-)fOJJI&Ga4#sjQhjE@I?>U7HNd!K!|pjS zXJl+8zboswOUs}eNDcEGFPHq0Gs3eCl9m8L4(wS;#!1&-Sd!g@8}?WGx2>^}CxY-W zzVih*Kx0*{$jk+GeC42heu4haJsj1KP(7(aQDY2VbB?8XGRwwm zGtBBn&WRS259avJF_{$Ek&_FrI#YDeqVE0&`*so(#nKf6){JOLB7gC0B4s2!WHlER z1A`gyay^G*?*e&13l?_Ug>&vh^$j$SDrkOI4ctl}5SC3dR$dqh5ggvhf8I%RMzm^a z+qh$KkU^3eHoh!l($iVAtM`70QAvn9OiIFMlEh*VJ|C&$t6M$+V&a*0F%dR2vL$t>d4c|E}Szqe6&VzS=_ArkbPO;l_ zeu2|SPLu<45+JU~hspH_Kfn4B)sJsudk4|EJuAzryVgfz6_UUgwV zYO<)8FV9v~qauVn@1EPjj^8Vi4_??3h9_lMzi*&)qBEQKUGH}${6Ol&h}LAvh}X8- zrD&P&xvX6xUG#3;ce&+#gNPBy0Zp|O5Unj;Pl}cqssvTiSfs0OcVWBsR@#1$@PXc& zF(z+-<{%<_FdW&6nA<339|?xymu9206H2bAAMMb*kr zC%E{xHU{To)LvRpOUm*KnRi0Jt>w?8V{fv`okBvFR@ix0n$r(WS^$O|8^J1%LFdF)U zCR%f(%n)W+iZJjdCS(ZTc_$Ka?Zj=jVdRDef_1FJ_+L+$o8k2jJ?M3n{f!ZbxojxU zgdWjJR?fF-T*NN!T%y+@?b^nDzAk~A%WT9TPm4`N!?j2fNM7Q?|9pI40m%tk&zm(Kb46i|$}t%B+$Oiuec(-j_AheqV!DI}n?9FUZq!Mjm|kZf*b( zFP0bPOxU7LATt#AzYz2-gNPQ%1}UmVl0V@Nm_Cs?MN&~S8qD>uXLp&*kcd}-c+Bf* zjovvxOTmk;o}>9?^+8GplW=32ft1O7?DJ@i3GpVA`>bt{vRxKAn|)5U&&{tYET8M@ zyDr+V`YZxQ@VzaU<7u<<@iI{kee!%G|8*8_CB1LkCCQ2nlG;%ge2i@tPMB$}LW_AP8dr<;x94#7vnM?d>?X$^1CKbT0K@Y*{PLg^}Evc3;yAbNboES z?GPw+$)c_2VcKy>i8IabTDlP*XQ_mO;|^IVGxsm zlzr%$NGj#9h|BW9yvNQX<6G%d%Jt$o?n-+JpC@fwJVy#7fF?}U zUm48)w)61_!4XC=Z`b4Ea%&d+ zv;xqb zf3uno9smF!07*naR2N7_a?CGl{46G&s8*e&0c}d4$GUEr@n;e*benCU$&M zzmxENNFy8K2Zy;DI?W2~(;7TWj}K+dNVA{kT8HJ$J9d94s@1UtbTl3Q*Hx%5%P>wf zRyT3qK_teT)zk9sNj}I6R=;cHv4{aHnyiU8wJRS0L_uQGJt|yGM2m>muHwcg^De?Wa`hp~403>%ROOK$g|=A~Z&Wvs zJ8W^HvD{SjgfgyO4oTP2HqpbS-LB%HQ(#tT-8@y{)utF2X-XqLu3 zk;*lkim|sggz1zOOeXRrQ~j>9IwN0Gb!HNg^eW5y4A~*r4)Adz!+BAI{;MjCM>?w+ zweRDIgp9E64M5mVYR&koYn6Va}Fl9-P4WCGfZ2kDF2a1GLOb>` zdf&shfBY7w$7eYG?0DH!BLTUFQ$hYW2G#FU+I?0$*}3e(etN|6yJ8t~jDj9nmwj96 zh7CZb7#BkU*OrOWe>z6(g>_?mwC5m#$e@n=r}dT~0|WDG-Yw!o@3j z;E50jkx8wP&?xUQd80%;639G*Bk8!p%tro1htbqne%Ix<9TowqzAUi^BRx14b*Azh zGd5bq5xL=NC-S$17e5g#W{AP+X+><_H;pFp$odlcwZe~l%pP~qZKI*Q^^V7V9_xHw z;6Wj%Q754EnFjsT!^My9aq+L0c=GHqYDX1Fikuqp3NJKd*5_Irbc-kO(7b4#)?I@|>L%o>IDt2oR!gt!Ddv*As!?a|fA?*Ou?;Yz4@qX{WGW@}><&hg;a=D8 zB0mssA|bv@7Mf z6iTf;F%G+Lng9nXK#gfqYt%=d)1aE%+1?}r9 zj!utIu9t%qL#~GQTgtXK@BVQF)I75N>4 z0zCsqKugvzdR{^KZ)z}(wS#cP3+idjR=V`4CAA!4~6Sx@$i=q2xBTqz2lQmdO zK4{*H&HHVG$Rm-+y3~ZBn5=NJ?T+`VeizFp9858}@-TS^JpJMcnx9wMxGS(3l3fbJ zNSmbcO6G*PKgP5b{W)#BBt+Xuip=F9aVgu;Ks^3U6{S-hSKs&0eLG~Ni=>CLHmlzi zM|N@@GkOA?NZWKqR4CtswEHYNmt}~NMK02|%hP7gwiXdZp6kTBsKDF*EsUW84+l(| ze5ygKE6hUv)!ROfddH~Nt1v4@5Lu4f4>3bJX{;XN#PgmYkg>*a4CANw%tqdR)PPg9 z0vq}Hg`d4oe4cr5+&#O6`$a@+>!x-f0_oR+xL_VbYqy zy%Jz4Wqkf$j+v6Hz;+;~KInO5e@PLX#CB8OGCZ=t=yq8|FN+NFMj|*S;Z!8~@js~O ze;A_sZiq?GVa6JIRatU<;(pXDju}0PH6vc(W`v;7Gsy>8Vy+yTIPmr>Y5P1;J>G3O z?o;wG4KG9ctL^a|caz9i-Y9K>2LUES{=$U&*u&)yAJBQ*M!nQP{kR6r)K;R*D{E54 zc)C*vQy(Pi&y@PbS?HtYw(sh0`+0y0o|#LUe(0(WfhIz zR1RW=n$C>~2i4MI^1%l{w3aZpkq@~UZe(b6s}P__GK=(3JuQlE?PH$SCLp)Pie64IS4^lpu2jpZZ8#Q(<2F_rX z-?baY8g|FU@D~@BYN2^rMfFh$TB)#kzYW~va0wi|WLqR?=|GtwvGn%xK6H5_7I{cS zq;GUeWFucUWSC72gYz-EuLmrWL^)qXc47~ao7Cph5z&e{J(OADVl^ZmOd}h4zjSH$ ziAOS;)eh(9e&~ngMYW9awv8F>w#Zq52LqZA8%HYC@)Y*9jq~$&Xn)(r$)jUbn&qWv zS2SSiuZ-~mw+*t9m--{<;|X&$q=*+;$xkW2EA-vID}qd8pg$3CEvoRos6zX^0{uig z44d~^o|ZTESZ%Eb7u8CFKf5-w>oO-^_ZgL-2o{kFODjW{b!H@S2&Nd@z?_7V4Za~8 z7)<&YJEMD(8B*S3|J4NYNWDpKNSMDv{F!;N>m@5 ze2^C;Gn8ieT_b0Rf!)Kzo!pt5A<0pPpC*{R^U*wMqWM(~W>eq)DEJ;=DZ;gcP}D2& zHt>*y=!7zEvKoevGU#~5B68XD8Su9XBd@$tw>;bGSV&H zfy_`Kg9yb$S+6n@Ar?d{6GTSIJVX{NLDA%KmpK~VYP5@TJ9{pAKiDw*5QQ zosyy+I^talLrA<2;fW%0keAFG8^`jZ;WwTRZYb^YWB%QQXb3@)JV^>E!qxt{kITPw zp*K{N&y3X-sXPQHhHTImnp}+3@I#kpVjo9v(jr)!M8*))c3Pi!R*6%NyZC6)=g`fG z>xduuIYW)eweT=UTw8g`T!DiItKVfxXnbSAdEw!gKmLG^?@M_4*%Me*3z94?A}5(q zlmfR8s^4Wh(B54_x$H1EL;I|Osi6Wh=gGuJM2>q$d0InH#3x^c^Hm+k|FOXc`rd;g zHB+BS2c5wKG{o2vn5{RtH`-GcF=xc<7K+r)ZQd(JoyiA_h*o~kHKY8lhIPb>KzBy% zh0JhU5ic4K-e`)!D+jn%@Zy^nXntNPq=WZ>bi(B?zsSP{9%IJ>&t!g%EQwWYdy$E8 z+T@g1=9bjAyog3xQre+NQ{#&=E1ul?sfX5&J?3youOJ3C@5~T` zEa^qu+{o~Ln@R+Ep9Q?p&n%LWmw+Z5dvPc~w5bsNG=YGn^(&5$g^wL=l82}k5sLyd z(1iNW+T5r{VqSq)3PsIc;^xtN5?q%-|NuIg(1d$VKs*`+yGtk7^daOgOc^JHHWAuK2YNvsEqYA5P-VBvu%!>yIz zD>C1^Duj_Epex82)GY{~RZ;)Uf?_4Kvqxa{w46{qtwKJyb&$kx(sv4^n~O!VqJ-Ao5Bic3!`W+zcn4o!ds9$|g*%J-96ax?jTC?~hPAHD?R(1?~&0 z5w7TDHswC2zSp-g5sy7kO7wwuBEF8SF0H+^V`j8LvLTWf8VwblH$x0B#!P2RW*bz$ z3sTG@Ez+JCvUwL|ahabkhj2oFT$4z|{XOmwY3(faE$8vpMM8T^e_oLq&LONu3Dd5{ zI%GC0(wlV50uKwb{I1&92F6ztT)+RsiYM1Q4b+aSP<6GC7Va1X$Ax;{hD@v>x(kUblJdgW+U%-lgxeTdt_g`aIXN(*Kzcy zj>hxy!Wp~3{UTmcm?OH7IJewXqLMt88uR=v zk{JfXD?Pu9qFRPxF!>;vI}q_Ia5tc9uPZtfSz$SHBr_zrVXU!+4>$uC!?!L}N5|1| z74@eTCLcTm6P-gr^0z0449w?|1#d`5lG{s&)7VY8BluSmj-DK$ z{`BOOX80al3eCf?}C%C;fd+=?VIp{?ldn}GNJf!GnFnXce~%5y{(8$e$#JMqNYq%>dn3Blr^$ z)h~=7`Eecc7$q-Dgf)_@6y>q&jFG%jLtfb;&;C4pOX$-Q*YZP~tyBbGC0(?=PdN#` z4?zw|J)@B@Y&gc^I$Iz&BzlQS3LMXcH+Ao<0Ohtp<4h?@kUy8;oVd97;XN)sjq%(U zP*VK4GkJks0X-ikF2wULrk5jpP)kt$_6+skRH2mR{U=&8kn13sHcSim!JP!N4Yxh` z-V_pKRO(ff^m5@oxPxHEC4vHDTEg}BLrkw!eE!W7)L)b!7BcdkN3i(Gv+^Dn-HFaM zc_Rzp*e<$Hp2_-R+nC5#R-_@%3t`^IHU@dzBz*Qaawn^QR>tYeV@%H_T>kYM@{tFv zDYI4W`HML=^@#TzmUfKfDQ$xkU`?XIbG)SEM#m=4{Z5E_%_F$WQbS?+BKaiKnB^yo zJodY!ODrPE%uJ#a-gT})+PN0s2CW#1qR8?RNH#+nc}hy|jyr))e!9InD0dASXKF>p z(chOadZyyX|9OS##|}S@`&hznQ7;87Lze{8}yIsikA2&k~CYRT-G z$Rb>YlyIj&>(umqqIz9Wee~=ud`y{Jo-8VblyFDDih++jbl&yx;kye=q!B**hi7P< zl#6?`C%6%gBQlxWH0tFq2Lt>SGlJFmYASf-e3|V;A~@T~mC4#BuaqpMU!=8e{N@Pt zCslm<;S&8Y()P zJ|^xM-gJXHC_4b-ScUfA&(MEW#?OClq23#y?l~}IKhCS6z#V}2#@G|k5ft>8e6WtQ z7Z%IMJ4gtDT7%Ayobu+T4RN{u1?~_+u$aqagod=p1$U~0*qFesFgvpVH-p_puUUyLK3{aOnXhnk8ox*m3&Q!vn zY5^~+sD568T2UTEeH?msF;_fAgg0|3oO*@K@IFBE1X`qJL`xA?A|w>ur{`YFyTaHV z!&FUXQC`Rl?-rEr*gqfR>U9gP%MPac1jc8W%(?k$<$& zHH|reb*@ELR3@#x@IHC3|1H3uB^-P6f}L(S(Q7q?MUFz`2u0+JB`E7+P=GSc%Aa?9 z6w$6!1PRA748>$bi{yi85)9g&$e1ivSh)LHn|U@pK5~RD^02D`fkO z8%g1|Byl`>GjsBlM$&mEo@+&?<{gYY;N#?HQPQ=^anodAyiuDND29xauNtUyEL^|q zp!2bVe#eG!s<72WgbhrR^2D+tg^B$O$qlzTZ`ejISROfOT3a#KeV(U9@|dMMGKn?3 zZW>|<%JVuXvlT{ZZr{2oF<(O>dFY@OSz4JT`JkrgxmIY2lo8>gsFH6Ig0&NvHxFfSwHl2e|T8c%N0FepQ8WsuzVwLo!2p z{<-5Kzw1^Z1dFutyp)Wb?~Cqu4%{i(k&kBukW0*_yug-0^|Zz=TCaMzeA8k?ORP+x zmkz+Kv_L4rl}4=c<~$)sE*Q@yywMci=*UXpu$UaBZ9VsS+R7W%h-|}(6IOMcSt_dS zGW()lf7^ooM1*moE$VkIH9v1>;~cNZHhCgYJo!pV+eNqMB^#T_A$`mWb_Of5(aAw< zBysV3Xduj73|%j%M?=vrB3{utDBS1Bvt3@v?w*69RI03^q*q`tDa`tHWN0;)3Q&@h zq3#5AP{z(^>wUgUFbC9UCfue9`Ut?#Cl2&F5S%qQ4 zcEA>AK8^79kLMUTJxDbliX}jlr3dlOeh65OPx6oqKQiCunOvttQP^ez=X@|vZctX_ zX6f_D4!*y3b_#Y9funY*O>#D*Iw<7kMb3u%3c4)xT#&yk zLwjVR|6>K;{@WEE*&{TK!c=2j&^kR*%(qn_4nVJ_Z{#uJ zRYbcs13mX>VMVcKF1cG8ek3!b1t-e!8rXeQ%{nwmD~Q(ypt;4{f4#u@y9=mK0ktHu zdaQ@|etyVEFMNDgxiaAiY94uAS|l!QJH$<3W1=<*eOzfTtWxBi5N{;qi`gecC?rKf z`PjtQ|J!G1z3$@OUp`_~9l>~{vf_q|{I2;foH9_Z&(}pN_hXr7Or2naS9t1wIE)+pvObs5pXGLaK5Uc{<}KV z>ccR^*b0O|@=Ez#L=;$|WINu7s6aC4u}88&g&8#6UUY^Hr#93h5lT&D7UlEj;*zn(I_Ho@e0kf6juBpxk=91EpPW%# z%F`m(!MS{JUHH-3U9pkX8Kzj|cai*KE;Edsu<=HF!ErD15ZfID5iN2RB#8^<7u-cc zHih{eit*=s4F=BugB=UvGDUBTR86Z(SQR@DvULfKt#))*}Pvj zODO%Wj`}k*St48@9Yh!u5n5SUxSqeaoQ5rtY{K$PD!| zTlCtNvfvOwa{_ndqIW*T`S(}o4!TgE39w2;&`K(v|J@@rE^0Xc`3j@%08(uVwI(GeZ|6DgVuu9gm8Y#V zxoTd59X)3BddF--HmoEcoF{STzYYmq2}g04+FT|0)CZCnc&vU`K#pUz_jwmPko=v? z)!vSPh!r_zk#iRPM=$xi2FssRO=ieJ@|wY<&)f{B{vH!ANkHYLh0;?Kt$**J`%@eB z!3Z_cWyGt9cm?ohM5_lGost23S;N_HtGNvc3M4>8U@AnUYkcEoSP-uWSY%LS?{a!y zh{}DejQE&%Hd@08M)GhWy}plU@-BmvGJ}gTu3oiqebs_c^wA_ zTZR3^K5DRRek>+V+Xp@K$n-%{g(c!u z;Kt@XsHY{~yL^?NcT8sJO<1JM(k$lm`p|9U=`}EJP4MZjSLn98aAX_mQ@VHZ&cAO9 zY!CUCACjJN+ZZqzIZb}#Ga+W1)OL7|71!oc#4CC*&h~htBxz*AUxNfkKc}>O!NULm zAOJ~3K~yApT|)C^4W*`u&P5;BAFt898o@kMSRThlh?4{gk?Y1O>083Ol1rZL{aK!t z9n^%m3x_N}^272FTfSbDzrgYs+$lV5ZtJ^RsB)>{tVM`ClF=P|8IXK%PP8;hhbZpO zi=6HWMcjxClB?lxRyf)9ocr$D+Mo%YexyOED6k)!xc;Sw?wc-}<1wn*!;5y&I!tdO zpsnhdep!J^^|Z+5UEQ5=c!;3KouG(NW(9i}WjP*bw2PiKl&2+=wf-75@3#$-8M69a zo*fV`R%rhI7sl=blb(yKpWC?p*oG~RAl7_nR(1`v0*42AS--ainMeZ9q%F_0GBTM@ z?bar_D_OrMg-LkNcN0lm+_Bb}JhMquRfAShVO0&ZK6KD|-NCp#hIy(kWQI#k=ZU1m z-dADyqOT*B%(@mx*$$B*F3j?@W)ZC=_rYyMigIAl)RNRuSi1Ps*Xby*k!R8oEhHUD zyDnRe_}(9Ag_KrG_d%)>*vK2qxI<_8U44w5AxkpfSI{JvY|Y)KhVc^%AO6}#`(qEM zvIFyhq#leN;KC!~S%LO-71o)-A`AEZ-FQft+sG5a@KiE1@|XlX*IZ(s5z5n&R4E`@ zJ39WzM2MUWX~D^M#xS+}lYZX^XaTqLc7XGrE-`e6faOB1Q|^4RIP*|38~O8Z?A)I{ zy7ZobtVtQK?2j|@B+TmVE(K85?N{`;S(ExK*<3Ub78hMe>r>pZxA8!YArZ9N#BAiN z8miZ2eER7Uoo~CaUZ~Kj3e(WXo;r^-Ft-2Ui|ogI&e7INXLybq+20Se)b5PHtjNCN z#zk6xge?%0IS=*YnwWnm1pRegc(xeW$ZM1wy~gpPq@B0#cP=>;7;z!F-uz{~FRP?v zBX6h@i+YVFCc5J`n|$o6n<3qIl6F}yEx5-ThOf)`;s3qFNq>lA^KeZyyeV)!7I3AT zF#hof)#p}W^M21@GDAI((b1xrGxAt%!$U?uHiPH>Hf`Q-8_Y)D9mAPUn4Nq{t1tz? zp~?&c`Jj#Wf4W4w-G*5Apd3*YvXBoxbjS;ml}0o+iE_meE#Bxz!Zu6gp5_EBtBbtk z3mIf$sht#ASM+a5ZEZ5io%fUH+Qv<=XKm0*S^2aCt6`w~X@Ixie#Af zCTWTuKQ9sFxrcZ7!XWt|71pE|^ljO^-!|qp@+G|lLorzGE;83}r~554RLTk}zp21` zVd3HrZCrhSjmLtGs(v^!Lna@z1$+`T2;Vf&{C$lP&Vp#|2p09bWVZ0+4g*)&gOeEw zL4;W`6Q1*X0iQXzlEj)wm!VpyQuz*9Vb91z0COK4yEy-I3-5nChtPDOJ(r8Z#RV1! zB3vsI-I&n8y7Hqa8A#hUt-X}V;G#}(IC>M;P9E@(h_ve!-7Ze580{OcG%)UOyyqAf zm6=5fiFnnYRZu>$aPeacAOCm`^)a9|gSsf;nN*_OkQa;aWT>TZ!RcJrKl^-{d~iHl z2~9G@SXV+Ay_Zpra zB_awEBPV5}dN2hw1EUWaHM7nlbws?zlOdag>}$k}h=*K~(fnVU7=Ky9>wjy(`q0IR z=)jVv*jHC{dOQq05m!(!eqKTOcXb%YT0yjS6*J;RImnVB!W{$-v-?iGSl*gEQ!<3g zxa>E4Onsl_ci9x}(n+~cf+Ftcf*OIw84>;NhXLOF;UjEi2;)ndGb#7owE{baWtYOl ziD!s0<(ZrcIf+18o1EXp%tPiOdRgF=*6~L7c#gL%Nmoh~NY*5r{icc9qcYzAq6B0{Xp+ziJFlJQ-~+~$2&PixlY_911ogX^!>i5~rS>V}MMSHAKElbV)%_)p1#TDd*^BE&vy!$+!#dlfOo*4b<2Le1dB_xRJGi6hL0*Yo%yC(L zp}L08{_!c=@4C2r-@hFtZaR;7hu!^$w&_}w<^bevo=t^bkeA-!ZNnc5o%?t@$} zT^^a_CiiF!^0n~sSjp{*GFv~WQ8RECg_D_kRZ{(~xTfOz8^xw%GzLVpNHR!nRz$SO z=Kat?WRfNsx*WI}4(z~2exHpsXw21qUBTpuiR_lQ{8@leGF+zGgW{Ba3L+vlp$GaKU-o;~7I)ZAQNfJjYLHLRe`_ zSh{ZhTxLjahN{RUHY61lgbl_~?oRUWvLISiPfOMgHjz3BWFcRcs?cPEMZ4xU^7|?? zBoI+){CypxrzS3b=%V+ogWA|eRh>fKvD-`Y@SY>0r)zMYRbhNpfpJpE2M+;EW=Q$1 z+VsXoKIwgM&!ESis7N>U79ZI7WBFb7fVmpZ-v?Aoe%GR1v~X*8U0nXyLi@4<8zaak z0#u_g#3+!B>}7Oz~iIDjx0#q!v*Os;4EzD-s?EXpzbB9JtdSb2X%Q zgURZ5?M5yXDMzk;?Be{@RZvf>JgcWwM70WV;)ZbLi6VrFSM+n9m2{p7Y#zxX??ia^ zufH-`P1z^yxLN&+ZAVycATAP^cD!vMe4ldM19};l4IO$}WyI_HT?bcxx`O^#f^n=a zJ$Pc9UHiTZ@fTr!Kc_x>iP9=2lhsXQu5Z$H+txy*;ZRGP@k37;u9;_)j zTkANyGPB4eo*p#iV+&?gN9Cx5k3U?XeK~;jT!T`Q7cO~;q-&ji#*i-hZ917Qboy(# zQpN3(MSQa)l6jB2;l1_|b~Fq(db7ent8=~=tnM!Acg2m_b?#3XNp1OH3DK5TW~La5 zq!x+AF__!POIjeY98L!4+g-NuyRQgrDy~uzP|!$E|e3oAX)|1#_Ad)4{3;~t8zf@ZCq)M=s1qYLM_Nrp(8) z2uJMw6c)b|c_52-lFe}uEgpiC_geE3uUwJi{8*u)(d#wa!k-GPe%GW+`CU`Cs!uPE z*u&-}go)b-kVKK`@+qpN-sKB(k0HzoK39zzlh$-bEoQDUolf^Qzl$cjYE6OqcMVLw zs^F*paS8KH8&3@frgVG6iyjYSPr!!>*}T_q{GX4YmWrH<2Mc<4$pWNOQ0|24cin}J zJU#a4c`Jt(yb5H(o4U+Ko}yj!ETs1cElScn-e~VO5SHG>^(g~UZkoEg zFU$%w29peud{Lq{)q6>Nf8~wz&Oj0nRnk$`%ZzXpL~A`zWUx^>g6Wjd8+T#5qrE0x zG)Bl+@gUoM^Rt1-)h&rN3*S@klQsS_J~k3JNos zp&cyXF(tsZi5IIACNk+DE1X?C2iF1-ukN^wkuzY?F3RtcwrL|z??s#HX$|q=FBj;K zyU?DAu&l#(%`I>@kQ3k8agiDx5*8=_%DaM}Cx>L+ZDO|Lk{RZa;Kl8eC;AabGUFm& z+mtfq=~sjxs3iqYe}9JhRTUq8ILBx(f>;6cy38V8NV+r}B!}f`IYEIz_EPjC2ai1o z&T~!Mj^`R@UAwGkWtyyU&3n6I9=h_94~#XOp$pFma=U1?H!*3Ow;%p2Pm9&l3X-0Q zFs#*9fdyz%LB*gc>NT1Sn46*Pj`!L|o`_HBi2<#4ivCX)hQD-B?F>*CT^JkY$&X#2 zJC)I^TM$31qWMLMIo1{9uD}Y2c>C(Cd~RXT)k?e zec8pZKZaZrpjKt}c`A2}9FOLcR71s`*}N~JTCqFlBwpcTCbh{aRpmZL-tWK$$X+7| z2K;p5!*OqnHI{6N(-sRNpU-7*tey(h(@K*M#z<5PB9;xBSd>^UgU<51<~a_#?Qg0WKQhq%v4`QiE~f zdfP?oyv=Oh)t7Y7cDoK(f&IktsM?fxC9c%R%-Xg^mX?l_@_Dq)lvVu1rsAZOS^bLc z#}z$@Ar5g9_N@MGJL<)={p^_Zk~#UZiRx(?S8v+rTy-(*OrRc1Y^8ag-xWKgX2%VP zR>F%f^;~a(c-==kTLQbb8DoP)4;lyw~tF>BYKf?AdO(Gvk1U*&v~PzYu?Y5TNq37eKxU}OKK!l zfJ`gCNt1?|e2@rMNi9QH^mI-Awig5*IEd8JH7CbMx(5Th&l1b`S!PIMt@PA{+te^V zGx7fWHq1{woNCE3Ly`|(PGs0;WvE}*PJuKu-!(&sAly1HnSWKm@E&XSi&LqGMGPl-3ex)N25 z?#y|vdB<1UKD>(rS!8cR61{W_SMH~<*ofuHxdJ@LVXL*2@Xcgdp<^qoo>rOFNn!Q0 zHcbYPW8cN3B?AJx_DoVEX&5;pW+P8hn|(IbAaeohixS*39iulD{P?G9H2VV_n>S?A zodQ>55uLKdY~IVy%^-SSL=_5b33D5HB2lyuMUIBkNVJQdi?Sv%k}oJJ=0gQ;6|~Sq zd9AMJFsU`U8ItNk2&pZ`Z3l1u^&>jHHsoVKF=zF(ihEYz4v0@uGJ1+!x3NR=-P9P?BVp-$l``!KBY5H~R_}F{mhzeqF)j zk%7x^J81pThBO(&VYym5@J$Vs-&CPil|nvP;C3J^N3YybpuV8z9m%d0Lk{HEMV{bJ zAgJFpg5yn?%&?@EAWS4&{I!FRKb!+i2inV`*z~SqZx;$VkWRQFk&3nDa!K1Qu^8co zbcMky9SpTOI3HqsIYRka8M37$JFi9CN;_su*Ah=R@Ab;sKJ~iB5QwY@P%fS1mf8rB zC04)dSrw%t3!lEf#D{a(l$v-z?o@fUUQ3z_)$&!lc)MF%hZ%t4R8M8WCDzkW> zVmkGg4TcKr5PUeEi_!HpKAc}*^vcCl@?d;Mj**2S#;$^*lnyh2+Fx0G8uE?2JQHi4 zwh*0|g=Sp>r#n#0Hj~a6&Y#|+_uhc=vI+gnf?_E*QjN=!kk(jq8 z*@{LcH@UvNV_V2^zczjEC+yD>!DV44nekZ>O4>BAd{?$pS7w{fmIn-)s1v~=Nlky; zgFE%^yGvUG4KwRZgY|ztzVEJV4MD9sjpdwBtvZrJ_3a+Je{>%U;Y#K+RDg2Kq=n>^x2S`%NrZ|g zx?M!P5dq2YHY7DzOfzi~UmX(!jyK-7(DXJwKG){hGH@KXVgti6vc(T^=MXajf%V;s?4T9flWbkbh|Y{@7)-ao(rui zqyANir73`wm^s`@{Jz4QdMuL9h?YBIzaKjIa=5Ui2~94ERa8e7ih8B>$6s!X>bF!h zABHzV@4`l}+eho72IF}ZdUclYpLgXwX)`}T{+84h&%`u3p^P>jOS}>~&U^j0b+6ZG zkK}~vuM~`~v>@X3VFaZ;fq9~{C`&F0A$R`J8WFE3(g;r8dmgu48lg=idpXG$Ekv+_ zom2o>3F^oQv$4HQdV^m`vPK3Cwrev(rREpwEFDjwa>M; z4jrsk9m~@SY^p^np};vvXztr#=n#iTd=2eBGlpgqA&Bd;=Zy=u7+!o&^3rxbn{KGU+js6K8xO7Zpm(> zNfA(V8Im!}(@N`m=(_rg;9#)v)c0AWi(H0iHNL9XSdI#JA>_2Q9G$c$W<0e31Nl=>9Dg3uwQZXTZw&wHAkLf#U z$UYuP4r=x_KK)A%7pHYpzivV$nPIpyJS21*lfZSZ2N#hIZx9Ykr0o+q&TTxyIHQO( zL6KDnm8TXX#qHO9eELHR=COwIBZEa_lG6>M1dB<|VqKq6i=v7UGn_QE0w z=R z{k4Ouzjk4r8qh02{jRuOSN@0`QnpQ_UA)JPa=N%}vv^+)!cLRFxy}0`FHVT;A3b); z;gSwTb!tdHKo43=E6wt|Xq7)j^1(|Qqhs?xU$``p_NFeoj${|^dTx=!v%?@lM1`kI zT7^jfqlOsU0<~MxOY9glE(T0ySlGxHI6(M-LpJZ1HX~cK$ok~JHlf#*`|eqR1O)Z8 z99EiyNud2giGd`-wKRvxilS^=Ld8om!dMB(?TpYXy15_6Z)5&haUZXlgSI) zzw|NbI?!t>R3cu=%>-vrb}Mq)z8~s3Z)A08jIBw$c!^%tHaz1ZW-Ky)7|PR{xep4G zu=*Vix665&iy@uRFEVrJj@wKERZ`1rlDMefweC3LiO{ZeaE;^K6NprKp3B_n1}wRF zR1mEl1`!~I^0c%PlhH29B-|oMi9vSqHM2f5*66eG;uWO4z=6QCrx;yL(El)oGw@LR zyoB;&9fG_^5Az3vz~=D4qq8jC0rpP+k`0XOSre+2$5`TDyz6sRcQ7 z64|1k@4OEX*zu`=a$vJODDwLX>@}#K79(2k$8h>C^oEL~Z_0te*^WQIA1Z=+S|b+G zqUX;;mk-8ax$tpHbY^8Tg*7KGJd=8!NKsmw8-NaHsXh=;?bHAOAOJ~3K~yx)M!$81 zZf}TAqrz9hHVO4%VupHsam^d#YR#b_H*sjP75kJ#SyQfhSlys~-$Vs&6K}?Y?wJgKD4(fNce(JM_wRLPj zR8~pG${~1&SCUL~vE!N%uWb?5a2G@{d8N#Vmbm<~;yE5K5zUBrAuKfvkyIiRy=jk0 zplEg8V$lI5Fsz9ZucY%__Z)=CxZQ#GIO*Mob{|7$_@G^!_5nn!Sj{=L1WnQIL_Wxi zKxU{iGRTM*llJu4_$p9fm*GvOte)23gAKJLqxMA!MpJ>P6gKa>h=q|8b4(odQJxk4sC|XLh-hsqV#Gtdmi{O#B05CANP=LgocS;7Jk!H{jNAX7 zh!+tnniP}qK_SD~Z7?z;t0-%fhiF2UWbS%ecMT$i6m=u=rOk{rXq*+}tH7>-$pf zM7`o72fX7W?eiSxM-sa7V*_SWW2Ec)haQW7Ri9a_t7Sq=m)DKbW?eJR{;&Hz3FLz! z6jNTdd5>#1E?Sp%?4-{*B1Q9E7xn(Ie4WV6aO{j3`64M@#i&7-_3Z1x6UB}8F>c%F zIotvHny(I0J*AN|DDrJ~9LyC^E2FGe*@D2fY~F7h^JpB)?~(`T+FkZND^Oq;KvAvh zzx2?3GeZ3f3zg?4lfU1yI=4Uq=)E;s*t{1Dgn5x}3qME3yTxCT4Q()KNtJCy{(i@+ z(i9*u6(27Z8~yeteE7fG7(8#H^hFJdrLxEZ7ji@mxcO9`C|YKeBz$2Lq=r0vV&2Rq z($etfJbj;UM)kXN35~BRsJ<-W;!kaS{6h=nCnn4zjS-UYLw!LC){z<_X41a2(=8G& z1ci%9HmDeKKq&J>qIkQ;LrM||Q1s7B&x_D@RKJVzyXb*V62ppKg(5~|hCKb;WW3$- zvxQz*&NQ&g9oW6XE_bIPKoSGOLPU!sdix5>?<(mP7^=m_UEl7rap)HlrUG{iT6mjI zrs%yL;quR2SZ6w3{vRhnJ*@&e2_jasP(wtEWbZ{pYd!FZ&*N6d6Cz$K#4C2A3FvUI#gK)48_LvyN_sJ^&!8g!+czZY$~hiQ0w+BW>T6s%=6@>WJL!2(7{&P znH?zaM4jiJZ$ZAc(hh=LrqkcoQF&(K`uiT*KRL|ZP^&46hkPt4i1uaU$v9`!i}TtN z(IT67MHgqQf(e}p_nT*I@SIzo=w;03OP4aT4L!_>kW84&u*_tJjCctgiu!A?UIBu21U{W!&hC`ufA?LLTjQ6X}T6;AH6M0d))C{W-o zKsN8ga~r+4Lrh&CkN>#=<4EPJd0ODkF;`;HbAoa~-69usBdod1;caQM05n0%zHT1rtX@~=)d0PZBTR-4^a`16D1os?r1_Oa1m5#lxj}2b zOriuY6fvY|sx+&o_5ZW?rcJKnSeD?C#9g~@Z;v%2a+$8G?5?Sq?zZmvFw2MeSM$UA z)7Xqz_jK1XnUzr)nHkG_5pVJ5t9DYN#I_5Ha*6^-K$5%5|m7r5&5F*s?#eBOX_=-vd@*u((LF_wkZu0v{N$PFteaFvrKLRrH&uT5D+OY%C) zl``62)KPunqVr~e;YEO;J7$WPSu?lqJH9fuk}6mB`w4NZ#QC%gyMi)BAIwh0rY?19 zsBVaCFi%Uvlo~4*RAMq>yKJuMGDDb*#9YNeRsEJ(w`(Zri5mtTE*>!@K^wHY3L+sy zuG~eKcYE)MRu*)=i>}pLL^B+)^*YmTt{Phc?JWhJ3HonG2znulK6vumCi}VPx7ULO zZM@K#>Ld@O-XPo_l%o`?VzD`&7xFyY_9h1QJ(BRI6TzMO=zTmx_o|Q1NekX5&E-VA zvhIFGDo^Gs!XoRC+B|oyrAB$OrEJF(prW8jwnw4;55KO%zZx^OtNZhiDP6T^4kKk* zQkzC8`^TcWUHP0xSo4V(4K)$0MVR;UhS3KhF=ndI0-5p!ZAR%$n$#Mjpb`U?P%&Ue zam}hRL$RHy8pnm30+WtAWWF+^%O zHZ{bveOanc&{RGxfxmw3qfa$?oR_2T%-P?$^vUBtGy76vGDUG z<8_of81#Z-kq50Z%6UX9+omeXhk`1(>3x^ezbMsS+SQPrBb1|R>Q50&e6~AJu7)g( zyr_Sw%J+twKD0YHoaa6wmq@J^>@LVPm7-x*Da^a!pt8eZ-ftT;7O|V5!AK{qUs}i7 z%}_%b5zu?*9#gl>J zW)tlM`r!!OQHSjk>ga>J4a!eNWW8!tVI%=rG+3|@Qu}CpJhO_f-(l-oE3_JghycGc z!PU2YOa@alKd++t)MoE5jok#jO9#OK{h-T8mnK@biyN0hS@)tXxOFYu3%8|G?dZFJ zc$I5Ja4KUo{VRO+oyS?rFclcO(pB-!xX2jKB4b`gNy$_7B2Hh5 zE<#4N$<|fSKO#4cS5>BZUH{O-#h<&V9y_R>IPqCL&iSsDp;S@fN}Ow_J$7o!q%iN5 zxZRQhfs`dn>(ryF7NyI|D4co3YyQkgyC%*2<$SFb4x7cfMGpaMXLxD&5$-R$jy*;z6Z=8({6?utDt8xMIY?G z9-#BX5Y^`nj{a2xhF2**Mxt>qh}fp(7+wFGxeschbvNLLg_ku#iq4Sa7&Yk)Go?`S z4-oXwsag>}Hv?RMc#pHw4$LnO;l6CJXoe-8dI64WR3te!Dzc5v}+7qzDjOLARF=egQcea(wewQzuozXa%?_F#U}g7c&XgNRr5`tl4oNdvslu}^ipWR)p}#E`b`csoEu3CQ3EEB#!XvP;tZCL0AUx zq!OYwy2kY%hZvkUQF+mVcbp0%4@ojqU|=iTfGRFlMZ{~Rt{nO&np0JxBYv^E0^GQ!SxnHWtRb{}YWq{oG57Qw$5qyOH=xIcy6H1Yh`b>=>( zv72CloF+pIg8|zh)c5QCf#Xuhv36w@1liqVUQ>BxMQ!G_wc{W=y>3VFW&t`BM!q{l z_pAZ?MFURTiGw6$kw?HJh=%m=tCF0evP(v;fY=vGaa%Cvd7n#?MsGJ5F*faLrt)e*PH|H6mISo6c#KmIJA*^linTEx*sa>y)@gUjNsIsv=$V zyig&Jbf#by9|opKfn+3BS-v3$<>Y)<-u;qkmv#p!wEK`nZX3kzgIR1-QPkK7q-rvv zWmaKR&bF;5*L&Qk%)`jrMohZszR;-;_8TlhY;S_zTYB$Jm?y@;*EP6@mVU17DB=x5 zAHzwU2a*(Njr&DGltKkpLr569yz+T=rmUU9Q@$PuDCHA#Gn@|4dFP{dH9+vRh3d;X z%<4Q5ud4C7P2*0LBxfg0NN%zuLR2oNPqId?>}G((n7QrPrH~RP_ur4uc|Bn27r7cT zcZwVVFS%?|F)I{(uqdBa5mZ$aUU}Xo%BDmqTW%X`ah**7G7`cG%O^4peYoa4jC>OQ zyHItH*ms$tH69|E2JEo$TK(G=k<}1_h!qj6npKbUX_fg$lr^>kQo1Pkh`q?)HPE?x z_7Jo24E=XL%T-C6i;Y(vyd#UHDbd(HEN>7F5zZ!hGh|1QpNETqXE~ShciBtZF~}DD zA<9&_4YIdmuqqJ_%OPr$E;_GAxc<@BHS01Y zNu*ZDu186up3YlQcz>s9VRRYb`o}){rz0GENhH}2_Jx9@uz(n(Y*iF;lC1Qd=U1x` zSYxSEGVQGi(I!ovsw6X4obRuUMwD(YViB1p(~!9W)}1D4)cD8VEMaDhq-T(lH3cr+Rbo}Kx)?MKU^~#r1@DD z?vced3-#@_n;`eW!FaGZr={=1-NJHM_#zcxVVOkB{{_eJ&HgT9=oXNJm5+x*<#Qn79v?N-XLig?T5k#uZm&$leku5e3%ZY=#u6 zdNT7Q>yDTQnZ=cTcC68^Xu9M4T_c2p3ETOrI}N6UEP`sx>momQmVby0$Jy*=$9|he zhE}__0#dOkAO?{wQd~;feeljfYB8OWbS#$d^`(VaPL_CEb~%c!{dZnG`r{i&xLK-6S_~EnIY|6elNcenR=X zY!*WP;*TA8CpNr8hb2y?F!L3wB6OcEDUDTjh)S8CSiMJOHald>6|EzgwYcqPMh>FX zFE=}~B^C;o+yu!Wq_bTV(U4RT@^SBvdo08}?G!Gqh1d6+>Ixc{ER$DGV+9oE-8Eg* z-6rfL_nOANA|YNxerY3vLQm69d#LkwJq%EocYlihTOZdy4B)g(eENSJ-*|0k>>S8d zkb*?f1_wpX)kJHzVbFw8mBN*Z>An&sp4`**nP zM`(C0)Y?_Gom>@iCSwP#qp)!+;vq+}lrd0c+|i24sv5%c&rQ$3lfP+Wcowjv$>DH- z=BG7AxEA%M>dH>bqN*+2E8GV1>MU~Q6W#Lby3eT)y>uV)%H*u;i1W-Kg4OlA7}5DI z!+{?L?5x*PT}4n)?PSJvPoHJm1ih=ssBgGUMwB&n4-~kh>9k;$O@u7c((+?j2_eq>%hz|cJJG&~^ybS|S zWw$^3J)VKib7_s{tW$JxMT(wmzlscY1rkT|Q9W^3xZKO{dbs#g2g5U)g_d{P*7AA0 z%&$wspkl~#uQfFYs){5}%@VDdb?02=^K2jU<|(J1WI09A@;T5+7_fiwm*#`mMIRjZLe!qw zXng9ibH*CG2eL0r(?qpeL!(*8aN5UsqVKPV0)x~o$`(GGL~%YKtAcXgf&LX^IE|FC zqT+reg96nnF;e%8Yh@6zFrU}`D>&u|o>OJvkIC>z6}f>bsg)>}Tji$iYdqs~(W=1u z&m%~({mM2ag2I}mvs(4%9xTtm;G>U=Z#yh^SMw7OR?S@L7q`pG>R=Y>$~lw02?~N%SjZk%JEK=0U zIR;rHP=QFKxit4H67F3~<%;HOQD3^EjD#iYcD4=yUB_)P`M3n;|K9wxil8%r-x=fM z@2}w8{c8R_(xg6$5<#)K5 zv~?1bGNYmGZY9Ev)ar%;IJM4#K*O;A9L?wb)t7h_n}3R+)Q zS(x{dC>pZHy@KpI&-2i1HrY>dC8WRU^I8uNOQ#{}p*amB%w`d0;hcDxoX9j%Moq>n zk8&c;$v&62VUX^o$v0nB;hm(CT<57>Si_JnWv@B?#c1~p`fVsmIdh&J zPOfO5*Y+l^lAEZo8cU$Fc$C{Bimj6c^g1ZTF9~_qhMo^ogr>6^*ZoQLjSCdE+6g z4yv}R+ArRB3f5L6`cIaiib#Im8d1Fm?#g9x&%lyY&n6g*Ll(7*f@;+4hE}_75%li4 z2?0-`sHgYcB@F>c)jIoK7eOyX>kALnrw$B9hk4&sko`s^tJP}3bzSC8sPXWza4F;( zdDDm~C=^)3uq!ZZBj3$%#bC^_9M?sbY-upeW>fgVh^bwUH9*5_%-syvAYN+_+Cnb9 zt=;~W&$14V(ao<4{m(5cv(6+9Virc;uAutFfqP(~_kM)$|I>RM{i=!9XVv)pWVW7E zzZSNAHtL>i-97jrWd`TJ(=-<1zCMzO4s zTU1unu-Q{kqSm25U?Z0n@NnqZ#syQyCPfUPS_Cp|L2_zm>JYAziYhQDyC@ z5QqY>WXM(ptxs#H9y_@Dp@;6z0~~(cV9ApycuijQOSePz8l*@`La;JyL{&-IL}BJ_ zo@}DPW$TpfLjn0Jp|m`1OC61tzmP}rREg3iWBbU#&J=|KE(hoATvyGm!!{gEyfy$M zv!o&h{W!mt4n@72pnO`v45RY^m*4hTFtktp*JD_9LqAV;6iJwOQnbj0&@goFvwg&k z!j&M0)J($}X445HTukjUN{Z*ZN}1oI)pF|^8IOrWQjN+-x%igL)9o&Azl)5Mftmqf7Qa^+{gL1UAS$F zML47|@|DEDKGSBJmnOfIQok#0W-MJy0f7)*Cj@0=i6F0Uo4Ds?%jbPoaD5SPY?nHc z8M8ddjAyo=qA^q*k4FenUxxGZU7lTqXVqX;EFDH(0qkt|Jk0xG++*&8QB<_hHSPn` z@r;Fe@4t(~yi-7o`b(GDY8tx-vd4&Mk(xzhOP|x)Z}4e!j)6oES~}lFQZ>0oRm=)g zyMz)o*Ctyn6BwDU^L^pz(?_7I&_p7%>;a>u`dR?VxJc;aConsY_YQJ&i4p zja-{@o%!KaC?ZNSL?f^NvgE%=Ig=@uG+8O3_QYkuHToY$jCfU#Z034Me_PyNQi_b? z7)P9YbMcu%MMb1Qg&@cfHC4rN-MLIYE*uKMCK9hND=KY4-?mZa5re{$voP}G5o%6@ zsa}+nR~t9^pnxP42{I1zKGNs3b`*5{!@rtfaO$(4PRqp8ziY$vw4%FZ3O-a$M)Y9~au?9R(vyCSy33y9gsM zyuoF5;3dkac)CeJ#$aC|57}O1>XKG~B>I%sH%V24HZdrAA>~FHUIr|xA)WPVe^HOs zF5V?=GO$?!u#Nj}3j~MzJlND#PxczYFBfHgxmjj8%6(3K!nQYYt5j+85rU%VT@NqW z^Dhn~@4+Z*_nj^Nt&Ip$d^S+y) z4R1Q9mE_Z+NQ8Rh=W(F;O;ezDC1K==co{5zS2kMehwIR|Q!s<)_kWvdrLhTIe>JzN*J zQpQT=)K}E6B8a9#QI(-E^6r5Rt7c+!6`=Eafd2at4!&x{JD7=^p1xZ^Ll zFN^BjgkY>wmu#Q1WkkUUr$dp;Of6{~i03ZNKL_t&`5F8bPXS`+&a`5Wf z01}2bxe`{7T{sO3gEJrR|M3Ei=N?+0*Ov2l$u^%&IaBFbpDFMzx~DyzeN;o+7uwgZ2Tus;9%eKXUL1SJuNX4T%># zxfss;38s^I{w_KV=*l0@y(F00^&tsF?z6_YBYqG*WJIb@8} z#V>+h+=a5LLf}e(=~i&`%O?EJ7-#>|LHDNt+F#aLG(!>bDr`dO#hp`FmORLkq)p1H z&QG4Y$tx?dp^!uaT~@p}YP5`Mw=FemQv$ljAhm~7o=JZU*YXx_hWn&=B}8j98KUQR znZl>BgP0R73iE#b-2l^IhNpkqf_H4|dv`~XTt#j^>%PF} z4~=L#!OX0%h=$z!T{3koeV}-Nf1i;Zhc%T+0-bB<46m7+VU^qrEe}S;Sgk*=End3? zZAYnJN+m(Hs-!Eg&6V*CL6887e`NnYJazqUn~^z&1Q zX*6X@7pY!VtHz##l)vktM-wBW<+FTR0|b*1^Kj7EJy1XlB3h(s(Rr=<3kQu)JXGxc zA^!UYiZ)2WFoy3Uf>eD=#7m{WxoR}lcL6S%E7|d1;~BM5 zhs=0L^exJI7RrLRk&^ehsBhaKp^p%xc9Hti@#76BN}TMP9?Xh)-(6D%c`(p9Eei2Y z(FcimY3v^89DL9TF?jDI=uTj`6+HQE6L!|0bGYneunZx)}<6p*Su&`wm&xtpze;EJ0N1B|Y$a7>7O!s6hsYW!fl% zLzGqBv2w~pna>N!my8=$k%F^Qm%!59wkoqFSXBe&r&ai!35#gxUyo6H;-L22W#=fD zz!`%m^PeLAx%4IO{h3j5WXE67KVh4B5Y3g!T1C|d! zdqf73MmMQhZp(sIrTkqXdhdql{5-(PuUl}BGU2WTM)peeDz1j$jY(!hL{;gMA!tRP zbNeOvS+*`&(j};K>FYw3Fk1amUVGWE%aoNV&+X&m1#LhLg8{~2z=#(`Gqfu9&Kg-1 z1Y^L6R-chB?LN4>7@h?<|9zJwF0Q|F;T~FX1lrwPT8|z?uE=$;Ua#vg?;6q&6RzyL zUv%TE8e?g0L}BD7Q_R8{%iBde@sxWgx4ps!_856YWi6Mjobk%kM=$GO60oG0lJlC)6oUQu;<;^{>t`gWe zN%yeAqF9Z46TJVYOSo+dhrevFoL)=c=Mc=5u1e0)%HQ(Hy{bZ0R8CfHdce+_p`{@|{pv&9`r}~`M&SL7%(0M&X z=Z67v`#$0uO`H5`ww@h1`s!GT)NEggcP$18cRZ)dyA*zpskvAC8qC?o7Hv{xPjBxOaI^4Fs z9Q8^>2+~7YH1@oHK~k118k3^W)|v0@21E9W!Qv|t(5ou2O^qDAD2+y{F>58-rjXKib!fkL~FF2=a}Q=jFB zeEN57I0u#{T008bKrzXEu+dpBcCN+Tj>|)dSyM-)-jw5mrsr{Tm+eWL$xjm z*bS2nK&#VxSXbHbap4NTvbN=Q8y`@_u?`Akst0gW1_GtB$H&g;}{> z;>CzoG-VMKyMBjx9YkwMv>LaK*<^;GGePHvA%bp*_Lo)EKXHrg8jX7a*)McXi-KXa zS}o>2xT|M1H69Ms2^Y_xC^9nE*;$RilrD;D$j*0BV2vbfZH`k!PfCY%nHj zm)zIKlQFKRS1g=7B~2#c#lpyo`jw|FlnTmmjO(bB>Anc68wR5OuaJArKt&S9={Aj5 ziEE>G2Fuk&VdPJJe5CwcM-B@kPkFtH?(Y?jrLxY_buHLLrUDrPSCSlCQ6Gx_mTh09 zog(70A{pj)BUZd5S)&T+lO?vBkhn((+JNf$oj97I6+Z_ljC^U!12s*;ya#>e(x}gA z?Iw%Fqpi}iy zB*SPnCtk)padMK>RX?zbp=y*ajX%fg%rUaa%`l1LwaDLPI_l>dL~dHyE^+#ud%4>r z;#`6%XlxsXx@x})>Y=leO%_IejL}8F+zq`W8#T(`l^6qAf}2simX?C-IxA9DqipQ- zf;v_@BGX<$-Rmf9D&VPcYb((Ti#pxbTF--mIyD$bWg;>}A=v#1MKknR{;o=Sb9W?i zVPx)$;{isKAxl)RRjnOF1dIn^Oth}X%ys+Vmo<3Dw!T+(6hy4(oK~aWK&@V5iHtQg zwu#N&06fJ3IXk;~pJ&T1xs64bP9m0loh44TEAja*WOGZcaSi(dStTW}OuFpKF1)-S z9~lAtQ5WM$!18wy@iGlgj*4~WEAKi|{mNbfvgAO;;N-Pc*r$|L%ezihRc4)+G|v+) zQx7R!R@G#AyC`uok+1r57qzGEjhkUkKUV&v?3$L{JSk;->I8L)RH(dmRg{}Fcx6>p z(hZ19l=;u{ZNwR*qIp*(j+loPG-p>&(IwGC{$0ZR6hL%2F{Xv8H!u!>StyI%8aY-)Dg} z4!>@)^Ib*8`pTuGUH;Z0w&_Zv)pAAdhDDGeK*GN9yCp@YWct1~xe+}4WS)oHBvdLS z^N}E=fEGa?K^QPM!#IDJCH?&wJ0I4^Am|}r`LwkA;7)?v2d^i%{9})84%c5g@J<{Z z=6#1j=gle1I|ap{B*xl(P~$dnqi}80HDsF#0&mB67GW};GPNtt-(|#ZhL4?W&x_s{Wp_cAiG?oNzpo=tElZN z<5|>y+2?0oITi1~xzZJJqZ)E5lU2YsQT}-S*QARf&fhgg&kx~GhN#+gRIOTk&QGPh#-Ms5jE>r`bztXFZ2Fk$VlD z?;^E}+zjiKzsun4@=7U2YxF-M0kY%3t24V6i;Qn%KNmF4Q`y#0{E8q!Y{@_%;#Gg{ zu_%UQK>Yaj10!8@zH6ZyEZy@uC)RIaVt=@Ao>c_UoSB|nwfi-Bimh#42{-ull#}Qhe)>t&d zip2?pBIvs?4n~ps1m2u-2)^{1E%=S?0tct9cs>Dui}}{y#=g z;$#YXF`mY5hBdnevut5H|9d~^=`im*3?f<-45Rbo5Yy2N$A8s8^_im;tsTWpnD;sk z+HLl`hQ?h(E%EU>&ysZvMM*cYC0C~T`7Scv!*M81NV|_HGT2KQL$+wgA2NnwDOGpc zZ7%sd$~EdH;RM(HOOz%R3_c7nt4v@YxJ+FUdPb=j)&=8GntPz;Uam~rvi(~j5F5Uj zx8Vd?VsctaIkmF4h zTHd(ks9uZPZN9MStSe^m8NE^^TKz&1RM&Q1xovFT?IGeY@?8x5A)K;{FbXk_d`+}= z6y!QM=}zIFh8SGKJXJy6hbArefOU9pGLq!y)c z8@rX;GLCq4C5A>g+uzq!o+7#J@5s)xjFH8eca|))J3!};@8C?w7@suZylTR3+br3& zu)cNIU)n}rN7YbSv!XFx`8($es-)!(9!wOmu>P{j5_pa-0~T1rX_%-z_h43yLjJh1 zK)0xXL+(`+ucD5WZk{9SbyU!%%4WfuZ6-vEURtyRANo^7(})>^hFxZJ$j!rB)V4~0 z?r1&k3&^-&NpXV_`oR$7SxCxqndYm!pGL<+1l?O56s)UM*}u8EiBgzg8*U^rSZjA%(%tH@W1H&7y6##fjzKJ_ zz^lygWIDv~G(fM@$LOeu+UG4;H9;PXBBMF$mc}cSDW4nBFkP>#YbLLsqH-$)B2^&o zKDmu`pEG7OrB=;A_1IzgyC{r2DPHc8jm8Ua)y*)cuB9Q|`1!NqOQ-H`C?d+TYfbby zuiPfeAFrNdsnAPnJVofoFD)Wo6u=~$PFbjGM!d+FrvNA=&X|eXR%OdYW3Sb&xq%U3 z>Q4~{Q+6JijmtFtdu3ck#VNDAlU$Olac3YSaQJQvbPY6`Z5;fn3H!jnRd9jPcyiy} z(~yBCT00Bc6r2Y19Gqb`iMX%xeZhKpxQdL<`@$Yi)DqGGAVk3+RLH?L-K@A}QWL}J z7c=Ayz^zQ-O?oVUN#}Ba@~bv#&uh#`RBKOg9XuCDnQ_Y2qXO0X7f^7Uliiq5g`m$R zqlD^-!`uu9XFi4(0X|*^sK4+S8C%(z%5j6^e!P|&UdEkOr7jiZ)mM_dr)29?ATEib zMQX{ycu$JVjr$o9uSu+URh%S&e9nSiw_lw8?cBTK9zpXnB~l#3^R*JRbQZ-VjCOp@ z84JR&6s$($PC)bIf1F_QF+$C2;NZ(98c%EN{-K~I8X6kwgB=43B7}a3**Id)J;FXJ zTM1T^BB`hv+j23?GlWHL^Nd)YvhfIztH?mXa8p&YlyG*&C8PW1CJa z`rRHIBRhi#826_bydJ}vxOo2Q0h-ThbJuA-{u&w^Vg78J3`6!lqIcM10Y~A=TQ;mbp`e$j&Inf$(GjaV5aBIo*&F-?~d7FQu>B7!J#70VJYp5dBj3~!T|Wv`<& zkN#9OV7gU!M-Hxk?BnPEe1?Osn`nJfExy*AKbK^PiEzy-DqbqBritL(pT9RiKIob@$Xb%)=2Ft=M&YU%CY5jwr6%Nk>PLrlr9Kf>>KTL?>|;-U|CYN$#@lbA_?16tblC5raePF8sYM%w>bOx64sYTsD098 zyYs@Apez~B8w*Yu;m~FkDpdnI_p?&!KRF6SUK{K5k5^9`nL21L=zQ17|IkAFi#p!_ z;{`fD_Hp#f2Al(X)g>zFPfF#=ezekuEU}kXpGr5`m?1F^GGtYCEQ{*mDx936^B@as zcW^ROx(}C@!+h+Cu+bS6GUO?jAyZIFoJwWZkA7A!BZ?Ks2`P}H=|(%b(OjLRIj>k# zn4TdHf}){@IjIdUCg^_`;-GPeU;m#^V7isZvsN`UZV~L9);NA|v2$9F6oNBc8GjGi z9bb{#$X$SEv^)}&GR73rd5>h20U1@S$PGw!eehHp0f<)}RU_2HAsrMw&0W_7_o(c3Y@^HrHF)EL;PG6k665@e;~);Ra1y&25=o}8{||JW?i)n3 z##bT6A0wC(2fz61BeY)CwCkpZ#uku7%w=a*$FqDl>PLWO!nO30OTFzQ&P!KDMFG!h zS_3jK-$zQekayXe?!IS@PTu@)H128(!#02y^(lJ&OI-YZi2ln8-#vpgHS`DaIvvTKfE~>n~HLd_=xUh5922-IL{lfn)Z!?Qq*SAwG@>}sWHMTRY;!< z>0KJzI{v;skHL0KiPs7uNBnU8%;?2IIg{K6enu+EA$!nOg`xw>ma zv8yLjw1Ro0$U6XYFAZmyEl6@%t1|^4H(LM06c`w2)EhYZ>lWO$rO#<;Xl#nq24NC4 zSK|gop#c%4jT9_f3DIV5Eo(u=g=gQvo4b<0CR{N(CF+uCyJ$zch%f_z zIvt|>c8uP|0Hdc()IV#A-3%czzy;-yQzk1cl?26Au1%rM6+gbbhKk7Cwl+fq-6KQB zJ+N8i!r_IF!N&j}&#%yURYmQolW*vxA2+<}Rg|Z6eNkz(5*bnq#kG@HE?YKr&rB2J zJ#oX3-3(b{PI-G(5d~_P67h;)P(CQTlG@BrAozJ>k=;Zns%uBV@@Ww%CbyYzi|&Jx zh?3}sVYJA#ro+gug6^Zi`vBpGGMcRh4!&xlcFf5isG*^u4CX!<#BT31?LNpwzJAW# zi7oNVWIxUt2)uHeDqq`D&h`Pxcyh)ht#%>x`x1}Nd=pgwj^YfiK_isGa?r@SiW zff}MPevz_#PF=#?$}jm62^zX54s2 z>dKrKFw1Q#oJFo=0tJ@b3=P+ST{F>tKf=dvuGv|y=BHKmnQD7WHoTHb$Q!qebSb-5 zWynF!__J`iq>vEV3I%Q$Jc1{vZ>dikZcNQ)5u$O#NClnmGUl#pTsK2r`=aaElysrs z{c88X96ydJ=M@e(Yi1Rk56hD}jpg zvGk%#{HY{%iL-Ucv|EIIpZBa4kIh_eZpB8C*}cAHEr#MXM+psq`9!07M}l`Lk!M+oc~J)9oN9Y zFKUdCEfKHm+RD_$y)9&j$;z57rM|==s$|#qU&5RAltFQy}pLrWQGU}gVn@oWu_rZCh=?8-(jQn^Uhmm(H zC{g~dJ>?x_{7rgO48EVhE7kCufB%#vWPdC~Q$yo65r=u7t6G!k{@dJJMoyH%Ib>dz z+fuUb+TeZYP*G%xZ0{&zFKwa(rFZg0edX=EZy81fcv738IqBl#Kl|t&HDSGK!KH)J zqC@2>N`OMy!lIFap}5WaDMy966^Pm?0o7xNo$u=YJiy04T%&s8pnBr6o#}Em@>>P^Lm3hFCji}Htx-q+zd;VY^g}S|FYL2 zD!;{NN)jnD9L<>9%tJLWh$v4+sURrxB-i^wyvUtt(w$;_K11o+z^A|X1g%eMIv|FI z#uh*ugp2dV!H&66KOo3>u{6g303ZNKL_t&~oscyG(@NLMm)CfaYUD#@7gtj8N>Gw9 z0!0Ktv|E1<^GXJVYXL8fF}j!Mxb6(ld)|iiv<|23#4b^JD(t$3wWvQub*OxTA$b99ogu-8Q}W+KJ2E6>Jx`WIg~LFg_pF}8qASW6p3#- zpBA}$McIzZ)+H*Zx>>Nn{g~dUq3C=pf0t8c5kkvmNgP;1W)o%${adM5u`ZTRYZ6Bv z4EM;uAfstAj7cO#o?PVbdZ1uLvQLSNXDE$Kv}!FJ|GPGvhNbNY4UH`z{T!U#LloA1 zLUGUxm6ss*Wty?dWkShs(;eh7K$RFIC~`Lx%>z%JQrTg@hj}G8!?qitJ{{uXO@QHL zAH9=CoWHAXqLg$h&j{pwo>x|~NUq|wPKCnHC2n#VvJ@%IWgeLobd8wTa<* zfWheqSAXfjY1=G}{8HF|iTPQZbSjP%&8@s?J3-^iAcsFR)3n$Oif8W?eO#du9p{w@~Ha6ytE4v6Ucry)i#685jl!kk(gf9)w7?xm@bUKA-9zw5jlX-WPr7Dj%@->=l~;3~xE$0-`M2HKxA(RflCLcg>7_m;34qfshv^RGwVS=S*HXYapQX!` zzzo6qa~DqA!stA}*}rsP)eRi|s>wbR_AAr(rAt~TXS-1GN)6cjzbq#b1;hxZEXah= zc9(h17LBjW+ECd@17~g(KtzQOR?`?%D1X;dggk-brLxhXqEPah%Z}|l-`Ha{Fjx+; z={)+RJrAt0qbd;{*6;kuhaGzOpLi?+<3m&DG&FV*v($N29p-)e$Pbz!yVJUs z+ec=nQ|5V@Hl+0PRi0GID3=@~BwKdr&qapz1DGQgM!r0QGYilfT;TnG>0$8l2<@-h zaXzRm?D{hl)T8uFi#9NZ^9;~5=~{f2vl+sxqX@iyi>@QP_R1v|Lf&*Ma1U%2SmUSv z_YAEsYG}OhmJi3Tt1QZn?TX@+`WZ!w$b&2Av_$nNwI_h=n#k^P$vh9%L>$>KLKse9 zSY;N`@J2z&ECQ7^t+MtD$}(5aQMgyiV+S&Opa4C#Dxf#0i{9Qb#u0hH9 zDI7K)St@F?Xq=Zw7N;Q@;!xBdUOCa&3CIs4UUdV9ziP5T8kc|Wu`^z+Pit@wZGQC0 zY+b1VUKt*lXr0;Xp)!=0gaQ(bLgtR4?2cA6k40;Yr%1}EXR`fTIz$Vg7%nKvEu=QOdx0wC|D|u>3mXI0#B;PhnOKRPNEukopo_h6sL| zq2V?0?0-3iOYX$`5?)b5;~o*;?^8?$)4e>ex@#yVTzN0Rb-;aTmiV8`8nKTK>0R|K z>EcAAQzb!)y%4Sufos>UqFe@!t1~pi9zJ|CLgzyh?q_Y-hb}5M?WX3CgY@rt1V`b1 zlD7R+NY`3(k-DHrqMo8_%d? zl=}!N7~426)hy1@M7x8t^o4AZbg7VRUU}rqg=}3Lk`i)V8}~zmM7+Ft82QqCGDSB| z-nvLb@)}sc2$pC%Rv@|Wn+Ni|x=k>*P@jToOkj97B>Ap*4y_dm^B#Pd!WcRD?3c%A zzN)1XZEI*~tP6S$lB@e~~gFuW0opFG5MO+&&=^jG4*+ ztCw*<=oUe-eNdzZNU-2lBOE!Zy_a1PzrB?=P6OXVKOGwAb* zs487D5MD!x_s9IU*D=mz@Ao;#0Be0(WjVV#KlX9)r!FI6wI?o9!d6_4IOJ_DMDsB3 zlezm~C}II?kgmM`$vzj6DKwqqnw)Ldt<$z`q;02d+qP}nw(YcSr)}G|D($paJ@2u; z4X7XYrJ6X$m{=#iXNU!P6G7L8_ydk-LAdFp$4kE zgLNvJmP2uKhiT21$E#a8M!vYkYz>aS&Y>mWjU%Z_2*7Fz@(dW4Qs`WzfI#_gCkxHF z-wl@WtIWJ+?&mR^-gGt*Jec@tikch{SC;C0xNw=A;&0?OixwFS&3eiv{ zlgNzHN{cgW5jyZK+t(;0e{qZyGa z5Ob+UB9)VP375Lo(0}vxfx2fq;G$%0`r$PNac*qjYIj2`Y zZx`dzNFIc%XF5LlD0k<=GQHh~&~0A)y)bsp5^pJasc{n((linELvgg`EUi8ZJm<}9;MKzP|AocjZ|hpXck z6}eZgmJ9a~b2)6(&kZ##A=;Y#M@q{IX>sq7TPFO{XtqQ-?PV%RpH#Ix91*+<;D}Dq z#d8mh*3kmks)2)RpvCUWAEZ@#-dBa4KHyGYi>HT&hjVM{4|@@gOAv;+X*6^Wj)a_# zsG3e&{Fx(1!I9AyS)7S5!Jg_^MxRNjfG-D5gReRO1Ksdvrw!(TV>*{}{F(#P&25|i zcngHEPE>Dht00rcNU>tIaXiI2M6tj3z*xyB7eD6v7RzCWox}-ycId5Y+P3cX5b61j zfD<343eaeyYyVU>_h7;pvARe$J*DMCq%|oQ>@nR`Cb@08LV3aFqX$|QFoZzDn zTQvaxniJ{D6@AzP?c#?wTr`8TfXa6!>NYMLLZROnj16pi9gxNIPbBNoMk;4~vj|=+ z4mQ{47k^fP#N1omSbi}g#6^IUYM>*VILXVn)aC^?G8HzMWnkbynCZ2rnQHJ2-s>nk z4S50zo4RXQ)>uZR+h(Ud7GX8WTt;mogkHNZSK(JILwB_TUjX$=U%Wss1m?4|u;Sd- z4zZu@hRp>AOmmW0e!pJ)XSJV$p?sD2XoeM486LQB98>Gh_Oaa9^u0O1+hTwc5+3~T zvam}u4eTGpFtdC86|c}898+V9>ZpmgKLuRt+eoiZSb#1 z;8#0Ie!w%l!q*F!`067U{eKl=4(LxW^wmoK@>Uy7^$zxyh-#)7Q{_?oGAls*ORuMPu!4V_}r?0-4OU8r){LZPfFwY}Wo0OD<%GAnA6AIBZLCwy4ZZxlle5OY{8=i}JEZ(CsS0`dPP*xmr3+q39F3D$!6R(|Db?@h^I&n>K&NbtRm0hRDkg&CRPGkEr*YGge>jF>3dcrU~X2uk$~6n4E5ci#REcR?GG zQ7x#krnF|&kvHRQ`eQLQ9grL(F`2&8GVcX+`G=>D?eRG5ufo0l5rB_P+)P3Ogy+n# z>^+b5sw3&C1=%2TmYZkK#$!h)G7CfscQz+E)w^jP@NHCJA8zN+tBV9Vs?jgw{Z6b=l-Ctl%y_eEhbDmec23dvhqnxEGsD#dJ`8IbBZXvu|AHo-EI z4F?Ing)XyTJj33kXnLB!2F@~1caK;q0F?isQBf@;3D*#jwZ@!^8l2@A?*PNVg`vJO z+3Mbg5POEnhw!zIU*HlLIuRo}5F$8fgK9P!<9XmMjT2B?1bt=RU6+@|o8RF78+-NJ zN5!da4F^e!-B>>!z7Gg3{D*4%A>6;8bJn)lC zhp$4u*HN_A=;I$E-OJL7Az&R8!miftk&c;tt+IWapvugSr4K@{6{74f#Tv}q z(m?+mK{L_Bx~469=sb^Zt;T7pCfM@iI;VVL-&RCq_X@-$mX)&PkX%DxKT~F=Q(;AS z+K!)f+QNKOU|V8n6!x${_+|eiDQ;%Kg;v}Rq3UN-KwoHxhLPqYI@-l9Ar>BCRv$`^ z8I^k?RH0&|_lAXC^sd&dWW^G*F%{|&bsjQ*c`JKDzPm>xNS|l#z%_A1X=oM!o(O76 zrbtnpruOWAF?js8zj{5^sOz2MXvltpKieC>cGcW3zD>mmcgPc|jg~sz2=FJ;T7Ksx z3_uZ?l?0y|)QC{b7Voew00AZ!Ui{rlTCaz>l_YzKJDmc|<3yVwqr7#ojskR$1 z@ZKD6fhVU=1%abWK!B*l@sOpC4~A`c=Qm)YQ(oJl?V|9OZU37sL@46hKvTq3!bCR# z5_=gKuGugxMto!K?HVhzoxJxQKHvSNjEX>2Q6$w=A^Q9R-vK~&@Y@XfZ3M5m9|@CU zVdqybL_6gHooNCLLNTX)}h7Wcnw1 z0neC|t|lmS;;$R+5Un;TEF1S*H431nvJLop?&SPfYy}C)8b%UBbg@5l@Xz=oWZAl9sP0??xNUdNNy$yG`?TG2svk4^)%JMx;VgTQp+fJ9r zz=5oUD*<1@$2Wr90rtx;?4k4hKA*AykVTVkX*8zXA!( zmE!&|$0fGUE5sTAdOIDV6~(jx24P90M2+`X7D){_=d?kQVaL{xt|rns*<>8MggI+} zsGFp&F59xlc8G~93OXfYoI<>xdyjgXWcOQ4Qo|BQup70Q`|9YvHzDSMu*v|x#5-3> zQ8kLT-H`0p^HqgbLSX1ZuUb2Gz#6vOH*9$TZn4X<=#3eHxNtJS2&>1jOZ7CRodG;p z{o~gxmNdSIuL@N%!(piUj_4GtB43l!(@|hpay_4m5}*632Ia%3rYgBcsg_Eok`h$R z?NjTrTvXrh{=rw3NT+DoObYE>?n>L=_)wO_zhh>9HINm=ID@LGmDSVWNqN+K+<;1w z;PkvK_*|7dPY>J~tQfMx*IM4t6niyfE%0jO$%l706Ti%Ub%XGK1qckh{$-7q7RmgL zBdr~{EtObhmc@}RAJd7V&WYA~s4B-54)hD?A}D0#9?B7TR^;ao^w6|mY#}FFx9g6X z=<9fF&J8LXtP}OTl$%Ga|NB+o!|Bkf^nD2Jo&w5V>W*dRp3`2bc;TfDGE!>A!^&p< zQ#bdWlMhgI--Pfo90SxEb>-{?8!N3}b3bJ1^rcocw^TV#v{kd{v)o3zAU8JYVCH|s zg{`__lz;n%eRZQC`Y!}()ee&t{>61@$lR=nu+J|KOhiZT1U)W1&#JW!sI(oHWQ+D{a6meHaV-AX?>mA)fj+v#{k)^U!jpMll(37t6E2pKpLv=K<{W`!xu_5Id5gHskNW3Sp4*_M$StnlW zFD#0)%Rd(~#FidR*H}sQQwwNe@Q6sJe`M7{y-kWrq3i9w;j+CToIZ>woSSUZ3%Y9Q=j-JcF`vgnbZiDNu_~w2t{T zEzVk`A&?#i8-$$Vi>Psr2xsTOV&B|Sv)R|(UMOOHgY9}mL(^f(w;|g``Gf6cNhkC< zhgYlucio7N&Y&6+E*p4R$9iMHitdz>sfMg5>uV)oVQcQ1n8g^+_m4b&{)0kLjkjsI zRQGkLL{`UP0lmw$+e%5;axa=nFLlsMGNKbvje!rR!@axzN6p70QyslIV(4_C<^VHEJ;Je0F{u*yd;k=h8_>XRL;= zRyM9vp)36$>weP*L!l!}1)y4YNGZINHq`pB0h zeC>;sC&UbR#G}GVXJIoi2wQL| zb@HFewdmWfDPoehD(X*dfE)H$n`-mJe`|8F44|%ih+3i|utqWyDOxNVSzVr`aKD1} zt!kZilG&PTeN>H`V^eFSQT-Z}8)nTgI^Z*7igSScW(iJ{-q*-Wa~&#d6-~WC&)kyS zN!rH3+0V|xxLK28Gf&9)uPPXT!uoVWAP(szFLS)7oA`@Y^rn$?XnQNupjr}iev1oWu$*A;!9z8v>n~M z!(O^mD)C&cSV$1+9rr1C?-xYfyWb;&PD265L5rSK@)d6q2$#5!x)AcpZwy8TOYZ-w zXcS<&e(>|XgvQRQ5q`%z;H!b9G5Iw*d8S^ssSoHycGO!keuovvO;uIEc{eH)tzS{# zDKbSnElmG7g}*}*W^?$r!6L*s=`fO@%Ae!&RVF-)w!IC z(k|v8ZDNBtQ)wY-PT@&#ie=8a$vlWmId6c>rjnk=4`(M_{aEHVPIDUjqX!zeSRpbk zlV3u|(W~wqO^t<(GKNtD3Q*^t7eC7c`XaXe2(M%o);t6Q$TS7vhm3*Q8!PRq_7l}R z*gQ{v)ep)Q>dO?uIw=0SaFN0l)7QduQ1<I6hotTgQInIk|Lp)zuY+Fe{<^HG(PN5ZiVV>+UokchnkS4WB7BE>F`@XY40uk+4%Ln8 zJ(Yqbm-z9t3w15~)~^VZI{)*5I-ClD7sW=J$}hOf!`Pw25?dTK<)+1s!#GOPSFg`; ze+~~KSy1C+nm{fS(iQbKLis(dF9x4mbIG%As)kY1bS)Ez8w?cRv^ct~#*Uwfc-k*B zktlVe7KE2`1em9KXtg`wc~hjVp~@ul3P7k8OEi@6>jbrTuQzCoPsE2KdZ@={z>`ww zwOMycY^G|6#WvmBRK?c!FfDedi#@~w+!7qk_n%dyehCDibYffF9)suD{|>o-a2yXM zo(4@kc`g9|@UbRtl`-C^9Us^WY6Y(FGBgf`unEXdHwV3^Ij6Uo9|I{ARdd#jB#a`2 zrU)8T*q*_bJA-ecZl~BIw0mc6!R3O-ts0t?UB9N6kOj^gnKy|m@+R!TzPpoSa zXj?}+y3{W0UGfE1{q~`Un3dLY9odGVR8*d{Z@hILs{l)AX$3yuVR5_FsjiK=)rOFP zM>x5JN1`+1=7oa;60pxFK{9las}7h!o(&4K_*TJlpIUwejtEw=?N{NacP3gk+V#M? z-sOI{JNVNVc6WrtNf&3BQ4S0fsEl8P@YuTtNRjPBEXmikBS}d0?L5N6`3A-I#<~Sw z3XcOvKD=&AL$yix873wXi|i|S^e8E24h_Td3vMKJ?QB5eFTfd^UDuiXuZTBx#h z>fNbAOHRi#^SOwB?{=Uw&e%2UwHr2P<-Y2`H@ptJWb7c*QHbXd7~s@2Xi>P1k|SI} z{;CeQ1kC$L?qQ4vcP9eHn%9LmTp_bR6NTVf2Cceg5v-kt9o9{ zhX>CJKCUpW=Lr4_EKiMgMFK|0(-9*ZyNOqPw~3BEJcyXzJ`*@I^^44{)&}$-d@Ryv zWf!V=W@=Gu!F3WYCY|BgNn6VOdOn#3_p3mT8ep2mxx!f{^wjj!?t$xLQ)CThpbb*T zuy=G=6*KuD(xGt4#Am}5kTKp$B~(W;xA3Fi{38OB`_B$gVgDYAiX-iA#kLi2*B`8kK(;0)c0=};Q+Rzh{ zAExpyUyBiUFw_0U8EJ&8S}U%9^J>+Df)1{0!tH21Xkg6#rAxlOWtS zn$IO?XjqB@E>$(Ln9VlK{QCiH@7{Op<&y-yw#jzzXI&!%Q?VM0=JG)HQlQ;>`|4^f z`2z9LU$qoxc)g?hBWVBnAnEE+)VuVl;C|fsx}X=3&1v33vbBRB8UpXw`t17!EeHIS z1G1#YW;-5=4PaAhB#W3A9~z&Fio#Zee)niUMJ+tTs#U;3NdAun0ElDHJa{BEj;ESt z<#{Yv^fV=(6no{#z{BuEj^Li!*&QFWc#b^DXgs7Z7FHv>}zOJnb4-iId^ zjgp8vHdS(kdf!}kw-kJ!mpbJ7ArRCU`()j3o?#FB)~i$_-SBVUPnm7C6@6|8@w4t& zAc%QL432KWqeA8IKn2KGQ9CjPV1#uRz?Wg?L0}`5(Iu=-0fX{xEBn4Lc6*4HMlsQt zVB-c~?f-O*!RYt52?ViUkA$A@gb~dowl?9ml3;N=KPoljol+F8I8lkyoSfB=)t&I_1mC<$V~1z{Mxhw*8x%d5V^^olZ8{?HnakD+igRh& zQJdx2)WD?|55y_LNpy5!mn;z(t=A3k-XD^!v3wm|QR#aWro!d{87Hr2 zQP7nYV(zdmhi$vy&}i`oKXOa?Q%yE*(Go;c5ln9%KkxRRI6G3vW#y}CbQ|i43;0%} z)KbYVVow8KhJVLiGCvkbRlOQj0F;VE(9t~CD-QBO+ zoG7P&aStJ$$})wY?u(ymxX2?OLdT7@FC=-4n>!dg&~mT)k`ARl!Jg94Wu?<{z;88h z>GWMiy$&@`*GDu+s$tUVCjK2?`ofQKsQujBDkRlqM}VsdM$;1epq%&0G> zf~{9OuFjyIE&lvH*z;g-v&(keiDaImcIzXw(Ze;#KX&emrI(>(esHXT0XYCxPh|(< zAo)wJsVRrlN@H0obf3o50#=JAB!j`4kqko}C?)FrO@1ZUjdaT}K9iyxtQ+7ndT+G> z>@PgPQU&2{R9L#a~plNOD&ZGk^R(dBv3$% znDWYL=7E1@IOr|M_ggaXe_nCy&+y$~ALMUCUUrxf7$jFn#j35>4Dn{gUt3m3^5F7K z$Hztwux}QNxmoVwd`xA6&^*vy5tzmyUC}Y1`VP!Z(ba2)Vy?;QrQnL4L zrqvQ7z3DZn(J8Y{gTjvjW!^(SG$iEM_-z=f^;pOx!Yn1HT~bjT(z8!$L*x+V(q>`M z>+NvA#LSfSh(p%ua+vtQTFVLR0?rRU1@wyV22IX-F+ptZmrVkBDs=U$gu9xa%DClA zha3+Bu{&Q|?l)D*Lwe3&75EG;enCxm#6)790WLoDrl|r zZ;dvAW-|{9K767N4>b87b_f)mlGZN+c@R_O> z;!M&irXpyT*N~FaMK0PvqekXD9f9(+2%iTgv(X~H5SzD-=dpkPM2Li{5daN+xh7Ny zSptAss>8m-SXR0q$rEWIFp7v{~Q0U=C-ENDn zxQxy`BY>WL%RU1XJH9;TladDm(Qs5Jl`z9awaBtd?VOBq7xS;DP+$-ZaeorP8|-6h zC1w)=ObFsn!S!i@f|pZ%&x@lEqFs`YX9@gtD7pfmpc<&|0~RQaZ$nCLQ5L#nUW5p5 zKP3y8=a`op!vC$qIIdg`aodj>9XEI1_v}6S9M1|qSJ{aFt6>%|e?ck#UJe1)j&>g) z;n$)On3D#ooz4n_-^|}DGZ?an22=8uhhgK8bN?PzA_lU( z9q7nEk60*W9Pb-uW?Jl4$d&VyU%SV5nA|~R$P4Lz!!oG#lNi!itK(YDiNT8TWg1H^ zK)sV}8mKM&TaE#1GQC>JNq<3-*5!@KoT5ab|Ie0^QYZ%-SfAekFf6=|tyw+_91iDS zj)(BTlB$Vs1e$nNY#{)-T@6P-C@l!VSHMPYF@`HJ$V2w8g*Yli9BO_=xi378sBh$( z4+)?3STPsL{rtfEjA4j9vs;%qZZjSQ1~Q94K!8|55BBFCLY?CmFw7W&j6K4g?iv|1 zU>&bQ7E9cKm)g2)GL;tl9Jdib#TkmWo2>9=c{2NwFD?5NqX!bKNIxA`jI4nNbfYoSecrBbwMM$3U@>Ri*{`jq=v9p%N-h`v6f<)4Tab$e3U$} z+2u|S!2=2ek9}SVlUwbcMz0l|FFULVgprnMQyA-IA>0rnOuA0Ckv@a7$aUcCIjX5J z++Pq3yGZ+MxIj02u_#Y5i*R=vSt5jS^#JW0W6q2H%Q2F0EIDiiZO8a3r^O}k9<1p6 zW*!JWk8E_mMR-R)zaV*sNTX`VcWOK9%&BfS76u)i&}F+C?|Rx!8<-E&=Hk%E^BNIo zvAXbw=jp1Tl)V>0$yrBw`wIU<+n|+-5s&2g3u5McqFFcRyVaUuj3$nc^ zf1Jv(81Ppz!IkMSgAZL+<$tJ}&vNQSfzWuWV|i%3!27 ztT*#^sHaiuc1Px2V*t5BA6Cy467C`9t`ZW+707G%Ckhk?+_z3Qhe9YtRPf&d9fB`o z1KV!3ahF9I4joq!Yk48OFbUf@)(1cGVt(WeKz|JcSOEBP@Fm*l2EdYkREU(*yo&zG zzr|_Z$$w>fH?s5ie)Y%EdFnFwbL*`~L+fTKhCsi{ASfPO2yY*mQnsn3|`_!Dvb>~C*K-G(qo z-18D}NS`|?c$o!cxIjM0*qNn#ge5J*C4$#L8%n96mD`QI0R7~~CWjhrR4tiq<~L*_ zhO~|6c^6u&<#(MH-t#TurcWN{`grh%Juhb@8GsF}g%@loDek~EdMm`Q#o(rJV`}4A zTfZ7g0yvSL4Udrf85}sh<;V!?>5Px@Z6rVaVesUaewNN%Ong-!>EdK71w8KOy&ii28gEbq_avPamCHfxbr1Ox8DMyDE z<+k!$4%2K>*(&CC>(SGwDz*ntJY9fPA9~P>HOy(2g(3|*1s&Dm+SuD(!UVXWI~uiA z3AR7G%gOX#AW64M&Ba7z(!KVqHIFI&o#4*ak6Fgs&j%yaGSsiN6)S1{EMAF!URosj zJ>5;!mhMQeC__cXw>I(=7qw84@cf`>X~*t^gdHUTa&maH;^+E79gf8T*{-5#a8vS9 zoFUzn;b}|tAXldo6qkQ<_|_XWVTV*(|E9na9@fNx=<}?%<1l-8RWNFD98AIu%P%0X zx?M##4^aF)Cerfk%+Zay7>yH_8?E6@hbeUkQoTcwuB3kwch}cM#b3N~c)wSM z^v?(~OOO0@wSVME!K5X@)%WSowa8WV)bCd>ED+Cl)(r|iau^0hd(5P(5qFTqk;c5j zVAj#Js3`#=k=K7P?+56(H|69*6SWWMJn{WTn(>~nq zzLOmuFBcO(3K^JGBnkA)R)%Vk;#om<6?EVMiBOUQF>6n*oJrh<{O8#qz7oI(MP0GRNP$3h7m4ZhO5%Kow#RaP zz1S|BEL~8vI=*aESOXxT23^fip_=Y!^u@EV8t70F+r!mA(+SeO6mi7&JWZw<$#HlC ze(s~9+uLfmeLHB=I$uac{W`xzGw%}Dr}M{wvx8vIm?`cB0Bi76)P^g_;t`6~Gr$e? zdT=StMj4jldg9tqX+2~;$4uE&L-0|VFx#xIEB>_|x~oD5gGl_TBPJ zqZRhF{o)l_E0YQr04LOvk^bIEEMBTEt!Bd`G-6J{5MBVuWMDwz=@ScP2C0{_W`ifR z_YY4@u<#Qls6C zEfqQXYrQ$yut=O^D3UCvqt}@!musGfQE|_NYJ!&rLxB*!dQNn!+qKY3AS_0|xC)+S zleIPoN4>L#-*b2FO;!j|xzzo}YTm~uQ%@^19~YZwZXRiCUcXgf3m(EQ!-@pi>Tu*T z#>_>>D&xM95B-8B7whP=hlBT%Y>VtvVl9+LWR^i!HaPJ5q92Lpvm1k{-K|~f z9;X10z2}Gn#1xY)l%}=0_gx8=H;{3 zvf#BFdw-=a522!mpz*DZ=`?Lk`NrohTu2HR(*9G{pEtM4jBS=M4E#$dAmGW2r&agEhxf`&R zz=m$h|74Xgs`P|$8La%1J^QBQ+H9KxUj!&^ISSyvSE{fD{D)nSWY?uz@bg28st5FpzQ3Zps0E851aBuzAgkIEm zcJYw#$I@8=aff#5f8gq=ZmBC6iK}Fe?)}>=bG-uk@WfXK?j*px{{#&MoQrw6d%auH z%hCE7oXw=1X-89q)qLS_Oi+sSkMnc7IlV8jPZuOC;24yYtXnP%uPcz1A5#ax0eBzj#%eZDu=B~epVKPEPhjA4fdO~av z7lm*VdgI&Ya{ULH4wR=VFqEo5+ZQdkN#){3Y&y3^qu|btn}NZZl79xQ&H4UY26H%( zx##O1A}NczMU1vem`NX+4l{seD`i-CgjRXF;@1jB@}!QHp}f_QxyOW3>wY3O(E9LCSuT z0)mn1>CV9U9+YJt(ILPM%T5lp)()JnS(tRRWoKkg#8;=eVGp)=a@=6>Bso+@SU8x7 zL?q~kh2qTCHz;qF*21JW3sRY-u6|m?ndXDDy=d^4sn4#vmfg^t*|8N;{l@RGm+vz! z_r5E`mu|$CkuSX-4iWL3?x6#c4Y9GtWu?Q`V*aJ=kPOw68FC~pX%sE(mT&V`C35){e4aQeS`;wEJMF|m>1rX|NllA zHsqS72P6&l%hWXWE2rLPm!GCoy5CKUv7Kuq3o)B47Sn8%9lO_gD)|HLJXKYXuIs_B zeOJWKv|Oyd>jpdTG~t)lbR~sMDmZwN$y>$7oA+uZ6v;1*CO;24%9l0sAjHhU0D$EYeGH8rD$if_aXMta- z(`C|&FCziA+MDja(3b+GCmODrmT7h+{5UB2*#b-5l_3iH=35V`_UETdemXR)2r};cixDcxL|ewIq`b&eOIG~E)JWlcS!)2wyS+o1YXkr( zrj!a+d0bf7FlVebxFLXI}&+9BHCPA7gFRLLxo^W@T z(IPXWdh&;sHq=tVS>E+>isfb)#EQ4V(~=GU>nJ{cvV-Kr#C3QrYthVqF_MKjYx1F< zJ7Wn>TAwWMM&P4b%1IRnNnomtiO}ixl}u2G_It8Sy-ZI3%K4Yw!wo2H^m+G{(iiO> zW;eJ$(}I3DA|R~^B%pMVY|cG)vb*TVni2?Sx)s#=^bU!wWU?DELTb`dCJ)-7_jcs#v z`paRS%ODZ02{&&Tmw+G%nJy|S>IpGxq%_1xPL&?%XDLPqK4^w*lkuGP+Ts|y1Ud5> z{GuA0ymLNY;4(w&il9ingxXV$4&K-|fc?#&z46@-%ZkI-_ zNeE|B&)IelhRK&_ z*42xZ#7>kYgh@DQqm@q2pN?BMBh~_p-HnW$%@6+q-p}#bHKwxaQ7TxGh%T^R-*vcv zeTzQJX;p*Lr)yHBUj&~Sd6p_x6bqZ+H9quL`lk4RMF9=_>(paa(L$}G2i>1Z z5FtLn4(}a)eEs{3M2$Rsk3^h4ZVfaei?y_+uCP%@5xKy5`?$4E(VG@5P3@GSudz-hVIx zCwsO`uu43d&*ypt+!y>dw8^#2v>!b;&p08lG)Y@|rP=N`%ODT(G?cbjN?MTr+7gYv z!vFfdhiN@B>8Z(?zg*<*h$|F>_c%8GID-Cnf*DZ1an5EY6k9v&ThIMI8U8RtuMbI) z-#WzDMGT4bzpH`_Re$5KU^u}rMvQ2-3HI=ItUK~&%f@4u!Na?!t)k~OLJLrfV%LD4 zD2F^c9CM!>=__V-{Cxt+v*&IMr`O%sQ=eJ^I#`zGWE5A-zi49KswR57p*BJV3yFY~ z;sTdqf|hs2-S@=^Rbj&=)5-f{^`?859M6tPm>#Z8@+zjBy3czLiS@djU1&Jp#mxM1 zhx*J|&~SyYunO9F*%ubsr-O#HI)<}N75yffUzI&r-5 z+Y4iTD7FqS^?uSHUV*P1{@Br1^t$s2!fjq~&A2TggMnw=Jbn=|8!BM|WVoA>)KtRi zf35XO?i^8Uimh2W)p^nf&f+9)j9cco8)Xp*bM{nru z1pI9umXQt14F}nt;GFgXhp@&3?CT1JdkxLE+S}6oH^G0$FKD|64B!g+X&Vf{fa>;H zyrc#N-ki+LjYtmERMbXMl2xsfzK5t%QkR83Pf*o-cU~$|ea#g1V`_a`Kc>vszny2f z8tMYDg>HE3?;?zwHrBq@{T;0fe!HS)TC@x`NtNqn(=i9*-9A|oozt0=?;^g_8S2ha zrZ_-9%5jwgWaT#N8d*maHAV++-p^7%<71<9e*LvfbJ^wyZce%0g0YZ#j;fEvsqu$B z_`@37@*G107Vf+ou*xDXnno&s^VdqCwizb>oug|8`6(Jp%h9jjIY|GZ(Lxz$OULeX zfR8uNSng@Av%cngp3Da=lFt%_F|V+^@gqrg+hznQp-KRnTpFA2XTSTa&3oyN5e&~mnRgng-E_hd!K0Q+U!o-*d`kP0tou{BAp^;M5g86Nj zk8fB|PnsDOz{}Va6C}|-j7FjJzVToT5koLGvwd+>*^m&&xWdGyp?{|yf2Y66VysA# z&TWo2{}|XZ81>0NF}b&j-MEUe6sV2o67D{j+Ag3MEfw75WD3YB^x_@tGcuNdE4)nL zYo6JM>L34MZxMI|^8NSH>Nx+^{l`&C(C90AM0gP2h=|VVN-Y9#57mYEcaYbuKvmUK59KoZ4E}Rd8fbf5Akmgf_(oU3xG9>(H;&c zZ-`*fhSGM`)n-g8p)i!#)~q~H>Rv1rH`Ub#ZCS1i?8>IlGb1s2VXLE3xB?xBP-!t2 zX~Aeh0%pQn4Gl>00Xf26zlOht`~7!9R;$|l662>F1FN0zSr8DoL3 zmIDQ6rfg$<$GP>21~Cy{vZEA}kO3X3R(BpykLnE1#=hSWQ*m4#Dw+iA`r>i$l}v=% zfS+zfB%6>S)OTyH9_|e}OPmuGJI+DJ4|&&!T|(=G^D5p(HZwg+y|u=DB3I6u@}y zaiUJmJ=^rhg*S%6rTgpzNrUO@8KiduVKX{JoIVjQSSNCv-_v;TU;9?Y^t;iH$OFuE z`N^x3E*ndbKiql_tpGZs8qV$V&~ZEUCYH%Z(QP5+%MuL&@Ec8o2?5*1}*i5_CB#0eRj3jt%$+pILO!qvCUG5)3s24>R z-*LbPSMYkL?mczut7?WoPygLPkN9o~S9Q@7>{)%SNb{tl@>B&dJp<`y}hPQ!D@&o$bJRz{D5?a)Tw^Y5b?a38+6x z63}!%4FK~vxrbqw!|y=CGZXa%PMP>d2dm`IcA*RJAdwr^4W(cUFe76NjA5Qv4$|;( z0yg>CBSY0tjckc>{c?r8cm`h@8rEW?)JGWC)P+zPqJ-x|LQ%>7Y=XIO^=}|EU1x^2 zvKLZBtz{r23F-|`4jWw@A-1fw-rYT>AW{r1r)%fL!p#QyiV;j_IwmPMRT?vY^P9~e*Lp6KDlt)z7v^PYnwam;>-1*?I;t5@wa(%30S;BIy%Cc#>3+Q=KAkt zAzj&|+PrH~W_eRiKIYE@JY|u!N$dr|USY9o%@~Z~pnBj7J^}itI~^>J?|?JtUEg6i zGf=&h)d4$j6ncy60Z-PT?;(V~u&^C>%~#H#NX!k0`trad(789K4;44Hw8(TnvjHF0 z!LQ~1n6iYjnoBRn#88=Fyhplx%%}{XKaHk_m1GsWb*o#CIY~ooAv(T9@M!~>mLyU zZN|ImzFRJ-J#`YDYnfmgdz@eLraqOC@q_UCaWyl0dV}tkn7Nm19@Xmag>F@V-`Z5tiA7QKja>+w{8BBi z_=*lrs@;aC10}UlENndIq3HEHzE5X&JnX?K`t$;OubRP|uhMdd5*QmGL-JY1zd8A@ zjX-zgk!qt9=^aFQP7n=IBJPHnCH0`?bI`)dlU8BsJ?)9!9TI1dnD9?iN3UNl+TE+B zl7qGlj`Dvu+rsIL`c@9^4G_I6Da9>BP{-23^=jC)AU#!_L#j+ncYBD|qmbWh`L{T% zUvG;d|M2+(5L3g{h!jcJrmAwsppJSec7%N%%f@S(zt?%~T2c!-UE&Vxmg zxzpe%AeA>l`Ri%VNKj-#yGYun1J3xu)rC zboDXf(NZZ_{C1;leNX2H_GiGG;ox}o+zMaV-Sr>|eN4LuY84Z5Ed!V)K}dB>fO{%0 z6fAt}hOVln^`Lv^m){wsU)}>ye(N!R#PVa)Xr1a1((>~n87)_d4d9lzxyA=h;+e^g z=!#WtL!Dh8`FFygr$Cq}OvjOpn%Yw!U}jSD_;4oMnt2g6G}^*-2V0h_N~ab5Y*j`xumM~c2% z36nhvbM!6G?2msgi#kh2N4Q0=%cnW$1oRJGu68AQ&Qc@}bS?O6Oine~w6YMX4Wzv> z#3nuzO?PlNJ3e1wzqU-+DBI5!vtGnEn({?){?`6T@nH3=hvLLnXoO>wrmlE9tP*>- zQqu3jV-LK+rX23Am}u&GBin>s3tbzKpABRcH(HISGWaQN7+B2 zdqc{iZpEcfO2iu)Dwc{}H4J;7N{4x2T!}2^A~WZL_B-gsFTcnW#?9ELyp-5}vWBJpF&$5lMzoEB5H zvjE6%*L1F?g)A6Aog2jdmD>^0srAo#A&#X*(oYDAN95i6e>8mqV_o0Vb(;o_-Pl%R zn~iPUI8DRGwr!_TW1Ba&jmAcU8#Yeg)8GGnzQI0wpFOi?X05ehO0~Z&LVA1PSv=V# zUtd3VSFEkf21?JCKNxG^0|_@dRua!+48nIjWWFy98ulxJ%dE6`7^sVFS6`?eIUJfG zlYw?a_#&bgT4nv??UTaM>!S&BRHrT^bs~QZw6+MKLu+m17cAB?y=FA17*K& zVK7rl!q=6J0)%g&VOh(jxXWCim+5Cqk`o7zwpFYfiP9G4HYKL?mc8-R>&Wa@aU`>~ zZ-E471o9^;O`c7JUy)l#FK7+(bf4c|(0^aifNgXw7m5m+V!|UCqYdQWxWr!XnBMaE zj!zbu>qQpf=#Y24p=b6&cCi(zxXAJ$1n5lkM!Ro(0}RUpQHrEhL3;mS{{`~xHhD#_ zTbM%;N#beQs*+#MjmBL{9W#Cw>}n+;dL`Zpd(dHW%C}xicN4zZZ9R@!MLKaZ++flP z9b;_x!-iOHtw+=NaDfy`DtbE;&O%eW^HcXnCAjo#e4fV}7YVSZVN<>fJ_7;G7q7Po z0r}}kTGUFX!o6RA>%!VK^#rE|vayzUY59Owd(oS!S&A0Z*l+$xpZOy$dqt1E>ISsF zitiRiC$_8li-<-WnYgc>@HbmqJ0f^L7ZW3wxB?MO+|^Kr*5F?ZVR_grcx<$`Vx=NK zotJQ?zc0q@u&3Pu|Go-`K!3L*bcYNdZz*1h-OpZV=Hd!d0oAnwBoFS_g?G|^);Imv zu(2vvXC0}o$Zb&ACo))p+zvSN2rs*=6}b8H$iS7#o%sOoS+ILAB`)tDdE!Bbeh(Gn zm>>2XwZoq+(x@vFqAqTz`KB`yUgNhjL4_8R)l3V&5n|sQ;3fraGm_0G=;VpSGjTso z3y)ik%p1<)&?~gp$J;fOC1x$B7NHcchK&AwK|7ooI_pP{HdM;r(BDn5&=MN)$;^9g z^j^WyEKGEs8skfx5tm zLm$P0TcuHA^jC3egR`IH>m?yUlC#4UlhUIuW+R$-$md484~H=^R}tv1zdU9mH)-l6 z5wz}g5I1lpd6X(FyWD;pkxc2{OA<>=NfPHDsBB(*s63ryrG{zyGthg!h+WBzqdYZL z7l!9-unO0LuAb<}#j)d;EfVv`GBW6%KF9(>`DdOy6S_at~dv( zKkydVEf9P}??LsRLg5|SYc4bwSK-Nw(j`rUrL|0(P@~7sDjKknZvR*aVj641+-ZL_ zk8THvL#WWJxE3^lQX82uUyd1vmM6o8Hcwe_LgPlb)(b`Pf(XH)>r2of1mig zB{64M_T!&)IVVE8b3&~t;R~+>t8k8t@M!~k{>1M5PFZACd@<2H0VxR9jr4Eve=*RD z|Mq6VsfC^^aeT1|kPuRmvld;>WI4l=UlU1haW-`Jh6*mHO*b4kM(j#oD=N*THKQAk zdVonzbE#>8;<)8&XV$x96sE7Pdp2-uOAj5%=Bd-f2`ntEttpre$CzMy9&7!JEh#Ez zD~`;$zKK+~7oEo)n5{@fj96%;ur-y-Zx0tG>|{f4VCHgWsASaD0Sp;-ukt2rL%m$`*td8d9kC#5E(>W^ z%bFAvEQs@dIx8s4$RaujvP(xEGK71tx>d2wO99o*GjmAt6Rd>ObegVXlxf-JpmeLG z3eT(PVSesnKMws@YaO$o_Xztk8|2r69RrybnM3a7ItSdQtme_sdK$ZDBh zOE&jauwGsuxOZVSuS*DVAZ9!M`ZY0!aO>!COtqmVL! ztbcmABE7(9{npJf38Lm{2a~HM26N|0WZM~4y&0mrOzuc1Qm(reYKa&U5q468dCNTf z(0N!eUnw+8{=B^a6>A@miUM9qk!+(R{*>Tzxzu-OIJMpV7`|Z?XfYXOqTP-P+_M#Y z37Kp9%gOh(_8)TX0`f7|kRsw`2CbudtW{)(j%c-ga8#n=uRJOVCj9IwX*n&CiM$N3 zZ98KkSVIrAFF!B~KbXPnl2HtOn%pstPN}TdLU2QGt~M`~I}s7`d0{Np4!oq@s{XuYh_fEFl zKLY67>A_#?|J}H0O(aW6r0H9<9`e(Ch1-=IP@T}k^1sqIq{8mOsp`9-B`x#CqD^3u zJw0V1`k>|nwbq0dj92l8@gR=O@;lse_9t<>-9axQ30qIeM+1*-4IYnY9TABu-97zv zz>@7z>Ef|QpZ0+LL>9GgUMt}|&P`FEd0b+Pvk10xR-)yXxSaKuzn?On)kN^<{|W|u z`s&>u=44F%!ZMU#ysg7f>TPZ`Hc4K80IR@+9TTTPi2~`bC(`S0 ztgT}dD+Sl*NWTNh9Jb?LkC~_ngpH|tNI{|2wYk>o@a|{;yEYOI!IOo~hQyhDr7$cLn>9foXMSEzW{6t_Ev;=wuA$1Pfu zeM^j~Uo)Z#R!~IG3hcK$5vkQ6ePuO;T@$+QWWwM34ROMz`7_y$Mu&uY_M;(f?fN%} z)E~P3e5+7ufvw3Y$gT#X`%&Vu(#VUoFSsKWJGO;6HLc!ERikhyJX%GwuzBk0V532@ zO4gRNa;@pAM8df|-8XSSV*Iuy>cC}AK&#K8Q}O?`psP%vYsQ`Zi(NYw@5l{1ASpQ2 z)muPY3)^&(+od`+!D_(TVDDQ}j#jL;`f7SKmt0tKm()6Re8O4?w90Phg}}WII)>?T zij?z~+pVG*MdkAE+%@l$>CH;7E7oERsLg>87ZZ{0^xc`p?=!dgO(gb;=Kg0v67{r$ zJ*azxOyqjkZiYZT3$--TyFDz|YOk1wYCo%HQ;Pf+Rt{X16eta^Uyyej9(W#}@05<7 z-DI+MJ_KkzO1F$#5={MVxm|*ldC4%X56pLgqAVZLtoT{vLT;T>l&K;qKF-N2G@h=d zl2z$}bC+bP>mGjMG$xJ`!Wco|KE9-~Qh(U(nxmmeAl1PiMFwe=XG{CT66$?JpT2fY z8D$@D@iU})GwLJG#yvy%QoGfy+Tg007yHauhl3TlH~&z+sZsaE&qZITKcdVa{UUFs zauaaH2P^SSD-2XP)#w^uVw0!-FO6_GE6DPecOu$4DP-jm2O{@8k4-1}a?N7bj=AeY zR?EIx)t-X1OQS?%mITy$6Kp|P#3m#CaH)rd1LmMpWamr+j=N75htQ@@NL$mT7PNfK zMcY0(zNk&5={S0<0xi100mg1BbQw|X6 zuLbG&N}?ZC?s|Q#X~yQu8ITH6I8kI@F6`K^a|kMzAqnm}%P1DY$PO$SJLdD^Y872R z@#;*gql01|y1y~kmE=skL?x^pt+t-dr? z+8>Lfa(ed&X`_!w9q1<;3n0{PeO#l;&J{8mCdfCq=i0>71iF1=LBs>L$PaI{ilu@? z1H|^^#*J6`>pYJ+Wcd0AjY`8C#&cHb<`sK7=Qt`B?g_uc{y++R!W*UZwT(<-cUrk# zW|(u-uA3BMojS|XK7dqR!qm-jx*p6Ket6sj_VDx#w;i@-NPONy9QbK+FcEbYXqIr! z`D|InM0>kE(f;LT$joOshrB+PT~6nK%v_)!mdtxT%*n3LkAKK%ZJ^>u-Zf%$W9}yn z5^%q(aAQfzadO7!G|k&nej7njPis_CIGXRvL64zWyt z2Nktymi?{5lBjC4^p1%VM@bFysO(74v$91QY3M0?X6*V}Y=sgwn_i_Y0{k z5*>T7^@n}7{9jFTyvIp&1lS0~OK5wleFlfS{wMh|<$|83wX-kfI2!C6j3082NYx!- znfSkBQ-U&9_Py&bQm_M)EqDo!q}656+k|E7?JW$Hj4O=miPWgnQ*A>DeVE3;^SdHn zP9;*fQ@|;xpn4`5Emr7hOzeT$8e3=@_D1_+p5P$gmM0J0SQ1DLZ_^%(+NxUv)xSvo zaqADOV3zTpC#cO1_S;G_U8cXF3sImT%Aq_S7mH|?Xe^D~S&7!DX(rY~KDhBVpw0cO zUy801*~4c>O@XF^?(6PkO#CEPvx4+3X~hC-g^OSkh=U)958SSFNr7ivbs$mA<4!{6 z26E^ylyd1hs&-<31czANF1To0g|&xumrO)|-RP-;am_gQR@Lg#idSR9Khf0{I@)rS zxU34AU#^R1kJSk}8vAAEI|&ZvSQ~30=4p8E#H0N9Bt9(lV*gZC{I^_@l&bv0*gRXc zLbP9J;NLf-r{hojkwKxJenOW2K88d3oIK0;%ZDM&mo1xjXH9zo%x#IyD5~#4bFi9H z+tZe5G!|I8$WcRb%}fmTw2NPWB^@WRQ+vVv*<4ti_mpbhb3E6D-RZ{hv=mUgG>;9j zwv-?wm|}S=dW53h42bO6MB)?&bcV)hS|^PP2_2X80RtTw8!Af9iuvRz%!sfMK?l~C zJJ>%pG&6AA$Bbj(EdY;wm+?l=!?>P(GnjNYkGbwBy#`RV{YaRP$F?kjE_>_vF|+(_ znoQpOdj*wP#f-vJyR((P#j-^Tjo!wX(t>w=F38>C4^$@* z!X9*T_;bBOb=}7vb?o^u(t82nT;_U&au?(c3sj~mBJ`?tHpqScs-Q-tc)ZgEvaSa= zvu!J6XeD>*`@-dnou;2K({h}j+o-LWVp3-+P?qABrD$rD{M&YcNLPn9G9Pvm5t2lq2lP(zS~|{)Y4KJ-r^BI zQ;fsXc*e1)hxan4X8@k%13t$aL-fn*KDPr4v~;|7_}^lD?z?!idDZh&N)pycU^w26yPk3vz_;1 zg3iteJ5i#zt)_kexy^pl1Ud$EI%Y%y1cRUcS_(7i49M;V7;mn$KBPIhcY_BTo}lT8 zV=b8gGSvVMoaao^kISrA9-Vt{+?w`;)y2eTx2pg=GuGtrdK+1oF*PxXc5BS~KUcET zCA6fBa@xkqxapiey@IAtD{d0lzD%dL`IKL=Yqh}a=@ zNV#;(WIGv{j!&3W1{uSNubUg^#MH&f>*N9A`9*9Hg{qJrOLqEb;yQa$iXe(d{rw=) zs{(6z^UWAkwS_H|E4am8P|H)KCd-!6sR?0)p88=YlkE!-15_K&>VkUXw9;QM-*@~$ z=F5y5mc>p6!g3Uh;KR4vxTS^_3wQR2DwJd}1Gnz}JLZ!y+gwi)!T?!C;ZdKCRxX9Z z_tsP$&_xWHMz}ajq)|J*uV|s|v=op_APlT7OC0Kaw^_e3!*kLjXOw;W>W)=T4mHrO zC<#d`qPDoD`R!gg>#OU6{DV5h1Cj^YGQ!hRAAOq3$p9mARki?6zh&H86Z|tOqG1Og zL(hJq)_^5SI~j;d|3Kjy7hg_=Xd(@Oel|#B?ot?8v2aeFgF`G1Ct~@Z)o>v^0;+j_H;I(XHU(v zXK#o6E@-*Y#$qeDG=$hWNTK3^*Ts@si>ZH+9*Ae#x?%bG=-XAfR{?E3r!O5^tMJI~ezd+jkY1{(S5OJhTmvm7{XVd^qR0680Z8DxQq*3*Y zFe#2}rLW4P?&EU;rg9x55J<%m-?zvWV(l%6~3ce{{>X~Y? zQbv98yUaN~!!Sb)Gsv-LUPApj)lCPN zxlUF;(J>$nNFs3G9Fgxg=x%#CpL+M!;B)}wA{O}msdwdcpu!m#89Rc*y@_rMB?|~C z3lbR<0ei1RDHUZJl1-ui;{sGtI(E7{jYSSklfw~+M%aYfcA~_Dr+va?UTfNAy9R4E zgKv7bX(oiAk7c#QkWYS-1T|oE*jn-w;$%6Wc~tB zZ9WduujDSs-nt&b4QO2?dqrQ3zFf`DRTyFgodw}g^tc8nG8p&zokhravywhlBmP>W?pld1rUuVJ7v=0 zsETfNJxyZy^hejXbTDm@GgIBC)$XW2%2pEep~ecV4JDV}sK)iO(!}mqAMF?nS=;vc z%mpYpf51@)FcVAB%^6DZV>QyL!h0mwwOz{;ZIqQ$*@EPO*Yn2J9VBt+Q}&SH%5|mBu=TD*jwA-#BclTsy`O zGnlu6ebQIFR8DK58cKA`$+FRGL!CmzD5DP8s(kTtOUn}?`Dk>c;qZHiu93lRJxUpt z%@CM#?q;k57Hp+*twbemg>JxthR1JzA@FD7)+4>8iq56+j?1%($kNSxQ%g9JmmB1@ zr&`m7e4WtsNeO93Oc2BfX3C*b_nEn5@evMs`WD=+W_t_Jbt0K(04SG>;xF<(2Lh$= z4=|%iGz!cQA9RCE{s3k=xG1xBHZ=t)q5qgw*?AsG&Fig_)j7bTsX6NULtCWQ;yrVF;3xV_NL-HrVjGvknk}&GwmOu|I){^S+XZ@3d zIZN$nwPr5c6W>H=)0Vc5cHMoeMq`{)9oh?jVQ+si`4ha4Z=7}+V|O26|UHXG~8O) zDoO4~&1S4-&ZM3(V?1s!!)>%To3nhgIl9TyGzDF3wxM#&`?rH&q^ziTC6F#^ zuW{2$-pz-BVJ(u8mf%;1IKjB>`U$f}GNqWtQ2QtCwmwbRJ_@6fMsKSm1UmrTj~S-S zoQ~8yp{C<;D1_6q%HY@v5%zq`oInNdQCZ^rX?^2xn`fv`jmnY9!^V$cEGDsCM$N~3 z(vPTs#(g?5P_j)2sH<%CE6Y49t*~Q$IBjZeu1YVi%~(AIixib^Bt%`#`Ma|ABCZ^} zRpgc&xc96?GN8>}Pujs9AIAwYL@>iQYHi%wK;3J0N zUaMWR97f%B;VCQfPlkjQZw(jEDdic>@(PRu$LErk14e_DbB z?)6LvS1VhKn#l`_tS6-pO#bwn8pvbvPPu|#nUwa&p&~{u27(^fa3{0qfWCCtWZv~N zXQEGh`PCdG9cQ51_?0GaK}H=83#9#lVCnA-`rEUUWj_HS2jN1lzn3(|XZQ#V5n*W+ zJP*OQ-U0>E63rJ~H7`D4ZCSJ)!gOV~HA~BTECWWEL_A&|@IdHd%*+EF5#_{)fp(aD zicI_AtBP?*@n&qLWin(>Uhp9nTZ>&kFS^ZKn@#I!n=sPLk~mBElPGPrl2i~OqSb{p z<31YID%icHlLY-MKujH#OWaXOWFH!(Y%buMqUw7xPpFo{&ErounMSGGx}3Gq(pxO3 z_{!IFN4Yrwi~&0g1J%S$PL)vwCVbuFs)a>Sxzw55*{+ga_++G$KaL%!cGUfrEIhR$ z#HpRT?}BTz~r*?7>@8OrIi77F_V(Q;~t><>mu za2_}2vV161>f}Yim7!G^xbFp8Q{#FNQwgqtq17TLS(=Vd(b4qm#vEZiA3Av>qh`wM z^u%Y<@11JlfAr`1PW^HbHcidW;c?c%ZLfby-g zzyvorig6q)C-CX1JucP_xr$hz%}e>;StP1t0YnTErl1G$UqB( zXRX|=4-S#zuRdq5J7`uN=)YDklpWEghF*dYVF!MCrZ@ux-EngH$}9Jeioi4NPFcoP z#d-PMc?+kPwx~IKUy58p4u^gkMXY`bfuGHE+S3$EDH0a?8>DuJ0kij(chraQ3!~E> z(cSd=mE{W3ktVsYQ{Y*r*^gN;FyuY@%1@Ctcp1;TG+Y?msO=|KDAE{@1jIbSxTaH(_EUr!RNUBWCxJPGvgCNVU6hT9DRH-WBuiQheKb( zF_U?W`}e}oHZ+?{!Phal5MY*xfr0w|--?OfnX$giN3Br!@kTmzdODp-X++>mKIah? z94R>5^$r}DqrPT|AA8wyWZq4uEV>6N=4?A9z2o{tjpu!hQJnpj8m_eo{w*uN%7f$p0X-GbBhqzYz1Oi&_#TXp&OUZ_ZH2prbpFm5E&K-t$V82YrfVk{S`9?bAU1PR3wug8J~gHa zj=VUp+}p=GPrdlIIf(SVG09zdg_woIqy&Z+3v@9izyu!=CKb{z03Y!?z;|2M>LrM~ z&IDD^Hb)C;gy4JINtzO$j`l zM00{k{E7)kOKE0nC|`z`Zv{C1N<#FHsA@yF4f@F(LsuRR*%j75ZP5TlAfel{x)dnR zk1)b}(#EKT=&!UUwwV@hx!17=1(K42yd8})AaQqEkTg(u{hd~}o}BM#u2Z{2Dks(^ zRdAG#G-xJdVaC4jyOcXQ{CgW$N&*gTdBSh|Jr6|K8>g22Lnj6+21lXmPuO$3s;7rv zt174iS(#JKSr=)nSBrq^sYx^~@Vc?O#Q$I*)kSwjjo=zXMp}UDA2f6~n?WT@sQBqy z`5oD!=j7eW$-qEGxfRZ2M^)&|Dc4hV)ajN*YuAe8-}^AjJD72kh*G!_1m~n?DXHpZ zzP-Ak$!`UeAIykhg42$%(V-QoRLT}-X0R6)@CE2AjUVe)2h}`)xKFHi$x1e1?pKelj zl#ch0VUz!H-?vtVL_mBhNF12$hCi;%H2-?JE)14X(6RG%%fT7s9Lwy6=009mvfXyZ z&2^=}0Ug+Wp`^^A|F@+pY!U-dPviuA|3E&92K3cROmHCf+AW?-<@2ePfy`> zw}|pQRz!dP3P-d~_OW5;J--BZmNl~07b;AzNlo49^gjNpKkp1D=r_O)QU6W06}5=`|Y-~QRf&z<$( zbnx2WNDCyfZ6j>ZugEo`5KPsb&lSXWqy7^^VZVFLOPsvaFntTMey_Ec?wk-)ST5XJ zxO+v62o#|Pm~i29P!D|?*>LyXNkBT-B67k#hr|o< zAaXex#K-!Ho!&fAe>XGvi6oYa0MQ&V4$u~rR{v;5^6PwHKPr5AAo}k*WT0FNJAYz) zgoMM}Ih&PQi(2X@eDu-tao4e=Yjes11L%1*vv*f_n+lY@7ZOESQ(#KV?q(ejXqxBU z(XJck2=;D)ja&FkUx{9gZjt6f1RZ`{@EerBc)2;E5LpzFxK&?UHW|OjHLIn86W9zN z`awVTJx0=+)yr9$`6d-*Io!YGMi2XxU!+b`g&6-);tvME!ugJlS5ZD09~%{$kJoO= zFODRffxCG-`{Idu9^{I(zD0(&Ui4w8Qa_!XTwSwv+}Nq(gXx=`m`u8R1?^WE=k?0_ z9wnaS_CP77O`Z(KQ1q*7sIJG_!!&d33Dr3F=MQ`7eTm^XawqiUBXZIQ?pL5;w$Z%s z$?pLLknBFcGD^*z2ZxON1U#*>q5>IpA7u<6*I9}E!)TEvqRPi#(knwG+GFia4254i z$|X51Hw^?O*lStXiS*w%1}A6VyLN2_Eh(PE{=g}$iDHA&1xd#CCMaR9+2xq(J_rd+f|hJQcZG37)3C4?`+QDq%F9Jf#y$oU>(k z^8UpoVZQmp{jcO&#oJpHAPOA+cT0C8{C(5C6t+>P{nvEPo=Zq<=ot(T*sdjT@A=8v zy8_1Vb6LRn`H$!5na}5zrkg3*RWOlIca__0(|lA2=&JEAUQ*92toQ3|*W>|CPY|7Q zcze>Cfe_Bd>c~vBu?y(|YI< zBMahFr|{(2kP^u#vs)6u{sC0^z0@w1z*eyxc1JJtz*Xb3Q&oG}aJley3MhfaR0Z zUP`A7sD48+5Ak zA(6`{j7av(Eci;>#Ajk&OJSSKK#7k=g(umHT0y3i>tVJ0qEsDYF^(`G33ckB*G}D} ziOk6q9%aS&2ZBMBFX@DFLZLJ}o~~vLXyJIn%VT9a$WHsg`xTa;`}bv@2Z7nmQS=P} zHHgfa0o)lD94x{5A2R66Bl-TsN>jj@nHFEd)*rQ8p1CCnw(7>t+nZ+Ts%ODdFeW)G zxG6_%;xr@&g_&WM(a9uhsEbRG(WR$C#R^FdP2g#LL{PS0P_AIOgwW%|<_ac~M-tay zHAKUORR^Dr+NIUw)}Q5}UKxObzRP*T9()5}63YhxVP9B?ONE|}=0DB( zzrg1GK9A%!2u0&>l$OS~4+^W&4P$Lkg|0yP)Yu+Y&E5Af(R1t>IMfn$EO;u>`${Ac zG#93wkHaL?!&=h8b}dk79RN(?FLM~^oy9!dlJ_*M9}*U443iU-;xsruqkc2c@);vH zl2v@uZx^2Bf^i+59$@%M7I#-Kk7ZDjUFI7>N_A?3i!+ed*;t;V$M8>X`7g9}p-DhX z#`x{?D;U|lBeD1IM5&#Jvf_+YY(^`bYg$C}+z?&v7`(HGt)6z9d479WwL#5a%0v-Y zZi6kY?lFeTFaIVvFw_h$x<@7Jv|xpR)fvz(Yo&#jk`QMT`b|eBnCFlv%yI`+vjaL{ zM39JFBJ=)<@h;&g07+|D0dt-WvPPar`(9R$Qu5RaL)Z?PzjJ)(Lqo@6 zqBd+a#7QBeZaRHbe9_g=(jT>0Srlu8!u**LQ$a$_0wT`;d#9*gtS>{HPJ1Og+fwf$Bl_L4Q z^=V|}W>;l)sSQFrzNC#lV=MpXeBM~TJ@#p_*+EWP+U9>7raXfxj9xAL+aZM!cn09D zaVc&+%+PRD8VB<)aKR!c#{v}s&6H9=`q_EeWZN5Yh7jRat!FxxvaH3+pVd_~EU zHT2%R;_4OGc4#3?E&*spcO08N=~ztlsG2ThfOfus@V|;8Bnaw#J+|td7(JOE=T>*r zNP4j*w{JmAQm)&FvvyPc7b_F*HUK687F_%)@8K?9GAOm7VwpUZo;-Xc6U%Mo7~e-=R9rs z&+yO6t3b{}OgQX;ylm}qD7lv3zTBY3#PU=iiv4d<>pOP26~NrPejuK+Sa7Sm0yNu) z&jH!c47W4dJ$ykLvWy&kL&==>obh^c+;g!tqQXj|B@|b08~y06#c1y_P*M59Df$eQ zJ2teXWup3%@z))J17;pmAtUKj`lsLDHv5n>*35O=CdO-aGv-yhPe)qtUS;Rv;Q{tr zqU7{w=>)$9iH&Bh`*dyvjOJ)|8k$kZ35?w> zjJUGH&ep%={Rzu2&vkr9ijQjd;| zotVPQ7f7}%l!GfOJ`8fPx0f-F8xt7s5X{SE^_*r zc1^*}f{%nwrt}~k%D~6`=;e9H!DLw;(ZTv+6XpC@w1@&Hvcwv7=NG`FIa+{0(;w9icL#>(gjx-G57qPEQ^@`4+mrD?Y(2xAcS*?+UNda@P-7uXYIJc)+#!CBY9Sx=AyKSpC0M%1K#t!n~I z3%V;SwO)ENVC0OXNj)4j$5g>cuuCIHKg9@l!9`;aqc2ftJqtH;=@rC5XCObkzL147 zoN9%#BHCbXOk3S|4`1{13VXYSf~1MuBn>K1BP8j_3s>n&tqtaeD+yC)h-atKycw}%h!#~}D1vyV zf1QcJr#hKQ+fm+h9Oj0PhIqD;>fQ1%G!yQ^U+p|ndz?GKzV6d7L4O&2)b|N5C+y)p zDr@~Gs9*-sE{RYN@34YMl+bg$`^JZmGBte)4&3WpE-mndAzf=J690@q1pgZ;)P178 zbgv_@Pxj`G{ri)gpfIp3=J(-B*hgdFN$V?4T~B^h@Q8(W4Yo~Yv^K8Q125A|p38z`_a(B=F!b0?gqqLb(_B)Wj4<$2r?SLF20~uF02vi0tCXKQ z?;JSC`1%6sqQmsI^Zlx>@-Io83DjkWz28A*WQC?4O(Yc$z1aL}>jT^>L{Ntz2GD=y zV+4t{oH$&^r^*+;#1?S%E66ZckWA^pRrWJFy$NW}pk+`-t224onBM-umInzD#}R>3V_UsX4%4=x?lN|aLQ6|C&ChkZj?=pFAoDGhTX{b_ z*@XyZ^%Ebab>=pR{xj7;Uzzswy^i>%&snnysB!mJtj)zyZ7p?Sk1-87fHY24vF-1}E-h-(Ap zFJ!Ij4sD-mOf;G;xq`}<&zrp1Xqa|&5gqwGUxOo*L(}4lBrJ3=#_QFp9fTZ5wRFrN z7r4nOSv_u0^3%iVU|#XpYb2tt(apc@@7>zpIh(1Y1vxe{a#L%oAO7zGj)i(xN=r*8 zqtxRGoeux$>t(FIY?_bcR;&&dq@f5$4t$qt+IzKrtW<8XvVdq4TJWB=S>kRCjdyOi zfz~ZYr-gi6H^VNA^G|yr!>>@@sXmfnR+9aRTrYvxX)Nb7uh!G})pgOmr#oY`H8^`; zp`gE4n4TACOoNgJRRFUwM`1ZB-Dq|*ura`aDn|+UeNz4d%oz7j2>Q||Ku#Sv^~S0I zO}o8YHFUS$&8&RKOW{w|G=9IwcAaV}Wu;ZK5mwB`rC@PKgMs@MJH=>{`}9V#JUVaJsxl~skbkwf5b80EWyFl|9e2h*N+LFBjUhc)NCveBO(6I z2`gnG-&hV>`2v6$zJIlu*siDu!$>j-`uP@TYy^%D(i(nVnO=c=L@87RH&Dd%n!QT` z#_#kLTfoq2+E!%wcw4Io$U)xY@R-HfS~AV579%@2xq0ezj>=K?d=5br7vhii3J z^pCW8Z6>KBt?>0nyh4?0ctiG6JH8LWKfi~&o_<4PTCM!y*mSIObDsaNpF?(4`~R0C zTE4XGO2YvEe_Vj)o`qPgEIOSZ(l{DCHVY&X?hdp(47OSlm1xDbz)tB-a`8=~aA?F~ z)%3A0<1#m#%koS0fFs!Y`Lwd=1<5r>!4HNabS80Gq9p#O^Pe96jQQcFY*s^Z_(uriJz$AC`tWcPDIAE`0s9w%h~DX7M= z=B!USGNL+cecNwE@><5&ol}BzeG5Otx!bv!ZAGqSsNG3)Ru*$LOuz$C%0sF7uFRgV z;VsN09A5ELRRsw^3T=fOARGJC`1p8tr2nGQm1W*LOM5$p!p@F@zZ0#E0vbqO%E5Rc zAGPnW<4G>neA7;OFTa8$z^e(ni;_Qc)CdfNNyAG)a?*#i4*Ludhi=&0)g1-CQD-rX z^}|-foavi=Q`2O3Q~c)-+Z&z{cBQxZZ?4-Z$_uy;Po?Sf2egjpdT0gD;NI zt)lw1UrP}5RDt_1;PJmDm6EasKvB?7u4iD@M5)-k=4aQ0A-rQZwIwbhqgX}mBVBD7 z|H*dkn!U9+r(25s3u&1Qr1RdVdN(CL(mhsb;UaC;H^d#g5ht*;esFObU$fu2LqVpZ z$Kik%Bf@gB`YUdikoev;u7Ovu#iV%W?(91aLU86lh{rK+{c>b3gPvM4@N@4*NezwRWF+^%_Z540JD3*l+FPOPpre zKLNjts(_O)h826^JP7j4w?{)&A+?RWI`+DqW0#e7gc6moYFhNGC&#IOy_co`L0>pH z?5hUB*5VJ-&dT>tjm=gtnfaP#*TK#rxyvMbucRMY8Z2rBf&3N$v_UBh$17r(3u3W! z4gvSBeb=i)_6Y4$wyDXvM~k~$POi8)z!{i0YX?I{Rdt`i1x=Dx+?kx967Z7MOaHOn z^Yk6c);;8?JmiUDU)1is^!eQ6yK;h_1^n7ZSg;gPIh24ivO4f*F%$kTB;k%6>_65j zz+Fs8_20~*w7l{rN9U#-q_IV4sTf9cnXzY24At5)tn#!~x#e*!tXQHm&}1RmBgK+I0NA_2kGTq>Pa7~4Q(vWFSv@Y z5S`Is6T%+Yfv7)_dIN&$-1Y8?ApCKQbav(hQ==(ss#Yyk=HN$Y(hWnPt(}~3J+MJ{ zD!>^3^@|zxGb`T?nFjCDxO3Xic~+^KxcrUmpGUFz%Yq9Pca!aIGkvkAKNYzw7J+66 zd)50G*CO|`wtunO=f8O5Q1emDy*cV+BGkmo@=^45{TK1G5k9#qk9phU+!viCcFpaH zhwnfyg?q=H3u(MZ@he>W=72$wwdTxpQr1Aim!<{3Vv$5XTGh_6kC&2;&FbwW&i#MFX8{&ITd;_3`?e&_N)sN>PYP>E{+E>&n|L%sqg@0t}(c zaS}e08>&w#m(l&&!^WVF-7|UhlI-lIe>C|KCXfZ%Bt)1xA@bX))4vA&1ixKljaPOh z<|=gOxCr4MZ8-@{e5O&!a65m3W>&{6S8rT`WqSAcUbhjFdk$E3)ilDQBx}oVg0MjV zU~&8pArxRuaDOglgB&h|+PCqPdaJh6>cH~~rJ9E@)FuOQJc{kwjGc0KaUt{S&7d+t zOvY)I(X46RXQ~#8tt(?>3*1iLpy!7|&k?>q&8JLKt63>=^y{C|}?m!!0ZuGwV9uUXikb`pt* zV{9aK#{z3&jlym79Vh}uV(idbLUwXPrp_3}iVr`+(^SVV7``d(k?}zB+MM}avM5bm zY406^t1dw$E|uZyt~1$n5b8{auEdLe(qP_tmdEe!kNR14hmcX;{Qg{UNG0BaF`tF^ zCVtk}S65%;5Kke|MI_cePqG-D;rOxH^uL+(_;;`Pzc;PxTDlB-tp$BR#EnYPtPduN z9F~>y&`Q<>$s|*$)dR0-L=-eqQpJX5bDEeY_yz4$1!RwywxsT`;T}qtENTQ>ss}8xJ_JkfMq6Iv}kPFKP``t%Dw~ zZCI?1svg@%ruMi8sG8X+1%&ogf1M8Fw;cMkauyrF5Y9{PT>8ngrj7emp?3b^OJYcm z!0MnyZ^$4QL@S@vJk;(Td-RSTwZ2@K-7z~CLwxw**zN`{`m9ELC~gjBAu{VNsgw%c z#J&6C8wMC~jYqabW3>{V!K(nlAnB~&vTp~ggj=*ERC|tYe%85TL!!vqN-04fknA5C zSJVX0-K9{Q? znzN5yg>uMra$QShlYVr8ZVqUsis3}KY4=o;m>=kolrT;3662QWI4wEg9;8InjdJ{KaYZXOE4@7mX*V`tPk*nx1De(UEc3jHZ|*t5UVVowK& zoNYD!uI?1`|7d#4fT+6fZ5X7H?jAZMMM^{v7(hT$sewUSx^B9gp&OJE1~BLr2`TCB z?(UKh5Z=x2{XgH&IXhNf*IIj@F$m4MyP%tq_?oG#_KTbMWhOb^>p4#MT(~zw>Npvk z6f)cFIyGOo>{uYJ(I)7Xt88}bDrj1ZQp6)-9&L=s##P3kv5Qe(*amCh^9H*`e#_yP zhdW_D|JeT9;^dM)a8a--uE0+hGkKu)f;f)w=E|M3XTlE0q6O#noI$uMHt?ZPp8cM(hkCR z3Uw@LEy;O5)`y+Wi()b(xm&^RuoMt3nO?yms#D?Q9N&0thiNuKGmd|mM+MQ)y_RoO zyZ?9fxJclul-TaS>>{PNh<72XebQ$arY=X6>bD7Y?;PHZ#c;~H=l&_{%{=#1pljd0 z_uEzTN(^AH3Fq#*k)Zs`UNh=8X`|r7t5rd412$#2TSZj{Y$Yi!q2ch1u=V#TBX zLr23g)Z*^s?dxd0;fuYT)bKM$>o_NIc`J2ubxNgWA$CgW600VmYQBIF{1uoI?0IRA zKev@~Ij#C(K$nSt6l$1x_vHRPzkuxkT0xG&Q*9)bF;%X<;0i5fB+MAKuPDNjnW_%) z?K67GYo!n33=*PHz3(o0S0=QVVRuk}pbM@xYx`K@HFCDw4g;ik*OK-bEq(GKwf>0q zIlJl~qDJq_S_>(1^=FsOYo(8(m;#@unZ_C)IbBO-y8P^}SmM$VqoKaSq^sYhO%Rr6 zNv4eT{(Y3DeWb|xAK9wQFK~8+IGx*q$hc%m{+EqD0w14!uA5Xt3X_ldTGt^v^#~I& zk0PIJQ)ohy9lF(S7m!pZiN zMk%~xf7-gdBTkRHXik0(%}xnf`|B)L_B+Md8LZt=hhe<*8J&g(rG^xL`+*cbz8srZ zB#X4iei6MgZ6V&=H!M7jv1m%HL8yiaWxe!LBr7P=t02uGlIJXv^iQiL3EHG-7r7?bV8YH_B6K-20|F4Ii|9-4H|t2rSfN?c|2R28V~Q%7Rn?=GFzA@*Ggt%Sy1 ziuEhrKR^FAtkz!~eks9nof20C6RJBsUaK(T_c1~T+N+9H+_x(jg|5i86+Jr&>A zdO@2hu^Siv)yHwTb<6Mbuh~us?hl@lZr8%?k_$O$pF_&%RUdu-3OcAj>SMbR9 z)PB9?9xAX(6-ds)sbq>zPrm3*%*%1NOv;H;U1e<} zH`h=>{@a7$rxs#V!*&ka3}u-v__{SD$)s2%Vd4MQL^9LLj1S%lTXs_ay(wlV_KdU9 zMT^}^O><^%NJ`7*kchK1)TBDC_tO;Q%)(-`#m9qf->f;#*d$mvJ(_zwy3*s<18uU* zeaC5JK8qy})rkT^Qv6nYlXG;nQP>7UNRPTKu9wVHOahu;cHsr<#2JL8R2yz zOhrt_$K}yulKP$7cK7LIqR0irrQ*^9V`6CWl~qw<3iYO5OkYw|rmKuHUIGASGmr)l>C?bc>Y&Gj4;o#@UvGHFKWPlbswjfHXVD0GrZ4^ z+rlY=+}|e!>d9Vs#Qfy2-?j<6ossl=>}s8@&AAc$d@+ObX0oD@NPc!;`1M?OMi@a+ z%V0V5@q=(sxl$I`2KNmZkvmZr{%Jo9RhjCjh^m1w3 z)t8(`zW*RL(3d@dky~{5R8+_}J2gBdxOqABPY*Zm-qthi`V_PJm+9N4+4-a}Dw29t z`WfAgoa%8if1Ms2Bdn+5a-^l^jLCoDmBSJT!7Rug6Cex$4ZJCQ;yTo7Mj0-RouTIr zXQ$n7?L`iidZ){1H3idtJndlfDd45A(~hkm5g8LX&05p4oSIT^`iZL|b&jL(Z{g*X zw$tyu(>v;G+Jry;0uEf3i!VP|*&TA&Ev|`qu6WDlmYJ@{%hLXJf{AEa=(;AlY&Yr% zjXcHIg`pN$L8ypT2+%0Ol~QDn_ygt!g0!Eij-Ha0TF2PTlP6Xgz8Jj0wdN^_eJ+c%F~n9BD(6c zb!O#H>4Gp%ohiPATr?Z6Xr=kqlfbC8HIaRtGUJVFrAhg_;x$@w^_!S8cPY2$s{uoK zUUrLYmVceZ^=-DF;{Uy)y5iy+ok>Uy%k0WS_oB-$GPLjM%(XMBQGeagC+I;uz=X+% ze4gh;uBsZ~HYZ2YIlU@(l^9bM_hjhi&;5_*O~m~9Hw|R=$t=YR`1=c1Yuk$W6OfrO zkaj6xlsR46#az?i;Y#v19_Gia1$<%sDy5Q`LKxO0a`ZFy`#lwAWBzb+NwidjOPJv? z%&Os=hj?tCh|pUFFg~RC*8(8x9sm<+OS+6;3jUs7q*rhwCRh}K%wauD$prECu>BzJ#BH#lc&pB&O|cO_@Du3Pm1gl2ZIwx z&EO@|;vQ{-`WI=Jz6vRm8+rp?e0Z_nbQ<$jLp@(FMHiN+3;NPQ4s#}KSsE))ZT`c! zhzt!f>|T0#{9CMS;QVB3=@<-+!~E&1aG_86{gQ(3B2yXl$DJ)B;iNC6@vP+wj9E(? zv+}@2#s7sjrm>{^-ZHVJ+i41JzmR++8p6=Y$<JVx%&FMch$i2$;GDwjdo`6RayoO%C!)-p{*VJ!aoHhOLXWdhF!-Sw6+XwO(eY{mZF$VIu^RoFU9N;YnLy?roqL{adxdwE-7sIZ$C($FR9{r zmbql7LJESTKHHr6F+3aQO-zMJb4~kw#N@YPIigUx3d^od*b)x540}+jSk~xe7oQN2 zS;ZPx4cw4xnwCCc+A5s#yuAI>-1TipbbLP_)>IaR@Q;M$ePg#~S=vcB%Wclcow zHzJS^{!?Nq%4XTxi7$JwgReSrgnOF2J~Tlx%!fmIT$xpKyqWq1f*dj|DOEnEhmrK* zMOdJLHU3fjYqX8N?b7&1apTEnRn-yJ4AnQtH#`o{;wZsEq(ypPus3%R8l$sfUi+(8 zIT5Ee`kZ#jxf$0{%_~9qIAO_zVRs0Tqa=GF=Sjbp0v;plTo^AkIlCnH8D+kjrI zj^OV6dhhp@ScUjuJkFUaaDiJboKxy|qzueoZOkpZNiNS%E&H;sDk#aFaGGu(D^cWB zw20XH?&*cS`|$MqtBnoUj}y!;RhR01x-&+xT2gu)iSks&L`;fvjcOhqr+S@mUbb{1 zy%Sv1ac06m^A;{WPAZxwnM-m)FM;Ohs2yVDF)HcQr;P^QDZ| z$(Ex?=EQf$cOPj)5SJ21DO)v<-GcdkTIV6vBj|)K9=Xuic}$6pikw13C%c&x`>^tg z2X4wwTQ&I3j?RlwR9v3pM#%J>d*3tw^o9f9y5mD~chJ5>7UeSIz?e)#Uojy@wRk5d zh9ac{t#nDF6qB(w|N3~oZ+Mk;n&0m@hbSiz8u8d~`(D=8pe?Jn>8{uQLzunE7v}VF zU`+D^{tp_8V)l`zrxFxAug3Nhu)K{kMW(RZ(E|(exPy~~V{eRcQNZlj92Fi9+e1udMpn6DU8W2wT3N6g#RyQF%6~xjk?Mn=*N) zMS1Q^Nw_Os=)Y!uWe4d|l#P}s$XWA&hc!`RqMt?;yAAxcW*zvkcw3rC+H%2C$3_~S z8d0eI8d#rY5Lh8QN7mPkP)Biaic=$D(q#Rl(#^#nCI@#>NW zpP}vXc+PgkT^qE=ewQleCHkxR5hL`#IhqyWL=~+&L9;1g9+;<1$Zy(7GeXvl*2*bg zK-w;14s>NmNS*H?zx{n|5x>1^wuj(}51}WFr9|?;bHDhiC&$hAmjP7xB`P?W!%}FL z^H()SgLarP?Pv6|Mq|rN?d7#p)@<`pG@lRgZj&&lMI+$|!Qs21AItui)zj;!#ze-v zO3SlPXKN#z%VH$9+=<~tz|JwcC3t6i_QS9nBypXB@C`q1Cgq}u>W~&=xb92sBlY3I zKWkDk_{ZupPs^%graU*roF-VC&+zK9f8P)fl(S0r;HxLU?3N=9v}zf5)x}tRMv_JA z?|~Rp*tGgzW7; z^*Jnz4~BBe_!Qv<@;CIUKvA_ z@+~%x9;@q|M%&&l_Z>Gf2fr>V`?q2CU2JgQuXNYcKD;W*e=l#ZhaYX%Buq64z|T*W z*=gh+bBD^nEV{dJpe(>f@V}0pwxX!cDbH=%f7?g4J?XQ&FzUqk(Ph<6yEjAJj1RsmH{r$Wh!of z!y^5n-Fkv-6lp#4&BJa7*=YiRr;#J6MluFXT@c+6KT)bM%n~GNER+k4+*qjt_vOc6 zM(<6jFB%Tab`v%%i4_&wYN{~SrJo`j2VTqnyHhlcU>f)lBoTneGL95mnA&))AS90N7{^Gd@{04X}WbJJKU`bbMM*$s7LjU zYKf=psAu}COh4ZC$&Spg)ID;K{yZWq`m(`9$oh{+KKbCl*%qz7v^~{xV@y&6sRwwp zWVnFI4BkE_b|wn;nvmtmR`B3Ep+J3$kW}}OH3fpq31O-X;pw7+l^9|6r;egSM_<*} zajH00I2^vUeJuKrr$iC4nISaE`NB^;W3)oWBQ@~#)aWkJq34%^E?Om+^%HK$pC%ql zD?dcy>f7hy;S zS3XjNy9gS@WqDqv_+i59Oh-G;El%myc$II8*mM?R1RRo*oEABT z_98ap`;Sgpwl#uUMu}%DoBLi>Oz8$&?g%)JjB30hfo{9Kgc>3e0hrluJ`8L-_ z%}R$)+aRH;?`#^W_Mxh?{Qml{(Ud|1Z4Oz-w1i) z)~MOF6;4|Tcn{`ip9b@cJ(=W8vagWb$??j@q=PG^+?_+C%LU9ov~#*UDbxgXnbDayVX8dd zC>ehkYMox-Weab6WR|gw1SMi+8so9JXyCpXS7xsdi>+D2Za0^T8VNF8M#`~Eb7y^> zI3cPtu19uUJEi0HXziJYT934@+_4D7(v;iVw=L=_&UI57>Yj=#{1>j#?4J;AZSS;- z{Ndoa$bD4ES|_OJ5-Id;7LNtJHlp6HO;CvJF-V0TM+ZhxBvyM8nq1k(*LqFmQSC(* z!GzHAD>~1ugRF;tkG#cF{SUu$Qe0_|e7o~`vs`#dEzem=A1m76w+S9RD-J135gJ*_ zkuDO9zQ^SZomRA-U4lk5dZMz2-@k;mx5zzKP+c?(=*CgUHc2kfAFYmy*shi->o2#& zwET(nkdTkT!hdSWI@MsSKq_a2RrO|bJT;?O9cGpy6iYldxR@FXO_|gGJ7pA#tRV3p z1uW;TfD8VH6@+$#^{L|sGTsxG3u)VXJ&bG2jtk&9*$8KSY6^AfZ}>R)|8ABD%w~_% zPRls8q`Lq3r}wFJflXhdwR84iOprU^PV*>64W2)##E+SkO3`W=U-R*IX9pvtNY$(T%uVqp&E1!3vArlC_V>F#(2 zLPNX$7Jrjb`s+=ZmGLrP ztBvAU!cSOZl+O<)V1;Fwk7e}CC6W*H%S~+tr$Q;zmB=> z;$vwnqNcnR@sT1hnL4!w{f7%=Z-ps)!K!WMSM2V9ur3?-KR(D+%&+9u$3q+pp=u;r z*(qNYZ?o`WS?Rw~Y>;dmgz9-zUYRYpYqpk^=0>3lcvcKR3=#<^`F^s>UN<*L-U;581hLQ$iIX{Af|omA9=;=k}H!!H*y-=0rAQ9qZ=8Rvk|{JFWg z_a%uDKK-R|Z}U?|Ug))SkPcBUMdz^{+5r-Oj5FsQ=dm>R03jw{I+oQiu4zatVcFhS z{HG!yS%Ky=PNiE2?h5{k7G`==+LbNJ-$mle+)KFT(c|6&qOt zp>$;|%$|NGeUb+P@?R~HcGR4^G;c8Z)3Jag#@`-no3 zuPmv7ISd{lKXuaTq-%{5wO`7FsG^_~+fpZX>yyANH0A1G?>IXcU<IM~QH(%F6$qU}1zWGjE*08(AjEqXeDl-mA5tApfh!Lh63;0exy4>+uB>g#<^M52M zgJaJ1lGQGJ3W=D!wIOV~z-4A^P^FZ|xQ)r>%>_39immKFdXnC_KvfTOvF_kLT3%QD z2M5fF3XDmk{GUM968T5sHYCQ~$^KaTdRDEStfZFMNY5l5YzqernOu7~DZTN%F_wbDUb#r& zFvWA1m@3F#sGeTv)_agn)ki-!gt{={4(Cx7hy~I^9hE6|QzMj6IaP0_5#Y<|??yAe zP7H2ZO^B&QZTkSwq#YEwgWT}+@Yy0Vf0=z@3@>dA4!;Tha6OCq@2rbDQX;q9Wi&|m zMAmX6su?npm?U!QMU_Y5$(hbn&-S?V`+t6vDwJrHDxv#hxXkGEkYAKJ$>09qkg0`0 zDOqELCzWu?xnFzB@!S$l{M0#7br;^(->HurE(myS0k1ar_D|e!v_AglBvgo)++AC_OLN%Hvbq)wJ)8wq@Q& zFm>X=A%^9){Khq&QW)Jvj$5syuYhX_ zMxE7}>)*l1@1(Ov-CsfRvq2&$zDcm-=2mQ zRw&(F*Hd2%9nt(y?BWtEn3%E4U9GLqI4(Dg9W|Z|4K4f2nod8eE6Z>tkJF~EV3cvJ zl4ZBPa|--LfyS%-@NGBWZ$g$GhSNE`Bzm=bc@jXVPgkzGk9g8#6s|Gk{ zwj>S|jY)Dc!yG*y0T)&nXt%Cb!0EcH65g2R0{Qa-HK++w1W8bPfWj>jOfga%Zy%N* z!$n{m_B03y!Xpw%KK(n2Jx;V$NJCR{8^f}uv6^>Je9MY>BxTznw`6<6Lg|8`N;K(|SS1c@W;*qY!>m(2hlNbsAGmnlQ zyI8&&xSWPg&CF;6$4^YQI=3Canq4$oQW!)flgV9J!(@C6b%> z`DTtzLFEV1^upy7ZjMzHxt6B{F_sKHXr}zX<*C|J{=#c<-ty<@ayt4`Wv!aB4 zW3z-iB{Jz@Z&)03Gt|JSk*sWT^l80*~WZT6=U)>lvWN>M1DBN3_}^!&0{7^ zV!<)QeDF#(JH7==z+9t?mlF<*k3evFyAsG|E5-*H|!47BWU5%sW<@ns$4r}0oQ35Q`S<40(UYk8s)~9clF4P7pNrsZ~Cz8QVB^$ z44xO&+<-0tLA5@q!?ykEa(pb>4s1DDr)-LmN6KW8e%RcRD;b!#$cW)#BVfN99W8R6 z-G+`|_gI`|r!|6@Gr%Spys%lC4487?BS>t=EG4g>u4GA$4pDiENDT);F;M`1g3F7x zfW(oVQr~RuQKJPqBVA5b1jUI}CaAM!`2YC%eh_6-zOfHER7Km9 zCgo3&O;!ODUYUt5*<6 z>Fd3N$I7c4_hLAf_G$zf6+@#_jo<|2^cdDiLiljpaIMRgQf}`AA5BPL6y_){0z!w> ztuXGx$84}C9(hyWZBXJDYAeT$LlQzS$_;sEH*cV9bYiUtMeA15SvFo12ymcAfM2Q$ zq3|>Pc{FqTZ&&!Ef?duC#v8P9{Fd?7m=&mycjrQ!FqDKHTbx1NA(y1uDUZ&i!$cO3 z*(;$qC>)0<#A>_Eg8afQ(r~$|HPE*zzI+L+z<9Wu4Wq8#WsXg;( zlKWN7Z>$j)5ku|mHdU+EKOli|6BiMjQ5av_snXILh!-;5xp})EDgA$4}OZfHm2i4USO|pC<)upwDPW+7z|K z&;(Qb|7Mu!XiHjGLonXk;`hv^RHN2Yh8aoiSlOk#X%$L*8y0+39y>G*x3%LM9AicX zntj$LGWV`om)z=dcr?Kb;T-D#lL_s{d94bqtaqJ9jcw4&s>;ltmd{4;O;E=?TV<4A zzedER>*B-ew4z4Cq@d7$qasI66t$~{e{z z;xRLG`Zr=@?g-KlI7G21IB~2k1{pW|Ki^{n!75>$V|FqXZt!PHCj*%p=giXis24?@ zS%G5IKb`l;=N zc*Hj8RGR5Y&J_6wh z=XowU@A4NM+fo#@*ua0B)bIoVf!tbvV7%^ktNo!I#@^6GWBo9`1TxEazA&`z=cjUsPY6tLt24f{YE}c^ zO|OgiH0h`>K#E^vf>Op+(g6E3YpAXE@8q`B3c^S{P^_cl<6|8|Xo=XCt89K2SrtZg zdbF2P95TE~&#yw<{Liw`Oz-}hM*Y0%AN-W{$#7-8H32OvQd&3c4Kx_42)1UR;oYD? z(W4Y*$m-}H5Y)$eBFarZ6u~tuI9(@4C)8!q2JlOuP^eH4Iu8!4Qb+laW76Ah(N(gp zfEw^2&t$>GbU^jXp*~>Gj6*H;5fL%5h7^w8sHgfNsr|U5Ri~Vg@)fV*GX>RTTJBdf zgBNbX^#PO?XAM`?kq8806@B|^<_qsk9-DNLS>^o4hx*I_>vLnJh}>i{rD1Vff5B$u zyBEa7pwnUIh}T$IX7U`SP2GNgCDaEp#xFfM@3iYB%~9bH57>|&d~d?yOp$_^cw`k6 zz$yzTTq^B5KR0E+4B7BS89)R2{McD0g>>(O1BybHZHKaIo#2}pGhh+Su-7Ej`8PR~ zW`TPJ_(l!Ady)f`;Bju}poKz<73H8b+vJoKzVCA)VkjvHgr)HV3);?`TLkN!ZTwFk zb$|sttUM}sw@EXc@P&q87{Br-oTO1mWRek>o4(?sx+YJUGdxWmHo;8$VdT~Xpi;J* z25sdT2L4YA6T3BuX#-WMJ<{P|tIwdQ*lnO7QEXPC6>zR}@hZhK8%Sn8iL@d!o*Oj4 zXUi{bdtF+0&%_ME$$Ea#HaE^%W-2zZ~S4%hXu_o2! zuVTXF6~W|#S;8Frb?Rp)9?jZMs>^CO;DPhF%*^#9pj43WA`lr+L%wVg!veQ_4y;=< zp7eU)ym)QI7|>SAL)wj3?_$7rPrF-8K7D07STy&a1n1KKN`3Ymtpu39fQiG6>uF<6 zf~!oTe|}M}(CjiM9IUPV1IV)Yk%eRM>vCP50vP!PCZPrcg+ zAeDLnE_#=s;*fioaFIZTXG{TGhl4K+MpBypuh>N{v4w2`kC$GT%c&QjHi(T-IuhF*NS;f-cxdJE2nJwml4#) zh`m~iEY1IWWyapE`jR^|e)5z8GdhXV5)^=z60?+n$mc|{V85Rd;OLVD83*l zreGu1_QkJ8VcO(vVN}pOz?x@C^RZTrvQehR&2=~EQ6*{08h!vukpOT6#Nt`aI;>6) zZL$wI+FsC9!pZTo-1g6=JMhdq7L*XKub`~~7%VdvZSoVspM!QfRjnN)_0wd*oS>-< z`Lr8Do=-@yU3t@8@oh|4lB-y;ZX*h?S(A8qDw1lmfQtU&NmAG1tV^%7w6BG15v)T8`F=?Q(!_qwud z??gk}%R|$mo17m!ja7+clUCNQ$$#D%w}dj;J0|%A+0g>Fg{g>bxy$~+CB&tT>{)cH zbO47}^v>aPs!#_)t5!#^P}p{ni9`j@KNG?J`ogW}SYgN7V;*&$kv6kmYB9WoeBe?OzwSG_>*H{hi#N&k|tTK?0A&{j>!=O48w9^TmUQ9!2mG zI@}=mG;(z;I1gOLmN!uFDTlp*-3lcj5T!xMgi6DS6TDpX$*mo1vCo+5Nghh2ulOvT zjgvScx!IP#;nTTS&A=O%!JeBZ1Z;%OWUs=wY!FPQDpxIW+q(}{GbWWj?Rr+To?m>Q z7T8?>OlXQUM?Dxi`%3-o~Q5V=i4B(_O+50+U=3`(FTu4O;d4hSO`CSi`{~mxfhgxIt10Y zd$nuLJ|BOm4NQD~z{0`|c7~eqVAY}ILtxR08EpnHb*8O(kuflccGl6&m)$|B=scgW zdVsRb0P7KAG4oFY7{Gf0Pv3A-)zBjU7>5nm8goJL=q@~6(5~3*teR(Wfp~!I?ls8( z)!QMy^psVO;G};7v|ntGt-!M@?_{H8M7%(2Q!5+0k!iI)QrZGvQvNJbwP-qlOWFX^UFV@tPnK!%- zuv6-`f-POvxwWYVRSdO!3cVi0j?s~LwU-fy%?vy~)h(-z8P9(T4k+X{vkG$1EdaEH zy7KdnQwECr)pxJWW7BN2ExtYhurJRnJGI&~t_sUWP%UaB7`omLOp!h<|KSc z>eKBhI(5BdphA$KMM>W04)2RB1`^C%qlN|%n-GUC1Vw;B{6<@&Iq(tBXA0ADKio74 z8CFCfEHse;rD-X|y$o=@kwh$uVogRE9njXtP`+X3+|zm z&u6>OBm)rJCSaq{c|Uzmsr7u1DpFL;$q3U1`=PAFcdO6c5}6eWTImz11y1kr54jkb z#VKdLvQ40+W7?LQal?Q!hS@(n{Kg(-UH;XDb5EpBUIxBODoK0gK&c)S>e(Z~+lAF8 z_E=Bwt@4G9mB9ov%nQ7bjLB`q@?I#gkZ@l#5P%*HV=P`~WYz2LL@e#ooZSiD9N79V zUFK_a5XyYt*b{-QWk6=EXVblBH_b(K{4q}i6SFweO?7^g_Y_(X)zu%7@<9+rgaSYr z8XYS1-+GvF3FziL{84$#W*%1gh&?x2lnh#3Jere&VwhZFtJq!tv(p-dnP%|#5uG>F zWE6Ww67k5{I;M<0tJ%a}U6LJongy*~)P^9m+GjL}+~THY9d*2KPY(m-vVlZHN^jg5 zjg$WsJgv4s8c!K*QUy(J5lTE_RhiCKq(9oEF5-XFq}_FzJXM!J!S`ITXDj~VoZ|84 zo#dope$k&$j&(!%PJ`Fj^~wJw_6{lvHtI4!6{9X`>A>~Svfa;jazZz;yswHr;NMm< zba+(lEMuuq9td>S=jK^Z3tUx)Aykvf*+eNTxg=1RvGiy?;X{%lJ#R4q!Ul9vuz~in zCg?R1EKHxapYh~u;JR5&Q%b|KajDMVEf#m>k)p+LG zsL3U><@}sDi+v0I=T7`G+kN*ytk7iqy<~)-EMPps0A=yXY&r2%TC^WTPt&6PvBXcX z3$_$)k`bSz@Mmg!*o%H4Wm4ju_lu6leHzh_N0yiNR>Sw1@=rp=HG*zb1EgNsu6!q5 z?NXvBOdVX7gAOH)n&Lp6&$w?I&1#hG->rvTG2cj2*I815@ys*>xuXM8)BfG`(asd6 zCTsqefdMe~Y3rBZ<8Za(blb2)UMez+`$Z|V< z&K;Ud_Xi!yWCZ>+etqXygQH<*#H$FtmMsXfw})ZYnFE#2?K92P3X84b@6ikw%r2#w zY2FM{!XbCzHy+m)vbWb&n0JO$YnP}(H^Gw;RZkK&B&v@Tt~xbnkA&#RYGh#6oHq@1 zt6)7NUZQP#+^^;^G8u1#jL31zuw0sJ6YBI;Op1oWc3|FUDD_ObPuR?4E8#&hjs5| zr4H@}^tQ;ggAAH+4V|y-2a;_o7w{`G-KSuypxUi*;@DEtU6)4(t7#YdSDI97v?#Gd zunF-4i6Q6J>VARW8TeT4vxfCkdtVCjtZ9Y;i3H46l1DC64EwloY%&-Eg;HU?&nR}|0fT54895PVU}k# ztdl>TkFKt&@TzMrk{KQKiEZXk%MzB1^w!6X)fqV+NUI)V8{>4NMo>=c;i6jJMX-tm(!lEkEe?* z%8UUHI8SQY47Y;X*BqPqZ4;0G%4Iep!FEK6(^mbfwA{A~9f z*MHd*#Q5=?-%`W3FP=$w>=8@4Pj^aTv-rF70EGeR<~b(Y1}9*7Jp*y`=vq-TF$u}H-K1Y+jxZwwqpkrEW#kA{{v{eDU^83= z8`Q3`X2axV_R=UD@cy%ntyVB_vxatCCLR4AOC2Jjw%5pKQ}k{A*-N)aw-MC|N7tNI z7{%%0N@1PbuW_6^muA=39{-HZ^@|@;>2D2`) z5{7Wkm~O5LZuanpNG&;^sF6F~BMXAt4KBWSN0By8og6QCQ7RaQRF)bqtO9I9^9nPr z_pOyD4X>KrXre3uW5L@8;UxKfo+@ln-qZW=4p5Om)pBAkZW=t+?)dIHKzCG}$!+ML z$)Ej0-dec|l0%WDD-M%NS3{*!$DfyGf2)lv;lZIox@23B8dl& z`1X;9ni(lc(@ufkLe5769VDmGX^*f(`Drg9@w;{5!`1GZ>Ft}Y_WLBx`G(gSmrg2c zdhw*(5-yK?evEX4!wH4q?J-E4Bo1X}W*X4_fQDT(mZIMiw$gv>bXECh+Uu>iTP=wCDf2>GZ3nr$SaR_84@wkxpmr94NW}$-)QB^#$#T!rMt6oao4B~+IDH1cXW*W^ z=*;w#CRlsF*RnX%g50cAP#hg(sqlrz@cC$NkA7{>1KR8ZW`eN%`5VV^UjEM^Y2(=) zs$bz^$5tMd!+9^(*Tq1AI8Ph{j&=STa(R!UomDl0S*uSgHgcqFZ^IvgZ}meDCL%R> zpV!(Odugft@P*p(#y^TXQK{dbQN9f+4~su_2;2*~WrJW4|MDE~Y<{`h@~GU3mU9o! z5c-hh}9p>NVSP%UKXuw4-(w%|9k24Yi%V8*8}oO=wPh@;Ynz) z?dv5#XwgEd4|Ts%jEFD?CG<_TG2RK+-c$SHlEXhuJgsywuRDAp|Xdq z2Q6S7({{{PE2KU*dA_$U?XAuGHJ%RqG9VK4k-X$73CNIpe7~W*cXcFL6*Hx6OGecQ z-s1PjoO|aew&MXRY1$wwiPq zUxS0S@%8oS#bN&TkAmjX?KrEU z;VLvNc!&*WQ8x^Prc`0a+{=H%ktVn02df8R!S($|g08l6>>!mR9soQ5GjfKl2zJhw zNO*BFxIph?-WSx?gU`pLp;)DHqO=5yM;_&<2K=yc z{8VZZ;sNykjlHU%uC`~nIM)i168pWUg4ImIefvt@PUU9W0s~D4f&-f2Zr~7qy`$Cd zl*={9P~N#^@MDybYQO{$4`5oI8M@~zdPlwhj;g8)?(-CJtkYdjILZ}G)ZViclS_VF zXt&zz2^{SChgv5(@{hxd&w}O)a+cWJ(OCh_ydj z29rMyO%4C7)q-V-Mr-?^dkEJ)`q&c0!X5PbpXWG zH230aB3Q(aUFrBMN~RTL4)7Q>pU1yUwo^F>!yD(^h9gW2(nL;Eabmtl0ooT}Z(_LQ z&lx*$grs1js1&aj#9Fc75C;+Z`Ms;UFO-fY zmTlwJRuBe2L_R1>J)JS$e$DctU)YgfdE94PmlJ*@`V!XgX5l0#&8dX>kk+X)oQ$+r*R-nRMCN|8ga{zK`)gC(_cIzD$% zXg)4$u{D>{q+__kc(>g35U}zzpjJ;j@)v{Haa#K3?pdRg z1J?cRbgPsWF8IG6a4S*KfqT|MKv=bOjbo0(F{>^eMHVz5)n=x_dU*2+NhNmJ_IDfQ zXc5@fk;rj9WbM*yd<4uH@F;M4&?j>u+c@Ls_~U>nGO4=Xv12^9qCXz7Z3_qp=wHy= z)}`=gnFV}k+B9Di0j+^8uK_rgEz%MH$GZt_mCXNA| zHZ)l+6D2NgWx+2@%Eu8grO)Tbt8|R^JOxDYRD6e%uYHrab$XR25Ida{_xBB9{vS#n z#XNZO;0k5HC|PQ1y3R|Vwldfs37vR$bwSv0U(gvyyfj!zFV#hj5ojZXG2GqOq47ta z>?DRJwhGEJBPkt2fg=;Zfx#gs|6cCjA9MLx{fO}24!<(RpsVn4tf#88kS!*=xFuSW z*k6uW<9p(Ts$Uz3{PN&Jv%py|X0L2?UQy_u{Mg_h3@d~XhE<3ds-GU0g!ynfKAu4p znE&aN|lbX5!?DLO} zZ0Ff7h0jLI=_>X}$A-0)vbYywxXkZV=tX&gZyG?t@Zg6~H6D$>KpY;e#sF#{E!@sW zQuSCxp}XcKk+C;$SVW6|DIEw*UpzfFlvQ#-)?d&o#7wzRk^T0qI5`z$u8-g#IySG*-1( zCy$4axs3AOvi>Ua(P4MfYIR(kyy64%g1t`0j={TWL{dL0fij_>bK)gREJu14i8)@~E~A7m-C#HW%@1teQ@DZ`ICdWfpG5@P{OYj{^_6OyiqpT! zSu*Gl-J)GtAJ4{sH4#{O&%2%Tk;nKFLcet^*`Z{O|$h2y);Ted^-o+})3DyzzZn z$KmXm6>hn}@E*0!h&l9J)*BVk~=&y!l^*W&?gV-Q5pcqA1Vv1D5~k zGD?{!oe!Jpu`e~M(1B@QUu#Rv6-*orfwbqW5R^;Kx3;|Hhk;cTs;4XNG zyW4R)0LTUHB9f5bR}=wjpiLOghgrJ8$kwJH9daaWaN8mMf*yG}t3=EO$NGAb)&`mV8hIs=B}wQ=KiGXeVcz{Q)IfiV@DLi z0)ho09chdw=aqssPC?JY<4(d=An)IhG%_s|eD$?;si|wL$s{Q_28bl4o#28Fq9qGB zV9uU9zD+Qs7KpD%y|h|S!oXmPUH9yj26y+9GkSzTXb?t7h%p2DM{vr6VXYYHw<9VpHo?MbxSpTU$z7dkdjT5xc0p zchwF>YV>#V{`~86o-^)oUDth|=ZWh_Zy-Jf`3dW_wYa(N*MnJ)e6)BxZ|(NR)^x3aMI$fLuqpx3^NNopcx^ z{mtmZd*o3a63FM9u^qO;Ig5UkyN|VLElv13CJ4^#K&aggW{ZHDfBpX6QUFLfM*tGp zc>=Xx*lV0mIY}WdUlLc>UAKg0pP9`{UT9aktt?ttMOcF_#7J7TGconxYu;-Vvq;6c zo}6IKkgwziyIf`?qyQQu%mAy5e9D4a zYFz6Jl*0Sc&XmWHW|up4FK-=&u_Oe`pY^xWx8-u3+4{2=VZfqSZ>4tt#fVOKXZ%$JTpla17X!l)l<{Svo7ANE>!vgM3NeK~lpM0pjopS{#v#|&v#6N=*k zaE#Mws_{8A>-KT@(-~wk3 zjzJz`Xfv;p)0raiBQpgahdCvj!%5P?mVoYH`sOdE?^3i@_>3 zwJzjMaQ)B6O%#u4^!`!Ljy6)Kze?RTxX2qe@6j%!zgFQ-JyKK!Y^<4G<|4`VF}S6v zcI=x{K*&Y7+DlbZ1c-z>MsOynw0u#kcROZ<7_7k6y?7gpX@icGZ*efBSqA9%k)o&H zao3lw*eSvfZvLIrx)DBn`>;pdTKf<1urnvG1NKa)p3dX}hg;dwm%qo77v-*{Q&r@I zD=<}OzFv1cR0LqGn}G5=cIbXW`&f&;=ak@pZ4E}B{A+hGS>{r z*-DGA&3p5lJw;VD(07xm?N3o+!Rh0RhU@vj*cNoa zS}tMl58D5C;7}Mx*}|Rzv!0dGneda6;Cep-?8Tb|8fM@lKApfjBS~V;bjQ95^N{ZM zwPL}tGr)~lO*oG_0$jEhu++}`$F(?m5LA1>%o2nwou}MKLOFxj+gqwsn(IL&%ANh4 zZ5d{S4PGBw+-4L7h^{#w|7eHJxuyEC*cuLoO* zxQ;?%7-nNWN%n0Tp#xgG*gV?DqW3aSd3S4j4|Ihdy->!r%49Pw@9(m&hKK!p5%#+{ za(*dYr{EnDqh`CTytbQi^7Zbog|T1e#_KumNiD0HJ~`!)_jiwCKPKL7<&t=I{5Zd& zL1xlhHak99c#Uz;!S@RsroVhAnFIbZgW(P;=f|+%(Ts1_U-$Dld$Ks@BWNou0{$YI zgQZvwsxIi$4#lc{jMpzrC?6 zYUgg{4|-5eLR~2(s3qa{Qp84Eadv+B!=(k}iFyRwu1Q%`!hJ4^UoX{Fp-p#{LTSzH zp}}tCXen(|(WG*Yd$gy-j>ouwM6{X8QT%#sb0n{r8*LLT8ntShA^lOCJ}9KR??Fb7 zQG&G=7_|*Xac~tFPwNciuKSf*jIp6CI63D;4DS{U7KJKMPxFzQLppmX-%YjW3*zQN zqO^YqvB%mhJT)Bn_?i3iVFdh-8t(lJ8Dyx@B2n7?b;U4wlpu+UkDVVHZg;?kh$TxZ z3axUW9!Sf~g?a^i=z0)_^?9iI2>vJbI_kKvXb>?^DLd{RSnrYAbr4}u7{B?$fmiH1 zVZo6s&*>*V5j~X z-PqQ`e$6Fv9xZr|Gr=*DPf#)40tXez9skyP)w~ShQG+##)7(Saw4pF1C81Ku~}adC0y>-rC!n$(ejkp4?W_&Mn4hb3+LA+&L1z1z9wiS%UVj!rN_T9BHOq zz=R(!rmB|CSUrsg0u*rVzio-Syl@ zGA-vKi{YRQG|73WUXw`>L7DDHi0Y@DTadSy9Wt{pEpHrNd~l9dw}iB6N5G51x#)z1 zxhxmn203Ky3r?OPcMsFgMitBNf>_(3ePGikGK=cR2`BC>e_8N<@OP>G<~dGQ?9V%@ zEsL2>?$L9p9!w95d$u^YR$BJ_#Mk}ngzS()Y|vzv8C1R1z@(_>JaX`ag4TOyk(IL& zEI1NG>6XRDXl8(3V^s+}SFv{BQZg>7I~w(mG?=qU8SHgFCsHzH-hzikO2@7F-S%_E z5~(N2mWA!yqdCpC3v4SN$Q_0%aS8Rr0XOe0PCO)|CW0nQM-dz5{yX`L{wPD0wP*gd zQH_GhS9p;sFCz9hV=X^pJz(Ftd?@W~ugh=GxkbT+Y>XLs&l~tW)(nK2Z_jE%bl3aU zT7lH%r}qM!t5jxUXqfzgMO!;5Mc41=W!(`TFlut_Tv-;`pnIEoG7Wn{7^@u@p+Y4( z?bR|yR;txb;-BO%U`c8L;nM}yB=5~UJt`d-Olt~g9kj5-Qbzn9Jbgxu{~vhjJ`_p5 zZHZ;k%-J`{j%PYU$Lgr~{OP4ui@J__+HB6TAyAhje9)zvy6APijf2H7^`#N;zAb}4 zb(U*5O*`=moL>u`qmgZygJWjQA~$#B5}KS>SbYGI7e<$)#|H^ZJ8Pn38x~d;csKBC z;%|UaMk$YFTe0hKdY<7K_F=cWX+#LcM(qxt9UqtNT6zntp@82UBG1Dl#K?7CCs%hr zE;rwFH9vZAw|cpV-xPuZ-m=!`*O57yO(8rkn9I8deWvxk--=%n{Qwy#hHgs-2lXcb9Mrg);+fg$6HC`Aje55b+opGK90M$E*OVIw|2+AX z7>yC@2KoJ)byi6hTM+jS4LX9z59{M}AZ>%tD?MG|TBprV5g%YgIIMLT~BL zw4%p9u71D7?ep_153(`_Ig^+5aUTeK9X@`_>%E&od2`l!0N>F6sd(PvEk-(L`MZ;) zdo;uhpqJft6m?mnS1}x;XtYr~E=Bq0-Y}DshrcfpEBOpOTCN)X!y&L?*Bj%pN=z-S zNjsG~3DTL+yLRrHdO7w(jo9^Gh!w9S{?+PHsE_kN%M6Kf0}^az;>h;N$ZeU4odfUs z!7Ggn$~|^Y6qC-u9W*`IjTz@_(Kv&-RE8jL`^dlcK_T2yf?VY|=K@W;??0Ed?ap`m z?D3m1rw1(@&G}X{N?&1$r2uG*o&-0+DlA9;vcu*@_b2RoGfn>r*+yx>$!%#q6iyI#KYoUpJ|L2+4`t4_O+ok0elVB-nw^J!!+?2#nEzsI{p*5%QBdk^b?TrlgCXu13ih#(QTIxJ{$E?oxamYV zBTsszn{PW|H3(xU`W|T+Emoz&=&fzFB#)K%;qqJjU;(K1@PaGQt zw(8|5@zjgctVb0SkCGKjNKx1&M2aZRJ!W&#tnLzdBZ@Wn$b^*10Au&?V+VKSeZV+u z2h(K2{i9+^-LE9X6i}FAz&NO17OBhi(~>nvd?M z^hP!$nUv~fL2;3IzdiRB1y+{(sgrwk!#of(khSfqrgi4nIK$stSO2<6E5^ynKImH3 zVxacVKMdw-ut)k;(Z@VQ&@IQ_hw5g;mzKq*G<3R=amJb!oC@v{1bte2>qUxBctbvG52X2J8DTK zaW|-gMJMqCg3K4heo&an)W7=ax0I_#`^e*r2Y6Pzn+iwwQ%~I}_zMdv8!0(sJ>{VS zt92T`oY_L;Y7U*y?vFc6kAam&DLAzx+%3z^ZW4H*`c|Q7K5WdH%`j1d1^>hLy}4g+V9&Jy?N2wWMcDDV8)=%t!3P z?o|>7Yb^|u__W<4WJJ_jy(Hi~PyYZLukql!MLf?jI*pkDA@^&TJfLe>5VOa?Ikva~ zlhCCJDE=nyL#H@jg%5F)xfTdgFziJPL26le_q=85Hg}TGb&(UCRXq1*qDa^nci`R9 z1@lsMJ#$~xM9CXP`aL2Z&$=UN;wr?4N?>cnT{7+!yD@2!C5Y<+Tx&*Ao4KL9H*rCXAVGt?c48Mf+oy-K zO5tf%3L;+v?-yQL)QH!`!2MIuv~>e2ERNm@;-%z@G(90tI2V-H)In@PjQGW(0nn6u zcF(=L(tH6VSnnlt9Xf6J8PThyM$aJaHiy2W=a>=HG_#x(zij*;8Gu{@P6?|}!S#A@ zA_LJLqSO9Jo6fe7ir_B-rQRqv1|sORhZmU;LpZvxV~tr`&=XO@g5!Q}VIV|}Cd90_ zP={SSX7xyS-ev@cW$e6qoERHoI1ZhDL26!Ok;1he_^s6M^%!@4b|u2IfB7pGL4Rvh zu>g52Oa!H#CiSNkcSq-boGp`i6cB$gBASql5(0vA_MS#JrtzToHAVpt5EeFeQrobb zbpXzh$4Z28{K*lfR9)I&oV^K_0QiT-6RRKLbdFSy+abm1&d87VpMBcnKWm}#G4nnjZ`Dx6$WCVRihoU zEd%hQ?U1_lgNL*}_nZ^7fMLZlkH2$55EB(bcY~#`Mwi;ZNLlC3K!A)x} zZhK?z?QI8XvrIl8WilMlLF*}ABi#fHnqYP%zV9=oO{In_8=J$!WeThzD1dS35Ma~v zU&KNrp4ELTy+m!g9ynF&fzy8t33#*o7ASUkKB=m`n0Zm$kvoa43iy6oZtmQ^?m@~a z;AkiTCZsh!b6l=e&o#u;IaW=(*1we_pCTb^AQzULM z4ukxU0eFRG_4t=h>f>NWU|2&(q+c9KN2XDV@CT5?nG^|ep0Q@CEFLd2=`S-~#~XYv z=E#JC9%lz4ZXXmG7T}|b#@kE78M5+vD_7oe=a+9vA`%8CS*erR07^ofZ>LH<5nj{i zU;dpPMWcGru_xN?{UR!*QD-S7V3k$P3$q^?A&oUfBV@K zk|HO$i+n1qE=QUazj20AJvp*c49ukDnEG&T@xJ;1XZz^YCqKjne=bxiXzF)R2O~dF zMvzt&Iwq?V_`aQ6JqVb~)UHm!;BJtcUw%g&H}uS@*JfzA@MWv^CjqG}c9>u8pJ zTYb~lUCVZce`{W5Adkg>6K;`ESM69fFV?#S(=q}%Hpy1@Zb}kH+Z3IIKg>Ms_DwF? ziAa-jY^x9BJn8ZeI6Q?UlZG^8{~xnrNir9v!I};VQ$W zv__tTsOb3N8>_m#8X!#|Rnq1X;Vtil`eDqd-|`sLl=7jp)z!QjyfRMerfW z+w6F|L!u_4B(Gf1-917{J*$~`yXzsqdqGxtAxNG4=nV^#wYFksCF@)#$JK>S*jDp{ zHChaDQg;Vsg~wL2a-em3>NcCl>63i%V)-Bu4G?FL$;U~Y5HY93#LcsM77APeu%y+L zc=1=}NLYmH!7J+Gt)-##EYnX%%CoERhkUy}u}C+%dfM06w`wN=Y@TueUyz(2`DHvn zm+@OhJ`{?I5i*yNZt;VjoEd z?hZLh8W$GuA$}{_HisvUxa5uZN`@h-J4ytTViK$kZ5Nd7s0i3{*T=TAZ2i!5(5CB< z&#rb(A)5y^_;Ij`0}QPsyaj8+FEsb*jy8|&!nPD8EPC=955PhsAstgQ`S$u)a>h4( z_m^F$`4n_*a=q4EI@_qebdeYFyF@11GzQVofzG;9Akf$(a4U%7qsLYJYb2QTG&3W^zzokFW;f^g8`d#P=ab>?9u?V85W(O zI7XLjoxv8djg!6lO@5AVrL-7!2R}`WjsIC+ZR9K%vLCmyml+W5l7LTV4)~+f_`d#K z1S3SOj8Lz%&X{AXexFIBnd6CKxoJHxGNRDpV*>7sx2n=rEYNjlW<)CK*<5|QPHA9z zp+$QXg6k;`Hid`{0Ox~2ory$+rG z;BO4RXBF*X0EgNA1cpIg7*ny(gBPHF(F-&zy2~nL4vXc(iCv3A<#d*Q-BauBJB)>E zPL#kE#H}{2q6b5hm&uk&LKUf#EkRy|;0$|x?BwHR$NWLfLm+Xu!aTaOFbK!=p+X-R zHd^GR3yW*>x6)c}c1uqmE2={`T|PsAE?6_d)R@|}cV3;8va|kyh0Y_S3Ay?vO4TR~!PmA#K}fjuTG-v<&tli=6?SQxZ*=pxiZKNx1<( z^TahDR`&i>y`1GCou!!|YqIqFduTe#ywZc};?7X(Z_|TYkq`(@@i_A?#Ctu3tyel} z1OGdxa#d-;8)+7hB$_|IvgTg$z+9f^b<1w#P)Jr>oI%?Tu>yVPXHyboSVcU)IRs)f z#OM?)Dl8?3sayDUb-7&4N;9ny5RP)AF=%SAx>F}e`FBMQ&O?tktsdey7q!xE+mxhw z0$b}N9FzHt8_L3K#^s%Ev-X1G9aoPtV)qz>h$@9j+UrA8w8`BH0?Qw5bubSP7@dLg zgY1ns0vRjt$Sgdb-Y7J;}P>tiK6vP9zsMFyUS6}JVtVbyxb}}Hl^g| zIJz)t1AR{kS>+PQP?()7SGl32(u!~Yx<0dytPLXNVva8Ifdn2-Yn}DGbY1TXQpUS~Ui?TKj}5_LsMi z#($jg`%T+aVIj8B`lCJ9d~GX=Km5Bt-iB7ZUUq{((2|9U8$+p+cTsFi%UI(GtJW~# zFG1VZS9@(1v^7kv#8!L>QD0u@#DDTTaO}$!mI}iD#utl%N+sw;fVss0|9~}E=}P{5 zMa`2Ey3q%-gv&q{+Y+Y7MxpFvZ_+=il1K*d1EG#xu%N&%US}Y&CqUUy zPs{dpO!+CTsn%0C=J+?_>Xiy?1E6pf2Fyai^~v=(&C^o>^YZEt|EPVa0p5pa>2`ZI z5b4MrR>Ge17#KS-yGI==IR-pG_x9C`nG&6=x`XwWUWE553JHHp%l=Ukr=Vm2s+axq z)yrkXHb~@-0%7FwRPu7j>^f}BVV-;%)$iT(hO<t-XDhvqz0H>2=JX2M^q7n-)w)6{mb}ZT1Ze zqy@Q^4?SoYrU4cHlSg0>!LyEum81k)6nU5_HfJb^mZA?8Y|&-KOl@ir+a>604$hH( z*7&ud?g-VM_3a$ng;r391J{ji3qwZZa9Pw8bhwM!ZU3Y5@J*F4uYG9ib5O4IOpa%8 zGe*3~65n=L+#(54lG69nhQo>)e_oowiUPPRM`%`w!u}TDxR?=&LE8^cA@=ummzwLe zOV@q(orRzt2i!fIsivlakkOVOy1YPNT!^f!M-TSwEkH&r*iB61kn5b&&72!^ zX}K9^kTC>3N*I?5zXMaCkRgN(Y#|T$@6-J_va-Ny!sGISCeYsUicmaji+9#CbD3y- z1ZZA(oWr_^KlDoGqnm~vuqB<74{$BA5U3<J4KJLW>Ds-nddgeyVN6e;~b^^j!KY7oSTtaMjj z5B8q^nunD58R1$R`X-KUqIlwLMm_IKl|q|68G|GMt0JZU3@I)B+NAErf|Hy^1M7WI z5MUD)kwXHy!`gHKFs@Fx3^(vNT^@8VZrKifBn@%5U1c;X8h+-MQ%*YmAs$(b zyA%_QADyEk8Jj@EuJ{SUBP;6@q@c{?LYeB2^t(n|?g<|3bB65uY!wperfxaw$;Pt& z<#NaR>JoIMN2)^t!i^SLK!-?Y&Yk0!zBH{E9x`~+#L-+H*<8pC5qk(AlA1~5x5!FV zc2{h4SH-|B5}b+udd=knV_PbIb2a6D-2aSNXhE|tGK!z$@CN%VE8wn>8!Ci+hKTA0 zeHx5zBd?qyI+>b+-aFp0_Sk;!*JgWqS~=z)Jr~^^zQfMxJCssvdkMB$+~J1*nY4i* z53ozFQPhqzsA8rGOqJQ8`bogLcxXoRA4x=%Xjx;`Mn489>T2)Q;7DXiin<+vF#T7r zf{3v~Zfu8Pw~7a+i+h}@53c-fR=(qSk_5`X4li82yoHG?)})6| z{zw10EZ1bC5+!w}6oxfQc=!1&Hv|Hx76ez!#maTsl5grMKIS!*I*1S{uopyaC0tsx z(l&t{ru9(YquR?qYSTeIWDeKFl4M=8vEACxyoNgFL+Xk_&)upUvQNrw-ESC1DS6ZW|Pr(!Xj2dpyZwouO9 z#Fj`&|4koxr7fxQ_H-`3*-k-yJ}r8Dw|c^`uQ_`Xd2R3h$WXot3`S_GB9Z14JW_yv zRQ?bwo`I_3Ou`&&d>v8uOQ@StT1>m{9|HQ()HGC3&k7p3L)<;nXgwtI>6c#-0^cE! zQAa}ZOk6*!FC;nJ2e$|tLRaO*^=)}h5!_=WIZ}tdvG{uCQ@LwaiR6+%eZl^}QUXdP zy%0mHfEX8r)`f0z&Wim8CXXXVeBMU{_i5b>^vW$ZY7DNR>w+T*`<6;PlMTMV1u+8c zY#6M<(7XQAN(@H7G1EnsmeJbtUjLrCe=xu0EK}3Khfq@jiZtdao+nGK2;#X2Dk9u1966r~c7Tw$)SKbDs*iFU6`I z=5BUs1q^Eqy6g~$*@slJR3~|$QNR_Ia~$d zrjN@7%qlKQRi#}pSL`l=mr8K91ZS*ao0Daa^_^R9PyQzta18d-8gvgP*HVbcfBIuwz=B*^Zt9e=QM^`K0iv|yPZWvL0HNA0uK{{+{ zzG+Jyr`nOJrv@DZ!jO84jzD1`t)Jg8EoWF1UbGaRpZ%s}-*BA&*Zkh?7M1@2zEu9> s?B)6)s@hr<-I0D00bbEx*!z18BPJ8Jk-hEr5BO74)`C?$e*W_R0EN(ATmS$7 literal 0 HcmV?d00001 diff --git a/platforms/fabric/src/main/resources/assets/terra/lang/en_us.json b/platforms/fabric/src/main/resources/assets/terra/lang/en_us.json new file mode 100644 index 000000000..517b70815 --- /dev/null +++ b/platforms/fabric/src/main/resources/assets/terra/lang/en_us.json @@ -0,0 +1,4 @@ +{ + "generator.terra": "Terra" +} + diff --git a/platforms/fabric/src/main/resources/fabric.mod.json b/platforms/fabric/src/main/resources/fabric.mod.json new file mode 100644 index 000000000..8bdd45848 --- /dev/null +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -0,0 +1,30 @@ +{ + "schemaVersion": 1, + "id": "terra", + "version": "@VERSION@", + "name": "Terra", + "description": "An insanely powerful free & open-source data-driven world generator.", + "authors": [ + "dfsek" + ], + "contact": { + "homepage": "https://github.com/PolyhedralDev/Terra/wiki", + "sources": "https://github.com/PolyhedralDev/Terra" + }, + "license": "GPL-3.0", + "icon": "assets/terra/icon.png", + "environment": "*", + "entrypoints": { + "main": [ + "com.dfsek.terra.fabric.TerraFabricPlugin" + ] + }, + "mixins": [ + "terra.mixins.json" + ], + "depends": { + "fabricloader": ">=0.7.4", + "fabric": "*", + "minecraft": "1.16.x" + } +} \ No newline at end of file diff --git a/platforms/fabric/src/main/resources/terra.accesswidener b/platforms/fabric/src/main/resources/terra.accesswidener new file mode 100644 index 000000000..f7a4eba9a --- /dev/null +++ b/platforms/fabric/src/main/resources/terra.accesswidener @@ -0,0 +1,3 @@ +accessWidener v1 named + +extendable method net/minecraft/client/world/GeneratorType (Ljava/lang/String;)V \ No newline at end of file diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json new file mode 100644 index 000000000..e9cbf4eaf --- /dev/null +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -0,0 +1,14 @@ +{ + "required": true, + "minVersion": "0.8", + "package": "com.dfsek.terra.fabric.mixin", + "compatibilityLevel": "JAVA_8", + "mixins": [], + "client": [], + "server": [ + "GeneratorAccessor" + ], + "injectors": { + "defaultRequire": 1 + } +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 05ab1d83b..29b117099 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,3 +11,25 @@ rootProject.name = "Terra" include("common") include("platforms:bukkit") include("platforms:fabric") + + +pluginManagement { + repositories { + maven(url = "http://maven.fabricmc.net") { + name = "Fabric" + } + gradlePluginPortal() + } +} + +plugins { + id("com.gradle.enterprise") version "3.4.1" +} + +gradleEnterprise { + buildScan { + termsOfServiceUrl = "https://gradle.com/terms-of-service" + termsOfServiceAgree = "yes" +// publishAlwaysIf(true) + } +} \ No newline at end of file From 618e7ed12ec7a9ec5d7ac6e5bffd27b3ce537098 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 12 Dec 2020 15:31:00 -0700 Subject: [PATCH 027/210] Fabric stuff still doesnt work, but eh --- .gitignore | 1 - .../api/gaea/tree/fractal/FractalTree.java | 14 +------ .../dfsek/terra/registry/ConfigRegistry.java | 1 + .../dfsek/terra/registry/TreeRegistry.java | 21 ++++++++++ .../dfsek/terra/fabric/TerraFabricPlugin.java | 38 ++++++++----------- ...cessor.java => GeneratorTypeAccessor.java} | 4 +- .../src/main/resources/terra.mixins.json | 2 +- 7 files changed, 42 insertions(+), 39 deletions(-) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/{GeneratorAccessor.java => GeneratorTypeAccessor.java} (77%) diff --git a/.gitignore b/.gitignore index eb4cb9a50..b7523806f 100644 --- a/.gitignore +++ b/.gitignore @@ -138,4 +138,3 @@ build !lib/*.jar .idea/Terra.iml /run/ -/run/ diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java index f2e58762d..d0dad638e 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java @@ -1,6 +1,5 @@ package com.dfsek.terra.api.gaea.tree.fractal; -import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.generic.Entity; import com.dfsek.terra.api.generic.TerraPlugin; @@ -13,11 +12,10 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Random; -import java.util.Set; import java.util.function.Consumer; -public abstract class FractalTree implements Tree { +public abstract class FractalTree { private final Map treeAssembler = new HashMap<>(); private final List entities = new GlueList<>(); private final Location origin; @@ -111,14 +109,4 @@ public abstract class FractalTree implements Tree { public MaterialData getMaterial(Location l) { return treeAssembler.getOrDefault(l, main.getWorldHandle().createBlockData("minecraft:air")).getMaterial(); } - - @Override - public boolean plant(Location l, Random r) { - return false; - } - - @Override - public Set getSpawnable() { - return null; - } } diff --git a/common/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java b/common/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java index 626e697f9..60f7c90e8 100644 --- a/common/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java @@ -21,6 +21,7 @@ public class ConfigRegistry extends TerraRegistry { public boolean loadAll(TerraPlugin main) { boolean valid = true; File packsFolder = new File(main.getDataFolder(), "packs"); + packsFolder.mkdirs(); for(File dir : packsFolder.listFiles(File::isDirectory)) { try { load(dir, main); diff --git a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java index 8f4a6340b..35464bccb 100644 --- a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java @@ -2,12 +2,20 @@ package com.dfsek.terra.registry; import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.vector.Location; + +import java.util.Random; +import java.util.Set; public class TreeRegistry extends TerraRegistry { private final TerraPlugin main; public TreeRegistry(TerraPlugin main) { this.main = main; + addTree("ACACIA"); + addTree("BIRCH"); + addTree("BROWN_MUSHROOM"); } private void addTree(String id) { @@ -17,4 +25,17 @@ public class TreeRegistry extends TerraRegistry { main.getLogger().warning("Unable to load tree " + id + ": " + e.getMessage()); } } + + private static final class FractalTreeHolder implements Tree { + + @Override + public boolean plant(Location l, Random r) { + return false; + } + + @Override + public Set getSpawnable() { + return null; + } + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 8788d76d1..a8382de07 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -9,6 +9,8 @@ import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.config.base.PluginConfig; import com.dfsek.terra.fabric.inventory.FabricItemHandle; +import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; +import com.dfsek.terra.fabric.world.FabricWorldHandle; import com.dfsek.terra.registry.ConfigRegistry; import net.fabricmc.api.ModInitializer; import net.minecraft.client.world.GeneratorType; @@ -21,10 +23,8 @@ import net.minecraft.world.gen.chunk.FlatChunkGeneratorConfig; import net.minecraft.world.gen.chunk.StructuresConfig; import java.io.File; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; +import java.net.URISyntaxException; import java.util.Collections; -import java.util.List; import java.util.Optional; import java.util.logging.Logger; @@ -40,10 +40,12 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { }; private final Logger logger = Logger.getLogger("Terra"); private final ItemHandle itemHandle = new FabricItemHandle(); + private final WorldHandle worldHandle = new FabricWorldHandle(); + private final ConfigRegistry registry = new ConfigRegistry(); @Override public WorldHandle getWorldHandle() { - return null; + return worldHandle; } @Override @@ -68,7 +70,12 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public File getDataFolder() { - return null; + try { + return new File(new File(TerraFabricPlugin.class.getProtectionDomain().getCodeSource().getLocation() + .toURI()), "terra"); + } catch(URISyntaxException e) { + throw new RuntimeException(e); + } } @Override @@ -83,7 +90,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public ConfigRegistry getRegistry() { - return null; + return registry; } @Override @@ -93,7 +100,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public ItemHandle getItemHandle() { - return null; + return itemHandle; } @Override @@ -101,24 +108,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } - @SuppressWarnings("unchecked") @Override public void onInitialize() { logger.info("Initializing Terra..."); - Class generatorTypeClass = GeneratorType.class; + GeneratorTypeAccessor.getValues().add(TERRA); + registry.loadAll(this); - try { - Field values = generatorTypeClass.getDeclaredField("VALUES"); - values.setAccessible(true); - - Field modifiersField = Field.class.getDeclaredField("modifiers"); - - modifiersField.setAccessible(true); - modifiersField.setInt(values, values.getModifiers() & ~Modifier.FINAL); - - ((List) values.get(null)).add(TERRA); // TODO: This is incredibly yucky and should be replaced by Mixin as soon as possible. - } catch(NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException(e); - } } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorAccessor.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java similarity index 77% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorAccessor.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java index 1b4f1712a..e251ebd59 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorAccessor.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java @@ -7,9 +7,9 @@ import org.spongepowered.asm.mixin.gen.Accessor; import java.util.List; @Mixin(GeneratorType.class) -public class GeneratorAccessor { +public interface GeneratorTypeAccessor { @Accessor("VALUES") - public static List getValues() { + static List getValues() { throw new AssertionError(); } } diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index e9cbf4eaf..3b5597ce8 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -6,7 +6,7 @@ "mixins": [], "client": [], "server": [ - "GeneratorAccessor" + "GeneratorTypeAccessor" ], "injectors": { "defaultRequire": 1 From d779b3ea2720988e48ccd850ba79431265c0c76b Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 12 Dec 2020 16:24:01 -0700 Subject: [PATCH 028/210] testWithPaper task moved to Bukkit subproject --- build.gradle.kts | 64 +------------------------ platforms/bukkit/build.gradle.kts | 77 +++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 63 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index d0568a914..1296a32f2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,10 +2,7 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import java.io.ByteArrayOutputStream import java.net.URL -import java.nio.channels.Channels -import java.nio.file.Files -import java.nio.file.Paths -import java.nio.file.StandardCopyOption + plugins { java @@ -117,41 +114,7 @@ tasks.build { // testWithPaper.mustRunAfter(tasks.shadowJar) } -val testDir = "target/server/" -val setupServer = tasks.create("setupServer") { - dependsOn(tasks.shadowJar) - doFirst { - // clean - file("${testDir}/").deleteRecursively() - file("${testDir}/plugins").mkdirs() - - // Downloading latest paper jar. - val paperUrl = URL("https://papermc.io/api/v1/paper/1.16.4/latest/download") - val paperReadableByteChannel = Channels.newChannel(paperUrl.openStream()) - val paperFile = file("${testDir}/paper.jar") - val paperFileOutputStream = paperFile.outputStream() - val paperFileChannel = paperFileOutputStream.channel - paperFileChannel.transferFrom(paperReadableByteChannel, 0, Long.MAX_VALUE) - - // Cloning test setup. - gitClone("https://github.com/PolyhedralDev/WorldGenTestServer") - // Copying plugins - Files.move(Paths.get("WorldGenTestServer/plugins"), - Paths.get("$testDir/plugins"), - StandardCopyOption.REPLACE_EXISTING) - // Copying config - val serverText = URL("https://raw.githubusercontent.com/PolyhedralDev/WorldGenTestServer/master/server.properties").readText() - file("${testDir}/server.properties").writeText(serverText) - val bukkitText = URL("https://raw.githubusercontent.com/PolyhedralDev/WorldGenTestServer/master/bukkit.yml").readText() - file("${testDir}/bukkit.yml").writeText(bukkitText.replace("\${world}", "world").replace("\${gen}", "Terra:DEFAULT")) - - File("${testDir}/eula.txt").writeText("eula=true") - - // clean up - file("WorldGenTestServer").deleteRecursively() - } -} val downloadDefaultPacks = tasks.create("downloadDefaultPacks") { doFirst { @@ -168,31 +131,6 @@ val downloadDefaultPacks = tasks.create("downloadDefaultPacks") { } } -val testWithPaper = task(name = "testWithPaper") { - standardInput = System.`in` - dependsOn(tasks.shadowJar) - // Copy Terra into dir - doFirst { - copy { - from("${project("platforms:bukkit").buildDir}/libs/Terra-${versionObj}.jar") - into("${testDir}/plugins/") - } - } - - main = "io.papermc.paperclip.Paperclip" - jvmArgs = listOf("-XX:+UseG1GC", "-XX:+ParallelRefProcEnabled", "-XX:MaxGCPauseMillis=200", - "-XX:+UnlockExperimentalVMOptions", "-XX:+DisableExplicitGC", "-XX:+AlwaysPreTouch", - "-XX:G1NewSizePercent=30", "-XX:G1MaxNewSizePercent=40", "-XX:G1HeapRegionSize=8M", - "-XX:G1ReservePercent=20", "-XX:G1HeapWastePercent=5", "-XX:G1MixedGCCountTarget=4", - "-XX:InitiatingHeapOccupancyPercent=15", "-XX:G1MixedGCLiveThresholdPercent=90", - "-XX:G1RSetUpdatingPauseTimePercent=5", "-XX:SurvivorRatio=32", "-XX:+PerfDisableSharedMem", - "-XX:MaxTenuringThreshold=1", "-Dusing.aikars.flags=https://mcflags.emc.gs", - "-Daikars.new.flags=true", "-DIReallyKnowWhatIAmDoingISwear") - maxHeapSize = "2G" - args = listOf("nogui") - workingDir = file("${testDir}/") - classpath = files("${testDir}/paper.jar") -} /** diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index b9a051d8b..913bba658 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -1,3 +1,10 @@ +import java.io.ByteArrayOutputStream +import java.net.URL +import java.nio.channels.Channels +import java.nio.file.Files +import java.nio.file.Paths +import java.nio.file.StandardCopyOption + plugins { java maven @@ -48,6 +55,68 @@ tasks.withType { ) } +val testDir = "target/server/" + +val setupServer = tasks.create("setupServer") { + dependsOn(tasks.shadowJar) + doFirst { + // clean + file("${testDir}/").deleteRecursively() + file("${testDir}/plugins").mkdirs() + + // Downloading latest paper jar. + val paperUrl = URL("https://papermc.io/api/v1/paper/1.16.4/latest/download") + val paperReadableByteChannel = Channels.newChannel(paperUrl.openStream()) + val paperFile = file("${testDir}/paper.jar") + val paperFileOutputStream = paperFile.outputStream() + val paperFileChannel = paperFileOutputStream.channel + paperFileChannel.transferFrom(paperReadableByteChannel, 0, Long.MAX_VALUE) + + // Cloning test setup. + gitClone("https://github.com/PolyhedralDev/WorldGenTestServer") + // Copying plugins + Files.move(Paths.get("WorldGenTestServer/plugins"), + Paths.get("$testDir/plugins"), + StandardCopyOption.REPLACE_EXISTING) + // Copying config + val serverText = URL("https://raw.githubusercontent.com/PolyhedralDev/WorldGenTestServer/master/server.properties").readText() + file("${testDir}/server.properties").writeText(serverText) + val bukkitText = URL("https://raw.githubusercontent.com/PolyhedralDev/WorldGenTestServer/master/bukkit.yml").readText() + file("${testDir}/bukkit.yml").writeText(bukkitText.replace("\${world}", "world").replace("\${gen}", "Terra:DEFAULT")) + + File("${testDir}/eula.txt").writeText("eula=true") + + // clean up + file("WorldGenTestServer").deleteRecursively() + } +} + +val testWithPaper = task(name = "testWithPaper") { + standardInput = System.`in` + dependsOn(tasks.shadowJar) + // Copy Terra into dir + doFirst { + copy { + from("${buildDir}/libs/Terra-${version}.jar") + into("${testDir}/plugins/") + } + } + + main = "io.papermc.paperclip.Paperclip" + jvmArgs = listOf("-XX:+UseG1GC", "-XX:+ParallelRefProcEnabled", "-XX:MaxGCPauseMillis=200", + "-XX:+UnlockExperimentalVMOptions", "-XX:+DisableExplicitGC", "-XX:+AlwaysPreTouch", + "-XX:G1NewSizePercent=30", "-XX:G1MaxNewSizePercent=40", "-XX:G1HeapRegionSize=8M", + "-XX:G1ReservePercent=20", "-XX:G1HeapWastePercent=5", "-XX:G1MixedGCCountTarget=4", + "-XX:InitiatingHeapOccupancyPercent=15", "-XX:G1MixedGCLiveThresholdPercent=90", + "-XX:G1RSetUpdatingPauseTimePercent=5", "-XX:SurvivorRatio=32", "-XX:+PerfDisableSharedMem", + "-XX:MaxTenuringThreshold=1", "-Dusing.aikars.flags=https://mcflags.emc.gs", + "-Daikars.new.flags=true", "-DIReallyKnowWhatIAmDoingISwear") + maxHeapSize = "2G" + args = listOf("nogui") + workingDir = file("${testDir}/") + classpath = files("${testDir}/paper.jar") +} + tasks.named("shadowJar") { archiveClassifier.set("") @@ -61,4 +130,12 @@ tasks.named("shadowJ relocate("com.dfsek.tectonic", "com.dfsek.terra.lib.tectonic") relocate("net.jafama", "com.dfsek.terra.lib.jafama") minimize() +} + +fun gitClone(name: String) { + val stdout = ByteArrayOutputStream() + exec { + commandLine = mutableListOf("git", "clone", name) + standardOutput = stdout + } } \ No newline at end of file From 6c20b5911fde15db5dc3cc0f063b0b13be8a5ad4 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 12 Dec 2020 16:54:39 -0700 Subject: [PATCH 029/210] Sponge --- platforms/sponge/build.gradle.kts | 50 +++++++++++ .../dfsek/terra/sponge/TerraSpongePlugin.java | 83 +++++++++++++++++++ settings.gradle.kts | 5 +- 3 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 platforms/sponge/build.gradle.kts create mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java diff --git a/platforms/sponge/build.gradle.kts b/platforms/sponge/build.gradle.kts new file mode 100644 index 000000000..998aa9b20 --- /dev/null +++ b/platforms/sponge/build.gradle.kts @@ -0,0 +1,50 @@ +plugins { + java + maven + id("org.spongepowered.plugin").version("0.9.0") + id("com.github.johnrengelman.shadow") +} + +group = "com.dfsek.terra" + +repositories { + mavenCentral() + jcenter() + maven { url = uri("https://repo.codemc.org/repository/maven-public") } +} + +dependencies { + compile("org.spongepowered:spongeapi:7.2.0") + + testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") + testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0") + + implementation("org.apache.commons:commons-rng-core:1.3") + + implementation("com.scireum:parsii:1.2.1") + implementation("com.dfsek:Tectonic:1.0.3") + implementation("net.jafama:jafama:2.3.2") + + compileOnly("com.googlecode.json-simple:json-simple:1.1") + + implementation("com.google.guava:guava:30.0-jre") + + compileOnly("org.jetbrains:annotations:20.1.0") + + implementation(project(":common")) +} + +tasks.named("shadowJar") { + + archiveClassifier.set("") + archiveBaseName.set("Terra") + setVersion(project.version) + relocate("org.apache.commons", "com.dfsek.terra.lib.commons") + relocate("org.bstats.bukkit", "com.dfsek.terra.lib.bstats") + relocate("parsii", "com.dfsek.terra.lib.parsii") + relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") + relocate("net.jafama", "com.dfsek.terra.lib.jafama") + relocate("com.dfsek.tectonic", "com.dfsek.terra.lib.tectonic") + relocate("net.jafama", "com.dfsek.terra.lib.jafama") + minimize() +} \ No newline at end of file diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java new file mode 100644 index 000000000..d53304c0b --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java @@ -0,0 +1,83 @@ +package com.dfsek.terra.sponge; + +import com.dfsek.tectonic.loading.TypeRegistry; +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.gaea.lang.Language; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.inventory.ItemHandle; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.config.base.PluginConfig; +import com.dfsek.terra.registry.ConfigRegistry; +import org.spongepowered.api.plugin.Plugin; + +import javax.inject.Inject; +import java.io.File; +import java.util.logging.Logger; + +@Plugin(id = "terra", name = "Terra", version = "@VERSION", description = "Terra world generator") +public class TerraSpongePlugin implements TerraPlugin { + + @Inject + private Logger logger; + + @Override + public WorldHandle getWorldHandle() { + return null; + } + + @Override + public boolean isEnabled() { + return false; + } + + @Override + public TerraWorld getWorld(World world) { + return null; + } + + @Override + public Logger getLogger() { + return logger; + } + + @Override + public PluginConfig getTerraConfig() { + return null; + } + + @Override + public File getDataFolder() { + return null; + } + + @Override + public boolean isDebug() { + return false; + } + + @Override + public Language getLanguage() { + return null; + } + + @Override + public ConfigRegistry getRegistry() { + return null; + } + + @Override + public void reload() { + + } + + @Override + public ItemHandle getItemHandle() { + return null; + } + + @Override + public void register(TypeRegistry registry) { + + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 29b117099..c98090194 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -32,4 +32,7 @@ gradleEnterprise { termsOfServiceAgree = "yes" // publishAlwaysIf(true) } -} \ No newline at end of file +} +include("sponge") +include("platforms:sponge") +findProject(":platforms:sponge")?.name = "sponge" From a3add9b20fd1c73ad8d0f30067fa53ae74f2d13a Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 12 Dec 2020 19:23:28 -0700 Subject: [PATCH 030/210] Begin Sponge implementation --- .../dfsek/terra/sponge/TerraSpongePlugin.java | 37 +++++++- .../sponge/mixin/BlockStateParserMixin.java | 4 + .../dfsek/terra/sponge/world/SpongeChunk.java | 38 ++++++++ .../dfsek/terra/sponge/world/SpongeWorld.java | 87 +++++++++++++++++++ .../terra/sponge/world/SpongeWorldHandle.java | 47 ++++++++++ .../terra/sponge/world/block/SpongeBlock.java | 77 ++++++++++++++++ .../sponge/world/block/SpongeBlockData.java | 37 ++++++++ .../world/block/SpongeMaterialData.java | 48 ++++++++++ .../world/generator/SpongeChunkGenerator.java | 66 ++++++++++++++ 9 files changed, 437 insertions(+), 4 deletions(-) create mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/mixin/BlockStateParserMixin.java create mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeChunk.java create mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorld.java create mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorldHandle.java create mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlock.java create mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlockData.java create mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeMaterialData.java create mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/generator/SpongeChunkGenerator.java diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java index d53304c0b..2aebffc29 100644 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java @@ -9,26 +9,55 @@ import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.config.base.PluginConfig; import com.dfsek.terra.registry.ConfigRegistry; +import com.dfsek.terra.sponge.world.SpongeWorldHandle; +import com.google.inject.Inject; +import org.spongepowered.api.GameRegistry; +import org.spongepowered.api.config.ConfigDir; +import org.spongepowered.api.event.Listener; +import org.spongepowered.api.event.game.state.GameStartedServerEvent; import org.spongepowered.api.plugin.Plugin; -import javax.inject.Inject; import java.io.File; import java.util.logging.Logger; @Plugin(id = "terra", name = "Terra", version = "@VERSION", description = "Terra world generator") public class TerraSpongePlugin implements TerraPlugin { + private final ConfigRegistry registry = new ConfigRegistry(); + + private final WorldHandle worldHandle = new SpongeWorldHandle(this); + @Inject private Logger logger; + private boolean enabled = false; + + @Inject + @ConfigDir(sharedRoot = false) + private File configDir; + + @Inject + private GameRegistry gameRegistry; + + public GameRegistry getGameRegistry() { + return gameRegistry; + } + + @Listener + public void serverStart(GameStartedServerEvent event) { + logger.info("Hello Sponge!"); + logger.info("Config dir is: " + configDir); + registry.loadAll(this); + enabled = true; + } @Override public WorldHandle getWorldHandle() { - return null; + return worldHandle; } @Override public boolean isEnabled() { - return false; + return enabled; } @Override @@ -48,7 +77,7 @@ public class TerraSpongePlugin implements TerraPlugin { @Override public File getDataFolder() { - return null; + return configDir; } @Override diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/mixin/BlockStateParserMixin.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/mixin/BlockStateParserMixin.java new file mode 100644 index 000000000..11f131772 --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/mixin/BlockStateParserMixin.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.sponge.mixin; + +public class BlockStateParserMixin { +} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeChunk.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeChunk.java new file mode 100644 index 000000000..43e818ccf --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeChunk.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.sponge.world; + +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.Block; + +public class SpongeChunk implements Chunk { + private final org.spongepowered.api.world.Chunk delegate; + + public SpongeChunk(org.spongepowered.api.world.Chunk delegate) { + this.delegate = delegate; + } + + @Override + public int getX() { + return delegate.getPosition().getX(); + } + + @Override + public int getZ() { + return delegate.getPosition().getZ(); + } + + @Override + public World getWorld() { + return new SpongeWorld(delegate.getWorld()); + } + + @Override + public Block getBlock(int x, int y, int z) { + return null; + } + + @Override + public org.spongepowered.api.world.Chunk getHandle() { + return delegate; + } +} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorld.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorld.java new file mode 100644 index 000000000..6b840f746 --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorld.java @@ -0,0 +1,87 @@ +package com.dfsek.terra.sponge.world; + +import com.dfsek.terra.api.generic.Entity; +import com.dfsek.terra.api.generic.Tree; +import com.dfsek.terra.api.generic.generator.ChunkGenerator; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.sponge.world.generator.SpongeChunkGenerator; + +import java.io.File; +import java.util.UUID; +import java.util.function.Consumer; + +public class SpongeWorld implements World { + private final org.spongepowered.api.world.World delegate; + + public SpongeWorld(org.spongepowered.api.world.World delegate) { + this.delegate = delegate; + } + + @Override + public long getSeed() { + return delegate.getProperties().getSeed(); + } + + @Override + public int getMaxHeight() { + return 255; + } + + @Override + public ChunkGenerator getGenerator() { + return new SpongeChunkGenerator(delegate.getWorldGenerator()); + } + + @Override + public String getName() { + return delegate.getName(); + } + + @Override + public UUID getUID() { + return delegate.getUniqueId(); + } + + @Override + public boolean isChunkGenerated(int x, int z) { + return delegate.loadChunk(x, 0, z, false).isPresent(); // TODO: better implementation + } + + @Override + public Chunk getChunkAt(int x, int z) { + return null; + } + + @Override + public File getWorldFolder() { + return null; + } + + @Override + public Block getBlockAt(int x, int y, int z) { + return null; + } + + @Override + public Block getBlockAt(Location l) { + return null; + } + + @Override + public boolean generateTree(Location l, Tree vanillaTreeType) { + return false; + } + + @Override + public void spawn(Location location, Class entity, Consumer consumer) { + + } + + @Override + public Object getHandle() { + return null; + } +} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorldHandle.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorldHandle.java new file mode 100644 index 000000000..7fbd91495 --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorldHandle.java @@ -0,0 +1,47 @@ +package com.dfsek.terra.sponge.world; + +import com.dfsek.terra.api.generic.Tree; +import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.sponge.TerraSpongePlugin; +import com.dfsek.terra.sponge.world.block.SpongeBlockData; + +public class SpongeWorldHandle implements WorldHandle { + private final TerraSpongePlugin main; + + public SpongeWorldHandle(TerraSpongePlugin main) { + this.main = main; + } + + @Override + public void setBlockData(Block block, BlockData data, boolean physics) { + + } + + @Override + public BlockData getBlockData(Block block) { + return null; + } + + @Override + public MaterialData getType(Block block) { + return null; + } + + @Override + public BlockData createBlockData(String data) { + return new SpongeBlockData(null); + } + + @Override + public MaterialData createMaterialData(String data) { + return createBlockData(data).getMaterial(); + } + + @Override + public Tree getTree(String id) { + return null; + } +} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlock.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlock.java new file mode 100644 index 000000000..1e928d95b --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlock.java @@ -0,0 +1,77 @@ +package com.dfsek.terra.sponge.world.block; + +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.sponge.world.SpongeWorld; +import org.spongepowered.api.world.World; + +public class SpongeBlock implements Block { + private final org.spongepowered.api.world.Location delegate; + + public SpongeBlock(org.spongepowered.api.world.Location delegate) { + this.delegate = delegate; + } + + @Override + public void setBlockData(BlockData data, boolean physics) { + delegate.setBlock(((SpongeBlockData) data).getHandle()); + } + + @Override + public BlockData getBlockData() { + return new SpongeBlockData(delegate.getBlock()); + } + + @Override + public Block getRelative(BlockFace face) { + return new SpongeBlock(delegate.copy().add(face.getModX(), face.getModY(), face.getModZ())); + } + + @Override + public Block getRelative(BlockFace face, int len) { + return new SpongeBlock(delegate.copy().add(face.getModX() * len, face.getModY() * len, face.getModZ() * len)); + } + + @Override + public boolean isEmpty() { + return delegate.hasBlock(); + } + + @Override + public Location getLocation() { + return new Location(new SpongeWorld(delegate.getExtent()), delegate.getX(), delegate.getY(), delegate.getZ()); + } + + @Override + public MaterialData getType() { + return new SpongeMaterialData(delegate.getBlockType()); + } + + @Override + public int getX() { + return delegate.getBlockX(); + } + + @Override + public int getZ() { + return delegate.getBlockZ(); + } + + @Override + public int getY() { + return delegate.getBlockY(); + } + + @Override + public boolean isPassable() { + return false; + } + + @Override + public org.spongepowered.api.world.Location getHandle() { + return delegate; + } +} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlockData.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlockData.java new file mode 100644 index 000000000..0b21fc1d9 --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlockData.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.sponge.world.block; + +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import org.spongepowered.api.block.BlockState; + +public class SpongeBlockData implements BlockData { + private final BlockState delegate; + + public SpongeBlockData(BlockState delegate) { + this.delegate = delegate; + } + + @Override + public MaterialData getMaterial() { + return new SpongeMaterialData(delegate.getType()); + } + + @Override + public boolean matches(MaterialData materialData) { + return ((SpongeMaterialData) materialData).getHandle().equals(delegate.getType()); + } + + @Override + public BlockData clone() { + try { + return (BlockData) super.clone(); + } catch(CloneNotSupportedException e) { + throw new Error(e); + } + } + + @Override + public BlockState getHandle() { + return delegate; + } +} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeMaterialData.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeMaterialData.java new file mode 100644 index 000000000..ec6681e74 --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeMaterialData.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.sponge.world.block; + +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import org.spongepowered.api.block.BlockType; + +public class SpongeMaterialData implements MaterialData { + private final BlockType delegate; + + public SpongeMaterialData(BlockType delegate) { + this.delegate = delegate; + } + + @Override + public boolean matches(MaterialData other) { + return delegate.equals(((SpongeMaterialData) other).getHandle()); + } + + @Override + public boolean matches(BlockData other) { + return false; + } + + @Override + public boolean isSolid() { + return false; + } + + @Override + public boolean isAir() { + return false; + } + + @Override + public double getMaxDurability() { + return 0; + } + + @Override + public BlockData createBlockData() { + return null; + } + + @Override + public BlockType getHandle() { + return delegate; + } +} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/generator/SpongeChunkGenerator.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/generator/SpongeChunkGenerator.java new file mode 100644 index 000000000..0b791be21 --- /dev/null +++ b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/generator/SpongeChunkGenerator.java @@ -0,0 +1,66 @@ +package com.dfsek.terra.sponge.world.generator; + +import com.dfsek.terra.api.generic.generator.BlockPopulator; +import com.dfsek.terra.api.generic.generator.ChunkGenerator; +import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; +import com.dfsek.terra.api.generic.world.BiomeGrid; +import com.dfsek.terra.api.generic.world.World; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.api.world.gen.WorldGenerator; + +import java.util.List; +import java.util.Random; + +public class SpongeChunkGenerator implements ChunkGenerator { + private final WorldGenerator delegate; + + public SpongeChunkGenerator(WorldGenerator delegate) { + this.delegate = delegate; + } + + @Override + public boolean isParallelCapable() { + return false; + } + + @Override + public boolean shouldGenerateCaves() { + return false; + } + + @Override + public boolean shouldGenerateDecorations() { + return false; + } + + @Override + public boolean shouldGenerateMobs() { + return false; + } + + @Override + public boolean shouldGenerateStructures() { + return false; + } + + @Override + public ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { + return null; + } + + @Override + public List getDefaultPopulators(World world) { + return null; + } + + @Override + public @Nullable TerraChunkGenerator getTerraGenerator() { + return null; + } + + @Override + public WorldGenerator getHandle() { + return delegate; + } +} From 2c15a9fc0c10ecd9a017f3dde1ee995dd670b46a Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 13 Dec 2020 02:00:15 -0700 Subject: [PATCH 031/210] Successful default config load in Fabric --- .../dfsek/terra/api/gaea/lang/Language.java | 27 +++-- .../com/dfsek/terra/config/lang/LangUtil.java | 5 +- platforms/fabric/build.gradle.kts | 4 +- .../dfsek/terra/fabric/TerraFabricPlugin.java | 35 ++++-- .../fabric/mixin/GeneratorTypeAccessor.java | 2 +- .../dfsek/terra/fabric/world/FabricBiome.java | 10 ++ .../terra/fabric/world/FabricWorldHandle.java | 14 ++- .../src/main/resources/terra.mixins.json | 4 +- platforms/sponge/build.gradle.kts | 50 -------- .../dfsek/terra/sponge/TerraSpongePlugin.java | 112 ------------------ .../sponge/mixin/BlockStateParserMixin.java | 4 - .../dfsek/terra/sponge/world/SpongeChunk.java | 38 ------ .../dfsek/terra/sponge/world/SpongeWorld.java | 87 -------------- .../terra/sponge/world/SpongeWorldHandle.java | 47 -------- .../terra/sponge/world/block/SpongeBlock.java | 77 ------------ .../sponge/world/block/SpongeBlockData.java | 37 ------ .../world/block/SpongeMaterialData.java | 48 -------- .../world/generator/SpongeChunkGenerator.java | 66 ----------- settings.gradle.kts | 3 - 19 files changed, 70 insertions(+), 600 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java delete mode 100644 platforms/sponge/build.gradle.kts delete mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java delete mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/mixin/BlockStateParserMixin.java delete mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeChunk.java delete mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorld.java delete mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorldHandle.java delete mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlock.java delete mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlockData.java delete mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeMaterialData.java delete mode 100644 platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/generator/SpongeChunkGenerator.java diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java b/common/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java index 604b8068d..a8c442668 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java @@ -1,31 +1,34 @@ package com.dfsek.terra.api.gaea.lang; +import com.dfsek.tectonic.config.Configuration; import com.dfsek.terra.api.generic.CommandSender; -import org.jetbrains.annotations.NotNull; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; public class Language { + private final Configuration configuration; public Language(File file) throws IOException { - load(file); - } - public void load(@NotNull File file) throws IOException { + configuration = new Configuration(new FileInputStream(file)); } @SuppressWarnings("unchecked") public Message getMessage(String id) { - Object m = null; - Message temp; - if(m instanceof List) { - temp = new MultiLineMessage((List) m); - } else if(m instanceof String) { - temp = new SingleLineMessage((String) m); - } else return new SingleLineMessage("message:" + id + ":translation_undefined"); - if(temp.isEmpty()) return new SingleLineMessage("message:" + id + ":translation_undefined"); + Message temp = null; + if(configuration.contains(id)) { + Object m = configuration.get(id); + + if(m instanceof List) { + temp = new MultiLineMessage((List) m); + } else if(m instanceof String) { + temp = new SingleLineMessage((String) m); + } else return new SingleLineMessage("message:" + id + ":translation_undefined"); + } + if(temp == null || temp.isEmpty()) return new SingleLineMessage("message:" + id + ":translation_undefined"); return temp; } public void log(String messageID, Level level, Logger logger, String... args) { diff --git a/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java b/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java index ad86c6775..8e01fcff5 100644 --- a/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java +++ b/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java @@ -29,7 +29,10 @@ public final class LangUtil { Debug.error("Report this to Terra!"); } try { - language = new Language(new File(main.getDataFolder(), "lang" + File.separator + langID + ".yml")); + File file1 = new File(file, langID + ".yml"); + logger.info(file1.getAbsolutePath()); + language = new Language(file1); + logger.info("Loaded language " + langID); } catch(IOException e) { logger.severe("Unable to load language: " + langID); e.printStackTrace(); diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index d653666dd..f74e60e21 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -37,12 +37,14 @@ dependencies { implementation("com.dfsek:Tectonic:1.0.3") implementation("net.jafama:jafama:2.3.2") - compileOnly("com.googlecode.json-simple:json-simple:1.1") + implementation("com.googlecode.json-simple:json-simple:1.1") implementation("com.google.guava:guava:30.0-jre") compileOnly("org.jetbrains:annotations:20.1.0") + implementation("org.yaml:snakeyaml:1.27") + // To change the versions see the gradle.properties file minecraft("com.mojang:minecraft:1.16.4") mappings("net.fabricmc:yarn:1.16.4+build.6:v2") diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index a8382de07..a5ab62fde 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -2,17 +2,23 @@ package com.dfsek.terra.fabric; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.GenericLoaders; import com.dfsek.terra.api.gaea.lang.Language; import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.inventory.ItemHandle; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.config.base.PluginConfig; +import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.fabric.inventory.FabricItemHandle; import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; +import com.dfsek.terra.fabric.world.FabricBiome; import com.dfsek.terra.fabric.world.FabricWorldHandle; import com.dfsek.terra.registry.ConfigRegistry; import net.fabricmc.api.ModInitializer; +import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.world.GeneratorType; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; @@ -23,7 +29,7 @@ import net.minecraft.world.gen.chunk.FlatChunkGeneratorConfig; import net.minecraft.world.gen.chunk.StructuresConfig; import java.io.File; -import java.net.URISyntaxException; +import java.io.IOException; import java.util.Collections; import java.util.Optional; import java.util.logging.Logger; @@ -38,10 +44,13 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { return new FlatChunkGenerator(config); } }; + + private final GenericLoaders genericLoaders = new GenericLoaders(this); private final Logger logger = Logger.getLogger("Terra"); private final ItemHandle itemHandle = new FabricItemHandle(); private final WorldHandle worldHandle = new FabricWorldHandle(); private final ConfigRegistry registry = new ConfigRegistry(); + private File config; @Override public WorldHandle getWorldHandle() { @@ -70,12 +79,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public File getDataFolder() { - try { - return new File(new File(TerraFabricPlugin.class.getProtectionDomain().getCodeSource().getLocation() - .toURI()), "terra"); - } catch(URISyntaxException e) { - throw new RuntimeException(e); - } + return config; } @Override @@ -85,7 +89,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public Language getLanguage() { - return null; + try { + return new Language(new File(getDataFolder(), "lang/en_us/yml")); + } catch(IOException e) { + throw new IllegalArgumentException(); + } } @Override @@ -105,14 +113,19 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public void register(TypeRegistry registry) { - + genericLoaders.register(registry); + registry + .registerLoader(BlockData.class, (t, o, l) -> worldHandle.createBlockData((String) o)) + .registerLoader(MaterialData.class, (t, o, l) -> worldHandle.createMaterialData((String) o)) + .registerLoader(com.dfsek.terra.api.generic.world.Biome.class, (t, o, l) -> new FabricBiome()); } @Override public void onInitialize() { + config = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); + LangUtil.load("en_us", this); logger.info("Initializing Terra..."); - GeneratorTypeAccessor.getValues().add(TERRA); + GeneratorTypeAccessor.accessor$getValues().add(TERRA); registry.loadAll(this); - } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java index e251ebd59..e6c0dd86d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java @@ -9,7 +9,7 @@ import java.util.List; @Mixin(GeneratorType.class) public interface GeneratorTypeAccessor { @Accessor("VALUES") - static List getValues() { + static List accessor$getValues() { throw new AssertionError(); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java new file mode 100644 index 000000000..735b006ca --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.api.generic.world.Biome; + +public class FabricBiome implements Biome { + @Override + public Object getHandle() { + return null; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index 87aeac210..20ae43c54 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -5,6 +5,9 @@ import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.mojang.brigadier.StringReader; +import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.command.argument.BlockArgumentParser; public class FabricWorldHandle implements WorldHandle { @Override @@ -23,13 +26,18 @@ public class FabricWorldHandle implements WorldHandle { } @Override - public BlockData createBlockData(String data) { - return null; + public FabricBlockData createBlockData(String data) { + BlockArgumentParser parser = new BlockArgumentParser(new StringReader(data), true); + try { + return new FabricBlockData(parser.parse(true).getBlockState()); + } catch(CommandSyntaxException e) { + throw new IllegalArgumentException(e); + } } @Override public MaterialData createMaterialData(String data) { - return null; + return new FabricMaterialData(createBlockData(data).getHandle().getMaterial()); } @Override diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 3b5597ce8..a6b050657 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -4,10 +4,10 @@ "package": "com.dfsek.terra.fabric.mixin", "compatibilityLevel": "JAVA_8", "mixins": [], - "client": [], - "server": [ + "client": [ "GeneratorTypeAccessor" ], + "server": [], "injectors": { "defaultRequire": 1 } diff --git a/platforms/sponge/build.gradle.kts b/platforms/sponge/build.gradle.kts deleted file mode 100644 index 998aa9b20..000000000 --- a/platforms/sponge/build.gradle.kts +++ /dev/null @@ -1,50 +0,0 @@ -plugins { - java - maven - id("org.spongepowered.plugin").version("0.9.0") - id("com.github.johnrengelman.shadow") -} - -group = "com.dfsek.terra" - -repositories { - mavenCentral() - jcenter() - maven { url = uri("https://repo.codemc.org/repository/maven-public") } -} - -dependencies { - compile("org.spongepowered:spongeapi:7.2.0") - - testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0") - - implementation("org.apache.commons:commons-rng-core:1.3") - - implementation("com.scireum:parsii:1.2.1") - implementation("com.dfsek:Tectonic:1.0.3") - implementation("net.jafama:jafama:2.3.2") - - compileOnly("com.googlecode.json-simple:json-simple:1.1") - - implementation("com.google.guava:guava:30.0-jre") - - compileOnly("org.jetbrains:annotations:20.1.0") - - implementation(project(":common")) -} - -tasks.named("shadowJar") { - - archiveClassifier.set("") - archiveBaseName.set("Terra") - setVersion(project.version) - relocate("org.apache.commons", "com.dfsek.terra.lib.commons") - relocate("org.bstats.bukkit", "com.dfsek.terra.lib.bstats") - relocate("parsii", "com.dfsek.terra.lib.parsii") - relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") - relocate("net.jafama", "com.dfsek.terra.lib.jafama") - relocate("com.dfsek.tectonic", "com.dfsek.terra.lib.tectonic") - relocate("net.jafama", "com.dfsek.terra.lib.jafama") - minimize() -} \ No newline at end of file diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java deleted file mode 100644 index 2aebffc29..000000000 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/TerraSpongePlugin.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.dfsek.terra.sponge; - -import com.dfsek.tectonic.loading.TypeRegistry; -import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.lang.Language; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.inventory.ItemHandle; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.config.base.PluginConfig; -import com.dfsek.terra.registry.ConfigRegistry; -import com.dfsek.terra.sponge.world.SpongeWorldHandle; -import com.google.inject.Inject; -import org.spongepowered.api.GameRegistry; -import org.spongepowered.api.config.ConfigDir; -import org.spongepowered.api.event.Listener; -import org.spongepowered.api.event.game.state.GameStartedServerEvent; -import org.spongepowered.api.plugin.Plugin; - -import java.io.File; -import java.util.logging.Logger; - -@Plugin(id = "terra", name = "Terra", version = "@VERSION", description = "Terra world generator") -public class TerraSpongePlugin implements TerraPlugin { - - private final ConfigRegistry registry = new ConfigRegistry(); - - private final WorldHandle worldHandle = new SpongeWorldHandle(this); - - @Inject - private Logger logger; - private boolean enabled = false; - - @Inject - @ConfigDir(sharedRoot = false) - private File configDir; - - @Inject - private GameRegistry gameRegistry; - - public GameRegistry getGameRegistry() { - return gameRegistry; - } - - @Listener - public void serverStart(GameStartedServerEvent event) { - logger.info("Hello Sponge!"); - logger.info("Config dir is: " + configDir); - registry.loadAll(this); - enabled = true; - } - - @Override - public WorldHandle getWorldHandle() { - return worldHandle; - } - - @Override - public boolean isEnabled() { - return enabled; - } - - @Override - public TerraWorld getWorld(World world) { - return null; - } - - @Override - public Logger getLogger() { - return logger; - } - - @Override - public PluginConfig getTerraConfig() { - return null; - } - - @Override - public File getDataFolder() { - return configDir; - } - - @Override - public boolean isDebug() { - return false; - } - - @Override - public Language getLanguage() { - return null; - } - - @Override - public ConfigRegistry getRegistry() { - return null; - } - - @Override - public void reload() { - - } - - @Override - public ItemHandle getItemHandle() { - return null; - } - - @Override - public void register(TypeRegistry registry) { - - } -} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/mixin/BlockStateParserMixin.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/mixin/BlockStateParserMixin.java deleted file mode 100644 index 11f131772..000000000 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/mixin/BlockStateParserMixin.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra.sponge.mixin; - -public class BlockStateParserMixin { -} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeChunk.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeChunk.java deleted file mode 100644 index 43e818ccf..000000000 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeChunk.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.dfsek.terra.sponge.world; - -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.Block; - -public class SpongeChunk implements Chunk { - private final org.spongepowered.api.world.Chunk delegate; - - public SpongeChunk(org.spongepowered.api.world.Chunk delegate) { - this.delegate = delegate; - } - - @Override - public int getX() { - return delegate.getPosition().getX(); - } - - @Override - public int getZ() { - return delegate.getPosition().getZ(); - } - - @Override - public World getWorld() { - return new SpongeWorld(delegate.getWorld()); - } - - @Override - public Block getBlock(int x, int y, int z) { - return null; - } - - @Override - public org.spongepowered.api.world.Chunk getHandle() { - return delegate; - } -} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorld.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorld.java deleted file mode 100644 index 6b840f746..000000000 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorld.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.dfsek.terra.sponge.world; - -import com.dfsek.terra.api.generic.Entity; -import com.dfsek.terra.api.generic.Tree; -import com.dfsek.terra.api.generic.generator.ChunkGenerator; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.sponge.world.generator.SpongeChunkGenerator; - -import java.io.File; -import java.util.UUID; -import java.util.function.Consumer; - -public class SpongeWorld implements World { - private final org.spongepowered.api.world.World delegate; - - public SpongeWorld(org.spongepowered.api.world.World delegate) { - this.delegate = delegate; - } - - @Override - public long getSeed() { - return delegate.getProperties().getSeed(); - } - - @Override - public int getMaxHeight() { - return 255; - } - - @Override - public ChunkGenerator getGenerator() { - return new SpongeChunkGenerator(delegate.getWorldGenerator()); - } - - @Override - public String getName() { - return delegate.getName(); - } - - @Override - public UUID getUID() { - return delegate.getUniqueId(); - } - - @Override - public boolean isChunkGenerated(int x, int z) { - return delegate.loadChunk(x, 0, z, false).isPresent(); // TODO: better implementation - } - - @Override - public Chunk getChunkAt(int x, int z) { - return null; - } - - @Override - public File getWorldFolder() { - return null; - } - - @Override - public Block getBlockAt(int x, int y, int z) { - return null; - } - - @Override - public Block getBlockAt(Location l) { - return null; - } - - @Override - public boolean generateTree(Location l, Tree vanillaTreeType) { - return false; - } - - @Override - public void spawn(Location location, Class entity, Consumer consumer) { - - } - - @Override - public Object getHandle() { - return null; - } -} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorldHandle.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorldHandle.java deleted file mode 100644 index 7fbd91495..000000000 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/SpongeWorldHandle.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.dfsek.terra.sponge.world; - -import com.dfsek.terra.api.generic.Tree; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.sponge.TerraSpongePlugin; -import com.dfsek.terra.sponge.world.block.SpongeBlockData; - -public class SpongeWorldHandle implements WorldHandle { - private final TerraSpongePlugin main; - - public SpongeWorldHandle(TerraSpongePlugin main) { - this.main = main; - } - - @Override - public void setBlockData(Block block, BlockData data, boolean physics) { - - } - - @Override - public BlockData getBlockData(Block block) { - return null; - } - - @Override - public MaterialData getType(Block block) { - return null; - } - - @Override - public BlockData createBlockData(String data) { - return new SpongeBlockData(null); - } - - @Override - public MaterialData createMaterialData(String data) { - return createBlockData(data).getMaterial(); - } - - @Override - public Tree getTree(String id) { - return null; - } -} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlock.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlock.java deleted file mode 100644 index 1e928d95b..000000000 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlock.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.dfsek.terra.sponge.world.block; - -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.sponge.world.SpongeWorld; -import org.spongepowered.api.world.World; - -public class SpongeBlock implements Block { - private final org.spongepowered.api.world.Location delegate; - - public SpongeBlock(org.spongepowered.api.world.Location delegate) { - this.delegate = delegate; - } - - @Override - public void setBlockData(BlockData data, boolean physics) { - delegate.setBlock(((SpongeBlockData) data).getHandle()); - } - - @Override - public BlockData getBlockData() { - return new SpongeBlockData(delegate.getBlock()); - } - - @Override - public Block getRelative(BlockFace face) { - return new SpongeBlock(delegate.copy().add(face.getModX(), face.getModY(), face.getModZ())); - } - - @Override - public Block getRelative(BlockFace face, int len) { - return new SpongeBlock(delegate.copy().add(face.getModX() * len, face.getModY() * len, face.getModZ() * len)); - } - - @Override - public boolean isEmpty() { - return delegate.hasBlock(); - } - - @Override - public Location getLocation() { - return new Location(new SpongeWorld(delegate.getExtent()), delegate.getX(), delegate.getY(), delegate.getZ()); - } - - @Override - public MaterialData getType() { - return new SpongeMaterialData(delegate.getBlockType()); - } - - @Override - public int getX() { - return delegate.getBlockX(); - } - - @Override - public int getZ() { - return delegate.getBlockZ(); - } - - @Override - public int getY() { - return delegate.getBlockY(); - } - - @Override - public boolean isPassable() { - return false; - } - - @Override - public org.spongepowered.api.world.Location getHandle() { - return delegate; - } -} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlockData.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlockData.java deleted file mode 100644 index 0b21fc1d9..000000000 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeBlockData.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.dfsek.terra.sponge.world.block; - -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; -import org.spongepowered.api.block.BlockState; - -public class SpongeBlockData implements BlockData { - private final BlockState delegate; - - public SpongeBlockData(BlockState delegate) { - this.delegate = delegate; - } - - @Override - public MaterialData getMaterial() { - return new SpongeMaterialData(delegate.getType()); - } - - @Override - public boolean matches(MaterialData materialData) { - return ((SpongeMaterialData) materialData).getHandle().equals(delegate.getType()); - } - - @Override - public BlockData clone() { - try { - return (BlockData) super.clone(); - } catch(CloneNotSupportedException e) { - throw new Error(e); - } - } - - @Override - public BlockState getHandle() { - return delegate; - } -} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeMaterialData.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeMaterialData.java deleted file mode 100644 index ec6681e74..000000000 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/block/SpongeMaterialData.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.dfsek.terra.sponge.world.block; - -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; -import org.spongepowered.api.block.BlockType; - -public class SpongeMaterialData implements MaterialData { - private final BlockType delegate; - - public SpongeMaterialData(BlockType delegate) { - this.delegate = delegate; - } - - @Override - public boolean matches(MaterialData other) { - return delegate.equals(((SpongeMaterialData) other).getHandle()); - } - - @Override - public boolean matches(BlockData other) { - return false; - } - - @Override - public boolean isSolid() { - return false; - } - - @Override - public boolean isAir() { - return false; - } - - @Override - public double getMaxDurability() { - return 0; - } - - @Override - public BlockData createBlockData() { - return null; - } - - @Override - public BlockType getHandle() { - return delegate; - } -} diff --git a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/generator/SpongeChunkGenerator.java b/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/generator/SpongeChunkGenerator.java deleted file mode 100644 index 0b791be21..000000000 --- a/platforms/sponge/src/main/java/com/dfsek/terra/sponge/world/generator/SpongeChunkGenerator.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.dfsek.terra.sponge.world.generator; - -import com.dfsek.terra.api.generic.generator.BlockPopulator; -import com.dfsek.terra.api.generic.generator.ChunkGenerator; -import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; -import com.dfsek.terra.api.generic.world.BiomeGrid; -import com.dfsek.terra.api.generic.world.World; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.api.world.gen.WorldGenerator; - -import java.util.List; -import java.util.Random; - -public class SpongeChunkGenerator implements ChunkGenerator { - private final WorldGenerator delegate; - - public SpongeChunkGenerator(WorldGenerator delegate) { - this.delegate = delegate; - } - - @Override - public boolean isParallelCapable() { - return false; - } - - @Override - public boolean shouldGenerateCaves() { - return false; - } - - @Override - public boolean shouldGenerateDecorations() { - return false; - } - - @Override - public boolean shouldGenerateMobs() { - return false; - } - - @Override - public boolean shouldGenerateStructures() { - return false; - } - - @Override - public ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { - return null; - } - - @Override - public List getDefaultPopulators(World world) { - return null; - } - - @Override - public @Nullable TerraChunkGenerator getTerraGenerator() { - return null; - } - - @Override - public WorldGenerator getHandle() { - return delegate; - } -} diff --git a/settings.gradle.kts b/settings.gradle.kts index c98090194..61c60a585 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -33,6 +33,3 @@ gradleEnterprise { // publishAlwaysIf(true) } } -include("sponge") -include("platforms:sponge") -findProject(":platforms:sponge")?.name = "sponge" From 269ec257b52e62010379edd9530574f248b671b0 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 13 Dec 2020 03:44:49 -0700 Subject: [PATCH 032/210] fabric stuff --- .../generator/TerraChunkGenerator.java | 2 + .../terra/generation/TerraChunkGenerator.java | 5 + .../dfsek/terra/fabric/TerraFabricPlugin.java | 22 +++- .../fabric/mixin/GeneratorTypeAccessor.java | 2 +- .../terra/fabric/world/BlockStorage.java | 7 +- .../terra/fabric/world/FabricBiomeGrid.java | 32 +++++ .../world/generator/FabricChunkData.java | 36 ++++++ .../world/generator/FabricChunkGenerator.java | 81 +++++++------ .../FabricChunkGeneratorWrapper.java | 88 ++++++++++++++ .../generator/TerraChunkGeneratorCodec.java | 33 +++++ .../handles/FabricSeededWorldAccess.java | 113 ++++++++++++++++++ .../FabricWorldAccess.java} | 13 +- .../world/handles/FabricWorldChunkRegion.java | 87 ++++++++++++++ 13 files changed, 473 insertions(+), 48 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeGrid.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/TerraChunkGeneratorCodec.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricSeededWorldAccess.java rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/{FabricWorld.java => handles/FabricWorldAccess.java} (83%) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldChunkRegion.java diff --git a/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java b/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java index 753b877cf..1fd8baf04 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.generic.generator; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.BiomeGrid; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.config.base.ConfigPack; @@ -28,4 +29,5 @@ public interface TerraChunkGenerator { List getPopulators(); + TerraPlugin getMain(); } diff --git a/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index 4fd96339c..51ebaf6b7 100644 --- a/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -106,6 +106,11 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato return Arrays.asList(new CavePopulator(main), new StructurePopulator(main), popMan); } + @Override + public TerraPlugin getMain() { + return main; + } + @Override @SuppressWarnings({"try"}) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index a5ab62fde..150693346 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -16,15 +16,17 @@ import com.dfsek.terra.fabric.inventory.FabricItemHandle; import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; import com.dfsek.terra.fabric.world.FabricBiome; import com.dfsek.terra.fabric.world.FabricWorldHandle; +import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; +import com.dfsek.terra.fabric.world.generator.TerraChunkGeneratorCodec; import com.dfsek.terra.registry.ConfigRegistry; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.world.GeneratorType; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.VanillaLayeredBiomeSource; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; -import net.minecraft.world.gen.chunk.FlatChunkGenerator; import net.minecraft.world.gen.chunk.FlatChunkGeneratorConfig; import net.minecraft.world.gen.chunk.StructuresConfig; @@ -35,15 +37,22 @@ import java.util.Optional; import java.util.logging.Logger; public class TerraFabricPlugin implements TerraPlugin, ModInitializer { - private static final GeneratorType TERRA = new GeneratorType("terra") { + private static TerraFabricPlugin instance; + private final GeneratorType TERRA = new GeneratorType("terra") { @Override protected ChunkGenerator getChunkGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed) { FlatChunkGeneratorConfig config = new FlatChunkGeneratorConfig( new StructuresConfig(Optional.empty(), Collections.emptyMap()), biomeRegistry); config.updateLayerBlocks(); - return new FlatChunkGenerator(config); + + return new FabricChunkGeneratorWrapper(new VanillaLayeredBiomeSource(seed, false, false, biomeRegistry), seed); } }; + private final TerraChunkGeneratorCodec chunkGeneratorCodec = new TerraChunkGeneratorCodec(this); + + public static TerraFabricPlugin getInstance() { + return instance; + } private final GenericLoaders genericLoaders = new GenericLoaders(this); private final Logger logger = Logger.getLogger("Terra"); @@ -122,10 +131,15 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public void onInitialize() { + instance = this; config = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); LangUtil.load("en_us", this); logger.info("Initializing Terra..."); - GeneratorTypeAccessor.accessor$getValues().add(TERRA); + GeneratorTypeAccessor.getValues().add(TERRA); registry.loadAll(this); } + + public TerraChunkGeneratorCodec getChunkGeneratorCodec() { + return chunkGeneratorCodec; + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java index e6c0dd86d..e251ebd59 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/GeneratorTypeAccessor.java @@ -9,7 +9,7 @@ import java.util.List; @Mixin(GeneratorType.class) public interface GeneratorTypeAccessor { @Accessor("VALUES") - static List accessor$getValues() { + static List getValues() { throw new AssertionError(); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/BlockStorage.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/BlockStorage.java index a0ad63b04..21ef9280d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/BlockStorage.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/BlockStorage.java @@ -1,8 +1,9 @@ package com.dfsek.terra.fabric.world; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.fabric.world.handles.FabricWorldAccess; import net.minecraft.block.Block; -import net.minecraft.world.World; +import net.minecraft.world.WorldAccess; public class BlockStorage { private final Block block; @@ -21,8 +22,8 @@ public class BlockStorage { return location; } - public World getWorld() { - return ((FabricWorld) location.getWorld()).getHandle(); + public WorldAccess getWorld() { + return ((FabricWorldAccess) location.getWorld()).getHandle(); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeGrid.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeGrid.java new file mode 100644 index 000000000..58a1f7d90 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeGrid.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.api.generic.world.Biome; +import com.dfsek.terra.api.generic.world.BiomeGrid; +import org.jetbrains.annotations.NotNull; + +public class FabricBiomeGrid implements BiomeGrid { + @Override + public @NotNull Biome getBiome(int x, int z) { + return new FabricBiome(); + } + + @Override + public @NotNull Biome getBiome(int x, int y, int z) { + return new FabricBiome(); + } + + @Override + public void setBiome(int x, int z, @NotNull Biome bio) { + + } + + @Override + public void setBiome(int x, int y, int z, @NotNull Biome bio) { + + } + + @Override + public Object getHandle() { + return null; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java new file mode 100644 index 000000000..0cd669eb8 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.fabric.world.generator; + +import com.dfsek.terra.api.generic.generator.ChunkGenerator; +import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.fabric.world.FabricBlockData; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.chunk.Chunk; +import org.jetbrains.annotations.NotNull; + +public class FabricChunkData implements ChunkGenerator.ChunkData { + private final Chunk handle; + + public FabricChunkData(Chunk handle) { + this.handle = handle; + } + + @Override + public Chunk getHandle() { + return handle; + } + + @Override + public int getMaxHeight() { + return handle.getHeight(); + } + + @Override + public void setBlock(int x, int y, int z, @NotNull BlockData blockData) { + handle.setBlockState(new BlockPos(x, y, z), ((FabricBlockData) blockData).getHandle(), false); + } + + @Override + public @NotNull BlockData getBlockData(int x, int y, int z) { + return new FabricBlockData(handle.getBlockState(new BlockPos(x, y, z))); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java index e8feffae0..eb7fa984d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java @@ -1,52 +1,65 @@ package com.dfsek.terra.fabric.world.generator; -import com.mojang.serialization.Codec; -import net.minecraft.world.BlockView; -import net.minecraft.world.ChunkRegion; -import net.minecraft.world.Heightmap; -import net.minecraft.world.WorldAccess; -import net.minecraft.world.biome.source.BiomeSource; -import net.minecraft.world.chunk.Chunk; -import net.minecraft.world.gen.StructureAccessor; -import net.minecraft.world.gen.chunk.ChunkGenerator; -import net.minecraft.world.gen.chunk.StructuresConfig; +import com.dfsek.terra.api.generic.generator.BlockPopulator; +import com.dfsek.terra.api.generic.generator.ChunkGenerator; +import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; +import com.dfsek.terra.api.generic.world.BiomeGrid; +import com.dfsek.terra.api.generic.world.World; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; -public class FabricChunkGenerator extends ChunkGenerator { - public FabricChunkGenerator(BiomeSource biomeSource, StructuresConfig structuresConfig) { - super(biomeSource, structuresConfig); - } +import java.util.List; +import java.util.Random; - public FabricChunkGenerator(BiomeSource populationSource, BiomeSource biomeSource, StructuresConfig structuresConfig, long worldSeed) { - super(populationSource, biomeSource, structuresConfig, worldSeed); +public class FabricChunkGenerator implements ChunkGenerator { + private final net.minecraft.world.gen.chunk.ChunkGenerator delegate; + + public FabricChunkGenerator(net.minecraft.world.gen.chunk.ChunkGenerator delegate) { + this.delegate = delegate; } @Override - protected Codec getCodec() { + public boolean isParallelCapable() { + return false; + } + + @Override + public boolean shouldGenerateCaves() { + return false; + } + + @Override + public boolean shouldGenerateDecorations() { + return false; + } + + @Override + public boolean shouldGenerateMobs() { + return false; + } + + @Override + public boolean shouldGenerateStructures() { + return false; + } + + @Override + public ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { return null; } @Override - public ChunkGenerator withSeed(long seed) { + public List getDefaultPopulators(World world) { return null; } @Override - public void buildSurface(ChunkRegion region, Chunk chunk) { - - } - - @Override - public void populateNoise(WorldAccess world, StructureAccessor accessor, Chunk chunk) { - - } - - @Override - public int getHeight(int x, int z, Heightmap.Type heightmapType) { - return 0; - } - - @Override - public BlockView getColumnSample(int x, int z) { + public @Nullable TerraChunkGenerator getTerraGenerator() { return null; } + + @Override + public net.minecraft.world.gen.chunk.ChunkGenerator getHandle() { + return delegate; + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java new file mode 100644 index 000000000..9ac8e1e8f --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -0,0 +1,88 @@ +package com.dfsek.terra.fabric.world.generator; + +import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.world.FabricBiomeGrid; +import com.dfsek.terra.fabric.world.handles.FabricSeededWorldAccess; +import com.dfsek.terra.generation.TerraChunkGenerator; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.world.BlockView; +import net.minecraft.world.ChunkRegion; +import net.minecraft.world.Heightmap; +import net.minecraft.world.WorldAccess; +import net.minecraft.world.biome.source.BiomeSource; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.gen.StructureAccessor; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.chunk.StructuresConfig; +import net.minecraft.world.gen.chunk.VerticalBlockSample; + +public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handle { + private final long seed; + private final TerraChunkGenerator delegate; + private final Codec codec = RecordCodecBuilder.create(instance -> instance.group( + BiomeSource.CODEC.fieldOf("biome_source").forGetter(generator -> generator.biomeSource), + Codec.LONG.fieldOf("seed").stable().forGetter(generator -> generator.seed)) + .apply(instance, instance.stable(FabricChunkGeneratorWrapper::new))); + + public FabricChunkGeneratorWrapper(BiomeSource biomeSource, long seed) { + super(biomeSource, new StructuresConfig(false)); + this.delegate = new TerraChunkGenerator(TerraFabricPlugin.getInstance().getRegistry().get("DEFAULT"), TerraFabricPlugin.getInstance()); + delegate.getMain().getLogger().info("Loading world..."); + + this.seed = seed; + } + + @Override + public TerraChunkGenerator getHandle() { + return delegate; + } + + @Override + protected Codec getCodec() { + return codec; + } + + @Override + public ChunkGenerator withSeed(long seed) { + return new FabricChunkGeneratorWrapper(this.biomeSource.withSeed(seed), seed); + } + + @Override + public void buildSurface(ChunkRegion region, Chunk chunk) { + + } + + @Override + public void populateNoise(WorldAccess world, StructureAccessor accessor, Chunk chunk) { + delegate.generateChunkData(new FabricSeededWorldAccess(world, seed, this), new FastRandom(), chunk.getPos().x, chunk.getPos().z, new FabricBiomeGrid(), new FabricChunkData(chunk)); + } + + @Override + public int getHeight(int x, int z, Heightmap.Type heightmapType) { + return 0; + } + + @Override + public BlockView getColumnSample(int x, int z) { + int height = 64; // TODO: implementation + BlockState[] array = new BlockState[256]; + for(int y = 255; y >= 0; y--) { + if(y > height) { + if(y > getSeaLevel()) { + array[y] = Blocks.AIR.getDefaultState(); + } else { + array[y] = Blocks.WATER.getDefaultState(); + } + } else { + array[y] = Blocks.STONE.getDefaultState(); + } + } + + return new VerticalBlockSample(array); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/TerraChunkGeneratorCodec.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/TerraChunkGeneratorCodec.java new file mode 100644 index 000000000..d7b66a184 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/TerraChunkGeneratorCodec.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.fabric.world.generator; + +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.generation.TerraChunkGenerator; +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.DynamicOps; + +import java.util.Optional; + +public class TerraChunkGeneratorCodec implements Codec { + private final TerraPlugin main; + + public TerraChunkGeneratorCodec(TerraPlugin main) { + this.main = main; + } + + @Override + public DataResult> decode(DynamicOps ops, T input) { + Optional s = ops.getStringValue(input).get().left(); + if(!s.isPresent()) return DataResult.error("No data present"); + if(main.getRegistry().contains(s.get())) { + return DataResult.success(new Pair<>(new TerraChunkGenerator(main.getRegistry().get(s.get()), main), input)); + } + return null; + } + + @Override + public DataResult encode(TerraChunkGenerator input, DynamicOps ops, T prefix) { + return null; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricSeededWorldAccess.java new file mode 100644 index 000000000..4a7ef3c88 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricSeededWorldAccess.java @@ -0,0 +1,113 @@ +package com.dfsek.terra.fabric.world.handles; + +import com.dfsek.terra.api.generic.Entity; +import com.dfsek.terra.api.generic.Tree; +import com.dfsek.terra.api.generic.generator.ChunkGenerator; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; +import net.minecraft.world.WorldAccess; + +import java.io.File; +import java.util.UUID; +import java.util.function.Consumer; + +public class FabricSeededWorldAccess implements World { + + private final Handle handle; + + public FabricSeededWorldAccess(WorldAccess access, long seed, net.minecraft.world.gen.chunk.ChunkGenerator generator) { + this.handle = new Handle(access, seed, generator); + } + + @Override + public long getSeed() { + return handle.getSeed(); + } + + @Override + public int getMaxHeight() { + return handle.getWorldAccess().getDimensionHeight(); + } + + @Override + public ChunkGenerator getGenerator() { + return new FabricChunkGenerator(handle.getGenerator()); + } + + @Override + public String getName() { + return handle.toString(); // TODO: implementation + } + + @Override + public UUID getUID() { + return UUID.randomUUID(); // TODO: implementation + } + + @Override + public boolean isChunkGenerated(int x, int z) { + return false; + } + + @Override + public Chunk getChunkAt(int x, int z) { + return null; + } + + @Override + public File getWorldFolder() { + return null; + } + + @Override + public Block getBlockAt(int x, int y, int z) { + return null; + } + + @Override + public Block getBlockAt(Location l) { + return null; + } + + @Override + public boolean generateTree(Location l, Tree vanillaTreeType) { + return false; + } + + @Override + public void spawn(Location location, Class entity, Consumer consumer) { + + } + + @Override + public Handle getHandle() { + return handle; + } + + public static class Handle { + private final WorldAccess worldAccess; + private final long seed; + private final net.minecraft.world.gen.chunk.ChunkGenerator generator; + + public Handle(WorldAccess worldAccess, long seed, net.minecraft.world.gen.chunk.ChunkGenerator generator) { + this.worldAccess = worldAccess; + this.seed = seed; + this.generator = generator; + } + + public net.minecraft.world.gen.chunk.ChunkGenerator getGenerator() { + return generator; + } + + public long getSeed() { + return seed; + } + + public WorldAccess getWorldAccess() { + return worldAccess; + } + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldAccess.java similarity index 83% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorld.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldAccess.java index a99da20d4..f526ecae9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorld.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldAccess.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.world; +package com.dfsek.terra.fabric.world.handles; import com.dfsek.terra.api.generic.Entity; import com.dfsek.terra.api.generic.Tree; @@ -7,21 +7,22 @@ import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; +import net.minecraft.world.WorldAccess; import java.io.File; import java.util.UUID; import java.util.function.Consumer; -public class FabricWorld implements World { - private final net.minecraft.world.World delegate; +public class FabricWorldAccess implements World { + private final WorldAccess delegate; - public FabricWorld(net.minecraft.world.World delegate) { + public FabricWorldAccess(WorldAccess delegate) { this.delegate = delegate; } @Override public long getSeed() { - return 1234; + return 1234; // TODO: actually implement this } @Override @@ -80,7 +81,7 @@ public class FabricWorld implements World { } @Override - public net.minecraft.world.World getHandle() { + public WorldAccess getHandle() { return delegate; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldChunkRegion.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldChunkRegion.java new file mode 100644 index 000000000..5c28ccc97 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldChunkRegion.java @@ -0,0 +1,87 @@ +package com.dfsek.terra.fabric.world.handles; + +import com.dfsek.terra.api.generic.Entity; +import com.dfsek.terra.api.generic.Tree; +import com.dfsek.terra.api.generic.generator.ChunkGenerator; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.vector.Location; +import net.minecraft.world.ChunkRegion; + +import java.io.File; +import java.util.UUID; +import java.util.function.Consumer; + +public class FabricWorldChunkRegion implements World { + private final ChunkRegion delegate; + + public FabricWorldChunkRegion(ChunkRegion delegate) { + this.delegate = delegate; + } + + @Override + public long getSeed() { + return delegate.getSeed(); + } + + @Override + public int getMaxHeight() { + return delegate.getHeight(); + } + + @Override + public ChunkGenerator getGenerator() { + return null; + } + + @Override + public String getName() { + return null; + } + + @Override + public UUID getUID() { + return null; + } + + @Override + public boolean isChunkGenerated(int x, int z) { + return false; + } + + @Override + public Chunk getChunkAt(int x, int z) { + return null; + } + + @Override + public File getWorldFolder() { + return null; + } + + @Override + public Block getBlockAt(int x, int y, int z) { + return null; + } + + @Override + public Block getBlockAt(Location l) { + return null; + } + + @Override + public boolean generateTree(Location l, Tree vanillaTreeType) { + return false; + } + + @Override + public void spawn(Location location, Class entity, Consumer consumer) { + + } + + @Override + public Object getHandle() { + return null; + } +} From 70abf69dc78b1eb94a49f7948685c28b281bc1e0 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 13 Dec 2020 03:52:10 -0700 Subject: [PATCH 033/210] Terra on Fabric --- .../src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java | 2 +- .../terra/fabric/world/generator/FabricChunkGenerator.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 150693346..2ea905a41 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -73,7 +73,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public TerraWorld getWorld(World world) { - return null; + return new TerraWorld(world, getRegistry().get("DEFAULT"), this); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java index eb7fa984d..0d8232a60 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java @@ -55,6 +55,7 @@ public class FabricChunkGenerator implements ChunkGenerator { @Override public @Nullable TerraChunkGenerator getTerraGenerator() { + if(delegate instanceof FabricChunkGeneratorWrapper) return ((FabricChunkGeneratorWrapper) delegate).getHandle(); return null; } From a058f1c58bd79ee566e6f516eeb4704fa90738f7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 13 Dec 2020 15:21:55 -0700 Subject: [PATCH 034/210] BiomeGrid no longer needs World object. --- .../main/java/com/dfsek/terra/TerraWorld.java | 10 ++--- .../dfsek/terra/api/gaea/biome/BiomeGrid.java | 13 ++---- .../java/com/dfsek/terra/biome/BiomeZone.java | 5 +-- .../terra/biome/grid/SingleBiomeGrid.java | 5 +-- .../terra/biome/grid/UserDefinedGrid.java | 5 +-- .../biome/grid/master/TerraBiomeGrid.java | 5 +-- .../grid/master/TerraRadialBiomeGrid.java | 9 ++-- .../grid/master/TerraStandardBiomeGrid.java | 9 ++-- .../builder/biomegrid/BiomeGridBuilder.java | 3 +- .../builder/biomegrid/SingleGridBuilder.java | 5 +-- .../biomegrid/UserDefinedGridBuilder.java | 5 +-- .../dfsek/terra/fabric/TerraFabricPlugin.java | 5 ++- .../terra/fabric/codec/ConfigPackCodec.java | 19 ++++++++ .../fabric/world/FabricBiomeRegistry.java | 7 +++ .../terra/fabric/world/TerraBiomeSource.java | 45 +++++++++++++++++++ 15 files changed, 103 insertions(+), 47 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/codec/ConfigPackCodec.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeRegistry.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java diff --git a/common/src/main/java/com/dfsek/terra/TerraWorld.java b/common/src/main/java/com/dfsek/terra/TerraWorld.java index 8129e6e81..d25793411 100644 --- a/common/src/main/java/com/dfsek/terra/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/TerraWorld.java @@ -35,7 +35,7 @@ public class TerraWorld { String partName = template.getGrids().get(i); try { BiomeGridBuilder g = config.getBiomeGrid(partName); - BiomeGrid b = g.build(w, c); + BiomeGrid b = g.build(w.getSeed(), c); definedGrids[i] = b; } catch(NullPointerException e) { safe = false; @@ -46,12 +46,12 @@ public class TerraWorld { main.getLogger().severe("Terrain will NOT generate properly at this point. Correct your config before using your server!"); } } - zone = new BiomeZone(w, c, definedGrids); + zone = new BiomeZone(w.getSeed(), c, definedGrids); if(template.getGridType().equals(TerraBiomeGrid.Type.RADIAL)) { - BiomeGrid internal = config.getBiomeGrid(template.getRadialInternalGrid()).build(w, c); - grid = new TerraRadialBiomeGrid(w, template.getGridFreqX(), template.getGridFreqZ(), zone, config, template.getRadialGridRadius(), internal); - } else grid = new TerraStandardBiomeGrid(w, template.getGridFreqX(), template.getGridFreqZ(), zone, config); + BiomeGrid internal = config.getBiomeGrid(template.getRadialInternalGrid()).build(w.getSeed(), c); + grid = new TerraRadialBiomeGrid(w.getSeed(), template.getGridFreqX(), template.getGridFreqZ(), zone, config, template.getRadialGridRadius(), internal); + } else grid = new TerraStandardBiomeGrid(w.getSeed(), template.getGridFreqX(), template.getGridFreqZ(), zone, config); } public static boolean isTerraWorld(World w) { diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java b/common/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java index ef106fde0..9c2bfc51d 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java @@ -2,24 +2,21 @@ package com.dfsek.terra.api.gaea.biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Location; public abstract class BiomeGrid { private final FastNoiseLite noiseX; private final FastNoiseLite noiseZ; - private final World world; private final int sizeX; private final int sizeZ; private Biome[][] grid; - public BiomeGrid(World w, double freq1, double freq2, int sizeX, int sizeZ) { + public BiomeGrid(long seed, double freq1, double freq2, int sizeX, int sizeZ) { this.sizeX = sizeX; this.sizeZ = sizeZ; - this.world = w; - this.noiseX = new FastNoiseLite((int) w.getSeed()); - this.noiseZ = new FastNoiseLite((int) w.getSeed() + 1); + this.noiseX = new FastNoiseLite((int) seed); + this.noiseZ = new FastNoiseLite((int) seed + 1); this.noiseX.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); this.noiseX.setFractalType(FastNoiseLite.FractalType.FBm); this.noiseX.setFractalOctaves(4); @@ -96,10 +93,6 @@ public abstract class BiomeGrid { return grid[normalize(biomeNoise, sizeX)][normalize(climateNoise, sizeZ)]; } - public World getWorld() { - return world; - } - public int getSizeX() { return sizeX; } diff --git a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java index e93d28b37..d9535363b 100644 --- a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java +++ b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java @@ -3,7 +3,6 @@ package com.dfsek.terra.biome; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.biome.NormalizationUtil; import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.image.ImageLoader; @@ -22,8 +21,8 @@ public class BiomeZone { private final boolean useImage; private final ImageLoader.Channel channel; - public BiomeZone(World w, ConfigPack wc, BiomeGrid[] grids) { - this.noise = new FastNoiseLite((int) w.getSeed() + 2); + public BiomeZone(long seed, ConfigPack wc, BiomeGrid[] grids) { + this.noise = new FastNoiseLite((int) seed + 2); this.noise.setNoiseType(FastNoiseLite.NoiseType.OpenSimplex2); this.noise.setFractalType(FastNoiseLite.FractalType.FBm); this.noise.setFractalOctaves(4); diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java index c4412cd53..ef203f355 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java @@ -3,7 +3,6 @@ package com.dfsek.terra.biome.grid; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Location; /** @@ -12,8 +11,8 @@ import com.dfsek.terra.api.generic.world.vector.Location; public class SingleBiomeGrid extends BiomeGrid { private final Biome biome; - public SingleBiomeGrid(World w, Biome biome) { - super(w, 0, 0, 1, 1); + public SingleBiomeGrid(long seed, Biome biome) { + super(seed, 0, 0, 1, 1); this.biome = biome; } diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java index 61cbd749d..b86a55611 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java @@ -4,7 +4,6 @@ import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.biome.NormalizationUtil; import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; @@ -16,8 +15,8 @@ public class UserDefinedGrid extends BiomeGrid { private final ImageLoader.Channel channelX; private final ImageLoader.Channel channelZ; - public UserDefinedGrid(World w, double freq1, double freq2, Biome[][] b, ConfigPack c) { - super(w, freq1, freq2, b.length, b[0].length); + public UserDefinedGrid(long seed, double freq1, double freq2, Biome[][] b, ConfigPack c) { + super(seed, freq1, freq2, b.length, b[0].length); super.setGrid(b); ConfigPackTemplate t = c.getTemplate(); imageLoader = t.getImageLoader(); diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java index 6968a13e9..43a81a2e9 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java @@ -1,12 +1,11 @@ package com.dfsek.terra.biome.grid.master; import com.dfsek.terra.api.gaea.biome.BiomeGrid; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.grid.UserDefinedGrid; public abstract class TerraBiomeGrid extends BiomeGrid { - public TerraBiomeGrid(World w, double freq1, double freq2, int sizeX, int sizeZ) { - super(w, freq1, freq2, sizeX, sizeZ); + public TerraBiomeGrid(long seed, double freq1, double freq2, int sizeX, int sizeZ) { + super(seed, freq1, freq2, sizeX, sizeZ); } public abstract UserDefinedGrid getGrid(int x, int z); diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java index a55953071..6381c85f8 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java @@ -3,7 +3,6 @@ package com.dfsek.terra.biome.grid.master; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.BiomeZone; @@ -23,15 +22,15 @@ public class TerraRadialBiomeGrid extends TerraBiomeGrid { private CoordinatePerturb perturb; private ErosionNoise erode; - public TerraRadialBiomeGrid(World w, double freq1, double freq2, BiomeZone zone, ConfigPack c, double radius, BiomeGrid internal) { - super(w, freq1, freq2, 0, 0); + public TerraRadialBiomeGrid(long seed, double freq1, double freq2, BiomeZone zone, ConfigPack c, double radius, BiomeGrid internal) { + super(seed, freq1, freq2, 0, 0); ConfigPackTemplate t = c.getTemplate(); if(c.getTemplate().isBlend()) { - perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), w.getSeed()); + perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), seed); } this.zone = zone; if(c.getTemplate().isErode()) { - erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), w.getSeed()); + erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), seed); } this.radiusSq = FastMath.pow2(radius); this.internal = internal; diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java index e23838eba..d1f33df60 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java @@ -2,7 +2,6 @@ package com.dfsek.terra.biome.grid.master; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector2; import com.dfsek.terra.biome.BiomeZone; @@ -19,15 +18,15 @@ public class TerraStandardBiomeGrid extends TerraBiomeGrid { private CoordinatePerturb perturb; private ErosionNoise erode; - public TerraStandardBiomeGrid(World w, double freq1, double freq2, BiomeZone zone, ConfigPack c) { - super(w, freq1, freq2, 0, 0); + public TerraStandardBiomeGrid(long seed, double freq1, double freq2, BiomeZone zone, ConfigPack c) { + super(seed, freq1, freq2, 0, 0); ConfigPackTemplate t = c.getTemplate(); if(c.getTemplate().isBlend()) { - perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), w.getSeed()); + perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), seed); } this.zone = zone; if(c.getTemplate().isErode()) { - erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), w.getSeed()); + erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), seed); } } diff --git a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java index 6960a605e..e0c402088 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java @@ -1,9 +1,8 @@ package com.dfsek.terra.config.builder.biomegrid; import com.dfsek.terra.api.gaea.biome.BiomeGrid; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.config.base.ConfigPack; public interface BiomeGridBuilder { - BiomeGrid build(World world, ConfigPack config); + BiomeGrid build(long seed, ConfigPack config); } diff --git a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java index 121e7c8dc..8e03874a1 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java @@ -1,7 +1,6 @@ package com.dfsek.terra.config.builder.biomegrid; import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.grid.SingleBiomeGrid; import com.dfsek.terra.config.base.ConfigPack; @@ -13,7 +12,7 @@ public class SingleGridBuilder implements BiomeGridBuilder { } @Override - public SingleBiomeGrid build(World world, ConfigPack config) { - return new SingleBiomeGrid(world, biome); + public SingleBiomeGrid build(long seed, ConfigPack config) { + return new SingleBiomeGrid(seed, biome); } } diff --git a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java index fcbef2910..0dbda3288 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java @@ -1,7 +1,6 @@ package com.dfsek.terra.config.builder.biomegrid; import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.grid.UserDefinedGrid; import com.dfsek.terra.config.base.ConfigPack; @@ -12,8 +11,8 @@ public class UserDefinedGridBuilder implements BiomeGridBuilder { private Biome[][] biomes; @Override - public UserDefinedGrid build(World world, ConfigPack config) { - return new UserDefinedGrid(world, 1D / xFreq, 1D / zFreq, biomes, config); + public UserDefinedGrid build(long seed, ConfigPack config) { + return new UserDefinedGrid(seed, 1D / xFreq, 1D / zFreq, biomes, config); } public double getXFreq() { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 2ea905a41..898ba09c2 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -16,6 +16,7 @@ import com.dfsek.terra.fabric.inventory.FabricItemHandle; import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; import com.dfsek.terra.fabric.world.FabricBiome; import com.dfsek.terra.fabric.world.FabricWorldHandle; +import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.world.generator.TerraChunkGeneratorCodec; import com.dfsek.terra.registry.ConfigRegistry; @@ -24,7 +25,6 @@ import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.world.GeneratorType; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; -import net.minecraft.world.biome.source.VanillaLayeredBiomeSource; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.chunk.FlatChunkGeneratorConfig; @@ -45,7 +45,8 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { new StructuresConfig(Optional.empty(), Collections.emptyMap()), biomeRegistry); config.updateLayerBlocks(); - return new FabricChunkGeneratorWrapper(new VanillaLayeredBiomeSource(seed, false, false, biomeRegistry), seed); + + return new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed), seed); } }; private final TerraChunkGeneratorCodec chunkGeneratorCodec = new TerraChunkGeneratorCodec(this); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/codec/ConfigPackCodec.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/codec/ConfigPackCodec.java new file mode 100644 index 000000000..f2b0eae2b --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/codec/ConfigPackCodec.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.fabric.codec; + +import com.dfsek.terra.config.base.ConfigPack; +import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.DataResult; +import com.mojang.serialization.DynamicOps; + +public class ConfigPackCodec implements Codec { + @Override + public DataResult> decode(DynamicOps ops, T input) { + return null; + } + + @Override + public DataResult encode(ConfigPack input, DynamicOps ops, T prefix) { + return null; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeRegistry.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeRegistry.java new file mode 100644 index 000000000..007a2767d --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeRegistry.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.registry.TerraRegistry; +import net.minecraft.world.biome.Biome; + +public class FabricBiomeRegistry extends TerraRegistry { +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java new file mode 100644 index 000000000..0d09d9fdf --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java @@ -0,0 +1,45 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.RegistryLookupCodec; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.BiomeSource; + +import java.util.stream.Collectors; + +public class TerraBiomeSource extends BiomeSource { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( + RegistryLookupCodec.of(Registry.BIOME_KEY).forGetter(source -> source.biomeRegistry), + Codec.LONG.fieldOf("seed").stable().forGetter(source -> source.seed)) + .apply(instance, instance.stable(TerraBiomeSource::new))); + + private final Registry biomeRegistry; + private final long seed; + private final TerraPlugin main; + + public TerraBiomeSource(Registry biomes, long seed) { + super(biomes.stream().collect(Collectors.toList())); + this.biomeRegistry = biomes; + this.seed = seed; + this.main = TerraFabricPlugin.getInstance(); + } + + @Override + protected Codec getCodec() { + return CODEC; + } + + @Override + public BiomeSource withSeed(long seed) { + return new TerraBiomeSource(this.biomeRegistry, seed); + } + + @Override + public Biome getBiomeForNoiseGen(int biomeX, int biomeY, int biomeZ) { + return null; + } +} From f609727afb825ff1bace6e90d51adfc6e70f9701 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 13 Dec 2020 17:18:19 -0700 Subject: [PATCH 035/210] Vanilla biome setting (sort of) works on Fabric now --- .../main/java/com/dfsek/terra/TerraWorld.java | 39 ++----------- .../generator/TerraChunkGenerator.java | 4 +- .../biome/grid/master/TerraBiomeGrid.java | 55 ++++++++++++++++++- .../grid/master/TerraRadialBiomeGrid.java | 4 +- .../grid/master/TerraStandardBiomeGrid.java | 4 +- .../terra/generation/TerraChunkGenerator.java | 28 ++++++---- .../BukkitChunkGeneratorWrapper.java | 4 +- .../dfsek/terra/fabric/TerraFabricPlugin.java | 12 +++- .../dfsek/terra/fabric/world/FabricBiome.java | 11 +++- .../terra/fabric/world/FabricBiomeGrid.java | 32 ----------- .../terra/fabric/world/TerraBiomeSource.java | 18 ++++-- .../FabricChunkGeneratorWrapper.java | 15 +++-- 12 files changed, 125 insertions(+), 101 deletions(-) delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeGrid.java diff --git a/common/src/main/java/com/dfsek/terra/TerraWorld.java b/common/src/main/java/com/dfsek/terra/TerraWorld.java index d25793411..8cb4c4392 100644 --- a/common/src/main/java/com/dfsek/terra/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/TerraWorld.java @@ -1,57 +1,26 @@ package com.dfsek.terra; -import com.dfsek.terra.api.gaea.biome.BiomeGrid; import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import com.dfsek.terra.biome.grid.master.TerraRadialBiomeGrid; -import com.dfsek.terra.biome.grid.master.TerraStandardBiomeGrid; import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.config.base.ConfigPackTemplate; -import com.dfsek.terra.config.builder.biomegrid.BiomeGridBuilder; -import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.TerraChunkGenerator; public class TerraWorld { private final TerraBiomeGrid grid; private final BiomeZone zone; private final ConfigPack config; - private boolean safe; + private final boolean safe; private final TerraProfiler profiler; public TerraWorld(World w, ConfigPack c, TerraPlugin main) { - safe = true; config = c; profiler = new TerraProfiler(w); - - ConfigPackTemplate template = config.getTemplate(); - - int zoneSize = template.getGrids().size(); - - BiomeGrid[] definedGrids = new BiomeGrid[zoneSize]; - for(int i = 0; i < zoneSize; i++) { - String partName = template.getGrids().get(i); - try { - BiomeGridBuilder g = config.getBiomeGrid(partName); - BiomeGrid b = g.build(w.getSeed(), c); - definedGrids[i] = b; - } catch(NullPointerException e) { - safe = false; - Debug.stack(e); - main.getLogger().severe("No such BiomeGrid " + partName); - main.getLogger().severe("Please check configuration files for errors. Configuration errors will have been reported during initialization."); - main.getLogger().severe("ONLY report this to Terra if you are SURE your config is error-free."); - main.getLogger().severe("Terrain will NOT generate properly at this point. Correct your config before using your server!"); - } - } - zone = new BiomeZone(w.getSeed(), c, definedGrids); - - if(template.getGridType().equals(TerraBiomeGrid.Type.RADIAL)) { - BiomeGrid internal = config.getBiomeGrid(template.getRadialInternalGrid()).build(w.getSeed(), c); - grid = new TerraRadialBiomeGrid(w.getSeed(), template.getGridFreqX(), template.getGridFreqZ(), zone, config, template.getRadialGridRadius(), internal); - } else grid = new TerraStandardBiomeGrid(w.getSeed(), template.getGridFreqX(), template.getGridFreqZ(), zone, config); + this.grid = new TerraBiomeGrid.TerraBiomeGridBuilder(w.getSeed(), c, main).build(); + this.zone = grid.getZone(); + safe = true; } public static boolean isTerraWorld(World w) { diff --git a/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java b/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java index 1fd8baf04..8657b5aa7 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java @@ -11,7 +11,9 @@ import java.util.List; import java.util.Random; public interface TerraChunkGenerator { - ChunkGenerator.ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome, ChunkGenerator.ChunkData original); + ChunkGenerator.ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, ChunkGenerator.ChunkData original); + + void generateBiomes(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome); void attachProfiler(WorldProfiler profiler); diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java index 43a81a2e9..359118611 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java @@ -1,11 +1,24 @@ package com.dfsek.terra.biome.grid.master; import com.dfsek.terra.api.gaea.biome.BiomeGrid; +import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.UserDefinedGrid; +import com.dfsek.terra.config.base.ConfigPack; +import com.dfsek.terra.config.base.ConfigPackTemplate; +import com.dfsek.terra.config.builder.biomegrid.BiomeGridBuilder; +import com.dfsek.terra.debug.Debug; public abstract class TerraBiomeGrid extends BiomeGrid { - public TerraBiomeGrid(long seed, double freq1, double freq2, int sizeX, int sizeZ) { + protected final BiomeZone zone; + + public TerraBiomeGrid(long seed, double freq1, double freq2, int sizeX, int sizeZ, BiomeZone zone) { super(seed, freq1, freq2, sizeX, sizeZ); + this.zone = zone; + } + + public BiomeZone getZone() { + return zone; } public abstract UserDefinedGrid getGrid(int x, int z); @@ -13,4 +26,44 @@ public abstract class TerraBiomeGrid extends BiomeGrid { public enum Type { RADIAL, STANDARD } + + public static final class TerraBiomeGridBuilder { + private final long seed; + private final ConfigPack config; + private final TerraPlugin main; + + public TerraBiomeGridBuilder(long seed, ConfigPack config, TerraPlugin main) { + this.seed = seed; + this.config = config; + this.main = main; + } + + public TerraBiomeGrid build() { + ConfigPackTemplate template = config.getTemplate(); + + int zoneSize = template.getGrids().size(); + + BiomeGrid[] definedGrids = new BiomeGrid[zoneSize]; + for(int i = 0; i < zoneSize; i++) { + String partName = template.getGrids().get(i); + try { + BiomeGridBuilder g = config.getBiomeGrid(partName); + BiomeGrid b = g.build(seed, config); + definedGrids[i] = b; + } catch(NullPointerException e) { + Debug.stack(e); + main.getLogger().severe("No such BiomeGrid " + partName); + main.getLogger().severe("Please check configuration files for errors. Configuration errors will have been reported during initialization."); + main.getLogger().severe("ONLY report this to Terra if you are SURE your config is error-free."); + main.getLogger().severe("Terrain will NOT generate properly at this point. Correct your config before using your server!"); + } + } + BiomeZone zone = new BiomeZone(seed, config, definedGrids); + + if(template.getGridType().equals(TerraBiomeGrid.Type.RADIAL)) { + BiomeGrid internal = config.getBiomeGrid(template.getRadialInternalGrid()).build(seed, config); + return new TerraRadialBiomeGrid(seed, template.getGridFreqX(), template.getGridFreqZ(), zone, config, template.getRadialGridRadius(), internal); + } else return new TerraStandardBiomeGrid(seed, template.getGridFreqX(), template.getGridFreqZ(), zone, config); + } + } } diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java index 6381c85f8..047d9c4ec 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java @@ -16,19 +16,17 @@ import net.jafama.FastMath; public class TerraRadialBiomeGrid extends TerraBiomeGrid { private static final int failNum = 0; - private final BiomeZone zone; private final double radiusSq; private final BiomeGrid internal; private CoordinatePerturb perturb; private ErosionNoise erode; public TerraRadialBiomeGrid(long seed, double freq1, double freq2, BiomeZone zone, ConfigPack c, double radius, BiomeGrid internal) { - super(seed, freq1, freq2, 0, 0); + super(seed, freq1, freq2, 0, 0, zone); ConfigPackTemplate t = c.getTemplate(); if(c.getTemplate().isBlend()) { perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), seed); } - this.zone = zone; if(c.getTemplate().isErode()) { erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), seed); } diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java index d1f33df60..db5c730a9 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java @@ -14,17 +14,15 @@ import com.dfsek.terra.config.base.ConfigPackTemplate; public class TerraStandardBiomeGrid extends TerraBiomeGrid { private static final int failNum = 0; - private final BiomeZone zone; private CoordinatePerturb perturb; private ErosionNoise erode; public TerraStandardBiomeGrid(long seed, double freq1, double freq2, BiomeZone zone, ConfigPack c) { - super(seed, freq1, freq2, 0, 0); + super(seed, freq1, freq2, 0, 0, zone); ConfigPackTemplate t = c.getTemplate(); if(c.getTemplate().isBlend()) { perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), seed); } - this.zone = zone; if(c.getTemplate().isErode()) { erode = new ErosionNoise(t.getErodeFreq(), t.getErodeThresh(), t.getErodeOctaves(), seed); } diff --git a/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index 51ebaf6b7..f6ba10733 100644 --- a/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -114,7 +114,7 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato @Override @SuppressWarnings({"try"}) - public ChunkGenerator.ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome, ChunkGenerator.ChunkData chunk) { + public ChunkGenerator.ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, ChunkGenerator.ChunkData chunk) { TerraWorld tw = main.getWorld(world); com.dfsek.terra.api.gaea.biome.BiomeGrid grid = tw.getGrid(); try(ProfileFuture ignore = tw.getProfiler().measure("TotalChunkGenTime")) { @@ -177,21 +177,27 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato } } } - int xOrig = (chunkX << 4); - int zOrig = (chunkZ << 4); - for(int x = 0; x < 4; x++) { - for(byte z = 0; z < 4; z++) { - int cx = xOrig + (x << 2); - int cz = zOrig + (z << 2); - Biome b = grid.getBiome(cx, cz, GenerationPhase.PALETTE_APPLY); - biome.setBiome(x << 2, z << 2, b.getVanillaBiome()); - } - } return chunk; } } + @Override + public void generateBiomes(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome) { + int xOrig = (chunkX << 4); + int zOrig = (chunkZ << 4); + com.dfsek.terra.api.gaea.biome.BiomeGrid grid = main.getWorld(world).getGrid(); + for(int x = 0; x < 4; x++) { + for(byte z = 0; z < 4; z++) { + int cx = xOrig + (x << 2); + int cz = zOrig + (z << 2); + Biome b = grid.getBiome(cx, cz, GenerationPhase.PALETTE_APPLY); + + biome.setBiome(x << 2, z << 2, b.getVanillaBiome()); + } + } + } + public void attachProfiler(WorldProfiler p) { popMan.attachProfiler(p); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index 3db599504..c1845f92c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -23,8 +23,8 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Handl @Override public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { BukkitWorld bukkitWorld = new BukkitWorld(world); - - return (ChunkData) delegate.generateChunkData(bukkitWorld, random, x, z, new BukkitBiomeGrid(biome), new BukkitChunkGenerator.BukkitChunkData(createChunkData(world))).getHandle(); + delegate.generateBiomes(bukkitWorld, random, x, z, new BukkitBiomeGrid(biome)); + return (ChunkData) delegate.generateChunkData(bukkitWorld, random, x, z, new BukkitChunkGenerator.BukkitChunkData(createChunkData(world))).getHandle(); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 898ba09c2..56443ba75 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -23,6 +23,8 @@ import com.dfsek.terra.registry.ConfigRegistry; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.world.GeneratorType; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -127,7 +129,15 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { registry .registerLoader(BlockData.class, (t, o, l) -> worldHandle.createBlockData((String) o)) .registerLoader(MaterialData.class, (t, o, l) -> worldHandle.createMaterialData((String) o)) - .registerLoader(com.dfsek.terra.api.generic.world.Biome.class, (t, o, l) -> new FabricBiome()); + .registerLoader(com.dfsek.terra.api.generic.world.Biome.class, (t, o, l) -> { + String id = (String) o; + if(!id.contains(":")) id = "minecraft:" + id.toLowerCase(); + Identifier identifier = new Identifier(id); + logger.info("Registering Vanilla biome: " + o.toString() + " with ID " + identifier + "/" + id); + Biome biome = BuiltinRegistries.BIOME.get(identifier); + logger.info("Found " + biome + " in registry."); + return new FabricBiome(biome); + }); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java index 735b006ca..d804bf3b3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java @@ -3,8 +3,15 @@ package com.dfsek.terra.fabric.world; import com.dfsek.terra.api.generic.world.Biome; public class FabricBiome implements Biome { + private final net.minecraft.world.biome.Biome delegate; + + public FabricBiome(net.minecraft.world.biome.Biome delegate) { + this.delegate = delegate; + } + + @Override - public Object getHandle() { - return null; + public net.minecraft.world.biome.Biome getHandle() { + return delegate; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeGrid.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeGrid.java deleted file mode 100644 index 58a1f7d90..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeGrid.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.dfsek.terra.fabric.world; - -import com.dfsek.terra.api.generic.world.Biome; -import com.dfsek.terra.api.generic.world.BiomeGrid; -import org.jetbrains.annotations.NotNull; - -public class FabricBiomeGrid implements BiomeGrid { - @Override - public @NotNull Biome getBiome(int x, int z) { - return new FabricBiome(); - } - - @Override - public @NotNull Biome getBiome(int x, int y, int z) { - return new FabricBiome(); - } - - @Override - public void setBiome(int x, int z, @NotNull Biome bio) { - - } - - @Override - public void setBiome(int x, int y, int z, @NotNull Biome bio) { - - } - - @Override - public Object getHandle() { - return null; - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java index 0d09d9fdf..76a478495 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java @@ -1,6 +1,7 @@ package com.dfsek.terra.fabric.world; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -8,6 +9,7 @@ import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryLookupCodec; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.source.BiomeSource; +import net.minecraft.world.gen.feature.StructureFeature; import java.util.stream.Collectors; @@ -19,13 +21,13 @@ public class TerraBiomeSource extends BiomeSource { private final Registry biomeRegistry; private final long seed; - private final TerraPlugin main; + private final TerraBiomeGrid grid; public TerraBiomeSource(Registry biomes, long seed) { super(biomes.stream().collect(Collectors.toList())); this.biomeRegistry = biomes; this.seed = seed; - this.main = TerraFabricPlugin.getInstance(); + this.grid = new TerraBiomeGrid.TerraBiomeGridBuilder(seed, TerraFabricPlugin.getInstance().getRegistry().get("DEFAULT"), TerraFabricPlugin.getInstance()).build(); } @Override @@ -40,6 +42,14 @@ public class TerraBiomeSource extends BiomeSource { @Override public Biome getBiomeForNoiseGen(int biomeX, int biomeY, int biomeZ) { - return null; + FabricBiome biome = ((FabricBiome) grid.getBiome(biomeX * 4, biomeZ * 4, GenerationPhase.BASE).getVanillaBiome()); + return biome.getHandle(); } + + @Override + public boolean hasStructureFeature(StructureFeature feature) { + return false; + } + + } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index 9ac8e1e8f..586c843e0 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -3,7 +3,7 @@ package com.dfsek.terra.fabric.world.generator; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.generic.Handle; import com.dfsek.terra.fabric.TerraFabricPlugin; -import com.dfsek.terra.fabric.world.FabricBiomeGrid; +import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.handles.FabricSeededWorldAccess; import com.dfsek.terra.generation.TerraChunkGenerator; import com.mojang.serialization.Codec; @@ -14,7 +14,6 @@ import net.minecraft.world.BlockView; import net.minecraft.world.ChunkRegion; import net.minecraft.world.Heightmap; import net.minecraft.world.WorldAccess; -import net.minecraft.world.biome.source.BiomeSource; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.gen.chunk.ChunkGenerator; @@ -24,15 +23,18 @@ import net.minecraft.world.gen.chunk.VerticalBlockSample; public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handle { private final long seed; private final TerraChunkGenerator delegate; + private final TerraBiomeSource biomeSource; private final Codec codec = RecordCodecBuilder.create(instance -> instance.group( - BiomeSource.CODEC.fieldOf("biome_source").forGetter(generator -> generator.biomeSource), + TerraBiomeSource.CODEC.fieldOf("biome_source").forGetter(generator -> generator.biomeSource), Codec.LONG.fieldOf("seed").stable().forGetter(generator -> generator.seed)) .apply(instance, instance.stable(FabricChunkGeneratorWrapper::new))); - public FabricChunkGeneratorWrapper(BiomeSource biomeSource, long seed) { + public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed) { super(biomeSource, new StructuresConfig(false)); + this.delegate = new TerraChunkGenerator(TerraFabricPlugin.getInstance().getRegistry().get("DEFAULT"), TerraFabricPlugin.getInstance()); delegate.getMain().getLogger().info("Loading world..."); + this.biomeSource = biomeSource; this.seed = seed; } @@ -49,7 +51,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl @Override public ChunkGenerator withSeed(long seed) { - return new FabricChunkGeneratorWrapper(this.biomeSource.withSeed(seed), seed); + return new FabricChunkGeneratorWrapper((TerraBiomeSource) this.biomeSource.withSeed(seed), seed); } @Override @@ -59,7 +61,8 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl @Override public void populateNoise(WorldAccess world, StructureAccessor accessor, Chunk chunk) { - delegate.generateChunkData(new FabricSeededWorldAccess(world, seed, this), new FastRandom(), chunk.getPos().x, chunk.getPos().z, new FabricBiomeGrid(), new FabricChunkData(chunk)); + FabricSeededWorldAccess worldAccess = new FabricSeededWorldAccess(world, seed, this); + delegate.generateChunkData(worldAccess, new FastRandom(), chunk.getPos().x, chunk.getPos().z, new FabricChunkData(chunk)); } @Override From 582bde8d0e90093864965a942c0909b22e922e33 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 13 Dec 2020 21:16:33 -0700 Subject: [PATCH 036/210] register features --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 35 +++++++++--------- .../FabricChunkGeneratorWrapper.java | 33 ++++++++++++++++- .../world/handles/FabricWorldChunkRegion.java | 37 ++++++++++++++----- 3 files changed, 76 insertions(+), 29 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 56443ba75..09c72b745 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -20,6 +20,7 @@ import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.world.generator.TerraChunkGeneratorCodec; import com.dfsek.terra.registry.ConfigRegistry; +import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.client.world.GeneratorType; @@ -29,28 +30,14 @@ import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; -import net.minecraft.world.gen.chunk.FlatChunkGeneratorConfig; -import net.minecraft.world.gen.chunk.StructuresConfig; import java.io.File; import java.io.IOException; -import java.util.Collections; -import java.util.Optional; +import java.util.logging.Level; import java.util.logging.Logger; public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private static TerraFabricPlugin instance; - private final GeneratorType TERRA = new GeneratorType("terra") { - @Override - protected ChunkGenerator getChunkGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed) { - FlatChunkGeneratorConfig config = new FlatChunkGeneratorConfig( - new StructuresConfig(Optional.empty(), Collections.emptyMap()), biomeRegistry); - config.updateLayerBlocks(); - - - return new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed), seed); - } - }; private final TerraChunkGeneratorCodec chunkGeneratorCodec = new TerraChunkGeneratorCodec(this); public static TerraFabricPlugin getInstance() { @@ -64,6 +51,10 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final ConfigRegistry registry = new ConfigRegistry(); private File config; + { + logger.setLevel(Level.INFO); + } + @Override public WorldHandle getWorldHandle() { return worldHandle; @@ -133,9 +124,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { String id = (String) o; if(!id.contains(":")) id = "minecraft:" + id.toLowerCase(); Identifier identifier = new Identifier(id); - logger.info("Registering Vanilla biome: " + o.toString() + " with ID " + identifier + "/" + id); Biome biome = BuiltinRegistries.BIOME.get(identifier); - logger.info("Found " + biome + " in registry."); return new FabricBiome(biome); }); } @@ -146,8 +135,18 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { config = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); LangUtil.load("en_us", this); logger.info("Initializing Terra..."); - GeneratorTypeAccessor.getValues().add(TERRA); registry.loadAll(this); + + if(FabricLoader.getInstance().getEnvironmentType().equals(EnvType.CLIENT)) { + GeneratorTypeAccessor.getValues().add(new GeneratorType("terra") { + @Override + protected ChunkGenerator getChunkGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed) { + return new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed), seed); + } + }); + } + Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC); + Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), TerraBiomeSource.CODEC); } public TerraChunkGeneratorCodec getChunkGeneratorCodec() { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index 586c843e0..a834d8f92 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -2,6 +2,7 @@ package com.dfsek.terra.fabric.world.generator; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.handles.FabricSeededWorldAccess; @@ -10,11 +11,16 @@ import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.structure.StructureManager; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.world.BlockView; import net.minecraft.world.ChunkRegion; import net.minecraft.world.Heightmap; import net.minecraft.world.WorldAccess; +import net.minecraft.world.biome.source.BiomeAccess; import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.StructuresConfig; @@ -24,7 +30,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl private final long seed; private final TerraChunkGenerator delegate; private final TerraBiomeSource biomeSource; - private final Codec codec = RecordCodecBuilder.create(instance -> instance.group( + public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( TerraBiomeSource.CODEC.fieldOf("biome_source").forGetter(generator -> generator.biomeSource), Codec.LONG.fieldOf("seed").stable().forGetter(generator -> generator.seed)) .apply(instance, instance.stable(FabricChunkGeneratorWrapper::new))); @@ -46,7 +52,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl @Override protected Codec getCodec() { - return codec; + return CODEC; } @Override @@ -65,6 +71,29 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl delegate.generateChunkData(worldAccess, new FastRandom(), chunk.getPos().x, chunk.getPos().z, new FabricChunkData(chunk)); } + @Override + public void carve(long seed, BiomeAccess access, Chunk chunk, GenerationStep.Carver carver) { + // No caves + } + + @Override + public void generateFeatures(ChunkRegion region, StructureAccessor accessor) { + for(TerraBlockPopulator populator : delegate.getPopulators()) { + //populator.populate(); + } + // Nope + } + + @Override + public void setStructureStarts(DynamicRegistryManager dynamicRegistryManager, StructureAccessor structureAccessor, Chunk chunk, StructureManager structureManager, long worldSeed) { + + } + + @Override + public boolean isStrongholdStartingChunk(ChunkPos chunkPos) { + return false; + } + @Override public int getHeight(int x, int z, Heightmap.Type heightmapType) { return 0; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldChunkRegion.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldChunkRegion.java index 5c28ccc97..104a233e9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldChunkRegion.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldChunkRegion.java @@ -7,6 +7,7 @@ import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.world.ChunkRegion; import java.io.File; @@ -14,40 +15,40 @@ import java.util.UUID; import java.util.function.Consumer; public class FabricWorldChunkRegion implements World { - private final ChunkRegion delegate; + private final Handle delegate; - public FabricWorldChunkRegion(ChunkRegion delegate) { - this.delegate = delegate; + public FabricWorldChunkRegion(ChunkRegion delegate, net.minecraft.world.gen.chunk.ChunkGenerator generator) { + this.delegate = new Handle(delegate, generator); } @Override public long getSeed() { - return delegate.getSeed(); + return delegate.getChunk().getSeed(); } @Override public int getMaxHeight() { - return delegate.getHeight(); + return delegate.getChunk().getHeight(); } @Override public ChunkGenerator getGenerator() { - return null; + return new FabricChunkGenerator(delegate.getGenerator()); } @Override public String getName() { - return null; + return getWorldFolder().getName(); } @Override public UUID getUID() { - return null; + return UUID.randomUUID(); } @Override public boolean isChunkGenerated(int x, int z) { - return false; + return delegate.chunk.isChunkLoaded(x, z); } @Override @@ -84,4 +85,22 @@ public class FabricWorldChunkRegion implements World { public Object getHandle() { return null; } + + public static final class Handle { + private final ChunkRegion chunk; + private final net.minecraft.world.gen.chunk.ChunkGenerator generator; + + public Handle(ChunkRegion chunk, net.minecraft.world.gen.chunk.ChunkGenerator generator) { + this.chunk = chunk; + this.generator = generator; + } + + public net.minecraft.world.gen.chunk.ChunkGenerator getGenerator() { + return generator; + } + + public ChunkRegion getChunk() { + return chunk; + } + } } From a01dee9a27309ebb0d4e092949ff850e2d8179d0 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 13 Dec 2020 22:40:57 -0700 Subject: [PATCH 037/210] Custom carving implemented in Fabric --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 5 +- .../terra/fabric/world/BlockStorage.java | 30 ------------ .../terra/fabric/world/FabricAdapters.java | 4 ++ .../dfsek/terra/fabric/world/FabricBlock.java | 46 ++++++++++++------ .../fabric/world/FabricMaterialData.java | 10 ++++ .../terra/fabric/world/FabricWorldHandle.java | 6 +-- .../FabricChunkGeneratorWrapper.java | 11 +++-- .../handles/chunk/FabricChunkRegionChunk.java | 47 +++++++++++++++++++ .../{ => world}/FabricSeededWorldAccess.java | 2 +- .../{ => world}/FabricWorldAccess.java | 2 +- .../{ => world}/FabricWorldChunkRegion.java | 2 +- 11 files changed, 110 insertions(+), 55 deletions(-) delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/BlockStorage.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/{ => world}/FabricSeededWorldAccess.java (98%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/{ => world}/FabricWorldAccess.java (97%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/{ => world}/FabricWorldChunkRegion.java (98%) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 09c72b745..e0c7d734e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -50,9 +50,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final WorldHandle worldHandle = new FabricWorldHandle(); private final ConfigRegistry registry = new ConfigRegistry(); private File config; + private final PluginConfig plugin; { logger.setLevel(Level.INFO); + plugin = new PluginConfig(); } @Override @@ -77,7 +79,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public PluginConfig getTerraConfig() { - return null; + return plugin; } @Override @@ -132,6 +134,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public void onInitialize() { instance = this; + plugin.load(this); config = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); LangUtil.load("en_us", this); logger.info("Initializing Terra..."); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/BlockStorage.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/BlockStorage.java deleted file mode 100644 index 21ef9280d..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/BlockStorage.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.dfsek.terra.fabric.world; - -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.fabric.world.handles.FabricWorldAccess; -import net.minecraft.block.Block; -import net.minecraft.world.WorldAccess; - -public class BlockStorage { - private final Block block; - private final Location location; - - public BlockStorage(Block block, Location location) { - this.block = block; - this.location = location; - } - - public Block getBlock() { - return block; - } - - public Location getLocation() { - return location; - } - - public WorldAccess getWorld() { - return ((FabricWorldAccess) location.getWorld()).getHandle(); - } - - -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java index 068a21b4a..1130ef6d5 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java @@ -7,4 +7,8 @@ public final class FabricAdapters { public static BlockPos fromVector(Vector3 v) { return new BlockPos(v.getBlockX(), v.getBlockY(), v.getBlockZ()); } + + public static Vector3 toVector(BlockPos pos) { + return new Vector3(pos.getX(), pos.getY(), pos.getZ()); + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java index 616e59562..1c71ced5e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java @@ -5,71 +5,87 @@ import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.WorldAccess; public class FabricBlock implements Block { - private final BlockStorage delegate; + private final Handle delegate; - public FabricBlock(BlockStorage block) { - this.delegate = block; + public FabricBlock(BlockState state, BlockPos position, WorldAccess worldAccess) { + this.delegate = new Handle(state, position, worldAccess); } @Override public void setBlockData(BlockData data, boolean physics) { - delegate.getWorld().setBlockState(FabricAdapters.fromVector(delegate.getLocation().getVector()), ((FabricBlockData) data).getHandle(), 0, 0); + delegate.worldAccess.setBlockState(delegate.position, ((FabricBlockData) data).getHandle(), 0, 0); } @Override public BlockData getBlockData() { - return null; + return new FabricBlockData(delegate.worldAccess.getBlockState(delegate.position)); } @Override public Block getRelative(BlockFace face) { - return null; + return getRelative(face, 1); } @Override public Block getRelative(BlockFace face, int len) { - return null; + return new FabricBlock(delegate.state, delegate.position.add(face.getModX(), face.getModY(), face.getModZ()), delegate.worldAccess); } @Override public boolean isEmpty() { - return false; + return delegate.state.isAir(); } @Override public Location getLocation() { - return delegate.getLocation(); + return FabricAdapters.toVector(delegate.position).toLocation(new FabricWorldAccess(delegate.worldAccess)); } @Override public MaterialData getType() { - return null; + return new FabricMaterialData(delegate.state.getMaterial()); } @Override public int getX() { - return delegate.getLocation().getBlockX(); + return delegate.position.getX(); } @Override public int getZ() { - return delegate.getLocation().getBlockZ(); + return delegate.position.getZ(); } @Override public int getY() { - return delegate.getLocation().getBlockY(); + return delegate.position.getY(); } @Override public boolean isPassable() { - return false; + return delegate.state.isAir(); } @Override - public BlockStorage getHandle() { + public Handle getHandle() { return delegate; } + + public static final class Handle { + private final BlockState state; + private final BlockPos position; + private final WorldAccess worldAccess; + + public Handle(BlockState state, BlockPos position, WorldAccess worldAccess) { + this.state = state; + this.position = position; + this.worldAccess = worldAccess; + } + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java index 75c18de15..656df27a1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java @@ -45,4 +45,14 @@ public class FabricMaterialData implements MaterialData { public Material getHandle() { return delegate; } + + @Override + public int hashCode() { + return delegate.hashCode(); + } + + @Override + public boolean equals(Object obj) { + return delegate.equals(obj); + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index 20ae43c54..f5930060c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -12,17 +12,17 @@ import net.minecraft.command.argument.BlockArgumentParser; public class FabricWorldHandle implements WorldHandle { @Override public void setBlockData(Block block, BlockData data, boolean physics) { - + block.setBlockData(data, physics); } @Override public BlockData getBlockData(Block block) { - return null; + return block.getBlockData(); } @Override public MaterialData getType(Block block) { - return null; + return block.getType(); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index a834d8f92..61b996202 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -1,12 +1,16 @@ package com.dfsek.terra.fabric.world.generator; +import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.generic.Handle; import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.world.TerraBiomeSource; -import com.dfsek.terra.fabric.world.handles.FabricSeededWorldAccess; +import com.dfsek.terra.fabric.world.handles.chunk.FabricChunkRegionChunk; +import com.dfsek.terra.fabric.world.handles.world.FabricSeededWorldAccess; +import com.dfsek.terra.fabric.world.handles.world.FabricWorldChunkRegion; import com.dfsek.terra.generation.TerraChunkGenerator; +import com.dfsek.terra.population.CavePopulator; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.block.BlockState; @@ -34,7 +38,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl TerraBiomeSource.CODEC.fieldOf("biome_source").forGetter(generator -> generator.biomeSource), Codec.LONG.fieldOf("seed").stable().forGetter(generator -> generator.seed)) .apply(instance, instance.stable(FabricChunkGeneratorWrapper::new))); - + private final CavePopulator cavePopulator = new CavePopulator(TerraFabricPlugin.getInstance()); public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed) { super(biomeSource, new StructuresConfig(false)); @@ -79,7 +83,8 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl @Override public void generateFeatures(ChunkRegion region, StructureAccessor accessor) { for(TerraBlockPopulator populator : delegate.getPopulators()) { - //populator.populate(); + FastRandom pop = new FastRandom(MathUtil.getCarverChunkSeed(region.getCenterChunkX(), region.getCenterChunkZ(), seed)); + cavePopulator.populate(new FabricWorldChunkRegion(region, this), pop, new FabricChunkRegionChunk(region)); } // Nope } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java new file mode 100644 index 000000000..5ae91e66f --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java @@ -0,0 +1,47 @@ +package com.dfsek.terra.fabric.world.handles.chunk; + +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.fabric.world.FabricBlock; +import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ChunkRegion; + +public class FabricChunkRegionChunk implements Chunk { + private final ChunkRegion chunkRegion; + private final int x; + private final int z; + + public FabricChunkRegionChunk(ChunkRegion chunkRegion) { + this.chunkRegion = chunkRegion; + this.x = chunkRegion.getCenterChunkX() << 4; + this.z = chunkRegion.getCenterChunkZ() << 4; + } + + @Override + public int getX() { + return chunkRegion.getCenterChunkX(); + } + + @Override + public int getZ() { + return chunkRegion.getCenterChunkZ(); + } + + @Override + public World getWorld() { + return new FabricWorldAccess(chunkRegion); + } + + @Override + public Block getBlock(int x, int y, int z) { + BlockPos pos = new BlockPos(x + this.x, y, z + this.z); + return new FabricBlock(chunkRegion.getBlockState(pos), pos, chunkRegion); + } + + @Override + public ChunkRegion getHandle() { + return chunkRegion; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java similarity index 98% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricSeededWorldAccess.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java index 4a7ef3c88..1ee9ffb18 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricSeededWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.world.handles; +package com.dfsek.terra.fabric.world.handles.world; import com.dfsek.terra.api.generic.Entity; import com.dfsek.terra.api.generic.Tree; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java similarity index 97% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldAccess.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index f526ecae9..ed5fd6eac 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.world.handles; +package com.dfsek.terra.fabric.world.handles.world; import com.dfsek.terra.api.generic.Entity; import com.dfsek.terra.api.generic.Tree; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldChunkRegion.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java similarity index 98% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldChunkRegion.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java index 104a233e9..9fa0aa98d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorldChunkRegion.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.world.handles; +package com.dfsek.terra.fabric.world.handles.world; import com.dfsek.terra.api.generic.Entity; import com.dfsek.terra.api.generic.Tree; From 6db4755109db99c04a207a9d7694937dbcf7a55d Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 13 Dec 2020 23:13:02 -0700 Subject: [PATCH 038/210] Fix biome gen --- .../dfsek/terra/fabric/world/TerraBiomeSource.java | 4 +++- .../world/generator/FabricChunkGeneratorWrapper.java | 12 +++++++----- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java index 76a478495..c06b1def3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java @@ -5,6 +5,7 @@ import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryLookupCodec; import net.minecraft.world.biome.Biome; @@ -43,9 +44,10 @@ public class TerraBiomeSource extends BiomeSource { @Override public Biome getBiomeForNoiseGen(int biomeX, int biomeY, int biomeZ) { FabricBiome biome = ((FabricBiome) grid.getBiome(biomeX * 4, biomeZ * 4, GenerationPhase.BASE).getVanillaBiome()); - return biome.getHandle(); + return biomeRegistry.get(BuiltinRegistries.BIOME.getRawId(biome.getHandle())); } + @Override public boolean hasStructureFeature(StructureFeature feature) { return false; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index 61b996202..4bbad5316 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -3,7 +3,6 @@ package com.dfsek.terra.fabric.world.generator; import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.generic.Handle; -import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.handles.chunk.FabricChunkRegionChunk; @@ -11,6 +10,7 @@ import com.dfsek.terra.fabric.world.handles.world.FabricSeededWorldAccess; import com.dfsek.terra.fabric.world.handles.world.FabricWorldChunkRegion; import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.population.CavePopulator; +import com.dfsek.terra.population.FloraPopulator; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.block.BlockState; @@ -39,6 +39,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl Codec.LONG.fieldOf("seed").stable().forGetter(generator -> generator.seed)) .apply(instance, instance.stable(FabricChunkGeneratorWrapper::new))); private final CavePopulator cavePopulator = new CavePopulator(TerraFabricPlugin.getInstance()); + private final FloraPopulator floraPopulator = new FloraPopulator(TerraFabricPlugin.getInstance()); public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed) { super(biomeSource, new StructuresConfig(false)); @@ -82,10 +83,11 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl @Override public void generateFeatures(ChunkRegion region, StructureAccessor accessor) { - for(TerraBlockPopulator populator : delegate.getPopulators()) { - FastRandom pop = new FastRandom(MathUtil.getCarverChunkSeed(region.getCenterChunkX(), region.getCenterChunkZ(), seed)); - cavePopulator.populate(new FabricWorldChunkRegion(region, this), pop, new FabricChunkRegionChunk(region)); - } + FastRandom pop = new FastRandom(MathUtil.getCarverChunkSeed(region.getCenterChunkX(), region.getCenterChunkZ(), seed)); + FabricWorldChunkRegion chunkRegion = new FabricWorldChunkRegion(region, this); + FabricChunkRegionChunk regionChunk = new FabricChunkRegionChunk(region); + cavePopulator.populate(chunkRegion, pop, regionChunk); + floraPopulator.populate(chunkRegion, pop, regionChunk); // Nope } From 1dded4131110382294a2a3e832f138c73c5bc909 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Dec 2020 01:27:28 -0700 Subject: [PATCH 039/210] Flora and ores on Fabric --- .../api/generic/world/vector/Vector3.java | 2 +- .../dfsek/terra/population/CavePopulator.java | 2 +- .../dfsek/terra/fabric/TerraFabricPlugin.java | 15 ++++++++++++ .../dfsek/terra/fabric/world/FabricBlock.java | 15 ++++++------ .../terra/fabric/world/FabricBlockData.java | 10 +++++--- .../fabric/world/FabricMaterialData.java | 23 +++++++++++-------- .../terra/fabric/world/FabricWorldHandle.java | 2 +- .../FabricChunkGeneratorWrapper.java | 4 +++- .../world/FabricSeededWorldAccess.java | 7 ++++-- .../handles/world/FabricWorldAccess.java | 7 ++++-- .../handles/world/FabricWorldChunkRegion.java | 7 ++++-- 11 files changed, 64 insertions(+), 30 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java b/common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java index 64316f16d..d58ba3240 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java @@ -298,7 +298,7 @@ public class Vector3 implements Cloneable { public Vector3 subtract(int x, int y, int z) { this.x -= x; this.y -= y; - this.z = -z; + this.z -= z; return this; } diff --git a/common/src/main/java/com/dfsek/terra/population/CavePopulator.java b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java index 39215e784..4b977fc83 100644 --- a/common/src/main/java/com/dfsek/terra/population/CavePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java @@ -85,7 +85,7 @@ public class CavePopulator implements TerraBlockPopulator { Location mut = l.clone(); MaterialData orig = handle.getType(l.getBlock()); do mut.subtract(0, 1, 0); - while(handle.getType(mut.getBlock()).equals(orig)); + while(mut.getY() > 0 && handle.getType(mut.getBlock()).equals(orig)); try { if(template.getShift().get(entry.getValue()).contains(mut.getBlock().getType())) { handle.setBlockData(mut.getBlock(), shiftStorage.computeIfAbsent(entry.getValue(), MaterialData::createBlockData), false); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index e0c7d734e..655fdb4e1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -15,14 +15,17 @@ import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.fabric.inventory.FabricItemHandle; import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; import com.dfsek.terra.fabric.world.FabricBiome; +import com.dfsek.terra.fabric.world.FabricMaterialData; import com.dfsek.terra.fabric.world.FabricWorldHandle; import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.world.generator.TerraChunkGeneratorCodec; import com.dfsek.terra.registry.ConfigRegistry; +import com.dfsek.terra.util.MaterialSet; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.block.Blocks; import net.minecraft.client.world.GeneratorType; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; @@ -133,6 +136,18 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public void onInitialize() { + MaterialSet set = new MaterialSet(); + + set.add(new FabricMaterialData(Blocks.STONE)); + set.add(new FabricMaterialData(Blocks.DIRT)); + + System.out.println("Contains: " + set.contains(new FabricMaterialData(Blocks.AIR))); + System.out.println("Contains: " + set.contains(new FabricMaterialData(Blocks.STONE))); + + System.out.println("Matches: " + new FabricMaterialData(Blocks.STONE).matches(new FabricMaterialData(Blocks.STONE))); + System.out.println("Matches: " + new FabricMaterialData(Blocks.STONE).matches(new FabricMaterialData(Blocks.DIRT))); + + instance = this; plugin.load(this); config = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java index 1c71ced5e..8e61763b6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java @@ -14,7 +14,7 @@ public class FabricBlock implements Block { private final Handle delegate; public FabricBlock(BlockState state, BlockPos position, WorldAccess worldAccess) { - this.delegate = new Handle(state, position, worldAccess); + this.delegate = new Handle(position, worldAccess); } @Override @@ -34,12 +34,13 @@ public class FabricBlock implements Block { @Override public Block getRelative(BlockFace face, int len) { - return new FabricBlock(delegate.state, delegate.position.add(face.getModX(), face.getModY(), face.getModZ()), delegate.worldAccess); + BlockPos newPos = delegate.position.add(face.getModX() * len, face.getModY() * len, face.getModZ() * len); + return new FabricBlock(delegate.worldAccess.getBlockState(newPos), newPos, delegate.worldAccess); } @Override public boolean isEmpty() { - return delegate.state.isAir(); + return getBlockData().getMaterial().isAir(); } @Override @@ -49,7 +50,7 @@ public class FabricBlock implements Block { @Override public MaterialData getType() { - return new FabricMaterialData(delegate.state.getMaterial()); + return getBlockData().getMaterial(); } @Override @@ -69,7 +70,7 @@ public class FabricBlock implements Block { @Override public boolean isPassable() { - return delegate.state.isAir(); + return isEmpty(); } @Override @@ -78,12 +79,10 @@ public class FabricBlock implements Block { } public static final class Handle { - private final BlockState state; private final BlockPos position; private final WorldAccess worldAccess; - public Handle(BlockState state, BlockPos position, WorldAccess worldAccess) { - this.state = state; + public Handle(BlockPos position, WorldAccess worldAccess) { this.position = position; this.worldAccess = worldAccess; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlockData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlockData.java index d09519002..80907decd 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlockData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlockData.java @@ -13,17 +13,21 @@ public class FabricBlockData implements BlockData { @Override public MaterialData getMaterial() { - return null; + return new FabricMaterialData(delegate.getBlock()); } @Override public boolean matches(MaterialData materialData) { - return false; + return ((FabricMaterialData) materialData).getHandle().is(delegate.getBlock()); } @Override public BlockData clone() { - return null; + try { + return (BlockData) super.clone(); + } catch(CloneNotSupportedException e) { + throw new Error(e); + } } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java index 656df27a1..075cec94f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java @@ -2,12 +2,13 @@ package com.dfsek.terra.fabric.world; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; -import net.minecraft.block.Material; +import net.minecraft.block.Block; +import net.minecraft.block.Blocks; public class FabricMaterialData implements MaterialData { - private final Material delegate; + private final Block delegate; - public FabricMaterialData(Material delegate) { + public FabricMaterialData(Block delegate) { this.delegate = delegate; } @@ -23,12 +24,12 @@ public class FabricMaterialData implements MaterialData { @Override public boolean isSolid() { - return delegate.isSolid(); + return !delegate.is(Blocks.AIR); } @Override public boolean isAir() { - return delegate.blocksMovement(); // TODO: better impl + return delegate.is(Blocks.AIR); // TODO: better impl } @Override @@ -38,21 +39,25 @@ public class FabricMaterialData implements MaterialData { @Override public BlockData createBlockData() { - return null; + return new FabricBlockData(delegate.getDefaultState()); } @Override - public Material getHandle() { + public Block getHandle() { return delegate; } + @Override public int hashCode() { - return delegate.hashCode(); + return delegate.asItem().hashCode(); } @Override public boolean equals(Object obj) { - return delegate.equals(obj); + if(obj instanceof FabricMaterialData) { + return ((FabricMaterialData) obj).matches(this); + } + return false; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index f5930060c..ffd73fdae 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -37,7 +37,7 @@ public class FabricWorldHandle implements WorldHandle { @Override public MaterialData createMaterialData(String data) { - return new FabricMaterialData(createBlockData(data).getHandle().getMaterial()); + return new FabricMaterialData(createBlockData(data).getHandle().getBlock()); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index 4bbad5316..294a98877 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -11,6 +11,7 @@ import com.dfsek.terra.fabric.world.handles.world.FabricWorldChunkRegion; import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.population.CavePopulator; import com.dfsek.terra.population.FloraPopulator; +import com.dfsek.terra.population.OrePopulator; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.block.BlockState; @@ -40,6 +41,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl .apply(instance, instance.stable(FabricChunkGeneratorWrapper::new))); private final CavePopulator cavePopulator = new CavePopulator(TerraFabricPlugin.getInstance()); private final FloraPopulator floraPopulator = new FloraPopulator(TerraFabricPlugin.getInstance()); + private final OrePopulator orePopulator = new OrePopulator(TerraFabricPlugin.getInstance()); public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed) { super(biomeSource, new StructuresConfig(false)); @@ -87,8 +89,8 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl FabricWorldChunkRegion chunkRegion = new FabricWorldChunkRegion(region, this); FabricChunkRegionChunk regionChunk = new FabricChunkRegionChunk(region); cavePopulator.populate(chunkRegion, pop, regionChunk); + orePopulator.populate(chunkRegion, pop, regionChunk); floraPopulator.populate(chunkRegion, pop, regionChunk); - // Nope } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java index 1ee9ffb18..fe9d2dbdf 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java @@ -7,7 +7,9 @@ import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.fabric.world.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; import java.io.File; @@ -64,12 +66,13 @@ public class FabricSeededWorldAccess implements World { @Override public Block getBlockAt(int x, int y, int z) { - return null; + BlockPos pos = new BlockPos(x, y, z); + return new FabricBlock(handle.worldAccess.getBlockState(pos), pos, handle.worldAccess); } @Override public Block getBlockAt(Location l) { - return null; + return getBlockAt(l.getBlockX(), l.getBlockY(), l.getBlockZ()); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index ed5fd6eac..580408982 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -7,6 +7,8 @@ import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.fabric.world.FabricBlock; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; import java.io.File; @@ -62,12 +64,13 @@ public class FabricWorldAccess implements World { @Override public Block getBlockAt(int x, int y, int z) { - return null; + BlockPos pos = new BlockPos(x, y, z); + return new FabricBlock(delegate.getBlockState(pos), pos, delegate); } @Override public Block getBlockAt(Location l) { - return null; + return getBlockAt(l.getBlockX(), l.getBlockY(), l.getBlockZ()); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java index 9fa0aa98d..e6563882d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java @@ -7,7 +7,9 @@ import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.fabric.world.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; +import net.minecraft.util.math.BlockPos; import net.minecraft.world.ChunkRegion; import java.io.File; @@ -63,12 +65,13 @@ public class FabricWorldChunkRegion implements World { @Override public Block getBlockAt(int x, int y, int z) { - return null; + BlockPos pos = new BlockPos(x, y, z); + return new FabricBlock(delegate.chunk.getBlockState(pos), pos, delegate.chunk); } @Override public Block getBlockAt(Location l) { - return null; + return getBlockAt(l.getBlockX(), l.getBlockY(), l.getBlockZ()); } @Override From ebe887def0d0be0aafbaa5a6a166ce8266fb0632 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Dec 2020 02:00:42 -0700 Subject: [PATCH 040/210] Remove unused constructor param from FabricBlock --- .../main/java/com/dfsek/terra/fabric/world/FabricBlock.java | 5 ++--- .../terra/fabric/world/{ => handles/chunk}/FabricChunk.java | 2 +- .../fabric/world/handles/chunk/FabricChunkRegionChunk.java | 2 +- .../fabric/world/handles/world/FabricSeededWorldAccess.java | 2 +- .../terra/fabric/world/handles/world/FabricWorldAccess.java | 2 +- .../fabric/world/handles/world/FabricWorldChunkRegion.java | 2 +- 6 files changed, 7 insertions(+), 8 deletions(-) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/{ => handles/chunk}/FabricChunk.java (93%) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java index 8e61763b6..dff5c21d1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java @@ -6,14 +6,13 @@ import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; -import net.minecraft.block.BlockState; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; public class FabricBlock implements Block { private final Handle delegate; - public FabricBlock(BlockState state, BlockPos position, WorldAccess worldAccess) { + public FabricBlock(BlockPos position, WorldAccess worldAccess) { this.delegate = new Handle(position, worldAccess); } @@ -35,7 +34,7 @@ public class FabricBlock implements Block { @Override public Block getRelative(BlockFace face, int len) { BlockPos newPos = delegate.position.add(face.getModX() * len, face.getModY() * len, face.getModZ() * len); - return new FabricBlock(delegate.worldAccess.getBlockState(newPos), newPos, delegate.worldAccess); + return new FabricBlock(newPos, delegate.worldAccess); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricChunk.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java similarity index 93% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricChunk.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java index 927e81de7..89fdb8ec4 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricChunk.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.world; +package com.dfsek.terra.fabric.world.handles.chunk; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java index 5ae91e66f..b6771418d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java @@ -37,7 +37,7 @@ public class FabricChunkRegionChunk implements Chunk { @Override public Block getBlock(int x, int y, int z) { BlockPos pos = new BlockPos(x + this.x, y, z + this.z); - return new FabricBlock(chunkRegion.getBlockState(pos), pos, chunkRegion); + return new FabricBlock(pos, chunkRegion); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java index fe9d2dbdf..7702e054a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java @@ -67,7 +67,7 @@ public class FabricSeededWorldAccess implements World { @Override public Block getBlockAt(int x, int y, int z) { BlockPos pos = new BlockPos(x, y, z); - return new FabricBlock(handle.worldAccess.getBlockState(pos), pos, handle.worldAccess); + return new FabricBlock(pos, handle.worldAccess); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index 580408982..a68d985e7 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -65,7 +65,7 @@ public class FabricWorldAccess implements World { @Override public Block getBlockAt(int x, int y, int z) { BlockPos pos = new BlockPos(x, y, z); - return new FabricBlock(delegate.getBlockState(pos), pos, delegate); + return new FabricBlock(pos, delegate); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java index e6563882d..a0b8f8f2d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java @@ -66,7 +66,7 @@ public class FabricWorldChunkRegion implements World { @Override public Block getBlockAt(int x, int y, int z) { BlockPos pos = new BlockPos(x, y, z); - return new FabricBlock(delegate.chunk.getBlockState(pos), pos, delegate.chunk); + return new FabricBlock(pos, delegate.chunk); } @Override From 2215c8a98cfb51af8f32900f60120e41e898430d Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Dec 2020 02:19:18 -0700 Subject: [PATCH 041/210] fix mem leak & increase perf --- .../java/com/dfsek/terra/fabric/TerraFabricPlugin.java | 8 +++++++- .../world/handles/world/FabricWorldChunkRegion.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 655fdb4e1..79b5505ce 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -36,10 +36,13 @@ import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import java.io.File; import java.io.IOException; +import java.util.HashMap; +import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; public class TerraFabricPlugin implements TerraPlugin, ModInitializer { + private final Map worldMap = new HashMap<>(); private static TerraFabricPlugin instance; private final TerraChunkGeneratorCodec chunkGeneratorCodec = new TerraChunkGeneratorCodec(this); @@ -72,7 +75,10 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public TerraWorld getWorld(World world) { - return new TerraWorld(world, getRegistry().get("DEFAULT"), this); + return worldMap.computeIfAbsent(world.getSeed(), w -> { + logger.info("Loading world " + w); + return new TerraWorld(world, getRegistry().get("DEFAULT"), this); + }); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java index a0b8f8f2d..da6fca15e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java @@ -40,7 +40,7 @@ public class FabricWorldChunkRegion implements World { @Override public String getName() { - return getWorldFolder().getName(); + return delegate.chunk.toString(); } @Override From 5f5504100b22ce66c83c1c34683094de5a879763 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Dec 2020 12:28:57 -0700 Subject: [PATCH 042/210] Codec stuff --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 9 ++--- .../terra/fabric/codec/ConfigPackCodec.java | 19 ----------- .../fabric/mixin/MoreOptionsDialogMixin.java | 25 ++++++++++++++ .../FabricChunkGeneratorWrapper.java | 20 ++++++++--- .../generator/TerraChunkGeneratorCodec.java | 33 ------------------- .../src/main/resources/terra.mixins.json | 3 +- 6 files changed, 44 insertions(+), 65 deletions(-) delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/codec/ConfigPackCodec.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MoreOptionsDialogMixin.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/TerraChunkGeneratorCodec.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 79b5505ce..10e48db37 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -19,7 +19,6 @@ import com.dfsek.terra.fabric.world.FabricMaterialData; import com.dfsek.terra.fabric.world.FabricWorldHandle; import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; -import com.dfsek.terra.fabric.world.generator.TerraChunkGeneratorCodec; import com.dfsek.terra.registry.ConfigRegistry; import com.dfsek.terra.util.MaterialSet; import net.fabricmc.api.EnvType; @@ -42,9 +41,9 @@ import java.util.logging.Level; import java.util.logging.Logger; public class TerraFabricPlugin implements TerraPlugin, ModInitializer { + private final Map worldMap = new HashMap<>(); private static TerraFabricPlugin instance; - private final TerraChunkGeneratorCodec chunkGeneratorCodec = new TerraChunkGeneratorCodec(this); public static TerraFabricPlugin getInstance() { return instance; @@ -165,15 +164,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { GeneratorTypeAccessor.getValues().add(new GeneratorType("terra") { @Override protected ChunkGenerator getChunkGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed) { - return new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed), seed); + return new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed), seed, registry.get("DEFAULT")); } }); } Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC); Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), TerraBiomeSource.CODEC); } - - public TerraChunkGeneratorCodec getChunkGeneratorCodec() { - return chunkGeneratorCodec; - } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/codec/ConfigPackCodec.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/codec/ConfigPackCodec.java deleted file mode 100644 index f2b0eae2b..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/codec/ConfigPackCodec.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dfsek.terra.fabric.codec; - -import com.dfsek.terra.config.base.ConfigPack; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.DynamicOps; - -public class ConfigPackCodec implements Codec { - @Override - public DataResult> decode(DynamicOps ops, T input) { - return null; - } - - @Override - public DataResult encode(ConfigPack input, DynamicOps ops, T prefix) { - return null; - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MoreOptionsDialogMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MoreOptionsDialogMixin.java new file mode 100644 index 000000000..9f3cc5cf8 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MoreOptionsDialogMixin.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.fabric.mixin; + +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.screen.world.CreateWorldScreen; +import net.minecraft.client.gui.screen.world.MoreOptionsDialog; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(MoreOptionsDialog.class) +public class MoreOptionsDialogMixin { + + @Inject(at = @At("HEAD"), method = "method_28092(Lnet/minecraft/client/gui/screen/world/CreateWorldScreen;Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/font/TextRenderer;)V") + private void draw(final CreateWorldScreen parent, MinecraftClient client, TextRenderer textRenderer, CallbackInfo info) { + System.out.println("More options opened"); + } + + /*@Inject(at = @At("RETURN"), method = "setVisible(B)V") + private void setVisible(boolean visible, CallbackInfo info) { + System.out.println("redraw"); + } + */ +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index 294a98877..536dfc3ad 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -3,6 +3,7 @@ package com.dfsek.terra.fabric.world.generator; import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.handles.chunk.FabricChunkRegionChunk; @@ -35,17 +36,26 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl private final long seed; private final TerraChunkGenerator delegate; private final TerraBiomeSource biomeSource; + public static final Codec PACK_CODEC = (RecordCodecBuilder.create(config -> config.group( + Codec.STRING.fieldOf("pack").forGetter(pack -> pack.getTemplate().getID()) + ).apply(config, config.stable(TerraFabricPlugin.getInstance().getRegistry()::get)))); public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( TerraBiomeSource.CODEC.fieldOf("biome_source").forGetter(generator -> generator.biomeSource), - Codec.LONG.fieldOf("seed").stable().forGetter(generator -> generator.seed)) + Codec.LONG.fieldOf("seed").stable().forGetter(generator -> generator.seed), + PACK_CODEC.fieldOf("pack").stable().forGetter(generator -> generator.pack)) .apply(instance, instance.stable(FabricChunkGeneratorWrapper::new))); + private final ConfigPack pack; + + private final CavePopulator cavePopulator = new CavePopulator(TerraFabricPlugin.getInstance()); private final FloraPopulator floraPopulator = new FloraPopulator(TerraFabricPlugin.getInstance()); private final OrePopulator orePopulator = new OrePopulator(TerraFabricPlugin.getInstance()); - public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed) { - super(biomeSource, new StructuresConfig(false)); - this.delegate = new TerraChunkGenerator(TerraFabricPlugin.getInstance().getRegistry().get("DEFAULT"), TerraFabricPlugin.getInstance()); + public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack) { + super(biomeSource, new StructuresConfig(false)); + this.pack = configPack; + + this.delegate = new TerraChunkGenerator(configPack, TerraFabricPlugin.getInstance()); delegate.getMain().getLogger().info("Loading world..."); this.biomeSource = biomeSource; @@ -64,7 +74,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl @Override public ChunkGenerator withSeed(long seed) { - return new FabricChunkGeneratorWrapper((TerraBiomeSource) this.biomeSource.withSeed(seed), seed); + return new FabricChunkGeneratorWrapper((TerraBiomeSource) this.biomeSource.withSeed(seed), seed, pack); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/TerraChunkGeneratorCodec.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/TerraChunkGeneratorCodec.java deleted file mode 100644 index d7b66a184..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/TerraChunkGeneratorCodec.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.dfsek.terra.fabric.world.generator; - -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.generation.TerraChunkGenerator; -import com.mojang.datafixers.util.Pair; -import com.mojang.serialization.Codec; -import com.mojang.serialization.DataResult; -import com.mojang.serialization.DynamicOps; - -import java.util.Optional; - -public class TerraChunkGeneratorCodec implements Codec { - private final TerraPlugin main; - - public TerraChunkGeneratorCodec(TerraPlugin main) { - this.main = main; - } - - @Override - public DataResult> decode(DynamicOps ops, T input) { - Optional s = ops.getStringValue(input).get().left(); - if(!s.isPresent()) return DataResult.error("No data present"); - if(main.getRegistry().contains(s.get())) { - return DataResult.success(new Pair<>(new TerraChunkGenerator(main.getRegistry().get(s.get()), main), input)); - } - return null; - } - - @Override - public DataResult encode(TerraChunkGenerator input, DynamicOps ops, T prefix) { - return null; - } -} diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index a6b050657..be4d44a45 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -5,7 +5,8 @@ "compatibilityLevel": "JAVA_8", "mixins": [], "client": [ - "GeneratorTypeAccessor" + "GeneratorTypeAccessor", + "MoreOptionsDialogMixin" ], "server": [], "injectors": { From 875e1feafe4e1af1f9186316036f99fcc391da7e Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Dec 2020 12:44:16 -0700 Subject: [PATCH 043/210] population order/invocation is now per-platform --- .../api/gaea/profiler/WorldProfiler.java | 1 - .../generator/TerraChunkGenerator.java | 6 -- .../terra/generation/TerraChunkGenerator.java | 67 +------------------ .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 4 +- .../BukkitChunkGeneratorWrapper.java | 62 ++++++++++++++++- 5 files changed, 66 insertions(+), 74 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java b/common/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java index 09d87fdd0..8f486d310 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java @@ -21,7 +21,6 @@ public class WorldProfiler { .addMeasurement(new Measurement(2000000, DataType.PERIOD_MILLISECONDS), "PopulationManagerTime"); isProfiling = false; this.world = w; - w.getGenerator().getTerraGenerator().attachProfiler(this); } public String getResultsFormatted() { diff --git a/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java b/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java index 8657b5aa7..5f0b95e17 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java @@ -1,13 +1,11 @@ package com.dfsek.terra.api.generic.generator; -import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.BiomeGrid; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.config.base.ConfigPack; import org.jetbrains.annotations.NotNull; -import java.util.List; import java.util.Random; public interface TerraChunkGenerator { @@ -15,8 +13,6 @@ public interface TerraChunkGenerator { void generateBiomes(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome); - void attachProfiler(WorldProfiler profiler); - boolean isParallelCapable(); boolean shouldGenerateCaves(); @@ -29,7 +25,5 @@ public interface TerraChunkGenerator { ConfigPack getConfigPack(); - List getPopulators(); - TerraPlugin getMain(); } diff --git a/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index f6ba10733..727a71194 100644 --- a/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -4,71 +4,33 @@ import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.ChunkInterpolator3; -import com.dfsek.terra.api.gaea.population.PopulationManager; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; -import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import com.dfsek.terra.api.gaea.world.palette.Palette; import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.generator.ChunkGenerator; -import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; import com.dfsek.terra.api.generic.world.BiomeGrid; -import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.population.CavePopulator; -import com.dfsek.terra.population.FloraPopulator; -import com.dfsek.terra.population.OrePopulator; -import com.dfsek.terra.population.StructurePopulator; -import com.dfsek.terra.population.TreePopulator; import com.dfsek.terra.util.PaletteUtil; import com.dfsek.terra.util.SlabUtil; import org.jetbrains.annotations.NotNull; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; import java.util.Random; -import java.util.logging.Level; public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generator.TerraChunkGenerator { - private static final Map popMap = new HashMap<>(); - private final PopulationManager popMan; + + private final ConfigPack configPack; private final TerraPlugin main; - private boolean needsLoad = true; + public TerraChunkGenerator(ConfigPack c, TerraPlugin main) { - popMan = new PopulationManager(main); this.configPack = c; this.main = main; - popMan.attach(new OrePopulator(main)); - popMan.attach(new TreePopulator(main)); - popMan.attach(new FloraPopulator(main)); - } - - public static synchronized void saveAll() { - for(Map.Entry e : popMap.entrySet()) { - try { - e.getValue().saveBlocks(e.getKey()); - Debug.info("Saved data for world " + e.getKey().getName()); - } catch(IOException ioException) { - ioException.printStackTrace(); - } - } - } - - public static synchronized void fixChunk(Chunk c) { - if(!(c.getWorld().getGenerator() instanceof TerraChunkGenerator)) throw new IllegalArgumentException(); - popMap.get(c.getWorld()).checkNeighbors(c.getX(), c.getZ(), c.getWorld()); } @Override @@ -101,17 +63,11 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato return configPack; } - @Override - public List getPopulators() { - return Arrays.asList(new CavePopulator(main), new StructurePopulator(main), popMan); - } - @Override public TerraPlugin getMain() { return main; } - @Override @SuppressWarnings({"try"}) public ChunkGenerator.ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, ChunkGenerator.ChunkData chunk) { @@ -121,7 +77,6 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato ChunkInterpolator3 interp; try(ProfileFuture ignored = tw.getProfiler().measure("ChunkBaseGenTime")) { interp = new ChunkInterpolator3(world, chunkX, chunkZ, tw.getGrid()); - if(needsLoad) load(world); // Load population data for world. if(!tw.isSafe()) return chunk; int xOrig = (chunkX << 4); @@ -197,20 +152,4 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato } } } - - public void attachProfiler(WorldProfiler p) { - popMan.attachProfiler(p); - } - - private void load(World w) { - try { - popMan.loadBlocks(w); - } catch(FileNotFoundException e) { - LangUtil.log("warning.no-population", Level.WARNING); - } catch(IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - popMap.put(w, popMan); - needsLoad = false; - } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index cc6127304..22b9d1dfb 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -77,7 +77,7 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { @Override public void onDisable() { - TerraChunkGenerator.saveAll(); + BukkitChunkGeneratorWrapper.saveAll(); } @Override @@ -107,7 +107,7 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { long save = config.getDataSaveInterval(); - Bukkit.getScheduler().runTaskTimerAsynchronously(this, TerraChunkGenerator::saveAll, save, save); // Schedule population data saving + Bukkit.getScheduler().runTaskTimerAsynchronously(this, BukkitChunkGeneratorWrapper::saveAll, save, save); // Schedule population data saving Bukkit.getPluginManager().registerEvents(new EventListener(this), this); // Register master event listener Bukkit.getPluginManager().registerEvents(new SpigotListener(this), this); // Register Spigot event listener, once Paper accepts StructureLocateEvent PR Spigot and Paper events will be separate. diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index c1845f92c..ae4f4f5f3 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -1,35 +1,95 @@ package com.dfsek.terra.bukkit.generator; +import com.dfsek.terra.api.gaea.population.PopulationManager; import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; +import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.bukkit.BukkitBiomeGrid; import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.config.lang.LangUtil; +import com.dfsek.terra.debug.Debug; +import com.dfsek.terra.population.CavePopulator; +import com.dfsek.terra.population.FloraPopulator; +import com.dfsek.terra.population.OrePopulator; +import com.dfsek.terra.population.StructurePopulator; +import com.dfsek.terra.population.TreePopulator; import org.bukkit.World; import org.bukkit.generator.BlockPopulator; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Random; +import java.util.logging.Level; import java.util.stream.Collectors; +import java.util.stream.Stream; public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Handle { + + private static final Map popMap = new HashMap<>(); + + private final PopulationManager popMan; + private final TerraChunkGenerator delegate; + private final TerraPlugin main; + + private boolean needsLoad = true; + public BukkitChunkGeneratorWrapper(TerraChunkGenerator delegate) { this.delegate = delegate; + this.main = delegate.getMain(); + popMan = new PopulationManager(main); + popMan.attach(new OrePopulator(main)); + popMan.attach(new TreePopulator(main)); + popMan.attach(new FloraPopulator(main)); + } + + + public static synchronized void saveAll() { + for(Map.Entry e : popMap.entrySet()) { + try { + e.getValue().saveBlocks(e.getKey()); + Debug.info("Saved data for world " + e.getKey().getName()); + } catch(IOException ioException) { + ioException.printStackTrace(); + } + } + } + + public static synchronized void fixChunk(Chunk c) { + if(!(c.getWorld().getGenerator() instanceof com.dfsek.terra.generation.TerraChunkGenerator)) throw new IllegalArgumentException(); + popMap.get(c.getWorld()).checkNeighbors(c.getX(), c.getZ(), c.getWorld()); + } + + private void load(com.dfsek.terra.api.generic.world.World w) { + try { + popMan.loadBlocks(w); + } catch(FileNotFoundException e) { + LangUtil.log("warning.no-population", Level.WARNING); + } catch(IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + popMap.put(w, popMan); + needsLoad = false; } @Override public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { BukkitWorld bukkitWorld = new BukkitWorld(world); + if(needsLoad) load(bukkitWorld); // Load population data for world. delegate.generateBiomes(bukkitWorld, random, x, z, new BukkitBiomeGrid(biome)); return (ChunkData) delegate.generateChunkData(bukkitWorld, random, x, z, new BukkitChunkGenerator.BukkitChunkData(createChunkData(world))).getHandle(); } @Override public @NotNull List getDefaultPopulators(@NotNull World world) { - return delegate.getPopulators().stream().map(BukkitPopulatorWrapper::new).collect(Collectors.toList()); + return Stream.of(new CavePopulator(main), new StructurePopulator(main), popMan).map(BukkitPopulatorWrapper::new).collect(Collectors.toList()); } @Override From 49c445d0f7a35b3cb3505c6859c24dc383e173a0 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Dec 2020 15:38:40 -0700 Subject: [PATCH 044/210] Implement some BlockData stuff on Fabric, make stuff less jank --- .../api/generic/world/block/data/Slab.java | 9 ++- .../terra/generation/TerraChunkGenerator.java | 80 +++++++++++++++++- .../java/com/dfsek/terra/util/SlabUtil.java | 81 ------------------- .../bukkit/world/block/BukkitBlockData.java | 6 +- .../world/block/data/BukkitEnumAdapter.java | 14 ++++ .../block/data/BukkitMultipleFacing.java | 10 +-- .../bukkit/world/block/data/BukkitSlab.java | 32 ++++++++ .../bukkit/world/block/data/BukkitStairs.java | 18 ++--- .../world/block/data/BukkitWaterlogged.java | 6 +- .../world/block/data/TerraEnumAdapter.java | 14 ++++ .../dfsek/terra/fabric/TerraFabricPlugin.java | 15 ---- .../fabric/world/FabricBiomeRegistry.java | 7 -- .../terra/fabric/world/FabricWorldHandle.java | 12 ++- .../fabric/world/{ => block}/FabricBlock.java | 3 +- .../world/{ => block}/FabricBlockData.java | 4 +- .../world/{ => block}/FabricMaterialData.java | 2 +- .../world/block/data/FabricEnumAdapter.java | 57 +++++++++++++ .../fabric/world/block/data/FabricStairs.java | 42 ++++++++++ .../world/block/data/FabricWaterlogged.java | 22 +++++ .../world/block/data/TerraEnumAdapter.java | 57 +++++++++++++ .../world/generator/FabricChunkData.java | 2 +- .../handles/chunk/FabricChunkRegionChunk.java | 2 +- .../world/FabricSeededWorldAccess.java | 2 +- .../handles/world/FabricWorldAccess.java | 5 +- .../handles/world/FabricWorldChunkRegion.java | 2 +- 25 files changed, 363 insertions(+), 141 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/util/SlabUtil.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeRegistry.java rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/{ => block}/FabricBlock.java (96%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/{ => block}/FabricBlockData.java (91%) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/{ => block}/FabricMaterialData.java (97%) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java index 3587f957f..6b5f241bf 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java @@ -1,4 +1,11 @@ package com.dfsek.terra.api.generic.world.block.data; -public interface Slab extends Bisected, Waterlogged { +public interface Slab extends Waterlogged { + Type getType(); + + void setType(Type type); + + enum Type { + TOP, BOTTOM, DOUBLE + } } diff --git a/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java index 727a71194..9a17b02b3 100644 --- a/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java @@ -11,14 +11,21 @@ import com.dfsek.terra.api.generic.generator.ChunkGenerator; import com.dfsek.terra.api.generic.world.BiomeGrid; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.block.data.Bisected; +import com.dfsek.terra.api.generic.world.block.data.Slab; +import com.dfsek.terra.api.generic.world.block.data.Stairs; +import com.dfsek.terra.api.generic.world.block.data.Waterlogged; import com.dfsek.terra.api.generic.world.vector.Vector3; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.palette.SinglePalette; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.util.PaletteUtil; -import com.dfsek.terra.util.SlabUtil; import org.jetbrains.annotations.NotNull; +import java.util.Map; import java.util.Random; public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generator.TerraChunkGenerator { @@ -26,11 +33,15 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato private final ConfigPack configPack; private final TerraPlugin main; + private final MaterialData water; + private final SinglePalette blank; public TerraChunkGenerator(ConfigPack c, TerraPlugin main) { this.configPack = c; this.main = main; + water = main.getWorldHandle().createMaterialData("minecraft:water"); + blank = new SinglePalette<>(main.getWorldHandle().createBlockData("minecraft:air")); } @Override @@ -110,20 +121,20 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato data = PaletteUtil.getPalette(x, y, z, c, sampler).get(paletteLevel, cx, cz); chunk.setBlock(x, y, z, data); if(paletteLevel == 0 && c.doSlabs() && y < 255) { - SlabUtil.prepareBlockPartFloor(data, chunk.getBlockData(x, y + 1, z), chunk, new Vector3(x, y + 1, z), c.getSlabPalettes(), + prepareBlockPartFloor(data, chunk.getBlockData(x, y + 1, z), chunk, new Vector3(x, y + 1, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); } paletteLevel++; } else if(y <= sea) { chunk.setBlock(x, y, z, seaPalette.get(sea - y, x + xOrig, z + zOrig)); if(justSet && c.doSlabs()) { - SlabUtil.prepareBlockPartCeiling(data, chunk.getBlockData(x, y, z), chunk, new Vector3(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); + prepareBlockPartCeiling(data, chunk.getBlockData(x, y, z), chunk, new Vector3(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); } justSet = false; paletteLevel = 0; } else { if(justSet && c.doSlabs()) { - SlabUtil.prepareBlockPartCeiling(data, chunk.getBlockData(x, y, z), chunk, new Vector3(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); + prepareBlockPartCeiling(data, chunk.getBlockData(x, y, z), chunk, new Vector3(x, y, z), c.getSlabPalettes(), c.getStairPalettes(), c.getSlabThreshold(), sampler); } justSet = false; paletteLevel = 0; @@ -137,6 +148,67 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato } } + private void prepareBlockPartFloor(BlockData down, BlockData orig, ChunkGenerator.ChunkData chunk, Vector3 block, Map> slabs, + Map> stairs, double thresh, Sampler sampler) { + if(sampler.sample(block.getBlockX(), block.getBlockY() - 0.4, block.getBlockZ()) > thresh) { + if(stairs != null) { + Palette stairPalette = stairs.get(down.getMaterial()); + if(stairPalette != null) { + BlockData stair = stairPalette.get(0, block.getBlockX(), block.getBlockZ()).clone(); + Stairs stairNew = (Stairs) stair; + if(placeStair(orig, chunk, block, thresh, sampler, stairNew)) return; // Successfully placed part. + } + } + BlockData slab = slabs.getOrDefault(down.getMaterial(), blank).get(0, block.getBlockX(), block.getBlockZ()); + if(slab instanceof Waterlogged) { + ((Waterlogged) slab).setWaterlogged(orig.matches(water)); + } else if(orig.matches(water)) return; + chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), slab); + } + } + + private void prepareBlockPartCeiling(BlockData up, BlockData orig, ChunkGenerator.ChunkData chunk, Vector3 block, Map> slabs, + Map> stairs, double thresh, Sampler sampler) { + if(sampler.sample(block.getBlockX(), block.getBlockY() + 0.4, block.getBlockZ()) > thresh) { + if(stairs != null) { + Palette stairPalette = stairs.get(up.getMaterial()); + if(stairPalette != null) { + BlockData stair = stairPalette.get(0, block.getBlockX(), block.getBlockZ()).clone(); + Stairs stairNew = (Stairs) stair.clone(); + stairNew.setHalf(Bisected.Half.TOP); + if(placeStair(orig, chunk, block, thresh, sampler, stairNew)) return; // Successfully placed part. + } + } + BlockData slab = slabs.getOrDefault(up.getMaterial(), blank).get(0, block.getBlockX(), block.getBlockZ()).clone(); + if(slab instanceof Bisected) ((Bisected) slab).setHalf(Bisected.Half.TOP); + if(slab instanceof Slab) ((Slab) slab).setType(Slab.Type.TOP); + if(slab instanceof Waterlogged) { + ((Waterlogged) slab).setWaterlogged(orig.matches(water)); + } else if(orig.matches(water)) return; // Only replace water if waterlogged. + chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), slab); + } + } + + private boolean placeStair(BlockData orig, ChunkGenerator.ChunkData chunk, Vector3 block, double thresh, Sampler sampler, Stairs stairNew) { + + if(sampler.sample(block.getBlockX() - 0.55, block.getBlockY(), block.getBlockZ()) > thresh) { + + stairNew.setFacing(BlockFace.WEST); + } else if(sampler.sample(block.getBlockX(), block.getBlockY(), block.getBlockZ() - 0.55) > thresh) { + stairNew.setFacing(BlockFace.NORTH); + } else if(sampler.sample(block.getBlockX(), block.getBlockY(), block.getBlockZ() + 0.55) > thresh) { + stairNew.setFacing(BlockFace.SOUTH); + } else if(sampler.sample(block.getBlockX() + 0.55, block.getBlockY(), block.getBlockZ()) > thresh) { + stairNew.setFacing(BlockFace.EAST); + } else stairNew = null; + if(stairNew != null) { + if(orig.matches(water)) stairNew.setWaterlogged(orig.matches(water)); + chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), stairNew); + return true; + } + return false; + } + @Override public void generateBiomes(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome) { int xOrig = (chunkX << 4); diff --git a/common/src/main/java/com/dfsek/terra/util/SlabUtil.java b/common/src/main/java/com/dfsek/terra/util/SlabUtil.java deleted file mode 100644 index 3e2b5615f..000000000 --- a/common/src/main/java/com/dfsek/terra/util/SlabUtil.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.dfsek.terra.util; - -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.generic.generator.ChunkGenerator; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.generic.world.block.data.Stairs; -import com.dfsek.terra.api.generic.world.vector.Vector3; -import com.dfsek.terra.generation.Sampler; - -import java.util.Map; - -public final class SlabUtil { - public static void prepareBlockPartFloor(BlockData down, BlockData orig, ChunkGenerator.ChunkData chunk, Vector3 block, Map> slabs, - Map> stairs, double thresh, Sampler sampler) { - /* - if(sampler.sample(block.getBlockX(), block.getBlockY() - 0.4, block.getBlockZ()) > thresh) { - if(stairs != null) { - Palette stairPalette = stairs.get(down.getMaterial()); - if(stairPalette != null) { - BlockData stair = stairPalette.get(0, block.getBlockX(), block.getBlockZ()).clone(); - Stairs stairNew = (Stairs) stair; - if(placeStair(orig, chunk, block, thresh, sampler, stairNew)) return; // Successfully placed part. - } - } - BlockData slab = slabs.getOrDefault(down.getMaterial(), PaletteUtil.BLANK_PALETTE).get(0, block.getBlockX(), block.getBlockZ()); - if(slab instanceof Waterlogged) { - ((Waterlogged) slab).setWaterlogged(orig.matches(PaletteUtil.WATER)); - } else if(orig.matches(PaletteUtil.WATER)) return; - chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), slab); - } - */ - } - - public static void prepareBlockPartCeiling(BlockData up, BlockData orig, ChunkGenerator.ChunkData chunk, Vector3 block, Map> slabs, - Map> stairs, double thresh, Sampler sampler) { - /* - if(sampler.sample(block.getBlockX(), block.getBlockY() + 0.4, block.getBlockZ()) > thresh) { - if(stairs != null) { - Palette stairPalette = stairs.get(up.getMaterial()); - if(stairPalette != null) { - BlockData stair = stairPalette.get(0, block.getBlockX(), block.getBlockZ()).clone(); - Stairs stairNew = (Stairs) stair.clone(); - stairNew.setHalf(Bisected.Half.TOP); - if(placeStair(orig, chunk, block, thresh, sampler, stairNew)) return; // Successfully placed part. - } - } - BlockData slab = slabs.getOrDefault(up.getMaterial(), PaletteUtil.BLANK_PALETTE).get(0, block.getBlockX(), block.getBlockZ()).clone(); - if(slab instanceof Bisected) ((Bisected) slab).setHalf(Bisected.Half.TOP); - if(slab instanceof Slab) ((Slab) slab).setType(Slab.Type.TOP); - if(slab instanceof Waterlogged) { - ((Waterlogged) slab).setWaterlogged(orig.matches(PaletteUtil.WATER)); - } else if(orig.matches(PaletteUtil.WATER)) return; // Only replace water if waterlogged. - chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), slab); - } - - */ - } - - private static boolean placeStair(BlockData orig, ChunkGenerator.ChunkData chunk, Vector3 block, double thresh, Sampler sampler, Stairs stairNew) { - /* - if(sampler.sample(block.getBlockX() - 0.55, block.getBlockY(), block.getBlockZ()) > thresh) { - - stairNew.setFacing(BlockFace.WEST); - } else if(sampler.sample(block.getBlockX(), block.getBlockY(), block.getBlockZ() - 0.55) > thresh) { - stairNew.setFacing(BlockFace.NORTH); - } else if(sampler.sample(block.getBlockX(), block.getBlockY(), block.getBlockZ() + 0.55) > thresh) { - stairNew.setFacing(BlockFace.SOUTH); - } else if(sampler.sample(block.getBlockX() + 0.55, block.getBlockY(), block.getBlockZ()) > thresh) { - stairNew.setFacing(BlockFace.EAST); - } else stairNew = null; - if(stairNew != null) { - if(orig.matches(PaletteUtil.WATER)) stairNew.setWaterlogged(true); - chunk.setBlock(block.getBlockX(), block.getBlockY(), block.getBlockZ(), stairNew); - return true; - } - - */ - return false; - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java index e89e069ac..05b3496fc 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java @@ -4,7 +4,7 @@ import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; public class BukkitBlockData implements BlockData { - private final org.bukkit.block.data.BlockData delegate; + private org.bukkit.block.data.BlockData delegate; public BukkitBlockData(org.bukkit.block.data.BlockData delegate) { this.delegate = delegate; @@ -29,7 +29,9 @@ public class BukkitBlockData implements BlockData { @Override public BukkitBlockData clone() { try { - return (BukkitBlockData) super.clone(); + BukkitBlockData n = (BukkitBlockData) super.clone(); + n.delegate = delegate.clone(); + return n; } catch(CloneNotSupportedException e) { throw new Error(e); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java index 7e4d70508..a4a8df802 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java @@ -3,6 +3,7 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.data.Bisected; +import com.dfsek.terra.api.generic.world.block.data.Slab; import com.dfsek.terra.api.generic.world.block.data.Stairs; /** @@ -82,4 +83,17 @@ public final class BukkitEnumAdapter { } } + public static Slab.Type fromBukkitSlabType(org.bukkit.block.data.type.Slab.Type type) { + switch(type) { + case BOTTOM: + return Slab.Type.BOTTOM; + case TOP: + return Slab.Type.TOP; + case DOUBLE: + return Slab.Type.DOUBLE; + default: + throw new IllegalStateException(); + } + } + } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java index 265599cba..e32421029 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java @@ -8,30 +8,28 @@ import java.util.Set; import java.util.stream.Collectors; public class BukkitMultipleFacing extends BukkitBlockData implements MultipleFacing { - private final org.bukkit.block.data.MultipleFacing delegate; public BukkitMultipleFacing(org.bukkit.block.data.MultipleFacing delegate) { super(delegate); - this.delegate = delegate; } @Override public Set getFaces() { - return delegate.getFaces().stream().map(BukkitEnumAdapter::fromBukkitBlockFace).collect(Collectors.toSet()); + return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).getFaces().stream().map(BukkitEnumAdapter::fromBukkitBlockFace).collect(Collectors.toSet()); } @Override public void setFace(BlockFace face, boolean facing) { - delegate.setFace(TerraEnumAdapter.fromTerraBlockFace(face), facing); + ((org.bukkit.block.data.MultipleFacing) super.getHandle()).setFace(TerraEnumAdapter.fromTerraBlockFace(face), facing); } @Override public Set getAllowedFaces() { - return delegate.getAllowedFaces().stream().map(BukkitEnumAdapter::fromBukkitBlockFace).collect(Collectors.toSet()); + return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).getAllowedFaces().stream().map(BukkitEnumAdapter::fromBukkitBlockFace).collect(Collectors.toSet()); } @Override public boolean hasFace(BlockFace f) { - return delegate.hasFace(TerraEnumAdapter.fromTerraBlockFace(f)); + return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).hasFace(TerraEnumAdapter.fromTerraBlockFace(f)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java new file mode 100644 index 000000000..c69d5b040 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.bukkit.world.block.data; + +import com.dfsek.terra.api.generic.world.block.data.Slab; +import com.dfsek.terra.api.generic.world.block.data.Waterlogged; +import com.dfsek.terra.bukkit.world.block.BukkitBlockData; +import org.bukkit.block.data.BlockData; + +public class BukkitSlab extends BukkitBlockData implements Slab { + public BukkitSlab(BlockData delegate) { + super(delegate); + } + + @Override + public boolean isWaterlogged() { + return ((Waterlogged) getHandle()).isWaterlogged(); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + ((Waterlogged) getHandle()).setWaterlogged(waterlogged); + } + + @Override + public Type getType() { + return BukkitEnumAdapter.fromBukkitSlabType(((org.bukkit.block.data.type.Slab) getHandle()).getType()); + } + + @Override + public void setType(Type type) { + ((org.bukkit.block.data.type.Slab) getHandle()).setType(TerraEnumAdapter.fromTerraSlabType(type)); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java index 3d6cb4fac..04bf258d8 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java @@ -5,50 +5,48 @@ import com.dfsek.terra.api.generic.world.block.data.Stairs; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; public class BukkitStairs extends BukkitBlockData implements Stairs { - private final org.bukkit.block.data.type.Stairs stairs; public BukkitStairs(org.bukkit.block.data.type.Stairs delegate) { super(delegate); - this.stairs = delegate; } @Override public Shape getShape() { - return BukkitEnumAdapter.fromBukkitStair(stairs.getShape()); + return BukkitEnumAdapter.fromBukkitStair(((org.bukkit.block.data.type.Stairs) super.getHandle()).getShape()); } @Override public void setShape(Shape shape) { - stairs.setShape(TerraEnumAdapter.fromTerraStair(shape)); + ((org.bukkit.block.data.type.Stairs) super.getHandle()).setShape(TerraEnumAdapter.fromTerraStair(shape)); } @Override public Half getHalf() { - return BukkitEnumAdapter.fromBukkitHalf(stairs.getHalf()); + return BukkitEnumAdapter.fromBukkitHalf(((org.bukkit.block.data.type.Stairs) super.getHandle()).getHalf()); } @Override public void setHalf(Half half) { - stairs.setHalf(TerraEnumAdapter.fromTerraHalf(half)); + ((org.bukkit.block.data.type.Stairs) super.getHandle()).setHalf(TerraEnumAdapter.fromTerraHalf(half)); } @Override public BlockFace getFacing() { - return BukkitEnumAdapter.fromBukkitBlockFace(stairs.getFacing()); + return BukkitEnumAdapter.fromBukkitBlockFace(((org.bukkit.block.data.type.Stairs) super.getHandle()).getFacing()); } @Override public void setFacing(BlockFace facing) { - stairs.setFacing(TerraEnumAdapter.fromTerraBlockFace(facing)); + ((org.bukkit.block.data.type.Stairs) super.getHandle()).setFacing(TerraEnumAdapter.fromTerraBlockFace(facing)); } @Override public boolean isWaterlogged() { - return stairs.isWaterlogged(); + return ((org.bukkit.block.data.type.Stairs) super.getHandle()).isWaterlogged(); } @Override public void setWaterlogged(boolean waterlogged) { - stairs.setWaterlogged(waterlogged); + ((org.bukkit.block.data.type.Stairs) super.getHandle()).setWaterlogged(waterlogged); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java index 905497237..6d6bc8aa0 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java @@ -4,19 +4,17 @@ import com.dfsek.terra.api.generic.world.block.data.Waterlogged; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; public class BukkitWaterlogged extends BukkitBlockData implements Waterlogged { - private boolean waterlogged; - public BukkitWaterlogged(org.bukkit.block.data.Waterlogged delegate) { super(delegate); } @Override public boolean isWaterlogged() { - return waterlogged; + return ((org.bukkit.block.data.Waterlogged) super.getHandle()).isWaterlogged(); } @Override public void setWaterlogged(boolean waterlogged) { - this.waterlogged = waterlogged; + ((org.bukkit.block.data.Waterlogged) super.getHandle()).setWaterlogged(waterlogged); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java index 5a7bc923c..fb7ceb044 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java @@ -3,6 +3,7 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.generic.world.block.BlockFace; import org.bukkit.block.data.Bisected; +import org.bukkit.block.data.type.Slab; import org.bukkit.block.data.type.Stairs; /** @@ -81,4 +82,17 @@ public final class TerraEnumAdapter { throw new IllegalStateException(); } } + + public static Slab.Type fromTerraSlabType(com.dfsek.terra.api.generic.world.block.data.Slab.Type type) { + switch(type) { + case TOP: + return Slab.Type.TOP; + case DOUBLE: + return Slab.Type.DOUBLE; + case BOTTOM: + return Slab.Type.BOTTOM; + default: + throw new IllegalStateException(); + } + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 10e48db37..337fcf3d3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -15,16 +15,13 @@ import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.fabric.inventory.FabricItemHandle; import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; import com.dfsek.terra.fabric.world.FabricBiome; -import com.dfsek.terra.fabric.world.FabricMaterialData; import com.dfsek.terra.fabric.world.FabricWorldHandle; import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.registry.ConfigRegistry; -import com.dfsek.terra.util.MaterialSet; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; -import net.minecraft.block.Blocks; import net.minecraft.client.world.GeneratorType; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; @@ -141,18 +138,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public void onInitialize() { - MaterialSet set = new MaterialSet(); - - set.add(new FabricMaterialData(Blocks.STONE)); - set.add(new FabricMaterialData(Blocks.DIRT)); - - System.out.println("Contains: " + set.contains(new FabricMaterialData(Blocks.AIR))); - System.out.println("Contains: " + set.contains(new FabricMaterialData(Blocks.STONE))); - - System.out.println("Matches: " + new FabricMaterialData(Blocks.STONE).matches(new FabricMaterialData(Blocks.STONE))); - System.out.println("Matches: " + new FabricMaterialData(Blocks.STONE).matches(new FabricMaterialData(Blocks.DIRT))); - - instance = this; plugin.load(this); config = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeRegistry.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeRegistry.java deleted file mode 100644 index 007a2767d..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiomeRegistry.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.dfsek.terra.fabric.world; - -import com.dfsek.terra.registry.TerraRegistry; -import net.minecraft.world.biome.Biome; - -public class FabricBiomeRegistry extends TerraRegistry { -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index ffd73fdae..9272ffa93 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -5,9 +5,15 @@ import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.fabric.world.block.FabricBlockData; +import com.dfsek.terra.fabric.world.block.FabricMaterialData; +import com.dfsek.terra.fabric.world.block.data.FabricStairs; +import com.dfsek.terra.fabric.world.block.data.FabricWaterlogged; import com.mojang.brigadier.StringReader; import com.mojang.brigadier.exceptions.CommandSyntaxException; +import net.minecraft.block.BlockState; import net.minecraft.command.argument.BlockArgumentParser; +import net.minecraft.state.property.Properties; public class FabricWorldHandle implements WorldHandle { @Override @@ -29,7 +35,11 @@ public class FabricWorldHandle implements WorldHandle { public FabricBlockData createBlockData(String data) { BlockArgumentParser parser = new BlockArgumentParser(new StringReader(data), true); try { - return new FabricBlockData(parser.parse(true).getBlockState()); + BlockState state = parser.parse(true).getBlockState(); + if(state == null) throw new IllegalArgumentException("Invalid data: " + data); + if(state.contains(Properties.STAIR_SHAPE)) return new FabricStairs(state); + if(state.contains(Properties.WATERLOGGED)) return new FabricWaterlogged(state); + return new FabricBlockData(state); } catch(CommandSyntaxException e) { throw new IllegalArgumentException(e); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java similarity index 96% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java index dff5c21d1..4164df37a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlock.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java @@ -1,10 +1,11 @@ -package com.dfsek.terra.fabric.world; +package com.dfsek.terra.fabric.world.block; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.fabric.world.FabricAdapters; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlockData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java similarity index 91% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlockData.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java index 80907decd..d46a680a4 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBlockData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java @@ -1,11 +1,11 @@ -package com.dfsek.terra.fabric.world; +package com.dfsek.terra.fabric.world.block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; import net.minecraft.block.BlockState; public class FabricBlockData implements BlockData { - private final BlockState delegate; + protected BlockState delegate; public FabricBlockData(BlockState delegate) { this.delegate = delegate; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricMaterialData.java similarity index 97% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricMaterialData.java index 075cec94f..19bb30b61 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricMaterialData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricMaterialData.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.fabric.world; +package com.dfsek.terra.fabric.world.block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java new file mode 100644 index 000000000..764cbab34 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java @@ -0,0 +1,57 @@ +package com.dfsek.terra.fabric.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.data.Bisected; +import com.dfsek.terra.api.generic.world.block.data.Stairs; +import net.minecraft.block.enums.BlockHalf; +import net.minecraft.block.enums.StairShape; +import net.minecraft.util.math.Direction; + +public final class FabricEnumAdapter { + public static Stairs.Shape fromFabricStairShape(StairShape shape) { + switch(shape) { + case OUTER_RIGHT: + return Stairs.Shape.OUTER_RIGHT; + case INNER_RIGHT: + return Stairs.Shape.INNER_RIGHT; + case OUTER_LEFT: + return Stairs.Shape.OUTER_LEFT; + case INNER_LEFT: + return Stairs.Shape.INNER_LEFT; + case STRAIGHT: + return Stairs.Shape.STRAIGHT; + default: + throw new IllegalStateException(); + } + } + + public static Bisected.Half fromFabricHalf(BlockHalf half) { + switch(half) { + case BOTTOM: + return Bisected.Half.BOTTOM; + case TOP: + return Bisected.Half.TOP; + default: + throw new IllegalStateException(); + } + } + + public static BlockFace fromFabricDirection(Direction direction) { + switch(direction) { + case DOWN: + return BlockFace.DOWN; + case UP: + return BlockFace.UP; + case WEST: + return BlockFace.WEST; + case EAST: + return BlockFace.EAST; + case NORTH: + return BlockFace.NORTH; + case SOUTH: + return BlockFace.SOUTH; + default: + throw new IllegalStateException(); + } + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java new file mode 100644 index 000000000..74c8b1fb7 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.fabric.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.data.Stairs; +import net.minecraft.block.BlockState; +import net.minecraft.state.property.Properties; + +public class FabricStairs extends FabricWaterlogged implements Stairs { + public FabricStairs(BlockState delegate) { + super(delegate); + } + + @Override + public Shape getShape() { + return FabricEnumAdapter.fromFabricStairShape(getHandle().get(Properties.STAIR_SHAPE)); + } + + @Override + public void setShape(Shape shape) { + super.delegate = getHandle().with(Properties.STAIR_SHAPE, TerraEnumAdapter.fromTerraStairShape(shape)); + } + + @Override + public Half getHalf() { + return FabricEnumAdapter.fromFabricHalf(getHandle().get(Properties.BLOCK_HALF)); + } + + @Override + public void setHalf(Half half) { + super.delegate = getHandle().with(Properties.BLOCK_HALF, TerraEnumAdapter.fromTerraHalf(half)); + } + + @Override + public BlockFace getFacing() { + return FabricEnumAdapter.fromFabricDirection(getHandle().get(Properties.HORIZONTAL_FACING)); + } + + @Override + public void setFacing(BlockFace facing) { + super.delegate = getHandle().with(Properties.HORIZONTAL_FACING, TerraEnumAdapter.fromTerraBlockFace(facing)); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java new file mode 100644 index 000000000..97b3c3dd7 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.fabric.world.block.data; + +import com.dfsek.terra.api.generic.world.block.data.Waterlogged; +import com.dfsek.terra.fabric.world.block.FabricBlockData; +import net.minecraft.block.BlockState; +import net.minecraft.state.property.Properties; + +public class FabricWaterlogged extends FabricBlockData implements Waterlogged { + public FabricWaterlogged(BlockState delegate) { + super(delegate); + } + + @Override + public boolean isWaterlogged() { + return delegate.get(Properties.WATERLOGGED); + } + + @Override + public void setWaterlogged(boolean waterlogged) { + super.delegate = delegate.with(Properties.WATERLOGGED, waterlogged); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java new file mode 100644 index 000000000..ca85256c4 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java @@ -0,0 +1,57 @@ +package com.dfsek.terra.fabric.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.data.Bisected; +import com.dfsek.terra.api.generic.world.block.data.Stairs; +import net.minecraft.block.enums.BlockHalf; +import net.minecraft.block.enums.StairShape; +import net.minecraft.util.math.Direction; + +public final class TerraEnumAdapter { + public static StairShape fromTerraStairShape(Stairs.Shape shape) { + switch(shape) { + case STRAIGHT: + return StairShape.STRAIGHT; + case INNER_LEFT: + return StairShape.INNER_LEFT; + case OUTER_LEFT: + return StairShape.OUTER_LEFT; + case INNER_RIGHT: + return StairShape.INNER_RIGHT; + case OUTER_RIGHT: + return StairShape.OUTER_RIGHT; + default: + throw new IllegalStateException(); + } + } + + public static BlockHalf fromTerraHalf(Bisected.Half half) { + switch(half) { + case TOP: + return BlockHalf.TOP; + case BOTTOM: + return BlockHalf.BOTTOM; + default: + throw new IllegalStateException(); + } + } + + public static Direction fromTerraBlockFace(BlockFace face) { + switch(face) { + case SOUTH: + return Direction.SOUTH; + case NORTH: + return Direction.NORTH; + case EAST: + return Direction.EAST; + case WEST: + return Direction.WEST; + case UP: + return Direction.UP; + case DOWN: + return Direction.DOWN; + default: + throw new IllegalArgumentException(); + } + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java index 0cd669eb8..35f9f7d06 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java @@ -2,7 +2,7 @@ package com.dfsek.terra.fabric.world.generator; import com.dfsek.terra.api.generic.generator.ChunkGenerator; import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.fabric.world.FabricBlockData; +import com.dfsek.terra.fabric.world.block.FabricBlockData; import net.minecraft.util.math.BlockPos; import net.minecraft.world.chunk.Chunk; import org.jetbrains.annotations.NotNull; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java index b6771418d..118ed8133 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java @@ -3,7 +3,7 @@ package com.dfsek.terra.fabric.world.handles.chunk; import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.fabric.world.FabricBlock; +import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ChunkRegion; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java index 7702e054a..cf871c34c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java @@ -7,7 +7,7 @@ import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.fabric.world.FabricBlock; +import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.util.math.BlockPos; import net.minecraft.world.WorldAccess; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index a68d985e7..4e77be7aa 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -7,8 +7,9 @@ import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.fabric.world.FabricBlock; +import com.dfsek.terra.fabric.world.block.FabricBlock; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.WorldAccess; import java.io.File; @@ -24,7 +25,7 @@ public class FabricWorldAccess implements World { @Override public long getSeed() { - return 1234; // TODO: actually implement this + return ((StructureWorldAccess) delegate).getSeed(); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java index da6fca15e..cd86e48a9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java @@ -7,7 +7,7 @@ import com.dfsek.terra.api.generic.world.Chunk; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.fabric.world.FabricBlock; +import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.util.math.BlockPos; import net.minecraft.world.ChunkRegion; From eda976bb5d3e6015f46f4cc7793b732944d05974 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Dec 2020 16:33:08 -0700 Subject: [PATCH 045/210] Fix Fabric main config loading --- .../dfsek/terra/api/generic/TerraPlugin.java | 2 ++ .../dfsek/terra/config/base/ConfigPack.java | 4 ++++ .../dfsek/terra/fabric/TerraFabricPlugin.java | 24 ++++++++++++++++++- .../fabric/src/main/resources/config.yml | 9 +++++++ 4 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 platforms/fabric/src/main/resources/config.yml diff --git a/common/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java b/common/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java index 4b99eede7..47c845f92 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java +++ b/common/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java @@ -34,4 +34,6 @@ public interface TerraPlugin extends LoaderRegistrar { void reload(); ItemHandle getItemHandle(); + + void saveDefaultConfig(); } diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index f0bc3d7db..a3aceb438 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -229,4 +229,8 @@ public class ConfigPack implements LoaderRegistrar { .registerLoader(Ore.class, oreRegistry) .registerLoader(Tree.class, treeRegistry); } + + public BiomeRegistry getBiomeRegistry() { + return biomeRegistry; + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 337fcf3d3..b116b2cc7 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -29,9 +29,11 @@ import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; +import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; @@ -121,6 +123,15 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { return itemHandle; } + @Override + public void saveDefaultConfig() { + try(InputStream stream = getClass().getResourceAsStream("/config.yml")) { + FileUtils.copyInputStreamToFile(stream, new File(getDataFolder(), "config.yml")); + } catch(IOException e) { + e.printStackTrace(); + } + } + @Override public void register(TypeRegistry registry) { genericLoaders.register(registry); @@ -139,12 +150,23 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public void onInitialize() { instance = this; - plugin.load(this); config = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); + saveDefaultConfig(); + plugin.load(this); LangUtil.load("en_us", this); logger.info("Initializing Terra..."); registry.loadAll(this); + /* + registry.forEach(config -> { + String pack = config.getTemplate().getID().toLowerCase(); + config.getBiomeRegistry().forEach(terraBiome -> { + Biome biome = (new Biome.Builder()).build(); + Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", pack + "_" + terraBiome.getID().toLowerCase()), biome); + }); + }); + */ + if(FabricLoader.getInstance().getEnvironmentType().equals(EnvType.CLIENT)) { GeneratorTypeAccessor.getValues().add(new GeneratorType("terra") { @Override diff --git a/platforms/fabric/src/main/resources/config.yml b/platforms/fabric/src/main/resources/config.yml new file mode 100644 index 000000000..b13793a3f --- /dev/null +++ b/platforms/fabric/src/main/resources/config.yml @@ -0,0 +1,9 @@ +debug: false +data-save: PT6M +language: "en_us" +fail-type: SHUTDOWN +dump-default: true +biome-search-resolution: 4 +cache-size: 384 +master-disable: + caves: false \ No newline at end of file From 11c8025ef44398d15114dd72ab3a0f5e57446168 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Dec 2020 16:33:19 -0700 Subject: [PATCH 046/210] Fix Fabric carver cache flushing --- .../world/handles/world/FabricWorldChunkRegion.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java index cd86e48a9..9e6ca13eb 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java @@ -69,6 +69,17 @@ public class FabricWorldChunkRegion implements World { return new FabricBlock(pos, delegate.chunk); } + @Override + public int hashCode() { + return delegate.generator.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof FabricWorldChunkRegion)) return false; + return ((FabricWorldChunkRegion) obj).delegate.generator.equals(delegate.generator); + } + @Override public Block getBlockAt(Location l) { return getBlockAt(l.getBlockX(), l.getBlockY(), l.getBlockZ()); From 42231cf3195f8ba7e4cf2168dfff4bdc4a3975b9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Dec 2020 17:09:47 -0700 Subject: [PATCH 047/210] fabric slabs & MultipleFacing --- .../bukkit/world/block/data/BukkitSlab.java | 17 +---- .../terra/fabric/world/FabricWorldHandle.java | 7 ++ .../world/block/data/FabricEnumAdapter.java | 15 ++++ .../block/data/FabricMultipleFacing.java | 69 +++++++++++++++++++ .../fabric/world/block/data/FabricSlab.java | 21 ++++++ .../world/block/data/TerraEnumAdapter.java | 15 ++++ 6 files changed, 129 insertions(+), 15 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java index c69d5b040..b889f311e 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java @@ -1,25 +1,12 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.generic.world.block.data.Slab; -import com.dfsek.terra.api.generic.world.block.data.Waterlogged; -import com.dfsek.terra.bukkit.world.block.BukkitBlockData; -import org.bukkit.block.data.BlockData; -public class BukkitSlab extends BukkitBlockData implements Slab { - public BukkitSlab(BlockData delegate) { +public class BukkitSlab extends BukkitWaterlogged implements Slab { + public BukkitSlab(org.bukkit.block.data.type.Slab delegate) { super(delegate); } - @Override - public boolean isWaterlogged() { - return ((Waterlogged) getHandle()).isWaterlogged(); - } - - @Override - public void setWaterlogged(boolean waterlogged) { - ((Waterlogged) getHandle()).setWaterlogged(waterlogged); - } - @Override public Type getType() { return BukkitEnumAdapter.fromBukkitSlabType(((org.bukkit.block.data.type.Slab) getHandle()).getType()); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index 9272ffa93..fd36927df 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -7,6 +7,8 @@ import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricMaterialData; +import com.dfsek.terra.fabric.world.block.data.FabricMultipleFacing; +import com.dfsek.terra.fabric.world.block.data.FabricSlab; import com.dfsek.terra.fabric.world.block.data.FabricStairs; import com.dfsek.terra.fabric.world.block.data.FabricWaterlogged; import com.mojang.brigadier.StringReader; @@ -15,6 +17,8 @@ import net.minecraft.block.BlockState; import net.minecraft.command.argument.BlockArgumentParser; import net.minecraft.state.property.Properties; +import java.util.Arrays; + public class FabricWorldHandle implements WorldHandle { @Override public void setBlockData(Block block, BlockData data, boolean physics) { @@ -38,6 +42,9 @@ public class FabricWorldHandle implements WorldHandle { BlockState state = parser.parse(true).getBlockState(); if(state == null) throw new IllegalArgumentException("Invalid data: " + data); if(state.contains(Properties.STAIR_SHAPE)) return new FabricStairs(state); + if(state.contains(Properties.SLAB_TYPE)) return new FabricSlab(state); + if(state.getProperties().containsAll(Arrays.asList(Properties.NORTH, Properties.SOUTH, Properties.EAST, Properties.WEST))) + return new FabricMultipleFacing(state); if(state.contains(Properties.WATERLOGGED)) return new FabricWaterlogged(state); return new FabricBlockData(state); } catch(CommandSyntaxException e) { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java index 764cbab34..1cf39dc2f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java @@ -2,8 +2,10 @@ package com.dfsek.terra.fabric.world.block.data; import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.data.Bisected; +import com.dfsek.terra.api.generic.world.block.data.Slab; import com.dfsek.terra.api.generic.world.block.data.Stairs; import net.minecraft.block.enums.BlockHalf; +import net.minecraft.block.enums.SlabType; import net.minecraft.block.enums.StairShape; import net.minecraft.util.math.Direction; @@ -54,4 +56,17 @@ public final class FabricEnumAdapter { throw new IllegalStateException(); } } + + public static Slab.Type fromFabricSlabType(SlabType type) { + switch(type) { + case BOTTOM: + return Slab.Type.BOTTOM; + case TOP: + return Slab.Type.TOP; + case DOUBLE: + return Slab.Type.DOUBLE; + default: + throw new IllegalStateException(); + } + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java new file mode 100644 index 000000000..a397f4e58 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java @@ -0,0 +1,69 @@ +package com.dfsek.terra.fabric.world.block.data; + +import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.generic.world.block.data.MultipleFacing; +import com.dfsek.terra.fabric.world.block.FabricBlockData; +import net.minecraft.block.BlockState; +import net.minecraft.state.property.Properties; + +import java.util.HashSet; +import java.util.Set; + +public class FabricMultipleFacing extends FabricBlockData implements MultipleFacing { + public FabricMultipleFacing(BlockState delegate) { + super(delegate); + } + + @Override + public Set getFaces() { + Set set = new HashSet<>(); + if(delegate.get(Properties.NORTH)) set.add(BlockFace.NORTH); + if(delegate.get(Properties.SOUTH)) set.add(BlockFace.SOUTH); + if(delegate.get(Properties.EAST)) set.add(BlockFace.EAST); + if(delegate.get(Properties.WEST)) set.add(BlockFace.WEST); + if(delegate.contains(Properties.UP) && delegate.get(Properties.UP)) set.add(BlockFace.UP); + if(delegate.contains(Properties.DOWN) && delegate.get(Properties.DOWN)) set.add(BlockFace.DOWN); + return set; + } + + @Override + public void setFace(BlockFace face, boolean facing) { + switch(face) { + case NORTH: + delegate = delegate.with(Properties.NORTH, facing); + break; + case SOUTH: + delegate = delegate.with(Properties.SOUTH, facing); + break; + case EAST: + delegate = delegate.with(Properties.EAST, facing); + break; + case WEST: + delegate = delegate.with(Properties.WEST, facing); + break; + case UP: + delegate = delegate.with(Properties.UP, facing); + break; + case DOWN: + delegate = delegate.with(Properties.DOWN, facing); + break; + } + } + + @Override + public Set getAllowedFaces() { + Set set = new HashSet<>(); + if(delegate.contains(Properties.NORTH)) set.add(BlockFace.NORTH); + if(delegate.contains(Properties.SOUTH)) set.add(BlockFace.SOUTH); + if(delegate.contains(Properties.EAST)) set.add(BlockFace.EAST); + if(delegate.contains(Properties.WEST)) set.add(BlockFace.WEST); + if(delegate.contains(Properties.UP)) set.add(BlockFace.UP); + if(delegate.contains(Properties.DOWN)) set.add(BlockFace.DOWN); + return set; + } + + @Override + public boolean hasFace(BlockFace f) { + return getFaces().contains(f); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java new file mode 100644 index 000000000..4f66c02d4 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.fabric.world.block.data; + +import com.dfsek.terra.api.generic.world.block.data.Slab; +import net.minecraft.block.BlockState; +import net.minecraft.state.property.Properties; + +public class FabricSlab extends FabricWaterlogged implements Slab { + public FabricSlab(BlockState delegate) { + super(delegate); + } + + @Override + public Type getType() { + return FabricEnumAdapter.fromFabricSlabType(delegate.get(Properties.SLAB_TYPE)); + } + + @Override + public void setType(Type type) { + delegate = delegate.with(Properties.SLAB_TYPE, TerraEnumAdapter.fromTerraSlabType(type)); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java index ca85256c4..019b70e74 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java @@ -2,8 +2,10 @@ package com.dfsek.terra.fabric.world.block.data; import com.dfsek.terra.api.generic.world.block.BlockFace; import com.dfsek.terra.api.generic.world.block.data.Bisected; +import com.dfsek.terra.api.generic.world.block.data.Slab; import com.dfsek.terra.api.generic.world.block.data.Stairs; import net.minecraft.block.enums.BlockHalf; +import net.minecraft.block.enums.SlabType; import net.minecraft.block.enums.StairShape; import net.minecraft.util.math.Direction; @@ -54,4 +56,17 @@ public final class TerraEnumAdapter { throw new IllegalArgumentException(); } } + + public static SlabType fromTerraSlabType(Slab.Type type) { + switch(type) { + case DOUBLE: + return SlabType.DOUBLE; + case TOP: + return SlabType.TOP; + case BOTTOM: + return SlabType.BOTTOM; + default: + throw new IllegalStateException(); + } + } } From 3b0abb7a201eae74644edd1aacc49fea5e38de97 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Dec 2020 18:19:34 -0700 Subject: [PATCH 048/210] Add access widener to mod.json --- platforms/fabric/src/main/resources/fabric.mod.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platforms/fabric/src/main/resources/fabric.mod.json b/platforms/fabric/src/main/resources/fabric.mod.json index 8bdd45848..d86abc872 100644 --- a/platforms/fabric/src/main/resources/fabric.mod.json +++ b/platforms/fabric/src/main/resources/fabric.mod.json @@ -26,5 +26,6 @@ "fabricloader": ">=0.7.4", "fabric": "*", "minecraft": "1.16.x" - } + }, + "accessWidener": "terra.accesswidener" } \ No newline at end of file From 0dc0742e81894b59892e5a55342c7a3c53ed23ba Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Dec 2020 22:51:25 -0700 Subject: [PATCH 049/210] Implement Transformer API --- .../translator/AttemptsFailedException.java | 19 +++++++ .../terra/api/translator/MapTransform.java | 32 +++++++++++ .../dfsek/terra/api/translator/Transform.java | 9 +++ .../api/translator/TransformException.java | 19 +++++++ .../terra/api/translator/Transformer.java | 57 +++++++++++++++++++ 5 files changed, 136 insertions(+) create mode 100644 common/src/main/java/com/dfsek/terra/api/translator/AttemptsFailedException.java create mode 100644 common/src/main/java/com/dfsek/terra/api/translator/MapTransform.java create mode 100644 common/src/main/java/com/dfsek/terra/api/translator/Transform.java create mode 100644 common/src/main/java/com/dfsek/terra/api/translator/TransformException.java create mode 100644 common/src/main/java/com/dfsek/terra/api/translator/Transformer.java diff --git a/common/src/main/java/com/dfsek/terra/api/translator/AttemptsFailedException.java b/common/src/main/java/com/dfsek/terra/api/translator/AttemptsFailedException.java new file mode 100644 index 000000000..b5f23a6f2 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/translator/AttemptsFailedException.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.api.translator; + +public class AttemptsFailedException extends RuntimeException { + public AttemptsFailedException() { + super(); + } + + public AttemptsFailedException(String message) { + super(message); + } + + public AttemptsFailedException(String message, Throwable cause) { + super(message, cause); + } + + public AttemptsFailedException(Throwable cause) { + super(cause); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/translator/MapTransform.java b/common/src/main/java/com/dfsek/terra/api/translator/MapTransform.java new file mode 100644 index 000000000..03edbbabb --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/translator/MapTransform.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.api.translator; + +import java.util.HashMap; +import java.util.Map; + +public class MapTransform implements Transform { + private final Map map; + + public MapTransform(Map map) { + this.map = map; + } + + public MapTransform() { + this.map = new HashMap<>(); + } + + public MapTransform add(F from, T to) { + map.put(from, to); + return this; + } + + public MapTransform remove(F from) { + map.remove(from); + return this; + } + + @Override + public T transform(F input) throws TransformException { + if(!map.containsKey(input)) throw new TransformException("No key matching " + input.toString() + " found in map."); + return map.get(input); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/translator/Transform.java b/common/src/main/java/com/dfsek/terra/api/translator/Transform.java new file mode 100644 index 000000000..c186c1e8e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/translator/Transform.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.api.translator; + +/** + * Interface to transform data from one type to another. + */ +@FunctionalInterface +public interface Transform { + T transform(F input) throws TransformException; +} diff --git a/common/src/main/java/com/dfsek/terra/api/translator/TransformException.java b/common/src/main/java/com/dfsek/terra/api/translator/TransformException.java new file mode 100644 index 000000000..419dc4c23 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/translator/TransformException.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.api.translator; + +public class TransformException extends Exception { + public TransformException() { + super(); + } + + public TransformException(String message) { + super(message); + } + + public TransformException(String message, Throwable cause) { + super(message, cause); + } + + public TransformException(Throwable cause) { + super(cause); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java b/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java new file mode 100644 index 000000000..6d7252c2a --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java @@ -0,0 +1,57 @@ +package com.dfsek.terra.api.translator; + +import java.util.ArrayList; +import java.util.List; + +/** + * Class to translate types from one style/platform to another. + * + * @param Data type to transform from. + * @param Data type to transform to. + */ +public class Transformer { + private final List> transformer; + + private Transformer(List> transformer) { + this.transformer = transformer; + } + + /** + * Translate data from {@code from} type to {@code to} type. + * + * @param from Data to translate + * @return Result + */ + public T translate(F from) { + List exceptions = new ArrayList<>(); + for(Transform transform : transformer) { + try { + return transform.transform(from); + } catch(TransformException exception) { + exceptions.add(exception); + } + } + StringBuilder exBuilder = new StringBuilder("Could not transform input; all attempts failed: ").append(from.toString()).append("\n"); + for(TransformException exception : exceptions) exBuilder.append(exception.getMessage()).append("\n"); + throw new AttemptsFailedException(exBuilder.toString()); + } + + /** + * Builder pattern for building Transformers + * + * @param + * @param + */ + public static class Builder { + private final List> transforms = new ArrayList<>(); + + public Builder addTransform(Transform transform) { + transforms.add(transform); + return this; + } + + public Transformer build() { + return new Transformer<>(transforms); + } + } +} From 4d59c27a13a6cf2e7db4911bcebe252a90183364 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Dec 2020 22:51:45 -0700 Subject: [PATCH 050/210] Reimplement fractal trees --- .../api/gaea/tree/fractal/FractalTree.java | 9 ++- .../api/gaea/tree/fractal/trees/Cactus.java | 7 ++ .../api/gaea/tree/fractal/trees/IceSpike.java | 9 +++ .../api/gaea/tree/fractal/trees/OakTree.java | 7 ++ .../tree/fractal/trees/ShatteredPillar.java | 7 ++ .../tree/fractal/trees/ShatteredTree.java | 6 ++ .../fractal/trees/SmallShatteredPillar.java | 7 ++ .../fractal/trees/SmallShatteredTree.java | 6 ++ .../gaea/tree/fractal/trees/SpruceTree.java | 7 ++ .../terra/config/templates/BiomeTemplate.java | 2 +- .../dfsek/terra/registry/TreeRegistry.java | 64 ++++++++++++++++++- .../fabric/world/block/FabricBlockData.java | 2 +- 12 files changed, 125 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java index d0dad638e..a5723cc0c 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.util.MaterialSet; import java.util.HashMap; import java.util.List; @@ -18,9 +19,11 @@ import java.util.function.Consumer; public abstract class FractalTree { private final Map treeAssembler = new HashMap<>(); private final List entities = new GlueList<>(); - private final Location origin; - private final Random random; - private final TerraPlugin main; + protected final Location origin; + protected final Random random; + protected final TerraPlugin main; + + public abstract MaterialSet getSpawnable(); /** * Instantiates a TreeGrower at an origin location. diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java index 5bc7272f7..f9208b712 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java @@ -4,10 +4,17 @@ import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.util.MaterialSet; import java.util.Random; public class Cactus extends FractalTree { + @Override + public MaterialSet getSpawnable() { + return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:sand"), + main.getWorldHandle().createMaterialData("minecraft:red_sand")); + } + /** * Instantiates a TreeGrower at an origin location. * diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java index 935c59759..74769d6d2 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java @@ -8,6 +8,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.util.MaterialSet; import java.util.Random; @@ -16,6 +17,14 @@ public class IceSpike extends FractalTree { private final TreeGeometry geo; private final ProbabilityCollection ice; + @Override + public MaterialSet getSpawnable() { + return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:stone"), + main.getWorldHandle().createMaterialData("minecraft:gravel"), + main.getWorldHandle().createMaterialData("minecraft:snow_block"), + main.getWorldHandle().createMaterialData("minecraft:grass_block")); + } + /** * Instantiates a TreeGrower at an origin location. * diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java index e55e3af2d..29b52b1e4 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; import java.util.Random; @@ -14,6 +15,12 @@ import java.util.Random; public class OakTree extends FractalTree { private final TreeGeometry geo; + @Override + public MaterialSet getSpawnable() { + return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:podzol"), + main.getWorldHandle().createMaterialData("minecraft:grass_block")); + } + /** * Instantiates a TreeGrower at an origin location. * diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java index f495bc4ec..1d69ce7f9 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java @@ -4,10 +4,17 @@ import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.util.MaterialSet; import java.util.Random; public class ShatteredPillar extends FractalTree { + + @Override + public MaterialSet getSpawnable() { + return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:end_stone")); + } + /** * Instantiates a TreeGrower at an origin location. * diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java index 4c366053b..ab3e3bcd3 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java @@ -8,6 +8,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; import java.util.Random; @@ -17,6 +18,11 @@ public class ShatteredTree extends FractalTree { private final ProbabilityCollection bark; private final ProbabilityCollection leaves; + @Override + public MaterialSet getSpawnable() { + return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:end_stone")); + } + /** * Instantiates a TreeGrower at an origin location. * diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java index a4f779e86..93642d63f 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java @@ -4,10 +4,17 @@ import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.util.MaterialSet; import java.util.Random; public class SmallShatteredPillar extends FractalTree { + + @Override + public MaterialSet getSpawnable() { + return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:end_stone")); + } + /** * Instantiates a TreeGrower at an origin location. * diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java index 18bc86486..56d83526f 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java @@ -8,6 +8,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; import java.util.Random; @@ -17,6 +18,11 @@ public class SmallShatteredTree extends FractalTree { private final ProbabilityCollection bark; private final ProbabilityCollection leaves; + @Override + public MaterialSet getSpawnable() { + return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:end_stone")); + } + /** * Instantiates a TreeGrower at an origin location. * diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java index 7a9a9ff8a..92674c467 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.generic.TerraPlugin; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; import java.util.Random; @@ -13,6 +14,12 @@ import java.util.Random; public class SpruceTree extends FractalTree { private final TreeGeometry geo; + @Override + public MaterialSet getSpawnable() { + return MaterialSet.get(main.getWorldHandle().createMaterialData("minecraft:podzol"), + main.getWorldHandle().createMaterialData("minecraft:grass_block")); + } + /** * Instantiates a TreeGrower at an origin location. * diff --git a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index d82f72dc0..c037edf52 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -89,7 +89,7 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf @Default private List flora = new GlueList<>(); - //@Value("trees") + @Value("trees") @Abstractable @Default private List trees = new GlueList<>(); diff --git a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java index 35464bccb..d36b66a4b 100644 --- a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java @@ -1,10 +1,22 @@ package com.dfsek.terra.registry; import com.dfsek.terra.api.gaea.tree.Tree; +import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; +import com.dfsek.terra.api.gaea.tree.fractal.trees.Cactus; +import com.dfsek.terra.api.gaea.tree.fractal.trees.OakTree; +import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredPillar; +import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredTree; +import com.dfsek.terra.api.gaea.tree.fractal.trees.SmallShatteredPillar; +import com.dfsek.terra.api.gaea.tree.fractal.trees.SmallShatteredTree; +import com.dfsek.terra.api.gaea.tree.fractal.trees.SpruceTree; import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.MaterialData; import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.util.MaterialSet; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; import java.util.Random; import java.util.Set; @@ -16,6 +28,27 @@ public class TreeRegistry extends TerraRegistry { addTree("ACACIA"); addTree("BIRCH"); addTree("BROWN_MUSHROOM"); + tryAdd("CACTUS", Cactus.class); + addTree("CHORUS_PLANT"); + addTree("DARK_OAK"); + tryAdd("GIANT_OAK", OakTree.class); + tryAdd("GIANT_SPRUCE", SpruceTree.class); + addTree("JUNGLE"); + addTree("JUNGLE_COCOA"); + addTree("JUNGLE_BUSH"); + addTree("LARGE_OAK"); + tryAdd("LARGE_SHATTERED_PILLAR", ShatteredPillar.class); + addTree("LARGE_SPRUCE"); + addTree("MEGA_SPRUCE"); + addTree("OAK"); + addTree("RED_MUSHROOM"); + tryAdd("SHATTERED_LARGE", ShatteredTree.class); + tryAdd("SHATTERED_SMALL", SmallShatteredTree.class); + addTree("SMALL_JUNGLE"); + addTree("SPRUCE"); + addTree("SWAMP_OAK"); + tryAdd("SMALL_SHATTERED_PILLAR", SmallShatteredPillar.class); + addTree("TALL_BIRCH"); } private void addTree(String id) { @@ -26,16 +59,41 @@ public class TreeRegistry extends TerraRegistry { } } - private static final class FractalTreeHolder implements Tree { + private void tryAdd(String id, Class value) { + try { + add(id, new FractalTreeHolder(value)); + } catch(Exception e) { + main.getLogger().warning("Unable to load tree " + id + ": " + e.getMessage()); + } + } + + private final class FractalTreeHolder implements Tree { // TODO: this is jank and should be replaced later. + private final Constructor constructor; + private final MaterialSet set; + + private FractalTreeHolder(Class clazz) throws NoSuchMethodException { + constructor = clazz.getConstructor(Location.class, Random.class, TerraPlugin.class); + WorldHandle h = main.getWorldHandle(); + set = MaterialSet.get(h.createMaterialData("minecraft:grass_block"), h.createMaterialData("minecraft:snow_block")); // TODO: actually implement + } @Override public boolean plant(Location l, Random r) { - return false; + try { + FractalTree tree = constructor.newInstance(l, r, main); + if(!getSpawnable().contains(l.subtract(0, 1, 0).getBlock().getType())) return false; + tree.grow(); + tree.plant(); + return true; + } catch(InstantiationException | IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + return false; + } } @Override public Set getSpawnable() { - return null; + return set; } } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java index d46a680a4..683ad720a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java @@ -24,7 +24,7 @@ public class FabricBlockData implements BlockData { @Override public BlockData clone() { try { - return (BlockData) super.clone(); + return (FabricBlockData) super.clone(); } catch(CloneNotSupportedException e) { throw new Error(e); } From ee35c371ec292998b7717193eb88e18e78a51678 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 14 Dec 2020 23:53:01 -0700 Subject: [PATCH 051/210] Trees on Bukkit --- .../api/gaea/tree/fractal/trees/Cactus.java | 1 + .../terra/api/translator/Transformer.java | 6 +++--- .../com/dfsek/terra/registry/TreeRegistry.java | 3 ++- .../java/com/dfsek/terra/util/StringUtils.java | 14 ++++++++++++++ .../dfsek/terra/bukkit/BukkitWorldHandle.java | 9 +++++++-- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 18 ++++++++++++++++++ 6 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/util/StringUtils.java diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java index f9208b712..a8cc064d7 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java @@ -15,6 +15,7 @@ public class Cactus extends FractalTree { main.getWorldHandle().createMaterialData("minecraft:red_sand")); } + /** * Instantiates a TreeGrower at an origin location. * diff --git a/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java b/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java index 6d7252c2a..b87d873df 100644 --- a/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java +++ b/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java @@ -23,16 +23,16 @@ public class Transformer { * @return Result */ public T translate(F from) { - List exceptions = new ArrayList<>(); + List exceptions = new ArrayList<>(); for(Transform transform : transformer) { try { return transform.transform(from); - } catch(TransformException exception) { + } catch(Exception exception) { exceptions.add(exception); } } StringBuilder exBuilder = new StringBuilder("Could not transform input; all attempts failed: ").append(from.toString()).append("\n"); - for(TransformException exception : exceptions) exBuilder.append(exception.getMessage()).append("\n"); + for(Exception exception : exceptions) exBuilder.append(exception.getMessage()).append("\n"); throw new AttemptsFailedException(exBuilder.toString()); } diff --git a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java index d36b66a4b..0aa82898e 100644 --- a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java @@ -3,6 +3,7 @@ package com.dfsek.terra.registry; import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; import com.dfsek.terra.api.gaea.tree.fractal.trees.Cactus; +import com.dfsek.terra.api.gaea.tree.fractal.trees.IceSpike; import com.dfsek.terra.api.gaea.tree.fractal.trees.OakTree; import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredPillar; import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredTree; @@ -48,6 +49,7 @@ public class TreeRegistry extends TerraRegistry { addTree("SPRUCE"); addTree("SWAMP_OAK"); tryAdd("SMALL_SHATTERED_PILLAR", SmallShatteredPillar.class); + tryAdd("ICE_SPIKE", IceSpike.class); addTree("TALL_BIRCH"); } @@ -81,7 +83,6 @@ public class TreeRegistry extends TerraRegistry { public boolean plant(Location l, Random r) { try { FractalTree tree = constructor.newInstance(l, r, main); - if(!getSpawnable().contains(l.subtract(0, 1, 0).getBlock().getType())) return false; tree.grow(); tree.plant(); return true; diff --git a/common/src/main/java/com/dfsek/terra/util/StringUtils.java b/common/src/main/java/com/dfsek/terra/util/StringUtils.java new file mode 100644 index 000000000..5c579e3f9 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/util/StringUtils.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.util; + +public final class StringUtils { + /** + * Strip Minecraft namespace from string + * + * @param in String to strip namespace of + * @return Stripped string/ + */ + public static String stripMinecraftNamespace(String in) { + if(!in.startsWith("minecraft:")) return in; + return in.substring(10); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java index 2566a891d..02f4fe45f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.translator.Transformer; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.bukkit.world.block.data.BukkitMultipleFacing; @@ -13,18 +14,22 @@ import com.dfsek.terra.bukkit.world.block.data.BukkitStairs; import com.dfsek.terra.bukkit.world.block.data.BukkitWaterlogged; import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.TreeType; import org.bukkit.block.data.MultipleFacing; import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Stairs; public class BukkitWorldHandle implements WorldHandle { private final TerraPlugin main; + private Transformer treeTransformer; public BukkitWorldHandle(TerraPlugin main) { this.main = main; } + public void setTreeTransformer(Transformer treeTransformer) { + this.treeTransformer = treeTransformer; + } + @Override public void setBlockData(Block block, BlockData data, boolean physics) { block.setBlockData(data, physics); @@ -56,6 +61,6 @@ public class BukkitWorldHandle implements WorldHandle { @Override public Tree getTree(String id) { - return new BukkitTree(TreeType.valueOf(id), main); + return treeTransformer.translate(id); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 22b9d1dfb..09105d372 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -5,12 +5,15 @@ import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.GenericLoaders; import com.dfsek.terra.api.gaea.lang.Language; import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.generic.Tree; import com.dfsek.terra.api.generic.inventory.ItemHandle; import com.dfsek.terra.api.generic.world.Biome; import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.translator.MapTransform; +import com.dfsek.terra.api.translator.Transformer; import com.dfsek.terra.bukkit.command.command.TerraCommand; import com.dfsek.terra.bukkit.command.command.structure.LocateCommand; import com.dfsek.terra.bukkit.generator.BukkitChunkGenerator; @@ -25,8 +28,10 @@ import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.registry.ConfigRegistry; +import com.dfsek.terra.util.StringUtils; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; +import org.bukkit.TreeType; import org.bukkit.command.PluginCommand; import org.bukkit.entity.EntityType; import org.bukkit.generator.ChunkGenerator; @@ -84,6 +89,19 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { public void onEnable() { Debug.setLogger(getLogger()); // Set debug logger. + ((BukkitWorldHandle) handle).setTreeTransformer(new Transformer.Builder() + .addTransform(id -> new BukkitTree(TreeType.valueOf(id), this)) // First try getting directly from enum + .addTransform(new MapTransform() // Then try map of less stupid names + .add("JUNGLE_COCOA", new BukkitTree(TreeType.COCOA_TREE, this)) + .add("LARGE_OAK", new BukkitTree(TreeType.BIG_TREE, this)) + .add("LARGE_SPRUCE", new BukkitTree(TreeType.TALL_REDWOOD, this)) + .add("SPRUCE", new BukkitTree(TreeType.REDWOOD, this)) + .add("OAK", new BukkitTree(TreeType.TREE, this)) + .add("MEGA_SPRUCE", new BukkitTree(TreeType.MEGA_REDWOOD, this)) + .add("SWAMP_OAK", new BukkitTree(TreeType.SWAMP, this))) + .addTransform(id -> new BukkitTree(TreeType.valueOf(StringUtils.stripMinecraftNamespace(id)), this)) // Finally, try stripping minecraft namespace. + .build()); + saveDefaultConfig(); Metrics metrics = new Metrics(this, 9017); // Set up bStats. From 6f6767ab863407027137d7e54707f9f04c58c377 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 15 Dec 2020 02:03:54 -0700 Subject: [PATCH 052/210] Trees no longer crash fabric. they are incredibly dumb on fabric so i will do them later --- .../terra/api/translator/Transformer.java | 5 ++- .../dfsek/terra/fabric/TerraFabricPlugin.java | 28 +++++++++++++ .../dfsek/terra/fabric/world/FabricTree.java | 42 +++++++++++++++++++ .../terra/fabric/world/FabricWorldHandle.java | 10 ++++- .../FabricChunkGeneratorWrapper.java | 2 + 5 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java diff --git a/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java b/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java index b87d873df..5a7efd66e 100644 --- a/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java +++ b/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java @@ -32,7 +32,10 @@ public class Transformer { } } StringBuilder exBuilder = new StringBuilder("Could not transform input; all attempts failed: ").append(from.toString()).append("\n"); - for(Exception exception : exceptions) exBuilder.append(exception.getMessage()).append("\n"); + for(Exception exception : exceptions) { + exBuilder.append(exception.getMessage()).append("\n"); + exception.printStackTrace(); + } throw new AttemptsFailedException(exBuilder.toString()); } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index b116b2cc7..3e95b66a9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -10,6 +10,8 @@ import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.translator.MapTransform; +import com.dfsek.terra.api.translator.Transformer; import com.dfsek.terra.config.base.PluginConfig; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.fabric.inventory.FabricItemHandle; @@ -29,6 +31,10 @@ import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.HugeMushroomFeature; +import net.minecraft.world.gen.feature.TreeFeature; import org.apache.commons.io.FileUtils; import java.io.File; @@ -150,6 +156,27 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public void onInitialize() { instance = this; + + Map> treeFeatureMap = new HashMap<>(); + BuiltinRegistries.CONFIGURED_FEATURE.stream().filter(feature -> + feature.feature instanceof TreeFeature + || feature.feature instanceof HugeMushroomFeature).forEach(tree -> System.out.println(BuiltinRegistries.CONFIGURED_FEATURE.getId(tree))); + + Transformer> treeTransformer = new Transformer.Builder>() + .addTransform(id -> BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse(id))) + .addTransform(new MapTransform>() + .add("BROWN_MUSHROOM", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:huge_brown_mushroom"))) + .add("RED_MUSHROOM", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:huge_red_mushroom"))) + .add("JUNGLE", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:mega_jungle_tree"))) + .add("JUNGLE_COCOA", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:jungle_tree_no_vine"))) + .add("LARGE_OAK", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:fancy_oak"))) + .add("LARGE_SPRUCE", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:pine"))) + .add("SMALL_JUNGLE", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:jungle_tree"))) + .add("SWAMP_OAK", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:oak"))) + .add("TALL_BIRCH", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:birch")))) + .addTransform(id -> BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:" + id.toLowerCase()))).build(); + ((FabricWorldHandle) worldHandle).setTreeTransformer(treeTransformer); + config = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); saveDefaultConfig(); plugin.load(this); @@ -157,6 +184,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { logger.info("Initializing Terra..."); registry.loadAll(this); + /* registry.forEach(config -> { String pack = config.getTemplate().getID().toLowerCase(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java new file mode 100644 index 000000000..ff870c3c3 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.fabric.world; + +import com.dfsek.terra.api.generic.Tree; +import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.fabric.TerraFabricPlugin; +import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; +import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; +import com.dfsek.terra.util.MaterialSet; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.ConfiguredFeature; + +import java.util.Random; +import java.util.Set; + +public class FabricTree implements Tree { + private final ConfiguredFeature delegate; + + public FabricTree(ConfiguredFeature delegate) { + this.delegate = delegate; + } + + @Override + public boolean plant(Location l, Random r) { + FabricWorldAccess fabricWorldAccess = ((FabricWorldAccess) l.getWorld()); + ChunkGenerator generatorWrapper = ((FabricChunkGenerator) fabricWorldAccess.getGenerator()).getHandle(); + return delegate.generate((StructureWorldAccess) fabricWorldAccess.getHandle(), generatorWrapper, r, new BlockPos(l.getBlockX(), l.getBlockY(), l.getBlockZ())); + } + + @Override + public Set getSpawnable() { + return MaterialSet.get(TerraFabricPlugin.getInstance().getWorldHandle().createMaterialData("minecraft:grass_block"), + TerraFabricPlugin.getInstance().getWorldHandle().createMaterialData("minecraft:podzol")); + } + + @Override + public ConfiguredFeature getHandle() { + return delegate; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index fd36927df..781210139 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.translator.Transformer; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricMaterialData; import com.dfsek.terra.fabric.world.block.data.FabricMultipleFacing; @@ -16,10 +17,17 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import net.minecraft.block.BlockState; import net.minecraft.command.argument.BlockArgumentParser; import net.minecraft.state.property.Properties; +import net.minecraft.world.gen.feature.ConfiguredFeature; import java.util.Arrays; public class FabricWorldHandle implements WorldHandle { + private Transformer> treeTransformer; + + public void setTreeTransformer(Transformer> treeTransformer) { + this.treeTransformer = treeTransformer; + } + @Override public void setBlockData(Block block, BlockData data, boolean physics) { block.setBlockData(data, physics); @@ -59,6 +67,6 @@ public class FabricWorldHandle implements WorldHandle { @Override public Tree getTree(String id) { - return null; + return new FabricTree(treeTransformer.translate(id)); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index 536dfc3ad..c68831890 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -13,6 +13,7 @@ import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.population.CavePopulator; import com.dfsek.terra.population.FloraPopulator; import com.dfsek.terra.population.OrePopulator; +import com.dfsek.terra.population.TreePopulator; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.block.BlockState; @@ -50,6 +51,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl private final CavePopulator cavePopulator = new CavePopulator(TerraFabricPlugin.getInstance()); private final FloraPopulator floraPopulator = new FloraPopulator(TerraFabricPlugin.getInstance()); private final OrePopulator orePopulator = new OrePopulator(TerraFabricPlugin.getInstance()); + private final TreePopulator treePopulator = new TreePopulator(TerraFabricPlugin.getInstance()); public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack) { super(biomeSource, new StructuresConfig(false)); From ae21b8305a29d4d1fcf581462c09852b2a110f1f Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 15 Dec 2020 02:37:21 -0700 Subject: [PATCH 053/210] Begin work on not jank world implementation --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 28 +++--- .../dfsek/terra/fabric/world/FabricTree.java | 5 +- .../terra/fabric/world/FabricWorldHandle.java | 5 +- .../fabric/world/handles/FabricWorld.java | 99 +++++++++++++++++++ .../src/main/resources/terra.accesswidener | 3 +- 5 files changed, 122 insertions(+), 18 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 3e95b66a9..0613ffd43 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -35,6 +35,7 @@ import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.Feature; import net.minecraft.world.gen.feature.HugeMushroomFeature; import net.minecraft.world.gen.feature.TreeFeature; +import net.minecraft.world.gen.feature.TreeFeatureConfig; import org.apache.commons.io.FileUtils; import java.io.File; @@ -153,6 +154,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { }); } + @SuppressWarnings("unchecked") @Override public void onInitialize() { instance = this; @@ -162,19 +164,19 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { feature.feature instanceof TreeFeature || feature.feature instanceof HugeMushroomFeature).forEach(tree -> System.out.println(BuiltinRegistries.CONFIGURED_FEATURE.getId(tree))); - Transformer> treeTransformer = new Transformer.Builder>() - .addTransform(id -> BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse(id))) - .addTransform(new MapTransform>() - .add("BROWN_MUSHROOM", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:huge_brown_mushroom"))) - .add("RED_MUSHROOM", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:huge_red_mushroom"))) - .add("JUNGLE", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:mega_jungle_tree"))) - .add("JUNGLE_COCOA", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:jungle_tree_no_vine"))) - .add("LARGE_OAK", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:fancy_oak"))) - .add("LARGE_SPRUCE", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:pine"))) - .add("SMALL_JUNGLE", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:jungle_tree"))) - .add("SWAMP_OAK", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:oak"))) - .add("TALL_BIRCH", BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:birch")))) - .addTransform(id -> BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:" + id.toLowerCase()))).build(); + Transformer> treeTransformer = new Transformer.Builder>() + .addTransform(id -> (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse(id))) + .addTransform(new MapTransform>() + .add("BROWN_MUSHROOM", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:huge_brown_mushroom"))) + .add("RED_MUSHROOM", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:huge_red_mushroom"))) + .add("JUNGLE", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:mega_jungle_tree"))) + .add("JUNGLE_COCOA", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:jungle_tree_no_vine"))) + .add("LARGE_OAK", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:fancy_oak"))) + .add("LARGE_SPRUCE", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:pine"))) + .add("SMALL_JUNGLE", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:jungle_tree"))) + .add("SWAMP_OAK", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:oak"))) + .add("TALL_BIRCH", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:birch")))) + .addTransform(id -> (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:" + id.toLowerCase()))).build(); ((FabricWorldHandle) worldHandle).setTreeTransformer(treeTransformer); config = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java index ff870c3c3..e92bef247 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java @@ -11,14 +11,15 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.TreeFeatureConfig; import java.util.Random; import java.util.Set; public class FabricTree implements Tree { - private final ConfiguredFeature delegate; + private final ConfiguredFeature delegate; - public FabricTree(ConfiguredFeature delegate) { + public FabricTree(ConfiguredFeature delegate) { this.delegate = delegate; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index 781210139..17af069fe 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -18,13 +18,14 @@ import net.minecraft.block.BlockState; import net.minecraft.command.argument.BlockArgumentParser; import net.minecraft.state.property.Properties; import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.TreeFeatureConfig; import java.util.Arrays; public class FabricWorldHandle implements WorldHandle { - private Transformer> treeTransformer; + private Transformer> treeTransformer; - public void setTreeTransformer(Transformer> treeTransformer) { + public void setTreeTransformer(Transformer> treeTransformer) { this.treeTransformer = treeTransformer; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java new file mode 100644 index 000000000..b8e9f5cf3 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java @@ -0,0 +1,99 @@ +package com.dfsek.terra.fabric.world.handles; + +import com.dfsek.terra.api.generic.Entity; +import com.dfsek.terra.api.generic.Tree; +import com.dfsek.terra.api.generic.generator.ChunkGenerator; +import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.fabric.world.handles.chunk.FabricChunk; +import net.minecraft.server.world.ServerWorld; + +import java.io.File; +import java.util.UUID; +import java.util.function.Consumer; + +public class FabricWorld implements World { + + private final Handle delegate; + + public FabricWorld(ServerWorld world, ChunkGenerator generator) { + this.delegate = new Handle(world, generator); + } + + @Override + public long getSeed() { + return delegate.world.getSeed(); + } + + @Override + public int getMaxHeight() { + return delegate.world.getHeight(); + } + + @Override + public ChunkGenerator getGenerator() { + return delegate.generator; + } + + @Override + public String getName() { + return delegate.world.worldProperties.getLevelName(); + } + + @Override + public UUID getUID() { + return null; + } + + @Override + public boolean isChunkGenerated(int x, int z) { + return false; + } + + @Override + public Chunk getChunkAt(int x, int z) { + return new FabricChunk(delegate.world.getChunk(x, z)); + } + + @Override + public File getWorldFolder() { + return null; + } + + @Override + public Block getBlockAt(int x, int y, int z) { + return null; + } + + @Override + public Block getBlockAt(Location l) { + return null; + } + + @Override + public boolean generateTree(Location l, Tree vanillaTreeType) { + return false; + } + + @Override + public void spawn(Location location, Class entity, Consumer consumer) { + + } + + @Override + public Handle getHandle() { + return null; + } + + private final class Handle { + private final ServerWorld world; + private final ChunkGenerator generator; + + private Handle(ServerWorld world, ChunkGenerator generator) { + this.world = world; + this.generator = generator; + } + } +} diff --git a/platforms/fabric/src/main/resources/terra.accesswidener b/platforms/fabric/src/main/resources/terra.accesswidener index f7a4eba9a..0b39996bb 100644 --- a/platforms/fabric/src/main/resources/terra.accesswidener +++ b/platforms/fabric/src/main/resources/terra.accesswidener @@ -1,3 +1,4 @@ accessWidener v1 named -extendable method net/minecraft/client/world/GeneratorType (Ljava/lang/String;)V \ No newline at end of file +extendable method net/minecraft/client/world/GeneratorType (Ljava/lang/String;)V +accessible field net/minecraft/server/world/ServerWorld Lnet/minecraft/world/level/ServerWorldProperties worldProperties \ No newline at end of file From a614d7dddd7a64e58177c48ba3c96fb25dcdb8d7 Mon Sep 17 00:00:00 2001 From: solonovamax Date: Tue, 15 Dec 2020 04:37:38 -0500 Subject: [PATCH 054/210] Completely redo how gradle works (#40) * make getWorldEdit() never null. Signed-off-by: solonovamax * Locate commands work like vanilla Signed-off-by: solonovamax * Completely rework all the gradle stuff for the subprojects Signed-off-by: solonovamax * Update gradle version Signed-off-by: solonovamax * make :common an api in the bukkit build.gradle Signed-off-by: solonovamax * Move git clone function to CommonConfig.kt + make processResources depend on downloadDefaultPacks Signed-off-by: solonovamax * clean up common build.gradle.kts Signed-off-by: solonovamax * remove sponge Signed-off-by: solonovamax * rename fabric group from com.dfsek.terra.bukkit to com.dfsek.terra.fabric Signed-off-by: solonovamax * idk why this was removed some how? It shows it's still in the main repo, but it was removed for me /shrug Signed-off-by: solonovamax * Fix shading issues. Signed-off-by: solonovamax * Fix issues with fabric-loom being stupid and requiring the plugin on the root project. Signed-off-by: solonovamax --- .gitignore | 1 + build.gradle.kts | 153 +----------------- buildSrc/build.gradle.kts | 13 ++ .../kotlin/com/dfsek/terra/CommonConfig.kt | 47 ++++++ .../com/dfsek/terra/CompilationConfig.kt | 27 ++++ .../com/dfsek/terra/DependencyConfig.kt | 25 +++ .../com/dfsek/terra/DistributionConfig.kt | 87 ++++++++++ common/build.gradle.kts | 50 ++---- gradle/wrapper/gradle-wrapper.jar | Bin 58910 -> 59203 bytes gradle/wrapper/gradle-wrapper.properties | 2 +- platforms/bukkit/build.gradle.kts | 57 ++----- platforms/fabric/build.gradle.kts | 82 ++++------ 12 files changed, 259 insertions(+), 285 deletions(-) create mode 100644 buildSrc/build.gradle.kts create mode 100644 buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt create mode 100644 buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt create mode 100644 buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt create mode 100644 buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt diff --git a/.gitignore b/.gitignore index b7523806f..1c84c6c0f 100644 --- a/.gitignore +++ b/.gitignore @@ -138,3 +138,4 @@ build !lib/*.jar .idea/Terra.iml /run/ +.idea/**.iml \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index 1296a32f2..c5ce2b2ed 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,138 +1,11 @@ -//import java.util.zip.ZipFile -import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import java.io.ByteArrayOutputStream -import java.net.URL - - -plugins { - java - maven - idea - id("com.github.johnrengelman.shadow").version("6.1.0") -} +import com.dfsek.terra.getGitHash val versionObj = Version("2", "2", "0", true) allprojects { version = versionObj group = "com.dfsek.terra" - } - -repositories { - maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") } - maven { url = uri("http://maven.enginehub.org/repo/") } - maven { url = uri("https://repo.codemc.org/repository/maven-public") } - maven { url = uri("https://papermc.io/repo/repository/maven-public/") } - maven { url = uri("https://maven.fabricmc.net/") } - gradlePluginPortal() - jcenter() -} - -java { - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 -} - -dependencies { - implementation("org.apache.commons:commons-rng-core:1.3") - implementation("net.jafama:jafama:2.3.2") - - - implementation("commons-io:commons-io:2.4") - implementation("org.apache.commons:commons-imaging:1.0-alpha2") - - compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.0-SNAPSHOT") - implementation("org.bstats:bstats-bukkit:1.7") - - compileOnly("com.googlecode.json-simple:json-simple:1.1") - - implementation("com.scireum:parsii:1.2.1") - - implementation("net.jafama:jafama:2.3.2") - - implementation("com.dfsek:Tectonic:1.0.3") - - - - - // JUnit. - testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0") -} - - - -val compileJava: JavaCompile by tasks -val mainSourceSet: SourceSet = sourceSets["main"] - -tasks.withType { - include("**/*.yml") - filter( - "tokens" to mapOf( - "VERSION" to project.version.toString() - ) - ) -} - -compileJava.apply { - options.encoding = "UTF-8" - doFirst { - options.compilerArgs = mutableListOf("-Xlint:all") - } -} - -tasks.test { - useJUnitPlatform() - - maxHeapSize = "4G" - ignoreFailures = false - failFast = true - maxParallelForks = 12 -} - -tasks.named("shadowJar") { - // Tell shadow to download the packs - dependsOn(downloadDefaultPacks) - - archiveClassifier.set("") - archiveBaseName.set("Terra") - setVersion(project.version) - relocate("org.apache.commons", "com.dfsek.terra.lib.commons") - relocate("org.bstats.bukkit", "com.dfsek.terra.lib.bstats") - relocate("parsii", "com.dfsek.terra.lib.parsii") - relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") - relocate("net.jafama", "com.dfsek.terra.lib.jafama") - relocate("com.dfsek.tectonic", "com.dfsek.terra.lib.tectonic") - relocate("net.jafama", "com.dfsek.terra.lib.jafama") - minimize() -} - -tasks.build { - dependsOn(tasks.shadowJar) -// dependsOn(testWithPaper) -// testWithPaper.mustRunAfter(tasks.shadowJar) -} - - - -val downloadDefaultPacks = tasks.create("downloadDefaultPacks") { - doFirst { - // Downloading latest paper jar. -// if (file("${buildDir}/resources/main/packs/default").exists() && file("${buildDir}/resources/main/packs/nether").exists()) -// return@doFirst -// else - file("${buildDir}/resources/main/packs/").deleteRecursively() - - val defaultPackUrl = URL("https://github.com/PolyhedralDev/TerraDefaultConfig/releases/download/latest/default.zip") - downloadPack(defaultPackUrl) - val netherPackUrl = URL("https://github.com/PolyhedralDev/TerraDefaultConfig/releases/download/latest/nether.zip") - downloadPack(netherPackUrl) - } -} - - - /** * Version class that does version stuff. */ @@ -145,28 +18,4 @@ class Version(val major: String, val minor: String, val revision: String, val pr else //Only use git hash if it's a prerelease. "$major.$minor.$revision-BETA+${getGitHash()}" } -} - -fun getGitHash(): String { - val stdout = ByteArrayOutputStream() - exec { - commandLine = mutableListOf("git", "rev-parse", "--short", "HEAD") - standardOutput = stdout - } - return stdout.toString().trim() -} - -fun gitClone(name: String) { - val stdout = ByteArrayOutputStream() - exec { - commandLine = mutableListOf("git", "clone", name) - standardOutput = stdout - } -} - -fun downloadPack(packUrl: URL) { - val fileName = packUrl.file.substring(packUrl.file.lastIndexOf("/")) - val file = file("${buildDir}/resources/main/packs/${fileName}") - file.parentFile.mkdirs() - file.outputStream().write(packUrl.readBytes()) } \ No newline at end of file diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 000000000..ecf0454d8 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + `kotlin-dsl` + kotlin("jvm") version embeddedKotlinVersion +} + +repositories { + mavenCentral() + gradlePluginPortal() +} + +dependencies { + "implementation"("com.github.jengelman.gradle.plugins:shadow:+") +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt new file mode 100644 index 000000000..2405568cd --- /dev/null +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/CommonConfig.kt @@ -0,0 +1,47 @@ +package com.dfsek.terra + +import org.gradle.api.Project +import org.gradle.api.tasks.testing.Test +import org.gradle.kotlin.dsl.apply +import org.gradle.kotlin.dsl.withType +import java.io.ByteArrayOutputStream + +fun Project.configureCommon() { + apply(plugin = "java-library") + apply(plugin = "maven-publish") + apply(plugin = "idea") + + configureDependencies() + configureCompilation() + configureDistribution() + + version = rootProject.version + + + + tasks.withType().configureEach { + useJUnitPlatform() + + maxHeapSize = "2G" + ignoreFailures = false + failFast = true + maxParallelForks = 12 + } +} + +fun Project.getGitHash(): String { + val stdout = java.io.ByteArrayOutputStream() + exec { + commandLine = mutableListOf("git", "rev-parse", "--short", "HEAD") + standardOutput = stdout + } + return stdout.toString().trim() +} + +fun Project.gitClone(name: String) { + val stdout = ByteArrayOutputStream() + exec { + commandLine = mutableListOf("git", "clone", name) + standardOutput = stdout + } +} diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt new file mode 100644 index 000000000..ae2f81b9c --- /dev/null +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/CompilationConfig.kt @@ -0,0 +1,27 @@ +package com.dfsek.terra + +import org.gradle.api.JavaVersion +import org.gradle.api.Project +import org.gradle.api.plugins.JavaPluginConvention +import org.gradle.api.tasks.compile.JavaCompile +import org.gradle.api.tasks.javadoc.Javadoc +import org.gradle.kotlin.dsl.configure +import org.gradle.kotlin.dsl.withType + +fun Project.configureCompilation() { + configure { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + tasks.withType { + options.encoding = "UTF-8" + doFirst { + options.compilerArgs = mutableListOf("-Xlint:all") + } + } + + tasks.withType { + options.encoding = "UTF-8" + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt new file mode 100644 index 000000000..28a6f8e00 --- /dev/null +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/DependencyConfig.kt @@ -0,0 +1,25 @@ +package com.dfsek.terra + +import org.gradle.api.Project +import org.gradle.kotlin.dsl.dependencies +import org.gradle.kotlin.dsl.repositories + +fun Project.configureDependencies() { + + repositories { + maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") } + maven { url = uri("http://maven.enginehub.org/repo/") } + maven { url = uri("https://repo.codemc.org/repository/maven-public") } + maven { url = uri("https://papermc.io/repo/repository/maven-public/") } + maven { url = uri("https://maven.fabricmc.net/") } + gradlePluginPortal() + jcenter() + mavenCentral() + } + + dependencies { + "testImplementation"("org.junit.jupiter:junit-jupiter-api:5.7.0") + "testRuntimeOnly"("org.junit.jupiter:junit-jupiter-engine:5.7.0") + "compileOnly"("org.jetbrains:annotations:20.1.0") + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt b/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt new file mode 100644 index 000000000..4f5392ca6 --- /dev/null +++ b/buildSrc/src/main/kotlin/com/dfsek/terra/DistributionConfig.kt @@ -0,0 +1,87 @@ +package com.dfsek.terra + +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar +import org.gradle.api.DefaultTask +import org.gradle.api.Project +import org.gradle.api.plugins.BasePluginConvention +import org.gradle.api.tasks.bundling.Jar +import org.gradle.api.tasks.javadoc.Javadoc +import org.gradle.kotlin.dsl.* +import java.io.File +import java.net.URL + +fun Project.configureDistribution() { + apply(plugin = "java-library") + apply(plugin = "com.github.johnrengelman.shadow") + + +// configurations.create("shaded") + + configurations { + val shaded = create("shaded") + getByName("compile").extendsFrom(shaded) +// shaded.extendsFrom(getByName("compile")) + val shadedApi = create("shadedApi") + shaded.extendsFrom(shadedApi) + getByName("api").extendsFrom(shadedApi) + val shadedImplementation = create("shadedImplementation") + shaded.extendsFrom(shadedImplementation) + getByName("implementation").extendsFrom(shadedImplementation) + } + +// tasks.withType { +// classpath += +// } + + val downloadDefaultPacks = tasks.create("downloadDefaultPacks") { + doFirst { + file("${buildDir}/resources/main/packs/").deleteRecursively() + + val defaultPackUrl = URL("https://github.com/PolyhedralDev/TerraDefaultConfig/releases/download/latest/default.zip") + downloadPack(defaultPackUrl, project) + val netherPackUrl = URL("https://github.com/PolyhedralDev/TerraDefaultConfig/releases/download/latest/nether.zip") + downloadPack(netherPackUrl, project) + } + } + tasks["processResources"].dependsOn(downloadDefaultPacks) + + tasks.register("sourcesJar") { + archiveClassifier.set("sources") + } + + tasks.withType { + from("../LICENSE", "../../LICENSE") + } + + tasks.register("javadocJar") { + dependsOn("javadoc") + archiveClassifier.set("javadoc") + from(tasks.getByName("javadoc").destinationDir) + } + + tasks.named("shadowJar") { + // Tell shadow to download the packs + dependsOn(downloadDefaultPacks) + + configurations = listOf(project.configurations["shaded"]) + + archiveClassifier.set("shaded") + setVersion(project.version) + relocate("org.apache.commons", "com.dfsek.terra.lib.commons") + relocate("parsii", "com.dfsek.terra.lib.parsii") + relocate("net.jafama", "com.dfsek.terra.lib.jafama") + minimize() + } + convention.getPlugin().archivesBaseName = project.name + + tasks.named("build") { + dependsOn(tasks["shadowJar"]) + } +} + +fun downloadPack(packUrl: URL, project: Project) { + val fileName = packUrl.file.substring(packUrl.file.lastIndexOf("/")) + val file = File("${project.buildDir}/resources/main/packs/${fileName}") + file.parentFile.mkdirs() + file.outputStream().write(packUrl.readBytes()) +} \ No newline at end of file diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 07524d9e2..46bcce8d3 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -1,47 +1,23 @@ +import com.dfsek.terra.configureCommon + plugins { - java - maven - idea - id("com.github.johnrengelman.shadow") + `java-library` } +configureCommon() + group = "com.dfsek.terra.common" -repositories { - mavenCentral() - maven { url = uri("https://hub.spigotmc.org/nexus/content/repositories/snapshots/") } - maven { url = uri("http://maven.enginehub.org/repo/") } - maven { url = uri("https://repo.codemc.org/repository/maven-public") } - maven { url = uri("https://papermc.io/repo/repository/maven-public/") } -} - dependencies { - compileOnly("org.jetbrains:annotations:20.1.0") - testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0") - implementation("org.apache.commons:commons-rng-core:1.3") - implementation("commons-io:commons-io:2.4") + "shadedApi"("org.apache.commons:commons-rng-core:1.3") + "shadedApi"("commons-io:commons-io:2.4") - implementation("com.scireum:parsii:1.2.1") - implementation("com.dfsek:Tectonic:1.0.3") - implementation("net.jafama:jafama:2.3.2") + "shadedApi"("com.scireum:parsii:1.2.1") + "shadedApi"("com.dfsek:Tectonic:1.0.3") + "shadedApi"("net.jafama:jafama:2.3.2") + "shadedApi"("org.yaml:snakeyaml:1.27") - compileOnly("com.googlecode.json-simple:json-simple:1.1") + "compileOnly"("com.googlecode.json-simple:json-simple:1.1") - implementation("com.google.guava:guava:30.0-jre") -} - -tasks.named("shadowJar") { - - archiveClassifier.set("") - archiveBaseName.set("Terra") - setVersion(project.version) - relocate("org.apache.commons", "com.dfsek.terra.lib.commons") - relocate("org.bstats.bukkit", "com.dfsek.terra.lib.bstats") - relocate("parsii", "com.dfsek.terra.lib.parsii") - relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") - relocate("net.jafama", "com.dfsek.terra.lib.jafama") - relocate("com.dfsek.tectonic", "com.dfsek.terra.lib.tectonic") - relocate("net.jafama", "com.dfsek.terra.lib.jafama") - minimize() + "shadedApi"("com.google.guava:guava:30.0-jre") } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 62d4c053550b91381bbd28b1afc82d634bf73a8a..e708b1c023ec8b20f512888fe07c5bd3ff77bb8f 100644 GIT binary patch delta 6656 zcmY+Ibx_pN*Z*PZ4(U#j1qtbvrOTyO8fghZ8kYJfEe%U|$dV!@ASKczEZq$fg48M@ z;LnHO_j#Uq?%bL4dY^md%$$4Y+&@nKC|1uHR&59YNhubGh72|a#ylPdh9V+akp|I; zPk^W-a00GrFMkz_NSADdv2G2-i6rb=cB_@WnG(**4ZO$=96R=t|NZ@|0_z&q3GwO^ ziUFcuj$a9QaZ3j?xt`5#q`sT-ufrtBP0nt3IA&dr*+VCsBzBVW?vZ6eZr0oD%t33z zm~-5IVsjy(F>;S~Pm@bxX85>Z*@(QL6i3JQc?1ryQFcC@X^2^mZWhFv|v? z49>l|nA&XNQ6#OvccUTyBMB*WO#NA;FW5|eE_K6dtVYP2G?uUZ09!`Iq1IF2gA(aS zLu@G^cQJmh=x?-YsYa@E6QnE5+1@ds&0f#OQRDl^GnIT_m84G5XY%W z;Ck6bk^Oeu*Ma-XmxI5GjqzWNbJMsQF4)WfMZEA{oxW0E32e)*JfG}3otPishIQBw zkBe6N#4pKPN>q1R6G1@5&(u#5yPEToMBB6_oEK|q z@(i5j!?;NNCv~=HvW%zF&1yWBq(nJa_#``G&SRmQvE|jePUPs{J!$TacM|e}Fsceb zx+76|mDp6@w>)^DIl{8?)6XYNRU|2plG8Jy&7(^9SdOWNKKJK&>0!z6XiN4J*Jkao z=E1y5x-XDC==Ub+8fLb#OW&{2ww{h^xlJFYAMOUd)}Xg@j?ak{7Kno6?9S~F?|6Df zHo|ijXX~`Sp;Vf!nR;m%vUhq>zvlRXsL0u*Tt?F#yR}3tF0#of{(UjitqST|!{aBA zicWh+URU}Jnc*sg9iMkf0pggpd?3TI*C-q$2QOdCC7rV+CHBmjS3O%a3VeZ$ZSs5ubJuJp%e%$LHgrj0niYjX;4kt z&2~j%@q3MO)-QGCA{>o%eZu){ou^MgC6~Z8Y=tc!qF=|TOlG3wJXbaLYr-;$Ch=2J z_UcE59Xzq&h0LsjLrcZrQSa}#=0~Lk|4?e4M z6d;v->NCC1oMti)RRc`Ys0?JXQjsZ@VdCy%Z)TptCrI>0Tte$pR!@yJesoU2dtyuW z7iFsE8)CkbiJP+OP28;(%?!9WddQZcAid@R@`*e%3W65$g9ee`zvwb(VPO+uVBq6p z{QDR%CR(2z@?&9Obm3xPi2lzvfip`7q`_7UDD|lRS}4=bsl3xQIOi0@GSvMuDQX}* z4B^(DI<${qUhcLqO`itJU;e<%%iS+R3I^_xIV1O%sp*x~;-dn` zt$8>RnSUh#rU3{-47067W^WNwTdq-t$-U>Hj%r!GD!gLa;kV zW5g6pCqV+!q8LgrI49(}fIc5K_`FLV4_E#XZ6{<>w8wzc%V9k!!Byg5-0WY+J?1*z%9~Aj4WQr1Jsn2(G!U8fFpi(wsy@JLg^d+IB0kl89 z0@Ssqf!L9JjYKK$J=978+NO*5^C)GPH2a%4hm$HROjM|N3g9ch9kDLh*nlwqy{mVM z`P(l#>3NnK%#O8tSb(VmZrG+`dRD#=Cc1P%(y5S?*Hj5E{vg&Eiw!YV>S#7_WRDVoFxT5m=gFi4)}y5V%KT8!xbsH_rmR& zsmM?%J}K$1l8d?2+m(}2c}-G`x>CY%Y&QBJRC$sKM}zN<9{IlF@yJEG<^0={$+`Hc zDodJ)gCADJ_bD#am(c2ojXKb|j+ENJ#58PAA&pZXufrFzBwnuuo+khfMgd!DMlU#v z9|JelQO~E2;d^w!RZJbt%IANIudpKSP)cssoWhq)>({nvcfCr0=9=FAIMuZm8Eo=} z|DND}8_PB5HqG(QwDvaM@orYBZ9kCkHV*rxKTy>q7n~0emErUwLbhq;VN<2nKT&*a2Ajz z;lKBzU2i8KLV`d)Y&ae)!HcGk$dO}Or%8KF@kE@jU1h@zwpw{6p4ME|uC$Za-ERR2 ztQvL&uOZLe(k{w_+J^ng+l}~N8MP>F1Z$fLu}D-WWaeu#XduP@#8JpmH(X>rIL)k3 zyXNyTIB1(IH%S&pQ{rWaTVfB$~-;RnlY z^(y7mR>@=brI>!TrA)BQsQ={b*6$=1Eqbuu6IdhJ&$YD$08AwtNr9*J?%-WT<;O1< zPl1<@yeqfZ>@s4azqTf<=I4(kU^+^Qkstm%WM-0_VLm({jFc8`5Df2Q1Y9zMZu0^! zsO_yh2Sz9K>Jq6fkYbBZocEJ6C!SdEzYDkiEtNJs{?!tA#e|oiN+VaaAobwKef_kUup&4scD?1+}Q8)DaekkMYn-FOS{J%NY za^mmJ^n`t*1p@hF*gl#L+5wr40*(ub4J#L|@oCl~@|4UvCjHBYDQv&S zhyGMAkRO^tF_dyi&XM)4mQ;k>kj?RgRo@-?==oD+ns*>bf@&fPXF|4U0&ib2 zo~1ZdmCPWf!W9#sGP@9X$;Rc`tjbz^&JY}z{}j9bl?;VC{x)TfQH$D^WowKL&4Zx@ zdSn+QV7H(e0xRfN6aBfH)Q=@weoD?dvu6^ZS)zqb>GwMmIuS8zJfaMUQx9>%k~w34 z3}_B2Jj~u=SnJ~vZPj*)UoDi_FtT=UAb#J^b4B%R6z3H%cj-1OCjU5F$ky>By1zsg z>2A0ccp29(Y<;my|J_g-r{1I@+*O$>!R3`_sFNP4e}LD1e1mM&SA`;;TR0I`_hESV zh4U*9ecK$0=lYk`{SR_cm$}iS*?yQR(}T-5ub?Wn^#RTe*^1~ya%`!xWq-F*WH@%nnZTNREA z3eUX2uM9b_w!Zo$nVTotEtzuL(88N)H~v_G=89|(@IFz~Wq6ME);z(!2^PkR2B&kE zxR)xV8PE|Hszyjp#jNf=ZIQ7JR~4Ls#Vd@mPF(7R5VO$akUq8JM+sn>ZVg(lJZ)5qjqdw(*7tuwjY#0tx+|!sTz9yV~%HOdrb#!5w9>*0LrCS z%wF$Yc6~hqVQZzoC^D<(-h0aOtk}kn<<*xF61HQr<5}efY{zXXA+PaJG7vT&{Oz(@Uu!V#Fp9%Ht!~@;6AcD z$lvlPu&yd(YnAHfpN51*)JN0aYw9gGk{NE7!Oqu4rBp}F30669;{zcH-a7w9KSpDQPIE_f9T zit? zJSjTKWbe{f{9BmSDAFO1(K0oqB4578tU0(oRBE^28X>xDA!1C&VJEiYak4_ZTM*7M`hv_ zw3;2ndv3X$zT!wa7TrId{gNE`Vxf}j5wsyX+;Kn<^$EJT`NzznjyYx=pYMkZjizEU zb;Gg8Pl_pqxg)9P)C)Hxh_-mQ;u-I_Ol>d^>q08zFF!>Z3j1-HmuME_TGZ*Ev;O0O z%e(edJfV<6t3&FKwtInnj9EeQhq9;o5oLJoiKwWF5bP2~Feh#P4oN()JT0pdq!9x* ze3D-1%AV#{G=Op$6q?*Z>s{qFn}cl@9#m@DK_Bs@fdwSN`Qe18_WnveRB583mdMG- z?<3pJC!YljOnO8=M=|Cg)jw;4>4sna`uI>Kh&F20jNOk9HX&}Ry|mHJ+?emHnbYLJ zwfkx@slh31+3nq-9G5FVDQBHWWY}&hJ-fpDf!lQdmw8dlTt#=)20X74S>c&kR(?PT zBg)Y%)q&|hW1K;`nJPAGF*c3{3`FvrhD9=Ld{3M*K&5$jRhXNsq$0CLXINax1AmXX ziF39vkNtcK6i^+G^AEY!WalGazOQ$_#tx?BQ{YY$&V&42sICVl8@AI6yv;sGnT;@f zL=}rZcJqNwrEEA=GDdEe8Z=f9>^?($oS8xGdFf1eUWTYtZF<3tu2V%noPBnd=thZ+ zO&xoc?jvXG7Xt!RTw#5VN50UjgqSntw9Y35*~pxz=8OzkXg{@S2J%+{l3Q>B_qbnl z20Deb7JM&ZSp`%X>xWpb>FF8q7Nq&4#a1}A-(-!aMDmVbz05D!NpUzVe{~72h%cOh zwQFNai2a$K|hFgDk(oPF_tuf{BV!=m0*xqSzGAJ(~XUh8rk#{YOg0ReK>4eJl z;-~u5v$}DM)#vER>F)-}y(X6rGkp<{AkiPM7rFgAV^)FUX8XmCKKaWlS4;MSEagj$ z#pvH`vLX1q{&eOm>htnk4hmv=_)ao!MCp}9ql5yfre&Py!~hBAGNBa}PH&J8K=~<% z&?!J-QaH|0bq_uo6rt*r-M>d7jm1cbW^T>s)S?L{n8v`^?VIPA+qi^6e@cM|5boqEO!p1e|_{7U3Yl6K?0xMN1bbjf0@$TE-T))w> zFe?E?g$PUT-)AJ(PS^By^D^Ed!K5iv$*_eW~VA(I3~UMy*ZcgVu0$XZC*_0PgDmUL)qTCn927LD~p$yXR_GCJ&iQ; z4*`%l-dC5pALH!y*nmhdHRh02QjW1vZL4ySucz*w3f|#`=u@@YvMV1?i!&DIa2+S< z8z!gvN3FV4I;%fl;ruFeV{jKjI~?GlgkmGBuJ<7vY|l3xMOc?S@Q#C(zo*m&JLrjT2rU9PYOniB8O~yO5<1CCcQz# z17B2m1Z{R!Y)UO#CU-Y&mOlv4*Gz%rC_YkRcO)jTUEWHDvv!GWmEihE>OKPx1J?Av z8J{-#7NsT>>R#*7**=QL)1@IR77G9JGZZiVt!=jD+i(oRV;I`JkiTSZkAXuHm-VG1 z+2-LD!!2dNEk@1@Rp|C$MD9mH^)H*G*wI(i*Rc6Vvdik+BDycYQ*=0JA3dxxha|Zg zCIW1Ye-DdpMGTEwbA^6hVC<(@0FL4dkDOYcxxC5c%MJQ^)zpA%>>~Q|Y=@)XW!px; z_Fx+xOo7>sz4QX|Ef~igE+uFnzFWP<-#||*V0`0p7E*+n5+awuOWmvR{-M*chIXgo zYiZvQMond#{F8+4Zh_;>MsaZUuhp=onH@P!7W>sq|CWv|u}Wg0vo&f4UtmLzhCwwu zJaR=IO;sQxS}h(K>9VZjnED+>9rGgB3ks+AwTy_EYH{oc)mo`451n&YH%A1@WC{;1 z=fB6n zIYp46_&u`COM&Di?$P}pPAlAF*Ss<)2Xc?=@_2|EMO?(A1u!Vc=-%bDAP#zDiYQvJ z0}+}3GaLxsMIlh6?f=iRs0K=RyvMOcWl*xqe-IBLv?K{S^hP)@K|$I+h_)pdD9r~! zxhw2u66+F(E`&6hY}B_qe>wil|#*0R0B;<@E?L zVrhXKfwRg0l8r>LuNs1QqW&39ME0sOXe8zycivGVqUOjEWpU)h|9fwp@d(8=M-WxY zeazSz6x5e`k821fgylLIbdqx~Kdh^Oj`Q!4vc*Km)^Tr-qRxPHozdvvU^#xNsKVr6aw8={70&S4y*5xeoF@Q^y596*09`XF56-N z1=Rm5?-An178o?$ix}y7gizQ9gEmGHF5AW+92DYaOcwEHnjAr~!vI>CK%h`E_tO8L Yte!%o?r4GTrVtxD61Ym!|5fq-1K$0e!T1w z1SC8j)_dObefzK9b=~*c&wBRW>;B{VGKiBofK!FMN5oJBE0V;;!kWUz!jc1W?5KdY zyZ3mCBHprpchz-9{ASiJJh&&h1|4rdw6wxD2+9= z#6#}Uq8&^1F3wgvGFoNDo?bIeEQXpcuAR0-+w$JWoK-@yUal1M&~W_O)r+Rx;{@hWH5n^oQWR36GMYBDDZyPK4L@WVjRrF+XlSzi4X4!_!U%Uujl6LHQ#|l(sUU%{ zefYd8jnVYP91K}Qn-OmmSLYFK1h~_}RPS~>+Xdz%dpvpJ{ll!IKX=JN99qowqslbO zV3DmqPZ}6>KB!9>jEObpi$u5oGPfO3O5!o3N2Mn`ozpje<}1I1H)m2rJDcB7AwXc6 z6j)tnPiql7#)r+b+p9?MVahp&=qJ^$oG+a^C*);FoJ!+V*^W+|2Olx5{*&$bXth)U zejc7mU6cBp?^Rj|dd{GL-0eHRTBi6_yJ&GLP5kIncv^z{?=0AVy^5{S8_n=rtua!J zFGY=A(yV^ZhB}1J_y(F`3QTu+zkHlw;1GiFeP&pw0N1k%NShHlO(4W+(!wy5phcg4 zA-|}(lE_1@@e6y`veg;v7m;q%(PFG&K3#}eRhJioXUU0jg_8{kn$;KVwf;zpL2X_( zC*_R#5*PaBaY73(x*oZ}oE#HPLJQRQ7brNK=v!lsu==lSG1(&q>F)`adBT~d*lMS| z%!%7(p~<7kWNmpZ5-N31*e=8`kih|g5lVrI%2wnLF-2D+G4k6@FrYsJ_80AJ}KMRi>) z-kIeHp{maorNWkF81v0FKgB==_6blyaF$5GaW)B!i4v*jNk6r)vU6?G$0pV8(Y+UK z5lgRVt%;N_gWp)^osv=h+^07UY6+$4^#t=M3>0i0`{`aEkFLL#a)93uXhYO+aKTtu zckg2T9S&GKNtZmdAS^8PzvDva-%-K&g9eqPXQ4$dM^inr@6Zl z{!Cq&C_+V;g*{>!0cZP}?ogDb$#ZS=n@NHE{>k@84lOkl&$Bt2NF)W%GClViJq14_ zQIfa^q+0aq){}CO8j%g%R9|;G0uJuND*HO$2i&U_uW_a5xJ33~(Vy?;%6_(2_Cuq1 zLhThN@xH7-BaNtkKTn^taQHrs$<<)euc6z(dhps>SM;^Wx=7;O&IfNVJq3wk4<1VS z-`*7W4DR_i^W4=dRh>AXi~J$K>`UqP>CKVVH&+T(ODhRJZO7DScU$F7D)di-%^8?O z6)Ux`zdrVOe1GNkPo0FgrrxSu1AGQkJe@pqu}8LkBDm+V!N_1l}`tjLW8${rgDLv3m@E*#zappt-Mm zSC<$o+6UO~w0C=(0$&*y**@nKe_Q{|eAuD!(0YL0_a{z%+sdfSyP={Nyd$re6Rzbp zvsgTY7~VflX0^Vf7qqomYZ_$ryrFVV2$sFyzw2r%Q8*uYDA+)iQdfKms_5(>!s#!( z!P5S(N0i9CKQKaqg(U%Gk#V3*?)lO6dLv`8KB~F<-%VhbtL8Rl>mEz+PN=qx&t*|= zQHV=qG)YKlPk4iCyWIUGjC?kpeA>hIBK*A?B0)rB=RqAal#D%1C9yVQwBcz${#Jb5 zR{TRmMrOrJsLc&6x9qDo@FJ^=do_Y?3oU0G^nV5_EU&+DS+VA7Tp{^TAF>yZbyM3c zf*1CqHY9T|aL_lyY7c)i!_MtGPA!sdy3|mrsKVj1mi&>dms@-ozSa}OZ?2I*tAndg z@S7er$t^d^-;!wLQbG60nWd@1pQVD7tw-G_B#OscoYyremiZ_hj8*sXqQdchuD^!R zpXGuSj5psk+jR>3rWu3^`17>j&*^9^rWbszP=Mf@5KIEj%b=z98v=Ymp%$FYt>%Ld zm8})EDbNOJu9n)gwhz_RS``#Ag)fr)3<*?(!9O~mTQWeh;8c;0@o=iBLQNqx3d_2#W7S9#FXzr6VXfs>4 z;QXw}-STvK9_-7H=uqgal2{GkbjVLN+=D5ddd)4^WvX;(NYA*X*(JxTdiUzqVJopd zQg#~psX4o<)cF>r=rxP`(Xsf<+HG-pf&7aFPL8z|-&B*P?Vmsu5d>Nlg^2$WRY!S@#`g2{81;(1w#o5HsvN}5pFZi});>|VK^kL{Zkx~wgn ztlZp;HW`H8(GdRfIwc~?#N6}o#h158ohI*GIsK%56I_9sf2k_K@4vD!l{(dX9E7PJ;w>$|Y;-VBJSO4@){07bo-89^LZ9g<<%;dOl zyIq{s8`8Ltp*GDwu(l_Z$6sA2nam$BM$Q~6TpZg)w2TtW?G5whV(lRwaf$6EU86is zBP9Rs&vS_~sk?Nn_b}^HkM8LiO@>J}=g(T4hLmvH@5Jj#2aHa~K)lD9VB0k>$V2BP zgh;(=y9Op(KQ=H5vj+%qs>?s4tYN~-Q|fyQePA)s?HrF~;l!+@t8VMzqUpqMLudFT z)=o~s!MM4XkgbetIsODwtQ=FF$IcIp&!pjh6Q6{tL+l*7GQ%8Wsg(tC#qU3oW$~n) zL=>XIxI}Hi7HS0F_mmi+(c%1HDuKiWm>|6Xa}nW7ei55ggru9)xjBvC#JcEIN*#cp zv*ACvr=HTC?dX9NNo9Yhulu_gX5Z~}QQ2&QZ&C77{(>Y3_ z6j5Z1Uc5FtPEpS_31HsgmSLHZijGb_p$WlRJ1p^_1!ZLP8kr6OtCEK7Qh267o$H>e zf<4cNGQRk{g5h$XfvTFQ@`qm@iju83-~}ebAYpZryARHVR$AEt3229U{y@Fp4 z-8FBBtGG&(hTyUdx5ZOfiz`c=<0F%+w|Fl=rWk{K7>70k04SN?RU(^mrKSeKDqA!K^Hsv8C?#ioj4@WUL zC*?{hTai6q0%_oBTqDHygp_Kl;({sAScYQIwMDM1U>{x0ww zve?_}E;DG?+|zsUrsph5X_G7l#Y~vqkq3@NNDabbw7|`eJBmn`Qrlr%?`va=mm$Mc{+FBbQbogAZ6{MuzT|P%QZZotd21eb1hfj|;GYAX&>bx#D5EB+=XMj2XJkpnyMUykaVo) zj3ZLqEl1&)Rturc8m@+uUuD^vaNaSxGwP4dq0-OSb~62lPv8E_K4usLvG{Qg zdR%z8dd2H!{JaT|X_bfm{##*W$YM;_J8Y8&Z)*ImOAf4+| zEyi)qK%Ld1bHuqD+}-WiCnjszDeC-%8g+8JRpG1bOc!xUGB?@?6f~FTrI%U#5R~YF z%t5(S2Q>?0`(XNHa8xKdTEZ~Z4SJOheit#ldfdg63}#W6j8kO;SjQD`vftxS+#x1B zYu|5szEvkyz|}|B3x|DNlyi$;+n+cW$Hu+?)=X1!sa%{H-^;oBO9XACZJ}wkQ!sTa zQ#J3h|HX{{&WwIG3h7d6aWktuJaO)ie6&=KJBoX@w(rBWfin`*a6OmCC5M0HzL(gv zY<*e4hmW>SWVhxk-`UGOAbD%Hk+uu<^7zJ_ytVXamfqCd0$g+W08>?QAB}Cv{b}eM z@X}ILg+uT%>-6`A25p@uhS3%;u>ccSq}8|H_^o&`nBT5S0y z;2H0I^(4MO*S+(4l$gULc4KSeKvidto5Nl0P|%9CqQ*ikY!w_GUlo}sb9HYB=L^oFpJ zfTQskXW!LFVnUo4(OHPDaZSf3zB|3{RGu1>ueE$(+dr?tT zp!SGlqDU8vu{5xLWSvj+j$arHglg54#Lx&TvuO3LIIU>hF9Uoj&=-b*Q?uYr`#V?xz?2 zhirZrv^eA{k%{hFh%9LYVXEYWd5#PuUd1QqaqB*J!CMXEM>fEB$@#1>mtB`Bfil}t zhhTIObqh5HRvT+4q_Do$Q*Jika?qV=Np-DtPkU z(KoXyWLfPwr@UY1)hBAvR3nCBZgd|CevTG?H~HqDF}dzy%2sd2`f{^CBbTk*^K~RO zN~O0+2EjAJlywF%SjgYz810l&G5AqzI<=Ber{912^PpSPRJl3dm8W@dKHL}7_@k3)Y!SXYkyxQy>Q4I2o zr`ev7fLF$1t96h|sH<-#*YzGD-b^3$_!#wsh(Yw;)b@udLz9mm`mFYh z1Zz24KIQJ(*_-E0(3&1InqG;U?wF)GYd>DFo(em`#|UaaYmkA9;GTX7b?0@C@QkTVpGD#mf$dQoRNV=n{^Zi_W*ps;3?^$s`0;ER7;==~OmQ~9 zS5P=FjxE5%|;xq6h4@!_h?@|aK&FYI2IT(OHXv2%1 zWEo-v!L7x^YT(xLVHlpJttcwaF@1Y;-S*q3CRa!g7xdzl|Jan>2#dI0`LKl!T1GMk zRKe4|bQO&ET}Z^Aiym*HII>cSxIzl|F~JEUGxz;+DB=8fxXhnBI4R12q6ews$lA`Jfi}r@A@-)6TOAUMNYFYJ zZ-Zd?lxFTyjN3mXnL!%#>Z%$0gJ4*9g;e;@zSmQ{eGGDaRRNM3s@6!;hYuVc=c+3B z=qzNNS~n^EsJU4aOGE|mdy={C^lPKEfPL-IJAsTpQsDgZ@~s+eHZYmp9yb=YW_4r?lqQaYZQ`nau){W`LY#P)>i zq^wHEuOYs#FlPZeMuT@Etb@~A6feCebq`miJE3w+gAL%bVF_s*5e*@)?xmKSo%I3? zLELHVdWia$}~s6 zr!^LfxSSB4Td&9iTXrzQpl5ZDo#SdmNr;23QsPHQ!x!UT9xtb!Ycz^JF8x)%cFOXK z^EXw%dRz_VD}7?RU^4{)1+xFO=z!EI8IUa3U*rag=1BpHX$Xi<__kSbS{y_xa*MJv z_`thq0Z^sPzjAk48ssDQj}!$N8Q$XC84(bU$t_Bm69Jf+C!h_}ep zwzpQj9sRA94<{x3{~z&ix-DwX;RAzka)4-#6ZHJqKh|SVuO|>Yrv+m30+!|sK<-|E z=)5E->#y<_1V|T1f%Af!ZYqXg}`O zI$qKOWdnclF`%_Z`WGOe{`A`l-#a?s=Q1a#@BOWmExH2;Wl`OB!B-%lq3nO{4=WO& z#k_x|N&(qzm*6S{G*|GCegF2N2ulC+(58z2DG~yUs}i8zvRf&$CJCaexJ6Xu!`qz( z)*v8*kAE#D0KCo*s{8^Rbg=`*E2MzeIt0|x55%n-gO&yX#$l=3W7-_~&(G8j1E(XB hw}tl`5K!1C(72%nnjQrp<7@!WCh47rWB+@R{{wClNUHz< diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 12d38de6a..be52383ef 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.6.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 913bba658..4e7299944 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -1,4 +1,6 @@ -import java.io.ByteArrayOutputStream +import com.dfsek.terra.configureCommon +import com.dfsek.terra.gitClone +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import java.net.URL import java.nio.channels.Channels import java.nio.file.Files @@ -6,11 +8,9 @@ import java.nio.file.Paths import java.nio.file.StandardCopyOption plugins { - java - maven - idea - id("com.github.johnrengelman.shadow") + `java-library` } +configureCommon() group = "com.dfsek.terra.bukkit" @@ -23,27 +23,14 @@ repositories { } dependencies { - testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0") - implementation(project(":common")) - implementation("org.apache.commons:commons-rng-core:1.3") + "shadedApi"(project(":common")) - compileOnly("org.spigotmc:spigot-api:1.16.2-R0.1-SNAPSHOT") - implementation("io.papermc:paperlib:1.0.5") + "compileOnly"("org.spigotmc:spigot-api:1.16.2-R0.1-SNAPSHOT") + "shadedImplementation"("io.papermc:paperlib:1.0.5") - implementation("com.scireum:parsii:1.2.1") - implementation("com.dfsek:Tectonic:1.0.3") - implementation("net.jafama:jafama:2.3.2") - - compileOnly("com.googlecode.json-simple:json-simple:1.1") - - implementation("com.google.guava:guava:30.0-jre") - implementation("org.bstats:bstats-bukkit:1.7") - - compileOnly("com.sk89q.worldedit:worldedit-bukkit:7.2.0-SNAPSHOT") - - compileOnly("org.jetbrains:annotations:20.1.0") + "shadedImplementation"("org.bstats:bstats-bukkit:1.7") + "compileOnly"("com.sk89q.worldedit:worldedit-bukkit:7.2.0-SNAPSHOT") } tasks.withType { @@ -58,7 +45,7 @@ tasks.withType { val testDir = "target/server/" val setupServer = tasks.create("setupServer") { - dependsOn(tasks.shadowJar) + dependsOn("shadowJar") doFirst { // clean file("${testDir}/").deleteRecursively() @@ -93,7 +80,7 @@ val setupServer = tasks.create("setupServer") { val testWithPaper = task(name = "testWithPaper") { standardInput = System.`in` - dependsOn(tasks.shadowJar) + dependsOn("shadowJar") // Copy Terra into dir doFirst { copy { @@ -117,25 +104,7 @@ val testWithPaper = task(name = "testWithPaper") { classpath = files("${testDir}/paper.jar") } -tasks.named("shadowJar") { - - archiveClassifier.set("") - archiveBaseName.set("Terra") - setVersion(project.version) - relocate("org.apache.commons", "com.dfsek.terra.lib.commons") +tasks.named("shadowJar") { relocate("org.bstats.bukkit", "com.dfsek.terra.lib.bstats") - relocate("parsii", "com.dfsek.terra.lib.parsii") relocate("io.papermc.lib", "com.dfsek.terra.lib.paperlib") - relocate("net.jafama", "com.dfsek.terra.lib.jafama") - relocate("com.dfsek.tectonic", "com.dfsek.terra.lib.tectonic") - relocate("net.jafama", "com.dfsek.terra.lib.jafama") - minimize() -} - -fun gitClone(name: String) { - val stdout = ByteArrayOutputStream() - exec { - commandLine = mutableListOf("git", "clone", name) - standardOutput = stdout - } } \ No newline at end of file diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index f74e60e21..e99ef6882 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -1,67 +1,47 @@ -plugins { - java - maven - idea - id("fabric-loom").version("0.5-SNAPSHOT") - id("com.github.johnrengelman.shadow") -} +import com.dfsek.terra.configureCommon +import net.fabricmc.loom.LoomGradleExtension -group = "com.dfsek.terra.bukkit" - -repositories { - mavenCentral() - maven { url = uri("http://maven.enginehub.org/repo/") } - maven { url = uri("https://repo.codemc.org/repository/maven-public") } - maven { url = uri("https://papermc.io/repo/repository/maven-public/") } - jcenter() - maven { - name = "Fabric" - url = uri("https://maven.fabricmc.net/") +buildscript { + repositories { + mavenCentral() + maven { + name = "Fabric" + url = uri("https://maven.fabricmc.net/") + } } - gradlePluginPortal() +// dependencies { +// classpath("net.fabricmc:fabric-loom:+") +// } } +plugins { + id("fabric-loom").version("0.5.9") + `java-library` +} +//apply(plugin = "fabric-loom") -minecraft { +configureCommon() + +group = "com.dfsek.terra.fabric" + + +configure { accessWidener("src/main/resources/terra.accesswidener") } dependencies { - testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") - testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.7.0") - implementation(project(":common")) - implementation("org.apache.commons:commons-rng-core:1.3") + "shadedApi"(project(":common")) - implementation("com.scireum:parsii:1.2.1") - implementation("com.dfsek:Tectonic:1.0.3") - implementation("net.jafama:jafama:2.3.2") - - implementation("com.googlecode.json-simple:json-simple:1.1") - - implementation("com.google.guava:guava:30.0-jre") - - compileOnly("org.jetbrains:annotations:20.1.0") - - implementation("org.yaml:snakeyaml:1.27") - // To change the versions see the gradle.properties file - minecraft("com.mojang:minecraft:1.16.4") - mappings("net.fabricmc:yarn:1.16.4+build.6:v2") - modImplementation("net.fabricmc:fabric-loader:0.10.6+build.214") + "minecraft"("com.mojang:minecraft:1.16.4") + "mappings"("net.fabricmc:yarn:1.16.4+build.6:v2") + "modImplementation"("net.fabricmc:fabric-loader:0.10.6+build.214") // Fabric API. This is technically optional, but you probably want it anyway. - modImplementation("net.fabricmc.fabric-api:fabric-api:0.25.1+build.416-1.16") -} + "modImplementation"("net.fabricmc.fabric-api:fabric-api:0.25.1+build.416-1.16") -tasks.named("shadowJar") { - - archiveClassifier.set("") - archiveBaseName.set("Terra") - setVersion(project.version) - relocate("org.apache.commons", "com.dfsek.terra.lib.commons") - relocate("parsii", "com.dfsek.terra.lib.parsii") - relocate("net.jafama", "com.dfsek.terra.lib.jafama") - relocate("com.dfsek.tectonic", "com.dfsek.terra.lib.tectonic") - minimize() + "compileOnly"("net.fabricmc:sponge-mixin:+") + "annotationProcessor"("net.fabricmc:sponge-mixin:+") + "annotationProcessor"("net.fabricmc:fabric-loom:+") } \ No newline at end of file From 7a8358431754702a09e2a7583772aa6243b6a8ed Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 15 Dec 2020 11:02:14 -0700 Subject: [PATCH 055/210] Fix minor build issues --- platforms/bukkit/build.gradle.kts | 2 +- platforms/fabric/build.gradle.kts | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 4e7299944..564a983e6 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -84,7 +84,7 @@ val testWithPaper = task(name = "testWithPaper") { // Copy Terra into dir doFirst { copy { - from("${buildDir}/libs/Terra-${version}.jar") + from("${buildDir}/libs/bukkit-${version}-shaded.jar") into("${testDir}/plugins/") } } diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index e99ef6882..f8fe56354 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -31,6 +31,8 @@ configure { dependencies { "shadedApi"(project(":common")) + "shadedImplementation"("org.yaml:snakeyaml:1.27") + "shadedImplementation"("com.googlecode.json-simple:json-simple:1.1.1") // To change the versions see the gradle.properties file From b12079694c97b45e092bc19ca622d018513b6ea9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 16 Dec 2020 00:26:05 -0700 Subject: [PATCH 056/210] Add Validator API & cleanup Fabric --- .../AttemptsFailedException.java | 2 +- .../MapTransform.java | 2 +- .../terra/api/transform/NotNullValidator.java | 8 ++++ .../{translator => transform}/Transform.java | 2 +- .../TransformException.java | 2 +- .../Transformer.java | 32 ++++++++----- .../dfsek/terra/api/transform/Validator.java | 6 +++ .../dfsek/terra/population/OrePopulator.java | 2 +- .../dfsek/terra/bukkit/BukkitWorldHandle.java | 2 +- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 4 +- .../dfsek/terra/fabric/TerraFabricPlugin.java | 47 +++++++++++++++---- .../fabric/mixin/MoreOptionsDialogMixin.java | 25 ---------- .../terra/fabric/world/FabricWorldHandle.java | 2 +- .../fabric/world/features/FloraFeature.java | 21 +++++++++ .../handles/world/FabricWorldAccess.java | 6 ++- .../src/main/resources/terra.accesswidener | 3 +- .../src/main/resources/terra.mixins.json | 3 +- 17 files changed, 110 insertions(+), 59 deletions(-) rename common/src/main/java/com/dfsek/terra/api/{translator => transform}/AttemptsFailedException.java (90%) rename common/src/main/java/com/dfsek/terra/api/{translator => transform}/MapTransform.java (94%) create mode 100644 common/src/main/java/com/dfsek/terra/api/transform/NotNullValidator.java rename common/src/main/java/com/dfsek/terra/api/{translator => transform}/Transform.java (81%) rename common/src/main/java/com/dfsek/terra/api/{translator => transform}/TransformException.java (90%) rename common/src/main/java/com/dfsek/terra/api/{translator => transform}/Transformer.java (50%) create mode 100644 common/src/main/java/com/dfsek/terra/api/transform/Validator.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MoreOptionsDialogMixin.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/FloraFeature.java diff --git a/common/src/main/java/com/dfsek/terra/api/translator/AttemptsFailedException.java b/common/src/main/java/com/dfsek/terra/api/transform/AttemptsFailedException.java similarity index 90% rename from common/src/main/java/com/dfsek/terra/api/translator/AttemptsFailedException.java rename to common/src/main/java/com/dfsek/terra/api/transform/AttemptsFailedException.java index b5f23a6f2..256ad5e57 100644 --- a/common/src/main/java/com/dfsek/terra/api/translator/AttemptsFailedException.java +++ b/common/src/main/java/com/dfsek/terra/api/transform/AttemptsFailedException.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.translator; +package com.dfsek.terra.api.transform; public class AttemptsFailedException extends RuntimeException { public AttemptsFailedException() { diff --git a/common/src/main/java/com/dfsek/terra/api/translator/MapTransform.java b/common/src/main/java/com/dfsek/terra/api/transform/MapTransform.java similarity index 94% rename from common/src/main/java/com/dfsek/terra/api/translator/MapTransform.java rename to common/src/main/java/com/dfsek/terra/api/transform/MapTransform.java index 03edbbabb..efd409194 100644 --- a/common/src/main/java/com/dfsek/terra/api/translator/MapTransform.java +++ b/common/src/main/java/com/dfsek/terra/api/transform/MapTransform.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.translator; +package com.dfsek.terra.api.transform; import java.util.HashMap; import java.util.Map; diff --git a/common/src/main/java/com/dfsek/terra/api/transform/NotNullValidator.java b/common/src/main/java/com/dfsek/terra/api/transform/NotNullValidator.java new file mode 100644 index 000000000..b94b7be39 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/transform/NotNullValidator.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.api.transform; + +public class NotNullValidator implements Validator { + @Override + public boolean validate(T value) { + return !(value == null); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/translator/Transform.java b/common/src/main/java/com/dfsek/terra/api/transform/Transform.java similarity index 81% rename from common/src/main/java/com/dfsek/terra/api/translator/Transform.java rename to common/src/main/java/com/dfsek/terra/api/transform/Transform.java index c186c1e8e..2732b1da7 100644 --- a/common/src/main/java/com/dfsek/terra/api/translator/Transform.java +++ b/common/src/main/java/com/dfsek/terra/api/transform/Transform.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.translator; +package com.dfsek.terra.api.transform; /** * Interface to transform data from one type to another. diff --git a/common/src/main/java/com/dfsek/terra/api/translator/TransformException.java b/common/src/main/java/com/dfsek/terra/api/transform/TransformException.java similarity index 90% rename from common/src/main/java/com/dfsek/terra/api/translator/TransformException.java rename to common/src/main/java/com/dfsek/terra/api/transform/TransformException.java index 419dc4c23..9643d9673 100644 --- a/common/src/main/java/com/dfsek/terra/api/translator/TransformException.java +++ b/common/src/main/java/com/dfsek/terra/api/transform/TransformException.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.translator; +package com.dfsek.terra.api.transform; public class TransformException extends Exception { public TransformException() { diff --git a/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java b/common/src/main/java/com/dfsek/terra/api/transform/Transformer.java similarity index 50% rename from common/src/main/java/com/dfsek/terra/api/translator/Transformer.java rename to common/src/main/java/com/dfsek/terra/api/transform/Transformer.java index 5a7efd66e..ed66fda10 100644 --- a/common/src/main/java/com/dfsek/terra/api/translator/Transformer.java +++ b/common/src/main/java/com/dfsek/terra/api/transform/Transformer.java @@ -1,7 +1,10 @@ -package com.dfsek.terra.api.translator; +package com.dfsek.terra.api.transform; import java.util.ArrayList; +import java.util.Arrays; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; /** * Class to translate types from one style/platform to another. @@ -10,10 +13,10 @@ import java.util.List; * @param Data type to transform to. */ public class Transformer { - private final List> transformer; + private final LinkedHashMap, List>> transformers; - private Transformer(List> transformer) { - this.transformer = transformer; + private Transformer(LinkedHashMap, List>> transformer) { + this.transformers = transformer; } /** @@ -24,9 +27,15 @@ public class Transformer { */ public T translate(F from) { List exceptions = new ArrayList<>(); - for(Transform transform : transformer) { + for(Map.Entry, List>> transform : transformers.entrySet()) { try { - return transform.transform(from); + T result = transform.getKey().transform(from); + for(Validator validator : transform.getValue()) { + if(!validator.validate(result)) { + throw new TransformException("Failed to validate result: " + result.toString()); + } + } + return result; } catch(Exception exception) { exceptions.add(exception); } @@ -45,15 +54,16 @@ public class Transformer { * @param * @param */ - public static class Builder { - private final List> transforms = new ArrayList<>(); + public static final class Builder { + private final LinkedHashMap, List>> transforms = new LinkedHashMap<>(); - public Builder addTransform(Transform transform) { - transforms.add(transform); + @SafeVarargs + public final Builder addTransform(Transform transform, Validator... validators) { + transforms.put(transform, Arrays.asList(validators)); return this; } - public Transformer build() { + public final Transformer build() { return new Transformer<>(transforms); } } diff --git a/common/src/main/java/com/dfsek/terra/api/transform/Validator.java b/common/src/main/java/com/dfsek/terra/api/transform/Validator.java new file mode 100644 index 000000000..c9ba5db9e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/transform/Validator.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.api.transform; + + +public interface Validator { + boolean validate(T value) throws TransformException; +} diff --git a/common/src/main/java/com/dfsek/terra/population/OrePopulator.java b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java index c2d9f9e26..19ba94497 100644 --- a/common/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -35,7 +35,7 @@ public class OrePopulator implements TerraBlockPopulator { Random random = new FastRandom(MathUtil.getCarverChunkSeed(chunk.getX() + cx, chunk.getZ() + cz, world.getSeed())); int originX = ((chunk.getX() + cx) << 4); int originZ = ((chunk.getZ() + cz) << 4); - Biome b = main.getWorld(world).getGrid().getBiome(originX + 8, originZ + 8, GenerationPhase.POPULATE); + Biome b = tw.getGrid().getBiome(originX + 8, originZ + 8, GenerationPhase.POPULATE); BiomeTemplate config = ((UserDefinedBiome) b).getConfig(); int finalCx = cx; int finalCz = cz; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java index 02f4fe45f..64d9943d9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java @@ -6,7 +6,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.translator.Transformer; +import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.bukkit.world.block.data.BukkitMultipleFacing; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 09105d372..85c8fea12 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -12,8 +12,8 @@ import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.translator.MapTransform; -import com.dfsek.terra.api.translator.Transformer; +import com.dfsek.terra.api.transform.MapTransform; +import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.command.command.TerraCommand; import com.dfsek.terra.bukkit.command.command.structure.LocateCommand; import com.dfsek.terra.bukkit.generator.BukkitChunkGenerator; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 0613ffd43..f22fd85eb 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -10,8 +10,10 @@ import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.translator.MapTransform; -import com.dfsek.terra.api.translator.Transformer; +import com.dfsek.terra.api.transform.MapTransform; +import com.dfsek.terra.api.transform.NotNullValidator; +import com.dfsek.terra.api.transform.Transformer; +import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.PluginConfig; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.fabric.inventory.FabricItemHandle; @@ -29,9 +31,13 @@ import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.BiomeEffects; +import net.minecraft.world.biome.GenerationSettings; +import net.minecraft.world.biome.SpawnSettings; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.DefaultBiomeFeatures; import net.minecraft.world.gen.feature.Feature; import net.minecraft.world.gen.feature.HugeMushroomFeature; import net.minecraft.world.gen.feature.TreeFeature; @@ -139,19 +145,42 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } } + Transformer biomeFixer = new Transformer.Builder() + .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse(id)), new NotNullValidator<>()) + .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse("minecraft:" + id.toLowerCase())), new NotNullValidator<>()).build(); + @Override public void register(TypeRegistry registry) { genericLoaders.register(registry); registry .registerLoader(BlockData.class, (t, o, l) -> worldHandle.createBlockData((String) o)) .registerLoader(MaterialData.class, (t, o, l) -> worldHandle.createMaterialData((String) o)) - .registerLoader(com.dfsek.terra.api.generic.world.Biome.class, (t, o, l) -> { - String id = (String) o; - if(!id.contains(":")) id = "minecraft:" + id.toLowerCase(); - Identifier identifier = new Identifier(id); - Biome biome = BuiltinRegistries.BIOME.get(identifier); - return new FabricBiome(biome); - }); + .registerLoader(com.dfsek.terra.api.generic.world.Biome.class, (t, o, l) -> new FabricBiome(biomeFixer.translate((String) o))); + } + + private Biome createBiome(UserDefinedBiome biome) { + SpawnSettings.Builder spawnSettings = new SpawnSettings.Builder(); + DefaultBiomeFeatures.addFarmAnimals(spawnSettings); + DefaultBiomeFeatures.addMonsters(spawnSettings, 95, 5, 100); + + GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); + + return (new Biome.Builder()) + .precipitation(Biome.Precipitation.RAIN) + .category(Biome.Category.NONE) + .depth(0.125F) + .scale(0.05F) + .temperature(0.8F) + .downfall(0.4F) + .effects((new BiomeEffects.Builder()) + .waterColor(0x3f76e4) + .waterFogColor(0x050533) + .fogColor(0xc0d8ff) + .skyColor(0x77adff) + .build()) + .spawnSettings(spawnSettings.build()) + .generationSettings(generationSettings.build()) + .build(); } @SuppressWarnings("unchecked") diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MoreOptionsDialogMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MoreOptionsDialogMixin.java deleted file mode 100644 index 9f3cc5cf8..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/MoreOptionsDialogMixin.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dfsek.terra.fabric.mixin; - -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.font.TextRenderer; -import net.minecraft.client.gui.screen.world.CreateWorldScreen; -import net.minecraft.client.gui.screen.world.MoreOptionsDialog; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; - -@Mixin(MoreOptionsDialog.class) -public class MoreOptionsDialogMixin { - - @Inject(at = @At("HEAD"), method = "method_28092(Lnet/minecraft/client/gui/screen/world/CreateWorldScreen;Lnet/minecraft/client/MinecraftClient;Lnet/minecraft/client/font/TextRenderer;)V") - private void draw(final CreateWorldScreen parent, MinecraftClient client, TextRenderer textRenderer, CallbackInfo info) { - System.out.println("More options opened"); - } - - /*@Inject(at = @At("RETURN"), method = "setVisible(B)V") - private void setVisible(boolean visible, CallbackInfo info) { - System.out.println("redraw"); - } - */ -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index 17af069fe..9a8873ffd 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -5,7 +5,7 @@ import com.dfsek.terra.api.generic.world.WorldHandle; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.block.BlockData; import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.translator.Transformer; +import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricMaterialData; import com.dfsek.terra.fabric.world.block.data.FabricMultipleFacing; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/FloraFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/FloraFeature.java new file mode 100644 index 000000000..a28b4cf54 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/FloraFeature.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.fabric.world.features; + +import com.mojang.serialization.Codec; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.StructureWorldAccess; +import net.minecraft.world.gen.chunk.ChunkGenerator; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.gen.feature.Feature; + +import java.util.Random; + +public class FloraFeature extends Feature { + public FloraFeature(Codec codec) { + super(codec); + } + + @Override + public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { + return false; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index 4e77be7aa..c5816ca25 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -8,7 +8,9 @@ import com.dfsek.terra.api.generic.world.World; import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.api.generic.world.vector.Location; import com.dfsek.terra.fabric.world.block.FabricBlock; +import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.util.math.BlockPos; +import net.minecraft.world.ServerWorldAccess; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.WorldAccess; @@ -35,12 +37,12 @@ public class FabricWorldAccess implements World { @Override public ChunkGenerator getGenerator() { - return null; + return new FabricChunkGenerator(((ServerWorldAccess) delegate).toServerWorld().getChunkManager().getChunkGenerator()); } @Override public String getName() { - return delegate.toString(); + return ((ServerWorldAccess) delegate).toServerWorld().worldProperties.getLevelName(); } @Override diff --git a/platforms/fabric/src/main/resources/terra.accesswidener b/platforms/fabric/src/main/resources/terra.accesswidener index 0b39996bb..56b2a20c4 100644 --- a/platforms/fabric/src/main/resources/terra.accesswidener +++ b/platforms/fabric/src/main/resources/terra.accesswidener @@ -1,4 +1,5 @@ accessWidener v1 named extendable method net/minecraft/client/world/GeneratorType (Ljava/lang/String;)V -accessible field net/minecraft/server/world/ServerWorld Lnet/minecraft/world/level/ServerWorldProperties worldProperties \ No newline at end of file +accessible field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties; +mutable field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties; \ No newline at end of file diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index be4d44a45..a6b050657 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -5,8 +5,7 @@ "compatibilityLevel": "JAVA_8", "mixins": [], "client": [ - "GeneratorTypeAccessor", - "MoreOptionsDialogMixin" + "GeneratorTypeAccessor" ], "server": [], "injectors": { From b955e3d9b957f63d3d9bbe287a04cb02f2a92370 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 16 Dec 2020 01:07:04 -0700 Subject: [PATCH 057/210] Register Fabric biomes as actual modded biomes. --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 43 ++++++++++++++----- .../terra/fabric/world/TerraBiomeSource.java | 10 +++-- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index f22fd85eb..777887d3a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -14,6 +14,7 @@ import com.dfsek.terra.api.transform.MapTransform; import com.dfsek.terra.api.transform.NotNullValidator; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.PluginConfig; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.fabric.inventory.FabricItemHandle; @@ -26,6 +27,7 @@ import com.dfsek.terra.registry.ConfigRegistry; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; +import net.minecraft.block.Blocks; import net.minecraft.client.world.GeneratorType; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; @@ -42,6 +44,8 @@ import net.minecraft.world.gen.feature.Feature; import net.minecraft.world.gen.feature.HugeMushroomFeature; import net.minecraft.world.gen.feature.TreeFeature; import net.minecraft.world.gen.feature.TreeFeatureConfig; +import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; +import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; import org.apache.commons.io.FileUtils; import java.io.File; @@ -158,26 +162,41 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { .registerLoader(com.dfsek.terra.api.generic.world.Biome.class, (t, o, l) -> new FabricBiome(biomeFixer.translate((String) o))); } + public static String createBiomeID(ConfigPack pack, UserDefinedBiome biome) { + return pack.getTemplate().getID().toLowerCase() + "/" + biome.getID().toLowerCase(); + } + private Biome createBiome(UserDefinedBiome biome) { SpawnSettings.Builder spawnSettings = new SpawnSettings.Builder(); DefaultBiomeFeatures.addFarmAnimals(spawnSettings); DefaultBiomeFeatures.addMonsters(spawnSettings, 95, 5, 100); + Biome vanilla = ((FabricBiome) biome.getVanillaBiome()).getHandle(); + GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); + generationSettings.surfaceBuilder(SurfaceBuilder.DEFAULT.withConfig(new TernarySurfaceConfig(Blocks.GRASS_BLOCK.getDefaultState(), Blocks.DIRT.getDefaultState(), Blocks.GRAVEL.getDefaultState()))); // It needs a surfacebuilder, even though we dont use it. + + BiomeEffects.Builder effects = new BiomeEffects.Builder() + .waterColor(vanilla.getWaterColor()) + .waterFogColor(vanilla.getWaterFogColor()) + .fogColor(vanilla.getFogColor()) + .skyColor(vanilla.getSkyColor()) + .grassColorModifier(vanilla.getEffects().getGrassColorModifier()); + if(vanilla.getEffects().getGrassColor().isPresent()) { + effects.grassColor(vanilla.getEffects().getGrassColor().get()); + } + if(vanilla.getEffects().getFoliageColor().isPresent()) { + effects.foliageColor(vanilla.getEffects().getFoliageColor().get()); + } return (new Biome.Builder()) - .precipitation(Biome.Precipitation.RAIN) - .category(Biome.Category.NONE) - .depth(0.125F) - .scale(0.05F) + .precipitation(vanilla.getPrecipitation()) + .category(vanilla.getCategory()) + .depth(vanilla.getDepth()) + .scale(vanilla.getScale()) .temperature(0.8F) .downfall(0.4F) - .effects((new BiomeEffects.Builder()) - .waterColor(0x3f76e4) - .waterFogColor(0x050533) - .fogColor(0xc0d8ff) - .skyColor(0x77adff) - .build()) + .effects(effects.build()) .spawnSettings(spawnSettings.build()) .generationSettings(generationSettings.build()) .build(); @@ -213,9 +232,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { plugin.load(this); LangUtil.load("en_us", this); logger.info("Initializing Terra..."); - registry.loadAll(this); + registry.loadAll(this); + registry.forEach(pack -> pack.getBiomeRegistry().forEach(biome -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, biome)), createBiome(biome)))); // Register all Terra biomes. + /* registry.forEach(config -> { String pack = config.getTemplate().getID().toLowerCase(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java index c06b1def3..c9329ca95 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java @@ -1,11 +1,13 @@ package com.dfsek.terra.fabric.world; import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; -import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import net.minecraft.util.registry.RegistryLookupCodec; import net.minecraft.world.biome.Biome; @@ -23,12 +25,14 @@ public class TerraBiomeSource extends BiomeSource { private final Registry biomeRegistry; private final long seed; private final TerraBiomeGrid grid; + private final ConfigPack pack; public TerraBiomeSource(Registry biomes, long seed) { super(biomes.stream().collect(Collectors.toList())); this.biomeRegistry = biomes; this.seed = seed; this.grid = new TerraBiomeGrid.TerraBiomeGridBuilder(seed, TerraFabricPlugin.getInstance().getRegistry().get("DEFAULT"), TerraFabricPlugin.getInstance()).build(); + this.pack = TerraFabricPlugin.getInstance().getRegistry().get("DEFAULT"); } @Override @@ -43,8 +47,8 @@ public class TerraBiomeSource extends BiomeSource { @Override public Biome getBiomeForNoiseGen(int biomeX, int biomeY, int biomeZ) { - FabricBiome biome = ((FabricBiome) grid.getBiome(biomeX * 4, biomeZ * 4, GenerationPhase.BASE).getVanillaBiome()); - return biomeRegistry.get(BuiltinRegistries.BIOME.getRawId(biome.getHandle())); + UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome(biomeX * 4, biomeZ * 4, GenerationPhase.BASE); + return biomeRegistry.get(new Identifier("terra", TerraFabricPlugin.createBiomeID(pack, biome))); } From beec1a97d4683898d4342d9eb08eb4bb367ca436 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 16 Dec 2020 02:38:48 -0700 Subject: [PATCH 058/210] Implement flora as a Feature on Fabric --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 37 +++++++++++-------- .../terra/fabric/world/TerraBiomeSource.java | 14 ++++--- .../fabric/world/features/FloraFeature.java | 8 +++- .../FabricChunkGeneratorWrapper.java | 10 +++-- ...Chunk.java => FabricChunkWorldAccess.java} | 18 ++++----- 5 files changed, 54 insertions(+), 33 deletions(-) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/{FabricChunkRegionChunk.java => FabricChunkWorldAccess.java} (67%) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 777887d3a..78d31b29b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -22,6 +22,7 @@ import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; import com.dfsek.terra.fabric.world.FabricBiome; import com.dfsek.terra.fabric.world.FabricWorldHandle; import com.dfsek.terra.fabric.world.TerraBiomeSource; +import com.dfsek.terra.fabric.world.features.FloraFeature; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.registry.ConfigRegistry; import net.fabricmc.api.EnvType; @@ -32,15 +33,21 @@ import net.minecraft.client.world.GeneratorType; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; import net.minecraft.util.registry.Registry; +import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.GenerationSettings; import net.minecraft.world.biome.SpawnSettings; +import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; +import net.minecraft.world.gen.decorator.Decorator; +import net.minecraft.world.gen.decorator.NopeDecoratorConfig; import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.DefaultBiomeFeatures; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.Feature; +import net.minecraft.world.gen.feature.FeatureConfig; import net.minecraft.world.gen.feature.HugeMushroomFeature; import net.minecraft.world.gen.feature.TreeFeature; import net.minecraft.world.gen.feature.TreeFeatureConfig; @@ -65,6 +72,9 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { return instance; } + public static final FloraFeature FLORA = new FloraFeature(DefaultFeatureConfig.CODEC); + public static final ConfiguredFeature FLORA_CONFIGURED = FLORA.configure(FeatureConfig.DEFAULT).decorate(Decorator.NOPE.configure(NopeDecoratorConfig.INSTANCE)); + private final GenericLoaders genericLoaders = new GenericLoaders(this); private final Logger logger = Logger.getLogger("Terra"); private final ItemHandle itemHandle = new FabricItemHandle(); @@ -175,6 +185,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); generationSettings.surfaceBuilder(SurfaceBuilder.DEFAULT.withConfig(new TernarySurfaceConfig(Blocks.GRASS_BLOCK.getDefaultState(), Blocks.DIRT.getDefaultState(), Blocks.GRAVEL.getDefaultState()))); // It needs a surfacebuilder, even though we dont use it. + generationSettings.feature(GenerationStep.Feature.VEGETAL_DECORATION, FLORA_CONFIGURED); BiomeEffects.Builder effects = new BiomeEffects.Builder() .waterColor(vanilla.getWaterColor()) @@ -196,7 +207,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { .scale(vanilla.getScale()) .temperature(0.8F) .downfall(0.4F) - .effects(effects.build()) + .effects(vanilla.getEffects()) // TODO: configurable .spawnSettings(spawnSettings.build()) .generationSettings(generationSettings.build()) .build(); @@ -233,29 +244,25 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { LangUtil.load("en_us", this); logger.info("Initializing Terra..."); - registry.loadAll(this); - registry.forEach(pack -> pack.getBiomeRegistry().forEach(biome -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, biome)), createBiome(biome)))); // Register all Terra biomes. - /* - registry.forEach(config -> { - String pack = config.getTemplate().getID().toLowerCase(); - config.getBiomeRegistry().forEach(terraBiome -> { - Biome biome = (new Biome.Builder()).build(); - Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", pack + "_" + terraBiome.getID().toLowerCase()), biome); - }); - }); - */ + Registry.register(Registry.FEATURE, new Identifier("terra", "flora_populator"), FLORA); + RegistryKey> floraKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN, new Identifier("terra", "flora_populator")); + Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, floraKey.getValue(), FLORA_CONFIGURED); + + registry.forEach(pack -> pack.getBiomeRegistry().forEach(biome -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, biome)), createBiome(biome)))); // Register all Terra biomes. + Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC); + Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), TerraBiomeSource.CODEC); if(FabricLoader.getInstance().getEnvironmentType().equals(EnvType.CLIENT)) { GeneratorTypeAccessor.getValues().add(new GeneratorType("terra") { @Override protected ChunkGenerator getChunkGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed) { - return new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed), seed, registry.get("DEFAULT")); + ConfigPack pack = registry.get("DEFAULT"); + return new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed, pack), seed, pack); } }); } - Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC); - Registry.register(Registry.BIOME_SOURCE, new Identifier("terra:terra"), TerraBiomeSource.CODEC); + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java index c9329ca95..2e24fc8b3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java @@ -17,9 +17,13 @@ import net.minecraft.world.gen.feature.StructureFeature; import java.util.stream.Collectors; public class TerraBiomeSource extends BiomeSource { + public static final Codec PACK_CODEC = (RecordCodecBuilder.create(config -> config.group( + Codec.STRING.fieldOf("pack").forGetter(pack -> pack.getTemplate().getID()) + ).apply(config, config.stable(TerraFabricPlugin.getInstance().getRegistry()::get)))); public static final Codec CODEC = RecordCodecBuilder.create(instance -> instance.group( RegistryLookupCodec.of(Registry.BIOME_KEY).forGetter(source -> source.biomeRegistry), - Codec.LONG.fieldOf("seed").stable().forGetter(source -> source.seed)) + Codec.LONG.fieldOf("seed").stable().forGetter(source -> source.seed), + PACK_CODEC.fieldOf("pack").stable().forGetter(source -> source.pack)) .apply(instance, instance.stable(TerraBiomeSource::new))); private final Registry biomeRegistry; @@ -27,12 +31,12 @@ public class TerraBiomeSource extends BiomeSource { private final TerraBiomeGrid grid; private final ConfigPack pack; - public TerraBiomeSource(Registry biomes, long seed) { + public TerraBiomeSource(Registry biomes, long seed, ConfigPack pack) { super(biomes.stream().collect(Collectors.toList())); this.biomeRegistry = biomes; this.seed = seed; - this.grid = new TerraBiomeGrid.TerraBiomeGridBuilder(seed, TerraFabricPlugin.getInstance().getRegistry().get("DEFAULT"), TerraFabricPlugin.getInstance()).build(); - this.pack = TerraFabricPlugin.getInstance().getRegistry().get("DEFAULT"); + this.grid = new TerraBiomeGrid.TerraBiomeGridBuilder(seed, pack, TerraFabricPlugin.getInstance()).build(); + this.pack = pack; } @Override @@ -42,7 +46,7 @@ public class TerraBiomeSource extends BiomeSource { @Override public BiomeSource withSeed(long seed) { - return new TerraBiomeSource(this.biomeRegistry, seed); + return new TerraBiomeSource(this.biomeRegistry, seed, pack); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/FloraFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/FloraFeature.java index a28b4cf54..e7c43d76c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/FloraFeature.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/FloraFeature.java @@ -1,5 +1,9 @@ package com.dfsek.terra.fabric.world.features; +import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; +import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; +import com.dfsek.terra.fabric.world.handles.FabricWorld; +import com.dfsek.terra.fabric.world.handles.chunk.FabricChunkWorldAccess; import com.mojang.serialization.Codec; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; @@ -16,6 +20,8 @@ public class FloraFeature extends Feature { @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - return false; + ((FabricChunkGeneratorWrapper) chunkGenerator).getFloraPopulator().populate(new FabricWorld(world.toServerWorld(), new FabricChunkGenerator(chunkGenerator)), + random, new FabricChunkWorldAccess(world, pos.getX() >> 4, pos.getZ() >> 4)); + return true; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index c68831890..5dff35e3a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -6,7 +6,7 @@ import com.dfsek.terra.api.generic.Handle; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.world.TerraBiomeSource; -import com.dfsek.terra.fabric.world.handles.chunk.FabricChunkRegionChunk; +import com.dfsek.terra.fabric.world.handles.chunk.FabricChunkWorldAccess; import com.dfsek.terra.fabric.world.handles.world.FabricSeededWorldAccess; import com.dfsek.terra.fabric.world.handles.world.FabricWorldChunkRegion; import com.dfsek.terra.generation.TerraChunkGenerator; @@ -53,6 +53,10 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl private final OrePopulator orePopulator = new OrePopulator(TerraFabricPlugin.getInstance()); private final TreePopulator treePopulator = new TreePopulator(TerraFabricPlugin.getInstance()); + public FloraPopulator getFloraPopulator() { + return floraPopulator; + } + public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack) { super(biomeSource, new StructuresConfig(false)); this.pack = configPack; @@ -99,10 +103,10 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl public void generateFeatures(ChunkRegion region, StructureAccessor accessor) { FastRandom pop = new FastRandom(MathUtil.getCarverChunkSeed(region.getCenterChunkX(), region.getCenterChunkZ(), seed)); FabricWorldChunkRegion chunkRegion = new FabricWorldChunkRegion(region, this); - FabricChunkRegionChunk regionChunk = new FabricChunkRegionChunk(region); + FabricChunkWorldAccess regionChunk = new FabricChunkWorldAccess(region, region.getCenterChunkX(), region.getCenterChunkZ()); + super.generateFeatures(region, accessor); cavePopulator.populate(chunkRegion, pop, regionChunk); orePopulator.populate(chunkRegion, pop, regionChunk); - floraPopulator.populate(chunkRegion, pop, regionChunk); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java similarity index 67% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java index 118ed8133..94684c0b7 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkRegionChunk.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java @@ -6,27 +6,27 @@ import com.dfsek.terra.api.generic.world.block.Block; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; import net.minecraft.util.math.BlockPos; -import net.minecraft.world.ChunkRegion; +import net.minecraft.world.WorldAccess; -public class FabricChunkRegionChunk implements Chunk { - private final ChunkRegion chunkRegion; +public class FabricChunkWorldAccess implements Chunk { + private final WorldAccess chunkRegion; private final int x; private final int z; - public FabricChunkRegionChunk(ChunkRegion chunkRegion) { + public FabricChunkWorldAccess(WorldAccess chunkRegion, int x, int z) { this.chunkRegion = chunkRegion; - this.x = chunkRegion.getCenterChunkX() << 4; - this.z = chunkRegion.getCenterChunkZ() << 4; + this.x = x << 4; + this.z = z << 4; } @Override public int getX() { - return chunkRegion.getCenterChunkX(); + return x >> 4; } @Override public int getZ() { - return chunkRegion.getCenterChunkZ(); + return z >> 4; } @Override @@ -41,7 +41,7 @@ public class FabricChunkRegionChunk implements Chunk { } @Override - public ChunkRegion getHandle() { + public WorldAccess getHandle() { return chunkRegion; } } From fd89c1128a44195d9249299535403e7879349836 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 18 Dec 2020 02:07:20 -0700 Subject: [PATCH 059/210] fix order of population in FabricChunkGeneratorWrapper --- .../fabric/world/generator/FabricChunkGeneratorWrapper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index 5dff35e3a..6a043e3fb 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -104,9 +104,9 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl FastRandom pop = new FastRandom(MathUtil.getCarverChunkSeed(region.getCenterChunkX(), region.getCenterChunkZ(), seed)); FabricWorldChunkRegion chunkRegion = new FabricWorldChunkRegion(region, this); FabricChunkWorldAccess regionChunk = new FabricChunkWorldAccess(region, region.getCenterChunkX(), region.getCenterChunkZ()); - super.generateFeatures(region, accessor); cavePopulator.populate(chunkRegion, pop, regionChunk); orePopulator.populate(chunkRegion, pop, regionChunk); + super.generateFeatures(region, accessor); } @Override From 817b962c4a37bc15535e5c26219885048591f552 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 18 Dec 2020 15:13:59 -0700 Subject: [PATCH 060/210] Move all pops to feature --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 12 ++++----- ...loraFeature.java => PopulatorFeature.java} | 15 ++++++++--- .../FabricChunkGeneratorWrapper.java | 25 +++++++++---------- 3 files changed, 29 insertions(+), 23 deletions(-) rename platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/{FloraFeature.java => PopulatorFeature.java} (55%) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 78d31b29b..9105b423a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -22,7 +22,7 @@ import com.dfsek.terra.fabric.mixin.GeneratorTypeAccessor; import com.dfsek.terra.fabric.world.FabricBiome; import com.dfsek.terra.fabric.world.FabricWorldHandle; import com.dfsek.terra.fabric.world.TerraBiomeSource; -import com.dfsek.terra.fabric.world.features.FloraFeature; +import com.dfsek.terra.fabric.world.features.PopulatorFeature; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.registry.ConfigRegistry; import net.fabricmc.api.EnvType; @@ -72,8 +72,8 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { return instance; } - public static final FloraFeature FLORA = new FloraFeature(DefaultFeatureConfig.CODEC); - public static final ConfiguredFeature FLORA_CONFIGURED = FLORA.configure(FeatureConfig.DEFAULT).decorate(Decorator.NOPE.configure(NopeDecoratorConfig.INSTANCE)); + public static final PopulatorFeature POPULATOR_FEATURE = new PopulatorFeature(DefaultFeatureConfig.CODEC); + public static final ConfiguredFeature POPULATOR_CONFIGURED_FEATURE = POPULATOR_FEATURE.configure(FeatureConfig.DEFAULT).decorate(Decorator.NOPE.configure(NopeDecoratorConfig.INSTANCE)); private final GenericLoaders genericLoaders = new GenericLoaders(this); private final Logger logger = Logger.getLogger("Terra"); @@ -185,7 +185,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); generationSettings.surfaceBuilder(SurfaceBuilder.DEFAULT.withConfig(new TernarySurfaceConfig(Blocks.GRASS_BLOCK.getDefaultState(), Blocks.DIRT.getDefaultState(), Blocks.GRAVEL.getDefaultState()))); // It needs a surfacebuilder, even though we dont use it. - generationSettings.feature(GenerationStep.Feature.VEGETAL_DECORATION, FLORA_CONFIGURED); + generationSettings.feature(GenerationStep.Feature.VEGETAL_DECORATION, POPULATOR_CONFIGURED_FEATURE); BiomeEffects.Builder effects = new BiomeEffects.Builder() .waterColor(vanilla.getWaterColor()) @@ -246,9 +246,9 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { registry.loadAll(this); - Registry.register(Registry.FEATURE, new Identifier("terra", "flora_populator"), FLORA); + Registry.register(Registry.FEATURE, new Identifier("terra", "flora_populator"), POPULATOR_FEATURE); RegistryKey> floraKey = RegistryKey.of(Registry.CONFIGURED_FEATURE_WORLDGEN, new Identifier("terra", "flora_populator")); - Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, floraKey.getValue(), FLORA_CONFIGURED); + Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, floraKey.getValue(), POPULATOR_CONFIGURED_FEATURE); registry.forEach(pack -> pack.getBiomeRegistry().forEach(biome -> Registry.register(BuiltinRegistries.BIOME, new Identifier("terra", createBiomeID(pack, biome)), createBiome(biome)))); // Register all Terra biomes. Registry.register(Registry.CHUNK_GENERATOR, new Identifier("terra:terra"), FabricChunkGeneratorWrapper.CODEC); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/FloraFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java similarity index 55% rename from platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/FloraFeature.java rename to platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java index e7c43d76c..6f33f2b09 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/FloraFeature.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java @@ -13,15 +13,22 @@ import net.minecraft.world.gen.feature.Feature; import java.util.Random; -public class FloraFeature extends Feature { - public FloraFeature(Codec codec) { +/** + * Feature wrapper for Terra populator + */ +public class PopulatorFeature extends Feature { + public PopulatorFeature(Codec codec) { super(codec); } @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos pos, DefaultFeatureConfig config) { - ((FabricChunkGeneratorWrapper) chunkGenerator).getFloraPopulator().populate(new FabricWorld(world.toServerWorld(), new FabricChunkGenerator(chunkGenerator)), - random, new FabricChunkWorldAccess(world, pos.getX() >> 4, pos.getZ() >> 4)); + FabricChunkGeneratorWrapper gen = (FabricChunkGeneratorWrapper) chunkGenerator; + FabricChunkWorldAccess chunk = new FabricChunkWorldAccess(world, pos.getX() >> 4, pos.getZ() >> 4); + FabricWorld world1 = new FabricWorld(world.toServerWorld(), new FabricChunkGenerator(chunkGenerator)); + gen.getCavePopulator().populate(world1, random, chunk); + gen.getOrePopulator().populate(world1, random, chunk); + gen.getFloraPopulator().populate(world1, random, chunk); return true; } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index 6a043e3fb..031074f99 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -1,14 +1,11 @@ package com.dfsek.terra.fabric.world.generator; -import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.generic.Handle; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.world.TerraBiomeSource; -import com.dfsek.terra.fabric.world.handles.chunk.FabricChunkWorldAccess; import com.dfsek.terra.fabric.world.handles.world.FabricSeededWorldAccess; -import com.dfsek.terra.fabric.world.handles.world.FabricWorldChunkRegion; import com.dfsek.terra.generation.TerraChunkGenerator; import com.dfsek.terra.population.CavePopulator; import com.dfsek.terra.population.FloraPopulator; @@ -53,6 +50,18 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl private final OrePopulator orePopulator = new OrePopulator(TerraFabricPlugin.getInstance()); private final TreePopulator treePopulator = new TreePopulator(TerraFabricPlugin.getInstance()); + public TreePopulator getTreePopulator() { + return treePopulator; + } + + public CavePopulator getCavePopulator() { + return cavePopulator; + } + + public OrePopulator getOrePopulator() { + return orePopulator; + } + public FloraPopulator getFloraPopulator() { return floraPopulator; } @@ -99,16 +108,6 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl // No caves } - @Override - public void generateFeatures(ChunkRegion region, StructureAccessor accessor) { - FastRandom pop = new FastRandom(MathUtil.getCarverChunkSeed(region.getCenterChunkX(), region.getCenterChunkZ(), seed)); - FabricWorldChunkRegion chunkRegion = new FabricWorldChunkRegion(region, this); - FabricChunkWorldAccess regionChunk = new FabricChunkWorldAccess(region, region.getCenterChunkX(), region.getCenterChunkZ()); - cavePopulator.populate(chunkRegion, pop, regionChunk); - orePopulator.populate(chunkRegion, pop, regionChunk); - super.generateFeatures(region, accessor); - } - @Override public void setStructureStarts(DynamicRegistryManager dynamicRegistryManager, StructureAccessor structureAccessor, Chunk chunk, StructureManager structureManager, long worldSeed) { From b06a7551541f19f191bf4acabd076f21de9a21d9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 18 Dec 2020 15:31:12 -0700 Subject: [PATCH 061/210] Trees work on Fabric now --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 43 ++++++++++++------- .../dfsek/terra/fabric/world/FabricTree.java | 5 +-- .../terra/fabric/world/FabricWorldHandle.java | 5 +-- .../world/features/PopulatorFeature.java | 1 + 4 files changed, 32 insertions(+), 22 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 9105b423a..d2787d1d6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -25,6 +25,7 @@ import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.features.PopulatorFeature; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.registry.ConfigRegistry; +import com.dfsek.terra.util.StringUtils; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; @@ -44,13 +45,13 @@ import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; import net.minecraft.world.gen.decorator.Decorator; import net.minecraft.world.gen.decorator.NopeDecoratorConfig; import net.minecraft.world.gen.feature.ConfiguredFeature; +import net.minecraft.world.gen.feature.ConfiguredFeatures; import net.minecraft.world.gen.feature.DefaultBiomeFeatures; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.Feature; import net.minecraft.world.gen.feature.FeatureConfig; import net.minecraft.world.gen.feature.HugeMushroomFeature; import net.minecraft.world.gen.feature.TreeFeature; -import net.minecraft.world.gen.feature.TreeFeatureConfig; import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; import org.apache.commons.io.FileUtils; @@ -58,6 +59,7 @@ import org.apache.commons.io.FileUtils; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.Field; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; @@ -213,7 +215,17 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { .build(); } - @SuppressWarnings("unchecked") + private static ConfiguredFeature getFeature(String name) { + Class featuresClass = ConfiguredFeatures.class; + Field feature; + try { + feature = featuresClass.getField(name); + return (ConfiguredFeature) feature.get(null); + } catch(NoSuchFieldException | IllegalAccessException e) { + throw new IllegalArgumentException("No such feature: " + name); + } + } + @Override public void onInitialize() { instance = this; @@ -222,20 +234,19 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { BuiltinRegistries.CONFIGURED_FEATURE.stream().filter(feature -> feature.feature instanceof TreeFeature || feature.feature instanceof HugeMushroomFeature).forEach(tree -> System.out.println(BuiltinRegistries.CONFIGURED_FEATURE.getId(tree))); - - Transformer> treeTransformer = new Transformer.Builder>() - .addTransform(id -> (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse(id))) - .addTransform(new MapTransform>() - .add("BROWN_MUSHROOM", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:huge_brown_mushroom"))) - .add("RED_MUSHROOM", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:huge_red_mushroom"))) - .add("JUNGLE", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:mega_jungle_tree"))) - .add("JUNGLE_COCOA", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:jungle_tree_no_vine"))) - .add("LARGE_OAK", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:fancy_oak"))) - .add("LARGE_SPRUCE", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:pine"))) - .add("SMALL_JUNGLE", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:jungle_tree"))) - .add("SWAMP_OAK", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:oak"))) - .add("TALL_BIRCH", (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:birch")))) - .addTransform(id -> (ConfiguredFeature) BuiltinRegistries.CONFIGURED_FEATURE.get(Identifier.tryParse("minecraft:" + id.toLowerCase()))).build(); + Transformer> treeTransformer = new Transformer.Builder>() + .addTransform(TerraFabricPlugin::getFeature) + .addTransform(id -> getFeature(StringUtils.stripMinecraftNamespace(id))) + .addTransform(new MapTransform>() + .add("BROWN_MUSHROOM", ConfiguredFeatures.BROWN_MUSHROOM_GIANT) + .add("RED_MUSHROOM", ConfiguredFeatures.RED_MUSHROOM_GIANT) + .add("JUNGLE", ConfiguredFeatures.MEGA_JUNGLE_TREE) + .add("JUNGLE_COCOA", ConfiguredFeatures.JUNGLE_TREE) + .add("LARGE_OAK", ConfiguredFeatures.FANCY_OAK) + .add("LARGE_SPRUCE", ConfiguredFeatures.PINE) + .add("SMALL_JUNGLE", ConfiguredFeatures.JUNGLE_TREE) + .add("SWAMP_OAK", ConfiguredFeatures.SWAMP_TREE) + .add("TALL_BIRCH", ConfiguredFeatures.BIRCH_TALL)).build(); ((FabricWorldHandle) worldHandle).setTreeTransformer(treeTransformer); config = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java index e92bef247..ff870c3c3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java @@ -11,15 +11,14 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.TreeFeatureConfig; import java.util.Random; import java.util.Set; public class FabricTree implements Tree { - private final ConfiguredFeature delegate; + private final ConfiguredFeature delegate; - public FabricTree(ConfiguredFeature delegate) { + public FabricTree(ConfiguredFeature delegate) { this.delegate = delegate; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index 9a8873ffd..260d3c9ea 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -18,14 +18,13 @@ import net.minecraft.block.BlockState; import net.minecraft.command.argument.BlockArgumentParser; import net.minecraft.state.property.Properties; import net.minecraft.world.gen.feature.ConfiguredFeature; -import net.minecraft.world.gen.feature.TreeFeatureConfig; import java.util.Arrays; public class FabricWorldHandle implements WorldHandle { - private Transformer> treeTransformer; + private Transformer> treeTransformer; - public void setTreeTransformer(Transformer> treeTransformer) { + public void setTreeTransformer(Transformer> treeTransformer) { this.treeTransformer = treeTransformer; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java index 6f33f2b09..e5f6d584e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java @@ -29,6 +29,7 @@ public class PopulatorFeature extends Feature { gen.getCavePopulator().populate(world1, random, chunk); gen.getOrePopulator().populate(world1, random, chunk); gen.getFloraPopulator().populate(world1, random, chunk); + gen.getTreePopulator().populate(world1, random, chunk); return true; } } From b33c8d6b77d5cec3ae15321a8d8cf85aeb3de633 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 18 Dec 2020 15:35:09 -0700 Subject: [PATCH 062/210] fix population order --- .../com/dfsek/terra/fabric/world/features/PopulatorFeature.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java index e5f6d584e..1168a0bbe 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java @@ -28,8 +28,8 @@ public class PopulatorFeature extends Feature { FabricWorld world1 = new FabricWorld(world.toServerWorld(), new FabricChunkGenerator(chunkGenerator)); gen.getCavePopulator().populate(world1, random, chunk); gen.getOrePopulator().populate(world1, random, chunk); - gen.getFloraPopulator().populate(world1, random, chunk); gen.getTreePopulator().populate(world1, random, chunk); + gen.getFloraPopulator().populate(world1, random, chunk); return true; } } From 300fe10da51dcdc9e8efa5e8eba1bbc23ca361b7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 18 Dec 2020 15:44:16 -0700 Subject: [PATCH 063/210] Cleanup --- .../dfsek/terra/fabric/TerraFabricPlugin.java | 49 +++++++------------ 1 file changed, 19 insertions(+), 30 deletions(-) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index d2787d1d6..f479a868c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -48,10 +48,7 @@ import net.minecraft.world.gen.feature.ConfiguredFeature; import net.minecraft.world.gen.feature.ConfiguredFeatures; import net.minecraft.world.gen.feature.DefaultBiomeFeatures; import net.minecraft.world.gen.feature.DefaultFeatureConfig; -import net.minecraft.world.gen.feature.Feature; import net.minecraft.world.gen.feature.FeatureConfig; -import net.minecraft.world.gen.feature.HugeMushroomFeature; -import net.minecraft.world.gen.feature.TreeFeature; import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder; import net.minecraft.world.gen.surfacebuilder.TernarySurfaceConfig; import org.apache.commons.io.FileUtils; @@ -83,12 +80,20 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final WorldHandle worldHandle = new FabricWorldHandle(); private final ConfigRegistry registry = new ConfigRegistry(); private File config; - private final PluginConfig plugin; - - { - logger.setLevel(Level.INFO); - plugin = new PluginConfig(); - } + private static final Transformer> TREE_TRANSFORMER = new Transformer.Builder>() + .addTransform(TerraFabricPlugin::getFeature) + .addTransform(id -> getFeature(StringUtils.stripMinecraftNamespace(id))) + .addTransform(new MapTransform>() + .add("BROWN_MUSHROOM", ConfiguredFeatures.BROWN_MUSHROOM_GIANT) + .add("RED_MUSHROOM", ConfiguredFeatures.RED_MUSHROOM_GIANT) + .add("JUNGLE", ConfiguredFeatures.MEGA_JUNGLE_TREE) + .add("JUNGLE_COCOA", ConfiguredFeatures.JUNGLE_TREE) + .add("LARGE_OAK", ConfiguredFeatures.FANCY_OAK) + .add("LARGE_SPRUCE", ConfiguredFeatures.PINE) + .add("SMALL_JUNGLE", ConfiguredFeatures.JUNGLE_TREE) + .add("SWAMP_OAK", ConfiguredFeatures.SWAMP_TREE) + .add("TALL_BIRCH", ConfiguredFeatures.BIRCH_TALL)).build(); + private final PluginConfig plugin = new PluginConfig(); @Override public WorldHandle getWorldHandle() { @@ -131,7 +136,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public Language getLanguage() { try { - return new Language(new File(getDataFolder(), "lang/en_us/yml")); + return new Language(new File(getDataFolder(), "lang/en_us.yml")); } catch(IOException e) { throw new IllegalArgumentException(); } @@ -207,8 +212,8 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { .category(vanilla.getCategory()) .depth(vanilla.getDepth()) .scale(vanilla.getScale()) - .temperature(0.8F) - .downfall(0.4F) + .temperature(vanilla.getTemperature()) + .downfall(vanilla.getDownfall()) .effects(vanilla.getEffects()) // TODO: configurable .spawnSettings(spawnSettings.build()) .generationSettings(generationSettings.build()) @@ -228,26 +233,10 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public void onInitialize() { + logger.setLevel(Level.INFO); instance = this; - Map> treeFeatureMap = new HashMap<>(); - BuiltinRegistries.CONFIGURED_FEATURE.stream().filter(feature -> - feature.feature instanceof TreeFeature - || feature.feature instanceof HugeMushroomFeature).forEach(tree -> System.out.println(BuiltinRegistries.CONFIGURED_FEATURE.getId(tree))); - Transformer> treeTransformer = new Transformer.Builder>() - .addTransform(TerraFabricPlugin::getFeature) - .addTransform(id -> getFeature(StringUtils.stripMinecraftNamespace(id))) - .addTransform(new MapTransform>() - .add("BROWN_MUSHROOM", ConfiguredFeatures.BROWN_MUSHROOM_GIANT) - .add("RED_MUSHROOM", ConfiguredFeatures.RED_MUSHROOM_GIANT) - .add("JUNGLE", ConfiguredFeatures.MEGA_JUNGLE_TREE) - .add("JUNGLE_COCOA", ConfiguredFeatures.JUNGLE_TREE) - .add("LARGE_OAK", ConfiguredFeatures.FANCY_OAK) - .add("LARGE_SPRUCE", ConfiguredFeatures.PINE) - .add("SMALL_JUNGLE", ConfiguredFeatures.JUNGLE_TREE) - .add("SWAMP_OAK", ConfiguredFeatures.SWAMP_TREE) - .add("TALL_BIRCH", ConfiguredFeatures.BIRCH_TALL)).build(); - ((FabricWorldHandle) worldHandle).setTreeTransformer(treeTransformer); + ((FabricWorldHandle) worldHandle).setTreeTransformer(TREE_TRANSFORMER); config = new File(FabricLoader.getInstance().getConfigDir().toFile(), "Terra"); saveDefaultConfig(); From d1af8c12244e7c6e25cc43265181be4f9a6ca40b Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 18 Dec 2020 19:36:27 -0700 Subject: [PATCH 064/210] Begin absorbing Gaea into Terra --- .../java/com/dfsek/terra/TerraProfiler.java | 2 +- .../main/java/com/dfsek/terra/TerraWorld.java | 8 ++-- .../main/java/com/dfsek/terra/api/Entity.java | 4 +- .../com/dfsek/terra/api/GenericLoaders.java | 2 +- .../java/com/dfsek/terra/api/gaea/Debug.java | 2 +- .../java/com/dfsek/terra/api/gaea/Gaea.java | 2 +- .../dfsek/terra/api/gaea/lang/Language.java | 2 +- .../dfsek/terra/api/gaea/lang/Message.java | 2 +- .../terra/api/gaea/lang/MultiLineMessage.java | 2 +- .../api/gaea/lang/SingleLineMessage.java | 2 +- .../api/gaea/math/ChunkInterpolator3.java | 8 ++-- .../api/gaea/math/ProbabilityCollection.java | 2 +- .../api/gaea/population/ChunkCoordinate.java | 2 +- .../gaea/population/PopulationManager.java | 8 ++-- .../api/gaea/profiler/WorldProfiler.java | 2 +- .../terra/api/gaea/structures/loot/Entry.java | 6 +-- .../api/gaea/structures/loot/LootTable.java | 6 +-- .../terra/api/gaea/structures/loot/Pool.java | 4 +- .../loot/functions/AmountFunction.java | 2 +- .../loot/functions/DamageFunction.java | 6 +-- .../structures/loot/functions/Function.java | 2 +- .../com/dfsek/terra/api/gaea/tree/Tree.java | 14 ------- .../com/dfsek/terra/api/gaea/world/Flora.java | 6 +-- .../com/dfsek/terra/api/generic/Tree.java | 4 -- .../api/generic/generator/BlockPopulator.java | 11 ------ .../generator/TerraBlockPopulator.java | 10 ----- .../api/generic/inventory/ItemHandle.java | 7 ---- .../api/generic/inventory/item/ItemMeta.java | 6 --- .../dfsek/terra/api/generic/world/Biome.java | 6 --- .../dfsek/terra/api/generic/world/Chunk.java | 14 ------- .../terra/api/generic/world/block/Axis.java | 5 --- .../generic/world/block/data/Directional.java | 10 ----- .../generic/world/block/data/Orientable.java | 12 ------ .../generic/world/block/data/Rotatable.java | 10 ----- .../generic/world/block/state/BlockState.java | 4 -- .../{generic => platform}/CommandSender.java | 2 +- .../api/{generic => platform}/Entity.java | 2 +- .../api/{generic => platform}/Handle.java | 2 +- .../{generic => platform}/TerraPlugin.java | 8 ++-- .../com/dfsek/terra/api/platform/Tree.java | 4 ++ .../platform/generator/BlockPopulator.java | 11 ++++++ .../generator/ChunkGenerator.java | 11 +++--- .../inventory/Inventory.java | 4 +- .../api/platform/inventory/ItemHandle.java | 7 ++++ .../inventory/ItemStack.java | 8 ++-- .../inventory/item/Damageable.java | 4 +- .../api/platform/inventory/item/ItemMeta.java | 6 +++ .../dfsek/terra/api/platform/world/Biome.java | 6 +++ .../world/BiomeGrid.java | 4 +- .../dfsek/terra/api/platform/world/Chunk.java | 14 +++++++ .../{generic => platform}/world/World.java | 14 +++---- .../world/WorldHandle.java | 10 ++--- .../terra/api/platform/world/block/Axis.java | 5 +++ .../world/block/Block.java | 6 +-- .../world/block/BlockData.java | 4 +- .../world/block/BlockFace.java | 4 +- .../world/block/MaterialData.java | 4 +- .../world/block/data/AnaloguePowerable.java | 4 +- .../world/block/data/Bisected.java | 4 +- .../world/block/data/Directional.java | 10 +++++ .../world/block/data/MultipleFacing.java | 6 +-- .../platform/world/block/data/Orientable.java | 14 +++++++ .../world/block/data/Rail.java | 4 +- .../world/block/data/RedstoneWire.java | 6 +-- .../platform/world/block/data/Rotatable.java | 10 +++++ .../world/block/data/Slab.java | 2 +- .../world/block/data/Stairs.java | 2 +- .../world/block/data/Wall.java | 6 +-- .../world/block/data/Waterlogged.java | 4 +- .../world/block/state/BlockState.java | 4 ++ .../world/vector/Location.java | 6 +-- .../world/vector/Vector2.java | 2 +- .../world/vector/Vector3.java | 4 +- .../api/{gaea => world}/biome/Biome.java | 6 +-- .../api/{gaea => world}/biome/BiomeGrid.java | 6 +-- .../api/{gaea => world}/biome/Decorator.java | 4 +- .../api/{gaea => world}/biome/Generator.java | 8 ++-- .../biome/NormalizationUtil.java | 2 +- .../api/{gaea => }/world/carving/Carver.java | 6 +-- .../api/{gaea => }/world/carving/Worm.java | 4 +- .../generation/GenerationPhase.java | 2 +- .../world/generation/TerraBlockPopulator.java | 10 +++++ .../generation}/TerraChunkGenerator.java | 9 +++-- .../api/{gaea => }/world/palette/Palette.java | 6 +-- .../world/palette/RandomPalette.java | 2 +- .../world/palette/SimplexPalette.java | 2 +- .../com/dfsek/terra/api/world/tree/Tree.java | 14 +++++++ .../tree/fractal/EntitySpawnHolder.java | 6 +-- .../tree/fractal/FractalTree.java | 10 ++--- .../tree/fractal/TreeGeometry.java | 8 ++-- .../tree/fractal/trees/Cactus.java | 10 ++--- .../tree/fractal/trees/IceSpike.java | 16 ++++---- .../tree/fractal/trees/OakTree.java | 14 +++---- .../tree/fractal/trees/ShatteredPillar.java | 10 ++--- .../tree/fractal/trees/ShatteredTree.java | 16 ++++---- .../fractal/trees/SmallShatteredPillar.java | 10 ++--- .../fractal/trees/SmallShatteredTree.java | 16 ++++---- .../tree/fractal/trees/SpruceTree.java | 14 +++---- .../dfsek/terra/async/AsyncBiomeFinder.java | 10 ++--- .../dfsek/terra/async/AsyncFeatureFinder.java | 8 ++-- .../java/com/dfsek/terra/biome/BiomeZone.java | 4 +- .../dfsek/terra/biome/UserDefinedBiome.java | 14 +++---- .../terra/biome/grid/SingleBiomeGrid.java | 8 ++-- .../terra/biome/grid/UserDefinedGrid.java | 10 ++--- .../biome/grid/master/TerraBiomeGrid.java | 4 +- .../grid/master/TerraRadialBiomeGrid.java | 10 ++--- .../grid/master/TerraStandardBiomeGrid.java | 8 ++-- .../terra/biome/palette/PaletteHolder.java | 4 +- .../biome/palette/PaletteHolderBuilder.java | 4 +- .../terra/biome/palette/PaletteLayer.java | 2 +- .../terra/biome/palette/SinglePalette.java | 2 +- .../postprocessing/CoordinatePerturb.java | 2 +- .../com/dfsek/terra/carving/CarverCache.java | 12 +++--- .../dfsek/terra/carving/CarverPalette.java | 4 +- .../terra/carving/UserDefinedCarver.java | 12 +++--- .../dfsek/terra/config/base/ConfigPack.java | 8 ++-- .../dfsek/terra/config/base/PluginConfig.java | 2 +- .../builder/biomegrid/BiomeGridBuilder.java | 2 +- .../builder/biomegrid/SingleGridBuilder.java | 2 +- .../biomegrid/UserDefinedGridBuilder.java | 2 +- .../terra/config/factories/BiomeFactory.java | 2 +- .../config/factories/BiomeGridFactory.java | 4 +- .../terra/config/factories/CarverFactory.java | 2 +- .../terra/config/factories/FloraFactory.java | 8 ++-- .../terra/config/factories/OreFactory.java | 4 +- .../config/factories/PaletteFactory.java | 10 ++--- .../config/factories/StructureFactory.java | 2 +- .../terra/config/factories/TerraFactory.java | 2 +- .../terra/config/factories/TreeFactory.java | 4 +- .../com/dfsek/terra/config/lang/LangUtil.java | 4 +- .../terra/config/loaders/LootTableLoader.java | 2 +- .../config/loaders/MaterialSetLoader.java | 2 +- .../com/dfsek/terra/config/loaders/Types.java | 8 ++-- .../loaders/config/TreeLayerLoader.java | 4 +- .../loaders/palette/CarverPaletteLoader.java | 2 +- .../loaders/palette/PaletteHolderLoader.java | 4 +- .../loaders/palette/PaletteLayerLoader.java | 2 +- .../config/templates/BiomeGridTemplate.java | 2 +- .../terra/config/templates/BiomeTemplate.java | 10 ++--- .../config/templates/CarverTemplate.java | 2 +- .../terra/config/templates/OreTemplate.java | 2 +- .../com/dfsek/terra/debug/gui/DebugFrame.java | 2 +- .../com/dfsek/terra/debug/gui/DebugGUI.java | 2 +- .../generation/ElevationInterpolator.java | 2 +- ...nerator.java => MasterChunkGenerator.java} | 38 +++++++++---------- .../generation/UserDefinedDecorator.java | 4 +- .../generation/config/WorldGenerator.java | 8 ++-- .../generation/items/PlaceableLayer.java | 4 +- .../generation/items/flora/BlockFlora.java | 10 ++--- .../generation/items/flora/ConstantFlora.java | 10 ++--- .../generation/items/flora/FloraLayer.java | 4 +- .../generation/items/flora/TerraFlora.java | 22 +++++------ .../items/ores/DeformedSphereOre.java | 12 +++--- .../terra/generation/items/ores/Ore.java | 8 ++-- .../generation/items/ores/VanillaOre.java | 12 +++--- .../generation/items/tree/TerraTree.java | 6 +-- .../generation/items/tree/TreeLayer.java | 10 ++--- .../com/dfsek/terra/image/ImageLoader.java | 6 +-- .../terra/image/WorldImageGenerator.java | 6 +-- .../dfsek/terra/population/CavePopulator.java | 18 ++++----- .../terra/population/FloraPopulator.java | 14 +++---- .../dfsek/terra/population/OrePopulator.java | 14 +++---- .../terra/population/StructurePopulator.java | 8 ++-- .../dfsek/terra/population/TreePopulator.java | 12 +++--- .../com/dfsek/terra/procgen/GridSpawn.java | 2 +- .../dfsek/terra/procgen/pixel/Polygon.java | 2 +- .../dfsek/terra/procgen/pixel/Rectangle.java | 2 +- .../dfsek/terra/procgen/voxel/Cylinder.java | 2 +- .../terra/procgen/voxel/DeformedSphere.java | 2 +- .../com/dfsek/terra/procgen/voxel/Sphere.java | 2 +- .../com/dfsek/terra/procgen/voxel/Tube.java | 2 +- .../terra/procgen/voxel/VoxelGeometry.java | 2 +- .../dfsek/terra/registry/ConfigRegistry.java | 2 +- .../dfsek/terra/registry/FloraRegistry.java | 6 +-- .../dfsek/terra/registry/PaletteRegistry.java | 6 +-- .../dfsek/terra/registry/TreeRegistry.java | 28 +++++++------- .../com/dfsek/terra/util/MaterialSet.java | 4 +- .../com/dfsek/terra/util/PaletteUtil.java | 4 +- .../com/dfsek/terra/util/PopulationUtil.java | 2 +- .../java/com/dfsek/terra/util/TagUtil.java | 2 +- .../dfsek/terra/bukkit/BukkitBiomeGrid.java | 4 +- .../com/dfsek/terra/bukkit/BukkitChunk.java | 6 +-- .../terra/bukkit/BukkitCommandSender.java | 2 +- .../com/dfsek/terra/bukkit/BukkitEntity.java | 2 +- .../dfsek/terra/bukkit/BukkitItemHandle.java | 6 +-- .../dfsek/terra/bukkit/BukkitItemMeta.java | 2 +- .../dfsek/terra/bukkit/BukkitItemStack.java | 6 +-- .../com/dfsek/terra/bukkit/BukkitPlayer.java | 2 +- .../com/dfsek/terra/bukkit/BukkitTree.java | 10 ++--- .../com/dfsek/terra/bukkit/BukkitWorld.java | 14 +++---- .../dfsek/terra/bukkit/BukkitWorldHandle.java | 12 +++--- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 24 ++++++------ .../dfsek/terra/bukkit/command/Command.java | 2 +- .../bukkit/command/command/TerraCommand.java | 2 +- .../geometry/DeformedSphereCommand.java | 2 +- .../command/geometry/SphereCommand.java | 2 +- .../command/command/geometry/TubeCommand.java | 2 +- .../generator/BukkitChunkGenerator.java | 12 +++--- .../BukkitChunkGeneratorWrapper.java | 17 +++++---- .../bukkit/generator/BukkitPopulator.java | 6 +-- .../generator/BukkitPopulatorWrapper.java | 2 +- .../terra/bukkit/listeners/EventListener.java | 2 +- .../bukkit/listeners/SpigotListener.java | 2 +- .../terra/bukkit/structure/RotationUtil.java | 22 +++++------ .../terra/bukkit/util/BukkitConversions.java | 4 +- .../dfsek/terra/bukkit/world/BukkitBiome.java | 2 +- .../terra/bukkit/world/block/BukkitBlock.java | 10 ++--- .../bukkit/world/block/BukkitBlockData.java | 4 +- .../world/block/BukkitMaterialData.java | 4 +- .../world/block/data/BukkitEnumAdapter.java | 8 ++-- .../block/data/BukkitMultipleFacing.java | 4 +- .../bukkit/world/block/data/BukkitSlab.java | 2 +- .../bukkit/world/block/data/BukkitStairs.java | 4 +- .../world/block/data/BukkitWaterlogged.java | 2 +- .../world/block/data/TerraEnumAdapter.java | 8 ++-- .../dfsek/terra/fabric/TerraFabricPlugin.java | 14 +++---- .../fabric/inventory/FabricItemHandle.java | 6 +-- .../fabric/inventory/FabricItemStack.java | 6 +-- .../terra/fabric/world/FabricAdapters.java | 2 +- .../dfsek/terra/fabric/world/FabricBiome.java | 2 +- .../dfsek/terra/fabric/world/FabricTree.java | 6 +-- .../terra/fabric/world/FabricWorldHandle.java | 10 ++--- .../terra/fabric/world/TerraBiomeSource.java | 2 +- .../terra/fabric/world/block/FabricBlock.java | 10 ++--- .../fabric/world/block/FabricBlockData.java | 4 +- .../world/block/FabricMaterialData.java | 4 +- .../world/block/data/FabricEnumAdapter.java | 8 ++-- .../block/data/FabricMultipleFacing.java | 4 +- .../fabric/world/block/data/FabricSlab.java | 2 +- .../fabric/world/block/data/FabricStairs.java | 4 +- .../world/block/data/FabricWaterlogged.java | 2 +- .../world/block/data/TerraEnumAdapter.java | 8 ++-- .../world/generator/FabricChunkData.java | 4 +- .../world/generator/FabricChunkGenerator.java | 10 ++--- .../FabricChunkGeneratorWrapper.java | 10 ++--- .../fabric/world/handles/FabricWorld.java | 14 +++---- .../world/handles/chunk/FabricChunk.java | 6 +-- .../handles/chunk/FabricChunkWorldAccess.java | 6 +-- .../world/FabricSeededWorldAccess.java | 14 +++---- .../handles/world/FabricWorldAccess.java | 14 +++---- .../handles/world/FabricWorldChunkRegion.java | 14 +++---- 241 files changed, 779 insertions(+), 774 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/generic/Tree.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/generic/generator/TerraBlockPopulator.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemHandle.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/generic/inventory/item/ItemMeta.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/generic/world/Biome.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/generic/world/block/Axis.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Directional.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Orientable.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rotatable.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/generic/world/block/state/BlockState.java rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/CommandSender.java (70%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/Entity.java (53%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/Handle.java (74%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/TerraPlugin.java (77%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/Tree.java create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/generator/BlockPopulator.java rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/generator/ChunkGenerator.java (86%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/inventory/Inventory.java (61%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemHandle.java rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/inventory/ItemStack.java (51%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/inventory/item/Damageable.java (62%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/inventory/item/ItemMeta.java create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/Biome.java rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/BiomeGrid.java (91%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/Chunk.java rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/World.java (64%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/WorldHandle.java (58%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/block/Axis.java rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/block/Block.java (71%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/block/BlockData.java (63%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/block/BlockFace.java (97%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/block/MaterialData.java (72%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/block/data/AnaloguePowerable.java (54%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/block/data/Bisected.java (75%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Directional.java rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/block/data/MultipleFacing.java (57%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Orientable.java rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/block/data/Rail.java (75%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/block/data/RedstoneWire.java (61%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Rotatable.java rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/block/data/Slab.java (72%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/block/data/Stairs.java (92%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/block/data/Wall.java (58%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/block/data/Waterlogged.java (53%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/block/state/BlockState.java rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/vector/Location.java (92%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/vector/Vector2.java (98%) rename common/src/main/java/com/dfsek/terra/api/{generic => platform}/world/vector/Vector3.java (98%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/biome/Biome.java (86%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/biome/BiomeGrid.java (95%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/biome/Decorator.java (82%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/biome/Generator.java (84%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/biome/NormalizationUtil.java (99%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/world/carving/Carver.java (93%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/world/carving/Worm.java (97%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/generation/GenerationPhase.java (81%) create mode 100644 common/src/main/java/com/dfsek/terra/api/world/generation/TerraBlockPopulator.java rename common/src/main/java/com/dfsek/terra/api/{generic/generator => world/generation}/TerraChunkGenerator.java (71%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/world/palette/Palette.java (92%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/world/palette/RandomPalette.java (91%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/world/palette/SimplexPalette.java (92%) create mode 100644 common/src/main/java/com/dfsek/terra/api/world/tree/Tree.java rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/tree/fractal/EntitySpawnHolder.java (78%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/tree/fractal/FractalTree.java (80%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/tree/fractal/TreeGeometry.java (92%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/tree/fractal/trees/Cactus.java (75%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/tree/fractal/trees/IceSpike.java (80%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/tree/fractal/trees/OakTree.java (87%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/tree/fractal/trees/ShatteredPillar.java (86%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/tree/fractal/trees/ShatteredTree.java (87%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/tree/fractal/trees/SmallShatteredPillar.java (75%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/tree/fractal/trees/SmallShatteredTree.java (87%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world}/tree/fractal/trees/SpruceTree.java (81%) rename common/src/main/java/com/dfsek/terra/generation/{TerraChunkGenerator.java => MasterChunkGenerator.java} (89%) diff --git a/common/src/main/java/com/dfsek/terra/TerraProfiler.java b/common/src/main/java/com/dfsek/terra/TerraProfiler.java index 127968132..1d1885197 100644 --- a/common/src/main/java/com/dfsek/terra/TerraProfiler.java +++ b/common/src/main/java/com/dfsek/terra/TerraProfiler.java @@ -3,7 +3,7 @@ package com.dfsek.terra; import com.dfsek.terra.api.gaea.profiler.DataType; import com.dfsek.terra.api.gaea.profiler.Measurement; import com.dfsek.terra.api.gaea.profiler.WorldProfiler; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.world.World; public class TerraProfiler extends WorldProfiler { public TerraProfiler(World w) { diff --git a/common/src/main/java/com/dfsek/terra/TerraWorld.java b/common/src/main/java/com/dfsek/terra/TerraWorld.java index 8cb4c4392..62efb8e94 100644 --- a/common/src/main/java/com/dfsek/terra/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/TerraWorld.java @@ -1,11 +1,11 @@ package com.dfsek.terra; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.generation.TerraChunkGenerator; +import com.dfsek.terra.generation.MasterChunkGenerator; public class TerraWorld { private final TerraBiomeGrid grid; @@ -24,7 +24,7 @@ public class TerraWorld { } public static boolean isTerraWorld(World w) { - return w.getGenerator() instanceof TerraChunkGenerator; + return w.getGenerator() instanceof MasterChunkGenerator; } public TerraBiomeGrid getGrid() { diff --git a/common/src/main/java/com/dfsek/terra/api/Entity.java b/common/src/main/java/com/dfsek/terra/api/Entity.java index ace1710e4..353aac09b 100644 --- a/common/src/main/java/com/dfsek/terra/api/Entity.java +++ b/common/src/main/java/com/dfsek/terra/api/Entity.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api; -import com.dfsek.terra.api.generic.Handle; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.world.vector.Location; public interface Entity extends Handle { Location getLocation(); diff --git a/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java b/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java index 454ecc50d..a51aa4143 100644 --- a/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java +++ b/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java @@ -3,7 +3,7 @@ package com.dfsek.terra.api; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.biome.palette.PaletteLayer; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/Debug.java b/common/src/main/java/com/dfsek/terra/api/gaea/Debug.java index d447e695f..c513cfba0 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/Debug.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/Debug.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.gaea; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; public class Debug { public static TerraPlugin main; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/Gaea.java b/common/src/main/java/com/dfsek/terra/api/gaea/Gaea.java index a8c38b374..5254fe730 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/Gaea.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/Gaea.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.gaea; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.world.World; import java.io.File; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java b/common/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java index a8c442668..d1703ee32 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java @@ -2,7 +2,7 @@ package com.dfsek.terra.api.gaea.lang; import com.dfsek.tectonic.config.Configuration; -import com.dfsek.terra.api.generic.CommandSender; +import com.dfsek.terra.api.platform.CommandSender; import java.io.File; import java.io.FileInputStream; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java b/common/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java index 1a3e00003..0451f56b4 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.gaea.lang; -import com.dfsek.terra.api.generic.CommandSender; +import com.dfsek.terra.api.platform.CommandSender; import java.util.logging.Level; import java.util.logging.Logger; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java b/common/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java index 2518f286d..37cf33072 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.gaea.lang; -import com.dfsek.terra.api.generic.CommandSender; +import com.dfsek.terra.api.platform.CommandSender; import java.util.Arrays; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java b/common/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java index 9254300fe..5d482ee16 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.gaea.lang; -import com.dfsek.terra.api.generic.CommandSender; +import com.dfsek.terra.api.platform.CommandSender; import java.util.Arrays; import java.util.logging.Level; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java b/common/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java index 95547e132..d7e9098f9 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.gaea.math; -import com.dfsek.terra.api.gaea.biome.BiomeGrid; -import com.dfsek.terra.api.gaea.biome.Generator; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.world.biome.BiomeGrid; +import com.dfsek.terra.api.world.biome.Generator; +import com.dfsek.terra.api.world.generation.GenerationPhase; import net.jafama.FastMath; /** diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java b/common/src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java index 2fd1db812..5cc12b5a2 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.gaea.math; -import com.dfsek.terra.api.gaea.biome.NormalizationUtil; +import com.dfsek.terra.api.world.biome.NormalizationUtil; import java.util.HashSet; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java b/common/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java index a5d2a34e7..ea39f6ccf 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.gaea.population; -import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.platform.world.Chunk; import java.io.Serializable; import java.util.UUID; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java b/common/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java index c790b63a7..4f2b0470b 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java @@ -6,10 +6,10 @@ import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.gaea.util.SerializationUtil; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import org.jetbrains.annotations.NotNull; import java.io.File; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java b/common/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java index 8f486d310..5c3bee6f8 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.gaea.profiler; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.world.World; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java index 5eb15b4aa..ff325a46a 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java @@ -4,9 +4,9 @@ import com.dfsek.terra.api.gaea.structures.loot.functions.AmountFunction; import com.dfsek.terra.api.gaea.structures.loot.functions.DamageFunction; import com.dfsek.terra.api.gaea.structures.loot.functions.Function; import com.dfsek.terra.api.gaea.util.GlueList; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.inventory.ItemStack; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.platform.world.block.MaterialData; import net.jafama.FastMath; import org.json.simple.JSONArray; import org.json.simple.JSONObject; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java index 08c571915..8c3997502 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.gaea.structures.loot; import com.dfsek.terra.api.gaea.util.GlueList; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.inventory.Inventory; -import com.dfsek.terra.api.generic.inventory.ItemStack; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.inventory.Inventory; +import com.dfsek.terra.api.platform.inventory.ItemStack; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java index 1e8a2117e..926dfd8c9 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java @@ -2,8 +2,8 @@ package com.dfsek.terra.api.gaea.structures.loot; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.util.GlueList; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.inventory.ItemStack; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.inventory.ItemStack; import net.jafama.FastMath; import org.json.simple.JSONArray; import org.json.simple.JSONObject; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java index e93400a7d..a93f1b2fb 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.gaea.structures.loot.functions; -import com.dfsek.terra.api.generic.inventory.ItemStack; +import com.dfsek.terra.api.platform.inventory.ItemStack; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java index ee9d3932b..04d57e22a 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.gaea.structures.loot.functions; -import com.dfsek.terra.api.generic.inventory.ItemStack; -import com.dfsek.terra.api.generic.inventory.item.Damageable; -import com.dfsek.terra.api.generic.inventory.item.ItemMeta; +import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.platform.inventory.item.Damageable; +import com.dfsek.terra.api.platform.inventory.item.ItemMeta; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java index ed1961390..a1aae5f75 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.gaea.structures.loot.functions; -import com.dfsek.terra.api.generic.inventory.ItemStack; +import com.dfsek.terra.api.platform.inventory.ItemStack; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java b/common/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java deleted file mode 100644 index 5b78a34d4..000000000 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/Tree.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dfsek.terra.api.gaea.tree; - - -import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.generic.world.vector.Location; - -import java.util.Random; -import java.util.Set; - -public interface Tree { - boolean plant(Location l, Random r); - - Set getSpawnable(); -} diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java b/common/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java index bd1aa95ea..051302a47 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java +++ b/common/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.gaea.world; import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.vector.Location; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/api/generic/Tree.java b/common/src/main/java/com/dfsek/terra/api/generic/Tree.java deleted file mode 100644 index 5dadfb11d..000000000 --- a/common/src/main/java/com/dfsek/terra/api/generic/Tree.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra.api.generic; - -public interface Tree extends Handle, com.dfsek.terra.api.gaea.tree.Tree { -} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java b/common/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java deleted file mode 100644 index 15591155f..000000000 --- a/common/src/main/java/com/dfsek/terra/api/generic/generator/BlockPopulator.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dfsek.terra.api.generic.generator; - -import com.dfsek.terra.api.generic.Handle; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; - -import java.util.Random; - -public interface BlockPopulator extends Handle { - void populate(World world, Random random, Chunk chunk); -} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraBlockPopulator.java b/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraBlockPopulator.java deleted file mode 100644 index bc6b6dfb8..000000000 --- a/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraBlockPopulator.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dfsek.terra.api.generic.generator; - -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; - -import java.util.Random; - -public interface TerraBlockPopulator { - void populate(World world, Random random, Chunk chunk); -} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemHandle.java b/common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemHandle.java deleted file mode 100644 index d554cb169..000000000 --- a/common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemHandle.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.dfsek.terra.api.generic.inventory; - -import com.dfsek.terra.api.generic.world.block.MaterialData; - -public interface ItemHandle { - ItemStack newItemStack(MaterialData material, int amount); -} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/inventory/item/ItemMeta.java b/common/src/main/java/com/dfsek/terra/api/generic/inventory/item/ItemMeta.java deleted file mode 100644 index 3a6a89d9d..000000000 --- a/common/src/main/java/com/dfsek/terra/api/generic/inventory/item/ItemMeta.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.dfsek.terra.api.generic.inventory.item; - -import com.dfsek.terra.api.generic.Handle; - -public interface ItemMeta extends Handle { -} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/Biome.java b/common/src/main/java/com/dfsek/terra/api/generic/world/Biome.java deleted file mode 100644 index 693972fed..000000000 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/Biome.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.dfsek.terra.api.generic.world; - -import com.dfsek.terra.api.generic.Handle; - -public interface Biome extends Handle { -} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java b/common/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java deleted file mode 100644 index e83ef4ab5..000000000 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/Chunk.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dfsek.terra.api.generic.world; - -import com.dfsek.terra.api.generic.Handle; -import com.dfsek.terra.api.generic.world.block.Block; - -public interface Chunk extends Handle { - int getX(); - - int getZ(); - - World getWorld(); - - Block getBlock(int x, int y, int z); -} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/Axis.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/Axis.java deleted file mode 100644 index e6de705b5..000000000 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/Axis.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.dfsek.terra.api.generic.world.block; - -public enum Axis { - X, Y, Z -} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Directional.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Directional.java deleted file mode 100644 index d7f5979a1..000000000 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Directional.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dfsek.terra.api.generic.world.block.data; - -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; - -public interface Directional extends BlockData { - BlockFace getFacing(); - - void setFacing(BlockFace facing); -} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Orientable.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Orientable.java deleted file mode 100644 index 4daf84992..000000000 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Orientable.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dfsek.terra.api.generic.world.block.data; - -import com.dfsek.terra.api.generic.world.block.Axis; -import com.dfsek.terra.api.generic.world.block.BlockData; - -import java.util.Set; - -public interface Orientable extends BlockData { - Set getAxes(); - void setAxis(Axis axis); - Axis getAxis(); -} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rotatable.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rotatable.java deleted file mode 100644 index 25842bec7..000000000 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rotatable.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dfsek.terra.api.generic.world.block.data; - -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; - -public interface Rotatable extends BlockData { - BlockFace getRotation(); - - void setRotation(BlockFace face); -} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/state/BlockState.java b/common/src/main/java/com/dfsek/terra/api/generic/world/block/state/BlockState.java deleted file mode 100644 index d09ebc1e0..000000000 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/state/BlockState.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra.api.generic.world.block.state; - -public interface BlockState { -} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/CommandSender.java b/common/src/main/java/com/dfsek/terra/api/platform/CommandSender.java similarity index 70% rename from common/src/main/java/com/dfsek/terra/api/generic/CommandSender.java rename to common/src/main/java/com/dfsek/terra/api/platform/CommandSender.java index 82a819579..5fd7d60a7 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/CommandSender.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/CommandSender.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.generic; +package com.dfsek.terra.api.platform; public interface CommandSender extends Handle { void sendMessage(String message); diff --git a/common/src/main/java/com/dfsek/terra/api/generic/Entity.java b/common/src/main/java/com/dfsek/terra/api/platform/Entity.java similarity index 53% rename from common/src/main/java/com/dfsek/terra/api/generic/Entity.java rename to common/src/main/java/com/dfsek/terra/api/platform/Entity.java index 0ba6db725..b29d81bc6 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/Entity.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/Entity.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.generic; +package com.dfsek.terra.api.platform; public interface Entity extends Handle { } diff --git a/common/src/main/java/com/dfsek/terra/api/generic/Handle.java b/common/src/main/java/com/dfsek/terra/api/platform/Handle.java similarity index 74% rename from common/src/main/java/com/dfsek/terra/api/generic/Handle.java rename to common/src/main/java/com/dfsek/terra/api/platform/Handle.java index 1df2e8946..e0419aca3 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/Handle.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/Handle.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.generic; +package com.dfsek.terra.api.platform; /** * An interface that contains a platform delegate. diff --git a/common/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java b/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java similarity index 77% rename from common/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java rename to common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java index 47c845f92..fcf5acf55 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/TerraPlugin.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java @@ -1,11 +1,11 @@ -package com.dfsek.terra.api.generic; +package com.dfsek.terra.api.platform; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.gaea.lang.Language; -import com.dfsek.terra.api.generic.inventory.ItemHandle; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.WorldHandle; +import com.dfsek.terra.api.platform.inventory.ItemHandle; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.WorldHandle; import com.dfsek.terra.config.base.PluginConfig; import com.dfsek.terra.registry.ConfigRegistry; diff --git a/common/src/main/java/com/dfsek/terra/api/platform/Tree.java b/common/src/main/java/com/dfsek/terra/api/platform/Tree.java new file mode 100644 index 000000000..a4f4a3d9e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/Tree.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.platform; + +public interface Tree extends Handle, com.dfsek.terra.api.world.tree.Tree { +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/generator/BlockPopulator.java b/common/src/main/java/com/dfsek/terra/api/platform/generator/BlockPopulator.java new file mode 100644 index 000000000..cebe7f3da --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/generator/BlockPopulator.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.platform.generator; + +import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; + +import java.util.Random; + +public interface BlockPopulator extends Handle { + void populate(World world, Random random, Chunk chunk); +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java b/common/src/main/java/com/dfsek/terra/api/platform/generator/ChunkGenerator.java similarity index 86% rename from common/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java rename to common/src/main/java/com/dfsek/terra/api/platform/generator/ChunkGenerator.java index 4b939c4ce..15a770772 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/generator/ChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/generator/ChunkGenerator.java @@ -1,9 +1,10 @@ -package com.dfsek.terra.api.generic.generator; +package com.dfsek.terra.api.platform.generator; -import com.dfsek.terra.api.generic.Handle; -import com.dfsek.terra.api.generic.world.BiomeGrid; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.world.BiomeGrid; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/common/src/main/java/com/dfsek/terra/api/generic/inventory/Inventory.java b/common/src/main/java/com/dfsek/terra/api/platform/inventory/Inventory.java similarity index 61% rename from common/src/main/java/com/dfsek/terra/api/generic/inventory/Inventory.java rename to common/src/main/java/com/dfsek/terra/api/platform/inventory/Inventory.java index ab6148c75..776a23614 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/inventory/Inventory.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/inventory/Inventory.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.generic.inventory; +package com.dfsek.terra.api.platform.inventory; -import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.platform.Handle; public interface Inventory extends Handle { int getSize(); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemHandle.java b/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemHandle.java new file mode 100644 index 000000000..b77f8f707 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemHandle.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.api.platform.inventory; + +import com.dfsek.terra.api.platform.world.block.MaterialData; + +public interface ItemHandle { + ItemStack newItemStack(MaterialData material, int amount); +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemStack.java b/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemStack.java similarity index 51% rename from common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemStack.java rename to common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemStack.java index f6040bea1..9350ea6a6 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/inventory/ItemStack.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemStack.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.api.generic.inventory; +package com.dfsek.terra.api.platform.inventory; -import com.dfsek.terra.api.generic.Handle; -import com.dfsek.terra.api.generic.inventory.item.ItemMeta; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.inventory.item.ItemMeta; +import com.dfsek.terra.api.platform.world.block.MaterialData; public interface ItemStack extends Handle, Cloneable { int getAmount(); diff --git a/common/src/main/java/com/dfsek/terra/api/generic/inventory/item/Damageable.java b/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/Damageable.java similarity index 62% rename from common/src/main/java/com/dfsek/terra/api/generic/inventory/item/Damageable.java rename to common/src/main/java/com/dfsek/terra/api/platform/inventory/item/Damageable.java index 35e97ac22..b4c6a5596 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/inventory/item/Damageable.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/Damageable.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.generic.inventory.item; +package com.dfsek.terra.api.platform.inventory.item; -import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.platform.Handle; public interface Damageable extends Handle, Cloneable { Damageable clone(); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/ItemMeta.java b/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/ItemMeta.java new file mode 100644 index 000000000..6c20f2a4b --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/ItemMeta.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.api.platform.inventory.item; + +import com.dfsek.terra.api.platform.Handle; + +public interface ItemMeta extends Handle { +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/Biome.java b/common/src/main/java/com/dfsek/terra/api/platform/world/Biome.java new file mode 100644 index 000000000..ec1b2060d --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/Biome.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.api.platform.world; + +import com.dfsek.terra.api.platform.Handle; + +public interface Biome extends Handle { +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java b/common/src/main/java/com/dfsek/terra/api/platform/world/BiomeGrid.java similarity index 91% rename from common/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/BiomeGrid.java index 5f6905441..0fe72dd42 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/BiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/BiomeGrid.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.generic.world; +package com.dfsek.terra.api.platform.world; -import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.platform.Handle; import org.jetbrains.annotations.NotNull; public interface BiomeGrid extends Handle { diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/Chunk.java b/common/src/main/java/com/dfsek/terra/api/platform/world/Chunk.java new file mode 100644 index 000000000..81f5cf972 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/Chunk.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.api.platform.world; + +import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.world.block.Block; + +public interface Chunk extends Handle { + int getX(); + + int getZ(); + + World getWorld(); + + Block getBlock(int x, int y, int z); +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/World.java b/common/src/main/java/com/dfsek/terra/api/platform/world/World.java similarity index 64% rename from common/src/main/java/com/dfsek/terra/api/generic/world/World.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/World.java index 402ac478e..d7833fa59 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/World.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/World.java @@ -1,11 +1,11 @@ -package com.dfsek.terra.api.generic.world; +package com.dfsek.terra.api.platform.world; -import com.dfsek.terra.api.generic.Entity; -import com.dfsek.terra.api.generic.Handle; -import com.dfsek.terra.api.generic.Tree; -import com.dfsek.terra.api.generic.generator.ChunkGenerator; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.Entity; +import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.vector.Location; import java.io.File; import java.util.UUID; diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java b/common/src/main/java/com/dfsek/terra/api/platform/world/WorldHandle.java similarity index 58% rename from common/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/WorldHandle.java index d438c5df3..397fc61f9 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/WorldHandle.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/WorldHandle.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.api.generic.world; +package com.dfsek.terra.api.platform.world; -import com.dfsek.terra.api.generic.Tree; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; /** * Interface to be implemented for world manipulation. diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/Axis.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/Axis.java new file mode 100644 index 000000000..8a5b2d61d --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/Axis.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.api.platform.world.block; + +public enum Axis { + X, Y, Z +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/Block.java similarity index 71% rename from common/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/block/Block.java index d72371bab..8eedc7495 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/Block.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.generic.world.block; +package com.dfsek.terra.api.platform.world.block; -import com.dfsek.terra.api.generic.Handle; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.world.vector.Location; public interface Block extends Handle { void setBlockData(BlockData data, boolean physics); diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/BlockData.java similarity index 63% rename from common/src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/block/BlockData.java index 2a9d02fb1..fc73956ad 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/BlockData.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/BlockData.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.generic.world.block; +package com.dfsek.terra.api.platform.world.block; -import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.platform.Handle; public interface BlockData extends Cloneable, Handle { MaterialData getMaterial(); diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/BlockFace.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/BlockFace.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/api/generic/world/block/BlockFace.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/block/BlockFace.java index d1f48544d..ad6032345 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/BlockFace.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/BlockFace.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.generic.world.block; +package com.dfsek.terra.api.platform.world.block; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.vector.Vector3; import org.jetbrains.annotations.NotNull; public enum BlockFace { diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/MaterialData.java similarity index 72% rename from common/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/block/MaterialData.java index 0180a65f0..db99a0e29 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/MaterialData.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/MaterialData.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.generic.world.block; +package com.dfsek.terra.api.platform.world.block; -import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.platform.Handle; public interface MaterialData extends Handle { boolean matches(MaterialData other); diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/AnaloguePowerable.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/AnaloguePowerable.java similarity index 54% rename from common/src/main/java/com/dfsek/terra/api/generic/world/block/data/AnaloguePowerable.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/block/data/AnaloguePowerable.java index d3b702234..af14b8f24 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/AnaloguePowerable.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/AnaloguePowerable.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.generic.world.block.data; +package com.dfsek.terra.api.platform.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockData; public interface AnaloguePowerable extends BlockData { int getMaximumPower(); diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Bisected.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Bisected.java similarity index 75% rename from common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Bisected.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Bisected.java index 3c897f048..02eb2d86b 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Bisected.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Bisected.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.generic.world.block.data; +package com.dfsek.terra.api.platform.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockData; public interface Bisected extends BlockData { Half getHalf(); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Directional.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Directional.java new file mode 100644 index 000000000..0ca549f47 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Directional.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.platform.world.block.data; + +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockFace; + +public interface Directional extends BlockData { + BlockFace getFacing(); + + void setFacing(BlockFace facing); +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/MultipleFacing.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/MultipleFacing.java similarity index 57% rename from common/src/main/java/com/dfsek/terra/api/generic/world/block/data/MultipleFacing.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/block/data/MultipleFacing.java index 9caeea20b..c9982384c 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/MultipleFacing.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/MultipleFacing.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.generic.world.block.data; +package com.dfsek.terra.api.platform.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockFace; import java.util.Set; diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Orientable.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Orientable.java new file mode 100644 index 000000000..91861f611 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Orientable.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.api.platform.world.block.data; + +import com.dfsek.terra.api.platform.world.block.Axis; +import com.dfsek.terra.api.platform.world.block.BlockData; + +import java.util.Set; + +public interface Orientable extends BlockData { + Set getAxes(); + + Axis getAxis(); + + void setAxis(Axis axis); +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rail.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Rail.java similarity index 75% rename from common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rail.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Rail.java index d0f9dc14c..b3e7d1275 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Rail.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Rail.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.generic.world.block.data; +package com.dfsek.terra.api.platform.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockData; public interface Rail extends BlockData { Shape getShape(); diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/RedstoneWire.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/RedstoneWire.java similarity index 61% rename from common/src/main/java/com/dfsek/terra/api/generic/world/block/data/RedstoneWire.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/block/data/RedstoneWire.java index 8a680ecbc..fe11ac2b5 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/RedstoneWire.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/RedstoneWire.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.generic.world.block.data; +package com.dfsek.terra.api.platform.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockFace; import java.util.Set; diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Rotatable.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Rotatable.java new file mode 100644 index 000000000..c2111889e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Rotatable.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.platform.world.block.data; + +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockFace; + +public interface Rotatable extends BlockData { + BlockFace getRotation(); + + void setRotation(BlockFace face); +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Slab.java similarity index 72% rename from common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Slab.java index 6b5f241bf..f9e12cf94 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Slab.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Slab.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.generic.world.block.data; +package com.dfsek.terra.api.platform.world.block.data; public interface Slab extends Waterlogged { Type getType(); diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Stairs.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Stairs.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Stairs.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Stairs.java index 5ac6bfcfd..c79b79a9c 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Stairs.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Stairs.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.generic.world.block.data; +package com.dfsek.terra.api.platform.world.block.data; public interface Stairs extends Waterlogged, Directional, Bisected { Shape getShape(); diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Wall.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Wall.java similarity index 58% rename from common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Wall.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Wall.java index f52aa8fdc..bf9279fbd 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Wall.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Wall.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.generic.world.block.data; +package com.dfsek.terra.api.platform.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockFace; public interface Wall extends BlockData, Waterlogged { boolean isUp(); diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Waterlogged.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Waterlogged.java similarity index 53% rename from common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Waterlogged.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Waterlogged.java index da3caacf7..06e5c126c 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/block/data/Waterlogged.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Waterlogged.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.generic.world.block.data; +package com.dfsek.terra.api.platform.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockData; public interface Waterlogged extends BlockData { boolean isWaterlogged(); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/state/BlockState.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/state/BlockState.java new file mode 100644 index 000000000..6ef98f014 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/block/state/BlockState.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.platform.world.block.state; + +public interface BlockState { +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java b/common/src/main/java/com/dfsek/terra/api/platform/world/vector/Location.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/vector/Location.java index 4cd2f2265..fa46861ed 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/vector/Location.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/vector/Location.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.generic.world.vector; +package com.dfsek.terra.api.platform.world.vector; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.block.Block; public class Location implements Cloneable { private World world; diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector2.java b/common/src/main/java/com/dfsek/terra/api/platform/world/vector/Vector2.java similarity index 98% rename from common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector2.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/vector/Vector2.java index f98c2fb7a..52e8753fc 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector2.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/vector/Vector2.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.generic.world.vector; +package com.dfsek.terra.api.platform.world.vector; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java b/common/src/main/java/com/dfsek/terra/api/platform/world/vector/Vector3.java similarity index 98% rename from common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java rename to common/src/main/java/com/dfsek/terra/api/platform/world/vector/Vector3.java index d58ba3240..0363e95d5 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/world/vector/Vector3.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/vector/Vector3.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.generic.world.vector; +package com.dfsek.terra.api.platform.world.vector; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.world.World; import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Biome.java similarity index 86% rename from common/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java rename to common/src/main/java/com/dfsek/terra/api/world/biome/Biome.java index d36a22e56..0bdfba763 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/biome/Biome.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/Biome.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.gaea.biome; +package com.dfsek.terra.api.world.biome; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.world.World; /** * Interface to be implemented by a custom generator's Biome enum.
@@ -14,7 +14,7 @@ public interface Biome { * * @return Biome - The Vanilla biome. */ - com.dfsek.terra.api.generic.world.Biome getVanillaBiome(); + com.dfsek.terra.api.platform.world.Biome getVanillaBiome(); /** * Gets the BiomeTerrain instance used to generate the biome. diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java b/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java rename to common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java index 9c2bfc51d..4b5029872 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/biome/BiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.api.gaea.biome; +package com.dfsek.terra.api.world.biome; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.world.generation.GenerationPhase; public abstract class BiomeGrid { private final FastNoiseLite noiseX; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/biome/Decorator.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Decorator.java similarity index 82% rename from common/src/main/java/com/dfsek/terra/api/gaea/biome/Decorator.java rename to common/src/main/java/com/dfsek/terra/api/world/biome/Decorator.java index 480dc96cb..c301a30ef 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/biome/Decorator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/Decorator.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.api.gaea.biome; +package com.dfsek.terra.api.world.biome; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.world.tree.Tree; public abstract class Decorator { diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java similarity index 84% rename from common/src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java rename to common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java index d11d26623..18b09aec2 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/biome/Generator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.api.gaea.biome; +package com.dfsek.terra.api.world.biome; import com.dfsek.terra.api.gaea.math.Interpolator; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.world.palette.Palette; public abstract class Generator { /** diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/biome/NormalizationUtil.java b/common/src/main/java/com/dfsek/terra/api/world/biome/NormalizationUtil.java similarity index 99% rename from common/src/main/java/com/dfsek/terra/api/gaea/biome/NormalizationUtil.java rename to common/src/main/java/com/dfsek/terra/api/world/biome/NormalizationUtil.java index 0943a70a9..8d277a275 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/biome/NormalizationUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/NormalizationUtil.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.biome; +package com.dfsek.terra.api.world.biome; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java b/common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java similarity index 93% rename from common/src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java rename to common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java index d85feafcd..39717170c 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/world/carving/Carver.java +++ b/common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.api.gaea.world.carving; +package com.dfsek.terra.api.world.carving; import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.vector.Vector3; import net.jafama.FastMath; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java b/common/src/main/java/com/dfsek/terra/api/world/carving/Worm.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java rename to common/src/main/java/com/dfsek/terra/api/world/carving/Worm.java index 62072db04..7cc0748de 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/world/carving/Worm.java +++ b/common/src/main/java/com/dfsek/terra/api/world/carving/Worm.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.gaea.world.carving; +package com.dfsek.terra.api.world.carving; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.vector.Vector3; import net.jafama.FastMath; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPhase.java b/common/src/main/java/com/dfsek/terra/api/world/generation/GenerationPhase.java similarity index 81% rename from common/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPhase.java rename to common/src/main/java/com/dfsek/terra/api/world/generation/GenerationPhase.java index 9ccfe22c1..6dfee8985 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/generation/GenerationPhase.java +++ b/common/src/main/java/com/dfsek/terra/api/world/generation/GenerationPhase.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.generation; +package com.dfsek.terra.api.world.generation; /** * The phase of terrain generation. Used for modifying values based on the phase of generation. diff --git a/common/src/main/java/com/dfsek/terra/api/world/generation/TerraBlockPopulator.java b/common/src/main/java/com/dfsek/terra/api/world/generation/TerraBlockPopulator.java new file mode 100644 index 000000000..8797c924e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/world/generation/TerraBlockPopulator.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.world.generation; + +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; + +import java.util.Random; + +public interface TerraBlockPopulator { + void populate(World world, Random random, Chunk chunk); +} diff --git a/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java b/common/src/main/java/com/dfsek/terra/api/world/generation/TerraChunkGenerator.java similarity index 71% rename from common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java rename to common/src/main/java/com/dfsek/terra/api/world/generation/TerraChunkGenerator.java index 5f0b95e17..85d2cea78 100644 --- a/common/src/main/java/com/dfsek/terra/api/generic/generator/TerraChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/generation/TerraChunkGenerator.java @@ -1,8 +1,9 @@ -package com.dfsek.terra.api.generic.generator; +package com.dfsek.terra.api.world.generation; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.BiomeGrid; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.BiomeGrid; +import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.config.base.ConfigPack; import org.jetbrains.annotations.NotNull; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/world/palette/Palette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/api/gaea/world/palette/Palette.java rename to common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java index f708f028c..378213a60 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/world/palette/Palette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.world.palette; +package com.dfsek.terra.api.world.palette; import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; @@ -28,7 +28,7 @@ public abstract class Palette { * @param layers - The number of layers the material occupies. * @return - BlockPalette instance for chaining. */ - public com.dfsek.terra.api.gaea.world.palette.Palette add(E m, int layers) { + public com.dfsek.terra.api.world.palette.Palette add(E m, int layers) { for(int i = 0; i < layers; i++) { pallet.add(new PaletteLayer<>(m)); } @@ -42,7 +42,7 @@ public abstract class Palette { * @param layers - The number of layers the material occupies. * @return - BlockPalette instance for chaining. */ - public com.dfsek.terra.api.gaea.world.palette.Palette add(ProbabilityCollection m, int layers) { + public com.dfsek.terra.api.world.palette.Palette add(ProbabilityCollection m, int layers) { for(int i = 0; i < layers; i++) { pallet.add(new PaletteLayer<>(m)); } diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/world/palette/RandomPalette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/RandomPalette.java similarity index 91% rename from common/src/main/java/com/dfsek/terra/api/gaea/world/palette/RandomPalette.java rename to common/src/main/java/com/dfsek/terra/api/world/palette/RandomPalette.java index 65f1e0498..88452d953 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/world/palette/RandomPalette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/RandomPalette.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.world.palette; +package com.dfsek.terra.api.world.palette; import java.util.List; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/world/palette/SimplexPalette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/api/gaea/world/palette/SimplexPalette.java rename to common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java index 3071b4a69..16c9552be 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/world/palette/SimplexPalette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.world.palette; +package com.dfsek.terra.api.world.palette; import com.dfsek.terra.api.gaea.math.FastNoiseLite; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/Tree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/Tree.java new file mode 100644 index 000000000..98d23a7ff --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/Tree.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.api.world.tree; + + +import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.vector.Location; + +import java.util.Random; +import java.util.Set; + +public interface Tree { + boolean plant(Location l, Random r); + + Set getSpawnable(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/EntitySpawnHolder.java similarity index 78% rename from common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java rename to common/src/main/java/com/dfsek/terra/api/world/tree/fractal/EntitySpawnHolder.java index a2983e747..e32fda49c 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/EntitySpawnHolder.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/EntitySpawnHolder.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.gaea.tree.fractal; +package com.dfsek.terra.api.world.tree.fractal; -import com.dfsek.terra.api.generic.Entity; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.Entity; +import com.dfsek.terra.api.platform.world.vector.Location; import java.util.function.Consumer; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/FractalTree.java similarity index 80% rename from common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java rename to common/src/main/java/com/dfsek/terra/api/world/tree/fractal/FractalTree.java index 6fdf481ec..93398a6e2 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/FractalTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/FractalTree.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.api.gaea.tree.fractal; +package com.dfsek.terra.api.world.tree.fractal; -import com.dfsek.terra.api.generic.Entity; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.Entity; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.util.MaterialSet; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/TreeGeometry.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java rename to common/src/main/java/com/dfsek/terra/api/world/tree/fractal/TreeGeometry.java index 255e1d48a..50a75b583 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/TreeGeometry.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/TreeGeometry.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.api.gaea.tree.fractal; +package com.dfsek.terra.api.world.tree.fractal; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.world.vector.Vector3; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/Cactus.java similarity index 75% rename from common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java rename to common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/Cactus.java index a0776c6b8..1e8f37202 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/Cactus.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/Cactus.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.api.gaea.tree.fractal.trees; +package com.dfsek.terra.api.world.tree.fractal.trees; -import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.util.MaterialSet; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java similarity index 80% rename from common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java rename to common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java index be472aeeb..8e6a8c443 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/IceSpike.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java @@ -1,13 +1,13 @@ -package com.dfsek.terra.api.gaea.tree.fractal.trees; +package com.dfsek.terra.api.world.tree.fractal.trees; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.world.tree.fractal.FractalTree; +import com.dfsek.terra.api.world.tree.fractal.TreeGeometry; import com.dfsek.terra.util.MaterialSet; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/OakTree.java similarity index 87% rename from common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java rename to common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/OakTree.java index 2086215f0..6f04e9c71 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/OakTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/OakTree.java @@ -1,11 +1,11 @@ -package com.dfsek.terra.api.gaea.tree.fractal.trees; +package com.dfsek.terra.api.world.tree.fractal.trees; -import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.world.tree.fractal.FractalTree; +import com.dfsek.terra.api.world.tree.fractal.TreeGeometry; import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredPillar.java similarity index 86% rename from common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java rename to common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredPillar.java index a883beb4f..3d5281200 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredPillar.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredPillar.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.api.gaea.tree.fractal.trees; +package com.dfsek.terra.api.world.tree.fractal.trees; -import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.util.MaterialSet; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java similarity index 87% rename from common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java rename to common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java index b137dccb9..fffb78e1e 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/ShatteredTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java @@ -1,13 +1,13 @@ -package com.dfsek.terra.api.gaea.tree.fractal.trees; +package com.dfsek.terra.api.world.tree.fractal.trees; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.world.tree.fractal.FractalTree; +import com.dfsek.terra.api.world.tree.fractal.TreeGeometry; import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredPillar.java similarity index 75% rename from common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java rename to common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredPillar.java index 5104ae0e6..447547435 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredPillar.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredPillar.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.api.gaea.tree.fractal.trees; +package com.dfsek.terra.api.world.tree.fractal.trees; -import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.util.MaterialSet; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java similarity index 87% rename from common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java rename to common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java index 3ad22b777..e6fc319e3 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SmallShatteredTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java @@ -1,13 +1,13 @@ -package com.dfsek.terra.api.gaea.tree.fractal.trees; +package com.dfsek.terra.api.world.tree.fractal.trees; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.world.tree.fractal.FractalTree; +import com.dfsek.terra.api.world.tree.fractal.TreeGeometry; import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SpruceTree.java similarity index 81% rename from common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java rename to common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SpruceTree.java index 7bf002c06..bb38a51ca 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/tree/fractal/trees/SpruceTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SpruceTree.java @@ -1,11 +1,11 @@ -package com.dfsek.terra.api.gaea.tree.fractal.trees; +package com.dfsek.terra.api.world.tree.fractal.trees; -import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import com.dfsek.terra.api.gaea.tree.fractal.TreeGeometry; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.world.tree.fractal.FractalTree; +import com.dfsek.terra.api.world.tree.fractal.TreeGeometry; import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java b/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java index 22ddfd603..754898bf3 100644 --- a/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java +++ b/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java @@ -1,10 +1,10 @@ package com.dfsek.terra.async; -import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import org.jetbrains.annotations.NotNull; diff --git a/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java b/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java index 9b6383134..38adb5cb5 100644 --- a/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java +++ b/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java @@ -1,9 +1,9 @@ package com.dfsek.terra.async; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import org.jetbrains.annotations.NotNull; diff --git a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java index d9535363b..684ddb2c3 100644 --- a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java +++ b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java @@ -1,8 +1,8 @@ package com.dfsek.terra.biome; -import com.dfsek.terra.api.gaea.biome.BiomeGrid; -import com.dfsek.terra.api.gaea.biome.NormalizationUtil; import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.world.biome.BiomeGrid; +import com.dfsek.terra.api.world.biome.NormalizationUtil; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.image.ImageLoader; diff --git a/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java b/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java index cbc77e328..4b74662e5 100644 --- a/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java +++ b/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java @@ -1,9 +1,9 @@ package com.dfsek.terra.biome; -import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.gaea.biome.Decorator; -import com.dfsek.terra.api.gaea.biome.Generator; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.Decorator; +import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.builder.GeneratorBuilder; import com.dfsek.terra.config.templates.BiomeTemplate; @@ -15,14 +15,14 @@ import com.dfsek.terra.generation.UserDefinedDecorator; public class UserDefinedBiome implements Biome { private final GeneratorBuilder gen; private final UserDefinedDecorator decorator; - private final com.dfsek.terra.api.generic.world.Biome vanilla; + private final com.dfsek.terra.api.platform.world.Biome vanilla; private final String id; private final BiomeTemplate config; private final ConfigPack pack; private UserDefinedBiome erode; - public UserDefinedBiome(com.dfsek.terra.api.generic.world.Biome vanilla, UserDefinedDecorator dec, GeneratorBuilder gen, BiomeTemplate config, ConfigPack pack) { + public UserDefinedBiome(com.dfsek.terra.api.platform.world.Biome vanilla, UserDefinedDecorator dec, GeneratorBuilder gen, BiomeTemplate config, ConfigPack pack) { this.vanilla = vanilla; this.decorator = dec; this.gen = gen; @@ -37,7 +37,7 @@ public class UserDefinedBiome implements Biome { * @return Biome - The Vanilla biome. */ @Override - public com.dfsek.terra.api.generic.world.Biome getVanillaBiome() { + public com.dfsek.terra.api.platform.world.Biome getVanillaBiome() { return vanilla; } diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java index ef203f355..7b35af473 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java @@ -1,9 +1,9 @@ package com.dfsek.terra.biome.grid; -import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.gaea.biome.BiomeGrid; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.BiomeGrid; +import com.dfsek.terra.api.world.generation.GenerationPhase; /** * BiomeGrid implementation that holds a single biome. diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java index b86a55611..8794a4ded 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java @@ -1,10 +1,10 @@ package com.dfsek.terra.biome.grid; -import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.gaea.biome.BiomeGrid; -import com.dfsek.terra.api.gaea.biome.NormalizationUtil; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.BiomeGrid; +import com.dfsek.terra.api.world.biome.NormalizationUtil; +import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; import com.dfsek.terra.image.ImageLoader; diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java index 359118611..0a4713b2f 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java @@ -1,7 +1,7 @@ package com.dfsek.terra.biome.grid.master; -import com.dfsek.terra.api.gaea.biome.BiomeGrid; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.world.biome.BiomeGrid; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.UserDefinedGrid; import com.dfsek.terra.config.base.ConfigPack; diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java index 047d9c4ec..fc673cd11 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java @@ -1,10 +1,10 @@ package com.dfsek.terra.biome.grid.master; -import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.gaea.biome.BiomeGrid; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.world.vector.Vector2; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.biome.BiomeGrid; +import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.UserDefinedGrid; diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java index db5c730a9..b3250ef7c 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java @@ -1,9 +1,9 @@ package com.dfsek.terra.biome.grid.master; -import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; -import com.dfsek.terra.api.generic.world.vector.Location; -import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.world.vector.Vector2; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.UserDefinedGrid; diff --git a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java index 95230cce1..11c6142de 100644 --- a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java +++ b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java @@ -1,7 +1,7 @@ package com.dfsek.terra.biome.palette; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.world.palette.Palette; public class PaletteHolder { private final Palette[] palettes; diff --git a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java index db944f239..9d4068bab 100644 --- a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java +++ b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java @@ -1,7 +1,7 @@ package com.dfsek.terra.biome.palette; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.world.palette.Palette; import net.jafama.FastMath; import java.util.Map; diff --git a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java index 4b72a6226..ecd09c4cd 100644 --- a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java +++ b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java @@ -1,7 +1,7 @@ package com.dfsek.terra.biome.palette; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockData; import org.jetbrains.annotations.NotNull; public class PaletteLayer { diff --git a/common/src/main/java/com/dfsek/terra/biome/palette/SinglePalette.java b/common/src/main/java/com/dfsek/terra/biome/palette/SinglePalette.java index 254e43c26..76e01281e 100644 --- a/common/src/main/java/com/dfsek/terra/biome/palette/SinglePalette.java +++ b/common/src/main/java/com/dfsek/terra/biome/palette/SinglePalette.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.palette; -import com.dfsek.terra.api.gaea.world.palette.Palette; +import com.dfsek.terra.api.world.palette.Palette; public class SinglePalette extends Palette { private final E item; diff --git a/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java b/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java index 595cd31e8..f488b2df4 100644 --- a/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java +++ b/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java @@ -1,7 +1,7 @@ package com.dfsek.terra.biome.postprocessing; import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.platform.world.vector.Vector2; /** * Offset a coordinate pair by an amount. diff --git a/common/src/main/java/com/dfsek/terra/carving/CarverCache.java b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java index 02c5040ab..78f731a0b 100644 --- a/common/src/main/java/com/dfsek/terra/carving/CarverCache.java +++ b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java @@ -1,14 +1,14 @@ package com.dfsek.terra.carving; -import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.util.GlueList; -import com.dfsek.terra.api.gaea.world.carving.Worm; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.carving.Worm; +import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; diff --git a/common/src/main/java/com/dfsek/terra/carving/CarverPalette.java b/common/src/main/java/com/dfsek/terra/carving/CarverPalette.java index afa30729a..98511814c 100644 --- a/common/src/main/java/com/dfsek/terra/carving/CarverPalette.java +++ b/common/src/main/java/com/dfsek/terra/carving/CarverPalette.java @@ -1,8 +1,8 @@ package com.dfsek.terra.carving; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.util.MaterialSet; import java.util.Map; diff --git a/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java b/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java index 2d78c2407..0a7fc66b1 100644 --- a/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java +++ b/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java @@ -1,13 +1,13 @@ package com.dfsek.terra.carving; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.api.gaea.world.carving.Carver; -import com.dfsek.terra.api.gaea.world.carving.Worm; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.world.carving.Carver; +import com.dfsek.terra.api.world.carving.Worm; +import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.CarverTemplate; diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index a3aceb438..1b60d7c83 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -6,12 +6,12 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.LoaderRegistrar; -import com.dfsek.terra.api.gaea.biome.Biome; import com.dfsek.terra.api.gaea.structures.loot.LootTable; -import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.world.Flora; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.palette.Palette; +import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.carving.UserDefinedCarver; diff --git a/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java b/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java index d8f3de9dc..6e6405e3c 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java @@ -6,7 +6,7 @@ import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.terra.api.gaea.util.JarUtil; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.debug.Debug; import java.io.File; diff --git a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java index e0c402088..7bd7fda29 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/BiomeGridBuilder.java @@ -1,6 +1,6 @@ package com.dfsek.terra.config.builder.biomegrid; -import com.dfsek.terra.api.gaea.biome.BiomeGrid; +import com.dfsek.terra.api.world.biome.BiomeGrid; import com.dfsek.terra.config.base.ConfigPack; public interface BiomeGridBuilder { diff --git a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java index 8e03874a1..92b12caa2 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/SingleGridBuilder.java @@ -1,6 +1,6 @@ package com.dfsek.terra.config.builder.biomegrid; -import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.biome.grid.SingleBiomeGrid; import com.dfsek.terra.config.base.ConfigPack; diff --git a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java index 0dbda3288..9c71fb1f2 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/biomegrid/UserDefinedGridBuilder.java @@ -1,6 +1,6 @@ package com.dfsek.terra.config.builder.biomegrid; -import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.biome.grid.UserDefinedGrid; import com.dfsek.terra.config.base.ConfigPack; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java index 0648cabe9..4b0859672 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java @@ -1,7 +1,7 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.builder.GeneratorBuilder; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java index b954f1bf1..b290b659e 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java @@ -1,7 +1,7 @@ package com.dfsek.terra.config.factories; -import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.builder.biomegrid.BiomeGridBuilder; import com.dfsek.terra.config.builder.biomegrid.UserDefinedGridBuilder; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java index 92aea8bb8..54c33cbd6 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java @@ -2,7 +2,7 @@ package com.dfsek.terra.config.factories; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.terra.api.gaea.math.MathUtil; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.templates.CarverTemplate; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java index a1ee6bf81..5f42dda4d 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java @@ -2,10 +2,10 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.world.Flora; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.gaea.world.palette.RandomPalette; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.world.palette.Palette; +import com.dfsek.terra.api.world.palette.RandomPalette; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.templates.FloraTemplate; import com.dfsek.terra.generation.items.flora.TerraFlora; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/OreFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/OreFactory.java index a07f4847c..487477623 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/OreFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/OreFactory.java @@ -1,7 +1,7 @@ package com.dfsek.terra.config.factories; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.config.templates.OreTemplate; import com.dfsek.terra.generation.items.ores.DeformedSphereOre; import com.dfsek.terra.generation.items.ores.Ore; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java index 9c889088e..1abc6a4cd 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java @@ -2,11 +2,11 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.gaea.world.palette.RandomPalette; -import com.dfsek.terra.api.gaea.world.palette.SimplexPalette; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.world.palette.Palette; +import com.dfsek.terra.api.world.palette.RandomPalette; +import com.dfsek.terra.api.world.palette.SimplexPalette; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.templates.PaletteTemplate; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java index 7421eb8ba..0c8a65ce3 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java @@ -1,7 +1,7 @@ package com.dfsek.terra.config.factories; import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.generation.items.TerraStructure; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/TerraFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/TerraFactory.java index 13049b1a5..485d7f8af 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/TerraFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/TerraFactory.java @@ -2,7 +2,7 @@ package com.dfsek.terra.config.factories; import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; public interface TerraFactory { O build(C config, TerraPlugin main) throws LoadException; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java index 01e0bc6df..3d1267036 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java @@ -1,8 +1,8 @@ package com.dfsek.terra.config.factories; import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.terra.api.gaea.tree.Tree; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.config.templates.TreeTemplate; import com.dfsek.terra.generation.items.tree.TerraTree; diff --git a/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java b/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java index 8e01fcff5..1e77d26da 100644 --- a/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java +++ b/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java @@ -1,8 +1,8 @@ package com.dfsek.terra.config.lang; import com.dfsek.terra.api.gaea.lang.Language; -import com.dfsek.terra.api.generic.CommandSender; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.CommandSender; +import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.debug.Debug; import java.io.File; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java index cfa3dcb3e..f4c0c5ce0 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.gaea.structures.loot.LootTable; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.config.files.Loader; import org.apache.commons.io.IOUtils; import org.json.simple.parser.ParseException; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java index 3924521d1..1a0534454 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.loaders; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.util.MaterialSet; import java.lang.reflect.Type; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/Types.java b/common/src/main/java/com/dfsek/terra/config/loaders/Types.java index fdd0fefcb..1dd9f266f 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/Types.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/Types.java @@ -1,11 +1,11 @@ package com.dfsek.terra.config.loaders; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.world.Flora; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.world.palette.Palette; +import com.dfsek.terra.api.world.tree.Tree; import java.lang.reflect.Type; import java.util.Set; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java index 66c17da32..754a5dac4 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java @@ -6,8 +6,8 @@ import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.gaea.tree.Tree; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.config.loaders.Types; import com.dfsek.terra.generation.items.tree.TreeLayer; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java index 9fe397513..5b6ed4182 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java @@ -5,7 +5,7 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.config.loaders.Types; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java index 612877bd8..6df7319cb 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java @@ -3,8 +3,8 @@ package com.dfsek.terra.config.loaders.palette; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.biome.palette.PaletteHolderBuilder; import com.dfsek.terra.config.loaders.Types; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java index fc998ff5c..bfa0949d6 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.loaders.Types; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java index 2ba67be40..885885c3e 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java @@ -2,7 +2,7 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.api.gaea.biome.Biome; +import com.dfsek.terra.api.world.biome.Biome; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index c037edf52..38fc7cdb1 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -6,11 +6,11 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.terra.api.gaea.util.GlueList; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.Biome; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Biome; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.biome.palette.SinglePalette; import com.dfsek.terra.carving.UserDefinedCarver; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java index 782d81355..c781c910e 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java index 20f6c7b1f..36a958207 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.generation.items.ores.Ore; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java b/common/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java index c89a2eb43..cce1b0a80 100644 --- a/common/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java +++ b/common/src/main/java/com/dfsek/terra/debug/gui/DebugFrame.java @@ -1,6 +1,6 @@ package com.dfsek.terra.debug.gui; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; import javax.swing.*; import java.awt.*; diff --git a/common/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java b/common/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java index c1e2e3144..77a22e76e 100644 --- a/common/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java +++ b/common/src/main/java/com/dfsek/terra/debug/gui/DebugGUI.java @@ -1,6 +1,6 @@ package com.dfsek.terra.debug.gui; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; import javax.swing.*; import java.awt.*; diff --git a/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java b/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java index 3269e3510..4a8d38489 100644 --- a/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java +++ b/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java @@ -1,7 +1,7 @@ package com.dfsek.terra.generation; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.Interpolator; +import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.config.WorldGenerator; diff --git a/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java similarity index 89% rename from common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java rename to common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java index 9a17b02b3..fc822e326 100644 --- a/common/src/main/java/com/dfsek/terra/generation/TerraChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java @@ -1,23 +1,23 @@ package com.dfsek.terra.generation; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.ChunkInterpolator3; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.generator.ChunkGenerator; -import com.dfsek.terra.api.generic.world.BiomeGrid; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.generic.world.block.data.Bisected; -import com.dfsek.terra.api.generic.world.block.data.Slab; -import com.dfsek.terra.api.generic.world.block.data.Stairs; -import com.dfsek.terra.api.generic.world.block.data.Waterlogged; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.BiomeGrid; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.block.data.Bisected; +import com.dfsek.terra.api.platform.world.block.data.Slab; +import com.dfsek.terra.api.platform.world.block.data.Stairs; +import com.dfsek.terra.api.platform.world.block.data.Waterlogged; +import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.palette.SinglePalette; import com.dfsek.terra.config.base.ConfigPack; @@ -28,7 +28,7 @@ import org.jetbrains.annotations.NotNull; import java.util.Map; import java.util.Random; -public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generator.TerraChunkGenerator { +public class MasterChunkGenerator implements com.dfsek.terra.api.world.generation.TerraChunkGenerator { private final ConfigPack configPack; @@ -37,7 +37,7 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato private final SinglePalette blank; - public TerraChunkGenerator(ConfigPack c, TerraPlugin main) { + public MasterChunkGenerator(ConfigPack c, TerraPlugin main) { this.configPack = c; this.main = main; water = main.getWorldHandle().createMaterialData("minecraft:water"); @@ -83,7 +83,7 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato @SuppressWarnings({"try"}) public ChunkGenerator.ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, ChunkGenerator.ChunkData chunk) { TerraWorld tw = main.getWorld(world); - com.dfsek.terra.api.gaea.biome.BiomeGrid grid = tw.getGrid(); + com.dfsek.terra.api.world.biome.BiomeGrid grid = tw.getGrid(); try(ProfileFuture ignore = tw.getProfiler().measure("TotalChunkGenTime")) { ChunkInterpolator3 interp; try(ProfileFuture ignored = tw.getProfiler().measure("ChunkBaseGenTime")) { @@ -213,7 +213,7 @@ public class TerraChunkGenerator implements com.dfsek.terra.api.generic.generato public void generateBiomes(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, @NotNull BiomeGrid biome) { int xOrig = (chunkX << 4); int zOrig = (chunkZ << 4); - com.dfsek.terra.api.gaea.biome.BiomeGrid grid = main.getWorld(world).getGrid(); + com.dfsek.terra.api.world.biome.BiomeGrid grid = main.getWorld(world).getGrid(); for(int x = 0; x < 4; x++) { for(byte z = 0; z < 4; z++) { int cx = xOrig + (x << 2); diff --git a/common/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java b/common/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java index 15a59cb55..6d9a5336b 100644 --- a/common/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java +++ b/common/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java @@ -1,9 +1,9 @@ package com.dfsek.terra.generation; -import com.dfsek.terra.api.gaea.biome.Decorator; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.tree.Tree; import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.world.biome.Decorator; +import com.dfsek.terra.api.world.tree.Tree; public class UserDefinedDecorator extends Decorator { diff --git a/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java index 2c2bb2ce6..7a3ef9214 100644 --- a/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java @@ -1,10 +1,10 @@ package com.dfsek.terra.generation.config; -import com.dfsek.terra.api.gaea.biome.Generator; import com.dfsek.terra.api.gaea.math.Interpolator; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.world.biome.Generator; +import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.math.NoiseFunction2; import com.dfsek.terra.math.NoiseFunction3; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java b/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java index 77cdce7ed..65c5049f6 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java @@ -3,8 +3,8 @@ package com.dfsek.terra.generation.items; import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.vector.Vector2; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java index a8013e3d7..8d7fb72e6 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java @@ -3,11 +3,11 @@ package com.dfsek.terra.generation.items.flora; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.gaea.world.Flora; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.vector.Location; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java index a8c5d89e9..9c3dce121 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java @@ -3,11 +3,11 @@ package com.dfsek.terra.generation.items.flora; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.gaea.world.Flora; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.util.MaterialSet; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java index 80812adcd..57dea8995 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java @@ -4,8 +4,8 @@ import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.world.Flora; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.vector.Vector2; import com.dfsek.terra.generation.items.PlaceableLayer; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java index fb5e60ce8..06109bca6 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java @@ -4,17 +4,17 @@ import com.dfsek.terra.api.gaea.math.Range; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.gaea.world.Flora; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.data.Directional; -import com.dfsek.terra.api.generic.world.block.data.MultipleFacing; -import com.dfsek.terra.api.generic.world.block.data.Rotatable; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.data.Directional; +import com.dfsek.terra.api.platform.world.block.data.MultipleFacing; +import com.dfsek.terra.api.platform.world.block.data.Rotatable; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java index 027b1e160..070b26687 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java @@ -2,12 +2,12 @@ package com.dfsek.terra.generation.items.ores; import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.util.MaterialSet; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java index 1b47852c2..379bffc70 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java @@ -1,9 +1,9 @@ package com.dfsek.terra.generation.items.ores; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.util.MaterialSet; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java index defb508e4..cf654d96f 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java @@ -1,12 +1,12 @@ package com.dfsek.terra.generation.items.ores; import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index 3176d3a6e..b97bb645f 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -1,9 +1,9 @@ package com.dfsek.terra.generation.items.tree; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.tree.Tree; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.util.MaterialSet; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java b/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java index 29ddaa480..29eafb6aa 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java @@ -3,11 +3,11 @@ package com.dfsek.terra.generation.items.tree; import com.dfsek.terra.api.gaea.math.FastNoiseLite; import com.dfsek.terra.api.gaea.math.ProbabilityCollection; import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.gaea.tree.Tree; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.vector.Vector2; +import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.generation.items.PlaceableLayer; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/image/ImageLoader.java b/common/src/main/java/com/dfsek/terra/image/ImageLoader.java index 70a1757f6..4b0836672 100644 --- a/common/src/main/java/com/dfsek/terra/image/ImageLoader.java +++ b/common/src/main/java/com/dfsek/terra/image/ImageLoader.java @@ -1,8 +1,8 @@ package com.dfsek.terra.image; -import com.dfsek.terra.api.gaea.biome.NormalizationUtil; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.world.biome.NormalizationUtil; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.debug.gui.DebugGUI; diff --git a/common/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java b/common/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java index 9c06ba049..3e3d0d8c5 100644 --- a/common/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java +++ b/common/src/main/java/com/dfsek/terra/image/WorldImageGenerator.java @@ -1,9 +1,9 @@ package com.dfsek.terra.image; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.biome.NormalizationUtil; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.world.biome.NormalizationUtil; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import javax.imageio.ImageIO; diff --git a/common/src/main/java/com/dfsek/terra/population/CavePopulator.java b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java index 4b977fc83..bf5f83b72 100644 --- a/common/src/main/java/com/dfsek/terra/population/CavePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java @@ -2,15 +2,15 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.templates.CarverTemplate; diff --git a/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java index 75cf94cfd..7d54b761d 100644 --- a/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -1,13 +1,13 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.vector.Vector2; +import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.items.flora.FloraLayer; @@ -19,7 +19,7 @@ import java.util.Map; import java.util.Random; /** - * Populates Flora and Trees + * Populates Flora */ public class FloraPopulator implements TerraBlockPopulator { private final TerraPlugin main; diff --git a/common/src/main/java/com/dfsek/terra/population/OrePopulator.java b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java index 19ba94497..3e4148846 100644 --- a/common/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -1,16 +1,16 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.biome.Biome; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import org.jetbrains.annotations.NotNull; diff --git a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java index 9533fee37..5172bd33d 100644 --- a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -1,9 +1,9 @@ package com.dfsek.terra.population; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import org.jetbrains.annotations.NotNull; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/population/TreePopulator.java b/common/src/main/java/com/dfsek/terra/population/TreePopulator.java index 565e1e409..b5039c469 100644 --- a/common/src/main/java/com/dfsek/terra/population/TreePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/TreePopulator.java @@ -1,13 +1,13 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; import com.dfsek.terra.api.gaea.profiler.ProfileFuture; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.vector.Vector2; +import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.items.tree.TreeLayer; diff --git a/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java b/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java index 753310128..19a2f9d2b 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java +++ b/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java @@ -3,7 +3,7 @@ package com.dfsek.terra.procgen; import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.gaea.util.GlueList; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.vector.Vector3; import java.util.List; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java b/common/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java index 5988a3295..07434e62b 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java +++ b/common/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java @@ -1,6 +1,6 @@ package com.dfsek.terra.procgen.pixel; -import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.platform.world.vector.Vector2; import java.util.Set; diff --git a/common/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java b/common/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java index 019ddb912..4b8943ea5 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java +++ b/common/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java @@ -1,6 +1,6 @@ package com.dfsek.terra.procgen.pixel; -import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.platform.world.vector.Vector2; import net.jafama.FastMath; import java.util.HashSet; diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java index 3ba238ac6..4a86deb34 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java @@ -1,7 +1,7 @@ package com.dfsek.terra.procgen.voxel; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.vector.Vector3; public class Cylinder extends VoxelGeometry { public Cylinder(Vector3 start, int rad, int height) { diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java index 6236594d5..40e0c5133 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java @@ -1,7 +1,7 @@ package com.dfsek.terra.procgen.voxel; import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.vector.Vector3; public class DeformedSphere extends VoxelGeometry { public DeformedSphere(Vector3 start, int rad, double deform, FastNoiseLite noise) { diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java index f1ed10b19..9cb1ae499 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java @@ -1,6 +1,6 @@ package com.dfsek.terra.procgen.voxel; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.vector.Vector3; public class Sphere extends VoxelGeometry { public Sphere(Vector3 start, int rad) { diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java index 75a528d68..7f25138f5 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java @@ -1,6 +1,6 @@ package com.dfsek.terra.procgen.voxel; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.vector.Vector3; public class Tube extends VoxelGeometry { public Tube(Vector3 start, Vector3 end, int radius) { diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java index 3e186cab4..27c896e81 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.procgen.voxel; import com.dfsek.terra.api.gaea.util.GlueList; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.vector.Vector3; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java b/common/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java index 60f7c90e8..0fdc6163a 100644 --- a/common/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/ConfigRegistry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.registry; import com.dfsek.tectonic.exception.ConfigException; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.debug.Debug; diff --git a/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java b/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java index 35ac8d916..131743c75 100644 --- a/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java @@ -1,9 +1,9 @@ package com.dfsek.terra.registry; import com.dfsek.terra.api.gaea.world.Flora; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.generation.items.flora.ConstantFlora; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java b/common/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java index 0e620dcd4..b60d12a47 100644 --- a/common/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java @@ -1,8 +1,8 @@ package com.dfsek.terra.registry; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.SinglePalette; public class PaletteRegistry extends TerraRegistry> { diff --git a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java index cd45ae226..e7849c762 100644 --- a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java @@ -1,19 +1,19 @@ package com.dfsek.terra.registry; -import com.dfsek.terra.api.gaea.tree.Tree; -import com.dfsek.terra.api.gaea.tree.fractal.FractalTree; -import com.dfsek.terra.api.gaea.tree.fractal.trees.Cactus; -import com.dfsek.terra.api.gaea.tree.fractal.trees.IceSpike; -import com.dfsek.terra.api.gaea.tree.fractal.trees.OakTree; -import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredPillar; -import com.dfsek.terra.api.gaea.tree.fractal.trees.ShatteredTree; -import com.dfsek.terra.api.gaea.tree.fractal.trees.SmallShatteredPillar; -import com.dfsek.terra.api.gaea.tree.fractal.trees.SmallShatteredTree; -import com.dfsek.terra.api.gaea.tree.fractal.trees.SpruceTree; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.world.tree.Tree; +import com.dfsek.terra.api.world.tree.fractal.FractalTree; +import com.dfsek.terra.api.world.tree.fractal.trees.Cactus; +import com.dfsek.terra.api.world.tree.fractal.trees.IceSpike; +import com.dfsek.terra.api.world.tree.fractal.trees.OakTree; +import com.dfsek.terra.api.world.tree.fractal.trees.ShatteredPillar; +import com.dfsek.terra.api.world.tree.fractal.trees.ShatteredTree; +import com.dfsek.terra.api.world.tree.fractal.trees.SmallShatteredPillar; +import com.dfsek.terra.api.world.tree.fractal.trees.SmallShatteredTree; +import com.dfsek.terra.api.world.tree.fractal.trees.SpruceTree; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; diff --git a/common/src/main/java/com/dfsek/terra/util/MaterialSet.java b/common/src/main/java/com/dfsek/terra/util/MaterialSet.java index b3008a8ce..6a7caf3f6 100644 --- a/common/src/main/java/com/dfsek/terra/util/MaterialSet.java +++ b/common/src/main/java/com/dfsek/terra/util/MaterialSet.java @@ -1,7 +1,7 @@ package com.dfsek.terra.util; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; import java.util.Arrays; import java.util.HashSet; diff --git a/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java b/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java index 8d3a6767b..95a118e3b 100644 --- a/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java +++ b/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java @@ -1,7 +1,7 @@ package com.dfsek.terra.util; -import com.dfsek.terra.api.gaea.world.palette.Palette; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.Sampler; diff --git a/common/src/main/java/com/dfsek/terra/util/PopulationUtil.java b/common/src/main/java/com/dfsek/terra/util/PopulationUtil.java index 3c47c7d52..2d5c85ff6 100644 --- a/common/src/main/java/com/dfsek/terra/util/PopulationUtil.java +++ b/common/src/main/java/com/dfsek/terra/util/PopulationUtil.java @@ -2,7 +2,7 @@ package com.dfsek.terra.util; import com.dfsek.terra.api.gaea.math.MathUtil; import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.platform.world.Chunk; public final class PopulationUtil { public static FastRandom getRandom(Chunk c) { diff --git a/common/src/main/java/com/dfsek/terra/util/TagUtil.java b/common/src/main/java/com/dfsek/terra/util/TagUtil.java index 9e96b04e0..eba42151c 100644 --- a/common/src/main/java/com/dfsek/terra/util/TagUtil.java +++ b/common/src/main/java/com/dfsek/terra/util/TagUtil.java @@ -1,6 +1,6 @@ package com.dfsek.terra.util; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.debug.Debug; import org.jetbrains.annotations.NotNull; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitBiomeGrid.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitBiomeGrid.java index f68c67b4b..649cafd57 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitBiomeGrid.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitBiomeGrid.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit; -import com.dfsek.terra.api.generic.world.Biome; -import com.dfsek.terra.api.generic.world.BiomeGrid; +import com.dfsek.terra.api.platform.world.Biome; +import com.dfsek.terra.api.platform.world.BiomeGrid; import com.dfsek.terra.bukkit.world.BukkitBiome; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitChunk.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitChunk.java index 11cbc6832..6db72b19a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitChunk.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitChunk.java @@ -1,8 +1,8 @@ package com.dfsek.terra.bukkit; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.block.Block; import com.dfsek.terra.bukkit.world.block.BukkitBlock; public class BukkitChunk implements Chunk { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java index 71c1aed3b..ed65c569a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitCommandSender.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit; -import com.dfsek.terra.api.generic.CommandSender; +import com.dfsek.terra.api.platform.CommandSender; import org.bukkit.ChatColor; public class BukkitCommandSender implements CommandSender { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java index c600c474e..587b48246 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit; -import com.dfsek.terra.api.generic.Entity; +import com.dfsek.terra.api.platform.Entity; public class BukkitEntity implements Entity { private final org.bukkit.entity.Entity entity; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java index a29c92528..58dd09d03 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java @@ -1,8 +1,8 @@ package com.dfsek.terra.bukkit; -import com.dfsek.terra.api.generic.inventory.ItemHandle; -import com.dfsek.terra.api.generic.inventory.ItemStack; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.inventory.ItemHandle; +import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; public class BukkitItemHandle implements ItemHandle { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemMeta.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemMeta.java index 519beb3cb..a4742e02c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemMeta.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemMeta.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit; -import com.dfsek.terra.api.generic.inventory.item.ItemMeta; +import com.dfsek.terra.api.platform.inventory.item.ItemMeta; public class BukkitItemMeta implements ItemMeta { private final org.bukkit.inventory.meta.ItemMeta delegate; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java index 8c0ce2a33..81a20c358 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java @@ -1,8 +1,8 @@ package com.dfsek.terra.bukkit; -import com.dfsek.terra.api.generic.inventory.ItemStack; -import com.dfsek.terra.api.generic.inventory.item.ItemMeta; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.platform.inventory.item.ItemMeta; +import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; public class BukkitItemStack implements ItemStack { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java index ae419c4b0..5644ffec4 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit; import com.dfsek.terra.api.Player; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.world.vector.Location; public class BukkitPlayer implements Player { private final org.bukkit.entity.Player delegate; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java index fe35f0f7c..456121f4e 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java @@ -1,10 +1,10 @@ package com.dfsek.terra.bukkit; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.Tree; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.bukkit.util.BukkitConversions; import com.dfsek.terra.util.MaterialSet; import org.bukkit.TreeType; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorld.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorld.java index f6cfd8765..90be26848 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorld.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorld.java @@ -1,11 +1,11 @@ package com.dfsek.terra.bukkit; -import com.dfsek.terra.api.generic.Tree; -import com.dfsek.terra.api.generic.generator.ChunkGenerator; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.bukkit.generator.BukkitChunkGenerator; import com.dfsek.terra.bukkit.world.block.BukkitBlock; @@ -75,7 +75,7 @@ public class BukkitWorld implements World { } @Override - public void spawn(Location l, Class entity, java.util.function.Consumer consumer) { + public void spawn(Location l, Class entity, java.util.function.Consumer consumer) { } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java index 64d9943d9..a8612a237 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java @@ -1,11 +1,11 @@ package com.dfsek.terra.bukkit; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.Tree; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 85c8fea12..7304ad9ac 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -4,14 +4,14 @@ import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.GenericLoaders; import com.dfsek.terra.api.gaea.lang.Language; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.Tree; -import com.dfsek.terra.api.generic.inventory.ItemHandle; -import com.dfsek.terra.api.generic.world.Biome; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.inventory.ItemHandle; +import com.dfsek.terra.api.platform.world.Biome; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.api.transform.MapTransform; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.command.command.TerraCommand; @@ -26,7 +26,7 @@ import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.PluginConfig; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.generation.TerraChunkGenerator; +import com.dfsek.terra.generation.MasterChunkGenerator; import com.dfsek.terra.registry.ConfigRegistry; import com.dfsek.terra.util.StringUtils; import org.bstats.bukkit.Metrics; @@ -45,7 +45,7 @@ import java.util.Objects; public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { - private final Map generatorMap = new HashMap<>(); + private final Map generatorMap = new HashMap<>(); private final Map worldMap = new HashMap<>(); private final Map worlds = new HashMap<>(); private final ConfigRegistry registry = new ConfigRegistry(); @@ -138,7 +138,7 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { return new BukkitChunkGeneratorWrapper(generatorMap.computeIfAbsent(worldName, name -> { if(!registry.contains(id)) throw new IllegalArgumentException("No such config pack \"" + id + "\""); worlds.put(worldName, registry.get(id)); - return new TerraChunkGenerator(registry.get(id), this); + return new MasterChunkGenerator(registry.get(id), this); })); } @@ -162,7 +162,7 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { throw new IllegalArgumentException("Not a Terra world! " + w.getGenerator()); if(!worlds.containsKey(w.getName())) { getLogger().warning("Unexpected world load detected: \"" + w.getName() + "\""); - return new TerraWorld(w, ((TerraChunkGenerator) w.getGenerator()).getConfigPack(), this); + return new TerraWorld(w, ((MasterChunkGenerator) w.getGenerator()).getConfigPack(), this); } return worldMap.computeIfAbsent(w, world -> new TerraWorld(w, worlds.get(w.getName()), this)); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/Command.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/Command.java index 77abc1cda..913e07798 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/Command.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/Command.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.command; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.bukkit.BukkitCommandSender; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java index 2e4a4db46..7ceed79e6 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.command.command; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.command.Command; import com.dfsek.terra.bukkit.command.command.biome.BiomeCommand; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java index ea56bd1e9..ffd3f8234 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.command.command.geometry; import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitPlayer; import com.dfsek.terra.bukkit.BukkitWorld; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java index 8f4f20da7..1b86d9d12 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.command.command.geometry; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitPlayer; import com.dfsek.terra.bukkit.BukkitWorld; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java index 29583380b..190103791 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.command.command.geometry; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.PlayerCommand; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java index 1478afab8..5ea9beafb 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java @@ -1,10 +1,10 @@ package com.dfsek.terra.bukkit.generator; -import com.dfsek.terra.api.generic.generator.BlockPopulator; -import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; -import com.dfsek.terra.api.generic.world.BiomeGrid; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.generator.BlockPopulator; +import com.dfsek.terra.api.platform.world.BiomeGrid; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.bukkit.BukkitBiomeGrid; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; @@ -16,7 +16,7 @@ import java.util.List; import java.util.Random; import java.util.stream.Collectors; -public class BukkitChunkGenerator implements com.dfsek.terra.api.generic.generator.ChunkGenerator { +public class BukkitChunkGenerator implements com.dfsek.terra.api.platform.generator.ChunkGenerator { private final ChunkGenerator delegate; public BukkitChunkGenerator(ChunkGenerator delegate) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index ae4f4f5f3..99a66ae3c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -1,14 +1,15 @@ package com.dfsek.terra.bukkit.generator; import com.dfsek.terra.api.gaea.population.PopulationManager; -import com.dfsek.terra.api.generic.Handle; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; -import com.dfsek.terra.api.generic.world.Chunk; +import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.bukkit.BukkitBiomeGrid; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.debug.Debug; +import com.dfsek.terra.generation.MasterChunkGenerator; import com.dfsek.terra.population.CavePopulator; import com.dfsek.terra.population.FloraPopulator; import com.dfsek.terra.population.OrePopulator; @@ -31,7 +32,7 @@ import java.util.stream.Stream; public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Handle { - private static final Map popMap = new HashMap<>(); + private static final Map popMap = new HashMap<>(); private final PopulationManager popMan; @@ -52,7 +53,7 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Handl public static synchronized void saveAll() { - for(Map.Entry e : popMap.entrySet()) { + for(Map.Entry e : popMap.entrySet()) { try { e.getValue().saveBlocks(e.getKey()); Debug.info("Saved data for world " + e.getKey().getName()); @@ -63,11 +64,11 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Handl } public static synchronized void fixChunk(Chunk c) { - if(!(c.getWorld().getGenerator() instanceof com.dfsek.terra.generation.TerraChunkGenerator)) throw new IllegalArgumentException(); + if(!(c.getWorld().getGenerator() instanceof MasterChunkGenerator)) throw new IllegalArgumentException(); popMap.get(c.getWorld()).checkNeighbors(c.getX(), c.getZ(), c.getWorld()); } - private void load(com.dfsek.terra.api.generic.world.World w) { + private void load(com.dfsek.terra.api.platform.world.World w) { try { popMan.loadBlocks(w); } catch(FileNotFoundException e) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulator.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulator.java index 64eb84c63..dae8b73fc 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulator.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulator.java @@ -1,8 +1,8 @@ package com.dfsek.terra.bukkit.generator; -import com.dfsek.terra.api.generic.generator.BlockPopulator; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.generator.BlockPopulator; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.bukkit.BukkitChunk; import com.dfsek.terra.bukkit.BukkitWorld; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java index efa7b6d78..566de2470 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.generator; -import com.dfsek.terra.api.generic.generator.TerraBlockPopulator; +import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.bukkit.BukkitChunk; import com.dfsek.terra.bukkit.BukkitWorld; import org.bukkit.Chunk; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java index a2ca4fadd..8fb58bc2d 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.listeners; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.StructureGrowEvent; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java index 1efe86781..b35bc71a9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.listeners; -import com.dfsek.terra.api.generic.TerraPlugin; +import com.dfsek.terra.api.platform.TerraPlugin; import org.bukkit.event.Listener; /** diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/RotationUtil.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/RotationUtil.java index 082e5ff1b..e88a28eff 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/RotationUtil.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/RotationUtil.java @@ -1,16 +1,16 @@ package com.dfsek.terra.bukkit.structure; -import com.dfsek.terra.api.generic.world.block.Axis; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.data.Directional; -import com.dfsek.terra.api.generic.world.block.data.MultipleFacing; -import com.dfsek.terra.api.generic.world.block.data.Orientable; -import com.dfsek.terra.api.generic.world.block.data.Rail; -import com.dfsek.terra.api.generic.world.block.data.RedstoneWire; -import com.dfsek.terra.api.generic.world.block.data.Rotatable; -import com.dfsek.terra.api.generic.world.block.data.Wall; -import com.dfsek.terra.api.generic.world.vector.Vector2; +import com.dfsek.terra.api.platform.world.block.Axis; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.data.Directional; +import com.dfsek.terra.api.platform.world.block.data.MultipleFacing; +import com.dfsek.terra.api.platform.world.block.data.Orientable; +import com.dfsek.terra.api.platform.world.block.data.Rail; +import com.dfsek.terra.api.platform.world.block.data.RedstoneWire; +import com.dfsek.terra.api.platform.world.block.data.Rotatable; +import com.dfsek.terra.api.platform.world.block.data.Wall; +import com.dfsek.terra.api.platform.world.vector.Vector2; import com.dfsek.terra.structure.Rotation; import net.jafama.FastMath; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java index 674a22010..2351ef43d 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.util; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.bukkit.BukkitWorld; import org.bukkit.Location; import org.bukkit.util.Vector; @@ -10,7 +10,7 @@ public final class BukkitConversions { return new Vector3(bukkit.getX(), bukkit.getY(), bukkit.getZ()); } - public static Location toBukkitLocation(com.dfsek.terra.api.generic.world.vector.Location terra) { + public static Location toBukkitLocation(com.dfsek.terra.api.platform.world.vector.Location terra) { return new Location(((BukkitWorld) terra.getWorld()).getHandle(), terra.getX(), terra.getY(), terra.getZ()); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiome.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiome.java index eac3332e6..843268183 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiome.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiome.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.world; -import com.dfsek.terra.api.generic.world.Biome; +import com.dfsek.terra.api.platform.world.Biome; public class BukkitBiome implements Biome { private final org.bukkit.block.Biome biome; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java index 421c110c2..215f1d7f0 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java @@ -1,10 +1,10 @@ package com.dfsek.terra.bukkit.world.block; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.world.block.data.TerraEnumAdapter; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java index 05b3496fc..a4c0b69a6 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.world.block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; public class BukkitBlockData implements BlockData { private org.bukkit.block.data.BlockData delegate; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java index 9a7acf859..c5c0861d2 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.world.block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; import org.bukkit.Material; public class BukkitMaterialData implements MaterialData { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java index a4a8df802..8d0dce046 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java @@ -1,10 +1,10 @@ package com.dfsek.terra.bukkit.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.data.Bisected; -import com.dfsek.terra.api.generic.world.block.data.Slab; -import com.dfsek.terra.api.generic.world.block.data.Stairs; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.data.Bisected; +import com.dfsek.terra.api.platform.world.block.data.Slab; +import com.dfsek.terra.api.platform.world.block.data.Stairs; /** * Utility class to adapt Bukkit enums to Terra enums. diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java index e32421029..854a85fcc 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.data.MultipleFacing; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.data.MultipleFacing; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import java.util.Set; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java index b889f311e..dbdc14968 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.world.block.data; -import com.dfsek.terra.api.generic.world.block.data.Slab; +import com.dfsek.terra.api.platform.world.block.data.Slab; public class BukkitSlab extends BukkitWaterlogged implements Slab { public BukkitSlab(org.bukkit.block.data.type.Slab delegate) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java index 04bf258d8..fa12c6fc8 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.data.Stairs; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.data.Stairs; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; public class BukkitStairs extends BukkitBlockData implements Stairs { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java index 6d6bc8aa0..075a95039 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.world.block.data; -import com.dfsek.terra.api.generic.world.block.data.Waterlogged; +import com.dfsek.terra.api.platform.world.block.data.Waterlogged; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; public class BukkitWaterlogged extends BukkitBlockData implements Waterlogged { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java index fb7ceb044..9ac9ddd28 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.BlockFace; import org.bukkit.block.data.Bisected; import org.bukkit.block.data.type.Slab; import org.bukkit.block.data.type.Stairs; @@ -10,7 +10,7 @@ import org.bukkit.block.data.type.Stairs; * Utility class to adapt Terra enums to Bukkit enums */ public final class TerraEnumAdapter { - public static Stairs.Shape fromTerraStair(com.dfsek.terra.api.generic.world.block.data.Stairs.Shape shape) { + public static Stairs.Shape fromTerraStair(com.dfsek.terra.api.platform.world.block.data.Stairs.Shape shape) { switch(shape) { case STRAIGHT: return Stairs.Shape.STRAIGHT; @@ -27,7 +27,7 @@ public final class TerraEnumAdapter { } } - public static Bisected.Half fromTerraHalf(com.dfsek.terra.api.generic.world.block.data.Bisected.Half half) { + public static Bisected.Half fromTerraHalf(com.dfsek.terra.api.platform.world.block.data.Bisected.Half half) { switch(half) { case TOP: return Bisected.Half.TOP; @@ -83,7 +83,7 @@ public final class TerraEnumAdapter { } } - public static Slab.Type fromTerraSlabType(com.dfsek.terra.api.generic.world.block.data.Slab.Type type) { + public static Slab.Type fromTerraSlabType(com.dfsek.terra.api.platform.world.block.data.Slab.Type type) { switch(type) { case TOP: return Slab.Type.TOP; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index f479a868c..588672056 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -4,12 +4,12 @@ import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.GenericLoaders; import com.dfsek.terra.api.gaea.lang.Language; -import com.dfsek.terra.api.generic.TerraPlugin; -import com.dfsek.terra.api.generic.inventory.ItemHandle; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.inventory.ItemHandle; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.api.transform.MapTransform; import com.dfsek.terra.api.transform.NotNullValidator; import com.dfsek.terra.api.transform.Transformer; @@ -176,7 +176,7 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { registry .registerLoader(BlockData.class, (t, o, l) -> worldHandle.createBlockData((String) o)) .registerLoader(MaterialData.class, (t, o, l) -> worldHandle.createMaterialData((String) o)) - .registerLoader(com.dfsek.terra.api.generic.world.Biome.class, (t, o, l) -> new FabricBiome(biomeFixer.translate((String) o))); + .registerLoader(com.dfsek.terra.api.platform.world.Biome.class, (t, o, l) -> new FabricBiome(biomeFixer.translate((String) o))); } public static String createBiomeID(ConfigPack pack, UserDefinedBiome biome) { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java index 312de6e83..7648480d2 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java @@ -1,8 +1,8 @@ package com.dfsek.terra.fabric.inventory; -import com.dfsek.terra.api.generic.inventory.ItemHandle; -import com.dfsek.terra.api.generic.inventory.ItemStack; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.inventory.ItemHandle; +import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.platform.world.block.MaterialData; public class FabricItemHandle implements ItemHandle { @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java index dc71067be..f7662acee 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java @@ -1,8 +1,8 @@ package com.dfsek.terra.fabric.inventory; -import com.dfsek.terra.api.generic.inventory.ItemStack; -import com.dfsek.terra.api.generic.inventory.item.ItemMeta; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.platform.inventory.item.ItemMeta; +import com.dfsek.terra.api.platform.world.block.MaterialData; public class FabricItemStack implements ItemStack { net.minecraft.item.ItemStack delegate; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java index 1130ef6d5..470e60080 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java @@ -1,6 +1,6 @@ package com.dfsek.terra.fabric.world; -import com.dfsek.terra.api.generic.world.vector.Vector3; +import com.dfsek.terra.api.platform.world.vector.Vector3; import net.minecraft.util.math.BlockPos; public final class FabricAdapters { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java index d804bf3b3..99dab1c2c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricBiome.java @@ -1,6 +1,6 @@ package com.dfsek.terra.fabric.world; -import com.dfsek.terra.api.generic.world.Biome; +import com.dfsek.terra.api.platform.world.Biome; public class FabricBiome implements Biome { private final net.minecraft.world.biome.Biome delegate; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java index ff870c3c3..f1020b7d5 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java @@ -1,8 +1,8 @@ package com.dfsek.terra.fabric.world; -import com.dfsek.terra.api.generic.Tree; -import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index 260d3c9ea..779b55332 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -1,10 +1,10 @@ package com.dfsek.terra.fabric.world; -import com.dfsek.terra.api.generic.Tree; -import com.dfsek.terra.api.generic.world.WorldHandle; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricMaterialData; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java index 2e24fc8b3..529cec805 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/TerraBiomeSource.java @@ -1,6 +1,6 @@ package com.dfsek.terra.fabric.world; -import com.dfsek.terra.api.gaea.generation.GenerationPhase; +import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.config.base.ConfigPack; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java index 4164df37a..f20724743 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java @@ -1,10 +1,10 @@ package com.dfsek.terra.fabric.world.block; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.MaterialData; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.fabric.world.FabricAdapters; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; import net.minecraft.util.math.BlockPos; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java index 683ad720a..e3d87d9b6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java @@ -1,7 +1,7 @@ package com.dfsek.terra.fabric.world.block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; import net.minecraft.block.BlockState; public class FabricBlockData implements BlockData { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricMaterialData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricMaterialData.java index 19bb30b61..be531f86a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricMaterialData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricMaterialData.java @@ -1,7 +1,7 @@ package com.dfsek.terra.fabric.world.block; -import com.dfsek.terra.api.generic.world.block.BlockData; -import com.dfsek.terra.api.generic.world.block.MaterialData; +import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.world.block.MaterialData; import net.minecraft.block.Block; import net.minecraft.block.Blocks; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java index 1cf39dc2f..ca60af062 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java @@ -1,9 +1,9 @@ package com.dfsek.terra.fabric.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.data.Bisected; -import com.dfsek.terra.api.generic.world.block.data.Slab; -import com.dfsek.terra.api.generic.world.block.data.Stairs; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.data.Bisected; +import com.dfsek.terra.api.platform.world.block.data.Slab; +import com.dfsek.terra.api.platform.world.block.data.Stairs; import net.minecraft.block.enums.BlockHalf; import net.minecraft.block.enums.SlabType; import net.minecraft.block.enums.StairShape; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java index a397f4e58..20adcb618 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java @@ -1,7 +1,7 @@ package com.dfsek.terra.fabric.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.data.MultipleFacing; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.data.MultipleFacing; import com.dfsek.terra.fabric.world.block.FabricBlockData; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java index 4f66c02d4..3ec3db9db 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java @@ -1,6 +1,6 @@ package com.dfsek.terra.fabric.world.block.data; -import com.dfsek.terra.api.generic.world.block.data.Slab; +import com.dfsek.terra.api.platform.world.block.data.Slab; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java index 74c8b1fb7..4bb032b8a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java @@ -1,7 +1,7 @@ package com.dfsek.terra.fabric.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.data.Stairs; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.data.Stairs; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java index 97b3c3dd7..92756ee9a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java @@ -1,6 +1,6 @@ package com.dfsek.terra.fabric.world.block.data; -import com.dfsek.terra.api.generic.world.block.data.Waterlogged; +import com.dfsek.terra.api.platform.world.block.data.Waterlogged; import com.dfsek.terra.fabric.world.block.FabricBlockData; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java index 019b70e74..a5a53fa7b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java @@ -1,9 +1,9 @@ package com.dfsek.terra.fabric.world.block.data; -import com.dfsek.terra.api.generic.world.block.BlockFace; -import com.dfsek.terra.api.generic.world.block.data.Bisected; -import com.dfsek.terra.api.generic.world.block.data.Slab; -import com.dfsek.terra.api.generic.world.block.data.Stairs; +import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.world.block.data.Bisected; +import com.dfsek.terra.api.platform.world.block.data.Slab; +import com.dfsek.terra.api.platform.world.block.data.Stairs; import net.minecraft.block.enums.BlockHalf; import net.minecraft.block.enums.SlabType; import net.minecraft.block.enums.StairShape; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java index 35f9f7d06..8fa09df1f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java @@ -1,7 +1,7 @@ package com.dfsek.terra.fabric.world.generator; -import com.dfsek.terra.api.generic.generator.ChunkGenerator; -import com.dfsek.terra.api.generic.world.block.BlockData; +import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.fabric.world.block.FabricBlockData; import net.minecraft.util.math.BlockPos; import net.minecraft.world.chunk.Chunk; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java index 0d8232a60..5ec22b9e3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGenerator.java @@ -1,10 +1,10 @@ package com.dfsek.terra.fabric.world.generator; -import com.dfsek.terra.api.generic.generator.BlockPopulator; -import com.dfsek.terra.api.generic.generator.ChunkGenerator; -import com.dfsek.terra.api.generic.generator.TerraChunkGenerator; -import com.dfsek.terra.api.generic.world.BiomeGrid; -import com.dfsek.terra.api.generic.world.World; +import com.dfsek.terra.api.platform.generator.BlockPopulator; +import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.BiomeGrid; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index 031074f99..3592216f9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -1,12 +1,12 @@ package com.dfsek.terra.fabric.world.generator; import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.api.generic.Handle; +import com.dfsek.terra.api.platform.Handle; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.handles.world.FabricSeededWorldAccess; -import com.dfsek.terra.generation.TerraChunkGenerator; +import com.dfsek.terra.generation.MasterChunkGenerator; import com.dfsek.terra.population.CavePopulator; import com.dfsek.terra.population.FloraPopulator; import com.dfsek.terra.population.OrePopulator; @@ -32,7 +32,7 @@ import net.minecraft.world.gen.chunk.VerticalBlockSample; public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handle { private final long seed; - private final TerraChunkGenerator delegate; + private final MasterChunkGenerator delegate; private final TerraBiomeSource biomeSource; public static final Codec PACK_CODEC = (RecordCodecBuilder.create(config -> config.group( Codec.STRING.fieldOf("pack").forGetter(pack -> pack.getTemplate().getID()) @@ -70,7 +70,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl super(biomeSource, new StructuresConfig(false)); this.pack = configPack; - this.delegate = new TerraChunkGenerator(configPack, TerraFabricPlugin.getInstance()); + this.delegate = new MasterChunkGenerator(configPack, TerraFabricPlugin.getInstance()); delegate.getMain().getLogger().info("Loading world..."); this.biomeSource = biomeSource; @@ -78,7 +78,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handl } @Override - public TerraChunkGenerator getHandle() { + public MasterChunkGenerator getHandle() { return delegate; } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java index b8e9f5cf3..e30efbca9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java @@ -1,12 +1,12 @@ package com.dfsek.terra.fabric.world.handles; -import com.dfsek.terra.api.generic.Entity; -import com.dfsek.terra.api.generic.Tree; -import com.dfsek.terra.api.generic.generator.ChunkGenerator; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.Entity; +import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.fabric.world.handles.chunk.FabricChunk; import net.minecraft.server.world.ServerWorld; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java index 89fdb8ec4..d3a571cb9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java @@ -1,8 +1,8 @@ package com.dfsek.terra.fabric.world.handles.chunk; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.block.Block; public class FabricChunk implements Chunk { private final net.minecraft.world.chunk.Chunk chunk; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java index 94684c0b7..ec78da35d 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java @@ -1,8 +1,8 @@ package com.dfsek.terra.fabric.world.handles.chunk; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.Block; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.block.Block; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; import net.minecraft.util.math.BlockPos; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java index cf871c34c..0056dcba8 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java @@ -1,12 +1,12 @@ package com.dfsek.terra.fabric.world.handles.world; -import com.dfsek.terra.api.generic.Entity; -import com.dfsek.terra.api.generic.Tree; -import com.dfsek.terra.api.generic.generator.ChunkGenerator; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.Entity; +import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.util.math.BlockPos; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index c5816ca25..11636a62f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -1,12 +1,12 @@ package com.dfsek.terra.fabric.world.handles.world; -import com.dfsek.terra.api.generic.Entity; -import com.dfsek.terra.api.generic.Tree; -import com.dfsek.terra.api.generic.generator.ChunkGenerator; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.Entity; +import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.util.math.BlockPos; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java index 9e6ca13eb..d5d1c06fd 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java @@ -1,12 +1,12 @@ package com.dfsek.terra.fabric.world.handles.world; -import com.dfsek.terra.api.generic.Entity; -import com.dfsek.terra.api.generic.Tree; -import com.dfsek.terra.api.generic.generator.ChunkGenerator; -import com.dfsek.terra.api.generic.world.Chunk; -import com.dfsek.terra.api.generic.world.World; -import com.dfsek.terra.api.generic.world.block.Block; -import com.dfsek.terra.api.generic.world.vector.Location; +import com.dfsek.terra.api.platform.Entity; +import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.util.math.BlockPos; From 53c554f25c2136dc2319103edb81de153c33686c Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 18 Dec 2020 19:46:19 -0700 Subject: [PATCH 065/210] Gaea is gone --- .../java/com/dfsek/terra/TerraProfiler.java | 6 +- .../com/dfsek/terra/api/GenericLoaders.java | 4 +- .../java/com/dfsek/terra/api/gaea/Debug.java | 26 ---- .../gaea/serial/MovedObjectInputStream.java | 50 -------- .../api/gaea/util/SerializationUtil.java | 26 ---- .../terra/api/{gaea => }/lang/Language.java | 2 +- .../terra/api/{gaea => }/lang/Message.java | 2 +- .../api/{gaea => }/lang/MultiLineMessage.java | 2 +- .../{gaea => }/lang/SingleLineMessage.java | 2 +- .../api/{gaea/structures => }/loot/Entry.java | 10 +- .../{gaea/structures => }/loot/LootTable.java | 4 +- .../api/{gaea/structures => }/loot/Pool.java | 6 +- .../loot/functions/AmountFunction.java | 2 +- .../loot/functions/DamageFunction.java | 2 +- .../loot/functions/Function.java | 2 +- .../{gaea => }/math/ChunkInterpolator3.java | 2 +- .../api/{gaea => }/math/FastNoiseLite.java | 10 +- .../api/{gaea => }/math/Interpolator.java | 2 +- .../api/{gaea => }/math/Interpolator3.java | 2 +- .../terra/api/{gaea => }/math/MathUtil.java | 4 +- .../math/ProbabilityCollection.java | 4 +- .../terra/api/{gaea => }/math/Range.java | 28 ++--- .../dfsek/terra/api/platform/TerraPlugin.java | 2 +- .../api/{gaea => }/profiler/DataHolder.java | 2 +- .../api/{gaea => }/profiler/DataType.java | 2 +- .../terra/api/{gaea => }/profiler/Desire.java | 2 +- .../api/{gaea => }/profiler/Measurement.java | 6 +- .../{gaea => }/profiler/ProfileFuture.java | 2 +- .../{gaea => }/profiler/WorldProfiler.java | 4 +- .../terra/api/{gaea => }/util/FastRandom.java | 2 +- .../terra/api/{gaea => }/util/GlueList.java | 118 +++++++++--------- .../terra/api/{gaea => }/util/JarUtil.java | 4 +- .../terra/api/util/SerializationUtil.java | 70 +++++++++++ .../terra/api/world/biome/BiomeGrid.java | 2 +- .../terra/api/world/biome/Decorator.java | 4 +- .../terra/api/world/biome/Generator.java | 2 +- .../dfsek/terra/api/world/carving/Carver.java | 4 +- .../{gaea/world => world/flora}/Flora.java | 4 +- .../population/ChunkCoordinate.java | 6 +- .../population/PopulationManager.java | 12 +- .../terra/api/world/palette/Palette.java | 6 +- .../api/world/palette/SimplexPalette.java | 2 +- .../api/world/tree/fractal/TreeGeometry.java | 2 +- .../world/tree/fractal/trees/IceSpike.java | 2 +- .../tree/fractal/trees/ShatteredTree.java | 2 +- .../fractal/trees/SmallShatteredTree.java | 2 +- .../java/com/dfsek/terra/biome/BiomeZone.java | 2 +- .../terra/biome/palette/PaletteLayer.java | 2 +- .../postprocessing/CoordinatePerturb.java | 2 +- .../biome/postprocessing/ErosionNoise.java | 2 +- .../com/dfsek/terra/carving/CarverCache.java | 6 +- .../dfsek/terra/carving/CarverPalette.java | 2 +- .../terra/carving/UserDefinedCarver.java | 4 +- .../dfsek/terra/config/base/ConfigPack.java | 4 +- .../dfsek/terra/config/base/PluginConfig.java | 2 +- .../terra/config/factories/BiomeFactory.java | 2 +- .../terra/config/factories/CarverFactory.java | 2 +- .../terra/config/factories/FloraFactory.java | 4 +- .../config/factories/PaletteFactory.java | 4 +- .../com/dfsek/terra/config/lang/LangUtil.java | 4 +- .../terra/config/loaders/LootTableLoader.java | 2 +- .../loaders/ProbabilityCollectionLoader.java | 2 +- .../terra/config/loaders/RangeLoader.java | 2 +- .../com/dfsek/terra/config/loaders/Types.java | 4 +- .../loaders/config/FloraLayerLoader.java | 8 +- .../loaders/config/NoiseBuilderLoader.java | 2 +- .../loaders/config/OreConfigLoader.java | 2 +- .../loaders/config/TreeLayerLoader.java | 6 +- .../loaders/palette/CarverPaletteLoader.java | 2 +- .../loaders/palette/PaletteLayerLoader.java | 2 +- .../terra/config/templates/BiomeTemplate.java | 2 +- .../config/templates/CarverTemplate.java | 2 +- .../terra/config/templates/OreTemplate.java | 2 +- .../config/templates/StructureTemplate.java | 8 +- .../terra/config/templates/TreeTemplate.java | 2 +- .../generation/ElevationInterpolator.java | 2 +- .../generation/MasterChunkGenerator.java | 4 +- .../com/dfsek/terra/generation/Sampler.java | 2 +- .../generation/UserDefinedDecorator.java | 4 +- .../terra/generation/config/NoiseBuilder.java | 2 +- .../generation/config/WorldGenerator.java | 2 +- .../generation/items/PlaceableLayer.java | 6 +- .../generation/items/TerraStructure.java | 6 +- .../generation/items/flora/BlockFlora.java | 6 +- .../generation/items/flora/ConstantFlora.java | 6 +- .../generation/items/flora/FloraLayer.java | 8 +- .../generation/items/flora/TerraFlora.java | 8 +- .../items/ores/DeformedSphereOre.java | 4 +- .../generation/items/ores/OreConfig.java | 2 +- .../generation/items/ores/OreHolder.java | 2 +- .../generation/items/ores/VanillaOre.java | 2 +- .../generation/items/tree/TerraTree.java | 2 +- .../generation/items/tree/TreeLayer.java | 6 +- .../com/dfsek/terra/math/NoiseFunction2.java | 2 +- .../com/dfsek/terra/math/NoiseFunction3.java | 2 +- .../com/dfsek/terra/math/RandomFunction.java | 4 +- .../dfsek/terra/population/CavePopulator.java | 2 +- .../terra/population/FloraPopulator.java | 2 +- .../dfsek/terra/population/OrePopulator.java | 6 +- .../dfsek/terra/population/TreePopulator.java | 2 +- .../com/dfsek/terra/procgen/GridSpawn.java | 6 +- .../terra/procgen/voxel/DeformedSphere.java | 2 +- .../terra/procgen/voxel/VoxelGeometry.java | 2 +- .../dfsek/terra/registry/FloraRegistry.java | 2 +- .../com/dfsek/terra/util/PopulationUtil.java | 4 +- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 2 +- .../geometry/DeformedSphereCommand.java | 2 +- .../command/command/profile/QueryCommand.java | 2 +- .../command/command/profile/ResetCommand.java | 2 +- .../command/command/profile/StartCommand.java | 2 +- .../command/command/profile/StopCommand.java | 2 +- .../BukkitChunkGeneratorWrapper.java | 2 +- .../dfsek/terra/fabric/TerraFabricPlugin.java | 2 +- .../FabricChunkGeneratorWrapper.java | 2 +- 114 files changed, 324 insertions(+), 356 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/api/gaea/Debug.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/gaea/serial/MovedObjectInputStream.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java rename common/src/main/java/com/dfsek/terra/api/{gaea => }/lang/Language.java (97%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/lang/Message.java (87%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/lang/MultiLineMessage.java (95%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/lang/SingleLineMessage.java (95%) rename common/src/main/java/com/dfsek/terra/api/{gaea/structures => }/loot/Entry.java (90%) rename common/src/main/java/com/dfsek/terra/api/{gaea/structures => }/loot/LootTable.java (96%) rename common/src/main/java/com/dfsek/terra/api/{gaea/structures => }/loot/Pool.java (92%) rename common/src/main/java/com/dfsek/terra/api/{gaea/structures => }/loot/functions/AmountFunction.java (93%) rename common/src/main/java/com/dfsek/terra/api/{gaea/structures => }/loot/functions/DamageFunction.java (95%) rename common/src/main/java/com/dfsek/terra/api/{gaea/structures => }/loot/functions/Function.java (88%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/math/ChunkInterpolator3.java (99%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/math/FastNoiseLite.java (99%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/math/Interpolator.java (97%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/math/Interpolator3.java (97%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/math/MathUtil.java (94%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/math/ProbabilityCollection.java (90%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/math/Range.java (65%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/profiler/DataHolder.java (97%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/profiler/DataType.java (93%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/profiler/Desire.java (80%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/profiler/Measurement.java (94%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/profiler/ProfileFuture.java (88%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/profiler/WorldProfiler.java (95%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/util/FastRandom.java (97%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/util/GlueList.java (97%) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/util/JarUtil.java (94%) create mode 100644 common/src/main/java/com/dfsek/terra/api/util/SerializationUtil.java rename common/src/main/java/com/dfsek/terra/api/{gaea/world => world/flora}/Flora.java (79%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world/generation}/population/ChunkCoordinate.java (74%) rename common/src/main/java/com/dfsek/terra/api/{gaea => world/generation}/population/PopulationManager.java (91%) diff --git a/common/src/main/java/com/dfsek/terra/TerraProfiler.java b/common/src/main/java/com/dfsek/terra/TerraProfiler.java index 1d1885197..3f9e6d6ce 100644 --- a/common/src/main/java/com/dfsek/terra/TerraProfiler.java +++ b/common/src/main/java/com/dfsek/terra/TerraProfiler.java @@ -1,9 +1,9 @@ package com.dfsek.terra; -import com.dfsek.terra.api.gaea.profiler.DataType; -import com.dfsek.terra.api.gaea.profiler.Measurement; -import com.dfsek.terra.api.gaea.profiler.WorldProfiler; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.profiler.DataType; +import com.dfsek.terra.api.profiler.Measurement; +import com.dfsek.terra.api.profiler.WorldProfiler; public class TerraProfiler extends WorldProfiler { public TerraProfiler(World w) { diff --git a/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java b/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java index a51aa4143..7d9e9b1c2 100644 --- a/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java +++ b/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api; import com.dfsek.tectonic.loading.TypeRegistry; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.biome.palette.PaletteHolder; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/Debug.java b/common/src/main/java/com/dfsek/terra/api/gaea/Debug.java deleted file mode 100644 index c513cfba0..000000000 --- a/common/src/main/java/com/dfsek/terra/api/gaea/Debug.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dfsek.terra.api.gaea; - -import com.dfsek.terra.api.platform.TerraPlugin; - -public class Debug { - public static TerraPlugin main; - - public static void setMain(TerraPlugin main) { - Debug.main = main; - } - - public static void info(String message) { - if(Gaea.isDebug()) main.getLogger().info(message); - } - public static void warn(String message) { - if(Gaea.isDebug()) main.getLogger().warning(message); - } - - public static void error(String message) { - if(Gaea.isDebug()) main.getLogger().severe(message); - } - - public static void stack(Exception e) { - if(Gaea.isDebug()) e.printStackTrace(); - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/serial/MovedObjectInputStream.java b/common/src/main/java/com/dfsek/terra/api/gaea/serial/MovedObjectInputStream.java deleted file mode 100644 index 9297c4532..000000000 --- a/common/src/main/java/com/dfsek/terra/api/gaea/serial/MovedObjectInputStream.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.dfsek.terra.api.gaea.serial; - -import java.io.IOException; -import java.io.InputStream; -import java.io.ObjectInputStream; -import java.io.ObjectStreamClass; -import java.lang.reflect.Field; - -public class MovedObjectInputStream extends ObjectInputStream { - private final String oldNameSpace; - private final String newNameSpace; - - public MovedObjectInputStream(InputStream in, String oldNameSpace, String newNameSpace) throws IOException { - super(in); - this.oldNameSpace = oldNameSpace; - this.newNameSpace = newNameSpace; - } - - @Override - protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException { - ObjectStreamClass result = super.readClassDescriptor(); - try { - if (result.getName().contains(oldNameSpace)) { - String newClassName = result.getName().replace(oldNameSpace, newNameSpace); - Class localClass = Class.forName(newClassName); - - Field nameField = ObjectStreamClass.class.getDeclaredField("name"); - nameField.setAccessible(true); - nameField.set(result, newClassName); - - ObjectStreamClass localClassDescriptor = ObjectStreamClass.lookup(localClass); - Field suidField = ObjectStreamClass.class.getDeclaredField("suid"); - suidField.setAccessible(true); - suidField.set(result, localClassDescriptor.getSerialVersionUID()); - } - } catch(Exception e) { - throw new IOException("Exception when trying to replace namespace", e); - } - return result; - } - - @Override - protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { - if (desc.getName().contains(oldNameSpace)) { - String newClassName = desc.getName().replace(oldNameSpace, newNameSpace); - return Class.forName(newClassName); - } - return super.resolveClass(desc); - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java b/common/src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java deleted file mode 100644 index 50e6baf90..000000000 --- a/common/src/main/java/com/dfsek/terra/api/gaea/util/SerializationUtil.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dfsek.terra.api.gaea.util; - -import com.dfsek.terra.api.gaea.serial.MovedObjectInputStream; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.io.Serializable; - -public class SerializationUtil { - public static Object fromFile(File f) throws IOException, ClassNotFoundException { - ObjectInputStream ois = new MovedObjectInputStream(new FileInputStream(f), "org.polydev.gaea", "com.dfsek.terra.api.gaea"); // Backwards compat with old Gaea location - Object o = ois.readObject(); - ois.close(); - return o; - } - - public static void toFile(Serializable o, File f) throws IOException { - ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f)); - oos.writeObject(o); - oos.close(); - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java b/common/src/main/java/com/dfsek/terra/api/lang/Language.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java rename to common/src/main/java/com/dfsek/terra/api/lang/Language.java index d1703ee32..79e8f04ad 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/lang/Language.java +++ b/common/src/main/java/com/dfsek/terra/api/lang/Language.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.lang; +package com.dfsek.terra.api.lang; import com.dfsek.tectonic.config.Configuration; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java b/common/src/main/java/com/dfsek/terra/api/lang/Message.java similarity index 87% rename from common/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java rename to common/src/main/java/com/dfsek/terra/api/lang/Message.java index 0451f56b4..8a7ffeadf 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/lang/Message.java +++ b/common/src/main/java/com/dfsek/terra/api/lang/Message.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.lang; +package com.dfsek.terra.api.lang; import com.dfsek.terra.api.platform.CommandSender; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java b/common/src/main/java/com/dfsek/terra/api/lang/MultiLineMessage.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java rename to common/src/main/java/com/dfsek/terra/api/lang/MultiLineMessage.java index 37cf33072..01fe17faf 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/lang/MultiLineMessage.java +++ b/common/src/main/java/com/dfsek/terra/api/lang/MultiLineMessage.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.lang; +package com.dfsek.terra.api.lang; import com.dfsek.terra.api.platform.CommandSender; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java b/common/src/main/java/com/dfsek/terra/api/lang/SingleLineMessage.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java rename to common/src/main/java/com/dfsek/terra/api/lang/SingleLineMessage.java index 5d482ee16..5547f4a9d 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/lang/SingleLineMessage.java +++ b/common/src/main/java/com/dfsek/terra/api/lang/SingleLineMessage.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.lang; +package com.dfsek.terra.api.lang; import com.dfsek.terra.api.platform.CommandSender; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java b/common/src/main/java/com/dfsek/terra/api/loot/Entry.java similarity index 90% rename from common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java rename to common/src/main/java/com/dfsek/terra/api/loot/Entry.java index ff325a46a..e35e7ca97 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Entry.java +++ b/common/src/main/java/com/dfsek/terra/api/loot/Entry.java @@ -1,12 +1,12 @@ -package com.dfsek.terra.api.gaea.structures.loot; +package com.dfsek.terra.api.loot; -import com.dfsek.terra.api.gaea.structures.loot.functions.AmountFunction; -import com.dfsek.terra.api.gaea.structures.loot.functions.DamageFunction; -import com.dfsek.terra.api.gaea.structures.loot.functions.Function; -import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.loot.functions.AmountFunction; +import com.dfsek.terra.api.loot.functions.DamageFunction; +import com.dfsek.terra.api.loot.functions.Function; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.inventory.ItemStack; import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.util.GlueList; import net.jafama.FastMath; import org.json.simple.JSONArray; import org.json.simple.JSONObject; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java b/common/src/main/java/com/dfsek/terra/api/loot/LootTable.java similarity index 96% rename from common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java rename to common/src/main/java/com/dfsek/terra/api/loot/LootTable.java index 8c3997502..eb4be5f8c 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/LootTable.java +++ b/common/src/main/java/com/dfsek/terra/api/loot/LootTable.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.api.gaea.structures.loot; +package com.dfsek.terra.api.loot; -import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.inventory.Inventory; import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.util.GlueList; import org.json.simple.JSONArray; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java b/common/src/main/java/com/dfsek/terra/api/loot/Pool.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java rename to common/src/main/java/com/dfsek/terra/api/loot/Pool.java index 926dfd8c9..899d55ec6 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/Pool.java +++ b/common/src/main/java/com/dfsek/terra/api/loot/Pool.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.api.gaea.structures.loot; +package com.dfsek.terra.api.loot; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.util.GlueList; import net.jafama.FastMath; import org.json.simple.JSONArray; import org.json.simple.JSONObject; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java b/common/src/main/java/com/dfsek/terra/api/loot/functions/AmountFunction.java similarity index 93% rename from common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java rename to common/src/main/java/com/dfsek/terra/api/loot/functions/AmountFunction.java index a93f1b2fb..cacfdb9bd 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/AmountFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/loot/functions/AmountFunction.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.structures.loot.functions; +package com.dfsek.terra.api.loot.functions; import com.dfsek.terra.api.platform.inventory.ItemStack; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java b/common/src/main/java/com/dfsek/terra/api/loot/functions/DamageFunction.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java rename to common/src/main/java/com/dfsek/terra/api/loot/functions/DamageFunction.java index 04d57e22a..948967ad0 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/DamageFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/loot/functions/DamageFunction.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.structures.loot.functions; +package com.dfsek.terra.api.loot.functions; import com.dfsek.terra.api.platform.inventory.ItemStack; import com.dfsek.terra.api.platform.inventory.item.Damageable; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java b/common/src/main/java/com/dfsek/terra/api/loot/functions/Function.java similarity index 88% rename from common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java rename to common/src/main/java/com/dfsek/terra/api/loot/functions/Function.java index a1aae5f75..643310626 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/structures/loot/functions/Function.java +++ b/common/src/main/java/com/dfsek/terra/api/loot/functions/Function.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.structures.loot.functions; +package com.dfsek.terra.api.loot.functions; import com.dfsek.terra.api.platform.inventory.ItemStack; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java b/common/src/main/java/com/dfsek/terra/api/math/ChunkInterpolator3.java similarity index 99% rename from common/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java rename to common/src/main/java/com/dfsek/terra/api/math/ChunkInterpolator3.java index d7e9098f9..dfe615abc 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/math/ChunkInterpolator3.java +++ b/common/src/main/java/com/dfsek/terra/api/math/ChunkInterpolator3.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.math; +package com.dfsek.terra.api.math; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.biome.BiomeGrid; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/math/FastNoiseLite.java b/common/src/main/java/com/dfsek/terra/api/math/FastNoiseLite.java similarity index 99% rename from common/src/main/java/com/dfsek/terra/api/gaea/math/FastNoiseLite.java rename to common/src/main/java/com/dfsek/terra/api/math/FastNoiseLite.java index 96ffe4c13..ea40325c9 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/math/FastNoiseLite.java +++ b/common/src/main/java/com/dfsek/terra/api/math/FastNoiseLite.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.math;// MIT License +package com.dfsek.terra.api.math;// MIT License import net.jafama.FastMath; @@ -328,14 +328,14 @@ public class FastNoiseLite { private TransformType3D mWarpTransformType3D = TransformType3D.DefaultOpenSimplex2; private double mDomainWarpAmp = 1.0f; - private static final com.dfsek.terra.api.gaea.math.FastNoiseLite CELLULAR_LOOKUP_DEFAULT = new com.dfsek.terra.api.gaea.math.FastNoiseLite(); - private com.dfsek.terra.api.gaea.math.FastNoiseLite cellularNoiseLookup = CELLULAR_LOOKUP_DEFAULT; + private static final com.dfsek.terra.api.math.FastNoiseLite CELLULAR_LOOKUP_DEFAULT = new com.dfsek.terra.api.math.FastNoiseLite(); + private com.dfsek.terra.api.math.FastNoiseLite cellularNoiseLookup = CELLULAR_LOOKUP_DEFAULT; - public com.dfsek.terra.api.gaea.math.FastNoiseLite getCellularNoiseLookup() { + public com.dfsek.terra.api.math.FastNoiseLite getCellularNoiseLookup() { return cellularNoiseLookup; } - public void setCellularNoiseLookup(com.dfsek.terra.api.gaea.math.FastNoiseLite cellularNoiseLookup) { + public void setCellularNoiseLookup(com.dfsek.terra.api.math.FastNoiseLite cellularNoiseLookup) { this.cellularNoiseLookup = cellularNoiseLookup; } diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator.java b/common/src/main/java/com/dfsek/terra/api/math/Interpolator.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator.java rename to common/src/main/java/com/dfsek/terra/api/math/Interpolator.java index 816db0aa8..f445ce25e 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator.java +++ b/common/src/main/java/com/dfsek/terra/api/math/Interpolator.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.math; +package com.dfsek.terra.api.math; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator3.java b/common/src/main/java/com/dfsek/terra/api/math/Interpolator3.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator3.java rename to common/src/main/java/com/dfsek/terra/api/math/Interpolator3.java index 9583d3634..2711d2c2e 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/math/Interpolator3.java +++ b/common/src/main/java/com/dfsek/terra/api/math/Interpolator3.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.math; +package com.dfsek.terra.api.math; /** * Class for bilinear interpolation of values arranged on a unit square. diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/math/MathUtil.java b/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java similarity index 94% rename from common/src/main/java/com/dfsek/terra/api/gaea/math/MathUtil.java rename to common/src/main/java/com/dfsek/terra/api/math/MathUtil.java index 296f9be59..b2313758b 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/math/MathUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.gaea.math; +package com.dfsek.terra.api.math; -import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.util.FastRandom; import net.jafama.FastMath; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java b/common/src/main/java/com/dfsek/terra/api/math/ProbabilityCollection.java similarity index 90% rename from common/src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java rename to common/src/main/java/com/dfsek/terra/api/math/ProbabilityCollection.java index 5cc12b5a2..982c88438 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/math/ProbabilityCollection.java +++ b/common/src/main/java/com/dfsek/terra/api/math/ProbabilityCollection.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.math; +package com.dfsek.terra.api.math; import com.dfsek.terra.api.world.biome.NormalizationUtil; @@ -13,7 +13,7 @@ public class ProbabilityCollection { private Object[] array = new Object[0]; private int size; - public com.dfsek.terra.api.gaea.math.ProbabilityCollection add(E item, int probability) { + public com.dfsek.terra.api.math.ProbabilityCollection add(E item, int probability) { if(!cont.contains(item)) size++; cont.add(item); int oldLength = array.length; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/math/Range.java b/common/src/main/java/com/dfsek/terra/api/math/Range.java similarity index 65% rename from common/src/main/java/com/dfsek/terra/api/gaea/math/Range.java rename to common/src/main/java/com/dfsek/terra/api/math/Range.java index a5f855716..6c5d3174a 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/math/Range.java +++ b/common/src/main/java/com/dfsek/terra/api/math/Range.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.math; +package com.dfsek.terra.api.math; import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; @@ -24,7 +24,7 @@ public class Range implements Iterable { return max; } - public com.dfsek.terra.api.gaea.math.Range setMax(int max) { + public com.dfsek.terra.api.math.Range setMax(int max) { this.max = max; return this; } @@ -33,7 +33,7 @@ public class Range implements Iterable { return min; } - public com.dfsek.terra.api.gaea.math.Range setMin(int min) { + public com.dfsek.terra.api.math.Range setMin(int min) { this.min = min; return this; } @@ -42,35 +42,35 @@ public class Range implements Iterable { return max - min; } - public com.dfsek.terra.api.gaea.math.Range multiply(int mult) { + public com.dfsek.terra.api.math.Range multiply(int mult) { min *= mult; max *= mult; return this; } - public com.dfsek.terra.api.gaea.math.Range reflect(int pt) { - return new com.dfsek.terra.api.gaea.math.Range(2 * pt - this.getMax(), 2 * pt - this.getMin()); + public com.dfsek.terra.api.math.Range reflect(int pt) { + return new com.dfsek.terra.api.math.Range(2 * pt - this.getMax(), 2 * pt - this.getMin()); } public int get(Random r) { return r.nextInt((max - min) + 1) + min; } - public com.dfsek.terra.api.gaea.math.Range intersects(com.dfsek.terra.api.gaea.math.Range other) { + public com.dfsek.terra.api.math.Range intersects(com.dfsek.terra.api.math.Range other) { try { - return new com.dfsek.terra.api.gaea.math.Range(FastMath.max(this.getMin(), other.getMin()), FastMath.min(this.getMax(), other.getMax())); + return new com.dfsek.terra.api.math.Range(FastMath.max(this.getMin(), other.getMin()), FastMath.min(this.getMax(), other.getMax())); } catch(IllegalArgumentException e) { return null; } } - public com.dfsek.terra.api.gaea.math.Range add(int add) { + public com.dfsek.terra.api.math.Range add(int add) { this.min += add; this.max += add; return this; } - public com.dfsek.terra.api.gaea.math.Range sub(int sub) { + public com.dfsek.terra.api.math.Range sub(int sub) { this.min -= sub; this.max -= sub; return this; @@ -88,8 +88,8 @@ public class Range implements Iterable { @Override public boolean equals(Object obj) { - if(! (obj instanceof com.dfsek.terra.api.gaea.math.Range)) return false; - com.dfsek.terra.api.gaea.math.Range other = (com.dfsek.terra.api.gaea.math.Range) obj; + if(!(obj instanceof com.dfsek.terra.api.math.Range)) return false; + com.dfsek.terra.api.math.Range other = (com.dfsek.terra.api.math.Range) obj; return other.getMin() == this.getMin() && other.getMax() == this.getMax(); } @@ -100,10 +100,10 @@ public class Range implements Iterable { } private static class RangeIterator implements Iterator { - private final com.dfsek.terra.api.gaea.math.Range m; + private final com.dfsek.terra.api.math.Range m; private Integer current; - public RangeIterator(com.dfsek.terra.api.gaea.math.Range m) { + public RangeIterator(com.dfsek.terra.api.math.Range m) { this.m = m; current = m.getMin(); } diff --git a/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java b/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java index fcf5acf55..b47890b4a 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java @@ -2,7 +2,7 @@ package com.dfsek.terra.api.platform; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.LoaderRegistrar; -import com.dfsek.terra.api.gaea.lang.Language; +import com.dfsek.terra.api.lang.Language; import com.dfsek.terra.api.platform.inventory.ItemHandle; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.WorldHandle; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/DataHolder.java b/common/src/main/java/com/dfsek/terra/api/profiler/DataHolder.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/api/gaea/profiler/DataHolder.java rename to common/src/main/java/com/dfsek/terra/api/profiler/DataHolder.java index 6d47d52cb..14fa9b1b3 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/DataHolder.java +++ b/common/src/main/java/com/dfsek/terra/api/profiler/DataHolder.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.profiler; +package com.dfsek.terra.api.profiler; /** * Class to hold a profiler data value. Contains formatting method to highlight value based on desired range. diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/DataType.java b/common/src/main/java/com/dfsek/terra/api/profiler/DataType.java similarity index 93% rename from common/src/main/java/com/dfsek/terra/api/gaea/profiler/DataType.java rename to common/src/main/java/com/dfsek/terra/api/profiler/DataType.java index fe7a69204..70f6c5fd1 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/DataType.java +++ b/common/src/main/java/com/dfsek/terra/api/profiler/DataType.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.profiler; +package com.dfsek.terra.api.profiler; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java b/common/src/main/java/com/dfsek/terra/api/profiler/Desire.java similarity index 80% rename from common/src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java rename to common/src/main/java/com/dfsek/terra/api/profiler/Desire.java index ee2ba541d..43aae5a47 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/Desire.java +++ b/common/src/main/java/com/dfsek/terra/api/profiler/Desire.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.profiler; +package com.dfsek.terra.api.profiler; /** diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/Measurement.java b/common/src/main/java/com/dfsek/terra/api/profiler/Measurement.java similarity index 94% rename from common/src/main/java/com/dfsek/terra/api/gaea/profiler/Measurement.java rename to common/src/main/java/com/dfsek/terra/api/profiler/Measurement.java index b6782a626..a212215e0 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/Measurement.java +++ b/common/src/main/java/com/dfsek/terra/api/profiler/Measurement.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.gaea.profiler; +package com.dfsek.terra.api.profiler; -import com.dfsek.terra.api.gaea.math.MathUtil; -import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.math.MathUtil; +import com.dfsek.terra.api.util.GlueList; import net.jafama.FastMath; import java.math.BigInteger; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/ProfileFuture.java b/common/src/main/java/com/dfsek/terra/api/profiler/ProfileFuture.java similarity index 88% rename from common/src/main/java/com/dfsek/terra/api/gaea/profiler/ProfileFuture.java rename to common/src/main/java/com/dfsek/terra/api/profiler/ProfileFuture.java index c23b9a9d6..724d82707 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/ProfileFuture.java +++ b/common/src/main/java/com/dfsek/terra/api/profiler/ProfileFuture.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.profiler; +package com.dfsek.terra.api.profiler; import java.util.concurrent.CompletableFuture; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java b/common/src/main/java/com/dfsek/terra/api/profiler/WorldProfiler.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java rename to common/src/main/java/com/dfsek/terra/api/profiler/WorldProfiler.java index 5c3bee6f8..74933b223 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/profiler/WorldProfiler.java +++ b/common/src/main/java/com/dfsek/terra/api/profiler/WorldProfiler.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.profiler; +package com.dfsek.terra.api.profiler; import com.dfsek.terra.api.platform.world.World; import com.google.common.collect.BiMap; @@ -49,7 +49,7 @@ public class WorldProfiler { } } - public com.dfsek.terra.api.gaea.profiler.WorldProfiler addMeasurement(Measurement m, String name) { + public com.dfsek.terra.api.profiler.WorldProfiler addMeasurement(Measurement m, String name) { measures.put(name, m); return this; } diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/util/FastRandom.java b/common/src/main/java/com/dfsek/terra/api/util/FastRandom.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/api/gaea/util/FastRandom.java rename to common/src/main/java/com/dfsek/terra/api/util/FastRandom.java index f2cc8ad3a..66d9023e7 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/util/FastRandom.java +++ b/common/src/main/java/com/dfsek/terra/api/util/FastRandom.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.util; +package com.dfsek.terra.api.util; import org.apache.commons.rng.core.source64.XoRoShiRo128PlusPlus; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/util/GlueList.java b/common/src/main/java/com/dfsek/terra/api/util/GlueList.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/api/gaea/util/GlueList.java rename to common/src/main/java/com/dfsek/terra/api/util/GlueList.java index 80b2ef54d..e75d47777 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/util/GlueList.java +++ b/common/src/main/java/com/dfsek/terra/api/util/GlueList.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.dfsek.terra.api.gaea.util; +package com.dfsek.terra.api.util; import java.io.IOException; import java.io.ObjectInputStream; @@ -702,6 +702,59 @@ public class GlueList extends AbstractList implements List, Cloneable, return new Itr(); } + @SuppressWarnings("unchecked") + @Override + public Object clone() { + + try { + com.dfsek.terra.api.util.GlueList clone = (com.dfsek.terra.api.util.GlueList) super.clone(); + + clone.first = clone.last = null; + + int capacity = min(MAX_ARRAY_SIZE, max(clone.size, max(clone.initialCapacity, DEFAULT_CAPACITY))); + + Node initNode = new Node<>(null, null, 0, capacity); + + clone.initialCapacity = capacity; + + clone.first = clone.last = initNode; + + clone.modCount = 0; + clone.size = 0; + + for(Node node = first; node != null; node = node.next) { + + for(int i = 0; i < node.elementDataPointer; i++) { + clone.add(node.elementData[i]); + } + } + + return clone; + } catch(CloneNotSupportedException e) { + throw new InternalError(); + } + } + + @Override + public ListIterator listIterator(int index) { + + checkPositionIndex(index); + + return new ListItr(index); + } + + private void checkPositionIndex(int index) { + + if(!(index >= 0 && index <= size)) { + throw new ArrayIndexOutOfBoundsException(index); + } + } + + @Override + public ListIterator listIterator() { + return new ListItr(0); + } + private class Itr implements Iterator { Node node = first; @@ -761,7 +814,7 @@ public class GlueList extends AbstractList implements List, Cloneable, checkForComodification(); try { - com.dfsek.terra.api.gaea.util.GlueList.this.remove(lastReturn); + com.dfsek.terra.api.util.GlueList.this.remove(lastReturn); j = lastReturn; @@ -785,23 +838,8 @@ public class GlueList extends AbstractList implements List, Cloneable, } @Override - public ListIterator listIterator(int index) { - - checkPositionIndex(index); - - return new ListItr(index); - } - - private void checkPositionIndex(int index) { - - if (!(index >= 0 && index <= size)) { - throw new ArrayIndexOutOfBoundsException(index); - } - } - - @Override - public ListIterator listIterator() { - return new ListItr(0); + public int size() { + return size; } private class ListItr extends Itr implements ListIterator { @@ -886,7 +924,7 @@ public class GlueList extends AbstractList implements List, Cloneable, checkForComodification(); try { - com.dfsek.terra.api.gaea.util.GlueList.this.set(lastReturn, t); + com.dfsek.terra.api.util.GlueList.this.set(lastReturn, t); } catch (IndexOutOfBoundsException e) { throw new ConcurrentModificationException(); } @@ -900,7 +938,7 @@ public class GlueList extends AbstractList implements List, Cloneable, try { int temp = j; - com.dfsek.terra.api.gaea.util.GlueList.this.add(temp, t); + com.dfsek.terra.api.util.GlueList.this.add(temp, t); j = temp + 1; @@ -916,44 +954,6 @@ public class GlueList extends AbstractList implements List, Cloneable, } } - @Override - public int size() { - return size; - } - - @SuppressWarnings("unchecked") - @Override - public Object clone() { - - try { - com.dfsek.terra.api.gaea.util.GlueList clone = (com.dfsek.terra.api.gaea.util.GlueList) super.clone(); - - clone.first = clone.last = null; - - int capacity = min(MAX_ARRAY_SIZE, max(clone.size, max(clone.initialCapacity, DEFAULT_CAPACITY))); - - Node initNode = new Node<>(null, null, 0, capacity); - - clone.initialCapacity = capacity; - - clone.first = clone.last = initNode; - - clone.modCount = 0; - clone.size = 0; - - for (Node node = first; node != null; node = node.next) { - - for (int i = 0; i < node.elementDataPointer; i++) { - clone.add(node.elementData[i]); - } - } - - return clone; - } catch (CloneNotSupportedException e) { - throw new InternalError(); - } - } - private void writeObject(ObjectOutputStream s) throws IOException { int expectedModCount = modCount; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/util/JarUtil.java b/common/src/main/java/com/dfsek/terra/api/util/JarUtil.java similarity index 94% rename from common/src/main/java/com/dfsek/terra/api/gaea/util/JarUtil.java rename to common/src/main/java/com/dfsek/terra/api/util/JarUtil.java index 716adf022..9109cacfd 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/util/JarUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/util/JarUtil.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.gaea.util; +package com.dfsek.terra.api.util; -import com.dfsek.terra.api.gaea.Debug; +import com.dfsek.terra.debug.Debug; import java.io.File; import java.io.FileOutputStream; diff --git a/common/src/main/java/com/dfsek/terra/api/util/SerializationUtil.java b/common/src/main/java/com/dfsek/terra/api/util/SerializationUtil.java new file mode 100644 index 000000000..3b6c781ec --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/util/SerializationUtil.java @@ -0,0 +1,70 @@ +package com.dfsek.terra.api.util; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.ObjectStreamClass; +import java.io.Serializable; +import java.lang.reflect.Field; + +public class SerializationUtil { + public static Object fromFile(File f) throws IOException, ClassNotFoundException { + ObjectInputStream ois = new MovedObjectInputStream(new FileInputStream(f), "org.polydev.gaea", "com.dfsek.terra.api.gaea"); // Backwards compat with old Gaea location + Object o = ois.readObject(); + ois.close(); + return o; + } + + public static void toFile(Serializable o, File f) throws IOException { + ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f)); + oos.writeObject(o); + oos.close(); + } + + public static class MovedObjectInputStream extends ObjectInputStream { + private final String oldNameSpace; + private final String newNameSpace; + + public MovedObjectInputStream(InputStream in, String oldNameSpace, String newNameSpace) throws IOException { + super(in); + this.oldNameSpace = oldNameSpace; + this.newNameSpace = newNameSpace; + } + + @Override + protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException { + ObjectStreamClass result = super.readClassDescriptor(); + try { + if(result.getName().contains(oldNameSpace)) { + String newClassName = result.getName().replace(oldNameSpace, newNameSpace); + Class localClass = Class.forName(newClassName); + + Field nameField = ObjectStreamClass.class.getDeclaredField("name"); + nameField.setAccessible(true); + nameField.set(result, newClassName); + + ObjectStreamClass localClassDescriptor = ObjectStreamClass.lookup(localClass); + Field suidField = ObjectStreamClass.class.getDeclaredField("suid"); + suidField.setAccessible(true); + suidField.set(result, localClassDescriptor.getSerialVersionUID()); + } + } catch(Exception e) { + throw new IOException("Exception when trying to replace namespace", e); + } + return result; + } + + @Override + protected Class resolveClass(ObjectStreamClass desc) throws IOException, ClassNotFoundException { + if(desc.getName().contains(oldNameSpace)) { + String newClassName = desc.getName().replace(oldNameSpace, newNameSpace); + return Class.forName(newClassName); + } + return super.resolveClass(desc); + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java b/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java index 4b5029872..7e742791e 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.world.biome; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.api.world.generation.GenerationPhase; diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/Decorator.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Decorator.java index c301a30ef..ff0bf1ab1 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/Decorator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/Decorator.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.world.biome; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.tree.Tree; public abstract class Decorator { diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java index 18b09aec2..fe9f93133 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.world.biome; -import com.dfsek.terra.api.gaea.math.Interpolator; +import com.dfsek.terra.api.math.Interpolator; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; diff --git a/common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java b/common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java index 39717170c..d478c93b0 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java +++ b/common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.world.carving; -import com.dfsek.terra.api.gaea.math.MathUtil; -import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.util.FastRandom; import net.jafama.FastMath; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java b/common/src/main/java/com/dfsek/terra/api/world/flora/Flora.java similarity index 79% rename from common/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java rename to common/src/main/java/com/dfsek/terra/api/world/flora/Flora.java index 051302a47..412ad91f8 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/world/Flora.java +++ b/common/src/main/java/com/dfsek/terra/api/world/flora/Flora.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.gaea.world; +package com.dfsek.terra.api.world.flora; -import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.block.Block; import com.dfsek.terra.api.platform.world.vector.Location; diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java b/common/src/main/java/com/dfsek/terra/api/world/generation/population/ChunkCoordinate.java similarity index 74% rename from common/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java rename to common/src/main/java/com/dfsek/terra/api/world/generation/population/ChunkCoordinate.java index ea39f6ccf..bffc444e5 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/population/ChunkCoordinate.java +++ b/common/src/main/java/com/dfsek/terra/api/world/generation/population/ChunkCoordinate.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea.population; +package com.dfsek.terra.api.world.generation.population; import com.dfsek.terra.api.platform.world.Chunk; @@ -43,8 +43,8 @@ public class ChunkCoordinate implements Serializable { @Override public boolean equals(Object obj) { - if(! (obj instanceof com.dfsek.terra.api.gaea.population.ChunkCoordinate)) return false; - com.dfsek.terra.api.gaea.population.ChunkCoordinate other = (com.dfsek.terra.api.gaea.population.ChunkCoordinate) obj; + if(!(obj instanceof com.dfsek.terra.api.world.generation.population.ChunkCoordinate)) return false; + com.dfsek.terra.api.world.generation.population.ChunkCoordinate other = (com.dfsek.terra.api.world.generation.population.ChunkCoordinate) obj; return other.getX() == x && other.getZ() == z; } } diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java b/common/src/main/java/com/dfsek/terra/api/world/generation/population/PopulationManager.java similarity index 91% rename from common/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java rename to common/src/main/java/com/dfsek/terra/api/world/generation/population/PopulationManager.java index 4f2b0470b..4be710a6b 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/population/PopulationManager.java +++ b/common/src/main/java/com/dfsek/terra/api/world/generation/population/PopulationManager.java @@ -1,14 +1,14 @@ -package com.dfsek.terra.api.gaea.population; +package com.dfsek.terra.api.world.generation.population; import com.dfsek.terra.api.gaea.Gaea; -import com.dfsek.terra.api.gaea.profiler.ProfileFuture; -import com.dfsek.terra.api.gaea.profiler.WorldProfiler; -import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.api.gaea.util.GlueList; -import com.dfsek.terra.api.gaea.util.SerializationUtil; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.profiler.ProfileFuture; +import com.dfsek.terra.api.profiler.WorldProfiler; +import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.api.util.GlueList; +import com.dfsek.terra.api.util.SerializationUtil; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import org.jetbrains.annotations.NotNull; diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java index 378213a60..5d6fda126 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.world.palette; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.util.GlueList; import java.util.List; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java index 16c9552be..c08b7843a 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.world.palette; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.math.FastNoiseLite; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/TreeGeometry.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/TreeGeometry.java index 50a75b583..76448614d 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/TreeGeometry.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/TreeGeometry.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.world.tree.fractal; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.api.platform.world.vector.Vector3; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java index 8e6a8c443..821334611 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.world.tree.fractal.trees; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.WorldHandle; import com.dfsek.terra.api.platform.world.block.BlockData; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java index fffb78e1e..6010cac19 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.world.tree.fractal.trees; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.WorldHandle; import com.dfsek.terra.api.platform.world.block.BlockData; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java index e6fc319e3..5777458d0 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.world.tree.fractal.trees; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.WorldHandle; import com.dfsek.terra.api.platform.world.block.BlockData; diff --git a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java index 684ddb2c3..de9f0050b 100644 --- a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java +++ b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.world.biome.BiomeGrid; import com.dfsek.terra.api.world.biome.NormalizationUtil; import com.dfsek.terra.config.base.ConfigPack; diff --git a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java index ecd09c4cd..c39647214 100644 --- a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java +++ b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.palette; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.world.block.BlockData; import org.jetbrains.annotations.NotNull; diff --git a/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java b/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java index f488b2df4..56783a7fd 100644 --- a/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java +++ b/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.postprocessing; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.platform.world.vector.Vector2; /** diff --git a/common/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java b/common/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java index ee56f6a86..09491ed5b 100644 --- a/common/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java +++ b/common/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.postprocessing; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.math.FastNoiseLite; import net.jafama.FastMath; /** diff --git a/common/src/main/java/com/dfsek/terra/carving/CarverCache.java b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java index 78f731a0b..fc05399a9 100644 --- a/common/src/main/java/com/dfsek/terra/carving/CarverCache.java +++ b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java @@ -1,11 +1,11 @@ package com.dfsek.terra.carving; -import com.dfsek.terra.api.gaea.math.MathUtil; -import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.carving.Worm; import com.dfsek.terra.api.world.generation.GenerationPhase; diff --git a/common/src/main/java/com/dfsek/terra/carving/CarverPalette.java b/common/src/main/java/com/dfsek/terra/carving/CarverPalette.java index 98511814c..68b8b23ae 100644 --- a/common/src/main/java/com/dfsek/terra/carving/CarverPalette.java +++ b/common/src/main/java/com/dfsek/terra/carving/CarverPalette.java @@ -1,6 +1,6 @@ package com.dfsek.terra.carving; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java b/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java index 0a7fc66b1..0cfecebd9 100644 --- a/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java +++ b/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java @@ -1,10 +1,10 @@ package com.dfsek.terra.carving; -import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.carving.Carver; import com.dfsek.terra.api.world.carving.Worm; import com.dfsek.terra.api.world.generation.GenerationPhase; diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 1b60d7c83..51a55a721 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -6,10 +6,10 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.LoaderRegistrar; -import com.dfsek.terra.api.gaea.structures.loot.LootTable; -import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.loot.LootTable; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.biome.UserDefinedBiome; diff --git a/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java b/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java index 6e6405e3c..c8ef7c82b 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java @@ -5,8 +5,8 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.terra.api.gaea.util.JarUtil; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.util.JarUtil; import com.dfsek.terra.debug.Debug; import java.io.File; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java index 4b0859672..b06a9e0ae 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java @@ -1,6 +1,6 @@ package com.dfsek.terra.config.factories; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.ConfigPack; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java index 54c33cbd6..214cf0b2e 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/CarverFactory.java @@ -1,7 +1,7 @@ package com.dfsek.terra.config.factories; import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.terra.api.gaea.math.MathUtil; +import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java index 5f42dda4d..dfe6a7428 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java @@ -1,9 +1,9 @@ package com.dfsek.terra.config.factories; -import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.api.gaea.world.Flora; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.RandomPalette; import com.dfsek.terra.biome.palette.PaletteLayer; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java index 1abc6a4cd..acd2b2675 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java @@ -1,9 +1,9 @@ package com.dfsek.terra.config.factories; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.RandomPalette; import com.dfsek.terra.api.world.palette.SimplexPalette; diff --git a/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java b/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java index 1e77d26da..72daa5d9e 100644 --- a/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java +++ b/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java @@ -1,6 +1,6 @@ package com.dfsek.terra.config.lang; -import com.dfsek.terra.api.gaea.lang.Language; +import com.dfsek.terra.api.lang.Language; import com.dfsek.terra.api.platform.CommandSender; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.debug.Debug; @@ -12,7 +12,7 @@ import java.util.jar.JarFile; import java.util.logging.Level; import java.util.logging.Logger; -import static com.dfsek.terra.api.gaea.util.JarUtil.copyResourcesToDirectory; +import static com.dfsek.terra.api.util.JarUtil.copyResourcesToDirectory; public final class LangUtil { private static Language language; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java index f4c0c5ce0..bca5044e8 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.loaders; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.gaea.structures.loot.LootTable; +import com.dfsek.terra.api.loot.LootTable; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.config.files.Loader; import org.apache.commons.io.IOUtils; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java index 06e95c3bf..dbff2f29b 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/ProbabilityCollectionLoader.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.loaders; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.math.ProbabilityCollection; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java index 8cd7abed8..7b0913ba7 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/RangeLoader.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.loaders; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.math.Range; import java.lang.reflect.Type; import java.util.Map; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/Types.java b/common/src/main/java/com/dfsek/terra/config/loaders/Types.java index 1dd9f266f..24a94aab2 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/Types.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/Types.java @@ -1,9 +1,9 @@ package com.dfsek.terra.config.loaders; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.tree.Tree; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java index 645f3c6c9..b8875427b 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java @@ -3,10 +3,10 @@ package com.dfsek.terra.config.loaders.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.config.loaders.Types; import com.dfsek.terra.generation.items.flora.FloraLayer; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java index 690e9dd63..e8bb0c922 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java @@ -5,7 +5,7 @@ import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.generation.config.NoiseBuilder; import java.lang.reflect.Type; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java index de649dfb6..74c39d19a 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.loaders.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.generation.items.ores.OreConfig; import java.lang.reflect.Type; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java index 754a5dac4..57154ffa1 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java @@ -3,9 +3,9 @@ package com.dfsek.terra.config.loaders.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.config.loaders.Types; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java index 5b6ed4182..d8861f64e 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.config.Configuration; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.config.loaders.Types; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java index bfa0949d6..c057b7ad6 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.loaders.palette; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.loaders.Types; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index 38fc7cdb1..c4001496c 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -5,11 +5,11 @@ import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; -import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Biome; import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.biome.palette.SinglePalette; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java index c781c910e..58a3823c2 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java index 36a958207..0bea84ffd 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.generation.items.ores.Ore; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java index 52928dae2..05b5c4634 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java @@ -3,10 +3,10 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.gaea.structures.loot.LootTable; -import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.loot.LootTable; +import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.procgen.GridSpawn; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java index 66651bb47..67f0f6a41 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.util.MaterialSet; @SuppressWarnings({"unused", "FieldMayBeFinal"}) diff --git a/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java b/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java index 4a8d38489..099691ece 100644 --- a/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java +++ b/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation; -import com.dfsek.terra.api.gaea.math.Interpolator; +import com.dfsek.terra.api.math.Interpolator; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.config.WorldGenerator; diff --git a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java index fc822e326..f1224954b 100644 --- a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java @@ -1,8 +1,7 @@ package com.dfsek.terra.generation; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.math.ChunkInterpolator3; -import com.dfsek.terra.api.gaea.profiler.ProfileFuture; +import com.dfsek.terra.api.math.ChunkInterpolator3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.BiomeGrid; @@ -15,6 +14,7 @@ import com.dfsek.terra.api.platform.world.block.data.Slab; import com.dfsek.terra.api.platform.world.block.data.Stairs; import com.dfsek.terra.api.platform.world.block.data.Waterlogged; import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.profiler.ProfileFuture; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.api.world.palette.Palette; diff --git a/common/src/main/java/com/dfsek/terra/generation/Sampler.java b/common/src/main/java/com/dfsek/terra/generation/Sampler.java index 3189e2272..eabf7e914 100644 --- a/common/src/main/java/com/dfsek/terra/generation/Sampler.java +++ b/common/src/main/java/com/dfsek/terra/generation/Sampler.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation; -import com.dfsek.terra.api.gaea.math.ChunkInterpolator3; +import com.dfsek.terra.api.math.ChunkInterpolator3; import net.jafama.FastMath; public class Sampler { diff --git a/common/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java b/common/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java index 6d9a5336b..26859c9aa 100644 --- a/common/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java +++ b/common/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java @@ -1,8 +1,8 @@ package com.dfsek.terra.generation; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.world.biome.Decorator; +import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.tree.Tree; public class UserDefinedDecorator extends Decorator { diff --git a/common/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java b/common/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java index 4d1082de3..1423a2706 100644 --- a/common/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java +++ b/common/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java @@ -3,7 +3,7 @@ package com.dfsek.terra.generation.config; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.math.FastNoiseLite; public class NoiseBuilder implements ConfigTemplate { @Value("type") diff --git a/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java index 7a3ef9214..b22650f22 100644 --- a/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation.config; -import com.dfsek.terra.api.gaea.math.Interpolator; +import com.dfsek.terra.api.math.Interpolator; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.api.world.biome.Generator; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java b/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java index 65c5049f6..993cbb5f2 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java @@ -1,8 +1,8 @@ package com.dfsek.terra.generation.items; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.vector.Vector2; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java index 31ea03cc2..2119d038d 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java @@ -1,8 +1,8 @@ package com.dfsek.terra.generation.items; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.gaea.structures.loot.LootTable; +import com.dfsek.terra.api.loot.LootTable; +import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.procgen.GridSpawn; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java index 8d7fb72e6..2f0829b4e 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java @@ -1,13 +1,13 @@ package com.dfsek.terra.generation.items.flora; -import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.gaea.util.GlueList; -import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.block.Block; import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.api.platform.world.block.BlockFace; import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.util.GlueList; +import com.dfsek.terra.api.world.flora.Flora; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java index 9c3dce121..3ea361cc4 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java @@ -1,13 +1,13 @@ package com.dfsek.terra.generation.items.flora; -import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.gaea.util.GlueList; -import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.block.Block; import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.api.platform.world.block.BlockFace; import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.util.GlueList; +import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.util.MaterialSet; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java index 57dea8995..7ad35a482 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java @@ -1,11 +1,11 @@ package com.dfsek.terra.generation.items.flora; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.vector.Vector2; +import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.generation.items.PlaceableLayer; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java index 06109bca6..74b2960de 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java @@ -1,9 +1,6 @@ package com.dfsek.terra.generation.items.flora; -import com.dfsek.terra.api.gaea.math.Range; -import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.api.gaea.util.GlueList; -import com.dfsek.terra.api.gaea.world.Flora; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.WorldHandle; @@ -14,6 +11,9 @@ import com.dfsek.terra.api.platform.world.block.data.Directional; import com.dfsek.terra.api.platform.world.block.data.MultipleFacing; import com.dfsek.terra.api.platform.world.block.data.Rotatable; import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.api.util.GlueList; +import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java index 070b26687..909167310 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java @@ -1,7 +1,7 @@ package com.dfsek.terra.generation.items.ores; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.WorldHandle; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java index b8f4c5a75..a8bde759d 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation.items.ores; -import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.math.Range; public class OreConfig { private final Range amount; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java index d3f19d63e..a7d585b8f 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation.items.ores; -import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.util.GlueList; import java.util.List; import java.util.function.BiConsumer; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java index cf654d96f..2a49ade0d 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation.items.ores; -import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.WorldHandle; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index b97bb645f..efca2cc06 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation.items.tree; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.api.world.tree.Tree; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java b/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java index 29eafb6aa..f07320ab0 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java @@ -1,8 +1,8 @@ package com.dfsek.terra.generation.items.tree; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; -import com.dfsek.terra.api.gaea.math.ProbabilityCollection; -import com.dfsek.terra.api.gaea.math.Range; +import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.block.Block; import com.dfsek.terra.api.platform.world.block.BlockFace; diff --git a/common/src/main/java/com/dfsek/terra/math/NoiseFunction2.java b/common/src/main/java/com/dfsek/terra/math/NoiseFunction2.java index a9760aeda..31208cb9b 100644 --- a/common/src/main/java/com/dfsek/terra/math/NoiseFunction2.java +++ b/common/src/main/java/com/dfsek/terra/math/NoiseFunction2.java @@ -1,6 +1,6 @@ package com.dfsek.terra.math; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.generation.config.NoiseBuilder; import com.dfsek.terra.util.hash.HashMapDoubleDouble; import parsii.eval.Expression; diff --git a/common/src/main/java/com/dfsek/terra/math/NoiseFunction3.java b/common/src/main/java/com/dfsek/terra/math/NoiseFunction3.java index fbd2fd02e..ac5bfb3b4 100644 --- a/common/src/main/java/com/dfsek/terra/math/NoiseFunction3.java +++ b/common/src/main/java/com/dfsek/terra/math/NoiseFunction3.java @@ -1,6 +1,6 @@ package com.dfsek.terra.math; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.generation.config.NoiseBuilder; import parsii.eval.Expression; diff --git a/common/src/main/java/com/dfsek/terra/math/RandomFunction.java b/common/src/main/java/com/dfsek/terra/math/RandomFunction.java index 3dde8768d..775856c81 100644 --- a/common/src/main/java/com/dfsek/terra/math/RandomFunction.java +++ b/common/src/main/java/com/dfsek/terra/math/RandomFunction.java @@ -1,13 +1,13 @@ package com.dfsek.terra.math; -import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.util.FastRandom; import parsii.eval.Expression; import parsii.eval.Function; import java.util.List; /** - * Provides access to a PRNG ({@link com.dfsek.terra.api.gaea.util.FastRandom}) + * Provides access to a PRNG ({@link com.dfsek.terra.api.util.FastRandom}) *

* Takes 1 argument, which sets the seed */ diff --git a/common/src/main/java/com/dfsek/terra/population/CavePopulator.java b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java index bf5f83b72..c5515dbf9 100644 --- a/common/src/main/java/com/dfsek/terra/population/CavePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java @@ -1,7 +1,6 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; @@ -10,6 +9,7 @@ import com.dfsek.terra.api.platform.world.block.Block; import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.profiler.ProfileFuture; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; diff --git a/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java index 7d54b761d..d9ce0415f 100644 --- a/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -1,11 +1,11 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.vector.Vector2; +import com.dfsek.terra.api.profiler.ProfileFuture; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.biome.UserDefinedBiome; diff --git a/common/src/main/java/com/dfsek/terra/population/OrePopulator.java b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java index 3e4148846..7a0316ffe 100644 --- a/common/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -1,13 +1,13 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.math.MathUtil; -import com.dfsek.terra.api.gaea.profiler.ProfileFuture; -import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.profiler.ProfileFuture; +import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; diff --git a/common/src/main/java/com/dfsek/terra/population/TreePopulator.java b/common/src/main/java/com/dfsek/terra/population/TreePopulator.java index b5039c469..1e6e69c18 100644 --- a/common/src/main/java/com/dfsek/terra/population/TreePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/TreePopulator.java @@ -1,11 +1,11 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.gaea.profiler.ProfileFuture; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.vector.Vector2; +import com.dfsek.terra.api.profiler.ProfileFuture; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.biome.UserDefinedBiome; diff --git a/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java b/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java index 19a2f9d2b..ec627de58 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java +++ b/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java @@ -1,9 +1,9 @@ package com.dfsek.terra.procgen; -import com.dfsek.terra.api.gaea.math.MathUtil; -import com.dfsek.terra.api.gaea.util.FastRandom; -import com.dfsek.terra.api.gaea.util.GlueList; +import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.api.util.GlueList; import java.util.List; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java index 40e0c5133..dbb48c253 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java @@ -1,6 +1,6 @@ package com.dfsek.terra.procgen.voxel; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.platform.world.vector.Vector3; public class DeformedSphere extends VoxelGeometry { diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java index 27c896e81..291a8c419 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.procgen.voxel; -import com.dfsek.terra.api.gaea.util.GlueList; import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.util.GlueList; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java b/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java index 131743c75..3a5fbf447 100644 --- a/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java @@ -1,9 +1,9 @@ package com.dfsek.terra.registry; -import com.dfsek.terra.api.gaea.world.Flora; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.generation.items.flora.ConstantFlora; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/util/PopulationUtil.java b/common/src/main/java/com/dfsek/terra/util/PopulationUtil.java index 2d5c85ff6..ec668dcf5 100644 --- a/common/src/main/java/com/dfsek/terra/util/PopulationUtil.java +++ b/common/src/main/java/com/dfsek/terra/util/PopulationUtil.java @@ -1,8 +1,8 @@ package com.dfsek.terra.util; -import com.dfsek.terra.api.gaea.math.MathUtil; -import com.dfsek.terra.api.gaea.util.FastRandom; +import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.util.FastRandom; public final class PopulationUtil { public static FastRandom getRandom(Chunk c) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 7304ad9ac..c88bf4ad8 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -3,7 +3,7 @@ package com.dfsek.terra.bukkit; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.GenericLoaders; -import com.dfsek.terra.api.gaea.lang.Language; +import com.dfsek.terra.api.lang.Language; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.Tree; import com.dfsek.terra.api.platform.inventory.ItemHandle; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java index ffd3f8234..976294abb 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.command.command.geometry; -import com.dfsek.terra.api.gaea.math.FastNoiseLite; +import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitPlayer; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java index 49f65acec..84ae1624a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.command.command.profile; -import com.dfsek.terra.api.gaea.profiler.WorldProfiler; +import com.dfsek.terra.api.profiler.WorldProfiler; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.WorldCommand; import org.bukkit.World; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java index bf0c812f8..f86224dc9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.command.command.profile; -import com.dfsek.terra.api.gaea.profiler.WorldProfiler; +import com.dfsek.terra.api.profiler.WorldProfiler; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.WorldCommand; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java index 2a9f36b96..8a6a077a2 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.command.command.profile; -import com.dfsek.terra.api.gaea.profiler.WorldProfiler; +import com.dfsek.terra.api.profiler.WorldProfiler; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.WorldCommand; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java index c6be1276b..2477d52ae 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.command.command.profile; -import com.dfsek.terra.api.gaea.profiler.WorldProfiler; +import com.dfsek.terra.api.profiler.WorldProfiler; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.WorldCommand; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index 99a66ae3c..9f938d71c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -1,10 +1,10 @@ package com.dfsek.terra.bukkit.generator; -import com.dfsek.terra.api.gaea.population.PopulationManager; import com.dfsek.terra.api.platform.Handle; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; +import com.dfsek.terra.api.world.generation.population.PopulationManager; import com.dfsek.terra.bukkit.BukkitBiomeGrid; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.config.lang.LangUtil; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 588672056..d93a99ef9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -3,7 +3,7 @@ package com.dfsek.terra.fabric; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.GenericLoaders; -import com.dfsek.terra.api.gaea.lang.Language; +import com.dfsek.terra.api.lang.Language; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.inventory.ItemHandle; import com.dfsek.terra.api.platform.world.World; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index 3592216f9..f25e68d2e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -1,7 +1,7 @@ package com.dfsek.terra.fabric.world.generator; -import com.dfsek.terra.api.gaea.util.FastRandom; import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.world.TerraBiomeSource; From 24697ae60f7bb08dda4e4284ff92fc199bb7c86b Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 18 Dec 2020 19:57:42 -0700 Subject: [PATCH 066/210] Refactor API --- .../main/java/com/dfsek/terra/api/Entity.java | 2 +- .../java/com/dfsek/terra/api/loot/Entry.java | 2 +- .../ChunkInterpolator3.java | 2 +- .../{ => interpolation}/Interpolator.java | 2 +- .../{ => interpolation}/Interpolator3.java | 2 +- .../world => math}/vector/Location.java | 4 ++-- .../world => math}/vector/Vector2.java | 2 +- .../world => math}/vector/Vector3.java | 2 +- .../dfsek/terra/api/platform/block/Axis.java | 5 +++++ .../api/platform/{world => }/block/Block.java | 4 ++-- .../platform/{world => }/block/BlockData.java | 2 +- .../platform/{world => }/block/BlockFace.java | 4 ++-- .../{world => }/block/MaterialData.java | 2 +- .../block/data/AnaloguePowerable.java | 4 ++-- .../{world => }/block/data/Bisected.java | 4 ++-- .../api/platform/block/data/Directional.java | 10 +++++++++ .../block/data/MultipleFacing.java | 6 ++--- .../api/platform/block/data/Orientable.java | 14 ++++++++++++ .../platform/{world => }/block/data/Rail.java | 4 ++-- .../{world => }/block/data/RedstoneWire.java | 6 ++--- .../api/platform/block/data/Rotatable.java | 10 +++++++++ .../platform/{world => }/block/data/Slab.java | 2 +- .../{world => }/block/data/Stairs.java | 2 +- .../platform/{world => }/block/data/Wall.java | 6 ++--- .../{world => }/block/data/Waterlogged.java | 4 ++-- .../api/platform/block/state/BlockState.java | 4 ++++ .../platform/generator/ChunkGenerator.java | 2 +- .../api/platform/inventory/ItemHandle.java | 2 +- .../api/platform/inventory/ItemStack.java | 2 +- .../dfsek/terra/api/platform/world/Chunk.java | 2 +- .../dfsek/terra/api/platform/world/World.java | 4 ++-- .../terra/api/platform/world/WorldHandle.java | 6 ++--- .../terra/api/platform/world/block/Axis.java | 5 ----- .../world/block/data/Directional.java | 10 --------- .../platform/world/block/data/Orientable.java | 14 ------------ .../platform/world/block/data/Rotatable.java | 10 --------- .../world/block/state/BlockState.java | 4 ---- .../terra/api/world/biome/BiomeGrid.java | 2 +- .../terra/api/world/biome/Generator.java | 4 ++-- .../dfsek/terra/api/world/carving/Carver.java | 2 +- .../dfsek/terra/api/world/carving/Worm.java | 2 +- .../dfsek/terra/api/world/flora/Flora.java | 4 ++-- .../com/dfsek/terra/api/world/tree/Tree.java | 4 ++-- .../world/tree/fractal/EntitySpawnHolder.java | 2 +- .../api/world/tree/fractal/FractalTree.java | 4 ++-- .../api/world/tree/fractal/TreeGeometry.java | 6 ++--- .../api/world/tree/fractal/trees/Cactus.java | 4 ++-- .../world/tree/fractal/trees/IceSpike.java | 6 ++--- .../api/world/tree/fractal/trees/OakTree.java | 6 ++--- .../tree/fractal/trees/ShatteredPillar.java | 4 ++-- .../tree/fractal/trees/ShatteredTree.java | 6 ++--- .../fractal/trees/SmallShatteredPillar.java | 4 ++-- .../fractal/trees/SmallShatteredTree.java | 6 ++--- .../world/tree/fractal/trees/SpruceTree.java | 6 ++--- .../dfsek/terra/async/AsyncBiomeFinder.java | 4 ++-- .../dfsek/terra/async/AsyncFeatureFinder.java | 4 ++-- .../terra/biome/grid/SingleBiomeGrid.java | 2 +- .../terra/biome/grid/UserDefinedGrid.java | 2 +- .../grid/master/TerraRadialBiomeGrid.java | 4 ++-- .../grid/master/TerraStandardBiomeGrid.java | 4 ++-- .../terra/biome/palette/PaletteHolder.java | 2 +- .../biome/palette/PaletteHolderBuilder.java | 2 +- .../terra/biome/palette/PaletteLayer.java | 2 +- .../postprocessing/CoordinatePerturb.java | 2 +- .../com/dfsek/terra/carving/CarverCache.java | 2 +- .../dfsek/terra/carving/CarverPalette.java | 4 ++-- .../terra/carving/UserDefinedCarver.java | 2 +- .../terra/config/factories/FloraFactory.java | 2 +- .../terra/config/factories/OreFactory.java | 2 +- .../config/factories/PaletteFactory.java | 2 +- .../config/loaders/MaterialSetLoader.java | 2 +- .../com/dfsek/terra/config/loaders/Types.java | 4 ++-- .../loaders/palette/CarverPaletteLoader.java | 2 +- .../loaders/palette/PaletteHolderLoader.java | 2 +- .../loaders/palette/PaletteLayerLoader.java | 2 +- .../terra/config/templates/BiomeTemplate.java | 4 ++-- .../config/templates/CarverTemplate.java | 2 +- .../terra/config/templates/OreTemplate.java | 2 +- .../generation/ElevationInterpolator.java | 2 +- .../generation/MasterChunkGenerator.java | 18 +++++++-------- .../com/dfsek/terra/generation/Sampler.java | 2 +- .../generation/config/WorldGenerator.java | 4 ++-- .../generation/items/PlaceableLayer.java | 2 +- .../generation/items/flora/BlockFlora.java | 8 +++---- .../generation/items/flora/ConstantFlora.java | 8 +++---- .../generation/items/flora/FloraLayer.java | 2 +- .../generation/items/flora/TerraFlora.java | 14 ++++++------ .../items/ores/DeformedSphereOre.java | 6 ++--- .../terra/generation/items/ores/Ore.java | 4 ++-- .../generation/items/ores/VanillaOre.java | 6 ++--- .../generation/items/tree/TerraTree.java | 2 +- .../generation/items/tree/TreeLayer.java | 6 ++--- .../dfsek/terra/population/CavePopulator.java | 8 +++---- .../terra/population/FloraPopulator.java | 2 +- .../dfsek/terra/population/OrePopulator.java | 2 +- .../dfsek/terra/population/TreePopulator.java | 2 +- .../com/dfsek/terra/procgen/GridSpawn.java | 2 +- .../dfsek/terra/procgen/pixel/Polygon.java | 2 +- .../dfsek/terra/procgen/pixel/Rectangle.java | 2 +- .../dfsek/terra/procgen/voxel/Cylinder.java | 2 +- .../terra/procgen/voxel/DeformedSphere.java | 2 +- .../com/dfsek/terra/procgen/voxel/Sphere.java | 2 +- .../com/dfsek/terra/procgen/voxel/Tube.java | 2 +- .../terra/procgen/voxel/VoxelGeometry.java | 2 +- .../dfsek/terra/registry/FloraRegistry.java | 4 ++-- .../dfsek/terra/registry/PaletteRegistry.java | 2 +- .../dfsek/terra/registry/TreeRegistry.java | 6 ++--- .../com/dfsek/terra/util/MaterialSet.java | 4 ++-- .../com/dfsek/terra/util/PaletteUtil.java | 2 +- .../java/com/dfsek/terra/util/TagUtil.java | 2 +- .../com/dfsek/terra/bukkit/BukkitChunk.java | 2 +- .../dfsek/terra/bukkit/BukkitItemHandle.java | 2 +- .../dfsek/terra/bukkit/BukkitItemStack.java | 2 +- .../com/dfsek/terra/bukkit/BukkitPlayer.java | 2 +- .../com/dfsek/terra/bukkit/BukkitTree.java | 4 ++-- .../com/dfsek/terra/bukkit/BukkitWorld.java | 4 ++-- .../dfsek/terra/bukkit/BukkitWorldHandle.java | 6 ++--- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 4 ++-- .../geometry/DeformedSphereCommand.java | 2 +- .../command/geometry/SphereCommand.java | 2 +- .../command/command/geometry/TubeCommand.java | 2 +- .../generator/BukkitChunkGenerator.java | 2 +- .../terra/bukkit/structure/RotationUtil.java | 22 +++++++++---------- .../terra/bukkit/util/BukkitConversions.java | 4 ++-- .../terra/bukkit/world/block/BukkitBlock.java | 10 ++++----- .../bukkit/world/block/BukkitBlockData.java | 4 ++-- .../world/block/BukkitMaterialData.java | 4 ++-- .../world/block/data/BukkitEnumAdapter.java | 8 +++---- .../block/data/BukkitMultipleFacing.java | 4 ++-- .../bukkit/world/block/data/BukkitSlab.java | 2 +- .../bukkit/world/block/data/BukkitStairs.java | 4 ++-- .../world/block/data/BukkitWaterlogged.java | 2 +- .../world/block/data/TerraEnumAdapter.java | 8 +++---- .../dfsek/terra/fabric/TerraFabricPlugin.java | 4 ++-- .../fabric/inventory/FabricItemHandle.java | 2 +- .../fabric/inventory/FabricItemStack.java | 2 +- .../terra/fabric/world/FabricAdapters.java | 2 +- .../dfsek/terra/fabric/world/FabricTree.java | 4 ++-- .../terra/fabric/world/FabricWorldHandle.java | 6 ++--- .../terra/fabric/world/block/FabricBlock.java | 10 ++++----- .../fabric/world/block/FabricBlockData.java | 4 ++-- .../world/block/FabricMaterialData.java | 4 ++-- .../world/block/data/FabricEnumAdapter.java | 8 +++---- .../block/data/FabricMultipleFacing.java | 4 ++-- .../fabric/world/block/data/FabricSlab.java | 2 +- .../fabric/world/block/data/FabricStairs.java | 4 ++-- .../world/block/data/FabricWaterlogged.java | 2 +- .../world/block/data/TerraEnumAdapter.java | 8 +++---- .../world/generator/FabricChunkData.java | 2 +- .../fabric/world/handles/FabricWorld.java | 4 ++-- .../world/handles/chunk/FabricChunk.java | 2 +- .../handles/chunk/FabricChunkWorldAccess.java | 2 +- .../world/FabricSeededWorldAccess.java | 4 ++-- .../handles/world/FabricWorldAccess.java | 4 ++-- .../handles/world/FabricWorldChunkRegion.java | 4 ++-- 155 files changed, 317 insertions(+), 317 deletions(-) rename common/src/main/java/com/dfsek/terra/api/math/{ => interpolation}/ChunkInterpolator3.java (98%) rename common/src/main/java/com/dfsek/terra/api/math/{ => interpolation}/Interpolator.java (97%) rename common/src/main/java/com/dfsek/terra/api/math/{ => interpolation}/Interpolator3.java (97%) rename common/src/main/java/com/dfsek/terra/api/{platform/world => math}/vector/Location.java (95%) rename common/src/main/java/com/dfsek/terra/api/{platform/world => math}/vector/Vector2.java (98%) rename common/src/main/java/com/dfsek/terra/api/{platform/world => math}/vector/Vector3.java (99%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/block/Axis.java rename common/src/main/java/com/dfsek/terra/api/platform/{world => }/block/Block.java (79%) rename common/src/main/java/com/dfsek/terra/api/platform/{world => }/block/BlockData.java (80%) rename common/src/main/java/com/dfsek/terra/api/platform/{world => }/block/BlockFace.java (97%) rename common/src/main/java/com/dfsek/terra/api/platform/{world => }/block/MaterialData.java (85%) rename common/src/main/java/com/dfsek/terra/api/platform/{world => }/block/data/AnaloguePowerable.java (54%) rename common/src/main/java/com/dfsek/terra/api/platform/{world => }/block/data/Bisected.java (75%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/block/data/Directional.java rename common/src/main/java/com/dfsek/terra/api/platform/{world => }/block/data/MultipleFacing.java (57%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/block/data/Orientable.java rename common/src/main/java/com/dfsek/terra/api/platform/{world => }/block/data/Rail.java (75%) rename common/src/main/java/com/dfsek/terra/api/platform/{world => }/block/data/RedstoneWire.java (61%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/block/data/Rotatable.java rename common/src/main/java/com/dfsek/terra/api/platform/{world => }/block/data/Slab.java (72%) rename common/src/main/java/com/dfsek/terra/api/platform/{world => }/block/data/Stairs.java (92%) rename common/src/main/java/com/dfsek/terra/api/platform/{world => }/block/data/Wall.java (58%) rename common/src/main/java/com/dfsek/terra/api/platform/{world => }/block/data/Waterlogged.java (53%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/block/state/BlockState.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/block/Axis.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Directional.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Orientable.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Rotatable.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/block/state/BlockState.java diff --git a/common/src/main/java/com/dfsek/terra/api/Entity.java b/common/src/main/java/com/dfsek/terra/api/Entity.java index 353aac09b..7f3ea7514 100644 --- a/common/src/main/java/com/dfsek/terra/api/Entity.java +++ b/common/src/main/java/com/dfsek/terra/api/Entity.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Handle; -import com.dfsek.terra.api.platform.world.vector.Location; public interface Entity extends Handle { Location getLocation(); diff --git a/common/src/main/java/com/dfsek/terra/api/loot/Entry.java b/common/src/main/java/com/dfsek/terra/api/loot/Entry.java index e35e7ca97..59528eb38 100644 --- a/common/src/main/java/com/dfsek/terra/api/loot/Entry.java +++ b/common/src/main/java/com/dfsek/terra/api/loot/Entry.java @@ -4,8 +4,8 @@ import com.dfsek.terra.api.loot.functions.AmountFunction; import com.dfsek.terra.api.loot.functions.DamageFunction; import com.dfsek.terra.api.loot.functions.Function; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.inventory.ItemStack; -import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.api.util.GlueList; import net.jafama.FastMath; import org.json.simple.JSONArray; diff --git a/common/src/main/java/com/dfsek/terra/api/math/ChunkInterpolator3.java b/common/src/main/java/com/dfsek/terra/api/math/interpolation/ChunkInterpolator3.java similarity index 98% rename from common/src/main/java/com/dfsek/terra/api/math/ChunkInterpolator3.java rename to common/src/main/java/com/dfsek/terra/api/math/interpolation/ChunkInterpolator3.java index dfe615abc..a5f3f9b9b 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/ChunkInterpolator3.java +++ b/common/src/main/java/com/dfsek/terra/api/math/interpolation/ChunkInterpolator3.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.math; +package com.dfsek.terra.api.math.interpolation; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.biome.BiomeGrid; diff --git a/common/src/main/java/com/dfsek/terra/api/math/Interpolator.java b/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/api/math/Interpolator.java rename to common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator.java index f445ce25e..00466b9b9 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/Interpolator.java +++ b/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.math; +package com.dfsek.terra.api.math.interpolation; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/api/math/Interpolator3.java b/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator3.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/api/math/Interpolator3.java rename to common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator3.java index 2711d2c2e..4ef669a59 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/Interpolator3.java +++ b/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator3.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.math; +package com.dfsek.terra.api.math.interpolation; /** * Class for bilinear interpolation of values arranged on a unit square. diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/vector/Location.java b/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/api/platform/world/vector/Location.java rename to common/src/main/java/com/dfsek/terra/api/math/vector/Location.java index fa46861ed..38e67bc13 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/vector/Location.java +++ b/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.platform.world.vector; +package com.dfsek.terra.api.math.vector; +import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.block.Block; public class Location implements Cloneable { private World world; diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/vector/Vector2.java b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java similarity index 98% rename from common/src/main/java/com/dfsek/terra/api/platform/world/vector/Vector2.java rename to common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java index 52e8753fc..d9d9bddba 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/vector/Vector2.java +++ b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.platform.world.vector; +package com.dfsek.terra.api.math.vector; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/vector/Vector3.java b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java similarity index 99% rename from common/src/main/java/com/dfsek/terra/api/platform/world/vector/Vector3.java rename to common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java index 0363e95d5..cdba56120 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/vector/Vector3.java +++ b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.platform.world.vector; +package com.dfsek.terra.api.math.vector; import com.dfsek.terra.api.platform.world.World; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/api/platform/block/Axis.java b/common/src/main/java/com/dfsek/terra/api/platform/block/Axis.java new file mode 100644 index 000000000..38236b3b1 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/Axis.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.api.platform.block; + +public enum Axis { + X, Y, Z +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/Block.java b/common/src/main/java/com/dfsek/terra/api/platform/block/Block.java similarity index 79% rename from common/src/main/java/com/dfsek/terra/api/platform/world/block/Block.java rename to common/src/main/java/com/dfsek/terra/api/platform/block/Block.java index 8eedc7495..c29b982aa 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/Block.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.platform.world.block; +package com.dfsek.terra.api.platform.block; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Handle; -import com.dfsek.terra.api.platform.world.vector.Location; public interface Block extends Handle { void setBlockData(BlockData data, boolean physics); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/BlockData.java b/common/src/main/java/com/dfsek/terra/api/platform/block/BlockData.java similarity index 80% rename from common/src/main/java/com/dfsek/terra/api/platform/world/block/BlockData.java rename to common/src/main/java/com/dfsek/terra/api/platform/block/BlockData.java index fc73956ad..de2434e04 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/BlockData.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/BlockData.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.platform.world.block; +package com.dfsek.terra.api.platform.block; import com.dfsek.terra.api.platform.Handle; diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/BlockFace.java b/common/src/main/java/com/dfsek/terra/api/platform/block/BlockFace.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/api/platform/world/block/BlockFace.java rename to common/src/main/java/com/dfsek/terra/api/platform/block/BlockFace.java index ad6032345..4f9bcb904 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/BlockFace.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/BlockFace.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.platform.world.block; +package com.dfsek.terra.api.platform.block; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.math.vector.Vector3; import org.jetbrains.annotations.NotNull; public enum BlockFace { diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/MaterialData.java b/common/src/main/java/com/dfsek/terra/api/platform/block/MaterialData.java similarity index 85% rename from common/src/main/java/com/dfsek/terra/api/platform/world/block/MaterialData.java rename to common/src/main/java/com/dfsek/terra/api/platform/block/MaterialData.java index db99a0e29..c5f3037b1 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/MaterialData.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/MaterialData.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.platform.world.block; +package com.dfsek.terra.api.platform.block; import com.dfsek.terra.api.platform.Handle; diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/AnaloguePowerable.java b/common/src/main/java/com/dfsek/terra/api/platform/block/data/AnaloguePowerable.java similarity index 54% rename from common/src/main/java/com/dfsek/terra/api/platform/world/block/data/AnaloguePowerable.java rename to common/src/main/java/com/dfsek/terra/api/platform/block/data/AnaloguePowerable.java index af14b8f24..7c9ea0a7e 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/AnaloguePowerable.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/data/AnaloguePowerable.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.platform.world.block.data; +package com.dfsek.terra.api.platform.block.data; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; public interface AnaloguePowerable extends BlockData { int getMaximumPower(); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Bisected.java b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Bisected.java similarity index 75% rename from common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Bisected.java rename to common/src/main/java/com/dfsek/terra/api/platform/block/data/Bisected.java index 02eb2d86b..a1061e33b 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Bisected.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Bisected.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.platform.world.block.data; +package com.dfsek.terra.api.platform.block.data; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; public interface Bisected extends BlockData { Half getHalf(); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/block/data/Directional.java b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Directional.java new file mode 100644 index 000000000..6857121e3 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Directional.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.platform.block.data; + +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; + +public interface Directional extends BlockData { + BlockFace getFacing(); + + void setFacing(BlockFace facing); +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/MultipleFacing.java b/common/src/main/java/com/dfsek/terra/api/platform/block/data/MultipleFacing.java similarity index 57% rename from common/src/main/java/com/dfsek/terra/api/platform/world/block/data/MultipleFacing.java rename to common/src/main/java/com/dfsek/terra/api/platform/block/data/MultipleFacing.java index c9982384c..bf57c54d4 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/MultipleFacing.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/data/MultipleFacing.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.platform.world.block.data; +package com.dfsek.terra.api.platform.block.data; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; import java.util.Set; diff --git a/common/src/main/java/com/dfsek/terra/api/platform/block/data/Orientable.java b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Orientable.java new file mode 100644 index 000000000..ff3cf79e3 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Orientable.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.api.platform.block.data; + +import com.dfsek.terra.api.platform.block.Axis; +import com.dfsek.terra.api.platform.block.BlockData; + +import java.util.Set; + +public interface Orientable extends BlockData { + Set getAxes(); + + Axis getAxis(); + + void setAxis(Axis axis); +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Rail.java b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Rail.java similarity index 75% rename from common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Rail.java rename to common/src/main/java/com/dfsek/terra/api/platform/block/data/Rail.java index b3e7d1275..4436d11fb 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Rail.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Rail.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.platform.world.block.data; +package com.dfsek.terra.api.platform.block.data; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; public interface Rail extends BlockData { Shape getShape(); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/RedstoneWire.java b/common/src/main/java/com/dfsek/terra/api/platform/block/data/RedstoneWire.java similarity index 61% rename from common/src/main/java/com/dfsek/terra/api/platform/world/block/data/RedstoneWire.java rename to common/src/main/java/com/dfsek/terra/api/platform/block/data/RedstoneWire.java index fe11ac2b5..6f9602de8 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/RedstoneWire.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/data/RedstoneWire.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.platform.world.block.data; +package com.dfsek.terra.api.platform.block.data; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; import java.util.Set; diff --git a/common/src/main/java/com/dfsek/terra/api/platform/block/data/Rotatable.java b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Rotatable.java new file mode 100644 index 000000000..58f23989e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Rotatable.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.platform.block.data; + +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; + +public interface Rotatable extends BlockData { + BlockFace getRotation(); + + void setRotation(BlockFace face); +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Slab.java b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Slab.java similarity index 72% rename from common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Slab.java rename to common/src/main/java/com/dfsek/terra/api/platform/block/data/Slab.java index f9e12cf94..d813c8938 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Slab.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Slab.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.platform.world.block.data; +package com.dfsek.terra.api.platform.block.data; public interface Slab extends Waterlogged { Type getType(); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Stairs.java b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Stairs.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Stairs.java rename to common/src/main/java/com/dfsek/terra/api/platform/block/data/Stairs.java index c79b79a9c..9ed5382aa 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Stairs.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Stairs.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.platform.world.block.data; +package com.dfsek.terra.api.platform.block.data; public interface Stairs extends Waterlogged, Directional, Bisected { Shape getShape(); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Wall.java b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Wall.java similarity index 58% rename from common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Wall.java rename to common/src/main/java/com/dfsek/terra/api/platform/block/data/Wall.java index bf9279fbd..5d891a0da 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Wall.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Wall.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.api.platform.world.block.data; +package com.dfsek.terra.api.platform.block.data; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; public interface Wall extends BlockData, Waterlogged { boolean isUp(); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Waterlogged.java b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Waterlogged.java similarity index 53% rename from common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Waterlogged.java rename to common/src/main/java/com/dfsek/terra/api/platform/block/data/Waterlogged.java index 06e5c126c..3d5d3fed8 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Waterlogged.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/data/Waterlogged.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.api.platform.world.block.data; +package com.dfsek.terra.api.platform.block.data; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; public interface Waterlogged extends BlockData { boolean isWaterlogged(); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/block/state/BlockState.java b/common/src/main/java/com/dfsek/terra/api/platform/block/state/BlockState.java new file mode 100644 index 000000000..b5fc693ce --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/state/BlockState.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.platform.block.state; + +public interface BlockState { +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/generator/ChunkGenerator.java b/common/src/main/java/com/dfsek/terra/api/platform/generator/ChunkGenerator.java index 15a770772..7f85e9c15 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/generator/ChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/generator/ChunkGenerator.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.platform.generator; import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.BiomeGrid; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemHandle.java b/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemHandle.java index b77f8f707..a812cbc18 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemHandle.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemHandle.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.platform.inventory; -import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.block.MaterialData; public interface ItemHandle { ItemStack newItemStack(MaterialData material, int amount); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemStack.java b/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemStack.java index 9350ea6a6..95b1d299a 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemStack.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemStack.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.platform.inventory; import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.inventory.item.ItemMeta; -import com.dfsek.terra.api.platform.world.block.MaterialData; public interface ItemStack extends Handle, Cloneable { int getAmount(); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/Chunk.java b/common/src/main/java/com/dfsek/terra/api/platform/world/Chunk.java index 81f5cf972..edd1f63a3 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/Chunk.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/Chunk.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.platform.world; import com.dfsek.terra.api.platform.Handle; -import com.dfsek.terra.api.platform.world.block.Block; +import com.dfsek.terra.api.platform.block.Block; public interface Chunk extends Handle { int getX(); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/World.java b/common/src/main/java/com/dfsek/terra/api/platform/world/World.java index d7833fa59..38e5acd61 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/World.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/World.java @@ -1,11 +1,11 @@ package com.dfsek.terra.api.platform.world; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Entity; import com.dfsek.terra.api.platform.Handle; import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.vector.Location; import java.io.File; import java.util.UUID; diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/WorldHandle.java b/common/src/main/java/com/dfsek/terra/api/platform/world/WorldHandle.java index 397fc61f9..9f0cb7559 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/WorldHandle.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/WorldHandle.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.platform.world; import com.dfsek.terra.api.platform.Tree; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; /** * Interface to be implemented for world manipulation. diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/Axis.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/Axis.java deleted file mode 100644 index 8a5b2d61d..000000000 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/Axis.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.dfsek.terra.api.platform.world.block; - -public enum Axis { - X, Y, Z -} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Directional.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Directional.java deleted file mode 100644 index 0ca549f47..000000000 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Directional.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dfsek.terra.api.platform.world.block.data; - -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.BlockFace; - -public interface Directional extends BlockData { - BlockFace getFacing(); - - void setFacing(BlockFace facing); -} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Orientable.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Orientable.java deleted file mode 100644 index 91861f611..000000000 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Orientable.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dfsek.terra.api.platform.world.block.data; - -import com.dfsek.terra.api.platform.world.block.Axis; -import com.dfsek.terra.api.platform.world.block.BlockData; - -import java.util.Set; - -public interface Orientable extends BlockData { - Set getAxes(); - - Axis getAxis(); - - void setAxis(Axis axis); -} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Rotatable.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Rotatable.java deleted file mode 100644 index c2111889e..000000000 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/data/Rotatable.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.dfsek.terra.api.platform.world.block.data; - -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.BlockFace; - -public interface Rotatable extends BlockData { - BlockFace getRotation(); - - void setRotation(BlockFace face); -} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/block/state/BlockState.java b/common/src/main/java/com/dfsek/terra/api/platform/world/block/state/BlockState.java deleted file mode 100644 index 6ef98f014..000000000 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/block/state/BlockState.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra.api.platform.world.block.state; - -public interface BlockState { -} diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java b/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java index 7e742791e..9857369ea 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.world.biome; import com.dfsek.terra.api.math.FastNoiseLite; -import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.world.generation.GenerationPhase; public abstract class BiomeGrid { diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java index fe9f93133..1dd2b7310 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.world.biome; -import com.dfsek.terra.api.math.Interpolator; +import com.dfsek.terra.api.math.interpolation.Interpolator; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; public abstract class Generator { diff --git a/common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java b/common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java index d478c93b0..e7d75133a 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java +++ b/common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.world.carving; import com.dfsek.terra.api.math.MathUtil; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.api.util.FastRandom; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/api/world/carving/Worm.java b/common/src/main/java/com/dfsek/terra/api/world/carving/Worm.java index 7cc0748de..71e2b0de5 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/carving/Worm.java +++ b/common/src/main/java/com/dfsek/terra/api/world/carving/Worm.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.world.carving; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.math.vector.Vector3; import net.jafama.FastMath; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/world/flora/Flora.java b/common/src/main/java/com/dfsek/terra/api/world/flora/Flora.java index 412ad91f8..82d57f9b0 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/flora/Flora.java +++ b/common/src/main/java/com/dfsek/terra/api/world/flora/Flora.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.world.flora; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.vector.Location; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/Tree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/Tree.java index 98d23a7ff..47221fd20 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/Tree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/Tree.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.world.tree; -import com.dfsek.terra.api.platform.world.block.MaterialData; -import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.MaterialData; import java.util.Random; import java.util.Set; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/EntitySpawnHolder.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/EntitySpawnHolder.java index e32fda49c..e51941c19 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/EntitySpawnHolder.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/EntitySpawnHolder.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.world.tree.fractal; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Entity; -import com.dfsek.terra.api.platform.world.vector.Location; import java.util.function.Consumer; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/FractalTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/FractalTree.java index 93398a6e2..9269012ab 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/FractalTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/FractalTree.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.world.tree.fractal; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Entity; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.util.MaterialSet; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/TreeGeometry.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/TreeGeometry.java index 76448614d..bd9ac089b 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/TreeGeometry.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/TreeGeometry.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.world.tree.fractal; import com.dfsek.terra.api.math.ProbabilityCollection; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.vector.Location; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.platform.block.BlockData; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/Cactus.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/Cactus.java index 1e8f37202..e7a965ccb 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/Cactus.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/Cactus.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.world.tree.fractal.trees; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java index 821334611..35b1d0c83 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java @@ -1,11 +1,11 @@ package com.dfsek.terra.api.world.tree.fractal.trees; import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.WorldHandle; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.vector.Location; -import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.api.world.tree.fractal.TreeGeometry; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/OakTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/OakTree.java index 6f04e9c71..4a24b7a90 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/OakTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/OakTree.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.world.tree.fractal.trees; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.vector.Location; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.api.world.tree.fractal.TreeGeometry; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredPillar.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredPillar.java index 3d5281200..a1ceafdb5 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredPillar.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredPillar.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.world.tree.fractal.trees; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java index 6010cac19..a65f54538 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java @@ -1,11 +1,11 @@ package com.dfsek.terra.api.world.tree.fractal.trees; import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.WorldHandle; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.vector.Location; -import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.api.world.tree.fractal.TreeGeometry; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredPillar.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredPillar.java index 447547435..423a5ed7c 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredPillar.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredPillar.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.world.tree.fractal.trees; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java index 5777458d0..575542912 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java @@ -1,11 +1,11 @@ package com.dfsek.terra.api.world.tree.fractal.trees; import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.WorldHandle; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.vector.Location; -import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.api.world.tree.fractal.TreeGeometry; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SpruceTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SpruceTree.java index bb38a51ca..640cd6177 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SpruceTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SpruceTree.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.world.tree.fractal.trees; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.vector.Location; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.api.world.tree.fractal.TreeGeometry; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java b/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java index 754898bf3..52f6fad9e 100644 --- a/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java +++ b/common/src/main/java/com/dfsek/terra/async/AsyncBiomeFinder.java @@ -1,8 +1,8 @@ package com.dfsek.terra.async; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.vector.Location; -import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; diff --git a/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java b/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java index 38adb5cb5..c3c9f7941 100644 --- a/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java +++ b/common/src/main/java/com/dfsek/terra/async/AsyncFeatureFinder.java @@ -1,9 +1,9 @@ package com.dfsek.terra.async; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.vector.Location; -import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import org.jetbrains.annotations.NotNull; diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java index 7b35af473..682bdff9b 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/SingleBiomeGrid.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.grid; -import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.BiomeGrid; import com.dfsek.terra.api.world.generation.GenerationPhase; diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java index 8794a4ded..520ae5809 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.grid; -import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.BiomeGrid; import com.dfsek.terra.api.world.biome.NormalizationUtil; diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java index fc673cd11..08fb334eb 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java @@ -1,7 +1,7 @@ package com.dfsek.terra.biome.grid.master; -import com.dfsek.terra.api.platform.world.vector.Location; -import com.dfsek.terra.api.platform.world.vector.Vector2; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.BiomeGrid; import com.dfsek.terra.api.world.generation.GenerationPhase; diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java index b3250ef7c..06dd5f865 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java @@ -1,7 +1,7 @@ package com.dfsek.terra.biome.grid.master; -import com.dfsek.terra.api.platform.world.vector.Location; -import com.dfsek.terra.api.platform.world.vector.Vector2; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.BiomeZone; diff --git a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java index 11c6142de..27a86a10e 100644 --- a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java +++ b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolder.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.palette; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; public class PaletteHolder { diff --git a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java index 9d4068bab..f615b1edd 100644 --- a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java +++ b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteHolderBuilder.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.palette; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java index c39647214..56953b1b2 100644 --- a/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java +++ b/common/src/main/java/com/dfsek/terra/biome/palette/PaletteLayer.java @@ -1,7 +1,7 @@ package com.dfsek.terra.biome.palette; import com.dfsek.terra.api.math.ProbabilityCollection; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; import org.jetbrains.annotations.NotNull; public class PaletteLayer { diff --git a/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java b/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java index 56783a7fd..e7d488ca5 100644 --- a/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java +++ b/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java @@ -1,7 +1,7 @@ package com.dfsek.terra.biome.postprocessing; import com.dfsek.terra.api.math.FastNoiseLite; -import com.dfsek.terra.api.platform.world.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector2; /** * Offset a coordinate pair by an amount. diff --git a/common/src/main/java/com/dfsek/terra/carving/CarverCache.java b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java index fc05399a9..6dcbcfe9f 100644 --- a/common/src/main/java/com/dfsek/terra/carving/CarverCache.java +++ b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java @@ -1,9 +1,9 @@ package com.dfsek.terra.carving; import com.dfsek.terra.api.math.MathUtil; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.world.biome.Biome; diff --git a/common/src/main/java/com/dfsek/terra/carving/CarverPalette.java b/common/src/main/java/com/dfsek/terra/carving/CarverPalette.java index 68b8b23ae..249c36957 100644 --- a/common/src/main/java/com/dfsek/terra/carving/CarverPalette.java +++ b/common/src/main/java/com/dfsek/terra/carving/CarverPalette.java @@ -1,8 +1,8 @@ package com.dfsek.terra.carving; import com.dfsek.terra.api.math.ProbabilityCollection; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.util.MaterialSet; import java.util.Map; diff --git a/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java b/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java index 0cfecebd9..a633e10cc 100644 --- a/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java +++ b/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java @@ -1,9 +1,9 @@ package com.dfsek.terra.carving; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.carving.Carver; import com.dfsek.terra.api.world.carving.Worm; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java index dfe6a7428..fbea4bce3 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java @@ -1,7 +1,7 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.Palette; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/OreFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/OreFactory.java index 487477623..766dee868 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/OreFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/OreFactory.java @@ -1,7 +1,7 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.config.templates.OreTemplate; import com.dfsek.terra.generation.items.ores.DeformedSphereOre; import com.dfsek.terra.generation.items.ores.Ore; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java index acd2b2675..a7a484a64 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java @@ -2,7 +2,7 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.RandomPalette; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java index 1a0534454..7fa6275a9 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.loaders; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.util.MaterialSet; import java.lang.reflect.Type; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/Types.java b/common/src/main/java/com/dfsek/terra/config/loaders/Types.java index 24a94aab2..d4f0d17cc 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/Types.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/Types.java @@ -1,8 +1,8 @@ package com.dfsek.terra.config.loaders; import com.dfsek.terra.api.math.ProbabilityCollection; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.tree.Tree; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java index d8861f64e..ed5bd12fb 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/palette/CarverPaletteLoader.java @@ -5,7 +5,7 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.math.ProbabilityCollection; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.config.loaders.Types; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java index 6df7319cb..6b5fc82a8 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteHolderLoader.java @@ -3,7 +3,7 @@ package com.dfsek.terra.config.loaders.palette; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.biome.palette.PaletteHolderBuilder; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java index c057b7ad6..6513bef8d 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/palette/PaletteLayerLoader.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.math.ProbabilityCollection; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.loaders.Types; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index c4001496c..1500f1d26 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -6,9 +6,9 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.world.Biome; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java index 58a3823c2..4f9bf1b12 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/CarverTemplate.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.api.math.Range; -import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.carving.CarverPalette; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java index 0bea84ffd..4a54387ba 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.api.math.Range; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.generation.items.ores.Ore; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java b/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java index 099691ece..ba4867c21 100644 --- a/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java +++ b/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation; -import com.dfsek.terra.api.math.Interpolator; +import com.dfsek.terra.api.math.interpolation.Interpolator; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.config.WorldGenerator; diff --git a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java index f1224954b..7dff5c0cb 100644 --- a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java @@ -1,19 +1,19 @@ package com.dfsek.terra.generation; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.math.ChunkInterpolator3; +import com.dfsek.terra.api.math.interpolation.ChunkInterpolator3; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.MaterialData; +import com.dfsek.terra.api.platform.block.data.Bisected; +import com.dfsek.terra.api.platform.block.data.Slab; +import com.dfsek.terra.api.platform.block.data.Stairs; +import com.dfsek.terra.api.platform.block.data.Waterlogged; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.BiomeGrid; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.block.MaterialData; -import com.dfsek.terra.api.platform.world.block.data.Bisected; -import com.dfsek.terra.api.platform.world.block.data.Slab; -import com.dfsek.terra.api.platform.world.block.data.Stairs; -import com.dfsek.terra.api.platform.world.block.data.Waterlogged; -import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.api.profiler.ProfileFuture; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.generation.GenerationPhase; diff --git a/common/src/main/java/com/dfsek/terra/generation/Sampler.java b/common/src/main/java/com/dfsek/terra/generation/Sampler.java index eabf7e914..8fbc1f00d 100644 --- a/common/src/main/java/com/dfsek/terra/generation/Sampler.java +++ b/common/src/main/java/com/dfsek/terra/generation/Sampler.java @@ -1,6 +1,6 @@ package com.dfsek.terra.generation; -import com.dfsek.terra.api.math.ChunkInterpolator3; +import com.dfsek.terra.api.math.interpolation.ChunkInterpolator3; import net.jafama.FastMath; public class Sampler { diff --git a/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java index b22650f22..b05e8eb11 100644 --- a/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java @@ -1,8 +1,8 @@ package com.dfsek.terra.generation.config; -import com.dfsek.terra.api.math.Interpolator; +import com.dfsek.terra.api.math.interpolation.Interpolator; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java b/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java index 993cbb5f2..646484e60 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java @@ -3,8 +3,8 @@ package com.dfsek.terra.generation.items; import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.vector.Vector2; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java index 2f0829b4e..39da6e3ce 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java @@ -1,11 +1,11 @@ package com.dfsek.terra.generation.items.flora; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.world.flora.Flora; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java index 3ea361cc4..8644cdbc9 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java @@ -1,11 +1,11 @@ package com.dfsek.terra.generation.items.flora; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java index 7ad35a482..2459144ec 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java @@ -3,8 +3,8 @@ package com.dfsek.terra.generation.items.flora; import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.vector.Vector2; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.generation.items.PlaceableLayer; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java index 74b2960de..bcb72ce54 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java @@ -1,16 +1,16 @@ package com.dfsek.terra.generation.items.flora; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Directional; +import com.dfsek.terra.api.platform.block.data.MultipleFacing; +import com.dfsek.terra.api.platform.block.data.Rotatable; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.WorldHandle; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.block.data.Directional; -import com.dfsek.terra.api.platform.world.block.data.MultipleFacing; -import com.dfsek.terra.api.platform.world.block.data.Rotatable; -import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.world.flora.Flora; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java index 909167310..c8f72a584 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java @@ -2,12 +2,12 @@ package com.dfsek.terra.generation.items.ores; import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.WorldHandle; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.util.MaterialSet; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java index 379bffc70..a1a8cdd3f 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java @@ -1,9 +1,9 @@ package com.dfsek.terra.generation.items.ores; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.util.MaterialSet; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java index 2a49ade0d..98e549e13 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java @@ -1,12 +1,12 @@ package com.dfsek.terra.generation.items.ores; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.WorldHandle; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index efca2cc06..68fe29fb2 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -1,8 +1,8 @@ package com.dfsek.terra.generation.items.tree; import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java b/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java index f07320ab0..740163da6 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java @@ -3,10 +3,10 @@ package com.dfsek.terra.generation.items.tree; import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.vector.Vector2; import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.generation.items.PlaceableLayer; diff --git a/common/src/main/java/com/dfsek/terra/population/CavePopulator.java b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java index c5515dbf9..a04c86005 100644 --- a/common/src/main/java/com/dfsek/terra/population/CavePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java @@ -1,14 +1,14 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.WorldHandle; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; -import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.api.profiler.ProfileFuture; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.carving.UserDefinedCarver; diff --git a/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java index d9ce0415f..f88273d40 100644 --- a/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -1,10 +1,10 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.vector.Vector2; import com.dfsek.terra.api.profiler.ProfileFuture; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; diff --git a/common/src/main/java/com/dfsek/terra/population/OrePopulator.java b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java index 7a0316ffe..6a766f534 100644 --- a/common/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -2,10 +2,10 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.math.MathUtil; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.vector.Vector3; import com.dfsek.terra.api.profiler.ProfileFuture; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.biome.Biome; diff --git a/common/src/main/java/com/dfsek/terra/population/TreePopulator.java b/common/src/main/java/com/dfsek/terra/population/TreePopulator.java index 1e6e69c18..d69e635b5 100644 --- a/common/src/main/java/com/dfsek/terra/population/TreePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/TreePopulator.java @@ -1,10 +1,10 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.vector.Vector2; import com.dfsek.terra.api.profiler.ProfileFuture; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; diff --git a/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java b/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java index ec627de58..a1d9561e9 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java +++ b/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java @@ -1,7 +1,7 @@ package com.dfsek.terra.procgen; import com.dfsek.terra.api.math.MathUtil; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.util.GlueList; diff --git a/common/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java b/common/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java index 07434e62b..65a72467d 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java +++ b/common/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java @@ -1,6 +1,6 @@ package com.dfsek.terra.procgen.pixel; -import com.dfsek.terra.api.platform.world.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector2; import java.util.Set; diff --git a/common/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java b/common/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java index 4b8943ea5..8dc79e0ed 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java +++ b/common/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java @@ -1,6 +1,6 @@ package com.dfsek.terra.procgen.pixel; -import com.dfsek.terra.api.platform.world.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector2; import net.jafama.FastMath; import java.util.HashSet; diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java index 4a86deb34..821613bab 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java @@ -1,7 +1,7 @@ package com.dfsek.terra.procgen.voxel; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.math.vector.Vector3; public class Cylinder extends VoxelGeometry { public Cylinder(Vector3 start, int rad, int height) { diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java index dbb48c253..0e81444fb 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java @@ -1,7 +1,7 @@ package com.dfsek.terra.procgen.voxel; import com.dfsek.terra.api.math.FastNoiseLite; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.math.vector.Vector3; public class DeformedSphere extends VoxelGeometry { public DeformedSphere(Vector3 start, int rad, double deform, FastNoiseLite noise) { diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java index 9cb1ae499..21dba2149 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java @@ -1,6 +1,6 @@ package com.dfsek.terra.procgen.voxel; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.math.vector.Vector3; public class Sphere extends VoxelGeometry { public Sphere(Vector3 start, int rad) { diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java index 7f25138f5..9b5128a99 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java @@ -1,6 +1,6 @@ package com.dfsek.terra.procgen.voxel; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.math.vector.Vector3; public class Tube extends VoxelGeometry { public Tube(Vector3 start, Vector3 end, int radius) { diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java b/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java index 291a8c419..65453d4c0 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java +++ b/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java @@ -1,6 +1,6 @@ package com.dfsek.terra.procgen.voxel; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.util.GlueList; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java b/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java index 3a5fbf447..ae31c6a09 100644 --- a/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java @@ -1,8 +1,8 @@ package com.dfsek.terra.registry; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.generation.items.flora.ConstantFlora; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java b/common/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java index b60d12a47..e5b5dbeb9 100644 --- a/common/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/PaletteRegistry.java @@ -1,7 +1,7 @@ package com.dfsek.terra.registry; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.SinglePalette; diff --git a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java index e7849c762..b9c6f0a6a 100644 --- a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java @@ -1,9 +1,9 @@ package com.dfsek.terra.registry; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.block.MaterialData; -import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.api.world.tree.fractal.trees.Cactus; diff --git a/common/src/main/java/com/dfsek/terra/util/MaterialSet.java b/common/src/main/java/com/dfsek/terra/util/MaterialSet.java index 6a7caf3f6..ff13abbb2 100644 --- a/common/src/main/java/com/dfsek/terra/util/MaterialSet.java +++ b/common/src/main/java/com/dfsek/terra/util/MaterialSet.java @@ -1,7 +1,7 @@ package com.dfsek.terra.util; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; import java.util.Arrays; import java.util.HashSet; diff --git a/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java b/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java index 95a118e3b..0ea5a706d 100644 --- a/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java +++ b/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java @@ -1,6 +1,6 @@ package com.dfsek.terra.util; -import com.dfsek.terra.api.platform.world.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.config.templates.BiomeTemplate; diff --git a/common/src/main/java/com/dfsek/terra/util/TagUtil.java b/common/src/main/java/com/dfsek/terra/util/TagUtil.java index eba42151c..9755092e6 100644 --- a/common/src/main/java/com/dfsek/terra/util/TagUtil.java +++ b/common/src/main/java/com/dfsek/terra/util/TagUtil.java @@ -1,6 +1,6 @@ package com.dfsek.terra.util; -import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.debug.Debug; import org.jetbrains.annotations.NotNull; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitChunk.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitChunk.java index 6db72b19a..e74cb3b86 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitChunk.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitChunk.java @@ -1,8 +1,8 @@ package com.dfsek.terra.bukkit; +import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.block.Block; import com.dfsek.terra.bukkit.world.block.BukkitBlock; public class BukkitChunk implements Chunk { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java index 58dd09d03..29c8d8eca 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java @@ -1,8 +1,8 @@ package com.dfsek.terra.bukkit; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.inventory.ItemHandle; import com.dfsek.terra.api.platform.inventory.ItemStack; -import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; public class BukkitItemHandle implements ItemHandle { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java index 81a20c358..54836de15 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java @@ -1,8 +1,8 @@ package com.dfsek.terra.bukkit; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.inventory.ItemStack; import com.dfsek.terra.api.platform.inventory.item.ItemMeta; -import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; public class BukkitItemStack implements ItemStack { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java index 5644ffec4..026277941 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit; import com.dfsek.terra.api.Player; -import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.math.vector.Location; public class BukkitPlayer implements Player { private final org.bukkit.entity.Player delegate; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java index 456121f4e..19ded559c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java @@ -1,10 +1,10 @@ package com.dfsek.terra.bukkit; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.world.WorldHandle; -import com.dfsek.terra.api.platform.world.block.MaterialData; -import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.bukkit.util.BukkitConversions; import com.dfsek.terra.util.MaterialSet; import org.bukkit.TreeType; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorld.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorld.java index 90be26848..34beda546 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorld.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorld.java @@ -1,11 +1,11 @@ package com.dfsek.terra.bukkit; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.bukkit.generator.BukkitChunkGenerator; import com.dfsek.terra.bukkit.world.block.BukkitBlock; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java index a8612a237..5433dcc76 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java @@ -2,10 +2,10 @@ package com.dfsek.terra.bukkit; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.world.WorldHandle; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index c88bf4ad8..7abefd247 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -6,12 +6,12 @@ import com.dfsek.terra.api.GenericLoaders; import com.dfsek.terra.api.lang.Language; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.inventory.ItemHandle; import com.dfsek.terra.api.platform.world.Biome; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.WorldHandle; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.api.transform.MapTransform; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.command.command.TerraCommand; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java index 976294abb..6e363bf0f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.command.command.geometry; import com.dfsek.terra.api.math.FastNoiseLite; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitPlayer; import com.dfsek.terra.bukkit.BukkitWorld; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java index 1b86d9d12..0bc1b5883 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.command.command.geometry; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitPlayer; import com.dfsek.terra.bukkit.BukkitWorld; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java index 190103791..0d1385771 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.command.command.geometry; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.PlayerCommand; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java index 5ea9beafb..f72ecae54 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java @@ -1,9 +1,9 @@ package com.dfsek.terra.bukkit.generator; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.generator.BlockPopulator; import com.dfsek.terra.api.platform.world.BiomeGrid; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.bukkit.BukkitBiomeGrid; import com.dfsek.terra.bukkit.BukkitWorld; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/RotationUtil.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/RotationUtil.java index e88a28eff..1df7921a9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/RotationUtil.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/RotationUtil.java @@ -1,16 +1,16 @@ package com.dfsek.terra.bukkit.structure; -import com.dfsek.terra.api.platform.world.block.Axis; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.block.data.Directional; -import com.dfsek.terra.api.platform.world.block.data.MultipleFacing; -import com.dfsek.terra.api.platform.world.block.data.Orientable; -import com.dfsek.terra.api.platform.world.block.data.Rail; -import com.dfsek.terra.api.platform.world.block.data.RedstoneWire; -import com.dfsek.terra.api.platform.world.block.data.Rotatable; -import com.dfsek.terra.api.platform.world.block.data.Wall; -import com.dfsek.terra.api.platform.world.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.platform.block.Axis; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Directional; +import com.dfsek.terra.api.platform.block.data.MultipleFacing; +import com.dfsek.terra.api.platform.block.data.Orientable; +import com.dfsek.terra.api.platform.block.data.Rail; +import com.dfsek.terra.api.platform.block.data.RedstoneWire; +import com.dfsek.terra.api.platform.block.data.Rotatable; +import com.dfsek.terra.api.platform.block.data.Wall; import com.dfsek.terra.structure.Rotation; import net.jafama.FastMath; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java index 2351ef43d..6ad2f0cfc 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.util; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.bukkit.BukkitWorld; import org.bukkit.Location; import org.bukkit.util.Vector; @@ -10,7 +10,7 @@ public final class BukkitConversions { return new Vector3(bukkit.getX(), bukkit.getY(), bukkit.getZ()); } - public static Location toBukkitLocation(com.dfsek.terra.api.platform.world.vector.Location terra) { + public static Location toBukkitLocation(com.dfsek.terra.api.math.vector.Location terra) { return new Location(((BukkitWorld) terra.getWorld()).getHandle(), terra.getX(), terra.getY(), terra.getZ()); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java index 215f1d7f0..028d88530 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java @@ -1,10 +1,10 @@ package com.dfsek.terra.bukkit.world.block; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.block.MaterialData; -import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.world.block.data.TerraEnumAdapter; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java index a4c0b69a6..c03f3c7f6 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.world.block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; public class BukkitBlockData implements BlockData { private org.bukkit.block.data.BlockData delegate; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java index c5c0861d2..f919b690a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.world.block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; import org.bukkit.Material; public class BukkitMaterialData implements MaterialData { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java index 8d0dce046..25cfce14d 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java @@ -1,10 +1,10 @@ package com.dfsek.terra.bukkit.world.block.data; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.block.data.Bisected; -import com.dfsek.terra.api.platform.world.block.data.Slab; -import com.dfsek.terra.api.platform.world.block.data.Stairs; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Bisected; +import com.dfsek.terra.api.platform.block.data.Slab; +import com.dfsek.terra.api.platform.block.data.Stairs; /** * Utility class to adapt Bukkit enums to Terra enums. diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java index 854a85fcc..4b9b7b3e3 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.world.block.data; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.block.data.MultipleFacing; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.MultipleFacing; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import java.util.Set; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java index dbdc14968..96c746e41 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.world.block.data; -import com.dfsek.terra.api.platform.world.block.data.Slab; +import com.dfsek.terra.api.platform.block.data.Slab; public class BukkitSlab extends BukkitWaterlogged implements Slab { public BukkitSlab(org.bukkit.block.data.type.Slab delegate) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java index fa12c6fc8..ed2a0d490 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.world.block.data; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.block.data.Stairs; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Stairs; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; public class BukkitStairs extends BukkitBlockData implements Stairs { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java index 075a95039..181e6fc85 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.world.block.data; -import com.dfsek.terra.api.platform.world.block.data.Waterlogged; +import com.dfsek.terra.api.platform.block.data.Waterlogged; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; public class BukkitWaterlogged extends BukkitBlockData implements Waterlogged { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java index 9ac9ddd28..16094077b 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.world.block.data; -import com.dfsek.terra.api.platform.world.block.BlockFace; +import com.dfsek.terra.api.platform.block.BlockFace; import org.bukkit.block.data.Bisected; import org.bukkit.block.data.type.Slab; import org.bukkit.block.data.type.Stairs; @@ -10,7 +10,7 @@ import org.bukkit.block.data.type.Stairs; * Utility class to adapt Terra enums to Bukkit enums */ public final class TerraEnumAdapter { - public static Stairs.Shape fromTerraStair(com.dfsek.terra.api.platform.world.block.data.Stairs.Shape shape) { + public static Stairs.Shape fromTerraStair(com.dfsek.terra.api.platform.block.data.Stairs.Shape shape) { switch(shape) { case STRAIGHT: return Stairs.Shape.STRAIGHT; @@ -27,7 +27,7 @@ public final class TerraEnumAdapter { } } - public static Bisected.Half fromTerraHalf(com.dfsek.terra.api.platform.world.block.data.Bisected.Half half) { + public static Bisected.Half fromTerraHalf(com.dfsek.terra.api.platform.block.data.Bisected.Half half) { switch(half) { case TOP: return Bisected.Half.TOP; @@ -83,7 +83,7 @@ public final class TerraEnumAdapter { } } - public static Slab.Type fromTerraSlabType(com.dfsek.terra.api.platform.world.block.data.Slab.Type type) { + public static Slab.Type fromTerraSlabType(com.dfsek.terra.api.platform.block.data.Slab.Type type) { switch(type) { case TOP: return Slab.Type.TOP; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index d93a99ef9..2d9a3ebe6 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -5,11 +5,11 @@ import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.GenericLoaders; import com.dfsek.terra.api.lang.Language; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.inventory.ItemHandle; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.WorldHandle; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.api.transform.MapTransform; import com.dfsek.terra.api.transform.NotNullValidator; import com.dfsek.terra.api.transform.Transformer; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java index 7648480d2..35d5b5869 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java @@ -1,8 +1,8 @@ package com.dfsek.terra.fabric.inventory; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.inventory.ItemHandle; import com.dfsek.terra.api.platform.inventory.ItemStack; -import com.dfsek.terra.api.platform.world.block.MaterialData; public class FabricItemHandle implements ItemHandle { @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java index f7662acee..c6caae3e3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemStack.java @@ -1,8 +1,8 @@ package com.dfsek.terra.fabric.inventory; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.inventory.ItemStack; import com.dfsek.terra.api.platform.inventory.item.ItemMeta; -import com.dfsek.terra.api.platform.world.block.MaterialData; public class FabricItemStack implements ItemStack { net.minecraft.item.ItemStack delegate; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java index 470e60080..a65e456d5 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricAdapters.java @@ -1,6 +1,6 @@ package com.dfsek.terra.fabric.world; -import com.dfsek.terra.api.platform.world.vector.Vector3; +import com.dfsek.terra.api.math.vector.Vector3; import net.minecraft.util.math.BlockPos; public final class FabricAdapters { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java index f1020b7d5..99546947f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java @@ -1,8 +1,8 @@ package com.dfsek.terra.fabric.world; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Tree; -import com.dfsek.terra.api.platform.world.block.MaterialData; -import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index 779b55332..2211cbeb7 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -1,10 +1,10 @@ package com.dfsek.terra.fabric.world; import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.world.WorldHandle; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricMaterialData; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java index f20724743..9e0d8bfd9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java @@ -1,10 +1,10 @@ package com.dfsek.terra.fabric.world.block; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.block.MaterialData; -import com.dfsek.terra.api.platform.world.vector.Location; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.fabric.world.FabricAdapters; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; import net.minecraft.util.math.BlockPos; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java index e3d87d9b6..0f0d4f602 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java @@ -1,7 +1,7 @@ package com.dfsek.terra.fabric.world.block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; import net.minecraft.block.BlockState; public class FabricBlockData implements BlockData { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricMaterialData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricMaterialData.java index be531f86a..dd9941d03 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricMaterialData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricMaterialData.java @@ -1,7 +1,7 @@ package com.dfsek.terra.fabric.world.block; -import com.dfsek.terra.api.platform.world.block.BlockData; -import com.dfsek.terra.api.platform.world.block.MaterialData; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; import net.minecraft.block.Block; import net.minecraft.block.Blocks; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java index ca60af062..35e35eec7 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java @@ -1,9 +1,9 @@ package com.dfsek.terra.fabric.world.block.data; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.block.data.Bisected; -import com.dfsek.terra.api.platform.world.block.data.Slab; -import com.dfsek.terra.api.platform.world.block.data.Stairs; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Bisected; +import com.dfsek.terra.api.platform.block.data.Slab; +import com.dfsek.terra.api.platform.block.data.Stairs; import net.minecraft.block.enums.BlockHalf; import net.minecraft.block.enums.SlabType; import net.minecraft.block.enums.StairShape; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java index 20adcb618..c4c1bf40f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricMultipleFacing.java @@ -1,7 +1,7 @@ package com.dfsek.terra.fabric.world.block.data; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.block.data.MultipleFacing; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.MultipleFacing; import com.dfsek.terra.fabric.world.block.FabricBlockData; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java index 3ec3db9db..ec1b103d0 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java @@ -1,6 +1,6 @@ package com.dfsek.terra.fabric.world.block.data; -import com.dfsek.terra.api.platform.world.block.data.Slab; +import com.dfsek.terra.api.platform.block.data.Slab; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java index 4bb032b8a..9997e6767 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java @@ -1,7 +1,7 @@ package com.dfsek.terra.fabric.world.block.data; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.block.data.Stairs; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Stairs; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java index 92756ee9a..95960e295 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricWaterlogged.java @@ -1,6 +1,6 @@ package com.dfsek.terra.fabric.world.block.data; -import com.dfsek.terra.api.platform.world.block.data.Waterlogged; +import com.dfsek.terra.api.platform.block.data.Waterlogged; import com.dfsek.terra.fabric.world.block.FabricBlockData; import net.minecraft.block.BlockState; import net.minecraft.state.property.Properties; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java index a5a53fa7b..a207c45d3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java @@ -1,9 +1,9 @@ package com.dfsek.terra.fabric.world.block.data; -import com.dfsek.terra.api.platform.world.block.BlockFace; -import com.dfsek.terra.api.platform.world.block.data.Bisected; -import com.dfsek.terra.api.platform.world.block.data.Slab; -import com.dfsek.terra.api.platform.world.block.data.Stairs; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Bisected; +import com.dfsek.terra.api.platform.block.data.Slab; +import com.dfsek.terra.api.platform.block.data.Stairs; import net.minecraft.block.enums.BlockHalf; import net.minecraft.block.enums.SlabType; import net.minecraft.block.enums.StairShape; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java index 8fa09df1f..5c5d26462 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkData.java @@ -1,7 +1,7 @@ package com.dfsek.terra.fabric.world.generator; +import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.generator.ChunkGenerator; -import com.dfsek.terra.api.platform.world.block.BlockData; import com.dfsek.terra.fabric.world.block.FabricBlockData; import net.minecraft.util.math.BlockPos; import net.minecraft.world.chunk.Chunk; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java index e30efbca9..ddd905466 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java @@ -1,12 +1,12 @@ package com.dfsek.terra.fabric.world.handles; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Entity; import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.fabric.world.handles.chunk.FabricChunk; import net.minecraft.server.world.ServerWorld; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java index d3a571cb9..7c14d02ea 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunk.java @@ -1,8 +1,8 @@ package com.dfsek.terra.fabric.world.handles.chunk; +import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.block.Block; public class FabricChunk implements Chunk { private final net.minecraft.world.chunk.Chunk chunk; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java index ec78da35d..4472b8523 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/chunk/FabricChunkWorldAccess.java @@ -1,8 +1,8 @@ package com.dfsek.terra.fabric.world.handles.chunk; +import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.block.Block; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; import net.minecraft.util.math.BlockPos; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java index 0056dcba8..b3684a08a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java @@ -1,12 +1,12 @@ package com.dfsek.terra.fabric.world.handles.world; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Entity; import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.util.math.BlockPos; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index 11636a62f..09e3222bc 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -1,12 +1,12 @@ package com.dfsek.terra.fabric.world.handles.world; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Entity; import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.util.math.BlockPos; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java index d5d1c06fd..cb46e53e7 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java @@ -1,12 +1,12 @@ package com.dfsek.terra.fabric.world.handles.world; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Entity; import com.dfsek.terra.api.platform.Tree; +import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.block.Block; -import com.dfsek.terra.api.platform.world.vector.Location; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.util.math.BlockPos; From 29e2746e720389815e9948e6fcc52f04664df095 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 19 Dec 2020 01:50:56 -0700 Subject: [PATCH 067/210] working tokenizer --- .../java/com/dfsek/terra/CommandHandler.java | 4 + .../terra/api/platform/package-info.java | 4 + .../dfsek/terra/api/structures/Argument.java | 4 + .../dfsek/terra/api/structures/Function.java | 11 ++ .../dfsek/terra/api/structures/Parser.java | 4 + .../terra/api/structures}/tokenizer/Char.java | 23 +++- .../api/structures}/tokenizer/Lookahead.java | 18 ++- .../api/structures}/tokenizer/Position.java | 2 +- .../terra/api/structures/tokenizer/Token.java | 28 +++++ .../tokenizer/TokenizedStatement.java | 5 + .../api/structures/tokenizer/Tokenizer.java | 116 ++++++++++++++++++ .../tokenizer/exceptions/EOFException.java | 20 +++ .../tokenizer/exceptions/FormatException.java | 20 +++ .../exceptions/TokenizerException.java | 19 +++ .../structures/tokenizer/group/Brackets.java | 18 +++ .../api/structures/tokenizer/group/Group.java | 9 ++ .../tokenizer/group/LineComment.java | 18 +++ .../tokenizer/group/Parentheses.java | 18 +++ .../structures/tokenizer/group/Quotes.java | 19 +++ .../java/com/dfsek/terra/command/Command.java | 5 + .../test/java/structure/LookaheadTest.java | 2 +- .../test/java/structure/TokenizerTest.java | 23 ++++ common/src/test/resources/test.tesf | 18 +++ .../bukkit/command/structure/v2/Function.java | 5 - .../bukkit/command/structure/v2/Parser.java | 4 - .../command/structure/v2/tokenizer/Token.java | 4 - .../structure/v2/tokenizer/Tokenizer.java | 12 -- .../structure/v2/tokenizer/Tokens.java | 5 - .../exceptions/TokenizerException.java | 4 - 29 files changed, 402 insertions(+), 40 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/CommandHandler.java create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/package-info.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/Argument.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/Function.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/Parser.java rename {platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2 => common/src/main/java/com/dfsek/terra/api/structures}/tokenizer/Char.java (58%) rename {platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2 => common/src/main/java/com/dfsek/terra/api/structures}/tokenizer/Lookahead.java (84%) rename {platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2 => common/src/main/java/com/dfsek/terra/api/structures}/tokenizer/Position.java (78%) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/TokenizedStatement.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/EOFException.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/FormatException.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/TokenizerException.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Brackets.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Group.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/LineComment.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Parentheses.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Quotes.java create mode 100644 common/src/main/java/com/dfsek/terra/command/Command.java create mode 100644 common/src/test/java/structure/TokenizerTest.java create mode 100644 common/src/test/resources/test.tesf delete mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/Function.java delete mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/Parser.java delete mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Token.java delete mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Tokenizer.java delete mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Tokens.java delete mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/exceptions/TokenizerException.java diff --git a/common/src/main/java/com/dfsek/terra/CommandHandler.java b/common/src/main/java/com/dfsek/terra/CommandHandler.java new file mode 100644 index 000000000..17013fb30 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/CommandHandler.java @@ -0,0 +1,4 @@ +package com.dfsek.terra; + +public interface CommandHandler { +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/package-info.java b/common/src/main/java/com/dfsek/terra/api/platform/package-info.java new file mode 100644 index 000000000..f1b97f5ed --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/package-info.java @@ -0,0 +1,4 @@ +/** + * API for platform implementations. Mostly interfaces to be implemented by platform delegates. + */ +package com.dfsek.terra.api.platform; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/Argument.java b/common/src/main/java/com/dfsek/terra/api/structures/Argument.java new file mode 100644 index 000000000..98b7d0e63 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/Argument.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.structures; + +public interface Argument { +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/Function.java new file mode 100644 index 000000000..73c5e1a22 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/Function.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.structures; + +import java.util.List; + +public interface Function { + void apply(); + + String name(); + + List getArguments(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/Parser.java new file mode 100644 index 000000000..680abcc22 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/Parser.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.structures; + +public class Parser { +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Char.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Char.java similarity index 58% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Char.java rename to common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Char.java index 82b8c68a2..5b655cd31 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Char.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Char.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.structure.v2.tokenizer; +package com.dfsek.terra.api.structures.tokenizer; public class Char { private final char character; @@ -24,6 +24,18 @@ public class Char { return line; } + public boolean isWhitespace() { + return Character.isWhitespace(character); + } + + public boolean isNewLine() { + return character == '\n'; + } + + public boolean isDigit() { + return Character.isDigit(character); + } + public boolean is(char... tests) { for(char test : tests) { if(test == character && test != '\0') { @@ -32,4 +44,13 @@ public class Char { } return false; } + + public boolean isEOF() { + return character == '\0'; + } + + @Override + public String toString() { + return Character.toString(character); + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Lookahead.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Lookahead.java similarity index 84% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Lookahead.java rename to common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Lookahead.java index 5e41bfd37..ebf881e9e 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Lookahead.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Lookahead.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.structure.v2.tokenizer; +package com.dfsek.terra.api.structures.tokenizer; -import org.polydev.gaea.util.GlueList; +import com.dfsek.terra.api.util.GlueList; import java.io.IOException; import java.io.Reader; @@ -23,12 +23,13 @@ public class Lookahead { /** * Get the current character without consuming it. * - * @return + * @return current character */ public Char current() { return next(0); } + /** * Consume and return one character. * @@ -98,4 +99,15 @@ public class Lookahead { } } } + + public boolean matches(String check, boolean consume) { + if(check == null) return false; + + for(int i = 0; i < check.length(); i++) { + if(!next(i).is(check.charAt(i))) return false; + } + + if(consume) consume(check.length()); // Consume string + return true; + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Position.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Position.java similarity index 78% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Position.java rename to common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Position.java index 2d1f70257..cc0968365 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Position.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Position.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.structure.v2.tokenizer; +package com.dfsek.terra.api.structures.tokenizer; public class Position { private final int line; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java new file mode 100644 index 000000000..63c114025 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.api.structures.tokenizer; + +public class Token { + private final String content; + private final Type type; + + public Token(String content, Type type) { + this.content = content; + this.type = type; + } + + public Type getType() { + return type; + } + + public String getContent() { + return content; + } + + @Override + public String toString() { + return type + ": '" + content + "'"; + } + + public enum Type { + IDENTIFIER, NUMBER, STRING, BOOLEAN, BODY_BEGIN, BODY_END, STATEMENT_END, SEPARATOR + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/TokenizedStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/TokenizedStatement.java new file mode 100644 index 000000000..d6b37a880 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/TokenizedStatement.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.api.structures.tokenizer; + +public class TokenizedStatement { + +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java new file mode 100644 index 000000000..5f05136d1 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -0,0 +1,116 @@ +package com.dfsek.terra.api.structures.tokenizer; + +import com.dfsek.terra.api.structures.tokenizer.exceptions.EOFException; +import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; +import com.dfsek.terra.api.structures.tokenizer.group.Group; +import com.dfsek.terra.api.util.GlueList; +import com.google.common.collect.Sets; + +import java.io.StringReader; +import java.util.List; +import java.util.Set; + +public class Tokenizer { + private final Lookahead reader; + + private final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', '[', ']', ','); + + + public Tokenizer(String data) { + reader = new Lookahead(new StringReader(data + '\0')); + } + + public List tokenize() { + List tokens = new GlueList<>(); + while(reader.current().isEOF()) { + Char c = reader.current(); + } + + return tokens; + } + + public Token fetch() throws TokenizerException { + + while(!reader.current().isEOF() && reader.current().isWhitespace()) reader.consume(); + if(reader.current().isEOF()) return null; // EOF + + if(reader.matches("//", true)) skipLine(); // Skip line if comment + + if(reader.matches("/*", true)) skipTo("*/"); + + if(isNumberStart()) { + StringBuilder num = new StringBuilder(); + while(!reader.current().isEOF() && isNumberLike()) { + num.append(reader.consume()); + } + return new Token(num.toString(), Token.Type.NUMBER); + } + + if(reader.current().is('"')) { + reader.consume(); // Consume first quote + StringBuilder string = new StringBuilder(); + while(!reader.current().isEOF() && !reader.current().is('"')) { + string.append(reader.consume()); + } + reader.consume(); // Consume last quote + return new Token(string.toString(), Token.Type.STRING); + } + + if(reader.current().is('(')) return new Token(reader.consume().toString(), Token.Type.BODY_BEGIN); + if(reader.current().is(')')) return new Token(reader.consume().toString(), Token.Type.BODY_END); + if(reader.current().is(';')) return new Token(reader.consume().toString(), Token.Type.STATEMENT_END); + if(reader.current().is(',')) return new Token(reader.consume().toString(), Token.Type.SEPARATOR); + + StringBuilder token = new StringBuilder(); + while(!reader.current().isEOF() && !isSyntaxSignificant(reader.current().getCharacter())) { + Char c = reader.consume(); + if(!c.isWhitespace()) token.append(c); + } + + return new Token(token.toString(), Token.Type.IDENTIFIER); + } + + private boolean isNumberLike() { + return reader.current().isDigit() + || reader.current().is('_', '.', '-', 'E'); + } + + private boolean isNumberStart() { + return reader.current().isDigit() + || reader.current().is('-') && reader.next(1).isDigit() + || reader.current().is('-') && reader.next(1).is('.') && reader.next(2).isDigit() + || reader.current().is('.') && reader.next(1).isDigit(); + } + + private void skipLine() { + while(!reader.current().isEOF() && !reader.current().isNewLine()) reader.consume(); + } + + private void skipTo(String s) throws EOFException { + while(!reader.current().isEOF()) { + if(reader.matches(s, true)) return; + reader.consume(); + } + throw new EOFException("No end of expression found."); + } + + /** + * Read to the end of a group, consuming all + * + * @param g + * @return + */ + private String readToEndOfGroup(Group g) { + StringBuilder builder = new StringBuilder(); + do { + Char current = reader.consume(); + + } while(reader.current().getCharacter() != g.getEnd()); + return builder.toString(); + } + + public boolean isSyntaxSignificant(char c) { + return syntaxSignificant.contains(c); + } + +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/EOFException.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/EOFException.java new file mode 100644 index 000000000..2750b86f9 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/EOFException.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.api.structures.tokenizer.exceptions; + +public class EOFException extends TokenizerException { + + public EOFException(String s) { + super(s); + } + + public EOFException() { + super(); + } + + public EOFException(String message, Throwable cause) { + super(message, cause); + } + + public EOFException(Throwable cause) { + super(cause); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/FormatException.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/FormatException.java new file mode 100644 index 000000000..c8b8414ca --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/FormatException.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.api.structures.tokenizer.exceptions; + +public class FormatException extends TokenizerException { + + public FormatException(String s) { + super(s); + } + + public FormatException() { + super(); + } + + public FormatException(String message, Throwable cause) { + super(message, cause); + } + + public FormatException(Throwable cause) { + super(cause); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/TokenizerException.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/TokenizerException.java new file mode 100644 index 000000000..282eb4886 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/TokenizerException.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.api.structures.tokenizer.exceptions; + +public abstract class TokenizerException extends Exception { + public TokenizerException(String s) { + super(s); + } + + public TokenizerException() { + super(); + } + + public TokenizerException(String message, Throwable cause) { + super(message, cause); + } + + public TokenizerException(Throwable cause) { + super(cause); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Brackets.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Brackets.java new file mode 100644 index 000000000..ddaed62f1 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Brackets.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.api.structures.tokenizer.group; + +public class Brackets implements Group { + @Override + public char getBegin() { + return '['; + } + + @Override + public char getEnd() { + return ']'; + } + + @Override + public boolean ignoreInsideSyntax() { + return false; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Group.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Group.java new file mode 100644 index 000000000..20ab13f83 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Group.java @@ -0,0 +1,9 @@ +package com.dfsek.terra.api.structures.tokenizer.group; + +public interface Group { + char getBegin(); + + char getEnd(); + + boolean ignoreInsideSyntax(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/LineComment.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/LineComment.java new file mode 100644 index 000000000..7f458af71 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/LineComment.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.api.structures.tokenizer.group; + +public class LineComment implements Group { + @Override + public char getBegin() { + return '#'; + } + + @Override + public char getEnd() { + return '\n'; + } + + @Override + public boolean ignoreInsideSyntax() { + return true; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Parentheses.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Parentheses.java new file mode 100644 index 000000000..91af4aa00 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Parentheses.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.api.structures.tokenizer.group; + +public class Parentheses implements Group { + @Override + public char getBegin() { + return '('; + } + + @Override + public char getEnd() { + return ')'; + } + + @Override + public boolean ignoreInsideSyntax() { + return false; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Quotes.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Quotes.java new file mode 100644 index 000000000..f092bc520 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Quotes.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.api.structures.tokenizer.group; + +public class Quotes implements Group { + + @Override + public char getBegin() { + return '"'; + } + + @Override + public char getEnd() { + return '"'; + } + + @Override + public boolean ignoreInsideSyntax() { + return true; + } +} diff --git a/common/src/main/java/com/dfsek/terra/command/Command.java b/common/src/main/java/com/dfsek/terra/command/Command.java new file mode 100644 index 000000000..fb752b793 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/command/Command.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.command; + +public class Command { + +} diff --git a/common/src/test/java/structure/LookaheadTest.java b/common/src/test/java/structure/LookaheadTest.java index a3c84d493..fd1e10724 100644 --- a/common/src/test/java/structure/LookaheadTest.java +++ b/common/src/test/java/structure/LookaheadTest.java @@ -1,6 +1,6 @@ package structure; -import com.dfsek.terra.structure.v2.tokenizer.Lookahead; +import com.dfsek.terra.api.structures.tokenizer.Lookahead; import org.junit.jupiter.api.Test; import java.io.StringReader; diff --git a/common/src/test/java/structure/TokenizerTest.java b/common/src/test/java/structure/TokenizerTest.java new file mode 100644 index 000000000..37f071cad --- /dev/null +++ b/common/src/test/java/structure/TokenizerTest.java @@ -0,0 +1,23 @@ +package structure; + +import com.dfsek.terra.api.structures.tokenizer.Token; +import com.dfsek.terra.api.structures.tokenizer.Tokenizer; +import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +public class TokenizerTest { + @Test + public void tokens() throws IOException, TokenizerException { + Tokenizer tokenizer = new Tokenizer(IOUtils.toString(getClass().getResourceAsStream("/test.tesf"))); + + for(int i = 0; i < 100; i++) { + Token t = tokenizer.fetch(); + if(t == null) break; + System.out.println(t); + + } + } +} diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf new file mode 100644 index 000000000..d170e2f2c --- /dev/null +++ b/common/src/test/resources/test.tesf @@ -0,0 +1,18 @@ +FUNCTION(1, "hello"); + +; +) + +FUNCTION2(1.2, "he423llo"); + +// comment + +FUNCTION3(3.4, "35234523452345"); + +/* +block comment +fsfsdf +gsdfgsdfg +*/ + +FUNCTION(1, "hello"); \ No newline at end of file diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/Function.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/Function.java deleted file mode 100644 index 71c008edc..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/Function.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.dfsek.terra.structure.v2; - -public interface Function { - void apply(); -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/Parser.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/Parser.java deleted file mode 100644 index 82ef17732..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/Parser.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra.structure.v2; - -public class Parser { -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Token.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Token.java deleted file mode 100644 index 5fca5ed00..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Token.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra.structure.v2.tokenizer; - -public class Token { -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Tokenizer.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Tokenizer.java deleted file mode 100644 index ca9061cf3..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Tokenizer.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dfsek.terra.structure.v2.tokenizer; - -import java.io.StringReader; - -public class Tokenizer { - private final Lookahead reader; - - public Tokenizer(String data) { - reader = new Lookahead(new StringReader(data)); - - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Tokens.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Tokens.java deleted file mode 100644 index 92b4e8566..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/Tokens.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.dfsek.terra.structure.v2.tokenizer; - -public enum Tokens { - FUNCTION, SEPARATOR, ARGUMENT -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/exceptions/TokenizerException.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/exceptions/TokenizerException.java deleted file mode 100644 index e3f0e9c0b..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/structure/v2/tokenizer/exceptions/TokenizerException.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra.structure.v2.tokenizer.exceptions; - -public abstract class TokenizerException extends Exception { -} From f970838ecfa1a35ff868beb80b28fe6c1cccd092 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 19 Dec 2020 20:04:58 -0700 Subject: [PATCH 068/210] Working parser/tokenizer --- .../dfsek/terra/api/structures/Argument.java | 4 - .../dfsek/terra/api/structures/Function.java | 11 --- .../dfsek/terra/api/structures/Parser.java | 4 - .../terra/api/structures/parser/Argument.java | 5 + .../terra/api/structures/parser/Function.java | 12 +++ .../structures/parser/FunctionBuilder.java | 11 +++ .../terra/api/structures/parser/Parser.java | 96 +++++++++++++++++++ .../parser/exceptions/ParseException.java | 19 ++++ .../api/structures/tokenizer/Lookahead.java | 8 ++ .../api/structures/tokenizer/Position.java | 5 + .../terra/api/structures/tokenizer/Token.java | 8 +- .../tokenizer/TokenizedStatement.java | 5 - .../api/structures/tokenizer/Tokenizer.java | 54 ++++------- .../structures/tokenizer/group/Brackets.java | 18 ---- .../api/structures/tokenizer/group/Group.java | 9 -- .../tokenizer/group/LineComment.java | 18 ---- .../tokenizer/group/Parentheses.java | 18 ---- .../structures/tokenizer/group/Quotes.java | 19 ---- .../src/test/java/structure/ParserTest.java | 73 ++++++++++++++ .../test/java/structure/TokenizerTest.java | 9 +- common/src/test/resources/test.tesf | 18 +--- 21 files changed, 263 insertions(+), 161 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/Argument.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/Function.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/Parser.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/Argument.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/Function.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/exceptions/ParseException.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/TokenizedStatement.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Brackets.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Group.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/LineComment.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Parentheses.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Quotes.java create mode 100644 common/src/test/java/structure/ParserTest.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/Argument.java b/common/src/main/java/com/dfsek/terra/api/structures/Argument.java deleted file mode 100644 index 98b7d0e63..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/Argument.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra.api.structures; - -public interface Argument { -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/Function.java deleted file mode 100644 index 73c5e1a22..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/Function.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.dfsek.terra.api.structures; - -import java.util.List; - -public interface Function { - void apply(); - - String name(); - - List getArguments(); -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/Parser.java deleted file mode 100644 index 680abcc22..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/Parser.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra.api.structures; - -public class Parser { -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Argument.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Argument.java new file mode 100644 index 000000000..ffe9eb84d --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Argument.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.api.structures.parser; + +public interface Argument { + T parse(String input); +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Function.java new file mode 100644 index 000000000..ec4393f48 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Function.java @@ -0,0 +1,12 @@ +package com.dfsek.terra.api.structures.parser; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; + +public interface Function { + void apply(Location location); + + void apply(Location location, Chunk chunk); + + String name(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java new file mode 100644 index 000000000..8b24fbcf0 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.structures.parser; + +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; + +import java.util.List; + +public interface FunctionBuilder { + T build(List argumentList) throws ParseException; + + List> getArguments(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java new file mode 100644 index 000000000..399212b99 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -0,0 +1,96 @@ +package com.dfsek.terra.api.structures.parser; + +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.tokenizer.Token; +import com.dfsek.terra.api.structures.tokenizer.Tokenizer; +import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; +import com.dfsek.terra.api.util.GlueList; +import com.google.common.collect.Sets; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +public class Parser { + private final String data; + private final Map> functions = new HashMap<>(); + Set allowedArguments = Sets.newHashSet(Token.Type.STRING, Token.Type.NUMBER, Token.Type.IDENTIFIER); + + public Parser(String data) { + this.data = data; + } + + public Parser addFunction(String name, FunctionBuilder functionBuilder) { + functions.put(name, functionBuilder); + return this; + } + + public List parse() throws ParseException { + Tokenizer tokenizer = new Tokenizer(data); + List builtFunctions = new GlueList<>(); + List functionBuilder = new GlueList<>(); + Token token = null; + while(tokenizer.hasNext()) { + try { + token = tokenizer.fetch(); + functionBuilder.add(token); + + if(token.getType().equals(Token.Type.STATEMENT_END)) { + Token identifier = functionBuilder.remove(0); + checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier + + if(!functions.containsKey(identifier.getContent())) + throw new ParseException("No such function " + identifier.getContent() + ": " + identifier.getStart()); + + checkType(functionBuilder.remove(0), Token.Type.BODY_BEGIN); // Second is body begin + + boolean expectingSeparator = false; + + List args = new GlueList<>(); + + while(!functionBuilder.get(0).getType().equals(Token.Type.BODY_END)) { + Token current = functionBuilder.remove(0); + if(expectingSeparator) { + checkType(current, Token.Type.SEPARATOR); + expectingSeparator = false; + } else { + if(!allowedArguments.contains(current.getType())) + throw new ParseException("Token type " + current.getType() + " not allowed in arguments: " + current.getStart()); + args.add(current); + expectingSeparator = true; + } + } + + functionBuilder.remove(0); // Remove body end + + for(Token t : args) System.out.println("TOKEN: " + t); + + checkType(functionBuilder.remove(0), Token.Type.STATEMENT_END); + + List arg = args.stream().map(Token::getContent).collect(Collectors.toList()); + + for(String s : arg) System.out.println("ARG: " + s); + FunctionBuilder builder = functions.get(identifier.getContent()); + if(arg.size() != builder.getArguments().size()) + throw new ParseException("Expected " + builder.getArguments().size() + " arguments, found " + arg.size() + ": " + identifier.getStart()); + + builtFunctions.add(functions.get(identifier.getContent()).build(arg)); + + functionBuilder.clear(); + } + } catch(TokenizerException e) { + throw new ParseException("Failed to tokenize input", e); + } + + } + if(token != null) checkType(token, Token.Type.STATEMENT_END); + return builtFunctions; + } + + private void checkType(Token token, Token.Type expected) throws ParseException { + if(!token.getType().equals(expected)) + throw new ParseException("Expected " + expected + " but found " + token.getType() + ": " + token.getStart()); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/exceptions/ParseException.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/exceptions/ParseException.java new file mode 100644 index 000000000..c8e3794d6 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/exceptions/ParseException.java @@ -0,0 +1,19 @@ +package com.dfsek.terra.api.structures.parser.exceptions; + +public class ParseException extends Exception { + public ParseException() { + super(); + } + + public ParseException(String message) { + super(message); + } + + public ParseException(String message, Throwable cause) { + super(message, cause); + } + + public ParseException(Throwable cause) { + super(cause); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Lookahead.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Lookahead.java index ebf881e9e..cfbec6d6b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Lookahead.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Lookahead.java @@ -83,6 +83,14 @@ public class Lookahead { } else return buffer.get(ahead); } + public int getLine() { + return line; + } + + public int getIndex() { + return index; + } + /** * Consume an amount of characters * diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Position.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Position.java index cc0968365..2c0651409 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Position.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Position.java @@ -8,4 +8,9 @@ public class Position { this.line = line; this.index = index; } + + @Override + public String toString() { + return (line + 1) + ":" + (index + 1); + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 63c114025..e7502195a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -3,10 +3,12 @@ package com.dfsek.terra.api.structures.tokenizer; public class Token { private final String content; private final Type type; + private final Position start; - public Token(String content, Type type) { + public Token(String content, Type type, Position start) { this.content = content; this.type = type; + this.start = start; } public Type getType() { @@ -17,6 +19,10 @@ public class Token { return content; } + public Position getStart() { + return start; + } + @Override public String toString() { return type + ": '" + content + "'"; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/TokenizedStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/TokenizedStatement.java deleted file mode 100644 index d6b37a880..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/TokenizedStatement.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.dfsek.terra.api.structures.tokenizer; - -public class TokenizedStatement { - -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index 5f05136d1..f2bb0da99 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -1,13 +1,11 @@ package com.dfsek.terra.api.structures.tokenizer; import com.dfsek.terra.api.structures.tokenizer.exceptions.EOFException; +import com.dfsek.terra.api.structures.tokenizer.exceptions.FormatException; import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; -import com.dfsek.terra.api.structures.tokenizer.group.Group; -import com.dfsek.terra.api.util.GlueList; import com.google.common.collect.Sets; import java.io.StringReader; -import java.util.List; import java.util.Set; public class Tokenizer { @@ -20,46 +18,47 @@ public class Tokenizer { reader = new Lookahead(new StringReader(data + '\0')); } - public List tokenize() { - List tokens = new GlueList<>(); - while(reader.current().isEOF()) { - Char c = reader.current(); - } - - return tokens; + public boolean hasNext() { + while(!reader.current().isEOF() && reader.current().isWhitespace()) reader.consume(); // Consume whitespace. + return !reader.current().isEOF(); } public Token fetch() throws TokenizerException { - while(!reader.current().isEOF() && reader.current().isWhitespace()) reader.consume(); if(reader.current().isEOF()) return null; // EOF if(reader.matches("//", true)) skipLine(); // Skip line if comment - if(reader.matches("/*", true)) skipTo("*/"); + if(reader.matches("/*", true)) skipTo("*/"); // Skip multi line comment if(isNumberStart()) { StringBuilder num = new StringBuilder(); while(!reader.current().isEOF() && isNumberLike()) { num.append(reader.consume()); } - return new Token(num.toString(), Token.Type.NUMBER); + return new Token(num.toString(), Token.Type.NUMBER, new Position(reader.getLine(), reader.getIndex())); } if(reader.current().is('"')) { reader.consume(); // Consume first quote StringBuilder string = new StringBuilder(); - while(!reader.current().isEOF() && !reader.current().is('"')) { + while(!reader.current().is('"')) { + if(reader.current().isEOF()) + throw new FormatException("No end of string literal found. " + reader.getLine() + ":" + reader.getIndex()); string.append(reader.consume()); } reader.consume(); // Consume last quote - return new Token(string.toString(), Token.Type.STRING); + return new Token(string.toString(), Token.Type.STRING, new Position(reader.getLine(), reader.getIndex())); } - if(reader.current().is('(')) return new Token(reader.consume().toString(), Token.Type.BODY_BEGIN); - if(reader.current().is(')')) return new Token(reader.consume().toString(), Token.Type.BODY_END); - if(reader.current().is(';')) return new Token(reader.consume().toString(), Token.Type.STATEMENT_END); - if(reader.current().is(',')) return new Token(reader.consume().toString(), Token.Type.SEPARATOR); + if(reader.current().is('(')) + return new Token(reader.consume().toString(), Token.Type.BODY_BEGIN, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is(')')) + return new Token(reader.consume().toString(), Token.Type.BODY_END, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is(';')) + return new Token(reader.consume().toString(), Token.Type.STATEMENT_END, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is(',')) + return new Token(reader.consume().toString(), Token.Type.SEPARATOR, new Position(reader.getLine(), reader.getIndex())); StringBuilder token = new StringBuilder(); while(!reader.current().isEOF() && !isSyntaxSignificant(reader.current().getCharacter())) { @@ -67,7 +66,7 @@ public class Tokenizer { if(!c.isWhitespace()) token.append(c); } - return new Token(token.toString(), Token.Type.IDENTIFIER); + return new Token(token.toString(), Token.Type.IDENTIFIER, new Position(reader.getLine(), reader.getIndex())); } private boolean isNumberLike() { @@ -94,21 +93,6 @@ public class Tokenizer { throw new EOFException("No end of expression found."); } - /** - * Read to the end of a group, consuming all - * - * @param g - * @return - */ - private String readToEndOfGroup(Group g) { - StringBuilder builder = new StringBuilder(); - do { - Char current = reader.consume(); - - } while(reader.current().getCharacter() != g.getEnd()); - return builder.toString(); - } - public boolean isSyntaxSignificant(char c) { return syntaxSignificant.contains(c); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Brackets.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Brackets.java deleted file mode 100644 index ddaed62f1..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Brackets.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dfsek.terra.api.structures.tokenizer.group; - -public class Brackets implements Group { - @Override - public char getBegin() { - return '['; - } - - @Override - public char getEnd() { - return ']'; - } - - @Override - public boolean ignoreInsideSyntax() { - return false; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Group.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Group.java deleted file mode 100644 index 20ab13f83..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Group.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.dfsek.terra.api.structures.tokenizer.group; - -public interface Group { - char getBegin(); - - char getEnd(); - - boolean ignoreInsideSyntax(); -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/LineComment.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/LineComment.java deleted file mode 100644 index 7f458af71..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/LineComment.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dfsek.terra.api.structures.tokenizer.group; - -public class LineComment implements Group { - @Override - public char getBegin() { - return '#'; - } - - @Override - public char getEnd() { - return '\n'; - } - - @Override - public boolean ignoreInsideSyntax() { - return true; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Parentheses.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Parentheses.java deleted file mode 100644 index 91af4aa00..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Parentheses.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dfsek.terra.api.structures.tokenizer.group; - -public class Parentheses implements Group { - @Override - public char getBegin() { - return '('; - } - - @Override - public char getEnd() { - return ')'; - } - - @Override - public boolean ignoreInsideSyntax() { - return false; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Quotes.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Quotes.java deleted file mode 100644 index f092bc520..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/group/Quotes.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.dfsek.terra.api.structures.tokenizer.group; - -public class Quotes implements Group { - - @Override - public char getBegin() { - return '"'; - } - - @Override - public char getEnd() { - return '"'; - } - - @Override - public boolean ignoreInsideSyntax() { - return true; - } -} diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java new file mode 100644 index 000000000..dbc98b64c --- /dev/null +++ b/common/src/test/java/structure/ParserTest.java @@ -0,0 +1,73 @@ +package structure; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.Argument; +import com.dfsek.terra.api.structures.parser.Function; +import com.dfsek.terra.api.structures.parser.FunctionBuilder; +import com.dfsek.terra.api.structures.parser.Parser; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import org.apache.commons.io.IOUtils; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +public class ParserTest { + @Test + public void parse() throws IOException, ParseException { + Parser parser = new Parser(IOUtils.toString(getClass().getResourceAsStream("/test.tesf"))); + + parser.addFunction("test", new FunctionBuilder() { + @Override + public Test1 build(List argumentList) throws ParseException { + return new Test1(argumentList.get(0), Double.parseDouble(argumentList.get(1))); + } + + @Override + public List> getArguments() { + return Arrays.asList(id -> id, Double::parseDouble); + } + }); + + List functions = parser.parse(); + + for(Function f : functions) { + System.out.println(f); + } + } + + private static class Test1 implements Function { + private final String a; + private final double b; + + public Test1(String a, double b) { + this.a = a; + this.b = b; + } + + public String getA() { + return a; + } + + public double getB() { + return b; + } + + @Override + public void apply(Location location) { + + } + + @Override + public void apply(Location location, Chunk chunk) { + + } + + @Override + public String name() { + return null; + } + } +} diff --git a/common/src/test/java/structure/TokenizerTest.java b/common/src/test/java/structure/TokenizerTest.java index 37f071cad..73e0fd6e2 100644 --- a/common/src/test/java/structure/TokenizerTest.java +++ b/common/src/test/java/structure/TokenizerTest.java @@ -12,12 +12,15 @@ public class TokenizerTest { @Test public void tokens() throws IOException, TokenizerException { Tokenizer tokenizer = new Tokenizer(IOUtils.toString(getClass().getResourceAsStream("/test.tesf"))); + // Actual run + long l = System.nanoTime(); - for(int i = 0; i < 100; i++) { + + while(tokenizer.hasNext()) { Token t = tokenizer.fetch(); - if(t == null) break; System.out.println(t); - } + + System.out.println((double) (System.nanoTime() - l) / 1000000); } } diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index d170e2f2c..f1cc70dca 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,18 +1,4 @@ -FUNCTION(1, "hello"); +test("hello", 1); -; -) +test("ghgjhgjhgj", 3.4); -FUNCTION2(1.2, "he423llo"); - -// comment - -FUNCTION3(3.4, "35234523452345"); - -/* -block comment -fsfsdf -gsdfgsdfg -*/ - -FUNCTION(1, "hello"); \ No newline at end of file From 474962db399b4bef76086a88b4b9d3c742dfa6a7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 19 Dec 2020 21:03:14 -0700 Subject: [PATCH 069/210] add escape character to parser string literals --- .../terra/api/structures/parser/Function.java | 6 +-- .../terra/api/structures/parser/Parser.java | 46 ++++++++++--------- .../api/structures/parser/lang/Block.java | 4 ++ .../structures/parser/lang/Expression.java | 4 ++ .../api/structures/parser/lang/Item.java | 4 ++ .../terra/api/structures/tokenizer/Token.java | 2 +- .../api/structures/tokenizer/Tokenizer.java | 15 +++++- .../src/test/java/structure/ParserTest.java | 24 ++++++---- common/src/test/resources/test.tesf | 4 +- 9 files changed, 69 insertions(+), 40 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Function.java index ec4393f48..d60f60cc8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Function.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Function.java @@ -3,10 +3,10 @@ package com.dfsek.terra.api.structures.parser; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; -public interface Function { - void apply(Location location); +public interface Function { + T apply(Location location); - void apply(Location location, Chunk chunk); + T apply(Location location, Chunk chunk); String name(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 399212b99..7a991d226 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -15,21 +15,21 @@ import java.util.stream.Collectors; public class Parser { private final String data; - private final Map> functions = new HashMap<>(); + private final Map>> functions = new HashMap<>(); Set allowedArguments = Sets.newHashSet(Token.Type.STRING, Token.Type.NUMBER, Token.Type.IDENTIFIER); public Parser(String data) { this.data = data; } - public Parser addFunction(String name, FunctionBuilder functionBuilder) { + public Parser addFunction(String name, FunctionBuilder> functionBuilder) { functions.put(name, functionBuilder); return this; } - public List parse() throws ParseException { + public List> parse() throws ParseException { Tokenizer tokenizer = new Tokenizer(data); - List builtFunctions = new GlueList<>(); + List> builtFunctions = new GlueList<>(); List functionBuilder = new GlueList<>(); Token token = null; while(tokenizer.hasNext()) { @@ -46,32 +46,15 @@ public class Parser { checkType(functionBuilder.remove(0), Token.Type.BODY_BEGIN); // Second is body begin - boolean expectingSeparator = false; - List args = new GlueList<>(); - - while(!functionBuilder.get(0).getType().equals(Token.Type.BODY_END)) { - Token current = functionBuilder.remove(0); - if(expectingSeparator) { - checkType(current, Token.Type.SEPARATOR); - expectingSeparator = false; - } else { - if(!allowedArguments.contains(current.getType())) - throw new ParseException("Token type " + current.getType() + " not allowed in arguments: " + current.getStart()); - args.add(current); - expectingSeparator = true; - } - } + List args = getArgs(functionBuilder); // Extract arguments, consume the rest. functionBuilder.remove(0); // Remove body end - for(Token t : args) System.out.println("TOKEN: " + t); - checkType(functionBuilder.remove(0), Token.Type.STATEMENT_END); List arg = args.stream().map(Token::getContent).collect(Collectors.toList()); - for(String s : arg) System.out.println("ARG: " + s); FunctionBuilder builder = functions.get(identifier.getContent()); if(arg.size() != builder.getArguments().size()) throw new ParseException("Expected " + builder.getArguments().size() + " arguments, found " + arg.size() + ": " + identifier.getStart()); @@ -89,6 +72,25 @@ public class Parser { return builtFunctions; } + private List getArgs(List functionBuilder) throws ParseException { + List args = new GlueList<>(); + boolean expectingSeparator = false; + + while(!functionBuilder.get(0).getType().equals(Token.Type.BODY_END)) { + Token current = functionBuilder.remove(0); + if(expectingSeparator) { + checkType(current, Token.Type.SEPARATOR); + expectingSeparator = false; + } else { + if(!allowedArguments.contains(current.getType())) + throw new ParseException("Token type " + current.getType() + " not allowed in arguments: " + current.getStart()); + args.add(current); + expectingSeparator = true; + } + } + return args; + } + private void checkType(Token token, Token.Type expected) throws ParseException { if(!token.getType().equals(expected)) throw new ParseException("Expected " + expected + " but found " + token.getType() + ": " + token.getStart()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java new file mode 100644 index 000000000..385264f2b --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.structures.parser.lang; + +public class Block { +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java new file mode 100644 index 000000000..b2c539e3e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.structures.parser.lang; + +public class Expression { +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java new file mode 100644 index 000000000..0940ba797 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.structures.parser.lang; + +public interface Item { +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index e7502195a..dd6d88373 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -29,6 +29,6 @@ public class Token { } public enum Type { - IDENTIFIER, NUMBER, STRING, BOOLEAN, BODY_BEGIN, BODY_END, STATEMENT_END, SEPARATOR + IDENTIFIER, NUMBER, STRING, BOOLEAN, BODY_BEGIN, BODY_END, STATEMENT_END, SEPARATOR, BLOCK_BEGIN, BLOCK_END } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index f2bb0da99..9eb73ffc3 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -11,7 +11,8 @@ import java.util.Set; public class Tokenizer { private final Lookahead reader; - private final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', '[', ']', ','); + private final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', // Currently used chars + '{', '}'); // Reserved chars public Tokenizer(String data) { @@ -42,7 +43,13 @@ public class Tokenizer { if(reader.current().is('"')) { reader.consume(); // Consume first quote StringBuilder string = new StringBuilder(); - while(!reader.current().is('"')) { + boolean ignoreNext = false; + while((!reader.current().is('"')) || ignoreNext) { + if(reader.current().is('\\') && !ignoreNext) { + ignoreNext = true; + reader.consume(); + continue; + } else ignoreNext = false; if(reader.current().isEOF()) throw new FormatException("No end of string literal found. " + reader.getLine() + ":" + reader.getIndex()); string.append(reader.consume()); @@ -59,6 +66,10 @@ public class Tokenizer { return new Token(reader.consume().toString(), Token.Type.STATEMENT_END, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is(',')) return new Token(reader.consume().toString(), Token.Type.SEPARATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is('{')) + return new Token(reader.consume().toString(), Token.Type.BLOCK_BEGIN, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is('}')) + return new Token(reader.consume().toString(), Token.Type.BLOCK_END, new Position(reader.getLine(), reader.getIndex())); StringBuilder token = new StringBuilder(); while(!reader.current().isEOF() && !isSyntaxSignificant(reader.current().getCharacter())) { diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index dbc98b64c..24d57a8b5 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -31,14 +31,15 @@ public class ParserTest { } }); - List functions = parser.parse(); + long l = System.nanoTime(); + List> functions = parser.parse(); + long t = System.nanoTime() - l; + System.out.println("Took " + (double) t / 1000000); - for(Function f : functions) { - System.out.println(f); - } + for(Function f : functions) System.out.println(f); } - private static class Test1 implements Function { + private static class Test1 implements Function { private final String a; private final double b; @@ -56,18 +57,23 @@ public class ParserTest { } @Override - public void apply(Location location) { - + public Void apply(Location location) { + return null; } @Override - public void apply(Location location, Chunk chunk) { - + public Void apply(Location location, Chunk chunk) { + return null; } @Override public String name() { return null; } + + @Override + public String toString() { + return "string: " + a + ", double: " + b; + } } } diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index f1cc70dca..7197182b4 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,4 +1,2 @@ test("hello", 1); - -test("ghgjhgjhgj", 3.4); - +test("ghgj{}()\"\\hgjhgj", 3.4); From 2880c29f8c518289feb31a2fc751c11a4bbc1433 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 20 Dec 2020 01:08:37 -0700 Subject: [PATCH 070/210] if statements with code blocks --- .../terra/api/structures/parser/Function.java | 12 -- .../structures/parser/FunctionBuilder.java | 2 + .../terra/api/structures/parser/Parser.java | 112 +++++++++++++----- .../parser/{ => lang}/Argument.java | 2 +- .../api/structures/parser/lang/Block.java | 28 ++++- .../structures/parser/lang/Expression.java | 2 +- .../api/structures/parser/lang/Function.java | 6 + .../api/structures/parser/lang/Item.java | 8 +- .../api/structures/parser/lang/Keyword.java | 4 + .../api/structures/parser/lang/Statement.java | 4 + .../parser/lang/keywords/IfKeyword.java | 29 +++++ .../parser/lang/keywords/ReturnKeyword.java | 17 +++ .../lang/statements/EqualsStatement.java | 26 ++++ .../structures/script/StructureScript.java | 4 + .../api/structures/tokenizer/Position.java | 2 +- .../terra/api/structures/tokenizer/Token.java | 49 +++++++- .../api/structures/tokenizer/Tokenizer.java | 17 ++- .../src/test/java/structure/ParserTest.java | 9 +- common/src/test/resources/test.tesf | 6 + 19 files changed, 286 insertions(+), 53 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/Function.java rename common/src/main/java/com/dfsek/terra/api/structures/parser/{ => lang}/Argument.java (53%) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Statement.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Function.java deleted file mode 100644 index d60f60cc8..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Function.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dfsek.terra.api.structures.parser; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; - -public interface Function { - T apply(Location location); - - T apply(Location location, Chunk chunk); - - String name(); -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java index 8b24fbcf0..b340b4bf9 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java @@ -1,6 +1,8 @@ package com.dfsek.terra.api.structures.parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Argument; +import com.dfsek.terra.api.structures.parser.lang.Function; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 7a991d226..ba9fe389c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -1,6 +1,13 @@ package com.dfsek.terra.api.structures.parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.Function; +import com.dfsek.terra.api.structures.parser.lang.Item; +import com.dfsek.terra.api.structures.parser.lang.Keyword; +import com.dfsek.terra.api.structures.parser.lang.Statement; +import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword; +import com.dfsek.terra.api.structures.parser.lang.statements.EqualsStatement; import com.dfsek.terra.api.structures.tokenizer.Token; import com.dfsek.terra.api.structures.tokenizer.Tokenizer; import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; @@ -16,6 +23,8 @@ import java.util.stream.Collectors; public class Parser { private final String data; private final Map>> functions = new HashMap<>(); + private final Set keywords = Sets.newHashSet("if"); + Set allowedArguments = Sets.newHashSet(Token.Type.STRING, Token.Type.NUMBER, Token.Type.IDENTIFIER); public Parser(String data) { @@ -27,49 +36,94 @@ public class Parser { return this; } - public List> parse() throws ParseException { + public Block parse() throws ParseException { Tokenizer tokenizer = new Tokenizer(data); - List> builtFunctions = new GlueList<>(); - List functionBuilder = new GlueList<>(); - Token token = null; - while(tokenizer.hasNext()) { - try { - token = tokenizer.fetch(); - functionBuilder.add(token); - if(token.getType().equals(Token.Type.STATEMENT_END)) { - Token identifier = functionBuilder.remove(0); - checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier + List tokens = new GlueList<>(); + try { + while(tokenizer.hasNext()) tokens.add(tokenizer.fetch()); + } catch(TokenizerException e) { + throw new ParseException("Failed to tokenize input", e); + } - if(!functions.containsKey(identifier.getContent())) - throw new ParseException("No such function " + identifier.getContent() + ": " + identifier.getStart()); - - checkType(functionBuilder.remove(0), Token.Type.BODY_BEGIN); // Second is body begin + return parseBlock(tokens); + } - List args = getArgs(functionBuilder); // Extract arguments, consume the rest. + private Keyword parseKeyword(List tokens, List functionAndArguments) throws ParseException { - functionBuilder.remove(0); // Remove body end + Token identifier = functionAndArguments.remove(0); + System.out.println("Parsing keyword at " + identifier.getStart()); + checkType(identifier, Token.Type.IDENTIFIER); + if(!keywords.contains(identifier.getContent())) + throw new ParseException("No such keyword " + identifier.getContent() + ": " + identifier.getStart()); + Keyword k = null; + if(identifier.getContent().equals("if")) { - checkType(functionBuilder.remove(0), Token.Type.STATEMENT_END); + checkType(functionAndArguments.remove(0), Token.Type.BODY_BEGIN); - List arg = args.stream().map(Token::getContent).collect(Collectors.toList()); + Function left = parseFunction(functionAndArguments, false); - FunctionBuilder builder = functions.get(identifier.getContent()); - if(arg.size() != builder.getArguments().size()) - throw new ParseException("Expected " + builder.getArguments().size() + " arguments, found " + arg.size() + ": " + identifier.getStart()); + Statement statement = null; + Token comparator = functionAndArguments.remove(0); + checkType(comparator, Token.Type.BOOLEAN_OPERATOR); - builtFunctions.add(functions.get(identifier.getContent()).build(arg)); + Function right = parseFunction(functionAndArguments, false); - functionBuilder.clear(); - } - } catch(TokenizerException e) { - throw new ParseException("Failed to tokenize input", e); + checkType(functionAndArguments.remove(0), Token.Type.BODY_END); + if(comparator.getContent().equals("==")) { + statement = new EqualsStatement(left, right); } + k = new IfKeyword(parseBlock(tokens), statement); + } - if(token != null) checkType(token, Token.Type.STATEMENT_END); - return builtFunctions; + return k; + } + + private Block parseBlock(List tokens) throws ParseException { + List> parsedItems = new GlueList<>(); + List functionArgs = new GlueList<>(); + + while(tokens.size() > 0) { + Token token = tokens.remove(0); + System.out.println(token); + if(token.getType().equals(Token.Type.BLOCK_END)) break; + functionArgs.add(token); + if(token.getType().equals(Token.Type.STATEMENT_END)) { + parsedItems.add(parseFunction(functionArgs, true)); + functionArgs.clear(); + } else if(token.getType().equals(Token.Type.BLOCK_BEGIN)) { + parsedItems.add(parseKeyword(tokens, functionArgs)); + functionArgs.clear(); + } + } + return new Block(parsedItems); + } + + private Function parseFunction(List functionAndArguments, boolean fullStatement) throws ParseException { + Token identifier = functionAndArguments.remove(0); + System.out.println("Parsing function at " + identifier.getStart()); + checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier + + if(!functions.containsKey(identifier.getContent())) + throw new ParseException("No such function " + identifier.getContent() + ": " + identifier.getStart()); + + checkType(functionAndArguments.remove(0), Token.Type.BODY_BEGIN); // Second is body begin + + + List args = getArgs(functionAndArguments); // Extract arguments, consume the rest. + + functionAndArguments.remove(0); // Remove body end + + if(fullStatement) checkType(functionAndArguments.remove(0), Token.Type.STATEMENT_END); + + List arg = args.stream().map(Token::getContent).collect(Collectors.toList()); + + FunctionBuilder builder = functions.get(identifier.getContent()); + if(arg.size() != builder.getArguments().size()) + throw new ParseException("Expected " + builder.getArguments().size() + " arguments, found " + arg.size() + ": " + identifier.getStart()); + return functions.get(identifier.getContent()).build(arg); } private List getArgs(List functionBuilder) throws ParseException { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Argument.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Argument.java similarity index 53% rename from common/src/main/java/com/dfsek/terra/api/structures/parser/Argument.java rename to common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Argument.java index ffe9eb84d..98a7c246f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Argument.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Argument.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.structures.parser; +package com.dfsek.terra.api.structures.parser.lang; public interface Argument { T parse(String input); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index 385264f2b..95ea2bf01 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -1,4 +1,30 @@ package com.dfsek.terra.api.structures.parser.lang; -public class Block { +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; + +import java.util.List; + +public class Block implements Item { + private final List> items; + + public Block(List> items) { + this.items = items; + } + + public List> getItems() { + return items; + } + + @Override + public Void apply(Location location) { + items.forEach(item -> item.apply(location)); + return null; + } + + @Override + public Void apply(Location location, Chunk chunk) { + items.forEach(item -> item.apply(location, chunk)); + return null; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java index b2c539e3e..8a25fd846 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java @@ -1,4 +1,4 @@ package com.dfsek.terra.api.structures.parser.lang; -public class Expression { +public interface Expression extends Item { } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java new file mode 100644 index 000000000..884516e4c --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.api.structures.parser.lang; + +public interface Function extends Expression { + + String name(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java index 0940ba797..449523dc0 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java @@ -1,4 +1,10 @@ package com.dfsek.terra.api.structures.parser.lang; -public interface Item { +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; + +public interface Item { + T apply(Location location); + + T apply(Location location, Chunk chunk); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java new file mode 100644 index 000000000..5644784de --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.structures.parser.lang; + +public interface Keyword extends Expression { +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Statement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Statement.java new file mode 100644 index 000000000..f268f4592 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Statement.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.structures.parser.lang; + +public interface Statement extends Item { +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java new file mode 100644 index 000000000..22a060f65 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.api.structures.parser.lang.keywords; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.Keyword; +import com.dfsek.terra.api.structures.parser.lang.Statement; + +public class IfKeyword implements Keyword { + private final Block conditional; + private final Statement statement; + + public IfKeyword(Block conditional, Statement statement) { + this.conditional = conditional; + this.statement = statement; + } + + @Override + public Void apply(Location location) { + if(statement.apply(location)) conditional.apply(location); + return null; + } + + @Override + public Void apply(Location location, Chunk chunk) { + if(statement.apply(location, chunk)) conditional.apply(location, chunk); + return null; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java new file mode 100644 index 000000000..402ebeccc --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.api.structures.parser.lang.keywords; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Keyword; + +public class ReturnKeyword implements Keyword { + @Override + public Void apply(Location location) { + return null; + } + + @Override + public Void apply(Location location, Chunk chunk) { + return null; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java new file mode 100644 index 000000000..b55178685 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.api.structures.parser.lang.statements; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Item; +import com.dfsek.terra.api.structures.parser.lang.Statement; + +public class EqualsStatement implements Statement { + private final Item left; + private final Item right; + + public EqualsStatement(Item left, Item right) { + this.left = left; + this.right = right; + } + + @Override + public Boolean apply(Location location) { + return left.apply(location).equals(right.apply(location)); + } + + @Override + public Boolean apply(Location location, Chunk chunk) { + return left.apply(location, chunk).equals(right.apply(location, chunk)); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java new file mode 100644 index 000000000..d4a3f2508 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.structures.script; + +public class StructureScript { +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Position.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Position.java index 2c0651409..17d319edb 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Position.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Position.java @@ -11,6 +11,6 @@ public class Position { @Override public String toString() { - return (line + 1) + ":" + (index + 1); + return (line + 1) + ":" + index; } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index dd6d88373..34f5f9eb1 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -29,6 +29,53 @@ public class Token { } public enum Type { - IDENTIFIER, NUMBER, STRING, BOOLEAN, BODY_BEGIN, BODY_END, STATEMENT_END, SEPARATOR, BLOCK_BEGIN, BLOCK_END + /** + * Function identifier or language keyword + */ + IDENTIFIER, + /** + * Numeric literal + */ + NUMBER, + /** + * String literal + */ + STRING, + /** + * Boolean literal + */ + BOOLEAN, + /** + * Beginning of function body + */ + BODY_BEGIN, + /** + * Ending of function body + */ + BODY_END, + /** + * End of statement + */ + STATEMENT_END, + /** + * Argument separator + */ + SEPARATOR, + /** + * Beginning of code block + */ + BLOCK_BEGIN, + /** + * End of code block + */ + BLOCK_END, + /** + * assignment operator + */ + ASSIGNMENT, + /** + * Boolean operator + */ + BOOLEAN_OPERATOR } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index 9eb73ffc3..d4a77b5ff 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -11,7 +11,7 @@ import java.util.Set; public class Tokenizer { private final Lookahead reader; - private final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', // Currently used chars + private final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', // Currently used chars '{', '}'); // Reserved chars @@ -32,6 +32,13 @@ public class Tokenizer { if(reader.matches("/*", true)) skipTo("*/"); // Skip multi line comment + if(reader.matches("true", true)) + return new Token("true", Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("false", true)) + return new Token("false", Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("==", true)) + return new Token("==", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(isNumberStart()) { StringBuilder num = new StringBuilder(); while(!reader.current().isEOF() && isNumberLike()) { @@ -55,6 +62,7 @@ public class Tokenizer { string.append(reader.consume()); } reader.consume(); // Consume last quote + return new Token(string.toString(), Token.Type.STRING, new Position(reader.getLine(), reader.getIndex())); } @@ -70,6 +78,8 @@ public class Tokenizer { return new Token(reader.consume().toString(), Token.Type.BLOCK_BEGIN, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is('}')) return new Token(reader.consume().toString(), Token.Type.BLOCK_END, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is('=')) + return new Token(reader.consume().toString(), Token.Type.ASSIGNMENT, new Position(reader.getLine(), reader.getIndex())); StringBuilder token = new StringBuilder(); while(!reader.current().isEOF() && !isSyntaxSignificant(reader.current().getCharacter())) { @@ -77,7 +87,10 @@ public class Tokenizer { if(!c.isWhitespace()) token.append(c); } - return new Token(token.toString(), Token.Type.IDENTIFIER, new Position(reader.getLine(), reader.getIndex())); + String tokenString = token.toString(); + + + return new Token(tokenString, Token.Type.IDENTIFIER, new Position(reader.getLine(), reader.getIndex())); } private boolean isNumberLike() { diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 24d57a8b5..3f4cd18d3 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -2,11 +2,12 @@ package structure; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.structures.parser.Argument; -import com.dfsek.terra.api.structures.parser.Function; import com.dfsek.terra.api.structures.parser.FunctionBuilder; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Argument; +import com.dfsek.terra.api.structures.parser.lang.Function; +import com.dfsek.terra.api.structures.parser.lang.Item; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; @@ -32,11 +33,11 @@ public class ParserTest { }); long l = System.nanoTime(); - List> functions = parser.parse(); + List> functions = parser.parse().getItems(); long t = System.nanoTime() - l; System.out.println("Took " + (double) t / 1000000); - for(Function f : functions) System.out.println(f); + for(Item f : functions) System.out.println(f); } private static class Test1 implements Function { diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 7197182b4..916c3537c 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,2 +1,8 @@ test("hello", 1); test("ghgj{}()\"\\hgjhgj", 3.4); + +if(test("hello", 1) == test("hello", 1)) { + test("hello", 1); +} + +test("ghgj{}()\"\\hgjhgj", 3.4); \ No newline at end of file From c4f927e72c3a8f412e073e193d1cebeb98675a36 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 20 Dec 2020 01:43:50 -0700 Subject: [PATCH 071/210] account for dangling opening/closing brace --- .../terra/api/structures/parser/FunctionBuilder.java | 5 ++--- .../dfsek/terra/api/structures/parser/Parser.java | 12 ++++++++++-- common/src/test/java/structure/ParserTest.java | 6 ++---- 3 files changed, 14 insertions(+), 9 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java index b340b4bf9..0b596db84 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java @@ -1,13 +1,12 @@ package com.dfsek.terra.api.structures.parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.parser.lang.Argument; import com.dfsek.terra.api.structures.parser.lang.Function; import java.util.List; -public interface FunctionBuilder { +public interface FunctionBuilder> { T build(List argumentList) throws ParseException; - List> getArguments(); + int getArguments(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index ba9fe389c..d7f0700f2 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -45,6 +45,14 @@ public class Parser { } catch(TokenizerException e) { throw new ParseException("Failed to tokenize input", e); } + // Check for dangling brackets + int blockLevel = 0; + for(Token t : tokens) { + if(t.getType().equals(Token.Type.BLOCK_BEGIN)) blockLevel++; + else if(t.getType().equals(Token.Type.BLOCK_END)) blockLevel--; + if(blockLevel < 0) throw new ParseException("Dangling closing brace: " + t.getStart()); + } + if(blockLevel != 0) throw new ParseException("Dangling opening brace"); return parseBlock(tokens); } @@ -121,8 +129,8 @@ public class Parser { List arg = args.stream().map(Token::getContent).collect(Collectors.toList()); FunctionBuilder builder = functions.get(identifier.getContent()); - if(arg.size() != builder.getArguments().size()) - throw new ParseException("Expected " + builder.getArguments().size() + " arguments, found " + arg.size() + ": " + identifier.getStart()); + if(arg.size() != builder.getArguments() && builder.getArguments() != -1) + throw new ParseException("Expected " + builder.getArguments() + " arguments, found " + arg.size() + ": " + identifier.getStart()); return functions.get(identifier.getContent()).build(arg); } diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 3f4cd18d3..29659085f 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -5,14 +5,12 @@ import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.FunctionBuilder; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.parser.lang.Argument; import com.dfsek.terra.api.structures.parser.lang.Function; import com.dfsek.terra.api.structures.parser.lang.Item; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; import java.io.IOException; -import java.util.Arrays; import java.util.List; public class ParserTest { @@ -27,8 +25,8 @@ public class ParserTest { } @Override - public List> getArguments() { - return Arrays.asList(id -> id, Double::parseDouble); + public int getArguments() { + return 2; } }); From 8b97d74e0a4e59c81b04532605aa157b9b4fc6d4 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 20 Dec 2020 01:50:41 -0700 Subject: [PATCH 072/210] allow constant expressions in if statements --- .../terra/api/structures/parser/Parser.java | 12 ++++++++-- .../parser/lang/ConstantExpression.java | 22 +++++++++++++++++++ .../terra/api/structures/tokenizer/Token.java | 4 ++++ common/src/test/resources/test.tesf | 2 +- 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index d7f0700f2..a971995c6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -2,6 +2,8 @@ package com.dfsek.terra.api.structures.parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.ConstantExpression; +import com.dfsek.terra.api.structures.parser.lang.Expression; import com.dfsek.terra.api.structures.parser.lang.Function; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Keyword; @@ -70,13 +72,13 @@ public class Parser { checkType(functionAndArguments.remove(0), Token.Type.BODY_BEGIN); - Function left = parseFunction(functionAndArguments, false); + Expression left = parseExpression(functionAndArguments); Statement statement = null; Token comparator = functionAndArguments.remove(0); checkType(comparator, Token.Type.BOOLEAN_OPERATOR); - Function right = parseFunction(functionAndArguments, false); + Expression right = parseExpression(functionAndArguments); checkType(functionAndArguments.remove(0), Token.Type.BODY_END); if(comparator.getContent().equals("==")) { @@ -89,6 +91,12 @@ public class Parser { return k; } + private Expression parseExpression(List tokens) throws ParseException { + if(tokens.get(0).isConstant()) { + return new ConstantExpression(tokens.remove(0)); + } else return parseFunction(tokens, false); + } + private Block parseBlock(List tokens) throws ParseException { List> parsedItems = new GlueList<>(); List functionArgs = new GlueList<>(); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java new file mode 100644 index 000000000..bf82fe7af --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.api.structures.parser.lang; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; + +public class ConstantExpression implements Expression { + private final Object constant; + + public ConstantExpression(Object constant) { + this.constant = constant; + } + + @Override + public Object apply(Location location) { + return constant; + } + + @Override + public Object apply(Location location, Chunk chunk) { + return constant; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 34f5f9eb1..9696943bf 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -28,6 +28,10 @@ public class Token { return type + ": '" + content + "'"; } + public boolean isConstant() { + return this.type.equals(Type.NUMBER) || this.type.equals(Type.STRING) || this.type.equals(Type.BOOLEAN); + } + public enum Type { /** * Function identifier or language keyword diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 916c3537c..8fe2f603a 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,7 +1,7 @@ test("hello", 1); test("ghgj{}()\"\\hgjhgj", 3.4); -if(test("hello", 1) == test("hello", 1)) { +if(test("hello", 1) == "a string literal") { test("hello", 1); } From e1cb46c8fdf5d5a055246c31a3c24a5cb347611e Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 20 Dec 2020 02:21:19 -0700 Subject: [PATCH 073/210] basic structure implementation --- .../terra/api/structures/parser/Parser.java | 5 +-- .../parser/lang/ConstantExpression.java | 1 + .../lang/statements/EqualsStatement.java | 2 + .../script/builders/BlockFunctionBuilder.java | 26 +++++++++++ .../script/builders/SpawnCheckBuilder.java | 26 +++++++++++ .../script/functions/BlockFunction.java | 35 +++++++++++++++ .../script/functions/CheckFunction.java | 43 +++++++++++++++++++ .../terra/api/structures/world/AirCheck.java | 25 +++++++++++ .../terra/api/structures/world/LandCheck.java | 22 ++++++++++ .../api/structures/world/OceanCheck.java | 25 +++++++++++ .../api/structures/world/SpawnCheck.java | 17 ++++++++ .../src/test/java/structure/ParserTest.java | 2 +- .../test/java/structure/TokenizerTest.java | 2 +- common/src/test/resources/test.tesf | 8 ---- .../structure/load/LoadRawCommand.java | 21 +++++++++ 15 files changed, 246 insertions(+), 14 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/SpawnCheckBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/world/SpawnCheck.java delete mode 100644 common/src/test/resources/test.tesf diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index a971995c6..9df204285 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -63,7 +63,6 @@ public class Parser { private Keyword parseKeyword(List tokens, List functionAndArguments) throws ParseException { Token identifier = functionAndArguments.remove(0); - System.out.println("Parsing keyword at " + identifier.getStart()); checkType(identifier, Token.Type.IDENTIFIER); if(!keywords.contains(identifier.getContent())) throw new ParseException("No such keyword " + identifier.getContent() + ": " + identifier.getStart()); @@ -93,7 +92,7 @@ public class Parser { private Expression parseExpression(List tokens) throws ParseException { if(tokens.get(0).isConstant()) { - return new ConstantExpression(tokens.remove(0)); + return new ConstantExpression(tokens.remove(0).getContent()); } else return parseFunction(tokens, false); } @@ -103,7 +102,6 @@ public class Parser { while(tokens.size() > 0) { Token token = tokens.remove(0); - System.out.println(token); if(token.getType().equals(Token.Type.BLOCK_END)) break; functionArgs.add(token); if(token.getType().equals(Token.Type.STATEMENT_END)) { @@ -119,7 +117,6 @@ public class Parser { private Function parseFunction(List functionAndArguments, boolean fullStatement) throws ParseException { Token identifier = functionAndArguments.remove(0); - System.out.println("Parsing function at " + identifier.getStart()); checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier if(!functions.containsKey(identifier.getContent())) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java index bf82fe7af..fdd9a0f2a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java @@ -15,6 +15,7 @@ public class ConstantExpression implements Expression { return constant; } + @Override public Object apply(Location location, Chunk chunk) { return constant; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java index b55178685..a329a360f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java @@ -16,6 +16,8 @@ public class EqualsStatement implements Statement { @Override public Boolean apply(Location location) { + System.out.println(left.apply(location)); + System.out.println(right.apply(location)); return left.apply(location).equals(right.apply(location)); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java new file mode 100644 index 000000000..156453db7 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.FunctionBuilder; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.script.functions.BlockFunction; + +import java.util.List; + +public class BlockFunctionBuilder implements FunctionBuilder { + private final TerraPlugin main; + + public BlockFunctionBuilder(TerraPlugin main) { + this.main = main; + } + + @Override + public BlockFunction build(List argumentList) throws ParseException { + return new BlockFunction(Integer.parseInt(argumentList.get(0)), Integer.parseInt(argumentList.get(1)), Integer.parseInt(argumentList.get(2)), main.getWorldHandle().createBlockData(argumentList.get(3))); + } + + @Override + public int getArguments() { + return 4; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/SpawnCheckBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/SpawnCheckBuilder.java new file mode 100644 index 000000000..a8010b304 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/SpawnCheckBuilder.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.FunctionBuilder; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.script.functions.CheckFunction; + +import java.util.List; + +public class SpawnCheckBuilder implements FunctionBuilder { + private final TerraPlugin main; + + public SpawnCheckBuilder(TerraPlugin main) { + this.main = main; + } + + @Override + public CheckFunction build(List argumentList) throws ParseException { + return new CheckFunction(main, Integer.parseInt(argumentList.get(0)), Integer.parseInt(argumentList.get(1)), Integer.parseInt(argumentList.get(2))); + } + + @Override + public int getArguments() { + return 3; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java new file mode 100644 index 000000000..08c0411b2 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -0,0 +1,35 @@ +package com.dfsek.terra.api.structures.script.functions; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Function; + +public class BlockFunction implements Function { + private final BlockData data; + private final int x, y, z; + + public BlockFunction(int x, int y, int z, BlockData data) { + this.data = data; + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public String name() { + return "block"; + } + + @Override + public Void apply(Location location) { + location.clone().add(x, y, z).getBlock().setBlockData(data, false); + return null; + } + + @Override + public Void apply(Location location, Chunk chunk) { + //TODO: do + return null; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java new file mode 100644 index 000000000..c6e92f269 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -0,0 +1,43 @@ +package com.dfsek.terra.api.structures.script.functions; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Function; +import com.dfsek.terra.api.structures.world.LandCheck; +import com.dfsek.terra.api.structures.world.OceanCheck; + +public class CheckFunction implements Function { + private final TerraPlugin main; + private final int x, y, z; + + public CheckFunction(TerraPlugin main, int x, int y, int z) { + this.main = main; + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public String name() { + return "check"; + } + + @Override + public String apply(Location location) { + if(new LandCheck(location.getWorld(), main).check(location.getBlockX() + x, location.getBlockY() + y, location.getBlockZ() + z)) + return "LAND"; + if(new OceanCheck(location.getWorld(), main).check(location.getBlockX() + x, location.getBlockY() + y, location.getBlockZ() + z)) + return "OCEAN"; + return "AIR"; + } + + @Override + public String apply(Location location, Chunk chunk) { + if(new LandCheck(location.getWorld(), main).check(location.getBlockX() + x, location.getBlockY() + y, location.getBlockZ() + z)) + return "LAND"; + if(new OceanCheck(location.getWorld(), main).check(location.getBlockX() + x, location.getBlockY() + y, location.getBlockZ() + z)) + return "OCEAN"; + return "AIR"; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java new file mode 100644 index 000000000..9e7ff9f04 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.api.structures.world; + +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.config.templates.BiomeTemplate; +import com.dfsek.terra.generation.config.WorldGenerator; + +public class AirCheck extends SpawnCheck { + public AirCheck(World world, TerraPlugin main) { + super(world, main); + } + + @Override + public boolean check(int x, int y, int z) { + TerraWorld tw = main.getWorld(world); + UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); + BiomeTemplate c = b.getConfig(); + if(y <= c.getSeaLevel()) return false; + double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); + return b.getGenerator().getNoise(world, x, y, z) + elevation <= 0; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java new file mode 100644 index 000000000..964dcd416 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.api.structures.world; + +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.generation.config.WorldGenerator; + +public class LandCheck extends SpawnCheck { + public LandCheck(World world, TerraPlugin main) { + super(world, main); + } + + @Override + public boolean check(int x, int y, int z) { + TerraWorld tw = main.getWorld(world); + UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); + double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); + return b.getGenerator().getNoise(world, x, y, z) + elevation > 0; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java new file mode 100644 index 000000000..ef70cd0e2 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.api.structures.world; + +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.config.templates.BiomeTemplate; +import com.dfsek.terra.generation.config.WorldGenerator; + +public class OceanCheck extends SpawnCheck { + public OceanCheck(World world, TerraPlugin main) { + super(world, main); + } + + @Override + public boolean check(int x, int y, int z) { + TerraWorld tw = main.getWorld(world); + UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); + BiomeTemplate c = b.getConfig(); + if(y > c.getSeaLevel()) return false; + double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); + return b.getGenerator().getNoise(world, x, y, z) + elevation <= 0; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/SpawnCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/SpawnCheck.java new file mode 100644 index 000000000..25bf32683 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/world/SpawnCheck.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.api.structures.world; + +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.World; + +public abstract class SpawnCheck { + protected final World world; + protected final TerraPlugin main; + + protected SpawnCheck(World world, TerraPlugin main) { + this.world = world; + this.main = main; + } + + public abstract boolean check(int x, int y, int z); + +} diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 29659085f..504b3de16 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -16,7 +16,7 @@ import java.util.List; public class ParserTest { @Test public void parse() throws IOException, ParseException { - Parser parser = new Parser(IOUtils.toString(getClass().getResourceAsStream("/test.tesf"))); + Parser parser = new Parser(IOUtils.toString(getClass().getResourceAsStream("/target/server/plugins/Terra/test.tesf"))); parser.addFunction("test", new FunctionBuilder() { @Override diff --git a/common/src/test/java/structure/TokenizerTest.java b/common/src/test/java/structure/TokenizerTest.java index 73e0fd6e2..fe7a01ae4 100644 --- a/common/src/test/java/structure/TokenizerTest.java +++ b/common/src/test/java/structure/TokenizerTest.java @@ -11,7 +11,7 @@ import java.io.IOException; public class TokenizerTest { @Test public void tokens() throws IOException, TokenizerException { - Tokenizer tokenizer = new Tokenizer(IOUtils.toString(getClass().getResourceAsStream("/test.tesf"))); + Tokenizer tokenizer = new Tokenizer(IOUtils.toString(getClass().getResourceAsStream("/target/server/plugins/Terra/test.tesf"))); // Actual run long l = System.nanoTime(); diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf deleted file mode 100644 index 8fe2f603a..000000000 --- a/common/src/test/resources/test.tesf +++ /dev/null @@ -1,8 +0,0 @@ -test("hello", 1); -test("ghgj{}()\"\\hgjhgj", 3.4); - -if(test("hello", 1) == "a string literal") { - test("hello", 1); -} - -test("ghgj{}()\"\\hgjhgj", 3.4); \ No newline at end of file diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index 69b955da0..eda9606fb 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -1,12 +1,23 @@ package com.dfsek.terra.bukkit.command.command.structure.load; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.structures.parser.Parser; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.SpawnCheckBuilder; +import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; +import org.apache.commons.io.IOUtils; import org.bukkit.block.Sign; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -26,6 +37,16 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { + try { + Parser parser = new Parser(IOUtils.toString(new FileInputStream(new File(getMain().getDataFolder(), "test.tesf")))); + parser.addFunction("block", new BlockFunctionBuilder(getMain())); + parser.addFunction("check", new SpawnCheckBuilder(getMain())); + Block main = parser.parse(); + main.apply(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ())); + + } catch(IOException | ParseException e) { + e.printStackTrace(); + } /* try { WorldHandle handle = ((TerraBukkitPlugin) getMain()).getWorldHandle(); From 7cbf8dffbea723acbcc01d6eaeea1a33e60a27c3 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 20 Dec 2020 14:04:33 -0700 Subject: [PATCH 074/210] parse things in a less dumb way --- .../terra/api/structures/parser/Parser.java | 63 +++++++++++-------- .../parser/lang/ConstantExpression.java | 2 +- .../lang/{Expression.java => Executable.java} | 2 +- .../api/structures/parser/lang/Function.java | 3 +- .../api/structures/parser/lang/Keyword.java | 2 +- .../lang/statements/NotEqualsStatement.java | 28 +++++++++ .../terra/api/structures/tokenizer/Token.java | 5 ++ .../api/structures/tokenizer/Tokenizer.java | 8 ++- .../src/test/java/structure/ParserTest.java | 2 +- common/src/test/resources/test.tesf | 8 +++ 10 files changed, 89 insertions(+), 34 deletions(-) rename common/src/main/java/com/dfsek/terra/api/structures/parser/lang/{Expression.java => Executable.java} (52%) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java create mode 100644 common/src/test/resources/test.tesf diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 9df204285..5751b1533 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -3,19 +3,21 @@ package com.dfsek.terra.api.structures.parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.ConstantExpression; -import com.dfsek.terra.api.structures.parser.lang.Expression; +import com.dfsek.terra.api.structures.parser.lang.Executable; import com.dfsek.terra.api.structures.parser.lang.Function; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.parser.lang.Statement; import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword; import com.dfsek.terra.api.structures.parser.lang.statements.EqualsStatement; +import com.dfsek.terra.api.structures.parser.lang.statements.NotEqualsStatement; import com.dfsek.terra.api.structures.tokenizer.Token; import com.dfsek.terra.api.structures.tokenizer.Tokenizer; import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; import com.dfsek.terra.api.util.GlueList; import com.google.common.collect.Sets; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -60,37 +62,41 @@ public class Parser { } - private Keyword parseKeyword(List tokens, List functionAndArguments) throws ParseException { + private Keyword parseKeyword(List tokens) throws ParseException { - Token identifier = functionAndArguments.remove(0); - checkType(identifier, Token.Type.IDENTIFIER); + Token identifier = tokens.remove(0); + checkType(identifier, Token.Type.KEYWORD); if(!keywords.contains(identifier.getContent())) throw new ParseException("No such keyword " + identifier.getContent() + ": " + identifier.getStart()); Keyword k = null; if(identifier.getContent().equals("if")) { - checkType(functionAndArguments.remove(0), Token.Type.BODY_BEGIN); + checkType(tokens.remove(0), Token.Type.BODY_BEGIN); - Expression left = parseExpression(functionAndArguments); + Executable left = parseExpression(tokens); Statement statement = null; - Token comparator = functionAndArguments.remove(0); + Token comparator = tokens.remove(0); checkType(comparator, Token.Type.BOOLEAN_OPERATOR); - Expression right = parseExpression(functionAndArguments); + Executable right = parseExpression(tokens); - checkType(functionAndArguments.remove(0), Token.Type.BODY_END); + checkType(tokens.remove(0), Token.Type.BODY_END); if(comparator.getContent().equals("==")) { statement = new EqualsStatement(left, right); + } else if(comparator.getContent().equals("!=")) { + statement = new NotEqualsStatement(left, right); } + checkType(tokens.remove(0), Token.Type.BLOCK_BEGIN); + k = new IfKeyword(parseBlock(tokens), statement); } return k; } - private Expression parseExpression(List tokens) throws ParseException { + private Executable parseExpression(List tokens) throws ParseException { if(tokens.get(0).isConstant()) { return new ConstantExpression(tokens.remove(0).getContent()); } else return parseFunction(tokens, false); @@ -98,18 +104,25 @@ public class Parser { private Block parseBlock(List tokens) throws ParseException { List> parsedItems = new GlueList<>(); - List functionArgs = new GlueList<>(); - + checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.KEYWORD); + main: while(tokens.size() > 0) { - Token token = tokens.remove(0); - if(token.getType().equals(Token.Type.BLOCK_END)) break; - functionArgs.add(token); - if(token.getType().equals(Token.Type.STATEMENT_END)) { - parsedItems.add(parseFunction(functionArgs, true)); - functionArgs.clear(); - } else if(token.getType().equals(Token.Type.BLOCK_BEGIN)) { - parsedItems.add(parseKeyword(tokens, functionArgs)); - functionArgs.clear(); + Token token = tokens.get(0); + checkType(token, Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END); + switch(token.getType()) { + case KEYWORD: + parsedItems.add(parseKeyword(tokens)); + if(tokens.isEmpty()) break; + checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END); + break; + case IDENTIFIER: + parsedItems.add(parseFunction(tokens, true)); + if(tokens.isEmpty()) break; + checkType(tokens.remove(0), Token.Type.STATEMENT_END, Token.Type.BLOCK_END); + break; + case BLOCK_END: + tokens.remove(0); + break main; } } return new Block(parsedItems); @@ -129,7 +142,7 @@ public class Parser { functionAndArguments.remove(0); // Remove body end - if(fullStatement) checkType(functionAndArguments.remove(0), Token.Type.STATEMENT_END); + if(fullStatement) checkType(functionAndArguments.get(0), Token.Type.STATEMENT_END); List arg = args.stream().map(Token::getContent).collect(Collectors.toList()); @@ -158,8 +171,8 @@ public class Parser { return args; } - private void checkType(Token token, Token.Type expected) throws ParseException { - if(!token.getType().equals(expected)) - throw new ParseException("Expected " + expected + " but found " + token.getType() + ": " + token.getStart()); + private void checkType(Token token, Token.Type... expected) throws ParseException { + for(Token.Type type : expected) if(token.getType().equals(type)) return; + throw new ParseException("Expected " + Arrays.toString(expected) + " but found " + token.getType() + ": " + token.getStart()); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java index fdd9a0f2a..59e25c759 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java @@ -3,7 +3,7 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; -public class ConstantExpression implements Expression { +public class ConstantExpression implements Executable { private final Object constant; public ConstantExpression(Object constant) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Executable.java similarity index 52% rename from common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java rename to common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Executable.java index 8a25fd846..df9ca9665 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Executable.java @@ -1,4 +1,4 @@ package com.dfsek.terra.api.structures.parser.lang; -public interface Expression extends Item { +public interface Executable extends Item { } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java index 884516e4c..293f59e41 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java @@ -1,6 +1,5 @@ package com.dfsek.terra.api.structures.parser.lang; -public interface Function extends Expression { - +public interface Function extends Executable { String name(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java index 5644784de..7407c888e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java @@ -1,4 +1,4 @@ package com.dfsek.terra.api.structures.parser.lang; -public interface Keyword extends Expression { +public interface Keyword extends Executable { } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java new file mode 100644 index 000000000..bcb5e8090 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.api.structures.parser.lang.statements; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Item; +import com.dfsek.terra.api.structures.parser.lang.Statement; + +public class NotEqualsStatement implements Statement { + private final Item left; + private final Item right; + + public NotEqualsStatement(Item left, Item right) { + this.left = left; + this.right = right; + } + + @Override + public Boolean apply(Location location) { + System.out.println(left.apply(location)); + System.out.println(right.apply(location)); + return !left.apply(location).equals(right.apply(location)); + } + + @Override + public Boolean apply(Location location, Chunk chunk) { + return left.apply(location, chunk).equals(right.apply(location, chunk)); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 9696943bf..4dfb55eb7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -37,6 +37,11 @@ public class Token { * Function identifier or language keyword */ IDENTIFIER, + + /** + * Language keyword + */ + KEYWORD, /** * Numeric literal */ diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index d4a77b5ff..39fb54914 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -11,8 +11,8 @@ import java.util.Set; public class Tokenizer { private final Lookahead reader; - private final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', // Currently used chars - '{', '}'); // Reserved chars + private final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+'); // Reserved chars + private final Set keywords = Sets.newHashSet("if", "return"); public Tokenizer(String data) { @@ -38,6 +38,8 @@ public class Tokenizer { return new Token("false", Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("==", true)) return new Token("==", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("!=", true)) + return new Token("!=", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(isNumberStart()) { StringBuilder num = new StringBuilder(); @@ -90,7 +92,7 @@ public class Tokenizer { String tokenString = token.toString(); - return new Token(tokenString, Token.Type.IDENTIFIER, new Position(reader.getLine(), reader.getIndex())); + return new Token(tokenString, keywords.contains(tokenString) ? Token.Type.KEYWORD : Token.Type.IDENTIFIER, new Position(reader.getLine(), reader.getIndex())); } private boolean isNumberLike() { diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 504b3de16..29659085f 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -16,7 +16,7 @@ import java.util.List; public class ParserTest { @Test public void parse() throws IOException, ParseException { - Parser parser = new Parser(IOUtils.toString(getClass().getResourceAsStream("/target/server/plugins/Terra/test.tesf"))); + Parser parser = new Parser(IOUtils.toString(getClass().getResourceAsStream("/test.tesf"))); parser.addFunction("test", new FunctionBuilder() { @Override diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf new file mode 100644 index 000000000..8f82d7331 --- /dev/null +++ b/common/src/test/resources/test.tesf @@ -0,0 +1,8 @@ +test("hello", 2); + +if(test("fsdfsdf", 3) == 2) { + test("fdsgdf", 3.4); + if(test("fsdfsdf", 3) == 2) { + test("fdsgdf", 3.4); + } +} \ No newline at end of file From 6d710ca4424d5cc7c80bdb2ac841e62d4c67c4dd Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 20 Dec 2020 16:46:44 -0700 Subject: [PATCH 075/210] set up framework for binary operations --- .../terra/api/structures/parser/Parser.java | 14 ++++---- .../parser/lang/ConstantExpression.java | 18 +++++++--- .../structures/parser/lang/Executable.java | 15 ++++++++ .../structures/parser/lang/Expression.java | 34 +++++++++++++++++++ .../parser/lang/keywords/IfKeyword.java | 5 +++ .../parser/lang/keywords/ReturnKeyword.java | 5 +++ .../lang/operations/BinaryOperation.java | 5 +++ .../operations/ConcatenationOperation.java | 8 +++++ .../operations/NumberAdditionOperation.java | 8 +++++ .../lang/statements/EqualsStatement.java | 2 -- .../lang/statements/GreaterThanStatement.java | 26 ++++++++++++++ .../lang/statements/NotEqualsStatement.java | 4 +-- .../script/functions/BlockFunction.java | 5 +++ .../script/functions/CheckFunction.java | 5 +++ .../terra/api/structures/tokenizer/Token.java | 6 +++- .../api/structures/tokenizer/Tokenizer.java | 2 ++ .../src/test/java/structure/ParserTest.java | 5 +++ 17 files changed, 149 insertions(+), 18 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 5751b1533..63c1706ec 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -98,7 +98,7 @@ public class Parser { private Executable parseExpression(List tokens) throws ParseException { if(tokens.get(0).isConstant()) { - return new ConstantExpression(tokens.remove(0).getContent()); + return new ConstantExpression<>(tokens.remove(0).getContent()); } else return parseFunction(tokens, false); } @@ -128,21 +128,21 @@ public class Parser { return new Block(parsedItems); } - private Function parseFunction(List functionAndArguments, boolean fullStatement) throws ParseException { - Token identifier = functionAndArguments.remove(0); + private Function parseFunction(List tokens, boolean fullStatement) throws ParseException { + Token identifier = tokens.remove(0); checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier if(!functions.containsKey(identifier.getContent())) throw new ParseException("No such function " + identifier.getContent() + ": " + identifier.getStart()); - checkType(functionAndArguments.remove(0), Token.Type.BODY_BEGIN); // Second is body begin + checkType(tokens.remove(0), Token.Type.BODY_BEGIN); // Second is body begin - List args = getArgs(functionAndArguments); // Extract arguments, consume the rest. + List args = getArgs(tokens); // Extract arguments, consume the rest. - functionAndArguments.remove(0); // Remove body end + tokens.remove(0); // Remove body end - if(fullStatement) checkType(functionAndArguments.get(0), Token.Type.STATEMENT_END); + if(fullStatement) checkType(tokens.get(0), Token.Type.STATEMENT_END); List arg = args.stream().map(Token::getContent).collect(Collectors.toList()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java index 59e25c759..ce0e8304e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java @@ -3,21 +3,29 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; -public class ConstantExpression implements Executable { - private final Object constant; +public class ConstantExpression implements Executable { + private final T constant; - public ConstantExpression(Object constant) { + public ConstantExpression(T constant) { this.constant = constant; } @Override - public Object apply(Location location) { + public T apply(Location location) { return constant; } @Override - public Object apply(Location location, Chunk chunk) { + public T apply(Location location, Chunk chunk) { return constant; } + + @Override + public ReturnType returnType() { + if(constant instanceof String) return ReturnType.STRING; + if(constant instanceof Number) return ReturnType.NUMBER; + if(constant instanceof Boolean) return ReturnType.BOOLEAN; + return ReturnType.OBJECT; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Executable.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Executable.java index df9ca9665..bb6be7ca6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Executable.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Executable.java @@ -1,4 +1,19 @@ package com.dfsek.terra.api.structures.parser.lang; public interface Executable extends Item { + ReturnType returnType(); + + enum ReturnType { + NUMBER(true), STRING(true), BOOLEAN(false), VOID(false), OBJECT(false); + + private final boolean comparable; + + ReturnType(boolean comparable) { + this.comparable = comparable; + } + + public boolean isComparable() { + return comparable; + } + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java new file mode 100644 index 000000000..29b26d203 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.api.structures.parser.lang; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; + +public class Expression implements Executable { + private final ReturnType type; + private final Executable left; + private final Executable right; + private final BinaryOperation operation; + + public Expression(ReturnType type, Executable left, Executable right, BinaryOperation operation) { + this.type = type; + this.left = left; + this.right = right; + this.operation = operation; + } + + @Override + public ReturnType returnType() { + return type; + } + + @Override + public T apply(Location location) { + return operation.apply(left.apply(location), right.apply(location)); + } + + @Override + public T apply(Location location, Chunk chunk) { + return operation.apply(left.apply(location, chunk), right.apply(location, chunk)); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java index 22a060f65..e990b6fbe 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java @@ -26,4 +26,9 @@ public class IfKeyword implements Keyword { if(statement.apply(location, chunk)) conditional.apply(location, chunk); return null; } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java index 402ebeccc..8645888bc 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java @@ -14,4 +14,9 @@ public class ReturnKeyword implements Keyword { public Void apply(Location location, Chunk chunk) { return null; } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java new file mode 100644 index 000000000..c4530127a --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +public interface BinaryOperation { + T apply(T left, T right); +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java new file mode 100644 index 000000000..cbd1adcd4 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +public class ConcatenationOperation implements BinaryOperation { + @Override + public String apply(Object left, Object right) { + return left.toString() + right.toString(); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java new file mode 100644 index 000000000..4dd70f593 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +public class NumberAdditionOperation implements BinaryOperation { + @Override + public Number apply(Number left, Number right) { + return left.doubleValue() + right.doubleValue(); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java index a329a360f..b55178685 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java @@ -16,8 +16,6 @@ public class EqualsStatement implements Statement { @Override public Boolean apply(Location location) { - System.out.println(left.apply(location)); - System.out.println(right.apply(location)); return left.apply(location).equals(right.apply(location)); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java new file mode 100644 index 000000000..b804756d0 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.api.structures.parser.lang.statements; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Item; +import com.dfsek.terra.api.structures.parser.lang.Statement; + +public class GreaterThanStatement> implements Statement { + private final Item left; + private final Item right; + + public GreaterThanStatement(Item left, Item right) { + this.left = left; + this.right = right; + } + + @Override + public Boolean apply(Location location) { + return left.apply(location).compareTo(right.apply(location)) > 0; + } + + @Override + public Boolean apply(Location location, Chunk chunk) { + return left.apply(location).compareTo(right.apply(location)) > 0; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java index bcb5e8090..5d4a2b736 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java @@ -16,13 +16,11 @@ public class NotEqualsStatement implements Statement { @Override public Boolean apply(Location location) { - System.out.println(left.apply(location)); - System.out.println(right.apply(location)); return !left.apply(location).equals(right.apply(location)); } @Override public Boolean apply(Location location, Chunk chunk) { - return left.apply(location, chunk).equals(right.apply(location, chunk)); + return !left.apply(location, chunk).equals(right.apply(location, chunk)); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index 08c0411b2..50e414dbf 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -32,4 +32,9 @@ public class BlockFunction implements Function { //TODO: do return null; } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index c6e92f269..6c5379fc5 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -40,4 +40,9 @@ public class CheckFunction implements Function { return "OCEAN"; return "AIR"; } + + @Override + public ReturnType returnType() { + return ReturnType.STRING; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 4dfb55eb7..66fa93960 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -85,6 +85,10 @@ public class Token { /** * Boolean operator */ - BOOLEAN_OPERATOR + BOOLEAN_OPERATOR, + /** + * Addition/concatenation operator + */ + ADDITION_OPERATOR } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index 39fb54914..729e6969c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -82,6 +82,8 @@ public class Tokenizer { return new Token(reader.consume().toString(), Token.Type.BLOCK_END, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is('=')) return new Token(reader.consume().toString(), Token.Type.ASSIGNMENT, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is('+')) + return new Token(reader.consume().toString(), Token.Type.ADDITION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); StringBuilder token = new StringBuilder(); while(!reader.current().isEOF() && !isSyntaxSignificant(reader.current().getCharacter())) { diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 29659085f..a71009926 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -74,5 +74,10 @@ public class ParserTest { public String toString() { return "string: " + a + ", double: " + b; } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } } } From adc5f0beccf51086669fd0ae0876ffd1e40c05b8 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 21 Dec 2020 01:28:40 -0700 Subject: [PATCH 076/210] more parsing reworks --- .../structures/parser/FunctionBuilder.java | 12 -- .../terra/api/structures/parser/Parser.java | 104 ++++++++++-------- .../api/structures/parser/lang/Block.java | 10 +- .../parser/lang/ConstantExpression.java | 16 ++- .../structures/parser/lang/Expression.java | 16 ++- .../api/structures/parser/lang/Function.java | 5 - .../api/structures/parser/lang/Item.java | 3 + .../api/structures/parser/lang/Keyword.java | 2 +- .../lang/{Executable.java => Returnable.java} | 2 +- .../parser/lang/functions/Function.java | 7 ++ .../lang/functions/FunctionBuilder.java | 13 +++ .../parser/lang/keywords/IfKeyword.java | 14 ++- .../parser/lang/keywords/ReturnKeyword.java | 12 ++ .../lang/operations/BinaryOperation.java | 34 +++++- .../lang/operations/BooleanNotOperation.java | 20 ++++ .../operations/ConcatenationOperation.java | 14 ++- .../operations/MultiplicationOperation.java | 20 ++++ .../operations/NumberAdditionOperation.java | 14 ++- .../lang/operations/UnaryOperation.java | 33 ++++++ .../lang/statements/EqualsStatement.java | 10 +- .../lang/statements/GreaterThanStatement.java | 10 +- .../lang/statements/NotEqualsStatement.java | 10 +- .../script/builders/BlockFunctionBuilder.java | 26 ----- .../script/builders/SpawnCheckBuilder.java | 26 ----- .../script/functions/BlockFunction.java | 23 +++- .../script/functions/CheckFunction.java | 36 ++++-- .../terra/api/structures/tokenizer/Token.java | 20 +++- .../api/structures/tokenizer/Tokenizer.java | 21 +++- .../src/test/java/structure/ParserTest.java | 19 +++- common/src/test/resources/test.tesf | 5 +- .../structure/load/LoadRawCommand.java | 4 - 31 files changed, 395 insertions(+), 166 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java rename common/src/main/java/com/dfsek/terra/api/structures/parser/lang/{Executable.java => Returnable.java} (89%) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/FunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanNotOperation.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/SpawnCheckBuilder.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java deleted file mode 100644 index 0b596db84..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/FunctionBuilder.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.dfsek.terra.api.structures.parser; - -import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.parser.lang.Function; - -import java.util.List; - -public interface FunctionBuilder> { - T build(List argumentList) throws ParseException; - - int getArguments(); -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 63c1706ec..158770ee0 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -3,14 +3,14 @@ package com.dfsek.terra.api.structures.parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.ConstantExpression; -import com.dfsek.terra.api.structures.parser.lang.Executable; -import com.dfsek.terra.api.structures.parser.lang.Function; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Keyword; -import com.dfsek.terra.api.structures.parser.lang.Statement; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword; -import com.dfsek.terra.api.structures.parser.lang.statements.EqualsStatement; -import com.dfsek.terra.api.structures.parser.lang.statements.NotEqualsStatement; +import com.dfsek.terra.api.structures.parser.lang.operations.BooleanNotOperation; +import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Token; import com.dfsek.terra.api.structures.tokenizer.Tokenizer; import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; @@ -22,7 +22,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; public class Parser { private final String data; @@ -54,7 +53,7 @@ public class Parser { for(Token t : tokens) { if(t.getType().equals(Token.Type.BLOCK_BEGIN)) blockLevel++; else if(t.getType().equals(Token.Type.BLOCK_END)) blockLevel--; - if(blockLevel < 0) throw new ParseException("Dangling closing brace: " + t.getStart()); + if(blockLevel < 0) throw new ParseException("Dangling closing brace: " + t.getPosition()); } if(blockLevel != 0) throw new ParseException("Dangling opening brace"); @@ -62,52 +61,67 @@ public class Parser { } + @SuppressWarnings("unchecked") private Keyword parseKeyword(List tokens) throws ParseException { Token identifier = tokens.remove(0); checkType(identifier, Token.Type.KEYWORD); if(!keywords.contains(identifier.getContent())) - throw new ParseException("No such keyword " + identifier.getContent() + ": " + identifier.getStart()); + throw new ParseException("No such keyword " + identifier.getContent() + ": " + identifier.getPosition()); Keyword k = null; if(identifier.getContent().equals("if")) { checkType(tokens.remove(0), Token.Type.BODY_BEGIN); - Executable left = parseExpression(tokens); - - Statement statement = null; - Token comparator = tokens.remove(0); - checkType(comparator, Token.Type.BOOLEAN_OPERATOR); - - Executable right = parseExpression(tokens); + Returnable comparator = parseExpression(tokens); + checkReturnType(comparator, Returnable.ReturnType.BOOLEAN); checkType(tokens.remove(0), Token.Type.BODY_END); - if(comparator.getContent().equals("==")) { - statement = new EqualsStatement(left, right); - } else if(comparator.getContent().equals("!=")) { - statement = new NotEqualsStatement(left, right); - } checkType(tokens.remove(0), Token.Type.BLOCK_BEGIN); - k = new IfKeyword(parseBlock(tokens), statement); + k = new IfKeyword(parseBlock(tokens), (Returnable) comparator, identifier.getPosition()); } return k; } - private Executable parseExpression(List tokens) throws ParseException { + @SuppressWarnings("unchecked") + private Returnable parseExpression(List tokens) throws ParseException { + System.out.println(tokens.get(0)); + Token first = tokens.get(0); + checkType(first, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.BOOLEAN_NOT); + + boolean not = false; + if(first.getType().equals(Token.Type.BOOLEAN_NOT)) { + not = true; + tokens.remove(0); + } + + Returnable expression; if(tokens.get(0).isConstant()) { - return new ConstantExpression<>(tokens.remove(0).getContent()); - } else return parseFunction(tokens, false); + Object constant; + Position position = tokens.get(0).getPosition(); + if(tokens.get(0).getType().equals(Token.Type.BOOLEAN)) constant = Boolean.parseBoolean(tokens.remove(0).getContent()); + else constant = tokens.remove(0).getContent(); + expression = new ConstantExpression<>(constant, position); + } else expression = parseFunction(tokens, false); + + if(not) { + checkReturnType(expression, Returnable.ReturnType.BOOLEAN); + return new BooleanNotOperation((Returnable) expression, expression.getPosition()); + } else return expression; } private Block parseBlock(List tokens) throws ParseException { List> parsedItems = new GlueList<>(); + Token first = tokens.get(0); + checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.KEYWORD); main: while(tokens.size() > 0) { Token token = tokens.get(0); + System.out.println(token); checkType(token, Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END); switch(token.getType()) { case KEYWORD: @@ -125,7 +139,7 @@ public class Parser { break main; } } - return new Block(parsedItems); + return new Block(parsedItems, first.getPosition()); } private Function parseFunction(List tokens, boolean fullStatement) throws ParseException { @@ -133,46 +147,42 @@ public class Parser { checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier if(!functions.containsKey(identifier.getContent())) - throw new ParseException("No such function " + identifier.getContent() + ": " + identifier.getStart()); + throw new ParseException("No such function " + identifier.getContent() + ": " + identifier.getPosition()); checkType(tokens.remove(0), Token.Type.BODY_BEGIN); // Second is body begin - List args = getArgs(tokens); // Extract arguments, consume the rest. + List> args = getArgs(tokens); // Extract arguments, consume the rest. tokens.remove(0); // Remove body end if(fullStatement) checkType(tokens.get(0), Token.Type.STATEMENT_END); - List arg = args.stream().map(Token::getContent).collect(Collectors.toList()); - FunctionBuilder builder = functions.get(identifier.getContent()); - if(arg.size() != builder.getArguments() && builder.getArguments() != -1) - throw new ParseException("Expected " + builder.getArguments() + " arguments, found " + arg.size() + ": " + identifier.getStart()); - return functions.get(identifier.getContent()).build(arg); + if(args.size() != builder.getArguments() && builder.getArguments() != -1) + throw new ParseException("Expected " + builder.getArguments() + " arguments, found " + args.size() + ": " + identifier.getPosition()); + return functions.get(identifier.getContent()).build(args, identifier.getPosition()); } - private List getArgs(List functionBuilder) throws ParseException { - List args = new GlueList<>(); - boolean expectingSeparator = false; - while(!functionBuilder.get(0).getType().equals(Token.Type.BODY_END)) { - Token current = functionBuilder.remove(0); - if(expectingSeparator) { - checkType(current, Token.Type.SEPARATOR); - expectingSeparator = false; - } else { - if(!allowedArguments.contains(current.getType())) - throw new ParseException("Token type " + current.getType() + " not allowed in arguments: " + current.getStart()); - args.add(current); - expectingSeparator = true; - } + private List> getArgs(List tokens) throws ParseException { + List> args = new GlueList<>(); + + while(!tokens.get(0).getType().equals(Token.Type.BODY_END)) { + args.add(parseExpression(tokens)); + checkType(tokens.get(0), Token.Type.SEPARATOR, Token.Type.BODY_END); + if(tokens.get(0).getType().equals(Token.Type.SEPARATOR)) tokens.remove(0); } return args; } private void checkType(Token token, Token.Type... expected) throws ParseException { for(Token.Type type : expected) if(token.getType().equals(type)) return; - throw new ParseException("Expected " + Arrays.toString(expected) + " but found " + token.getType() + ": " + token.getStart()); + throw new ParseException("Expected " + Arrays.toString(expected) + " but found " + token.getType() + ": " + token.getPosition()); + } + + private void checkReturnType(Returnable returnable, Returnable.ReturnType... types) throws ParseException { + for(Returnable.ReturnType type : types) if(returnable.returnType().equals(type)) return; + throw new ParseException("Expected " + Arrays.toString(types) + " but found " + returnable.returnType() + ": " + returnable.getPosition()); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index 95ea2bf01..62c019f80 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -2,14 +2,17 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.List; public class Block implements Item { private final List> items; + private final Position position; - public Block(List> items) { + public Block(List> items, Position position) { this.items = items; + this.position = position; } public List> getItems() { @@ -27,4 +30,9 @@ public class Block implements Item { items.forEach(item -> item.apply(location, chunk)); return null; } + + @Override + public Position getPosition() { + return position; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java index ce0e8304e..6624b1908 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java @@ -2,12 +2,15 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.tokenizer.Position; -public class ConstantExpression implements Executable { +public class ConstantExpression implements Returnable { private final T constant; + private final Position position; - public ConstantExpression(T constant) { + public ConstantExpression(T constant, Position position) { this.constant = constant; + this.position = position; } @Override @@ -21,6 +24,15 @@ public class ConstantExpression implements Executable { return constant; } + @Override + public Position getPosition() { + return position; + } + + public T getConstant() { + return constant; + } + @Override public ReturnType returnType() { if(constant instanceof String) return ReturnType.STRING; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java index 29b26d203..c2460be3d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java @@ -3,18 +3,21 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; +import com.dfsek.terra.api.structures.tokenizer.Position; -public class Expression implements Executable { +public class Expression implements Returnable { private final ReturnType type; - private final Executable left; - private final Executable right; + private final Returnable left; + private final Returnable right; private final BinaryOperation operation; + private final Position position; - public Expression(ReturnType type, Executable left, Executable right, BinaryOperation operation) { + public Expression(ReturnType type, Returnable left, Returnable right, BinaryOperation operation, Position position) { this.type = type; this.left = left; this.right = right; this.operation = operation; + this.position = position; } @Override @@ -31,4 +34,9 @@ public class Expression implements Executable { public T apply(Location location, Chunk chunk) { return operation.apply(left.apply(location, chunk), right.apply(location, chunk)); } + + @Override + public Position getPosition() { + return position; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java deleted file mode 100644 index 293f59e41..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Function.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.dfsek.terra.api.structures.parser.lang; - -public interface Function extends Executable { - String name(); -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java index 449523dc0..abe1a2a30 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java @@ -2,9 +2,12 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.tokenizer.Position; public interface Item { T apply(Location location); T apply(Location location, Chunk chunk); + + Position getPosition(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java index 7407c888e..be0a9f085 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Keyword.java @@ -1,4 +1,4 @@ package com.dfsek.terra.api.structures.parser.lang; -public interface Keyword extends Executable { +public interface Keyword extends Returnable { } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Executable.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Returnable.java similarity index 89% rename from common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Executable.java rename to common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Returnable.java index bb6be7ca6..3d02ae4cb 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Executable.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Returnable.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang; -public interface Executable extends Item { +public interface Returnable extends Item { ReturnType returnType(); enum ReturnType { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java new file mode 100644 index 000000000..1ebd54b85 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.api.structures.parser.lang.functions; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; + +public interface Function extends Returnable { + String name(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/FunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/FunctionBuilder.java new file mode 100644 index 000000000..c05622d0d --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/FunctionBuilder.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.api.structures.parser.lang.functions; + +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public interface FunctionBuilder> { + T build(List> argumentList, Position position) throws ParseException; + + int getArguments(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java index e990b6fbe..3168f4824 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java @@ -4,15 +4,18 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; -import com.dfsek.terra.api.structures.parser.lang.Statement; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; public class IfKeyword implements Keyword { private final Block conditional; - private final Statement statement; + private final Returnable statement; + private final Position position; - public IfKeyword(Block conditional, Statement statement) { + public IfKeyword(Block conditional, Returnable statement, Position position) { this.conditional = conditional; this.statement = statement; + this.position = position; } @Override @@ -27,6 +30,11 @@ public class IfKeyword implements Keyword { return null; } + @Override + public Position getPosition() { + return position; + } + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java index 8645888bc..7a85fcd2f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java @@ -3,8 +3,15 @@ package com.dfsek.terra.api.structures.parser.lang.keywords; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Keyword; +import com.dfsek.terra.api.structures.tokenizer.Position; public class ReturnKeyword implements Keyword { + private final Position position; + + public ReturnKeyword(Position position) { + this.position = position; + } + @Override public Void apply(Location location) { return null; @@ -15,6 +22,11 @@ public class ReturnKeyword implements Keyword { return null; } + @Override + public Position getPosition() { + return position; + } + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java index c4530127a..c54e601a8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java @@ -1,5 +1,35 @@ package com.dfsek.terra.api.structures.parser.lang.operations; -public interface BinaryOperation { - T apply(T left, T right); +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public abstract class BinaryOperation implements Returnable { + private final Returnable left; + private final Returnable right; + private final Position start; + + protected BinaryOperation(Returnable left, Returnable right, Position start) { + this.left = left; + this.right = right; + this.start = start; + } + + public abstract T apply(T left, T right); + + @Override + public Position getPosition() { + return getPosition(); + } + + @Override + public T apply(Location location) { + return apply(left.apply(location), right.apply(location)); + } + + @Override + public T apply(Location location, Chunk chunk) { + return apply(left.apply(location, chunk), right.apply(location, chunk)); + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanNotOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanNotOperation.java new file mode 100644 index 000000000..ebf59abd2 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanNotOperation.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class BooleanNotOperation extends UnaryOperation { + public BooleanNotOperation(Returnable input, Position position) { + super(input, position); + } + + @Override + public Boolean apply(Boolean input) { + return !input; + } + + @Override + public ReturnType returnType() { + return ReturnType.BOOLEAN; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java index cbd1adcd4..2e232f0d7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java @@ -1,8 +1,20 @@ package com.dfsek.terra.api.structures.parser.lang.operations; -public class ConcatenationOperation implements BinaryOperation { +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class ConcatenationOperation extends BinaryOperation { + protected ConcatenationOperation(Returnable left, Returnable right, Position position) { + super(left, right, position); + } + @Override public String apply(Object left, Object right) { return left.toString() + right.toString(); } + + @Override + public ReturnType returnType() { + return ReturnType.STRING; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java new file mode 100644 index 000000000..4e54c61c7 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class MultiplicationOperation extends BinaryOperation { + protected MultiplicationOperation(Returnable left, Returnable right, Position position) { + super(left, right, position); + } + + @Override + public Number apply(Number left, Number right) { + return left.doubleValue() * right.doubleValue(); + } + + @Override + public ReturnType returnType() { + return ReturnType.NUMBER; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java index 4dd70f593..44b126fd8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java @@ -1,8 +1,20 @@ package com.dfsek.terra.api.structures.parser.lang.operations; -public class NumberAdditionOperation implements BinaryOperation { +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class NumberAdditionOperation extends BinaryOperation { + protected NumberAdditionOperation(Returnable left, Returnable right, Position position) { + super(left, right, position); + } + @Override public Number apply(Number left, Number right) { return left.doubleValue() + right.doubleValue(); } + + @Override + public ReturnType returnType() { + return ReturnType.NUMBER; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java new file mode 100644 index 000000000..8f0db76e5 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public abstract class UnaryOperation implements Returnable { + private final Returnable input; + private final Position position; + + protected UnaryOperation(Returnable input, Position position) { + this.input = input; + this.position = position; + } + + public abstract T apply(T input); + + @Override + public T apply(Location location) { + return apply(input.apply(location)); + } + + @Override + public T apply(Location location, Chunk chunk) { + return apply(input.apply(location, chunk)); + } + + @Override + public Position getPosition() { + return position; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java index b55178685..890669601 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java @@ -4,14 +4,17 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Statement; +import com.dfsek.terra.api.structures.tokenizer.Position; public class EqualsStatement implements Statement { private final Item left; private final Item right; + private final Position position; - public EqualsStatement(Item left, Item right) { + public EqualsStatement(Item left, Item right, Position position) { this.left = left; this.right = right; + this.position = position; } @Override @@ -23,4 +26,9 @@ public class EqualsStatement implements Statement { public Boolean apply(Location location, Chunk chunk) { return left.apply(location, chunk).equals(right.apply(location, chunk)); } + + @Override + public Position getPosition() { + return position; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java index b804756d0..47f4cea60 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java @@ -4,14 +4,17 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Statement; +import com.dfsek.terra.api.structures.tokenizer.Position; public class GreaterThanStatement> implements Statement { private final Item left; private final Item right; + private final Position position; - public GreaterThanStatement(Item left, Item right) { + public GreaterThanStatement(Item left, Item right, Position position) { this.left = left; this.right = right; + this.position = position; } @Override @@ -23,4 +26,9 @@ public class GreaterThanStatement> implements Statement public Boolean apply(Location location, Chunk chunk) { return left.apply(location).compareTo(right.apply(location)) > 0; } + + @Override + public Position getPosition() { + return position; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java index 5d4a2b736..ded5a2925 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java @@ -4,14 +4,17 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Statement; +import com.dfsek.terra.api.structures.tokenizer.Position; public class NotEqualsStatement implements Statement { private final Item left; private final Item right; + private final Position position; - public NotEqualsStatement(Item left, Item right) { + public NotEqualsStatement(Item left, Item right, Position position) { this.left = left; this.right = right; + this.position = position; } @Override @@ -23,4 +26,9 @@ public class NotEqualsStatement implements Statement { public Boolean apply(Location location, Chunk chunk) { return !left.apply(location, chunk).equals(right.apply(location, chunk)); } + + @Override + public Position getPosition() { + return position; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java deleted file mode 100644 index 156453db7..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dfsek.terra.api.structures.script.builders; - -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.structures.parser.FunctionBuilder; -import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.script.functions.BlockFunction; - -import java.util.List; - -public class BlockFunctionBuilder implements FunctionBuilder { - private final TerraPlugin main; - - public BlockFunctionBuilder(TerraPlugin main) { - this.main = main; - } - - @Override - public BlockFunction build(List argumentList) throws ParseException { - return new BlockFunction(Integer.parseInt(argumentList.get(0)), Integer.parseInt(argumentList.get(1)), Integer.parseInt(argumentList.get(2)), main.getWorldHandle().createBlockData(argumentList.get(3))); - } - - @Override - public int getArguments() { - return 4; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/SpawnCheckBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/SpawnCheckBuilder.java deleted file mode 100644 index a8010b304..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/SpawnCheckBuilder.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.dfsek.terra.api.structures.script.builders; - -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.structures.parser.FunctionBuilder; -import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.script.functions.CheckFunction; - -import java.util.List; - -public class SpawnCheckBuilder implements FunctionBuilder { - private final TerraPlugin main; - - public SpawnCheckBuilder(TerraPlugin main) { - this.main = main; - } - - @Override - public CheckFunction build(List argumentList) throws ParseException { - return new CheckFunction(main, Integer.parseInt(argumentList.get(0)), Integer.parseInt(argumentList.get(1)), Integer.parseInt(argumentList.get(2))); - } - - @Override - public int getArguments() { - return 3; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index 50e414dbf..f2d53f68c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -1,16 +1,24 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.structures.parser.lang.Function; +import com.dfsek.terra.api.structures.parser.lang.ConstantExpression; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.tokenizer.Position; public class BlockFunction implements Function { private final BlockData data; - private final int x, y, z; + private final Returnable x, y, z; + private final Position position; - public BlockFunction(int x, int y, int z, BlockData data) { - this.data = data; + public BlockFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) { + this.position = position; + if(!(data instanceof ConstantExpression)) throw new IllegalArgumentException("Block data must be constant."); + + this.data = main.getWorldHandle().createBlockData(((ConstantExpression) data).getConstant()); this.x = x; this.y = y; this.z = z; @@ -23,7 +31,7 @@ public class BlockFunction implements Function { @Override public Void apply(Location location) { - location.clone().add(x, y, z).getBlock().setBlockData(data, false); + location.clone().add(x.apply(location), y.apply(location), z.apply(location)).getBlock().setBlockData(data, false); return null; } @@ -33,6 +41,11 @@ public class BlockFunction implements Function { return null; } + @Override + public Position getPosition() { + return position; + } + @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index 6c5379fc5..b05ac4f98 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -1,21 +1,27 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.structures.parser.lang.Function; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.world.LandCheck; import com.dfsek.terra.api.structures.world.OceanCheck; public class CheckFunction implements Function { private final TerraPlugin main; - private final int x, y, z; + private final Returnable x, y, z; + private final Position position; - public CheckFunction(TerraPlugin main, int x, int y, int z) { + public CheckFunction(TerraPlugin main, Returnable x, Returnable y, Returnable z, Position position) { this.main = main; this.x = x; this.y = y; this.z = z; + this.position = position; } @Override @@ -23,22 +29,32 @@ public class CheckFunction implements Function { return "check"; } + private Vector3 getVector(Location location, Chunk chunk) { + return chunk == null ? new Vector3(x.apply(location) + location.getBlockX(), y.apply(location) + location.getBlockY(), z.apply(location) + location.getBlockZ()) + : new Vector3(x.apply(location, chunk) + location.getBlockX(), y.apply(location, chunk) + location.getBlockY(), z.apply(location, chunk) + location.getBlockZ()); + } + @Override public String apply(Location location) { - if(new LandCheck(location.getWorld(), main).check(location.getBlockX() + x, location.getBlockY() + y, location.getBlockZ() + z)) + return apply(getVector(location, null), location.getWorld()); + } + + private String apply(Vector3 vector, World world) { + if(new LandCheck(world, main).check(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ())) return "LAND"; - if(new OceanCheck(location.getWorld(), main).check(location.getBlockX() + x, location.getBlockY() + y, location.getBlockZ() + z)) + if(new OceanCheck(world, main).check(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ())) return "OCEAN"; return "AIR"; } @Override public String apply(Location location, Chunk chunk) { - if(new LandCheck(location.getWorld(), main).check(location.getBlockX() + x, location.getBlockY() + y, location.getBlockZ() + z)) - return "LAND"; - if(new OceanCheck(location.getWorld(), main).check(location.getBlockX() + x, location.getBlockY() + y, location.getBlockZ() + z)) - return "OCEAN"; - return "AIR"; + return apply(getVector(location, chunk), location.getWorld()); + } + + @Override + public Position getPosition() { + return position; } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 66fa93960..d84214243 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -19,7 +19,7 @@ public class Token { return content; } - public Position getStart() { + public Position getPosition() { return start; } @@ -89,6 +89,22 @@ public class Token { /** * Addition/concatenation operator */ - ADDITION_OPERATOR + ADDITION_OPERATOR, + /** + * Subtraction operator + */ + SUBTRACTION_OPERATOR, + /** + * Multiplication operator + */ + MULTIPLICATION_OPERATOR, + /** + * Division operator + */ + DIVISION_OPERATOR, + /** + * Boolean not operator + */ + BOOLEAN_NOT } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index 729e6969c..f2be8a717 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -11,7 +11,7 @@ import java.util.Set; public class Tokenizer { private final Lookahead reader; - private final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+'); // Reserved chars + private final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+', '-', '*', '/', '>', '<', '!'); // Reserved chars private final Set keywords = Sets.newHashSet("if", "return"); @@ -36,10 +36,21 @@ public class Tokenizer { return new Token("true", Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("false", true)) return new Token("false", Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); + + if(reader.matches("==", true)) return new Token("==", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("!=", true)) return new Token("!=", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches(">", true)) + return new Token(">", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("<", true)) + return new Token("<", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches(">=", true)) + return new Token(">=", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("<=", true)) + return new Token("<=", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(isNumberStart()) { StringBuilder num = new StringBuilder(); @@ -84,6 +95,14 @@ public class Tokenizer { return new Token(reader.consume().toString(), Token.Type.ASSIGNMENT, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is('+')) return new Token(reader.consume().toString(), Token.Type.ADDITION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is('-')) + return new Token(reader.consume().toString(), Token.Type.SUBTRACTION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is('*')) + return new Token(reader.consume().toString(), Token.Type.MULTIPLICATION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is('/')) + return new Token(reader.consume().toString(), Token.Type.DIVISION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is('!')) + return new Token(reader.consume().toString(), Token.Type.BOOLEAN_NOT, new Position(reader.getLine(), reader.getIndex())); StringBuilder token = new StringBuilder(); while(!reader.current().isEOF() && !isSyntaxSignificant(reader.current().getCharacter())) { diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index a71009926..9eb52be0d 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -2,11 +2,13 @@ package structure; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.structures.parser.FunctionBuilder; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.parser.lang.Function; import com.dfsek.terra.api.structures.parser.lang.Item; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.tokenizer.Position; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; @@ -20,8 +22,8 @@ public class ParserTest { parser.addFunction("test", new FunctionBuilder() { @Override - public Test1 build(List argumentList) throws ParseException { - return new Test1(argumentList.get(0), Double.parseDouble(argumentList.get(1))); + public Test1 build(List> argumentList, Position position) throws ParseException { + return new Test1(argumentList.get(0).apply(new Location(null, 0, 0, 0)).toString(), Double.parseDouble(argumentList.get(1).apply(new Location(null, 0, 0, 0)).toString()), position); } @Override @@ -41,10 +43,12 @@ public class ParserTest { private static class Test1 implements Function { private final String a; private final double b; + private final Position position; - public Test1(String a, double b) { + public Test1(String a, double b, Position position) { this.a = a; this.b = b; + this.position = position; } public String getA() { @@ -65,6 +69,11 @@ public class ParserTest { return null; } + @Override + public Position getPosition() { + return null; + } + @Override public String name() { return null; diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 8f82d7331..76dc5aa15 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,8 +1,5 @@ test("hello", 2); -if(test("fsdfsdf", 3) == 2) { +if("true") { test("fdsgdf", 3.4); - if(test("fsdfsdf", 3) == 2) { - test("fdsgdf", 3.4); - } } \ No newline at end of file diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index eda9606fb..5add94894 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -4,8 +4,6 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; -import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; -import com.dfsek.terra.api.structures.script.builders.SpawnCheckBuilder; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; import org.apache.commons.io.IOUtils; @@ -39,8 +37,6 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { try { Parser parser = new Parser(IOUtils.toString(new FileInputStream(new File(getMain().getDataFolder(), "test.tesf")))); - parser.addFunction("block", new BlockFunctionBuilder(getMain())); - parser.addFunction("check", new SpawnCheckBuilder(getMain())); Block main = parser.parse(); main.apply(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ())); From 8a7499d874aa7954239622c5b52bae556012fde1 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 21 Dec 2020 02:01:42 -0700 Subject: [PATCH 077/210] binary operations work now --- .../terra/api/structures/parser/Parser.java | 57 ++++++++++++++++--- .../lang/constants/BooleanConstant.java | 14 +++++ .../{ => constants}/ConstantExpression.java | 13 +---- .../lang/constants/NumericConstant.java | 14 +++++ .../parser/lang/constants/StringConstant.java | 14 +++++ .../lang/operations/BinaryOperation.java | 2 +- .../operations/ConcatenationOperation.java | 2 +- .../operations/NumberAdditionOperation.java | 2 +- .../script/functions/BlockFunction.java | 2 +- .../terra/api/structures/tokenizer/Token.java | 8 +++ common/src/test/resources/test.tesf | 6 +- 11 files changed, 109 insertions(+), 25 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/BooleanConstant.java rename common/src/main/java/com/dfsek/terra/api/structures/parser/lang/{ => constants}/ConstantExpression.java (63%) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/NumericConstant.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/StringConstant.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 158770ee0..e7bf9fe0a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -2,14 +2,19 @@ package com.dfsek.terra.api.structures.parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; -import com.dfsek.terra.api.structures.parser.lang.ConstantExpression; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.constants.BooleanConstant; +import com.dfsek.terra.api.structures.parser.lang.constants.NumericConstant; +import com.dfsek.terra.api.structures.parser.lang.constants.StringConstant; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword; +import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; import com.dfsek.terra.api.structures.parser.lang.operations.BooleanNotOperation; +import com.dfsek.terra.api.structures.parser.lang.operations.ConcatenationOperation; +import com.dfsek.terra.api.structures.parser.lang.operations.NumberAdditionOperation; import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Token; import com.dfsek.terra.api.structures.tokenizer.Tokenizer; @@ -100,17 +105,53 @@ public class Parser { Returnable expression; if(tokens.get(0).isConstant()) { - Object constant; - Position position = tokens.get(0).getPosition(); - if(tokens.get(0).getType().equals(Token.Type.BOOLEAN)) constant = Boolean.parseBoolean(tokens.remove(0).getContent()); - else constant = tokens.remove(0).getContent(); - expression = new ConstantExpression<>(constant, position); + Token constantToken = tokens.remove(0); + Position position = constantToken.getPosition(); + switch(constantToken.getType()) { + case NUMBER: + String content = constantToken.getContent(); + expression = new NumericConstant(content.contains(".") ? Double.parseDouble(content) : Integer.parseInt(content), position); + break; + case STRING: + expression = new StringConstant(constantToken.getContent(), position); + break; + case BOOLEAN: + expression = new BooleanConstant(Boolean.parseBoolean(constantToken.getContent()), position); + break; + default: + throw new UnsupportedOperationException("Unsupported constant token: " + constantToken.getType() + " at position: " + position); + } } else expression = parseFunction(tokens, false); + if(not) { checkReturnType(expression, Returnable.ReturnType.BOOLEAN); - return new BooleanNotOperation((Returnable) expression, expression.getPosition()); - } else return expression; + expression = new BooleanNotOperation((Returnable) expression, expression.getPosition()); + } + if(tokens.get(0).isBinaryOperator()) return parseBinaryOperation(expression, tokens); + return expression; + } + + @SuppressWarnings("unchecked") + private BinaryOperation parseBinaryOperation(Returnable left, List tokens) throws ParseException { + Token binaryOperator = tokens.remove(0); + Returnable right = parseExpression(tokens); + + switch(binaryOperator.getType()) { + case ADDITION_OPERATOR: + System.out.println(left.returnType()); + System.out.println(right.returnType()); + if(left.returnType().equals(Returnable.ReturnType.NUMBER) && right.returnType().equals(Returnable.ReturnType.NUMBER)) { + System.out.println("number " + binaryOperator.getPosition()); + return new NumberAdditionOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + } + return new ConcatenationOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case BOOLEAN_OPERATOR: + + default: + throw new UnsupportedOperationException("Unsupported binary operator: " + binaryOperator.getType()); + } + } private Block parseBlock(List tokens) throws ParseException { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/BooleanConstant.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/BooleanConstant.java new file mode 100644 index 000000000..7d57f561f --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/BooleanConstant.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.api.structures.parser.lang.constants; + +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class BooleanConstant extends ConstantExpression { + public BooleanConstant(Boolean constant, Position position) { + super(constant, position); + } + + @Override + public ReturnType returnType() { + return ReturnType.BOOLEAN; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java similarity index 63% rename from common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java rename to common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java index 6624b1908..621825685 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ConstantExpression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java @@ -1,10 +1,11 @@ -package com.dfsek.terra.api.structures.parser.lang; +package com.dfsek.terra.api.structures.parser.lang.constants; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; -public class ConstantExpression implements Returnable { +public abstract class ConstantExpression implements Returnable { private final T constant; private final Position position; @@ -32,12 +33,4 @@ public class ConstantExpression implements Returnable { public T getConstant() { return constant; } - - @Override - public ReturnType returnType() { - if(constant instanceof String) return ReturnType.STRING; - if(constant instanceof Number) return ReturnType.NUMBER; - if(constant instanceof Boolean) return ReturnType.BOOLEAN; - return ReturnType.OBJECT; - } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/NumericConstant.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/NumericConstant.java new file mode 100644 index 000000000..caf68836e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/NumericConstant.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.api.structures.parser.lang.constants; + +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class NumericConstant extends ConstantExpression { + public NumericConstant(Number constant, Position position) { + super(constant, position); + } + + @Override + public ReturnType returnType() { + return ReturnType.NUMBER; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/StringConstant.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/StringConstant.java new file mode 100644 index 000000000..19a93353f --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/StringConstant.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.api.structures.parser.lang.constants; + +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class StringConstant extends ConstantExpression { + public StringConstant(String constant, Position position) { + super(constant, position); + } + + @Override + public ReturnType returnType() { + return ReturnType.STRING; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java index c54e601a8..0d4ad6b8a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java @@ -20,7 +20,7 @@ public abstract class BinaryOperation implements Returnable { @Override public Position getPosition() { - return getPosition(); + return start; } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java index 2e232f0d7..09ad8c467 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java @@ -4,7 +4,7 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; public class ConcatenationOperation extends BinaryOperation { - protected ConcatenationOperation(Returnable left, Returnable right, Position position) { + public ConcatenationOperation(Returnable left, Returnable right, Position position) { super(left, right, position); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java index 44b126fd8..01f8b7e4a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java @@ -4,7 +4,7 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; public class NumberAdditionOperation extends BinaryOperation { - protected NumberAdditionOperation(Returnable left, Returnable right, Position position) { + public NumberAdditionOperation(Returnable left, Returnable right, Position position) { super(left, right, position); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index f2d53f68c..f207eff2e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -4,8 +4,8 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.structures.parser.lang.ConstantExpression; import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.tokenizer.Position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index d84214243..0c1f70c75 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -32,6 +32,14 @@ public class Token { return this.type.equals(Type.NUMBER) || this.type.equals(Type.STRING) || this.type.equals(Type.BOOLEAN); } + public boolean isBinaryOperator() { + return type.equals(Type.ADDITION_OPERATOR) + || type.equals(Type.SUBTRACTION_OPERATOR) + || type.equals(Type.MULTIPLICATION_OPERATOR) + || type.equals(Type.DIVISION_OPERATOR) + || type.equals(Type.BOOLEAN_OPERATOR); + } + public enum Type { /** * Function identifier or language keyword diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 76dc5aa15..304a42ac9 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,5 +1,5 @@ -test("hello", 2); +test("hello" + 3 + "gdfg", 2 + 1.2); -if("true") { - test("fdsgdf", 3.4); +if(true) { + test("fdsgdf" + 2, 3.4); } \ No newline at end of file From 7a75f20a2c7c26738fa78a18f4b1c0d080392deb Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 21 Dec 2020 16:22:08 -0700 Subject: [PATCH 078/210] implement operator precedence --- .../terra/api/structures/parser/Parser.java | 54 ++++++++++++++----- .../lang/operations/DivisionOperation.java | 20 +++++++ .../operations/MultiplicationOperation.java | 2 +- .../lang/operations/SubtractionOperation.java | 20 +++++++ .../terra/api/structures/tokenizer/Token.java | 6 +++ common/src/test/resources/test.tesf | 2 +- 6 files changed, 90 insertions(+), 14 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/DivisionOperation.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/SubtractionOperation.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index e7bf9fe0a..e31a6a7b5 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -14,7 +14,10 @@ import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword; import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; import com.dfsek.terra.api.structures.parser.lang.operations.BooleanNotOperation; import com.dfsek.terra.api.structures.parser.lang.operations.ConcatenationOperation; +import com.dfsek.terra.api.structures.parser.lang.operations.DivisionOperation; +import com.dfsek.terra.api.structures.parser.lang.operations.MultiplicationOperation; import com.dfsek.terra.api.structures.parser.lang.operations.NumberAdditionOperation; +import com.dfsek.terra.api.structures.parser.lang.operations.SubtractionOperation; import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Token; import com.dfsek.terra.api.structures.tokenizer.Tokenizer; @@ -78,7 +81,7 @@ public class Parser { checkType(tokens.remove(0), Token.Type.BODY_BEGIN); - Returnable comparator = parseExpression(tokens); + Returnable comparator = parseExpression(tokens, true); checkReturnType(comparator, Returnable.ReturnType.BOOLEAN); checkType(tokens.remove(0), Token.Type.BODY_END); @@ -92,10 +95,10 @@ public class Parser { } @SuppressWarnings("unchecked") - private Returnable parseExpression(List tokens) throws ParseException { + private Returnable parseExpression(List tokens, boolean full) throws ParseException { System.out.println(tokens.get(0)); Token first = tokens.get(0); - checkType(first, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.BOOLEAN_NOT); + checkType(first, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.BOOLEAN_NOT, Token.Type.BODY_BEGIN); boolean not = false; if(first.getType().equals(Token.Type.BOOLEAN_NOT)) { @@ -128,30 +131,52 @@ public class Parser { checkReturnType(expression, Returnable.ReturnType.BOOLEAN); expression = new BooleanNotOperation((Returnable) expression, expression.getPosition()); } - if(tokens.get(0).isBinaryOperator()) return parseBinaryOperation(expression, tokens); + if(full && tokens.get(0).isBinaryOperator()) { + return parseBinaryOperation(expression, tokens); + } return expression; } - @SuppressWarnings("unchecked") + private BinaryOperation parseBinaryOperation(Returnable left, List tokens) throws ParseException { Token binaryOperator = tokens.remove(0); - Returnable right = parseExpression(tokens); + checkType(binaryOperator, Token.Type.ADDITION_OPERATOR, Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR, Token.Type.SUBTRACTION_OPERATOR, Token.Type.BOOLEAN_OPERATOR); + Returnable right = parseExpression(tokens, false); + if(binaryOperator.isStrictArithmeticOperator()) checkArithmeticOperation(left, right, binaryOperator.getType()); + + Token other = tokens.get(0); + System.out.println("other: " + other); + if(other.isBinaryOperator() && (other.getType().equals(Token.Type.MULTIPLICATION_OPERATOR) || other.getType().equals(Token.Type.DIVISION_OPERATOR))) { + System.out.println("using left"); + return assemble(left, parseBinaryOperation(right, tokens), binaryOperator); + } else if(other.isBinaryOperator()) { + System.out.println("using right"); + return parseBinaryOperation(assemble(left, right, binaryOperator), tokens); + } + return assemble(left, right, binaryOperator); + } + + @SuppressWarnings("unchecked") + private BinaryOperation assemble(Returnable left, Returnable right, Token binaryOperator) { switch(binaryOperator.getType()) { case ADDITION_OPERATOR: - System.out.println(left.returnType()); - System.out.println(right.returnType()); if(left.returnType().equals(Returnable.ReturnType.NUMBER) && right.returnType().equals(Returnable.ReturnType.NUMBER)) { - System.out.println("number " + binaryOperator.getPosition()); return new NumberAdditionOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); } return new ConcatenationOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case SUBTRACTION_OPERATOR: + return new SubtractionOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case MULTIPLICATION_OPERATOR: + return new MultiplicationOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case DIVISION_OPERATOR: + return new DivisionOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); case BOOLEAN_OPERATOR: + default: throw new UnsupportedOperationException("Unsupported binary operator: " + binaryOperator.getType()); } - } private Block parseBlock(List tokens) throws ParseException { @@ -162,7 +187,6 @@ public class Parser { main: while(tokens.size() > 0) { Token token = tokens.get(0); - System.out.println(token); checkType(token, Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END); switch(token.getType()) { case KEYWORD: @@ -210,7 +234,7 @@ public class Parser { List> args = new GlueList<>(); while(!tokens.get(0).getType().equals(Token.Type.BODY_END)) { - args.add(parseExpression(tokens)); + args.add(parseExpression(tokens, true)); checkType(tokens.get(0), Token.Type.SEPARATOR, Token.Type.BODY_END); if(tokens.get(0).getType().equals(Token.Type.SEPARATOR)) tokens.remove(0); } @@ -226,4 +250,10 @@ public class Parser { for(Returnable.ReturnType type : types) if(returnable.returnType().equals(type)) return; throw new ParseException("Expected " + Arrays.toString(types) + " but found " + returnable.returnType() + ": " + returnable.getPosition()); } + + private void checkArithmeticOperation(Returnable left, Returnable right, Token.Type operation) throws ParseException { + if(!left.returnType().equals(Returnable.ReturnType.NUMBER) && !right.returnType().equals(Returnable.ReturnType.NUMBER)) { + throw new ParseException("Operation " + operation + " not supported between " + left.returnType() + " and " + right.returnType()); + } + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/DivisionOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/DivisionOperation.java new file mode 100644 index 000000000..d39ec612b --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/DivisionOperation.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class DivisionOperation extends BinaryOperation { + public DivisionOperation(Returnable left, Returnable right, Position position) { + super(left, right, position); + } + + @Override + public Number apply(Number left, Number right) { + return left.doubleValue() / right.doubleValue(); + } + + @Override + public ReturnType returnType() { + return ReturnType.NUMBER; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java index 4e54c61c7..67fb5b691 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java @@ -4,7 +4,7 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; public class MultiplicationOperation extends BinaryOperation { - protected MultiplicationOperation(Returnable left, Returnable right, Position position) { + public MultiplicationOperation(Returnable left, Returnable right, Position position) { super(left, right, position); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/SubtractionOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/SubtractionOperation.java new file mode 100644 index 000000000..2a6f323fa --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/SubtractionOperation.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class SubtractionOperation extends BinaryOperation { + public SubtractionOperation(Returnable left, Returnable right, Position position) { + super(left, right, position); + } + + @Override + public Number apply(Number left, Number right) { + return left.doubleValue() - right.doubleValue(); + } + + @Override + public ReturnType returnType() { + return ReturnType.NUMBER; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 0c1f70c75..178f9fe6c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -40,6 +40,12 @@ public class Token { || type.equals(Type.BOOLEAN_OPERATOR); } + public boolean isStrictArithmeticOperator() { + return type.equals(Type.SUBTRACTION_OPERATOR) + || type.equals(Type.MULTIPLICATION_OPERATOR) + || type.equals(Type.DIVISION_OPERATOR); + } + public enum Type { /** * Function identifier or language keyword diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 304a42ac9..8f635d3fe 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,4 +1,4 @@ -test("hello" + 3 + "gdfg", 2 + 1.2); +test("hello" + 3 + "gdfg", 3 + 8*2 - 1); if(true) { test("fdsgdf" + 2, 3.4); From 7d72a91bb7fa391ebe5058a76bf266279536e793 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 21 Dec 2020 20:31:57 -0700 Subject: [PATCH 079/210] implement comparison operators --- .../terra/api/structures/parser/Parser.java | 30 ++++++++++--- .../structures/parser/lang/Expression.java | 42 ------------------- .../lang/operations/BinaryOperation.java | 14 +++---- .../operations/ConcatenationOperation.java | 2 +- .../lang/operations/DivisionOperation.java | 2 +- .../operations/MultiplicationOperation.java | 2 +- .../operations/NumberAdditionOperation.java | 2 +- .../lang/operations/SubtractionOperation.java | 2 +- .../statements/EqualsStatement.java | 22 ++++++++++ .../GreaterOrEqualsThanStatement.java | 22 ++++++++++ .../statements/GreaterThanStatement.java | 22 ++++++++++ .../statements/LessThanOrEqualsStatement.java | 22 ++++++++++ .../statements/LessThanStatement.java | 22 ++++++++++ .../statements/NotEqualsStatement.java | 22 ++++++++++ .../lang/statements/EqualsStatement.java | 34 --------------- .../lang/statements/GreaterThanStatement.java | 34 --------------- .../lang/statements/NotEqualsStatement.java | 34 --------------- .../terra/api/structures/tokenizer/Token.java | 24 ++++++++--- .../api/structures/tokenizer/Tokenizer.java | 12 +++--- common/src/test/resources/test.tesf | 4 +- 20 files changed, 195 insertions(+), 175 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/EqualsStatement.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/GreaterThanStatement.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/LessThanOrEqualsStatement.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/LessThanStatement.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/NotEqualsStatement.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index e31a6a7b5..f87e44611 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -18,6 +18,12 @@ import com.dfsek.terra.api.structures.parser.lang.operations.DivisionOperation; import com.dfsek.terra.api.structures.parser.lang.operations.MultiplicationOperation; import com.dfsek.terra.api.structures.parser.lang.operations.NumberAdditionOperation; import com.dfsek.terra.api.structures.parser.lang.operations.SubtractionOperation; +import com.dfsek.terra.api.structures.parser.lang.operations.statements.EqualsStatement; +import com.dfsek.terra.api.structures.parser.lang.operations.statements.GreaterOrEqualsThanStatement; +import com.dfsek.terra.api.structures.parser.lang.operations.statements.GreaterThanStatement; +import com.dfsek.terra.api.structures.parser.lang.operations.statements.LessThanOrEqualsStatement; +import com.dfsek.terra.api.structures.parser.lang.operations.statements.LessThanStatement; +import com.dfsek.terra.api.structures.parser.lang.operations.statements.NotEqualsStatement; import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Token; import com.dfsek.terra.api.structures.tokenizer.Tokenizer; @@ -138,12 +144,12 @@ public class Parser { } - private BinaryOperation parseBinaryOperation(Returnable left, List tokens) throws ParseException { + private BinaryOperation parseBinaryOperation(Returnable left, List tokens) throws ParseException { Token binaryOperator = tokens.remove(0); - checkType(binaryOperator, Token.Type.ADDITION_OPERATOR, Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR, Token.Type.SUBTRACTION_OPERATOR, Token.Type.BOOLEAN_OPERATOR); + checkType(binaryOperator, Token.Type.ADDITION_OPERATOR, Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR, Token.Type.SUBTRACTION_OPERATOR, + Token.Type.GREATER_THAN_OPERATOR, Token.Type.LESS_THAN_OPERATOR, Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR, Token.Type.EQUALS_OPERATOR, Token.Type.NOT_EQUALS_OPERATOR); Returnable right = parseExpression(tokens, false); - if(binaryOperator.isStrictArithmeticOperator()) checkArithmeticOperation(left, right, binaryOperator.getType()); Token other = tokens.get(0); System.out.println("other: " + other); @@ -158,7 +164,8 @@ public class Parser { } @SuppressWarnings("unchecked") - private BinaryOperation assemble(Returnable left, Returnable right, Token binaryOperator) { + private BinaryOperation assemble(Returnable left, Returnable right, Token binaryOperator) throws ParseException { + if(binaryOperator.isStrictNumericOperator()) checkArithmeticOperation(left, right, binaryOperator.getType()); switch(binaryOperator.getType()) { case ADDITION_OPERATOR: if(left.returnType().equals(Returnable.ReturnType.NUMBER) && right.returnType().equals(Returnable.ReturnType.NUMBER)) { @@ -171,7 +178,18 @@ public class Parser { return new MultiplicationOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); case DIVISION_OPERATOR: return new DivisionOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - case BOOLEAN_OPERATOR: + case EQUALS_OPERATOR: + return new EqualsStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case NOT_EQUALS_OPERATOR: + return new NotEqualsStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case GREATER_THAN_OPERATOR: + return new GreaterThanStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case LESS_THAN_OPERATOR: + return new LessThanStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case GREATER_THAN_OR_EQUALS_OPERATOR: + return new GreaterOrEqualsThanStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case LESS_THAN_OR_EQUALS_OPERATOR: + return new LessThanOrEqualsStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); default: @@ -252,7 +270,7 @@ public class Parser { } private void checkArithmeticOperation(Returnable left, Returnable right, Token.Type operation) throws ParseException { - if(!left.returnType().equals(Returnable.ReturnType.NUMBER) && !right.returnType().equals(Returnable.ReturnType.NUMBER)) { + if(!left.returnType().equals(Returnable.ReturnType.NUMBER) || !right.returnType().equals(Returnable.ReturnType.NUMBER)) { throw new ParseException("Operation " + operation + " not supported between " + left.returnType() + " and " + right.returnType()); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java deleted file mode 100644 index c2460be3d..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Expression.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.dfsek.terra.api.structures.parser.lang; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; -import com.dfsek.terra.api.structures.tokenizer.Position; - -public class Expression implements Returnable { - private final ReturnType type; - private final Returnable left; - private final Returnable right; - private final BinaryOperation operation; - private final Position position; - - public Expression(ReturnType type, Returnable left, Returnable right, BinaryOperation operation, Position position) { - this.type = type; - this.left = left; - this.right = right; - this.operation = operation; - this.position = position; - } - - @Override - public ReturnType returnType() { - return type; - } - - @Override - public T apply(Location location) { - return operation.apply(left.apply(location), right.apply(location)); - } - - @Override - public T apply(Location location, Chunk chunk) { - return operation.apply(left.apply(location, chunk), right.apply(location, chunk)); - } - - @Override - public Position getPosition() { - return position; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java index 0d4ad6b8a..360db72be 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java @@ -5,18 +5,18 @@ import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; -public abstract class BinaryOperation implements Returnable { - private final Returnable left; - private final Returnable right; +public abstract class BinaryOperation implements Returnable { + private final Returnable left; + private final Returnable right; private final Position start; - protected BinaryOperation(Returnable left, Returnable right, Position start) { + protected BinaryOperation(Returnable left, Returnable right, Position start) { this.left = left; this.right = right; this.start = start; } - public abstract T apply(T left, T right); + public abstract O apply(I left, I right); @Override public Position getPosition() { @@ -24,12 +24,12 @@ public abstract class BinaryOperation implements Returnable { } @Override - public T apply(Location location) { + public O apply(Location location) { return apply(left.apply(location), right.apply(location)); } @Override - public T apply(Location location, Chunk chunk) { + public O apply(Location location, Chunk chunk) { return apply(left.apply(location, chunk), right.apply(location, chunk)); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java index 09ad8c467..b0eea6f50 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ConcatenationOperation.java @@ -3,7 +3,7 @@ package com.dfsek.terra.api.structures.parser.lang.operations; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; -public class ConcatenationOperation extends BinaryOperation { +public class ConcatenationOperation extends BinaryOperation { public ConcatenationOperation(Returnable left, Returnable right, Position position) { super(left, right, position); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/DivisionOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/DivisionOperation.java index d39ec612b..3054f8981 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/DivisionOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/DivisionOperation.java @@ -3,7 +3,7 @@ package com.dfsek.terra.api.structures.parser.lang.operations; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; -public class DivisionOperation extends BinaryOperation { +public class DivisionOperation extends BinaryOperation { public DivisionOperation(Returnable left, Returnable right, Position position) { super(left, right, position); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java index 67fb5b691..b6269a6c7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/MultiplicationOperation.java @@ -3,7 +3,7 @@ package com.dfsek.terra.api.structures.parser.lang.operations; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; -public class MultiplicationOperation extends BinaryOperation { +public class MultiplicationOperation extends BinaryOperation { public MultiplicationOperation(Returnable left, Returnable right, Position position) { super(left, right, position); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java index 01f8b7e4a..969d13b5e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NumberAdditionOperation.java @@ -3,7 +3,7 @@ package com.dfsek.terra.api.structures.parser.lang.operations; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; -public class NumberAdditionOperation extends BinaryOperation { +public class NumberAdditionOperation extends BinaryOperation { public NumberAdditionOperation(Returnable left, Returnable right, Position position) { super(left, right, position); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/SubtractionOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/SubtractionOperation.java index 2a6f323fa..d2bc82203 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/SubtractionOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/SubtractionOperation.java @@ -3,7 +3,7 @@ package com.dfsek.terra.api.structures.parser.lang.operations; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; -public class SubtractionOperation extends BinaryOperation { +public class SubtractionOperation extends BinaryOperation { public SubtractionOperation(Returnable left, Returnable right, Position position) { super(left, right, position); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/EqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/EqualsStatement.java new file mode 100644 index 000000000..ebc8ae515 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/EqualsStatement.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.api.structures.parser.lang.operations.statements; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class EqualsStatement extends BinaryOperation { + public EqualsStatement(Returnable left, Returnable right, Position position) { + super(left, right, position); + } + + @Override + public Boolean apply(Object left, Object right) { + return left.equals(right); + } + + + @Override + public ReturnType returnType() { + return ReturnType.BOOLEAN; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java new file mode 100644 index 000000000..36b1ab446 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/GreaterOrEqualsThanStatement.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.api.structures.parser.lang.operations.statements; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class GreaterOrEqualsThanStatement extends BinaryOperation { + public GreaterOrEqualsThanStatement(Returnable left, Returnable right, Position position) { + super(left, right, position); + } + + @Override + public Boolean apply(Number left, Number right) { + return left.doubleValue() >= right.doubleValue(); + } + + + @Override + public ReturnType returnType() { + return ReturnType.BOOLEAN; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/GreaterThanStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/GreaterThanStatement.java new file mode 100644 index 000000000..c9a12357b --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/GreaterThanStatement.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.api.structures.parser.lang.operations.statements; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class GreaterThanStatement extends BinaryOperation { + public GreaterThanStatement(Returnable left, Returnable right, Position position) { + super(left, right, position); + } + + @Override + public Boolean apply(Number left, Number right) { + return left.doubleValue() > right.doubleValue(); + } + + + @Override + public ReturnType returnType() { + return ReturnType.BOOLEAN; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/LessThanOrEqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/LessThanOrEqualsStatement.java new file mode 100644 index 000000000..6904acb62 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/LessThanOrEqualsStatement.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.api.structures.parser.lang.operations.statements; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class LessThanOrEqualsStatement extends BinaryOperation { + public LessThanOrEqualsStatement(Returnable left, Returnable right, Position position) { + super(left, right, position); + } + + @Override + public Boolean apply(Number left, Number right) { + return left.doubleValue() <= right.doubleValue(); + } + + + @Override + public ReturnType returnType() { + return ReturnType.BOOLEAN; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/LessThanStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/LessThanStatement.java new file mode 100644 index 000000000..03fff20c1 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/LessThanStatement.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.api.structures.parser.lang.operations.statements; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class LessThanStatement extends BinaryOperation { + public LessThanStatement(Returnable left, Returnable right, Position position) { + super(left, right, position); + } + + @Override + public Boolean apply(Number left, Number right) { + return left.doubleValue() < right.doubleValue(); + } + + + @Override + public ReturnType returnType() { + return ReturnType.BOOLEAN; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/NotEqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/NotEqualsStatement.java new file mode 100644 index 000000000..e0e57783c --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/NotEqualsStatement.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.api.structures.parser.lang.operations.statements; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class NotEqualsStatement extends BinaryOperation { + public NotEqualsStatement(Returnable left, Returnable right, Position position) { + super(left, right, position); + } + + @Override + public Boolean apply(Object left, Object right) { + return !left.equals(right); + } + + + @Override + public ReturnType returnType() { + return ReturnType.BOOLEAN; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java deleted file mode 100644 index 890669601..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/EqualsStatement.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.dfsek.terra.api.structures.parser.lang.statements; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.structures.parser.lang.Item; -import com.dfsek.terra.api.structures.parser.lang.Statement; -import com.dfsek.terra.api.structures.tokenizer.Position; - -public class EqualsStatement implements Statement { - private final Item left; - private final Item right; - private final Position position; - - public EqualsStatement(Item left, Item right, Position position) { - this.left = left; - this.right = right; - this.position = position; - } - - @Override - public Boolean apply(Location location) { - return left.apply(location).equals(right.apply(location)); - } - - @Override - public Boolean apply(Location location, Chunk chunk) { - return left.apply(location, chunk).equals(right.apply(location, chunk)); - } - - @Override - public Position getPosition() { - return position; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java deleted file mode 100644 index 47f4cea60..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/GreaterThanStatement.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.dfsek.terra.api.structures.parser.lang.statements; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.structures.parser.lang.Item; -import com.dfsek.terra.api.structures.parser.lang.Statement; -import com.dfsek.terra.api.structures.tokenizer.Position; - -public class GreaterThanStatement> implements Statement { - private final Item left; - private final Item right; - private final Position position; - - public GreaterThanStatement(Item left, Item right, Position position) { - this.left = left; - this.right = right; - this.position = position; - } - - @Override - public Boolean apply(Location location) { - return left.apply(location).compareTo(right.apply(location)) > 0; - } - - @Override - public Boolean apply(Location location, Chunk chunk) { - return left.apply(location).compareTo(right.apply(location)) > 0; - } - - @Override - public Position getPosition() { - return position; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java deleted file mode 100644 index ded5a2925..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/statements/NotEqualsStatement.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.dfsek.terra.api.structures.parser.lang.statements; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.structures.parser.lang.Item; -import com.dfsek.terra.api.structures.parser.lang.Statement; -import com.dfsek.terra.api.structures.tokenizer.Position; - -public class NotEqualsStatement implements Statement { - private final Item left; - private final Item right; - private final Position position; - - public NotEqualsStatement(Item left, Item right, Position position) { - this.left = left; - this.right = right; - this.position = position; - } - - @Override - public Boolean apply(Location location) { - return !left.apply(location).equals(right.apply(location)); - } - - @Override - public Boolean apply(Location location, Chunk chunk) { - return !left.apply(location, chunk).equals(right.apply(location, chunk)); - } - - @Override - public Position getPosition() { - return position; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 178f9fe6c..2fd66fc4a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -37,13 +37,22 @@ public class Token { || type.equals(Type.SUBTRACTION_OPERATOR) || type.equals(Type.MULTIPLICATION_OPERATOR) || type.equals(Type.DIVISION_OPERATOR) - || type.equals(Type.BOOLEAN_OPERATOR); + || type.equals(Type.EQUALS_OPERATOR) + || type.equals(Type.NOT_EQUALS_OPERATOR) + || type.equals(Type.LESS_THAN_OPERATOR) + || type.equals(Type.GREATER_THAN_OPERATOR) + || type.equals(Type.LESS_THAN_OR_EQUALS_OPERATOR) + || type.equals(Type.GREATER_THAN_OR_EQUALS_OPERATOR); } - public boolean isStrictArithmeticOperator() { + public boolean isStrictNumericOperator() { return type.equals(Type.SUBTRACTION_OPERATOR) || type.equals(Type.MULTIPLICATION_OPERATOR) - || type.equals(Type.DIVISION_OPERATOR); + || type.equals(Type.DIVISION_OPERATOR) + || type.equals(Type.GREATER_THAN_OPERATOR) + || type.equals(Type.LESS_THAN_OPERATOR) + || type.equals(Type.LESS_THAN_OR_EQUALS_OPERATOR) + || type.equals(Type.GREATER_THAN_OR_EQUALS_OPERATOR); } public enum Type { @@ -97,9 +106,14 @@ public class Token { */ ASSIGNMENT, /** - * Boolean operator + * Boolean equals operator */ - BOOLEAN_OPERATOR, + EQUALS_OPERATOR, + NOT_EQUALS_OPERATOR, + GREATER_THAN_OPERATOR, + LESS_THAN_OPERATOR, + GREATER_THAN_OR_EQUALS_OPERATOR, + LESS_THAN_OR_EQUALS_OPERATOR, /** * Addition/concatenation operator */ diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index f2be8a717..790ccf0f4 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -39,17 +39,17 @@ public class Tokenizer { if(reader.matches("==", true)) - return new Token("==", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + return new Token("==", Token.Type.EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("!=", true)) - return new Token("!=", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + return new Token("!=", Token.Type.NOT_EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches(">", true)) - return new Token(">", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + return new Token(">", Token.Type.GREATER_THAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("<", true)) - return new Token("<", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + return new Token("<", Token.Type.LESS_THAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches(">=", true)) - return new Token(">=", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + return new Token(">=", Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("<=", true)) - return new Token("<=", Token.Type.BOOLEAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + return new Token("<=", Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(isNumberStart()) { diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 8f635d3fe..4eabb6a5f 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,5 +1,5 @@ -test("hello" + 3 + "gdfg", 3 + 8*2 - 1); +test("hello" + 3 + "gdfg", 2); -if(true) { +if(true == test("hello" + 3 + "gdfg", 3 + 8*2 - 1)) { test("fdsgdf" + 2, 3.4); } \ No newline at end of file From fe17683d277f0ae16adfff12ca71ce4a29c9e476 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 21 Dec 2020 20:36:48 -0700 Subject: [PATCH 080/210] cleanup, refactor, remove logging --- .../terra/api/structures/parser/Parser.java | 15 +++++------- .../terra/api/structures/tokenizer/Token.java | 23 +++++++++++++++---- .../api/structures/tokenizer/Tokenizer.java | 4 ++-- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index f87e44611..2e01ee82e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -85,12 +85,12 @@ public class Parser { Keyword k = null; if(identifier.getContent().equals("if")) { - checkType(tokens.remove(0), Token.Type.BODY_BEGIN); + checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); Returnable comparator = parseExpression(tokens, true); checkReturnType(comparator, Returnable.ReturnType.BOOLEAN); - checkType(tokens.remove(0), Token.Type.BODY_END); + checkType(tokens.remove(0), Token.Type.GROUP_END); checkType(tokens.remove(0), Token.Type.BLOCK_BEGIN); @@ -104,7 +104,7 @@ public class Parser { private Returnable parseExpression(List tokens, boolean full) throws ParseException { System.out.println(tokens.get(0)); Token first = tokens.get(0); - checkType(first, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.BOOLEAN_NOT, Token.Type.BODY_BEGIN); + checkType(first, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.BOOLEAN_NOT, Token.Type.GROUP_BEGIN); boolean not = false; if(first.getType().equals(Token.Type.BOOLEAN_NOT)) { @@ -152,12 +152,9 @@ public class Parser { Returnable right = parseExpression(tokens, false); Token other = tokens.get(0); - System.out.println("other: " + other); if(other.isBinaryOperator() && (other.getType().equals(Token.Type.MULTIPLICATION_OPERATOR) || other.getType().equals(Token.Type.DIVISION_OPERATOR))) { - System.out.println("using left"); return assemble(left, parseBinaryOperation(right, tokens), binaryOperator); } else if(other.isBinaryOperator()) { - System.out.println("using right"); return parseBinaryOperation(assemble(left, right, binaryOperator), tokens); } return assemble(left, right, binaryOperator); @@ -232,7 +229,7 @@ public class Parser { if(!functions.containsKey(identifier.getContent())) throw new ParseException("No such function " + identifier.getContent() + ": " + identifier.getPosition()); - checkType(tokens.remove(0), Token.Type.BODY_BEGIN); // Second is body begin + checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); // Second is body begin List> args = getArgs(tokens); // Extract arguments, consume the rest. @@ -251,9 +248,9 @@ public class Parser { private List> getArgs(List tokens) throws ParseException { List> args = new GlueList<>(); - while(!tokens.get(0).getType().equals(Token.Type.BODY_END)) { + while(!tokens.get(0).getType().equals(Token.Type.GROUP_END)) { args.add(parseExpression(tokens, true)); - checkType(tokens.get(0), Token.Type.SEPARATOR, Token.Type.BODY_END); + checkType(tokens.get(0), Token.Type.SEPARATOR, Token.Type.GROUP_END); if(tokens.get(0).getType().equals(Token.Type.SEPARATOR)) tokens.remove(0); } return args; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 2fd66fc4a..1e09aa6bd 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -78,13 +78,13 @@ public class Token { */ BOOLEAN, /** - * Beginning of function body + * Beginning of group */ - BODY_BEGIN, + GROUP_BEGIN, /** - * Ending of function body + * Ending of group */ - BODY_END, + GROUP_END, /** * End of statement */ @@ -109,10 +109,25 @@ public class Token { * Boolean equals operator */ EQUALS_OPERATOR, + /** + * Boolean not equals operator + */ NOT_EQUALS_OPERATOR, + /** + * Boolean greater than operator + */ GREATER_THAN_OPERATOR, + /** + * Boolean less than operator + */ LESS_THAN_OPERATOR, + /** + * Boolean greater than or equal to operator + */ GREATER_THAN_OR_EQUALS_OPERATOR, + /** + * Boolean less than or equal to operator + */ LESS_THAN_OR_EQUALS_OPERATOR, /** * Addition/concatenation operator diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index 790ccf0f4..e886ca509 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -80,9 +80,9 @@ public class Tokenizer { } if(reader.current().is('(')) - return new Token(reader.consume().toString(), Token.Type.BODY_BEGIN, new Position(reader.getLine(), reader.getIndex())); + return new Token(reader.consume().toString(), Token.Type.GROUP_BEGIN, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is(')')) - return new Token(reader.consume().toString(), Token.Type.BODY_END, new Position(reader.getLine(), reader.getIndex())); + return new Token(reader.consume().toString(), Token.Type.GROUP_END, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is(';')) return new Token(reader.consume().toString(), Token.Type.STATEMENT_END, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is(',')) From be8ed913e558efa1f7006549ab2e790475f136e5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 21 Dec 2020 20:55:51 -0700 Subject: [PATCH 081/210] allow grouping binary operations --- .../dfsek/terra/api/structures/parser/Parser.java | 13 ++++++++++--- common/src/test/resources/test.tesf | 2 +- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 2e01ee82e..19fcf8c4e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -102,8 +102,10 @@ public class Parser { @SuppressWarnings("unchecked") private Returnable parseExpression(List tokens, boolean full) throws ParseException { - System.out.println(tokens.get(0)); Token first = tokens.get(0); + + if(first.getType().equals(Token.Type.GROUP_BEGIN)) return parseGroup(tokens); + checkType(first, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.BOOLEAN_NOT, Token.Type.GROUP_BEGIN); boolean not = false; @@ -143,6 +145,13 @@ public class Parser { return expression; } + private Returnable parseGroup(List tokens) throws ParseException { + checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); + Returnable expression = parseExpression(tokens, true); + checkType(tokens.remove(0), Token.Type.GROUP_END); + return expression; + } + private BinaryOperation parseBinaryOperation(Returnable left, List tokens) throws ParseException { Token binaryOperator = tokens.remove(0); @@ -187,8 +196,6 @@ public class Parser { return new GreaterOrEqualsThanStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); case LESS_THAN_OR_EQUALS_OPERATOR: return new LessThanOrEqualsStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); - - default: throw new UnsupportedOperationException("Unsupported binary operator: " + binaryOperator.getType()); } diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 4eabb6a5f..35aa873b3 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,4 +1,4 @@ -test("hello" + 3 + "gdfg", 2); +test("hello" + 3 + "gdfg", (2 * (3+1))); if(true == test("hello" + 3 + "gdfg", 3 + 8*2 - 1)) { test("fdsgdf" + 2, 3.4); From 13fbb9bf5406eb0ade059cb266bc841f7d7d0dd1 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 21 Dec 2020 21:08:43 -0700 Subject: [PATCH 082/210] Implement boolean binary operations AND and OR --- .../terra/api/structures/parser/Parser.java | 16 ++++++++++++++- .../lang/operations/BinaryOperation.java | 2 +- .../lang/operations/BooleanAndOperation.java | 20 +++++++++++++++++++ .../lang/operations/BooleanOrOperation.java | 20 +++++++++++++++++++ .../lang/operations/UnaryOperation.java | 2 +- .../terra/api/structures/tokenizer/Token.java | 19 ++++++++++++++++-- .../api/structures/tokenizer/Tokenizer.java | 4 ++++ common/src/test/resources/test.tesf | 4 ++-- 8 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanAndOperation.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanOrOperation.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 19fcf8c4e..ee536915f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -12,7 +12,9 @@ import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword; import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; +import com.dfsek.terra.api.structures.parser.lang.operations.BooleanAndOperation; import com.dfsek.terra.api.structures.parser.lang.operations.BooleanNotOperation; +import com.dfsek.terra.api.structures.parser.lang.operations.BooleanOrOperation; import com.dfsek.terra.api.structures.parser.lang.operations.ConcatenationOperation; import com.dfsek.terra.api.structures.parser.lang.operations.DivisionOperation; import com.dfsek.terra.api.structures.parser.lang.operations.MultiplicationOperation; @@ -156,7 +158,8 @@ public class Parser { private BinaryOperation parseBinaryOperation(Returnable left, List tokens) throws ParseException { Token binaryOperator = tokens.remove(0); checkType(binaryOperator, Token.Type.ADDITION_OPERATOR, Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR, Token.Type.SUBTRACTION_OPERATOR, - Token.Type.GREATER_THAN_OPERATOR, Token.Type.LESS_THAN_OPERATOR, Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR, Token.Type.EQUALS_OPERATOR, Token.Type.NOT_EQUALS_OPERATOR); + Token.Type.GREATER_THAN_OPERATOR, Token.Type.LESS_THAN_OPERATOR, Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR, Token.Type.EQUALS_OPERATOR, Token.Type.NOT_EQUALS_OPERATOR, + Token.Type.BOOLEAN_AND, Token.Type.BOOLEAN_OR); Returnable right = parseExpression(tokens, false); @@ -172,6 +175,7 @@ public class Parser { @SuppressWarnings("unchecked") private BinaryOperation assemble(Returnable left, Returnable right, Token binaryOperator) throws ParseException { if(binaryOperator.isStrictNumericOperator()) checkArithmeticOperation(left, right, binaryOperator.getType()); + if(binaryOperator.isStrictBooleanOperator()) checkBooleanOperation(left, right, binaryOperator.getType()); switch(binaryOperator.getType()) { case ADDITION_OPERATOR: if(left.returnType().equals(Returnable.ReturnType.NUMBER) && right.returnType().equals(Returnable.ReturnType.NUMBER)) { @@ -196,6 +200,10 @@ public class Parser { return new GreaterOrEqualsThanStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); case LESS_THAN_OR_EQUALS_OPERATOR: return new LessThanOrEqualsStatement((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case BOOLEAN_AND: + return new BooleanAndOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case BOOLEAN_OR: + return new BooleanOrOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); default: throw new UnsupportedOperationException("Unsupported binary operator: " + binaryOperator.getType()); } @@ -278,4 +286,10 @@ public class Parser { throw new ParseException("Operation " + operation + " not supported between " + left.returnType() + " and " + right.returnType()); } } + + private void checkBooleanOperation(Returnable left, Returnable right, Token.Type operation) throws ParseException { + if(!left.returnType().equals(Returnable.ReturnType.BOOLEAN) || !right.returnType().equals(Returnable.ReturnType.BOOLEAN)) { + throw new ParseException("Operation " + operation + " not supported between " + left.returnType() + " and " + right.returnType()); + } + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java index 360db72be..dc583d20e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java @@ -10,7 +10,7 @@ public abstract class BinaryOperation implements Returnable { private final Returnable right; private final Position start; - protected BinaryOperation(Returnable left, Returnable right, Position start) { + public BinaryOperation(Returnable left, Returnable right, Position start) { this.left = left; this.right = right; this.start = start; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanAndOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanAndOperation.java new file mode 100644 index 000000000..3bca80717 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanAndOperation.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class BooleanAndOperation extends BinaryOperation { + public BooleanAndOperation(Returnable left, Returnable right, Position start) { + super(left, right, start); + } + + @Override + public Boolean apply(Boolean left, Boolean right) { + return left && right; + } + + @Override + public ReturnType returnType() { + return ReturnType.BOOLEAN; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanOrOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanOrOperation.java new file mode 100644 index 000000000..513c35be5 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BooleanOrOperation.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class BooleanOrOperation extends BinaryOperation { + public BooleanOrOperation(Returnable left, Returnable right, Position start) { + super(left, right, start); + } + + @Override + public Boolean apply(Boolean left, Boolean right) { + return left || right; + } + + @Override + public ReturnType returnType() { + return ReturnType.BOOLEAN; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java index 8f0db76e5..bc1e1e902 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java @@ -9,7 +9,7 @@ public abstract class UnaryOperation implements Returnable { private final Returnable input; private final Position position; - protected UnaryOperation(Returnable input, Position position) { + public UnaryOperation(Returnable input, Position position) { this.input = input; this.position = position; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 1e09aa6bd..d6cea01a3 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -42,7 +42,9 @@ public class Token { || type.equals(Type.LESS_THAN_OPERATOR) || type.equals(Type.GREATER_THAN_OPERATOR) || type.equals(Type.LESS_THAN_OR_EQUALS_OPERATOR) - || type.equals(Type.GREATER_THAN_OR_EQUALS_OPERATOR); + || type.equals(Type.GREATER_THAN_OR_EQUALS_OPERATOR) + || type.equals(Type.BOOLEAN_OR) + || type.equals(Type.BOOLEAN_AND); } public boolean isStrictNumericOperator() { @@ -55,6 +57,11 @@ public class Token { || type.equals(Type.GREATER_THAN_OR_EQUALS_OPERATOR); } + public boolean isStrictBooleanOperator() { + return type.equals(Type.BOOLEAN_AND) + || type.equals(Type.BOOLEAN_OR); + } + public enum Type { /** * Function identifier or language keyword @@ -148,6 +155,14 @@ public class Token { /** * Boolean not operator */ - BOOLEAN_NOT + BOOLEAN_NOT, + /** + * Boolean or + */ + BOOLEAN_OR, + /** + * Boolean and + */ + BOOLEAN_AND } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index e886ca509..526f6c3dd 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -50,6 +50,10 @@ public class Tokenizer { return new Token(">=", Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("<=", true)) return new Token("<=", Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("||", true)) + return new Token("||", Token.Type.BOOLEAN_OR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("&&", true)) + return new Token("&&", Token.Type.BOOLEAN_AND, new Position(reader.getLine(), reader.getIndex())); if(isNumberStart()) { diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 35aa873b3..f067052ce 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,5 +1,5 @@ -test("hello" + 3 + "gdfg", (2 * (3+1))); +test("hello" + 3 + "gdfg", (2 * (3+1) * (2 * (1+1)))); -if(true == test("hello" + 3 + "gdfg", 3 + 8*2 - 1)) { +if(true || false) { test("fdsgdf" + 2, 3.4); } \ No newline at end of file From cb7b3de48c2e8225a6df9a2581d95ba8a3e31572 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 21 Dec 2020 22:30:02 -0700 Subject: [PATCH 083/210] better type checking for function args --- .../terra/api/structures/parser/Parser.java | 26 ++++++++++++------- .../api/structures/parser/lang/Argument.java | 5 ---- .../lang/functions/FunctionBuilder.java | 4 ++- .../src/test/java/structure/ParserTest.java | 17 ++++++++++-- common/src/test/resources/test.tesf | 2 +- 5 files changed, 36 insertions(+), 18 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Argument.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index ee536915f..cb2f20115 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -174,8 +174,8 @@ public class Parser { @SuppressWarnings("unchecked") private BinaryOperation assemble(Returnable left, Returnable right, Token binaryOperator) throws ParseException { - if(binaryOperator.isStrictNumericOperator()) checkArithmeticOperation(left, right, binaryOperator.getType()); - if(binaryOperator.isStrictBooleanOperator()) checkBooleanOperation(left, right, binaryOperator.getType()); + if(binaryOperator.isStrictNumericOperator()) checkArithmeticOperation(left, right, binaryOperator); + if(binaryOperator.isStrictBooleanOperator()) checkBooleanOperation(left, right, binaryOperator); switch(binaryOperator.getType()) { case ADDITION_OPERATOR: if(left.returnType().equals(Returnable.ReturnType.NUMBER) && right.returnType().equals(Returnable.ReturnType.NUMBER)) { @@ -254,9 +254,17 @@ public class Parser { if(fullStatement) checkType(tokens.get(0), Token.Type.STATEMENT_END); FunctionBuilder builder = functions.get(identifier.getContent()); - if(args.size() != builder.getArguments() && builder.getArguments() != -1) - throw new ParseException("Expected " + builder.getArguments() + " arguments, found " + args.size() + ": " + identifier.getPosition()); - return functions.get(identifier.getContent()).build(args, identifier.getPosition()); + + if(builder.argNumber() != -1 && args.size() != builder.argNumber()) + throw new ParseException("Expected " + builder.argNumber() + " arguments, found " + args.size() + ": " + identifier.getPosition()); + + for(int i = 0; i < args.size(); i++) { + Returnable argument = args.get(i); + if(builder.getArgument(i) == null) + throw new ParseException("Unexpected argument at position " + i + " in function " + identifier.getContent() + ": " + identifier.getPosition()); + checkReturnType(argument, builder.getArgument(i)); + } + return builder.build(args, identifier.getPosition()); } @@ -281,15 +289,15 @@ public class Parser { throw new ParseException("Expected " + Arrays.toString(types) + " but found " + returnable.returnType() + ": " + returnable.getPosition()); } - private void checkArithmeticOperation(Returnable left, Returnable right, Token.Type operation) throws ParseException { + private void checkArithmeticOperation(Returnable left, Returnable right, Token operation) throws ParseException { if(!left.returnType().equals(Returnable.ReturnType.NUMBER) || !right.returnType().equals(Returnable.ReturnType.NUMBER)) { - throw new ParseException("Operation " + operation + " not supported between " + left.returnType() + " and " + right.returnType()); + throw new ParseException("Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType() + ": " + operation.getPosition()); } } - private void checkBooleanOperation(Returnable left, Returnable right, Token.Type operation) throws ParseException { + private void checkBooleanOperation(Returnable left, Returnable right, Token operation) throws ParseException { if(!left.returnType().equals(Returnable.ReturnType.BOOLEAN) || !right.returnType().equals(Returnable.ReturnType.BOOLEAN)) { - throw new ParseException("Operation " + operation + " not supported between " + left.returnType() + " and " + right.returnType()); + throw new ParseException("Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType() + ": " + operation.getPosition()); } } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Argument.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Argument.java deleted file mode 100644 index 98a7c246f..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Argument.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.dfsek.terra.api.structures.parser.lang; - -public interface Argument { - T parse(String input); -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/FunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/FunctionBuilder.java index c05622d0d..7d1cbe4ba 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/FunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/FunctionBuilder.java @@ -9,5 +9,7 @@ import java.util.List; public interface FunctionBuilder> { T build(List> argumentList, Position position) throws ParseException; - int getArguments(); + int argNumber(); + + Returnable.ReturnType getArgument(int position); } diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 9eb52be0d..f69936b5e 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -27,9 +27,22 @@ public class ParserTest { } @Override - public int getArguments() { + public int argNumber() { return 2; } + + @Override + public Returnable.ReturnType getArgument(int position) { + switch(position) { + case 0: + return Returnable.ReturnType.STRING; + case 1: + return Returnable.ReturnType.NUMBER; + default: + return null; + } + } + }); long l = System.nanoTime(); @@ -71,7 +84,7 @@ public class ParserTest { @Override public Position getPosition() { - return null; + return position; } @Override diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index f067052ce..1136218f8 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,5 +1,5 @@ test("hello" + 3 + "gdfg", (2 * (3+1) * (2 * (1+1)))); if(true || false) { - test("fdsgdf" + 2, 3.4); + test("fdsgdf" + 2, 1); } \ No newline at end of file From 4f40bcbe5e186d806005bcb6d8c313f64b93a6ad Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 22 Dec 2020 02:00:40 -0700 Subject: [PATCH 084/210] Implement variables --- .../terra/api/structures/parser/Parser.java | 121 ++++++++++++++---- .../parser/lang/variables/Assignment.java | 38 ++++++ .../lang/variables/BooleanVariable.java | 34 +++++ .../parser/lang/variables/Getter.java | 34 +++++ .../parser/lang/variables/NumberVariable.java | 34 +++++ .../parser/lang/variables/StringVariable.java | 34 +++++ .../parser/lang/variables/Variable.java | 14 ++ .../terra/api/structures/tokenizer/Token.java | 8 +- .../api/structures/tokenizer/Tokenizer.java | 15 ++- .../src/test/java/structure/ParserTest.java | 28 ++-- common/src/test/resources/test.tesf | 13 +- 11 files changed, 320 insertions(+), 53 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/BooleanVariable.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/NumberVariable.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/StringVariable.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Variable.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index cb2f20115..d2461e48a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -26,6 +26,12 @@ import com.dfsek.terra.api.structures.parser.lang.operations.statements.GreaterT import com.dfsek.terra.api.structures.parser.lang.operations.statements.LessThanOrEqualsStatement; import com.dfsek.terra.api.structures.parser.lang.operations.statements.LessThanStatement; import com.dfsek.terra.api.structures.parser.lang.operations.statements.NotEqualsStatement; +import com.dfsek.terra.api.structures.parser.lang.variables.Assignment; +import com.dfsek.terra.api.structures.parser.lang.variables.BooleanVariable; +import com.dfsek.terra.api.structures.parser.lang.variables.Getter; +import com.dfsek.terra.api.structures.parser.lang.variables.NumberVariable; +import com.dfsek.terra.api.structures.parser.lang.variables.StringVariable; +import com.dfsek.terra.api.structures.parser.lang.variables.Variable; import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Token; import com.dfsek.terra.api.structures.tokenizer.Tokenizer; @@ -42,7 +48,7 @@ import java.util.Set; public class Parser { private final String data; private final Map>> functions = new HashMap<>(); - private final Set keywords = Sets.newHashSet("if"); + private final Set keywords = Sets.newHashSet("if", "return", "var"); Set allowedArguments = Sets.newHashSet(Token.Type.STRING, Token.Type.NUMBER, Token.Type.IDENTIFIER); @@ -73,12 +79,12 @@ public class Parser { } if(blockLevel != 0) throw new ParseException("Dangling opening brace"); - return parseBlock(tokens); + return parseBlock(tokens, new HashMap<>()); } @SuppressWarnings("unchecked") - private Keyword parseKeyword(List tokens) throws ParseException { + private Keyword parseKeyword(List tokens, Map> variableMap) throws ParseException { Token identifier = tokens.remove(0); checkType(identifier, Token.Type.KEYWORD); @@ -89,24 +95,24 @@ public class Parser { checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); - Returnable comparator = parseExpression(tokens, true); + Returnable comparator = parseExpression(tokens, true, variableMap); checkReturnType(comparator, Returnable.ReturnType.BOOLEAN); checkType(tokens.remove(0), Token.Type.GROUP_END); checkType(tokens.remove(0), Token.Type.BLOCK_BEGIN); - k = new IfKeyword(parseBlock(tokens), (Returnable) comparator, identifier.getPosition()); + k = new IfKeyword(parseBlock(tokens, variableMap), (Returnable) comparator, identifier.getPosition()); } return k; } @SuppressWarnings("unchecked") - private Returnable parseExpression(List tokens, boolean full) throws ParseException { + private Returnable parseExpression(List tokens, boolean full, Map> variableMap) throws ParseException { Token first = tokens.get(0); - if(first.getType().equals(Token.Type.GROUP_BEGIN)) return parseGroup(tokens); + if(first.getType().equals(Token.Type.GROUP_BEGIN)) return parseGroup(tokens, variableMap); checkType(first, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.BOOLEAN_NOT, Token.Type.GROUP_BEGIN); @@ -116,8 +122,9 @@ public class Parser { tokens.remove(0); } + Token id = tokens.get(0); Returnable expression; - if(tokens.get(0).isConstant()) { + if(id.isConstant()) { Token constantToken = tokens.remove(0); Position position = constantToken.getPosition(); switch(constantToken.getType()) { @@ -134,7 +141,13 @@ public class Parser { default: throw new UnsupportedOperationException("Unsupported constant token: " + constantToken.getType() + " at position: " + position); } - } else expression = parseFunction(tokens, false); + } else { + if(functions.containsKey(id.getContent())) expression = parseFunction(tokens, false, variableMap); + else if(variableMap.containsKey(id.getContent())) { + checkType(tokens.remove(0), Token.Type.IDENTIFIER); + expression = new Getter(variableMap.get(id.getContent())); + } else throw new ParseException("Unexpected token: " + id.getContent() + " at " + id.getPosition()); + } if(not) { @@ -142,32 +155,32 @@ public class Parser { expression = new BooleanNotOperation((Returnable) expression, expression.getPosition()); } if(full && tokens.get(0).isBinaryOperator()) { - return parseBinaryOperation(expression, tokens); + return parseBinaryOperation(expression, tokens, variableMap); } return expression; } - private Returnable parseGroup(List tokens) throws ParseException { + private Returnable parseGroup(List tokens, Map> variableMap) throws ParseException { checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); - Returnable expression = parseExpression(tokens, true); + Returnable expression = parseExpression(tokens, true, variableMap); checkType(tokens.remove(0), Token.Type.GROUP_END); return expression; } - private BinaryOperation parseBinaryOperation(Returnable left, List tokens) throws ParseException { + private BinaryOperation parseBinaryOperation(Returnable left, List tokens, Map> variableMap) throws ParseException { Token binaryOperator = tokens.remove(0); checkType(binaryOperator, Token.Type.ADDITION_OPERATOR, Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR, Token.Type.SUBTRACTION_OPERATOR, Token.Type.GREATER_THAN_OPERATOR, Token.Type.LESS_THAN_OPERATOR, Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR, Token.Type.EQUALS_OPERATOR, Token.Type.NOT_EQUALS_OPERATOR, Token.Type.BOOLEAN_AND, Token.Type.BOOLEAN_OR); - Returnable right = parseExpression(tokens, false); + Returnable right = parseExpression(tokens, false, variableMap); Token other = tokens.get(0); if(other.isBinaryOperator() && (other.getType().equals(Token.Type.MULTIPLICATION_OPERATOR) || other.getType().equals(Token.Type.DIVISION_OPERATOR))) { - return assemble(left, parseBinaryOperation(right, tokens), binaryOperator); + return assemble(left, parseBinaryOperation(right, tokens, variableMap), binaryOperator); } else if(other.isBinaryOperator()) { - return parseBinaryOperation(assemble(left, right, binaryOperator), tokens); + return parseBinaryOperation(assemble(left, right, binaryOperator), tokens, variableMap); } return assemble(left, right, binaryOperator); } @@ -209,35 +222,84 @@ public class Parser { } } - private Block parseBlock(List tokens) throws ParseException { + private Variable parseVariableDeclaration(List tokens, Returnable.ReturnType type) throws ParseException { + checkVarType(tokens.get(0), type); // Check for type mismatch + switch(type) { + case NUMBER: + return new NumberVariable(0d, tokens.get(0).getPosition()); + case STRING: + return new StringVariable("", tokens.get(0).getPosition()); + case BOOLEAN: + return new BooleanVariable(false, tokens.get(0).getPosition()); + } + throw new UnsupportedOperationException("Unsupported variable type: " + type); + } + + private Block parseBlock(List tokens, Map> superVars) throws ParseException { List> parsedItems = new GlueList<>(); + + Map> parsedVariables = new HashMap<>(superVars); // New hashmap as to not mutate parent scope's declarations. + Token first = tokens.get(0); - checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.KEYWORD); + checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE); main: while(tokens.size() > 0) { Token token = tokens.get(0); - checkType(token, Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END); + checkType(token, Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE); switch(token.getType()) { case KEYWORD: - parsedItems.add(parseKeyword(tokens)); + parsedItems.add(parseKeyword(tokens, parsedVariables)); if(tokens.isEmpty()) break; checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END); break; case IDENTIFIER: - parsedItems.add(parseFunction(tokens, true)); + parsedItems.add(parseFunction(tokens, true, parsedVariables)); if(tokens.isEmpty()) break; checkType(tokens.remove(0), Token.Type.STATEMENT_END, Token.Type.BLOCK_END); break; case BLOCK_END: - tokens.remove(0); + tokens.remove(0); // Remove block end. break main; + case NUMBER_VARIABLE: + case BOOLEAN_VARIABLE: + case STRING_VARIABLE: + Variable temp; + if(token.getType().equals(Token.Type.NUMBER_VARIABLE)) + temp = parseVariableDeclaration(tokens, Returnable.ReturnType.NUMBER); + else if(token.getType().equals(Token.Type.STRING_VARIABLE)) + temp = parseVariableDeclaration(tokens, Returnable.ReturnType.STRING); + else temp = parseVariableDeclaration(tokens, Returnable.ReturnType.BOOLEAN); + Token name = tokens.get(1); + + checkType(name, Token.Type.IDENTIFIER); + + parsedVariables.put(name.getContent(), temp); + parsedItems.add(parseAssignment(temp, tokens, parsedVariables)); + checkType(tokens.remove(0), Token.Type.STATEMENT_END); } } return new Block(parsedItems, first.getPosition()); } - private Function parseFunction(List tokens, boolean fullStatement) throws ParseException { + @SuppressWarnings("unchecked") + private Assignment parseAssignment(Variable variable, List tokens, Map> variableMap) throws ParseException { + checkType(tokens.remove(0), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); + + Token name = tokens.get(0); + + checkType(tokens.remove(0), Token.Type.IDENTIFIER); + + checkType(tokens.remove(0), Token.Type.ASSIGNMENT); + + Returnable expression = parseExpression(tokens, true, variableMap); + + checkReturnType(expression, variable.getType()); + + return new Assignment<>((Variable) variable, (Returnable) expression, name.getPosition()); + } + + private Function parseFunction(List tokens, boolean fullStatement, Map> variableMap) throws ParseException { Token identifier = tokens.remove(0); checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier @@ -247,7 +309,7 @@ public class Parser { checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); // Second is body begin - List> args = getArgs(tokens); // Extract arguments, consume the rest. + List> args = getArgs(tokens, variableMap); // Extract arguments, consume the rest. tokens.remove(0); // Remove body end @@ -268,11 +330,11 @@ public class Parser { } - private List> getArgs(List tokens) throws ParseException { + private List> getArgs(List tokens, Map> variableMap) throws ParseException { List> args = new GlueList<>(); while(!tokens.get(0).getType().equals(Token.Type.GROUP_END)) { - args.add(parseExpression(tokens, true)); + args.add(parseExpression(tokens, true, variableMap)); checkType(tokens.get(0), Token.Type.SEPARATOR, Token.Type.GROUP_END); if(tokens.get(0).getType().equals(Token.Type.SEPARATOR)) tokens.remove(0); } @@ -300,4 +362,11 @@ public class Parser { throw new ParseException("Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType() + ": " + operation.getPosition()); } } + + private void checkVarType(Token token, Returnable.ReturnType returnType) throws ParseException { + if(returnType.equals(Returnable.ReturnType.STRING) && token.getType().equals(Token.Type.STRING_VARIABLE)) return; + if(returnType.equals(Returnable.ReturnType.NUMBER) && token.getType().equals(Token.Type.NUMBER_VARIABLE)) return; + if(returnType.equals(Returnable.ReturnType.BOOLEAN) && token.getType().equals(Token.Type.BOOLEAN_VARIABLE)) return; + throw new ParseException("Type mismatch, cannot convert from " + returnType + " to " + token.getType() + ": " + token.getPosition()); + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java new file mode 100644 index 000000000..08f71a834 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.api.structures.parser.lang.variables; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Item; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class Assignment implements Item { + private final Variable delegate; + private final Returnable value; + private final Position position; + + public Assignment(Variable delegate, Returnable value, Position position) { + this.delegate = delegate; + this.value = value; + this.position = position; + } + + @Override + public T apply(Location location) { + T val = value.apply(location); + delegate.setValue(val); + return val; + } + + @Override + public T apply(Location location, Chunk chunk) { + T val = value.apply(location, chunk); + delegate.setValue(val); + return val; + } + + @Override + public Position getPosition() { + return position; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/BooleanVariable.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/BooleanVariable.java new file mode 100644 index 000000000..ad0ed5400 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/BooleanVariable.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.api.structures.parser.lang.variables; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class BooleanVariable implements Variable { + private final Position position; + private Boolean value; + + public BooleanVariable(Boolean value, Position position) { + this.value = value; + this.position = position; + } + + @Override + public Boolean getValue() { + return value; + } + + @Override + public void setValue(Boolean value) { + this.value = value; + } + + @Override + public Returnable.ReturnType getType() { + return Returnable.ReturnType.BOOLEAN; + } + + @Override + public Position getPosition() { + return position; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java new file mode 100644 index 000000000..b7fe3eedd --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.api.structures.parser.lang.variables; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class Getter implements Returnable { + private final Variable delegate; + + public Getter(Variable delegate) { + this.delegate = delegate; + } + + @Override + public ReturnType returnType() { + return delegate.getType(); + } + + @Override + public Object apply(Location location) { + return delegate.getValue(); + } + + @Override + public Object apply(Location location, Chunk chunk) { + return delegate.getValue(); + } + + @Override + public Position getPosition() { + return delegate.getPosition(); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/NumberVariable.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/NumberVariable.java new file mode 100644 index 000000000..6f7355cb4 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/NumberVariable.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.api.structures.parser.lang.variables; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class NumberVariable implements Variable { + private final Position position; + private Number value; + + public NumberVariable(Number value, Position position) { + this.value = value; + this.position = position; + } + + @Override + public Number getValue() { + return value; + } + + @Override + public void setValue(Number value) { + this.value = value; + } + + @Override + public Returnable.ReturnType getType() { + return Returnable.ReturnType.NUMBER; + } + + @Override + public Position getPosition() { + return position; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/StringVariable.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/StringVariable.java new file mode 100644 index 000000000..a2b48e73e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/StringVariable.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.api.structures.parser.lang.variables; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class StringVariable implements Variable { + private final Position position; + private String value; + + public StringVariable(String value, Position position) { + this.value = value; + this.position = position; + } + + @Override + public String getValue() { + return value; + } + + @Override + public void setValue(String value) { + this.value = value; + } + + @Override + public Returnable.ReturnType getType() { + return Returnable.ReturnType.STRING; + } + + @Override + public Position getPosition() { + return position; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Variable.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Variable.java new file mode 100644 index 000000000..4db60a3bf --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Variable.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.api.structures.parser.lang.variables; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public interface Variable { + T getValue(); + + void setValue(T value); + + Returnable.ReturnType getType(); + + Position getPosition(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index d6cea01a3..ab1d9bea5 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -163,6 +163,12 @@ public class Token { /** * Boolean and */ - BOOLEAN_AND + BOOLEAN_AND, + /** + * Variable declaration + */ + NUMBER_VARIABLE, + STRING_VARIABLE, + BOOLEAN_VARIABLE } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index 526f6c3dd..18a62bf46 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -12,7 +12,7 @@ public class Tokenizer { private final Lookahead reader; private final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+', '-', '*', '/', '>', '<', '!'); // Reserved chars - private final Set keywords = Sets.newHashSet("if", "return"); + private final Set keywords = Sets.newHashSet("if", "return", "num", "bool", "str"); public Tokenizer(String data) { @@ -20,7 +20,7 @@ public class Tokenizer { } public boolean hasNext() { - while(!reader.current().isEOF() && reader.current().isWhitespace()) reader.consume(); // Consume whitespace. + //while(!reader.current().isEOF() && reader.current().isWhitespace()) reader.consume(); // Consume whitespace. return !reader.current().isEOF(); } @@ -50,11 +50,19 @@ public class Tokenizer { return new Token(">=", Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("<=", true)) return new Token("<=", Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("||", true)) return new Token("||", Token.Type.BOOLEAN_OR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("&&", true)) return new Token("&&", Token.Type.BOOLEAN_AND, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("num ", true)) + return new Token("num ", Token.Type.NUMBER_VARIABLE, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("str ", true)) + return new Token("str ", Token.Type.STRING_VARIABLE, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("bool ", true)) + return new Token("bool ", Token.Type.BOOLEAN_VARIABLE, new Position(reader.getLine(), reader.getIndex())); + if(isNumberStart()) { StringBuilder num = new StringBuilder(); @@ -111,7 +119,8 @@ public class Tokenizer { StringBuilder token = new StringBuilder(); while(!reader.current().isEOF() && !isSyntaxSignificant(reader.current().getCharacter())) { Char c = reader.consume(); - if(!c.isWhitespace()) token.append(c); + if(c.isWhitespace()) break; + token.append(c); } String tokenString = token.toString(); diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index f69936b5e..dadd2a9bd 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -4,7 +4,7 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.parser.lang.Item; +import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; @@ -23,7 +23,7 @@ public class ParserTest { parser.addFunction("test", new FunctionBuilder() { @Override public Test1 build(List> argumentList, Position position) throws ParseException { - return new Test1(argumentList.get(0).apply(new Location(null, 0, 0, 0)).toString(), Double.parseDouble(argumentList.get(1).apply(new Location(null, 0, 0, 0)).toString()), position); + return new Test1(argumentList.get(0), argumentList.get(1), position); } @Override @@ -46,34 +46,27 @@ public class ParserTest { }); long l = System.nanoTime(); - List> functions = parser.parse().getItems(); + Block block = parser.parse(); long t = System.nanoTime() - l; System.out.println("Took " + (double) t / 1000000); - for(Item f : functions) System.out.println(f); + block.apply(null); } private static class Test1 implements Function { - private final String a; - private final double b; + private final Returnable a; + private final Returnable b; private final Position position; - public Test1(String a, double b, Position position) { + public Test1(Returnable a, Returnable b, Position position) { this.a = a; this.b = b; this.position = position; } - public String getA() { - return a; - } - - public double getB() { - return b; - } - @Override public Void apply(Location location) { + System.out.println("string: " + a.apply(location) + ", double: " + b.apply(location)); return null; } @@ -92,11 +85,6 @@ public class ParserTest { return null; } - @Override - public String toString() { - return "string: " + a + ", double: " + b; - } - @Override public ReturnType returnType() { return ReturnType.VOID; diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 1136218f8..76de53504 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,5 +1,12 @@ test("hello" + 3 + "gdfg", (2 * (3+1) * (2 * (1+1)))); -if(true || false) { - test("fdsgdf" + 2, 1); -} \ No newline at end of file +num testVar = 3.4; +bool boolean = true; +str stringVar = "hello!"; + +if(true && boolean) { + num scopedVar = 2; + test("fdsgdf" + 2 + stringVar, 1 + testVar + scopedVar); +} + +test("fdsgdf" + 2, 1 + testVar); \ No newline at end of file From 0ecd275c5604e703dabb4a063c00f809bececcca Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 22 Dec 2020 02:13:35 -0700 Subject: [PATCH 085/210] Fix comment whitespace tokenizer issues --- .../terra/api/structures/parser/Parser.java | 90 ++++++------------- .../api/structures/parser/ParserUtil.java | 49 ++++++++++ .../api/structures/tokenizer/Tokenizer.java | 19 +++- common/src/test/resources/test.tesf | 10 ++- 4 files changed, 101 insertions(+), 67 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index d2461e48a..069c6d5e1 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -39,7 +39,6 @@ import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; import com.dfsek.terra.api.util.GlueList; import com.google.common.collect.Sets; -import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -87,20 +86,20 @@ public class Parser { private Keyword parseKeyword(List tokens, Map> variableMap) throws ParseException { Token identifier = tokens.remove(0); - checkType(identifier, Token.Type.KEYWORD); + ParserUtil.checkType(identifier, Token.Type.KEYWORD); if(!keywords.contains(identifier.getContent())) throw new ParseException("No such keyword " + identifier.getContent() + ": " + identifier.getPosition()); Keyword k = null; if(identifier.getContent().equals("if")) { - checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); + ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); Returnable comparator = parseExpression(tokens, true, variableMap); - checkReturnType(comparator, Returnable.ReturnType.BOOLEAN); + ParserUtil.checkReturnType(comparator, Returnable.ReturnType.BOOLEAN); - checkType(tokens.remove(0), Token.Type.GROUP_END); + ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_END); - checkType(tokens.remove(0), Token.Type.BLOCK_BEGIN); + ParserUtil.checkType(tokens.remove(0), Token.Type.BLOCK_BEGIN); k = new IfKeyword(parseBlock(tokens, variableMap), (Returnable) comparator, identifier.getPosition()); @@ -114,7 +113,7 @@ public class Parser { if(first.getType().equals(Token.Type.GROUP_BEGIN)) return parseGroup(tokens, variableMap); - checkType(first, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.BOOLEAN_NOT, Token.Type.GROUP_BEGIN); + ParserUtil.checkType(first, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.BOOLEAN_NOT, Token.Type.GROUP_BEGIN); boolean not = false; if(first.getType().equals(Token.Type.BOOLEAN_NOT)) { @@ -144,14 +143,14 @@ public class Parser { } else { if(functions.containsKey(id.getContent())) expression = parseFunction(tokens, false, variableMap); else if(variableMap.containsKey(id.getContent())) { - checkType(tokens.remove(0), Token.Type.IDENTIFIER); + ParserUtil.checkType(tokens.remove(0), Token.Type.IDENTIFIER); expression = new Getter(variableMap.get(id.getContent())); } else throw new ParseException("Unexpected token: " + id.getContent() + " at " + id.getPosition()); } if(not) { - checkReturnType(expression, Returnable.ReturnType.BOOLEAN); + ParserUtil.checkReturnType(expression, Returnable.ReturnType.BOOLEAN); expression = new BooleanNotOperation((Returnable) expression, expression.getPosition()); } if(full && tokens.get(0).isBinaryOperator()) { @@ -161,18 +160,16 @@ public class Parser { } private Returnable parseGroup(List tokens, Map> variableMap) throws ParseException { - checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); + ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); Returnable expression = parseExpression(tokens, true, variableMap); - checkType(tokens.remove(0), Token.Type.GROUP_END); + ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_END); return expression; } private BinaryOperation parseBinaryOperation(Returnable left, List tokens, Map> variableMap) throws ParseException { Token binaryOperator = tokens.remove(0); - checkType(binaryOperator, Token.Type.ADDITION_OPERATOR, Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR, Token.Type.SUBTRACTION_OPERATOR, - Token.Type.GREATER_THAN_OPERATOR, Token.Type.LESS_THAN_OPERATOR, Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR, Token.Type.EQUALS_OPERATOR, Token.Type.NOT_EQUALS_OPERATOR, - Token.Type.BOOLEAN_AND, Token.Type.BOOLEAN_OR); + ParserUtil.checkBinaryOperator(binaryOperator); Returnable right = parseExpression(tokens, false, variableMap); @@ -187,8 +184,8 @@ public class Parser { @SuppressWarnings("unchecked") private BinaryOperation assemble(Returnable left, Returnable right, Token binaryOperator) throws ParseException { - if(binaryOperator.isStrictNumericOperator()) checkArithmeticOperation(left, right, binaryOperator); - if(binaryOperator.isStrictBooleanOperator()) checkBooleanOperation(left, right, binaryOperator); + if(binaryOperator.isStrictNumericOperator()) ParserUtil.checkArithmeticOperation(left, right, binaryOperator); + if(binaryOperator.isStrictBooleanOperator()) ParserUtil.checkBooleanOperation(left, right, binaryOperator); switch(binaryOperator.getType()) { case ADDITION_OPERATOR: if(left.returnType().equals(Returnable.ReturnType.NUMBER) && right.returnType().equals(Returnable.ReturnType.NUMBER)) { @@ -223,7 +220,7 @@ public class Parser { } private Variable parseVariableDeclaration(List tokens, Returnable.ReturnType type) throws ParseException { - checkVarType(tokens.get(0), type); // Check for type mismatch + ParserUtil.checkVarType(tokens.get(0), type); // Check for type mismatch switch(type) { case NUMBER: return new NumberVariable(0d, tokens.get(0).getPosition()); @@ -242,21 +239,21 @@ public class Parser { Token first = tokens.get(0); - checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE); + ParserUtil.checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE); main: while(tokens.size() > 0) { Token token = tokens.get(0); - checkType(token, Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE); + ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE); switch(token.getType()) { case KEYWORD: parsedItems.add(parseKeyword(tokens, parsedVariables)); if(tokens.isEmpty()) break; - checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END); + ParserUtil.checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END); break; case IDENTIFIER: parsedItems.add(parseFunction(tokens, true, parsedVariables)); if(tokens.isEmpty()) break; - checkType(tokens.remove(0), Token.Type.STATEMENT_END, Token.Type.BLOCK_END); + ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END, Token.Type.BLOCK_END); break; case BLOCK_END: tokens.remove(0); // Remove block end. @@ -272,11 +269,11 @@ public class Parser { else temp = parseVariableDeclaration(tokens, Returnable.ReturnType.BOOLEAN); Token name = tokens.get(1); - checkType(name, Token.Type.IDENTIFIER); + ParserUtil.checkType(name, Token.Type.IDENTIFIER); parsedVariables.put(name.getContent(), temp); parsedItems.add(parseAssignment(temp, tokens, parsedVariables)); - checkType(tokens.remove(0), Token.Type.STATEMENT_END); + ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END); } } return new Block(parsedItems, first.getPosition()); @@ -284,36 +281,36 @@ public class Parser { @SuppressWarnings("unchecked") private Assignment parseAssignment(Variable variable, List tokens, Map> variableMap) throws ParseException { - checkType(tokens.remove(0), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); + ParserUtil.checkType(tokens.remove(0), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); Token name = tokens.get(0); - checkType(tokens.remove(0), Token.Type.IDENTIFIER); + ParserUtil.checkType(tokens.remove(0), Token.Type.IDENTIFIER); - checkType(tokens.remove(0), Token.Type.ASSIGNMENT); + ParserUtil.checkType(tokens.remove(0), Token.Type.ASSIGNMENT); Returnable expression = parseExpression(tokens, true, variableMap); - checkReturnType(expression, variable.getType()); + ParserUtil.checkReturnType(expression, variable.getType()); return new Assignment<>((Variable) variable, (Returnable) expression, name.getPosition()); } private Function parseFunction(List tokens, boolean fullStatement, Map> variableMap) throws ParseException { Token identifier = tokens.remove(0); - checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier + ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier if(!functions.containsKey(identifier.getContent())) throw new ParseException("No such function " + identifier.getContent() + ": " + identifier.getPosition()); - checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); // Second is body begin + ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); // Second is body begin List> args = getArgs(tokens, variableMap); // Extract arguments, consume the rest. tokens.remove(0); // Remove body end - if(fullStatement) checkType(tokens.get(0), Token.Type.STATEMENT_END); + if(fullStatement) ParserUtil.checkType(tokens.get(0), Token.Type.STATEMENT_END); FunctionBuilder builder = functions.get(identifier.getContent()); @@ -324,7 +321,7 @@ public class Parser { Returnable argument = args.get(i); if(builder.getArgument(i) == null) throw new ParseException("Unexpected argument at position " + i + " in function " + identifier.getContent() + ": " + identifier.getPosition()); - checkReturnType(argument, builder.getArgument(i)); + ParserUtil.checkReturnType(argument, builder.getArgument(i)); } return builder.build(args, identifier.getPosition()); } @@ -335,38 +332,9 @@ public class Parser { while(!tokens.get(0).getType().equals(Token.Type.GROUP_END)) { args.add(parseExpression(tokens, true, variableMap)); - checkType(tokens.get(0), Token.Type.SEPARATOR, Token.Type.GROUP_END); + ParserUtil.checkType(tokens.get(0), Token.Type.SEPARATOR, Token.Type.GROUP_END); if(tokens.get(0).getType().equals(Token.Type.SEPARATOR)) tokens.remove(0); } return args; } - - private void checkType(Token token, Token.Type... expected) throws ParseException { - for(Token.Type type : expected) if(token.getType().equals(type)) return; - throw new ParseException("Expected " + Arrays.toString(expected) + " but found " + token.getType() + ": " + token.getPosition()); - } - - private void checkReturnType(Returnable returnable, Returnable.ReturnType... types) throws ParseException { - for(Returnable.ReturnType type : types) if(returnable.returnType().equals(type)) return; - throw new ParseException("Expected " + Arrays.toString(types) + " but found " + returnable.returnType() + ": " + returnable.getPosition()); - } - - private void checkArithmeticOperation(Returnable left, Returnable right, Token operation) throws ParseException { - if(!left.returnType().equals(Returnable.ReturnType.NUMBER) || !right.returnType().equals(Returnable.ReturnType.NUMBER)) { - throw new ParseException("Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType() + ": " + operation.getPosition()); - } - } - - private void checkBooleanOperation(Returnable left, Returnable right, Token operation) throws ParseException { - if(!left.returnType().equals(Returnable.ReturnType.BOOLEAN) || !right.returnType().equals(Returnable.ReturnType.BOOLEAN)) { - throw new ParseException("Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType() + ": " + operation.getPosition()); - } - } - - private void checkVarType(Token token, Returnable.ReturnType returnType) throws ParseException { - if(returnType.equals(Returnable.ReturnType.STRING) && token.getType().equals(Token.Type.STRING_VARIABLE)) return; - if(returnType.equals(Returnable.ReturnType.NUMBER) && token.getType().equals(Token.Type.NUMBER_VARIABLE)) return; - if(returnType.equals(Returnable.ReturnType.BOOLEAN) && token.getType().equals(Token.Type.BOOLEAN_VARIABLE)) return; - throw new ParseException("Type mismatch, cannot convert from " + returnType + " to " + token.getType() + ": " + token.getPosition()); - } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java new file mode 100644 index 000000000..bb22de681 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java @@ -0,0 +1,49 @@ +package com.dfsek.terra.api.structures.parser; + +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Token; + +import java.util.Arrays; + +public class ParserUtil { + public static void checkType(Token token, Token.Type... expected) throws ParseException { + for(Token.Type type : expected) if(token.getType().equals(type)) return; + throw new ParseException("Expected " + Arrays.toString(expected) + " but found " + token.getType() + ": " + token.getPosition()); + } + + public static void checkReturnType(Returnable returnable, Returnable.ReturnType... types) throws ParseException { + for(Returnable.ReturnType type : types) if(returnable.returnType().equals(type)) return; + throw new ParseException("Expected " + Arrays.toString(types) + " but found " + returnable.returnType() + ": " + returnable.getPosition()); + } + + public static void checkArithmeticOperation(Returnable left, Returnable right, Token operation) throws ParseException { + if(!left.returnType().equals(Returnable.ReturnType.NUMBER) || !right.returnType().equals(Returnable.ReturnType.NUMBER)) { + throw new ParseException("Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType() + ": " + operation.getPosition()); + } + } + + public static void checkBooleanOperation(Returnable left, Returnable right, Token operation) throws ParseException { + if(!left.returnType().equals(Returnable.ReturnType.BOOLEAN) || !right.returnType().equals(Returnable.ReturnType.BOOLEAN)) { + throw new ParseException("Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType() + ": " + operation.getPosition()); + } + } + + public static void checkVarType(Token token, Returnable.ReturnType returnType) throws ParseException { + if(returnType.equals(Returnable.ReturnType.STRING) && token.getType().equals(Token.Type.STRING_VARIABLE)) return; + if(returnType.equals(Returnable.ReturnType.NUMBER) && token.getType().equals(Token.Type.NUMBER_VARIABLE)) return; + if(returnType.equals(Returnable.ReturnType.BOOLEAN) && token.getType().equals(Token.Type.BOOLEAN_VARIABLE)) return; + throw new ParseException("Type mismatch, cannot convert from " + returnType + " to " + token.getType() + ": " + token.getPosition()); + } + + /** + * Checks if token is a binary operator + * + * @param token Token to check + * @throws ParseException If token isn't a binary operator + */ + public static void checkBinaryOperator(Token token) throws ParseException { + if(!token.isBinaryOperator()) + throw new ParseException("Expected binary operator, found " + token.getType() + ": " + token.getPosition()); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index 18a62bf46..bf0d96b56 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -20,8 +20,12 @@ public class Tokenizer { } public boolean hasNext() { - //while(!reader.current().isEOF() && reader.current().isWhitespace()) reader.consume(); // Consume whitespace. - return !reader.current().isEOF(); + + int whiteEnd = 0; + + while(!reader.next(whiteEnd).isEOF() && reader.next(whiteEnd).isWhitespace()) whiteEnd++; // Consume whitespace. + + return !reader.next(whiteEnd).isEOF(); } public Token fetch() throws TokenizerException { @@ -125,7 +129,6 @@ public class Tokenizer { String tokenString = token.toString(); - return new Token(tokenString, keywords.contains(tokenString) ? Token.Type.KEYWORD : Token.Type.IDENTIFIER, new Position(reader.getLine(), reader.getIndex())); } @@ -143,11 +146,19 @@ public class Tokenizer { private void skipLine() { while(!reader.current().isEOF() && !reader.current().isNewLine()) reader.consume(); + consumeWhitespace(); + } + + private void consumeWhitespace() { + while(!reader.current().isEOF() && reader.current().isWhitespace()) reader.consume(); // Consume whitespace. } private void skipTo(String s) throws EOFException { while(!reader.current().isEOF()) { - if(reader.matches(s, true)) return; + if(reader.matches(s, true)) { + consumeWhitespace(); + return; + } reader.consume(); } throw new EOFException("No end of expression found."); diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 76de53504..72c01ec70 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,5 +1,5 @@ test("hello" + 3 + "gdfg", (2 * (3+1) * (2 * (1+1)))); - +// num testVar = 3.4; bool boolean = true; str stringVar = "hello!"; @@ -8,5 +8,11 @@ if(true && boolean) { num scopedVar = 2; test("fdsgdf" + 2 + stringVar, 1 + testVar + scopedVar); } +// comment + +/* +fsdfsd +*/ + +test("fdsgdf" + 2, 1 + testVar); -test("fdsgdf" + 2, 1 + testVar); \ No newline at end of file From 2ab4ed871c70b99b13943f5318e361dc501effb5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 22 Dec 2020 02:20:46 -0700 Subject: [PATCH 086/210] check if var/function is already defined in scope. --- .../dfsek/terra/api/structures/parser/Parser.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 069c6d5e1..bd7df451f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -255,9 +255,6 @@ public class Parser { if(tokens.isEmpty()) break; ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END, Token.Type.BLOCK_END); break; - case BLOCK_END: - tokens.remove(0); // Remove block end. - break main; case NUMBER_VARIABLE: case BOOLEAN_VARIABLE: case STRING_VARIABLE: @@ -269,11 +266,18 @@ public class Parser { else temp = parseVariableDeclaration(tokens, Returnable.ReturnType.BOOLEAN); Token name = tokens.get(1); - ParserUtil.checkType(name, Token.Type.IDENTIFIER); + ParserUtil.checkType(name, Token.Type.IDENTIFIER); // Name must be an identifier. + + if(functions.containsKey(name.getContent()) || parsedVariables.containsKey(name.getContent())) + throw new ParseException(name.getContent() + " is already defined in this scope: " + name.getPosition()); parsedVariables.put(name.getContent(), temp); parsedItems.add(parseAssignment(temp, tokens, parsedVariables)); ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END); + break; + case BLOCK_END: + tokens.remove(0); // Remove block end. + break main; } } return new Block(parsedItems, first.getPosition()); From 88da7969233089f122306f01c5810f989b87d280 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 22 Dec 2020 02:39:53 -0700 Subject: [PATCH 087/210] Implement variable reassignment and while loops --- .../terra/api/structures/parser/Parser.java | 22 +++++++--- .../parser/lang/keywords/WhileKeyword.java | 42 +++++++++++++++++++ .../api/structures/tokenizer/Tokenizer.java | 2 +- common/src/test/resources/test.tesf | 9 ++++ 4 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index bd7df451f..0471a5c90 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -11,6 +11,7 @@ import com.dfsek.terra.api.structures.parser.lang.constants.StringConstant; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword; +import com.dfsek.terra.api.structures.parser.lang.keywords.WhileKeyword; import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; import com.dfsek.terra.api.structures.parser.lang.operations.BooleanAndOperation; import com.dfsek.terra.api.structures.parser.lang.operations.BooleanNotOperation; @@ -47,7 +48,7 @@ import java.util.Set; public class Parser { private final String data; private final Map>> functions = new HashMap<>(); - private final Set keywords = Sets.newHashSet("if", "return", "var"); + private final Set keywords = Sets.newHashSet("if", "return", "while"); Set allowedArguments = Sets.newHashSet(Token.Type.STRING, Token.Type.NUMBER, Token.Type.IDENTIFIER); @@ -90,7 +91,7 @@ public class Parser { if(!keywords.contains(identifier.getContent())) throw new ParseException("No such keyword " + identifier.getContent() + ": " + identifier.getPosition()); Keyword k = null; - if(identifier.getContent().equals("if")) { + if(identifier.getContent().equals("if") || identifier.getContent().equals("while")) { ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); @@ -101,7 +102,10 @@ public class Parser { ParserUtil.checkType(tokens.remove(0), Token.Type.BLOCK_BEGIN); - k = new IfKeyword(parseBlock(tokens, variableMap), (Returnable) comparator, identifier.getPosition()); + if(identifier.getContent().equals("if")) + k = new IfKeyword(parseBlock(tokens, variableMap), (Returnable) comparator, identifier.getPosition()); // If statement + else + k = new WhileKeyword(parseBlock(tokens, variableMap), (Returnable) comparator, identifier.getPosition()); // While loop } return k; @@ -232,6 +236,7 @@ public class Parser { throw new UnsupportedOperationException("Unsupported variable type: " + type); } + @SuppressWarnings("unchecked") private Block parseBlock(List tokens, Map> superVars) throws ParseException { List> parsedItems = new GlueList<>(); @@ -251,7 +256,11 @@ public class Parser { ParserUtil.checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END); break; case IDENTIFIER: - parsedItems.add(parseFunction(tokens, true, parsedVariables)); + if(parsedVariables.containsKey(token.getContent())) { + Variable variable = parsedVariables.get(token.getContent()); + + parsedItems.add(parseAssignment(variable, tokens, parsedVariables)); + } else parsedItems.add(parseFunction(tokens, true, parsedVariables)); if(tokens.isEmpty()) break; ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END, Token.Type.BLOCK_END); break; @@ -272,6 +281,9 @@ public class Parser { throw new ParseException(name.getContent() + " is already defined in this scope: " + name.getPosition()); parsedVariables.put(name.getContent(), temp); + + ParserUtil.checkType(tokens.remove(0), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); + parsedItems.add(parseAssignment(temp, tokens, parsedVariables)); ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END); break; @@ -285,8 +297,6 @@ public class Parser { @SuppressWarnings("unchecked") private Assignment parseAssignment(Variable variable, List tokens, Map> variableMap) throws ParseException { - ParserUtil.checkType(tokens.remove(0), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); - Token name = tokens.get(0); ParserUtil.checkType(tokens.remove(0), Token.Type.IDENTIFIER); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java new file mode 100644 index 000000000..7706d1b4e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.api.structures.parser.lang.keywords; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.Keyword; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class WhileKeyword implements Keyword { + private final Block conditional; + private final Returnable statement; + private final Position position; + + public WhileKeyword(Block conditional, Returnable statement, Position position) { + this.conditional = conditional; + this.statement = statement; + this.position = position; + } + + @Override + public Void apply(Location location) { + while(statement.apply(location)) conditional.apply(location); + return null; + } + + @Override + public Void apply(Location location, Chunk chunk) { + while(statement.apply(location, chunk)) conditional.apply(location, chunk); + return null; + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index bf0d96b56..b8bfc7297 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -12,7 +12,7 @@ public class Tokenizer { private final Lookahead reader; private final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+', '-', '*', '/', '>', '<', '!'); // Reserved chars - private final Set keywords = Sets.newHashSet("if", "return", "num", "bool", "str"); + private final Set keywords = Sets.newHashSet("if", "while", "num", "bool", "str"); public Tokenizer(String data) { diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 72c01ec70..122c25a8e 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,9 +1,18 @@ test("hello" + 3 + "gdfg", (2 * (3+1) * (2 * (1+1)))); // + num testVar = 3.4; bool boolean = true; str stringVar = "hello!"; +num iterator = 0; + +while(iterator < 5) { + test("fdsgdf" + 2 + stringVar, iterator); + iterator = iterator + 1; +} + + if(true && boolean) { num scopedVar = 2; test("fdsgdf" + 2 + stringVar, 1 + testVar + scopedVar); From 72d437087878f281fae76192bc7ea52f1e0cb326 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 22 Dec 2020 02:58:42 -0700 Subject: [PATCH 088/210] fix various tokenizer issues --- .../terra/api/structures/parser/Parser.java | 2 +- .../api/structures/tokenizer/Tokenizer.java | 33 +++++++++++-------- .../src/test/java/structure/ParserTest.java | 2 ++ common/src/test/resources/test.tesf | 4 +++ 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 0471a5c90..5c5b2e1a3 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -165,7 +165,7 @@ public class Parser { private Returnable parseGroup(List tokens, Map> variableMap) throws ParseException { ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); - Returnable expression = parseExpression(tokens, true, variableMap); + Returnable expression = parseExpression(tokens, true, variableMap); // Parse inside of group as a separate expression ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_END); return expression; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index b8bfc7297..daa5204d7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -11,7 +11,7 @@ import java.util.Set; public class Tokenizer { private final Lookahead reader; - private final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+', '-', '*', '/', '>', '<', '!'); // Reserved chars + public static final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+', '-', '*', '/', '>', '<', '!'); // Reserved chars private final Set keywords = Sets.newHashSet("if", "while", "num", "bool", "str"); @@ -36,11 +36,6 @@ public class Tokenizer { if(reader.matches("/*", true)) skipTo("*/"); // Skip multi line comment - if(reader.matches("true", true)) - return new Token("true", Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); - if(reader.matches("false", true)) - return new Token("false", Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); - if(reader.matches("==", true)) return new Token("==", Token.Type.EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); @@ -60,13 +55,6 @@ public class Tokenizer { if(reader.matches("&&", true)) return new Token("&&", Token.Type.BOOLEAN_AND, new Position(reader.getLine(), reader.getIndex())); - if(reader.matches("num ", true)) - return new Token("num ", Token.Type.NUMBER_VARIABLE, new Position(reader.getLine(), reader.getIndex())); - if(reader.matches("str ", true)) - return new Token("str ", Token.Type.STRING_VARIABLE, new Position(reader.getLine(), reader.getIndex())); - if(reader.matches("bool ", true)) - return new Token("bool ", Token.Type.BOOLEAN_VARIABLE, new Position(reader.getLine(), reader.getIndex())); - if(isNumberStart()) { StringBuilder num = new StringBuilder(); @@ -129,7 +117,24 @@ public class Tokenizer { String tokenString = token.toString(); - return new Token(tokenString, keywords.contains(tokenString) ? Token.Type.KEYWORD : Token.Type.IDENTIFIER, new Position(reader.getLine(), reader.getIndex())); + if(tokenString.equals("true")) + return new Token(tokenString, Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); + if(tokenString.equals("false")) + return new Token(tokenString, Token.Type.BOOLEAN, new Position(reader.getLine(), reader.getIndex())); + + if(tokenString.equals("num")) + return new Token(tokenString, Token.Type.NUMBER_VARIABLE, new Position(reader.getLine(), reader.getIndex())); + if(tokenString.equals("str")) + return new Token(tokenString, Token.Type.STRING_VARIABLE, new Position(reader.getLine(), reader.getIndex())); + if(tokenString.equals("bool")) + return new Token(tokenString, Token.Type.BOOLEAN_VARIABLE, new Position(reader.getLine(), reader.getIndex())); + + if(tokenString.equals("if")) + return new Token(tokenString, Token.Type.KEYWORD, new Position(reader.getLine(), reader.getIndex())); + if(tokenString.equals("while")) + return new Token(tokenString, Token.Type.KEYWORD, new Position(reader.getLine(), reader.getIndex())); + + return new Token(tokenString, Token.Type.IDENTIFIER, new Position(reader.getLine(), reader.getIndex())); } private boolean isNumberLike() { diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index dadd2a9bd..15041883d 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -51,6 +51,8 @@ public class ParserTest { System.out.println("Took " + (double) t / 1000000); block.apply(null); + + block.apply(null); } private static class Test1 implements Function { diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 122c25a8e..fdc3805f3 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -5,6 +5,10 @@ num testVar = 3.4; bool boolean = true; str stringVar = "hello!"; +bool iftest = false; + +bool truetest = false; + num iterator = 0; while(iterator < 5) { From 9c1eab04b90ed8d89af2b08da942a8a2e583d7b8 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 22 Dec 2020 14:49:58 -0700 Subject: [PATCH 089/210] Cleanup & fix grouping related operator precedence issues --- .../terra/api/structures/parser/Parser.java | 99 +++++++++---------- .../terra/api/structures/tokenizer/Token.java | 20 +++- .../api/structures/tokenizer/Tokenizer.java | 4 +- common/src/test/resources/test.tesf | 4 +- 4 files changed, 64 insertions(+), 63 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 5c5b2e1a3..fcfd5b162 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.constants.BooleanConstant; +import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression; import com.dfsek.terra.api.structures.parser.lang.constants.NumericConstant; import com.dfsek.terra.api.structures.parser.lang.constants.StringConstant; import com.dfsek.terra.api.structures.parser.lang.functions.Function; @@ -38,19 +39,14 @@ import com.dfsek.terra.api.structures.tokenizer.Token; import com.dfsek.terra.api.structures.tokenizer.Tokenizer; import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; import com.dfsek.terra.api.util.GlueList; -import com.google.common.collect.Sets; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; public class Parser { private final String data; private final Map>> functions = new HashMap<>(); - private final Set keywords = Sets.newHashSet("if", "return", "while"); - - Set allowedArguments = Sets.newHashSet(Token.Type.STRING, Token.Type.NUMBER, Token.Type.IDENTIFIER); public Parser(String data) { this.data = data; @@ -87,63 +83,41 @@ public class Parser { private Keyword parseKeyword(List tokens, Map> variableMap) throws ParseException { Token identifier = tokens.remove(0); - ParserUtil.checkType(identifier, Token.Type.KEYWORD); - if(!keywords.contains(identifier.getContent())) - throw new ParseException("No such keyword " + identifier.getContent() + ": " + identifier.getPosition()); - Keyword k = null; - if(identifier.getContent().equals("if") || identifier.getContent().equals("while")) { + ParserUtil.checkType(identifier, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP); - ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); + ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); - Returnable comparator = parseExpression(tokens, true, variableMap); - ParserUtil.checkReturnType(comparator, Returnable.ReturnType.BOOLEAN); + Returnable comparator = parseExpression(tokens, true, variableMap); + ParserUtil.checkReturnType(comparator, Returnable.ReturnType.BOOLEAN); - ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_END); + ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_END); - ParserUtil.checkType(tokens.remove(0), Token.Type.BLOCK_BEGIN); + ParserUtil.checkType(tokens.remove(0), Token.Type.BLOCK_BEGIN); - if(identifier.getContent().equals("if")) - k = new IfKeyword(parseBlock(tokens, variableMap), (Returnable) comparator, identifier.getPosition()); // If statement - else - k = new WhileKeyword(parseBlock(tokens, variableMap), (Returnable) comparator, identifier.getPosition()); // While loop - - } - return k; + if(identifier.getType().equals(Token.Type.IF_STATEMENT)) + return new IfKeyword(parseBlock(tokens, variableMap), (Returnable) comparator, identifier.getPosition()); // If statement + else if(identifier.getType().equals(Token.Type.WHILE_LOOP)) + return new WhileKeyword(parseBlock(tokens, variableMap), (Returnable) comparator, identifier.getPosition()); // While loop + else throw new UnsupportedOperationException("Unknown keyword " + identifier.getContent() + ": " + identifier.getPosition()); } @SuppressWarnings("unchecked") private Returnable parseExpression(List tokens, boolean full, Map> variableMap) throws ParseException { - Token first = tokens.get(0); - - if(first.getType().equals(Token.Type.GROUP_BEGIN)) return parseGroup(tokens, variableMap); - - ParserUtil.checkType(first, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.BOOLEAN_NOT, Token.Type.GROUP_BEGIN); - - boolean not = false; - if(first.getType().equals(Token.Type.BOOLEAN_NOT)) { - not = true; + boolean booleanInverted = false; // Check for boolean not operator + if(tokens.get(0).getType().equals(Token.Type.BOOLEAN_NOT)) { + booleanInverted = true; tokens.remove(0); } Token id = tokens.get(0); + + ParserUtil.checkType(id, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.GROUP_BEGIN); + Returnable expression; if(id.isConstant()) { - Token constantToken = tokens.remove(0); - Position position = constantToken.getPosition(); - switch(constantToken.getType()) { - case NUMBER: - String content = constantToken.getContent(); - expression = new NumericConstant(content.contains(".") ? Double.parseDouble(content) : Integer.parseInt(content), position); - break; - case STRING: - expression = new StringConstant(constantToken.getContent(), position); - break; - case BOOLEAN: - expression = new BooleanConstant(Boolean.parseBoolean(constantToken.getContent()), position); - break; - default: - throw new UnsupportedOperationException("Unsupported constant token: " + constantToken.getType() + " at position: " + position); - } + expression = parseConstantExpression(tokens); + } else if(id.getType().equals(Token.Type.GROUP_BEGIN)) { // Parse grouped expression + expression = parseGroup(tokens, variableMap); } else { if(functions.containsKey(id.getContent())) expression = parseFunction(tokens, false, variableMap); else if(variableMap.containsKey(id.getContent())) { @@ -152,17 +126,33 @@ public class Parser { } else throw new ParseException("Unexpected token: " + id.getContent() + " at " + id.getPosition()); } - - if(not) { + if(booleanInverted) { // Invert operation if boolean not detected ParserUtil.checkReturnType(expression, Returnable.ReturnType.BOOLEAN); expression = new BooleanNotOperation((Returnable) expression, expression.getPosition()); } - if(full && tokens.get(0).isBinaryOperator()) { + + if(full && tokens.get(0).isBinaryOperator()) { // Parse binary operations return parseBinaryOperation(expression, tokens, variableMap); } return expression; } + private ConstantExpression parseConstantExpression(List tokens) { + Token constantToken = tokens.remove(0); + Position position = constantToken.getPosition(); + switch(constantToken.getType()) { + case NUMBER: + String content = constantToken.getContent(); + return new NumericConstant(content.contains(".") ? Double.parseDouble(content) : Integer.parseInt(content), position); + case STRING: + return new StringConstant(constantToken.getContent(), position); + case BOOLEAN: + return new BooleanConstant(Boolean.parseBoolean(constantToken.getContent()), position); + default: + throw new UnsupportedOperationException("Unsupported constant token: " + constantToken.getType() + " at position: " + position); + } + } + private Returnable parseGroup(List tokens, Map> variableMap) throws ParseException { ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); Returnable expression = parseExpression(tokens, true, variableMap); // Parse inside of group as a separate expression @@ -243,17 +233,18 @@ public class Parser { Map> parsedVariables = new HashMap<>(superVars); // New hashmap as to not mutate parent scope's declarations. Token first = tokens.get(0); + ParserUtil.checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE); - ParserUtil.checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE); main: while(tokens.size() > 0) { Token token = tokens.get(0); - ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE); + ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.BLOCK_END, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE); switch(token.getType()) { - case KEYWORD: + case IF_STATEMENT: + case WHILE_LOOP: parsedItems.add(parseKeyword(tokens, parsedVariables)); if(tokens.isEmpty()) break; - ParserUtil.checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.KEYWORD, Token.Type.BLOCK_END); + ParserUtil.checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.BLOCK_END); break; case IDENTIFIER: if(parsedVariables.containsKey(token.getContent())) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index ab1d9bea5..b85444e66 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -68,10 +68,6 @@ public class Token { */ IDENTIFIER, - /** - * Language keyword - */ - KEYWORD, /** * Numeric literal */ @@ -169,6 +165,20 @@ public class Token { */ NUMBER_VARIABLE, STRING_VARIABLE, - BOOLEAN_VARIABLE + BOOLEAN_VARIABLE, + + IF_STATEMENT, + WHILE_LOOP + } + + public enum Group { + KEYWORD(Type.IF_STATEMENT, Type.WHILE_LOOP, Type.BOOLEAN_VARIABLE, Type.STRING_VARIABLE, Type.NUMBER_VARIABLE), + IDENTIFIER(Type.IDENTIFIER), + BINARY_OPERATOR(Type.BOOLEAN_AND, Type.BOOLEAN_OR, Type.ADDITION_OPERATOR, Type.MULTIPLICATION_OPERATOR, Type.SUBTRACTION_OPERATOR, Type.DIVISION_OPERATOR, Type.GREATER_THAN_OPERATOR, Type.GREATER_THAN_OR_EQUALS_OPERATOR, Type.LESS_THAN_OPERATOR, Type.LESS_THAN_OR_EQUALS_OPERATOR, Type.EQUALS_OPERATOR, Type.NOT_EQUALS_OPERATOR); + private final Type[] types; + + Group(Type... types) { + this.types = types; + } } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index daa5204d7..37292f3a9 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -130,9 +130,9 @@ public class Tokenizer { return new Token(tokenString, Token.Type.BOOLEAN_VARIABLE, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("if")) - return new Token(tokenString, Token.Type.KEYWORD, new Position(reader.getLine(), reader.getIndex())); + return new Token(tokenString, Token.Type.IF_STATEMENT, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("while")) - return new Token(tokenString, Token.Type.KEYWORD, new Position(reader.getLine(), reader.getIndex())); + return new Token(tokenString, Token.Type.WHILE_LOOP, new Position(reader.getLine(), reader.getIndex())); return new Token(tokenString, Token.Type.IDENTIFIER, new Position(reader.getLine(), reader.getIndex())); } diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index fdc3805f3..a7ebcab75 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -17,9 +17,9 @@ while(iterator < 5) { } -if(true && boolean) { +if(true && !(boolean && false) && true) { num scopedVar = 2; - test("fdsgdf" + 2 + stringVar, 1 + testVar + scopedVar); + test("if statement" + 2 + stringVar, 1 + testVar + scopedVar); } // comment From e5d9ae62fa7075f32a13d6c64ab7991815cf9605 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 22 Dec 2020 15:13:01 -0700 Subject: [PATCH 090/210] more cleanup --- .../terra/api/structures/parser/Parser.java | 81 +++++++++---------- .../terra/api/structures/tokenizer/Token.java | 26 +++--- 2 files changed, 52 insertions(+), 55 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index fcfd5b162..700fe3523 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -57,6 +57,12 @@ public class Parser { return this; } + /** + * Parse input + * + * @return executable {@link Block} + * @throws ParseException If parsing fails. + */ public Block parse() throws ParseException { Tokenizer tokenizer = new Tokenizer(data); @@ -80,7 +86,7 @@ public class Parser { @SuppressWarnings("unchecked") - private Keyword parseKeyword(List tokens, Map> variableMap) throws ParseException { + private Keyword parseLoopLike(List tokens, Map> variableMap) throws ParseException { Token identifier = tokens.remove(0); ParserUtil.checkType(identifier, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP); @@ -178,8 +184,9 @@ public class Parser { @SuppressWarnings("unchecked") private BinaryOperation assemble(Returnable left, Returnable right, Token binaryOperator) throws ParseException { - if(binaryOperator.isStrictNumericOperator()) ParserUtil.checkArithmeticOperation(left, right, binaryOperator); - if(binaryOperator.isStrictBooleanOperator()) ParserUtil.checkBooleanOperation(left, right, binaryOperator); + if(binaryOperator.isStrictNumericOperator()) + ParserUtil.checkArithmeticOperation(left, right, binaryOperator); // Numeric type checking + if(binaryOperator.isStrictBooleanOperator()) ParserUtil.checkBooleanOperation(left, right, binaryOperator); // Boolean type checking switch(binaryOperator.getType()) { case ADDITION_OPERATOR: if(left.returnType().equals(Returnable.ReturnType.NUMBER) && right.returnType().equals(Returnable.ReturnType.NUMBER)) { @@ -226,62 +233,48 @@ public class Parser { throw new UnsupportedOperationException("Unsupported variable type: " + type); } - @SuppressWarnings("unchecked") private Block parseBlock(List tokens, Map> superVars) throws ParseException { List> parsedItems = new GlueList<>(); Map> parsedVariables = new HashMap<>(superVars); // New hashmap as to not mutate parent scope's declarations. Token first = tokens.get(0); - ParserUtil.checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE); - main: while(tokens.size() > 0) { Token token = tokens.get(0); - ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.BLOCK_END, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE); - switch(token.getType()) { - case IF_STATEMENT: - case WHILE_LOOP: - parsedItems.add(parseKeyword(tokens, parsedVariables)); - if(tokens.isEmpty()) break; - ParserUtil.checkType(tokens.get(0), Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.BLOCK_END); - break; - case IDENTIFIER: - if(parsedVariables.containsKey(token.getContent())) { - Variable variable = parsedVariables.get(token.getContent()); + if(token.getType().equals(Token.Type.BLOCK_END)) break; // Stop parsing at block end. - parsedItems.add(parseAssignment(variable, tokens, parsedVariables)); - } else parsedItems.add(parseFunction(tokens, true, parsedVariables)); - if(tokens.isEmpty()) break; - ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END, Token.Type.BLOCK_END); - break; - case NUMBER_VARIABLE: - case BOOLEAN_VARIABLE: - case STRING_VARIABLE: - Variable temp; - if(token.getType().equals(Token.Type.NUMBER_VARIABLE)) - temp = parseVariableDeclaration(tokens, Returnable.ReturnType.NUMBER); - else if(token.getType().equals(Token.Type.STRING_VARIABLE)) - temp = parseVariableDeclaration(tokens, Returnable.ReturnType.STRING); - else temp = parseVariableDeclaration(tokens, Returnable.ReturnType.BOOLEAN); - Token name = tokens.get(1); + ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE); - ParserUtil.checkType(name, Token.Type.IDENTIFIER); // Name must be an identifier. + if(token.isLoopLike()) { // Parse loop-like tokens (if, while, etc) + parsedItems.add(parseLoopLike(tokens, parsedVariables)); + } else if(token.isIdentifier()) { // Parse identifiers + if(parsedVariables.containsKey(token.getContent())) { // Assume variable assignment + Variable variable = parsedVariables.get(token.getContent()); + parsedItems.add(parseAssignment(variable, tokens, parsedVariables)); + } else parsedItems.add(parseFunction(tokens, true, parsedVariables)); + } else if(token.isVariableDeclaration()) { + Variable temp; + if(token.getType().equals(Token.Type.NUMBER_VARIABLE)) + temp = parseVariableDeclaration(tokens, Returnable.ReturnType.NUMBER); + else if(token.getType().equals(Token.Type.STRING_VARIABLE)) + temp = parseVariableDeclaration(tokens, Returnable.ReturnType.STRING); + else temp = parseVariableDeclaration(tokens, Returnable.ReturnType.BOOLEAN); + Token name = tokens.get(1); - if(functions.containsKey(name.getContent()) || parsedVariables.containsKey(name.getContent())) - throw new ParseException(name.getContent() + " is already defined in this scope: " + name.getPosition()); + ParserUtil.checkType(name, Token.Type.IDENTIFIER); // Name must be an identifier. - parsedVariables.put(name.getContent(), temp); + if(functions.containsKey(name.getContent()) || parsedVariables.containsKey(name.getContent())) + throw new ParseException(name.getContent() + " is already defined in this scope: " + name.getPosition()); - ParserUtil.checkType(tokens.remove(0), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); + parsedVariables.put(name.getContent(), temp); - parsedItems.add(parseAssignment(temp, tokens, parsedVariables)); - ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END); - break; - case BLOCK_END: - tokens.remove(0); // Remove block end. - break main; - } + ParserUtil.checkType(tokens.remove(0), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); + + parsedItems.add(parseAssignment(temp, tokens, parsedVariables)); + } else throw new UnsupportedOperationException("Unexpected token " + token.getType() + ": " + token.getPosition()); + + if(!tokens.isEmpty()) ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END, Token.Type.BLOCK_END); } return new Block(parsedItems, first.getPosition()); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index b85444e66..1dc40f179 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -62,6 +62,21 @@ public class Token { || type.equals(Type.BOOLEAN_OR); } + public boolean isVariableDeclaration() { + return type.equals(Type.STRING_VARIABLE) + || type.equals(Type.BOOLEAN_VARIABLE) + || type.equals(Type.NUMBER_VARIABLE); + } + + public boolean isLoopLike() { + return type.equals(Type.IF_STATEMENT) + || type.equals(Type.WHILE_LOOP); + } + + public boolean isIdentifier() { + return type.equals(Type.IDENTIFIER); + } + public enum Type { /** * Function identifier or language keyword @@ -170,15 +185,4 @@ public class Token { IF_STATEMENT, WHILE_LOOP } - - public enum Group { - KEYWORD(Type.IF_STATEMENT, Type.WHILE_LOOP, Type.BOOLEAN_VARIABLE, Type.STRING_VARIABLE, Type.NUMBER_VARIABLE), - IDENTIFIER(Type.IDENTIFIER), - BINARY_OPERATOR(Type.BOOLEAN_AND, Type.BOOLEAN_OR, Type.ADDITION_OPERATOR, Type.MULTIPLICATION_OPERATOR, Type.SUBTRACTION_OPERATOR, Type.DIVISION_OPERATOR, Type.GREATER_THAN_OPERATOR, Type.GREATER_THAN_OR_EQUALS_OPERATOR, Type.LESS_THAN_OPERATOR, Type.LESS_THAN_OR_EQUALS_OPERATOR, Type.EQUALS_OPERATOR, Type.NOT_EQUALS_OPERATOR); - private final Type[] types; - - Group(Type... types) { - this.types = types; - } - } } From f47b975fe70825fbe340fd7c924f9ebbf3a38ce7 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 22 Dec 2020 17:32:17 -0700 Subject: [PATCH 091/210] implement block & check functions --- .../script/builders/BlockFunctionBuilder.java | 43 +++++++++++++++++++ .../script/builders/CheckFunctionBuilder.java | 41 ++++++++++++++++++ .../script/functions/BlockFunction.java | 9 ++-- .../script/functions/CheckFunction.java | 8 ++-- common/src/test/resources/test.tesf | 3 +- .../structure/load/LoadRawCommand.java | 10 +++++ 6 files changed, 105 insertions(+), 9 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckFunctionBuilder.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java new file mode 100644 index 000000000..8997bd937 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java @@ -0,0 +1,43 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.functions.BlockFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class BlockFunctionBuilder implements FunctionBuilder { + private final TerraPlugin main; + + public BlockFunctionBuilder(TerraPlugin main) { + this.main = main; + } + + @SuppressWarnings("unchecked") + @Override + public BlockFunction build(List> argumentList, Position position) throws ParseException { + return new BlockFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position); + } + + @Override + public int argNumber() { + return 4; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + switch(position) { + case 0: + case 1: + case 2: + return Returnable.ReturnType.NUMBER; + case 3: + return Returnable.ReturnType.STRING; + default: + return null; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckFunctionBuilder.java new file mode 100644 index 000000000..d5e1ce757 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckFunctionBuilder.java @@ -0,0 +1,41 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.functions.CheckFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class CheckFunctionBuilder implements FunctionBuilder { + private final TerraPlugin main; + + public CheckFunctionBuilder(TerraPlugin main) { + this.main = main; + } + + @SuppressWarnings("unchecked") + @Override + public CheckFunction build(List> argumentList, Position position) throws ParseException { + return new CheckFunction(main, (Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), position); + } + + @Override + public int argNumber() { + return 3; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + switch(position) { + case 0: + case 1: + case 2: + return Returnable.ReturnType.NUMBER; + default: + return null; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index f207eff2e..64747263d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression; import com.dfsek.terra.api.structures.parser.lang.functions.Function; @@ -11,12 +12,12 @@ import com.dfsek.terra.api.structures.tokenizer.Position; public class BlockFunction implements Function { private final BlockData data; - private final Returnable x, y, z; + private final Returnable x, y, z; private final Position position; - public BlockFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) { + public BlockFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) throws ParseException { this.position = position; - if(!(data instanceof ConstantExpression)) throw new IllegalArgumentException("Block data must be constant."); + if(!(data instanceof ConstantExpression)) throw new ParseException("Block data must be constant."); this.data = main.getWorldHandle().createBlockData(((ConstantExpression) data).getConstant()); this.x = x; @@ -31,7 +32,7 @@ public class BlockFunction implements Function { @Override public Void apply(Location location) { - location.clone().add(x.apply(location), y.apply(location), z.apply(location)).getBlock().setBlockData(data, false); + location.clone().add(x.apply(location).intValue(), y.apply(location).intValue(), z.apply(location).intValue()).getBlock().setBlockData(data, false); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index b05ac4f98..01b46f437 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -13,10 +13,10 @@ import com.dfsek.terra.api.structures.world.OceanCheck; public class CheckFunction implements Function { private final TerraPlugin main; - private final Returnable x, y, z; + private final Returnable x, y, z; private final Position position; - public CheckFunction(TerraPlugin main, Returnable x, Returnable y, Returnable z, Position position) { + public CheckFunction(TerraPlugin main, Returnable x, Returnable y, Returnable z, Position position) { this.main = main; this.x = x; this.y = y; @@ -30,8 +30,8 @@ public class CheckFunction implements Function { } private Vector3 getVector(Location location, Chunk chunk) { - return chunk == null ? new Vector3(x.apply(location) + location.getBlockX(), y.apply(location) + location.getBlockY(), z.apply(location) + location.getBlockZ()) - : new Vector3(x.apply(location, chunk) + location.getBlockX(), y.apply(location, chunk) + location.getBlockY(), z.apply(location, chunk) + location.getBlockZ()); + return location.clone().add(chunk == null ? new Vector3(x.apply(location).intValue(), y.apply(location).intValue(), z.apply(location).intValue()) + : new Vector3(x.apply(location, chunk).intValue(), y.apply(location, chunk).intValue(), z.apply(location, chunk).intValue())).toVector(); } @Override diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index a7ebcab75..1e8bed1c2 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,4 +1,4 @@ -test("hello" + 3 + "gdfg", (2 * (3+1) * (2 * (1+1)))); +test("minecraft:green_w" + "ool", (2 * (3+1) * (2 * (1+1)))); // num testVar = 3.4; @@ -18,6 +18,7 @@ while(iterator < 5) { if(true && !(boolean && false) && true) { +test(0,-1,0, "minecraft:green_w" + "ool"); num scopedVar = 2; test("if statement" + 2 + stringVar, 1 + testVar + scopedVar); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index 5add94894..299078dd3 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -4,6 +4,8 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; import org.apache.commons.io.IOUtils; @@ -37,7 +39,15 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { try { Parser parser = new Parser(IOUtils.toString(new FileInputStream(new File(getMain().getDataFolder(), "test.tesf")))); + parser.addFunction("block", new BlockFunctionBuilder(getMain())) + .addFunction("check", new CheckFunctionBuilder(getMain())); + + System.out.println("Parsing..."); + Block main = parser.parse(); + + System.out.println("Done parsing"); + main.apply(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ())); } catch(IOException | ParseException e) { From 66e8647517d1f3ef7d96e59270c3c4ff36273b7a Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 22 Dec 2020 20:11:01 -0700 Subject: [PATCH 092/210] rework loaders to allow traversing filenames --- .../dfsek/terra/config/files/FolderLoader.java | 2 +- .../com/dfsek/terra/config/files/Loader.java | 16 ++++++++++++---- .../com/dfsek/terra/config/files/ZIPLoader.java | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/config/files/FolderLoader.java b/common/src/main/java/com/dfsek/terra/config/files/FolderLoader.java index 12c73eb39..6bf93f044 100644 --- a/common/src/main/java/com/dfsek/terra/config/files/FolderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/files/FolderLoader.java @@ -31,7 +31,7 @@ public class FolderLoader extends Loader { try(Stream paths = Files.walk(newPath.toPath())) { paths.filter(Files::isRegularFile).filter(file -> file.toString().toLowerCase().endsWith(".yml")).forEach(file -> { try { - streams.add(new FileInputStream(file.toFile())); + streams.put(newPath.toURI().relativize(file.toUri()).getPath(), new FileInputStream(file.toFile())); } catch(FileNotFoundException e) { e.printStackTrace(); } diff --git a/common/src/main/java/com/dfsek/terra/config/files/Loader.java b/common/src/main/java/com/dfsek/terra/config/files/Loader.java index 4d7257208..6829c0549 100644 --- a/common/src/main/java/com/dfsek/terra/config/files/Loader.java +++ b/common/src/main/java/com/dfsek/terra/config/files/Loader.java @@ -1,14 +1,17 @@ package com.dfsek.terra.config.files; import com.dfsek.tectonic.exception.ConfigException; +import com.dfsek.terra.api.util.GlueList; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.function.Consumer; public abstract class Loader { - protected final List streams = new ArrayList<>(); + protected final Map streams = new HashMap<>(); /** * Do something with the InputStreams. @@ -16,7 +19,12 @@ public abstract class Loader { * @param consumer Something to do with the streams. */ public Loader then(ExceptionalConsumer> consumer) throws ConfigException { - consumer.accept(streams); + consumer.accept(new GlueList<>(streams.values())); + return this; + } + + public Loader thenNames(Consumer> consumer) throws ConfigException { + consumer.accept(new GlueList<>(streams.keySet())); return this; } @@ -45,7 +53,7 @@ public abstract class Loader { * Close all InputStreams opened. */ public Loader close() { - streams.forEach(input -> { + streams.forEach((name, input) -> { try { input.close(); } catch(IOException e) { diff --git a/common/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java b/common/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java index 85da05f98..e0a72f71c 100644 --- a/common/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java @@ -30,7 +30,7 @@ public class ZIPLoader extends Loader { ZipEntry entry = entries.nextElement(); if(!entry.isDirectory() && entry.getName().startsWith(directory) && entry.getName().endsWith(".yml")) { try { - streams.add(file.getInputStream(entry)); + streams.put(entry.getName(), file.getInputStream(entry)); } catch(IOException e) { e.printStackTrace(); } From 062c9b5efbca3db7f1eb33cdfd3a77915ae3dc07 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 22 Dec 2020 22:41:51 -0700 Subject: [PATCH 093/210] Pass rotation to Item#apply --- .../terra/api/structures/parser/lang/Block.java | 9 +++++---- .../terra/api/structures/parser/lang/Item.java | 5 +++-- .../parser/lang/constants/ConstantExpression.java | 5 +++-- .../parser/lang/keywords/IfKeyword.java | 9 +++++---- .../parser/lang/keywords/ReturnKeyword.java | 5 +++-- .../parser/lang/keywords/WhileKeyword.java | 9 +++++---- .../parser/lang/operations/BinaryOperation.java | 9 +++++---- .../parser/lang/operations/UnaryOperation.java | 9 +++++---- .../parser/lang/variables/Assignment.java | 9 +++++---- .../structures/parser/lang/variables/Getter.java | 5 +++-- .../script/functions/BlockFunction.java | 7 ++++--- .../script/functions/CheckFunction.java | 15 ++++++++------- .../com/dfsek/terra/config/base/ConfigPack.java | 1 + .../java/com/dfsek/terra/config/files/Loader.java | 7 ++++++- common/src/test/java/structure/ParserTest.java | 11 ++++++----- .../command/structure/load/LoadRawCommand.java | 3 ++- 16 files changed, 69 insertions(+), 49 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index 62c019f80..7321156d6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -3,6 +3,7 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.structure.Rotation; import java.util.List; @@ -20,14 +21,14 @@ public class Block implements Item { } @Override - public Void apply(Location location) { - items.forEach(item -> item.apply(location)); + public Void apply(Location location, Rotation rotation) { + items.forEach(item -> item.apply(location, rotation)); return null; } @Override - public Void apply(Location location, Chunk chunk) { - items.forEach(item -> item.apply(location, chunk)); + public Void apply(Location location, Chunk chunk, Rotation rotation) { + items.forEach(item -> item.apply(location, chunk, rotation)); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java index abe1a2a30..8cee610ab 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java @@ -3,11 +3,12 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.structure.Rotation; public interface Item { - T apply(Location location); + T apply(Location location, Rotation rotation); - T apply(Location location, Chunk chunk); + T apply(Location location, Chunk chunk, Rotation rotation); Position getPosition(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java index 621825685..6aae85bb7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.structure.Rotation; public abstract class ConstantExpression implements Returnable { private final T constant; @@ -15,13 +16,13 @@ public abstract class ConstantExpression implements Returnable { } @Override - public T apply(Location location) { + public T apply(Location location, Rotation rotation) { return constant; } @Override - public T apply(Location location, Chunk chunk) { + public T apply(Location location, Chunk chunk, Rotation rotation) { return constant; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java index 3168f4824..909e3821a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.structure.Rotation; public class IfKeyword implements Keyword { private final Block conditional; @@ -19,14 +20,14 @@ public class IfKeyword implements Keyword { } @Override - public Void apply(Location location) { - if(statement.apply(location)) conditional.apply(location); + public Void apply(Location location, Rotation rotation) { + if(statement.apply(location, rotation)) conditional.apply(location, rotation); return null; } @Override - public Void apply(Location location, Chunk chunk) { - if(statement.apply(location, chunk)) conditional.apply(location, chunk); + public Void apply(Location location, Chunk chunk, Rotation rotation) { + if(statement.apply(location, chunk, rotation)) conditional.apply(location, chunk, rotation); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java index 7a85fcd2f..7dfec4988 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.structure.Rotation; public class ReturnKeyword implements Keyword { private final Position position; @@ -13,12 +14,12 @@ public class ReturnKeyword implements Keyword { } @Override - public Void apply(Location location) { + public Void apply(Location location, Rotation rotation) { return null; } @Override - public Void apply(Location location, Chunk chunk) { + public Void apply(Location location, Chunk chunk, Rotation rotation) { return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java index 7706d1b4e..f37a6fb4c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.structure.Rotation; public class WhileKeyword implements Keyword { private final Block conditional; @@ -19,14 +20,14 @@ public class WhileKeyword implements Keyword { } @Override - public Void apply(Location location) { - while(statement.apply(location)) conditional.apply(location); + public Void apply(Location location, Rotation rotation) { + while(statement.apply(location, rotation)) conditional.apply(location, rotation); return null; } @Override - public Void apply(Location location, Chunk chunk) { - while(statement.apply(location, chunk)) conditional.apply(location, chunk); + public Void apply(Location location, Chunk chunk, Rotation rotation) { + while(statement.apply(location, chunk, rotation)) conditional.apply(location, chunk, rotation); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java index dc583d20e..6cb4047c4 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.structure.Rotation; public abstract class BinaryOperation implements Returnable { private final Returnable left; @@ -24,12 +25,12 @@ public abstract class BinaryOperation implements Returnable { } @Override - public O apply(Location location) { - return apply(left.apply(location), right.apply(location)); + public O apply(Location location, Rotation rotation) { + return apply(left.apply(location, rotation), right.apply(location, rotation)); } @Override - public O apply(Location location, Chunk chunk) { - return apply(left.apply(location, chunk), right.apply(location, chunk)); + public O apply(Location location, Chunk chunk, Rotation rotation) { + return apply(left.apply(location, chunk, rotation), right.apply(location, chunk, rotation)); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java index bc1e1e902..68406fbc8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.structure.Rotation; public abstract class UnaryOperation implements Returnable { private final Returnable input; @@ -17,13 +18,13 @@ public abstract class UnaryOperation implements Returnable { public abstract T apply(T input); @Override - public T apply(Location location) { - return apply(input.apply(location)); + public T apply(Location location, Rotation rotation) { + return apply(input.apply(location, rotation)); } @Override - public T apply(Location location, Chunk chunk) { - return apply(input.apply(location, chunk)); + public T apply(Location location, Chunk chunk, Rotation rotation) { + return apply(input.apply(location, chunk, rotation)); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java index 08f71a834..fdf6a5e76 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.structure.Rotation; public class Assignment implements Item { private final Variable delegate; @@ -18,15 +19,15 @@ public class Assignment implements Item { } @Override - public T apply(Location location) { - T val = value.apply(location); + public T apply(Location location, Rotation rotation) { + T val = value.apply(location, rotation); delegate.setValue(val); return val; } @Override - public T apply(Location location, Chunk chunk) { - T val = value.apply(location, chunk); + public T apply(Location location, Chunk chunk, Rotation rotation) { + T val = value.apply(location, chunk, rotation); delegate.setValue(val); return val; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java index b7fe3eedd..7b2b83600 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.structure.Rotation; public class Getter implements Returnable { private final Variable delegate; @@ -18,12 +19,12 @@ public class Getter implements Returnable { } @Override - public Object apply(Location location) { + public Object apply(Location location, Rotation rotation) { return delegate.getValue(); } @Override - public Object apply(Location location, Chunk chunk) { + public Object apply(Location location, Chunk chunk, Rotation rotation) { return delegate.getValue(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index 64747263d..58cb7ee8d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.structure.Rotation; public class BlockFunction implements Function { private final BlockData data; @@ -31,13 +32,13 @@ public class BlockFunction implements Function { } @Override - public Void apply(Location location) { - location.clone().add(x.apply(location).intValue(), y.apply(location).intValue(), z.apply(location).intValue()).getBlock().setBlockData(data, false); + public Void apply(Location location, Rotation rotation) { + location.clone().add(x.apply(location, rotation).intValue(), y.apply(location, rotation).intValue(), z.apply(location, rotation).intValue()).getBlock().setBlockData(data, false); return null; } @Override - public Void apply(Location location, Chunk chunk) { + public Void apply(Location location, Chunk chunk, Rotation rotation) { //TODO: do return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index 01b46f437..e854cb356 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -10,6 +10,7 @@ import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.world.LandCheck; import com.dfsek.terra.api.structures.world.OceanCheck; +import com.dfsek.terra.structure.Rotation; public class CheckFunction implements Function { private final TerraPlugin main; @@ -29,14 +30,14 @@ public class CheckFunction implements Function { return "check"; } - private Vector3 getVector(Location location, Chunk chunk) { - return location.clone().add(chunk == null ? new Vector3(x.apply(location).intValue(), y.apply(location).intValue(), z.apply(location).intValue()) - : new Vector3(x.apply(location, chunk).intValue(), y.apply(location, chunk).intValue(), z.apply(location, chunk).intValue())).toVector(); + private Vector3 getVector(Location location, Chunk chunk, Rotation rotation) { + return location.clone().add(chunk == null ? new Vector3(x.apply(location, rotation).intValue(), y.apply(location, rotation).intValue(), z.apply(location, rotation).intValue()) + : new Vector3(x.apply(location, chunk, rotation).intValue(), y.apply(location, chunk, rotation).intValue(), z.apply(location, chunk, rotation).intValue())).toVector(); } @Override - public String apply(Location location) { - return apply(getVector(location, null), location.getWorld()); + public String apply(Location location, Rotation rotation) { + return apply(getVector(location, null, rotation), location.getWorld()); } private String apply(Vector3 vector, World world) { @@ -48,8 +49,8 @@ public class CheckFunction implements Function { } @Override - public String apply(Location location, Chunk chunk) { - return apply(getVector(location, chunk), location.getWorld()); + public String apply(Location location, Chunk chunk, Rotation rotation) { + return apply(getVector(location, chunk, rotation), location.getWorld()); } @Override diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 51a55a721..c236c52a0 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -142,6 +142,7 @@ public class ConfigPack implements LoaderRegistrar { .registerLoader(LootTable.class, new LootTableLoader(loader, main)); // These loaders need access to the Loader instance to get files. loader .open("palettes").then(streams -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.load(streams, PaletteTemplate::new), main)).close() + .open("palettes").thenNames(names -> names.forEach(System.out::println)).close() .open("ores").then(streams -> buildAll(new OreFactory(), oreRegistry, abstractConfigLoader.load(streams, OreTemplate::new), main)).close() .open("flora").then(streams -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.load(streams, FloraTemplate::new), main)).close() .open("carving").then(streams -> buildAll(new CarverFactory(this), carverRegistry, abstractConfigLoader.load(streams, CarverTemplate::new), main)).close() diff --git a/common/src/main/java/com/dfsek/terra/config/files/Loader.java b/common/src/main/java/com/dfsek/terra/config/files/Loader.java index 6829c0549..6150d4b32 100644 --- a/common/src/main/java/com/dfsek/terra/config/files/Loader.java +++ b/common/src/main/java/com/dfsek/terra/config/files/Loader.java @@ -23,8 +23,13 @@ public abstract class Loader { return this; } - public Loader thenNames(Consumer> consumer) throws ConfigException { + public Loader thenNames(Consumer> consumer) { consumer.accept(new GlueList<>(streams.keySet())); + System.out.println("names ^ "); + streams.forEach((name, stream) -> { + System.out.println(name); + }); + System.out.println("names ^ "); return this; } diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 15041883d..46af40f24 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.structure.Rotation; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; @@ -50,9 +51,9 @@ public class ParserTest { long t = System.nanoTime() - l; System.out.println("Took " + (double) t / 1000000); - block.apply(null); + block.apply(null, Rotation.NONE); - block.apply(null); + block.apply(null, Rotation.NONE); } private static class Test1 implements Function { @@ -67,13 +68,13 @@ public class ParserTest { } @Override - public Void apply(Location location) { - System.out.println("string: " + a.apply(location) + ", double: " + b.apply(location)); + public Void apply(Location location, Rotation rotation) { + System.out.println("string: " + a.apply(location, rotation) + ", double: " + b.apply(location, rotation)); return null; } @Override - public Void apply(Location location, Chunk chunk) { + public Void apply(Location location, Chunk chunk, Rotation rotation) { return null; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index 299078dd3..13d4e1168 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -8,6 +8,7 @@ import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; +import com.dfsek.terra.structure.Rotation; import org.apache.commons.io.IOUtils; import org.bukkit.block.Sign; import org.bukkit.command.Command; @@ -48,7 +49,7 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { System.out.println("Done parsing"); - main.apply(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ())); + main.apply(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), Rotation.NONE); } catch(IOException | ParseException e) { e.printStackTrace(); From 1158ae958afeb8768cef934f5a32b48687584d10 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 22 Dec 2020 22:48:31 -0700 Subject: [PATCH 094/210] refactor rotations, reimplement RotationUtil --- .../terra/api/structures/parser/lang/Block.java | 2 +- .../terra/api/structures/parser/lang/Item.java | 2 +- .../lang/constants/ConstantExpression.java | 2 +- .../parser/lang/keywords/IfKeyword.java | 2 +- .../parser/lang/keywords/ReturnKeyword.java | 2 +- .../parser/lang/keywords/WhileKeyword.java | 2 +- .../parser/lang/operations/BinaryOperation.java | 2 +- .../parser/lang/operations/UnaryOperation.java | 2 +- .../parser/lang/variables/Assignment.java | 2 +- .../parser/lang/variables/Getter.java | 2 +- .../script/functions/BlockFunction.java | 2 +- .../script/functions/CheckFunction.java | 2 +- .../structures}/structure/Rotation.java | 2 +- .../api/structures}/structure/RotationUtil.java | 17 +++++------------ common/src/test/java/structure/ParserTest.java | 2 +- .../command/structure/load/LoadRawCommand.java | 2 +- 16 files changed, 20 insertions(+), 27 deletions(-) rename common/src/main/java/com/dfsek/terra/{ => api/structures}/structure/Rotation.java (95%) rename {platforms/bukkit/src/main/java/com/dfsek/terra/bukkit => common/src/main/java/com/dfsek/terra/api/structures}/structure/RotationUtil.java (96%) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index 7321156d6..9c6177d10 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -2,8 +2,8 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.structure.Rotation; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java index 8cee610ab..7cc895eaf 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java @@ -2,8 +2,8 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.structure.Rotation; public interface Item { T apply(Location location, Rotation rotation); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java index 6aae85bb7..05b276897 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java @@ -3,8 +3,8 @@ package com.dfsek.terra.api.structures.parser.lang.constants; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.structure.Rotation; public abstract class ConstantExpression implements Returnable { private final T constant; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java index 909e3821a..ce6e541b1 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java @@ -5,8 +5,8 @@ import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.structure.Rotation; public class IfKeyword implements Keyword { private final Block conditional; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java index 7dfec4988..c257c660b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java @@ -3,8 +3,8 @@ package com.dfsek.terra.api.structures.parser.lang.keywords; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Keyword; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.structure.Rotation; public class ReturnKeyword implements Keyword { private final Position position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java index f37a6fb4c..9f4c6fd80 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java @@ -5,8 +5,8 @@ import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.structure.Rotation; public class WhileKeyword implements Keyword { private final Block conditional; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java index 6cb4047c4..ef5642cd5 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java @@ -3,8 +3,8 @@ package com.dfsek.terra.api.structures.parser.lang.operations; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.structure.Rotation; public abstract class BinaryOperation implements Returnable { private final Returnable left; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java index 68406fbc8..68e588cd0 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java @@ -3,8 +3,8 @@ package com.dfsek.terra.api.structures.parser.lang.operations; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.structure.Rotation; public abstract class UnaryOperation implements Returnable { private final Returnable input; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java index fdf6a5e76..c18988e5b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java @@ -4,8 +4,8 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.structure.Rotation; public class Assignment implements Item { private final Variable delegate; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java index 7b2b83600..f8922b840 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java @@ -3,8 +3,8 @@ package com.dfsek.terra.api.structures.parser.lang.variables; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.structure.Rotation; public class Getter implements Returnable { private final Variable delegate; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index 58cb7ee8d..cc4e01761 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -8,8 +8,8 @@ import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression; import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.structure.Rotation; public class BlockFunction implements Function { private final BlockData data; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index e854cb356..952fb0db8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -7,10 +7,10 @@ import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.world.LandCheck; import com.dfsek.terra.api.structures.world.OceanCheck; -import com.dfsek.terra.structure.Rotation; public class CheckFunction implements Function { private final TerraPlugin main; diff --git a/common/src/main/java/com/dfsek/terra/structure/Rotation.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/Rotation.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/structure/Rotation.java rename to common/src/main/java/com/dfsek/terra/api/structures/structure/Rotation.java index 63d910b03..8efbff230 100644 --- a/common/src/main/java/com/dfsek/terra/structure/Rotation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/Rotation.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.structure; +package com.dfsek.terra.api.structures.structure; import net.jafama.FastMath; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/RotationUtil.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/RotationUtil.java similarity index 96% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/RotationUtil.java rename to common/src/main/java/com/dfsek/terra/api/structures/structure/RotationUtil.java index 1df7921a9..b819b35ee 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/structure/RotationUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/RotationUtil.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.structure; +package com.dfsek.terra.api.structures.structure; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.block.Axis; @@ -11,15 +11,16 @@ import com.dfsek.terra.api.platform.block.data.Rail; import com.dfsek.terra.api.platform.block.data.RedstoneWire; import com.dfsek.terra.api.platform.block.data.Rotatable; import com.dfsek.terra.api.platform.block.data.Wall; -import com.dfsek.terra.structure.Rotation; +import com.google.common.collect.Sets; import net.jafama.FastMath; import java.util.EnumMap; -import java.util.HashSet; import java.util.Map; import java.util.Set; -public final class RotationUtil { +public class RotationUtil { + private static final Set CARDINALS = Sets.newHashSet(BlockFace.NORTH, BlockFace.SOUTH, BlockFace.EAST, BlockFace.WEST); + /** * Rotate and mirror a coordinate pair. * @@ -247,14 +248,6 @@ public final class RotationUtil { return orig; } - private static final Set CARDINALS = new HashSet<>(); - static { - CARDINALS.add(BlockFace.NORTH); - CARDINALS.add(BlockFace.SOUTH); - CARDINALS.add(BlockFace.EAST); - CARDINALS.add(BlockFace.WEST); - } - public static void rotateBlockData(BlockData data, Rotation r) { if(data instanceof Rotatable) { BlockFace rt = getRotatedFace(((Rotatable) data).getRotation(), r); diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 46af40f24..4361f3083 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -8,8 +8,8 @@ import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.structure.Rotation; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index 13d4e1168..f47a5f575 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -6,9 +6,9 @@ import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; -import com.dfsek.terra.structure.Rotation; import org.apache.commons.io.IOUtils; import org.bukkit.block.Sign; import org.bukkit.command.Command; From b4342a36aa067a06b58bd70a18784e050ea4896e Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 23 Dec 2020 01:37:51 -0700 Subject: [PATCH 095/210] implement break, return, and continue --- .../terra/api/structures/parser/Parser.java | 10 ++++-- .../api/structures/parser/lang/Block.java | 31 ++++++++++++---- .../parser/lang/keywords/BreakKeyword.java | 36 +++++++++++++++++++ .../parser/lang/keywords/ContinueKeyword.java | 36 +++++++++++++++++++ .../parser/lang/keywords/IfKeyword.java | 14 ++++---- .../parser/lang/keywords/ReturnKeyword.java | 11 +++--- .../parser/lang/keywords/WhileKeyword.java | 22 ++++++++---- .../script/functions/BlockFunction.java | 9 ++++- .../script/functions/CheckFunction.java | 12 +++++-- .../structures/structure/RotationUtil.java | 6 ++-- .../terra/api/structures/tokenizer/Token.java | 6 +++- .../api/structures/tokenizer/Tokenizer.java | 17 ++++++--- .../generation/items/tree/TerraTree.java | 2 +- .../terra/population/StructurePopulator.java | 2 +- common/src/test/resources/test.tesf | 7 ++-- .../structure/load/LoadRawCommand.java | 3 +- 16 files changed, 179 insertions(+), 45 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 700fe3523..881031431 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -11,7 +11,10 @@ import com.dfsek.terra.api.structures.parser.lang.constants.NumericConstant; import com.dfsek.terra.api.structures.parser.lang.constants.StringConstant; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.parser.lang.keywords.BreakKeyword; +import com.dfsek.terra.api.structures.parser.lang.keywords.ContinueKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword; +import com.dfsek.terra.api.structures.parser.lang.keywords.ReturnKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.WhileKeyword; import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; import com.dfsek.terra.api.structures.parser.lang.operations.BooleanAndOperation; @@ -244,7 +247,7 @@ public class Parser { Token token = tokens.get(0); if(token.getType().equals(Token.Type.BLOCK_END)) break; // Stop parsing at block end. - ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE); + ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE); if(token.isLoopLike()) { // Parse loop-like tokens (if, while, etc) parsedItems.add(parseLoopLike(tokens, parsedVariables)); @@ -272,7 +275,10 @@ public class Parser { ParserUtil.checkType(tokens.remove(0), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); parsedItems.add(parseAssignment(temp, tokens, parsedVariables)); - } else throw new UnsupportedOperationException("Unexpected token " + token.getType() + ": " + token.getPosition()); + } else if(token.getType().equals(Token.Type.RETURN)) parsedItems.add(new ReturnKeyword(tokens.remove(0).getPosition())); + else if(token.getType().equals(Token.Type.BREAK)) parsedItems.add(new BreakKeyword(tokens.remove(0).getPosition())); + else if(token.getType().equals(Token.Type.CONTINUE)) parsedItems.add(new ContinueKeyword(tokens.remove(0).getPosition())); + else throw new UnsupportedOperationException("Unexpected token " + token.getType() + ": " + token.getPosition()); if(!tokens.isEmpty()) ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END, Token.Type.BLOCK_END); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index 9c6177d10..1235db72a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -7,7 +7,7 @@ import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.List; -public class Block implements Item { +public class Block implements Item { private final List> items; private final Position position; @@ -21,19 +21,36 @@ public class Block implements Item { } @Override - public Void apply(Location location, Rotation rotation) { - items.forEach(item -> item.apply(location, rotation)); - return null; + public ReturnLevel apply(Location location, Rotation rotation) { + + for(Item item : items) { + Object result = item.apply(location, rotation); + if(result instanceof ReturnLevel) { + ReturnLevel level = (ReturnLevel) result; + if(!level.equals(ReturnLevel.NONE)) return level; + } + } + return ReturnLevel.NONE; } @Override - public Void apply(Location location, Chunk chunk, Rotation rotation) { - items.forEach(item -> item.apply(location, chunk, rotation)); - return null; + public ReturnLevel apply(Location location, Chunk chunk, Rotation rotation) { + for(Item item : items) { + Object result = item.apply(location, chunk, rotation); + if(result instanceof ReturnLevel) { + ReturnLevel level = (ReturnLevel) result; + if(!level.equals(ReturnLevel.NONE)) return level; + } + } + return ReturnLevel.NONE; } @Override public Position getPosition() { return position; } + + public enum ReturnLevel { + NONE, BREAK, CONTINUE, RETURN + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java new file mode 100644 index 000000000..c08e918e4 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.api.structures.parser.lang.keywords; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.Keyword; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class BreakKeyword implements Keyword { + private final Position position; + + public BreakKeyword(Position position) { + this.position = position; + } + + @Override + public Block.ReturnLevel apply(Location location, Rotation rotation) { + return Block.ReturnLevel.BREAK; + } + + @Override + public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation) { + return Block.ReturnLevel.BREAK; + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java new file mode 100644 index 000000000..2ff17ad67 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.api.structures.parser.lang.keywords; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.Keyword; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class ContinueKeyword implements Keyword { + private final Position position; + + public ContinueKeyword(Position position) { + this.position = position; + } + + @Override + public Block.ReturnLevel apply(Location location, Rotation rotation) { + return Block.ReturnLevel.CONTINUE; + } + + @Override + public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation) { + return Block.ReturnLevel.CONTINUE; + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java index ce6e541b1..c148465d8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -public class IfKeyword implements Keyword { +public class IfKeyword implements Keyword { private final Block conditional; private final Returnable statement; private final Position position; @@ -20,15 +20,15 @@ public class IfKeyword implements Keyword { } @Override - public Void apply(Location location, Rotation rotation) { - if(statement.apply(location, rotation)) conditional.apply(location, rotation); - return null; + public Block.ReturnLevel apply(Location location, Rotation rotation) { + if(statement.apply(location, rotation)) return conditional.apply(location, rotation); + return Block.ReturnLevel.NONE; } @Override - public Void apply(Location location, Chunk chunk, Rotation rotation) { - if(statement.apply(location, chunk, rotation)) conditional.apply(location, chunk, rotation); - return null; + public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation) { + if(statement.apply(location, chunk, rotation)) return conditional.apply(location, chunk, rotation); + return Block.ReturnLevel.NONE; } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java index c257c660b..d0aa6eafc 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java @@ -2,11 +2,12 @@ package com.dfsek.terra.api.structures.parser.lang.keywords; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -public class ReturnKeyword implements Keyword { +public class ReturnKeyword implements Keyword { private final Position position; public ReturnKeyword(Position position) { @@ -14,13 +15,13 @@ public class ReturnKeyword implements Keyword { } @Override - public Void apply(Location location, Rotation rotation) { - return null; + public Block.ReturnLevel apply(Location location, Rotation rotation) { + return Block.ReturnLevel.RETURN; } @Override - public Void apply(Location location, Chunk chunk, Rotation rotation) { - return null; + public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation) { + return Block.ReturnLevel.RETURN; } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java index 9f4c6fd80..6b8023281 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; -public class WhileKeyword implements Keyword { +public class WhileKeyword implements Keyword { private final Block conditional; private final Returnable statement; private final Position position; @@ -20,15 +20,23 @@ public class WhileKeyword implements Keyword { } @Override - public Void apply(Location location, Rotation rotation) { - while(statement.apply(location, rotation)) conditional.apply(location, rotation); - return null; + public Block.ReturnLevel apply(Location location, Rotation rotation) { + while(statement.apply(location, rotation)) { + Block.ReturnLevel level = conditional.apply(location, rotation); + if(level.equals(Block.ReturnLevel.BREAK)) break; + if(level.equals(Block.ReturnLevel.RETURN)) return Block.ReturnLevel.RETURN; + } + return Block.ReturnLevel.NONE; } @Override - public Void apply(Location location, Chunk chunk, Rotation rotation) { - while(statement.apply(location, chunk, rotation)) conditional.apply(location, chunk, rotation); - return null; + public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation) { + while(statement.apply(location, chunk, rotation)) { + Block.ReturnLevel level = conditional.apply(location, chunk, rotation); + if(level.equals(Block.ReturnLevel.BREAK)) break; + if(level.equals(Block.ReturnLevel.RETURN)) return Block.ReturnLevel.RETURN; + } + return Block.ReturnLevel.NONE; } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index cc4e01761..7b94d31db 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.Chunk; @@ -9,7 +10,9 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; public class BlockFunction implements Function { private final BlockData data; @@ -33,7 +36,11 @@ public class BlockFunction implements Function { @Override public Void apply(Location location, Rotation rotation) { - location.clone().add(x.apply(location, rotation).intValue(), y.apply(location, rotation).intValue(), z.apply(location, rotation).intValue()).getBlock().setBlockData(data, false); + Vector2 xz = new Vector2(x.apply(location, rotation).doubleValue(), z.apply(location, rotation).doubleValue()); + + RotationUtil.rotateVector(xz, rotation); + + location.clone().add(FastMath.roundToInt(xz.getX()), y.apply(location, rotation).intValue(), FastMath.roundToInt(xz.getZ())).getBlock().setBlockData(data, false); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index 952fb0db8..9782892b1 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; @@ -8,9 +9,11 @@ import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.world.LandCheck; import com.dfsek.terra.api.structures.world.OceanCheck; +import net.jafama.FastMath; public class CheckFunction implements Function { private final TerraPlugin main; @@ -31,8 +34,13 @@ public class CheckFunction implements Function { } private Vector3 getVector(Location location, Chunk chunk, Rotation rotation) { - return location.clone().add(chunk == null ? new Vector3(x.apply(location, rotation).intValue(), y.apply(location, rotation).intValue(), z.apply(location, rotation).intValue()) - : new Vector3(x.apply(location, chunk, rotation).intValue(), y.apply(location, chunk, rotation).intValue(), z.apply(location, chunk, rotation).intValue())).toVector(); + Vector2 xz = chunk == null ? new Vector2(x.apply(location, rotation).doubleValue(), z.apply(location, rotation).doubleValue()) + : new Vector2(x.apply(location, chunk, rotation).doubleValue(), z.apply(location, chunk, rotation).doubleValue()); + + RotationUtil.rotateVector(xz, rotation); + + return location.clone().add(chunk == null ? new Vector3(FastMath.roundToInt(xz.getX()), y.apply(location, rotation).intValue(), FastMath.roundToInt(xz.getZ())) + : new Vector3(FastMath.roundToInt(xz.getX()), y.apply(location, chunk, rotation).intValue(), FastMath.roundToInt(xz.getZ()))).toVector(); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/RotationUtil.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/RotationUtil.java index b819b35ee..1d77977d3 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/RotationUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/RotationUtil.java @@ -26,9 +26,8 @@ public class RotationUtil { * * @param orig Vector to rotate. * @param r Rotation - * @return Rotated coordinate pair */ - public static Vector2 getRotatedCoords(Vector2 orig, Rotation r) { + public static void rotateVector(Vector2 orig, Rotation r) { Vector2 copy = orig.clone(); switch(r) { case CW_90: @@ -41,7 +40,8 @@ public class RotationUtil { copy.multiply(-1); break; } - return copy; + orig.setX(copy.getX()); + orig.setZ(copy.getZ()); } /** diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 1dc40f179..6f885647e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -183,6 +183,10 @@ public class Token { BOOLEAN_VARIABLE, IF_STATEMENT, - WHILE_LOOP + WHILE_LOOP, + + RETURN, + CONTINUE, + BREAK } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index 37292f3a9..1491f4793 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -12,7 +12,6 @@ public class Tokenizer { private final Lookahead reader; public static final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+', '-', '*', '/', '>', '<', '!'); // Reserved chars - private final Set keywords = Sets.newHashSet("if", "while", "num", "bool", "str"); public Tokenizer(String data) { @@ -41,14 +40,15 @@ public class Tokenizer { return new Token("==", Token.Type.EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("!=", true)) return new Token("!=", Token.Type.NOT_EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); - if(reader.matches(">", true)) - return new Token(">", Token.Type.GREATER_THAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); - if(reader.matches("<", true)) - return new Token("<", Token.Type.LESS_THAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches(">=", true)) return new Token(">=", Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.matches("<=", true)) return new Token("<=", Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches(">", true)) + return new Token(">", Token.Type.GREATER_THAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("<", true)) + return new Token("<", Token.Type.LESS_THAN_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.matches("||", true)) return new Token("||", Token.Type.BOOLEAN_OR, new Position(reader.getLine(), reader.getIndex())); @@ -134,6 +134,13 @@ public class Tokenizer { if(tokenString.equals("while")) return new Token(tokenString, Token.Type.WHILE_LOOP, new Position(reader.getLine(), reader.getIndex())); + if(tokenString.equals("return")) + return new Token(tokenString, Token.Type.RETURN, new Position(reader.getLine(), reader.getIndex())); + if(tokenString.equals("continue")) + return new Token(tokenString, Token.Type.CONTINUE, new Position(reader.getLine(), reader.getIndex())); + if(tokenString.equals("break")) + return new Token(tokenString, Token.Type.BREAK, new Position(reader.getLine(), reader.getIndex())); + return new Token(tokenString, Token.Type.IDENTIFIER, new Position(reader.getLine(), reader.getIndex())); } diff --git a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index 68fe29fb2..84a3905e2 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -46,7 +46,7 @@ public class TerraTree implements Tree { Rotation rotation = Rotation.fromDegrees(random.nextInt(4) * 90); StructureInfo info = struc.getStructureInfo(); for(StructureContainedBlock spawn : struc.getSpawns()) { - Vector2 rot = RotationUtil.getRotatedCoords(new Vector2(spawn.getX() - info.getCenterX(), spawn.getZ() - info.getCenterZ()), rotation); + Vector2 rot = RotationUtil.rotateVector(new Vector2(spawn.getX() - info.getCenterX(), spawn.getZ() - info.getCenterZ()), rotation); int x = (int) rot.getX(); int z = (int) rot.getZ(); switch(spawn.getRequirement()) { diff --git a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java index 5172bd33d..a037bb555 100644 --- a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -44,7 +44,7 @@ public class StructurePopulator implements TerraBlockPopulator { struc.paste(spawn, chunk, rotation, main); for(StructureContainedInventory i : struc.getInventories()) { try { - Vector2 lootCoords = RotationUtil.getRotatedCoords(new Vector2(i.getX() - struc.getStructureInfo().getCenterX(), i.getZ() - struc.getStructureInfo().getCenterZ()), rotation.inverse()); + Vector2 lootCoords = RotationUtil.rotateVector(new Vector2(i.getX() - struc.getStructureInfo().getCenterX(), i.getZ() - struc.getStructureInfo().getCenterZ()), rotation.inverse()); Location inv = spawn.clone().add(lootCoords.getX(), i.getY(), lootCoords.getZ()); if(FastMath.floorDiv(inv.getBlockX(), 16) != chunk.getX() || FastMath.floorDiv(inv.getBlockZ(), 16) != chunk.getZ()) continue; diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 1e8bed1c2..9c7ccfd8f 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -12,13 +12,16 @@ bool truetest = false; num iterator = 0; while(iterator < 5) { - test("fdsgdf" + 2 + stringVar, iterator); + test("always, even after " + 2, iterator); iterator = iterator + 1; + if(iterator > 2) { + continue; + } + test("not after " + 2, iterator); } if(true && !(boolean && false) && true) { -test(0,-1,0, "minecraft:green_w" + "ool"); num scopedVar = 2; test("if statement" + 2 + stringVar, 1 + testVar + scopedVar); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index f47a5f575..6621c736a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -21,6 +21,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.util.Collections; import java.util.List; +import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; public class LoadRawCommand extends LoadCommand implements DebugCommand { @@ -49,7 +50,7 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { System.out.println("Done parsing"); - main.apply(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), Rotation.NONE); + main.apply(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), Rotation.fromDegrees(90 * ThreadLocalRandom.current().nextInt(4))); } catch(IOException | ParseException e) { e.printStackTrace(); From e9dc7428b8060ffb0f37822ccc217dcee5662c0d Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 23 Dec 2020 01:43:53 -0700 Subject: [PATCH 096/210] document new tokens --- .../api/structures/parser/lang/Block.java | 1 - .../terra/api/structures/tokenizer/Token.java | 25 ++++++++++++++++--- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index 1235db72a..1e60004f4 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -22,7 +22,6 @@ public class Block implements Item { @Override public ReturnLevel apply(Location location, Rotation rotation) { - for(Item item : items) { Object result = item.apply(location, rotation); if(result instanceof ReturnLevel) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 6f885647e..449f8cd20 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -176,17 +176,36 @@ public class Token { */ BOOLEAN_AND, /** - * Variable declaration + * Numeric variable declaration */ NUMBER_VARIABLE, + /** + * String variable declaration + */ STRING_VARIABLE, + /** + * Boolean variable declaration + */ BOOLEAN_VARIABLE, - + /** + * If statement declaration + */ IF_STATEMENT, + /** + * While loop declaration + */ WHILE_LOOP, - + /** + * Return statement + */ RETURN, + /** + * Continue statement + */ CONTINUE, + /** + * Break statement + */ BREAK } } From 405a96034ce5e58eccdd4d545ea91bb95db27aa8 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 23 Dec 2020 02:35:07 -0700 Subject: [PATCH 097/210] Load structure scripts into registry --- .../terra/api/structures/parser/Parser.java | 13 ++++++ .../structures/script/StructureScript.java | 46 +++++++++++++++++++ .../terra/api/structures/tokenizer/Token.java | 6 ++- .../api/structures/tokenizer/Tokenizer.java | 3 ++ .../dfsek/terra/config/base/ConfigPack.java | 27 ++++++++--- .../terra/config/files/FolderLoader.java | 4 +- .../com/dfsek/terra/config/files/Loader.java | 7 +-- .../dfsek/terra/config/files/ZIPLoader.java | 4 +- .../dfsek/terra/registry/ScriptRegistry.java | 6 +++ common/src/test/resources/test.tesf | 2 + .../command/structure/load/LoadCommand.java | 20 ++++---- .../structure/load/LoadFullCommand.java | 2 +- .../structure/load/LoadRawCommand.java | 29 ++---------- 13 files changed, 117 insertions(+), 52 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/registry/ScriptRegistry.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 881031431..0826ff12c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -50,6 +50,7 @@ import java.util.Map; public class Parser { private final String data; private final Map>> functions = new HashMap<>(); + private String id; public Parser(String data) { this.data = data; @@ -60,6 +61,10 @@ public class Parser { return this; } + public String getID() { + return id; + } + /** * Parse input * @@ -75,6 +80,14 @@ public class Parser { } catch(TokenizerException e) { throw new ParseException("Failed to tokenize input", e); } + + // Parse ID + ParserUtil.checkType(tokens.remove(0), Token.Type.ID); // First token must be ID + Token idToken = tokens.get(0); + ParserUtil.checkType(tokens.remove(0), Token.Type.STRING); // Second token must be string literal containing ID + ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END); + this.id = idToken.getContent(); + // Check for dangling brackets int blockLevel = 0; for(Token t : tokens) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index d4a3f2508..df52c06e6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -1,4 +1,50 @@ package com.dfsek.terra.api.structures.script; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.Parser; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; +import com.dfsek.terra.api.structures.structure.Rotation; +import org.apache.commons.io.IOUtils; + +import java.io.IOException; +import java.io.InputStream; + public class StructureScript { + private final Block block; + private final String id; + + public StructureScript(InputStream inputStream, TerraPlugin main) { + Parser parser; + try { + parser = new Parser(IOUtils.toString(inputStream)); + } catch(IOException e) { + throw new RuntimeException(e); + } + parser.addFunction("block", new BlockFunctionBuilder(main)) + .addFunction("check", new CheckFunctionBuilder(main)); + + try { + block = parser.parse(); + } catch(ParseException e) { + throw new RuntimeException(e); + } + this.id = parser.getID(); + } + + public void execute(Location location, Rotation rotation) { + block.apply(location, rotation); + } + + public void execute(Location location, Chunk chunk, Rotation rotation) { + block.apply(location, chunk, rotation); + } + + public String getId() { + return id; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 449f8cd20..b02413940 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -206,6 +206,10 @@ public class Token { /** * Break statement */ - BREAK + BREAK, + /** + * ID declaration + */ + ID } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index 1491f4793..c6071bec1 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -141,6 +141,9 @@ public class Tokenizer { if(tokenString.equals("break")) return new Token(tokenString, Token.Type.BREAK, new Position(reader.getLine(), reader.getIndex())); + if(tokenString.equals("id")) + return new Token(tokenString, Token.Type.ID, new Position(reader.getLine(), reader.getIndex())); + return new Token(tokenString, Token.Type.IDENTIFIER, new Position(reader.getLine(), reader.getIndex())); } diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index c236c52a0..f7d61c590 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -8,6 +8,7 @@ import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.loot.LootTable; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.Palette; @@ -44,6 +45,7 @@ import com.dfsek.terra.registry.CarverRegistry; import com.dfsek.terra.registry.FloraRegistry; import com.dfsek.terra.registry.OreRegistry; import com.dfsek.terra.registry.PaletteRegistry; +import com.dfsek.terra.registry.ScriptRegistry; import com.dfsek.terra.registry.StructureRegistry; import com.dfsek.terra.registry.TerraRegistry; import com.dfsek.terra.registry.TreeRegistry; @@ -78,6 +80,7 @@ public class ConfigPack implements LoaderRegistrar { private final FloraRegistry floraRegistry; private final OreRegistry oreRegistry = new OreRegistry(); private final TreeRegistry treeRegistry; + private final ScriptRegistry scriptRegistry = new ScriptRegistry(); private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); private final ConfigLoader selfLoader = new ConfigLoader(); @@ -141,13 +144,19 @@ public class ConfigPack implements LoaderRegistrar { abstractConfigLoader .registerLoader(LootTable.class, new LootTableLoader(loader, main)); // These loaders need access to the Loader instance to get files. loader - .open("palettes").then(streams -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.load(streams, PaletteTemplate::new), main)).close() - .open("palettes").thenNames(names -> names.forEach(System.out::println)).close() - .open("ores").then(streams -> buildAll(new OreFactory(), oreRegistry, abstractConfigLoader.load(streams, OreTemplate::new), main)).close() - .open("flora").then(streams -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.load(streams, FloraTemplate::new), main)).close() - .open("carving").then(streams -> buildAll(new CarverFactory(this), carverRegistry, abstractConfigLoader.load(streams, CarverTemplate::new), main)).close() - .open("biomes").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this, main)), main)).close() - .open("grids").then(streams -> buildAll(new BiomeGridFactory(), biomeGridRegistry, abstractConfigLoader.load(streams, BiomeGridTemplate::new), main)).close(); + .open("palettes", ".yml").then(streams -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.load(streams, PaletteTemplate::new), main)).close() + .open("ores", ".yml").then(streams -> buildAll(new OreFactory(), oreRegistry, abstractConfigLoader.load(streams, OreTemplate::new), main)).close() + .open("flora", ".yml").then(streams -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.load(streams, FloraTemplate::new), main)).close() + .open("carving", ".yml").then(streams -> buildAll(new CarverFactory(this), carverRegistry, abstractConfigLoader.load(streams, CarverTemplate::new), main)).close() + .open("biomes", ".yml").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this, main)), main)).close() + .open("grids", ".yml").then(streams -> buildAll(new BiomeGridFactory(), biomeGridRegistry, abstractConfigLoader.load(streams, BiomeGridTemplate::new), main)).close(); + + + loader.open("structures/data", ".tesf").then(streams -> streams.forEach(stream -> { + StructureScript structureScript = new StructureScript(stream, main); + scriptRegistry.add(structureScript.getId(), structureScript); + })).close(); + for(UserDefinedBiome b : biomeRegistry.entries()) { try { Objects.requireNonNull(b.getErode()); // Throws NPE if it cannot load erosion biomes. @@ -231,6 +240,10 @@ public class ConfigPack implements LoaderRegistrar { .registerLoader(Tree.class, treeRegistry); } + public ScriptRegistry getScriptRegistry() { + return scriptRegistry; + } + public BiomeRegistry getBiomeRegistry() { return biomeRegistry; } diff --git a/common/src/main/java/com/dfsek/terra/config/files/FolderLoader.java b/common/src/main/java/com/dfsek/terra/config/files/FolderLoader.java index 6bf93f044..7af67ca05 100644 --- a/common/src/main/java/com/dfsek/terra/config/files/FolderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/files/FolderLoader.java @@ -25,11 +25,11 @@ public class FolderLoader extends Loader { } @Override - protected void load(String directory) { + protected void load(String directory, String extension) { File newPath = new File(path.toFile(), directory); newPath.mkdirs(); try(Stream paths = Files.walk(newPath.toPath())) { - paths.filter(Files::isRegularFile).filter(file -> file.toString().toLowerCase().endsWith(".yml")).forEach(file -> { + paths.filter(Files::isRegularFile).filter(file -> file.toString().toLowerCase().endsWith(extension)).forEach(file -> { try { streams.put(newPath.toURI().relativize(file.toUri()).getPath(), new FileInputStream(file.toFile())); } catch(FileNotFoundException e) { diff --git a/common/src/main/java/com/dfsek/terra/config/files/Loader.java b/common/src/main/java/com/dfsek/terra/config/files/Loader.java index 6150d4b32..efd65392d 100644 --- a/common/src/main/java/com/dfsek/terra/config/files/Loader.java +++ b/common/src/main/java/com/dfsek/terra/config/files/Loader.java @@ -45,14 +45,15 @@ public abstract class Loader { * Open a subdirectory. * * @param directory Directory to open + * @param extension */ - public Loader open(String directory) { + public Loader open(String directory, String extension) { if(streams.size() != 0) throw new IllegalStateException("Attempted to load new directory before closing existing InputStreams"); - load(directory); + load(directory, extension); return this; } - protected abstract void load(String directory); + protected abstract void load(String directory, String extension); /** * Close all InputStreams opened. diff --git a/common/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java b/common/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java index e0a72f71c..5d5750f2b 100644 --- a/common/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java @@ -24,11 +24,11 @@ public class ZIPLoader extends Loader { } @Override - protected void load(String directory) { + protected void load(String directory, String extension) { Enumeration entries = file.entries(); while(entries.hasMoreElements()) { ZipEntry entry = entries.nextElement(); - if(!entry.isDirectory() && entry.getName().startsWith(directory) && entry.getName().endsWith(".yml")) { + if(!entry.isDirectory() && entry.getName().startsWith(directory) && entry.getName().endsWith(extension)) { try { streams.put(entry.getName(), file.getInputStream(entry)); } catch(IOException e) { diff --git a/common/src/main/java/com/dfsek/terra/registry/ScriptRegistry.java b/common/src/main/java/com/dfsek/terra/registry/ScriptRegistry.java new file mode 100644 index 000000000..703f971b6 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/registry/ScriptRegistry.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.registry; + +import com.dfsek.terra.api.structures.script.StructureScript; + +public class ScriptRegistry extends TerraRegistry { +} diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 9c7ccfd8f..0ab62eebc 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,3 +1,5 @@ +id "testScript"; + test("minecraft:green_w" + "ool", (2 * (3+1) * (2 * (1+1)))); // diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadCommand.java index 0b9f2d096..ea842cc51 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadCommand.java @@ -1,5 +1,7 @@ package com.dfsek.terra.bukkit.command.command.structure.load; +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.bukkit.command.DebugCommand; import com.dfsek.terra.bukkit.command.PlayerCommand; import org.bukkit.command.Command; @@ -7,9 +9,6 @@ import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.io.File; -import java.io.FilenameFilter; -import java.nio.file.Path; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -20,17 +19,14 @@ public class LoadCommand extends PlayerCommand implements DebugCommand { super(parent); } - public List getStructureNames() { + public List getStructureNames(World world) { List names = new ArrayList<>(); - File structureDir = new File(getMain().getDataFolder() + File.separator + "export" + File.separator + "structures"); - if(!structureDir.exists()) return Collections.emptyList(); - Path structurePath = structureDir.toPath(); + TerraWorld terraWorld = getMain().getWorld(world); + + terraWorld.getConfig().getScriptRegistry().forEach(script -> { + names.add(script.getId()); + }); - FilenameFilter filter = (dir, name) -> name.endsWith(".tstructure"); - for(File f : structureDir.listFiles(filter)) { - String path = structurePath.relativize(f.toPath()).toString(); - names.add(path.substring(0, path.length() - 11)); - } return names; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java index c0ab64660..9c41388d1 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java @@ -62,7 +62,7 @@ public class LoadFullCommand extends LoadCommand implements DebugCommand { public List getTabCompletions(@NotNull CommandSender commandSender, @NotNull String s, @NotNull String[] args) { switch(args.length) { case 1: - return getStructureNames().stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); + return Collections.emptyList(); //getStructureNames().stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); case 2: return Stream.of("0", "90", "180", "270").filter(string -> string.toUpperCase().startsWith(args[1].toUpperCase())).collect(Collectors.toList()); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index 6621c736a..8a2fe133a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -1,24 +1,16 @@ package com.dfsek.terra.bukkit.command.command.structure.load; +import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.structures.parser.Parser; -import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.parser.lang.Block; -import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; -import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; -import org.apache.commons.io.IOUtils; import org.bukkit.block.Sign; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.concurrent.ThreadLocalRandom; @@ -37,24 +29,13 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { } else sign.setLine(2, data); } + @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { - try { - Parser parser = new Parser(IOUtils.toString(new FileInputStream(new File(getMain().getDataFolder(), "test.tesf")))); - parser.addFunction("block", new BlockFunctionBuilder(getMain())) - .addFunction("check", new CheckFunctionBuilder(getMain())); + TerraWorld terraWorld = getMain().getWorld(new BukkitWorld(sender.getWorld())); - System.out.println("Parsing..."); + terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), Rotation.fromDegrees(90 * ThreadLocalRandom.current().nextInt(4))); - Block main = parser.parse(); - - System.out.println("Done parsing"); - - main.apply(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), Rotation.fromDegrees(90 * ThreadLocalRandom.current().nextInt(4))); - - } catch(IOException | ParseException e) { - e.printStackTrace(); - } /* try { WorldHandle handle = ((TerraBukkitPlugin) getMain()).getWorldHandle(); @@ -130,7 +111,7 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { @Override public List getTabCompletions(@NotNull CommandSender commandSender, @NotNull String s, @NotNull String[] args) { if(args.length == 1) { - return getStructureNames().stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); + return getStructureNames(new BukkitWorld(((Player) commandSender).getWorld())).stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); } return Collections.emptyList(); } From 63e59692e2cc7c40f2b13c992f5bcabad85d97c2 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 23 Dec 2020 03:08:31 -0700 Subject: [PATCH 098/210] Implement StructureFunction and temp RandomFunction --- .../structures/script/StructureScript.java | 9 ++- .../builders/RandomFunctionBuilder.java | 28 +++++++ .../builders/StructureFunctionBuilder.java | 46 ++++++++++++ .../script/functions/RandomFunction.java | 46 ++++++++++++ .../script/functions/StructureFunction.java | 73 +++++++++++++++++++ .../dfsek/terra/config/base/ConfigPack.java | 2 +- 6 files changed, 201 insertions(+), 3 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/RandomFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index df52c06e6..32805bfa0 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -8,7 +8,10 @@ import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.RandomFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.registry.ScriptRegistry; import org.apache.commons.io.IOUtils; import java.io.IOException; @@ -18,7 +21,7 @@ public class StructureScript { private final Block block; private final String id; - public StructureScript(InputStream inputStream, TerraPlugin main) { + public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry) { Parser parser; try { parser = new Parser(IOUtils.toString(inputStream)); @@ -26,7 +29,9 @@ public class StructureScript { throw new RuntimeException(e); } parser.addFunction("block", new BlockFunctionBuilder(main)) - .addFunction("check", new CheckFunctionBuilder(main)); + .addFunction("check", new CheckFunctionBuilder(main)) + .addFunction("structure", new StructureFunctionBuilder(registry, main)) + .addFunction("randomInt", new RandomFunctionBuilder()); try { block = parser.parse(); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/RandomFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/RandomFunctionBuilder.java new file mode 100644 index 000000000..ec84d5c36 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/RandomFunctionBuilder.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.functions.RandomFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class RandomFunctionBuilder implements FunctionBuilder { + @SuppressWarnings("unchecked") + @Override + public RandomFunction build(List> argumentList, Position position) throws ParseException { + return new RandomFunction((Returnable) argumentList.get(0), position); + } + + @Override + public int argNumber() { + return 1; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + if(position == 0) return Returnable.ReturnType.NUMBER; + return null; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java new file mode 100644 index 000000000..33da88114 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java @@ -0,0 +1,46 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.functions.StructureFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.registry.ScriptRegistry; + +import java.util.List; + +public class StructureFunctionBuilder implements FunctionBuilder { + private final ScriptRegistry registry; + private final TerraPlugin main; + + public StructureFunctionBuilder(ScriptRegistry registry, TerraPlugin main) { + this.registry = registry; + this.main = main; + } + + @SuppressWarnings("unchecked") + @Override + public StructureFunction build(List> argumentList, Position position) throws ParseException { + return new StructureFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), registry, position, main); + } + + @Override + public int argNumber() { + return 4; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + switch(position) { + case 0: + case 1: + case 2: + return Returnable.ReturnType.NUMBER; + case 3: + return Returnable.ReturnType.STRING; + default: + return null; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java new file mode 100644 index 000000000..d7b478ff1 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java @@ -0,0 +1,46 @@ +package com.dfsek.terra.api.structures.script.functions; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.concurrent.ThreadLocalRandom; + +public class RandomFunction implements Function { + private final Returnable numberReturnable; + private final Position position; + + public RandomFunction(Returnable numberReturnable, Position position) { + this.numberReturnable = numberReturnable; + this.position = position; + } + + + @Override + public String name() { + return "randomInt"; + } + + @Override + public ReturnType returnType() { + return ReturnType.NUMBER; + } + + @Override + public Integer apply(Location location, Rotation rotation) { + return ThreadLocalRandom.current().nextInt(numberReturnable.apply(location, rotation).intValue()); // TODO: deterministic random + } + + @Override + public Integer apply(Location location, Chunk chunk, Rotation rotation) { + return ThreadLocalRandom.current().nextInt(numberReturnable.apply(location, chunk, rotation).intValue()); + } + + @Override + public Position getPosition() { + return position; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java new file mode 100644 index 000000000..006901c07 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -0,0 +1,73 @@ +package com.dfsek.terra.api.structures.script.functions; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.script.StructureScript; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.RotationUtil; +import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.registry.ScriptRegistry; +import net.jafama.FastMath; + +public class StructureFunction implements Function { + private final ScriptRegistry registry; + private final Returnable id; + private final Returnable x, y, z; + private final Position position; + private final TerraPlugin main; + + public StructureFunction(Returnable x, Returnable y, Returnable z, Returnable id, ScriptRegistry registry, Position position, TerraPlugin main) { + this.registry = registry; + this.id = id; + this.position = position; + this.x = x; + this.y = y; + this.z = z; + this.main = main; + } + + @Override + public String name() { + return "structure"; + } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } + + @Override + public Void apply(Location location, Rotation rotation) { + System.out.println("executing structure function"); + + Vector2 xz = new Vector2(x.apply(location, rotation).doubleValue(), z.apply(location, rotation).doubleValue()); + + RotationUtil.rotateVector(xz, rotation); + + StructureScript script = registry.get(id.apply(location, rotation)); + if(script == null) { + main.getLogger().severe("No such structure " + id.apply(location, rotation)); + return null; + } + + Location location1 = location.clone().add(FastMath.roundToInt(xz.getX()), y.apply(location, rotation).intValue(), FastMath.roundToInt(xz.getZ())); + + script.execute(location1, rotation); + + return null; + } + + @Override + public Void apply(Location location, Chunk chunk, Rotation rotation) { + return null; + } + + @Override + public Position getPosition() { + return position; + } +} diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index f7d61c590..8fdda699f 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -153,7 +153,7 @@ public class ConfigPack implements LoaderRegistrar { loader.open("structures/data", ".tesf").then(streams -> streams.forEach(stream -> { - StructureScript structureScript = new StructureScript(stream, main); + StructureScript structureScript = new StructureScript(stream, main, scriptRegistry); scriptRegistry.add(structureScript.getId(), structureScript); })).close(); From 7fe7dac57a88b79c33ca7aecdb9ffe108daf461c Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 23 Dec 2020 15:09:42 -0700 Subject: [PATCH 099/210] implement RecursionsFunction --- .../api/structures/parser/lang/Block.java | 8 ++-- .../api/structures/parser/lang/Item.java | 4 +- .../lang/constants/ConstantExpression.java | 4 +- .../parser/lang/keywords/BreakKeyword.java | 4 +- .../parser/lang/keywords/ContinueKeyword.java | 4 +- .../parser/lang/keywords/IfKeyword.java | 8 ++-- .../parser/lang/keywords/ReturnKeyword.java | 4 +- .../parser/lang/keywords/WhileKeyword.java | 12 +++--- .../lang/operations/BinaryOperation.java | 8 ++-- .../lang/operations/UnaryOperation.java | 8 ++-- .../parser/lang/variables/Assignment.java | 8 ++-- .../parser/lang/variables/Getter.java | 4 +- .../structures/script/StructureScript.java | 12 +++--- .../builders/RecursionsFunctionBuilder.java | 26 ++++++++++++ .../builders/StructureFunctionBuilder.java | 12 +++--- .../script/functions/BlockFunction.java | 8 ++-- .../script/functions/CheckFunction.java | 18 ++++----- .../script/functions/RandomFunction.java | 8 ++-- .../script/functions/RecursionsFunction.java | 40 +++++++++++++++++++ .../script/functions/StructureFunction.java | 30 ++++++++++---- .../api/structures/structure/Rotation.java | 4 ++ .../src/test/java/structure/ParserTest.java | 10 ++--- .../structure/load/LoadRawCommand.java | 9 ++++- 23 files changed, 173 insertions(+), 80 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/RecursionsFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index 1e60004f4..5a3f7a975 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -21,9 +21,9 @@ public class Block implements Item { } @Override - public ReturnLevel apply(Location location, Rotation rotation) { + public ReturnLevel apply(Location location, Rotation rotation, int recursions) { for(Item item : items) { - Object result = item.apply(location, rotation); + Object result = item.apply(location, rotation, recursions); if(result instanceof ReturnLevel) { ReturnLevel level = (ReturnLevel) result; if(!level.equals(ReturnLevel.NONE)) return level; @@ -33,9 +33,9 @@ public class Block implements Item { } @Override - public ReturnLevel apply(Location location, Chunk chunk, Rotation rotation) { + public ReturnLevel apply(Location location, Chunk chunk, Rotation rotation, int recursions) { for(Item item : items) { - Object result = item.apply(location, chunk, rotation); + Object result = item.apply(location, chunk, rotation, recursions); if(result instanceof ReturnLevel) { ReturnLevel level = (ReturnLevel) result; if(!level.equals(ReturnLevel.NONE)) return level; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java index 7cc895eaf..4ec95cbfd 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java @@ -6,9 +6,9 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; public interface Item { - T apply(Location location, Rotation rotation); + T apply(Location location, Rotation rotation, int recursions); - T apply(Location location, Chunk chunk, Rotation rotation); + T apply(Location location, Chunk chunk, Rotation rotation, int recursions); Position getPosition(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java index 05b276897..a4b54c470 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java @@ -16,13 +16,13 @@ public abstract class ConstantExpression implements Returnable { } @Override - public T apply(Location location, Rotation rotation) { + public T apply(Location location, Rotation rotation, int recursions) { return constant; } @Override - public T apply(Location location, Chunk chunk, Rotation rotation) { + public T apply(Location location, Chunk chunk, Rotation rotation, int recursions) { return constant; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java index c08e918e4..ac03e792e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java @@ -15,12 +15,12 @@ public class BreakKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Location location, Rotation rotation) { + public Block.ReturnLevel apply(Location location, Rotation rotation, int recursions) { return Block.ReturnLevel.BREAK; } @Override - public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation) { + public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation, int recursions) { return Block.ReturnLevel.BREAK; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java index 2ff17ad67..67ac5a0b2 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java @@ -15,12 +15,12 @@ public class ContinueKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Location location, Rotation rotation) { + public Block.ReturnLevel apply(Location location, Rotation rotation, int recursions) { return Block.ReturnLevel.CONTINUE; } @Override - public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation) { + public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation, int recursions) { return Block.ReturnLevel.CONTINUE; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java index c148465d8..8d51f7d10 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java @@ -20,14 +20,14 @@ public class IfKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Location location, Rotation rotation) { - if(statement.apply(location, rotation)) return conditional.apply(location, rotation); + public Block.ReturnLevel apply(Location location, Rotation rotation, int recursions) { + if(statement.apply(location, rotation, recursions)) return conditional.apply(location, rotation, recursions); return Block.ReturnLevel.NONE; } @Override - public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation) { - if(statement.apply(location, chunk, rotation)) return conditional.apply(location, chunk, rotation); + public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation, int recursions) { + if(statement.apply(location, chunk, rotation, recursions)) return conditional.apply(location, chunk, rotation, recursions); return Block.ReturnLevel.NONE; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java index d0aa6eafc..c4c46b151 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java @@ -15,12 +15,12 @@ public class ReturnKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Location location, Rotation rotation) { + public Block.ReturnLevel apply(Location location, Rotation rotation, int recursions) { return Block.ReturnLevel.RETURN; } @Override - public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation) { + public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation, int recursions) { return Block.ReturnLevel.RETURN; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java index 6b8023281..889f279f9 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java @@ -20,9 +20,9 @@ public class WhileKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Location location, Rotation rotation) { - while(statement.apply(location, rotation)) { - Block.ReturnLevel level = conditional.apply(location, rotation); + public Block.ReturnLevel apply(Location location, Rotation rotation, int recursions) { + while(statement.apply(location, rotation, recursions)) { + Block.ReturnLevel level = conditional.apply(location, rotation, recursions); if(level.equals(Block.ReturnLevel.BREAK)) break; if(level.equals(Block.ReturnLevel.RETURN)) return Block.ReturnLevel.RETURN; } @@ -30,9 +30,9 @@ public class WhileKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation) { - while(statement.apply(location, chunk, rotation)) { - Block.ReturnLevel level = conditional.apply(location, chunk, rotation); + public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation, int recursions) { + while(statement.apply(location, chunk, rotation, recursions)) { + Block.ReturnLevel level = conditional.apply(location, chunk, rotation, recursions); if(level.equals(Block.ReturnLevel.BREAK)) break; if(level.equals(Block.ReturnLevel.RETURN)) return Block.ReturnLevel.RETURN; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java index ef5642cd5..a9c1e7f51 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java @@ -25,12 +25,12 @@ public abstract class BinaryOperation implements Returnable { } @Override - public O apply(Location location, Rotation rotation) { - return apply(left.apply(location, rotation), right.apply(location, rotation)); + public O apply(Location location, Rotation rotation, int recursions) { + return apply(left.apply(location, rotation, recursions), right.apply(location, rotation, recursions)); } @Override - public O apply(Location location, Chunk chunk, Rotation rotation) { - return apply(left.apply(location, chunk, rotation), right.apply(location, chunk, rotation)); + public O apply(Location location, Chunk chunk, Rotation rotation, int recursions) { + return apply(left.apply(location, chunk, rotation, recursions), right.apply(location, chunk, rotation, recursions)); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java index 68e588cd0..689edd476 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java @@ -18,13 +18,13 @@ public abstract class UnaryOperation implements Returnable { public abstract T apply(T input); @Override - public T apply(Location location, Rotation rotation) { - return apply(input.apply(location, rotation)); + public T apply(Location location, Rotation rotation, int recursions) { + return apply(input.apply(location, rotation, recursions)); } @Override - public T apply(Location location, Chunk chunk, Rotation rotation) { - return apply(input.apply(location, chunk, rotation)); + public T apply(Location location, Chunk chunk, Rotation rotation, int recursions) { + return apply(input.apply(location, chunk, rotation, recursions)); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java index c18988e5b..169e4b4d8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java @@ -19,15 +19,15 @@ public class Assignment implements Item { } @Override - public T apply(Location location, Rotation rotation) { - T val = value.apply(location, rotation); + public T apply(Location location, Rotation rotation, int recursions) { + T val = value.apply(location, rotation, recursions); delegate.setValue(val); return val; } @Override - public T apply(Location location, Chunk chunk, Rotation rotation) { - T val = value.apply(location, chunk, rotation); + public T apply(Location location, Chunk chunk, Rotation rotation, int recursions) { + T val = value.apply(location, chunk, rotation, recursions); delegate.setValue(val); return val; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java index f8922b840..2383e0a5a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java @@ -19,12 +19,12 @@ public class Getter implements Returnable { } @Override - public Object apply(Location location, Rotation rotation) { + public Object apply(Location location, Rotation rotation, int recursions) { return delegate.getValue(); } @Override - public Object apply(Location location, Chunk chunk, Rotation rotation) { + public Object apply(Location location, Chunk chunk, Rotation rotation, int recursions) { return delegate.getValue(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 32805bfa0..7c850ed9c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RandomFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.RecursionsFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.registry.ScriptRegistry; @@ -31,7 +32,8 @@ public class StructureScript { parser.addFunction("block", new BlockFunctionBuilder(main)) .addFunction("check", new CheckFunctionBuilder(main)) .addFunction("structure", new StructureFunctionBuilder(registry, main)) - .addFunction("randomInt", new RandomFunctionBuilder()); + .addFunction("randomInt", new RandomFunctionBuilder()) + .addFunction("recursions", new RecursionsFunctionBuilder()); try { block = parser.parse(); @@ -41,12 +43,12 @@ public class StructureScript { this.id = parser.getID(); } - public void execute(Location location, Rotation rotation) { - block.apply(location, rotation); + public void execute(Location location, Rotation rotation, int recursions) { + block.apply(location, rotation, recursions); } - public void execute(Location location, Chunk chunk, Rotation rotation) { - block.apply(location, chunk, rotation); + public void execute(Location location, Chunk chunk, Rotation rotation, int recursions) { + block.apply(location, chunk, rotation, recursions); } public String getId() { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/RecursionsFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/RecursionsFunctionBuilder.java new file mode 100644 index 000000000..5fc66977d --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/RecursionsFunctionBuilder.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.functions.RecursionsFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class RecursionsFunctionBuilder implements FunctionBuilder { + @Override + public RecursionsFunction build(List> argumentList, Position position) throws ParseException { + return new RecursionsFunction(position); + } + + @Override + public int argNumber() { + return 0; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + return null; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java index 33da88114..044bd97d6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.registry.ScriptRegistry; import java.util.List; +import java.util.stream.Collectors; public class StructureFunctionBuilder implements FunctionBuilder { private final ScriptRegistry registry; @@ -22,12 +23,15 @@ public class StructureFunctionBuilder implements FunctionBuilder> argumentList, Position position) throws ParseException { - return new StructureFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), registry, position, main); + if(argumentList.size() < 5) throw new ParseException("Expected rotations: " + position); + + return new StructureFunction((Returnable) argumentList.remove(0), (Returnable) argumentList.remove(0), (Returnable) argumentList.remove(0), (Returnable) argumentList.remove(0), + argumentList.stream().map(item -> ((Returnable) item)).collect(Collectors.toList()), registry, position, main); } @Override public int argNumber() { - return 4; + return -1; } @Override @@ -37,10 +41,8 @@ public class StructureFunctionBuilder implements FunctionBuilder { } @Override - public Void apply(Location location, Rotation rotation) { - Vector2 xz = new Vector2(x.apply(location, rotation).doubleValue(), z.apply(location, rotation).doubleValue()); + public Void apply(Location location, Rotation rotation, int recursions) { + Vector2 xz = new Vector2(x.apply(location, rotation, recursions).doubleValue(), z.apply(location, rotation, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); - location.clone().add(FastMath.roundToInt(xz.getX()), y.apply(location, rotation).intValue(), FastMath.roundToInt(xz.getZ())).getBlock().setBlockData(data, false); + location.clone().add(FastMath.roundToInt(xz.getX()), y.apply(location, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ())).getBlock().setBlockData(data, false); return null; } @Override - public Void apply(Location location, Chunk chunk, Rotation rotation) { + public Void apply(Location location, Chunk chunk, Rotation rotation, int recursions) { //TODO: do return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index 9782892b1..c36188658 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -33,19 +33,19 @@ public class CheckFunction implements Function { return "check"; } - private Vector3 getVector(Location location, Chunk chunk, Rotation rotation) { - Vector2 xz = chunk == null ? new Vector2(x.apply(location, rotation).doubleValue(), z.apply(location, rotation).doubleValue()) - : new Vector2(x.apply(location, chunk, rotation).doubleValue(), z.apply(location, chunk, rotation).doubleValue()); + private Vector3 getVector(Location location, Chunk chunk, Rotation rotation, int recursions) { + Vector2 xz = chunk == null ? new Vector2(x.apply(location, rotation, recursions).doubleValue(), z.apply(location, rotation, recursions).doubleValue()) + : new Vector2(x.apply(location, chunk, rotation, recursions).doubleValue(), z.apply(location, chunk, rotation, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); - return location.clone().add(chunk == null ? new Vector3(FastMath.roundToInt(xz.getX()), y.apply(location, rotation).intValue(), FastMath.roundToInt(xz.getZ())) - : new Vector3(FastMath.roundToInt(xz.getX()), y.apply(location, chunk, rotation).intValue(), FastMath.roundToInt(xz.getZ()))).toVector(); + return location.clone().add(chunk == null ? new Vector3(FastMath.roundToInt(xz.getX()), y.apply(location, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ())) + : new Vector3(FastMath.roundToInt(xz.getX()), y.apply(location, chunk, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))).toVector(); } @Override - public String apply(Location location, Rotation rotation) { - return apply(getVector(location, null, rotation), location.getWorld()); + public String apply(Location location, Rotation rotation, int recursions) { + return apply(getVector(location, null, rotation, recursions), location.getWorld()); } private String apply(Vector3 vector, World world) { @@ -57,8 +57,8 @@ public class CheckFunction implements Function { } @Override - public String apply(Location location, Chunk chunk, Rotation rotation) { - return apply(getVector(location, chunk, rotation), location.getWorld()); + public String apply(Location location, Chunk chunk, Rotation rotation, int recursions) { + return apply(getVector(location, chunk, rotation, recursions), location.getWorld()); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java index d7b478ff1..c65b5d598 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java @@ -30,13 +30,13 @@ public class RandomFunction implements Function { } @Override - public Integer apply(Location location, Rotation rotation) { - return ThreadLocalRandom.current().nextInt(numberReturnable.apply(location, rotation).intValue()); // TODO: deterministic random + public Integer apply(Location location, Rotation rotation, int recursions) { + return ThreadLocalRandom.current().nextInt(numberReturnable.apply(location, rotation, recursions).intValue()); // TODO: deterministic random } @Override - public Integer apply(Location location, Chunk chunk, Rotation rotation) { - return ThreadLocalRandom.current().nextInt(numberReturnable.apply(location, chunk, rotation).intValue()); + public Integer apply(Location location, Chunk chunk, Rotation rotation, int recursions) { + return ThreadLocalRandom.current().nextInt(numberReturnable.apply(location, chunk, rotation, recursions).intValue()); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java new file mode 100644 index 000000000..2089f6af9 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.api.structures.script.functions; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class RecursionsFunction implements Function { + private final Position position; + + public RecursionsFunction(Position position) { + this.position = position; + } + + @Override + public String name() { + return "recursions"; + } + + @Override + public ReturnType returnType() { + return ReturnType.NUMBER; + } + + @Override + public Number apply(Location location, Rotation rotation, int recursions) { + return recursions; + } + + @Override + public Number apply(Location location, Chunk chunk, Rotation rotation, int recursions) { + return recursions; + } + + @Override + public Position getPosition() { + return position; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index 006901c07..a464e21fc 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -13,14 +13,18 @@ import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.registry.ScriptRegistry; import net.jafama.FastMath; +import java.util.List; +import java.util.concurrent.ThreadLocalRandom; + public class StructureFunction implements Function { private final ScriptRegistry registry; private final Returnable id; private final Returnable x, y, z; private final Position position; private final TerraPlugin main; + private final List> rotations; - public StructureFunction(Returnable x, Returnable y, Returnable z, Returnable id, ScriptRegistry registry, Position position, TerraPlugin main) { + public StructureFunction(Returnable x, Returnable y, Returnable z, Returnable id, List> rotations, ScriptRegistry registry, Position position, TerraPlugin main) { this.registry = registry; this.id = id; this.position = position; @@ -28,6 +32,7 @@ public class StructureFunction implements Function { this.y = y; this.z = z; this.main = main; + this.rotations = rotations; } @Override @@ -41,28 +46,37 @@ public class StructureFunction implements Function { } @Override - public Void apply(Location location, Rotation rotation) { + public Void apply(Location location, Rotation rotation, int recursions) { System.out.println("executing structure function"); - Vector2 xz = new Vector2(x.apply(location, rotation).doubleValue(), z.apply(location, rotation).doubleValue()); + Vector2 xz = new Vector2(x.apply(location, rotation, recursions).doubleValue(), z.apply(location, rotation, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); - StructureScript script = registry.get(id.apply(location, rotation)); + StructureScript script = registry.get(id.apply(location, rotation, recursions)); if(script == null) { - main.getLogger().severe("No such structure " + id.apply(location, rotation)); + main.getLogger().severe("No such structure " + id.apply(location, rotation, recursions)); return null; } - Location location1 = location.clone().add(FastMath.roundToInt(xz.getX()), y.apply(location, rotation).intValue(), FastMath.roundToInt(xz.getZ())); + Rotation rotation1; + String rotString = rotations.get(ThreadLocalRandom.current().nextInt(rotations.size())).apply(location, rotation, recursions); + try { + rotation1 = Rotation.valueOf(rotString); + } catch(IllegalArgumentException e) { + main.getLogger().severe("Invalid rotation " + rotString); + return null; + } - script.execute(location1, rotation); + Location location1 = location.clone().add(FastMath.roundToInt(xz.getX()), y.apply(location, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ())); + + script.execute(location1, rotation.rotate(rotation1), recursions + 1); return null; } @Override - public Void apply(Location location, Chunk chunk, Rotation rotation) { + public Void apply(Location location, Chunk chunk, Rotation rotation, int recursions) { return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/Rotation.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/Rotation.java index 8efbff230..f81c8f63e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/Rotation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/Rotation.java @@ -45,6 +45,10 @@ public enum Rotation { } } + public Rotation rotate(Rotation rotation) { + return fromDegrees(this.getDegrees() + rotation.getDegrees()); + } + public enum Axis { X, Y, Z } diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 4361f3083..d59a7bd8e 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -51,9 +51,9 @@ public class ParserTest { long t = System.nanoTime() - l; System.out.println("Took " + (double) t / 1000000); - block.apply(null, Rotation.NONE); + block.apply(null, Rotation.NONE, recursions); - block.apply(null, Rotation.NONE); + block.apply(null, Rotation.NONE, recursions); } private static class Test1 implements Function { @@ -68,13 +68,13 @@ public class ParserTest { } @Override - public Void apply(Location location, Rotation rotation) { - System.out.println("string: " + a.apply(location, rotation) + ", double: " + b.apply(location, rotation)); + public Void apply(Location location, Rotation rotation, int recursions) { + System.out.println("string: " + a.apply(location, rotation, recursions) + ", double: " + b.apply(location, rotation, recursions)); return null; } @Override - public Void apply(Location location, Chunk chunk, Rotation rotation) { + public Void apply(Location location, Chunk chunk, Rotation rotation, int recursions) { return null; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index 8a2fe133a..92b185ca8 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -32,9 +32,14 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { - TerraWorld terraWorld = getMain().getWorld(new BukkitWorld(sender.getWorld())); - terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), Rotation.fromDegrees(90 * ThreadLocalRandom.current().nextInt(4))); + + TerraWorld terraWorld = getMain().getWorld(new BukkitWorld(sender.getWorld())); + long t = System.nanoTime(); + terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), Rotation.fromDegrees(90 * ThreadLocalRandom.current().nextInt(4)), 0); + long l = System.nanoTime() - t; + + sender.sendMessage("Took " + ((double) l) / 1000000 + "ms"); /* try { From 76afd54d3c7f05f1dddac59dccd71f98943f250a Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 23 Dec 2020 15:19:33 -0700 Subject: [PATCH 100/210] use epsilon for numeric equals --- .../parser/lang/operations/statements/EqualsStatement.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/EqualsStatement.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/EqualsStatement.java index ebc8ae515..b7dface16 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/EqualsStatement.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/statements/EqualsStatement.java @@ -3,14 +3,21 @@ package com.dfsek.terra.api.structures.parser.lang.operations.statements; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; public class EqualsStatement extends BinaryOperation { + private static final double EPSILON = 0.000000001D; + public EqualsStatement(Returnable left, Returnable right, Position position) { super(left, right, position); } @Override public Boolean apply(Object left, Object right) { + if(left instanceof Number && right instanceof Number) { + return FastMath.abs(((Number) left).doubleValue() - ((Number) right).doubleValue()) <= EPSILON; + } + return left.equals(right); } From 1c316e52a95b91674d6baeef010236367a3394c4 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 23 Dec 2020 23:02:58 -0700 Subject: [PATCH 101/210] Exporting --- .../script/functions/StructureFunction.java | 1 - .../src/test/java/structure/ParserTest.java | 4 +- .../test/java/structure/TokenizerTest.java | 2 +- .../command/structure/ExportCommand.java | 72 ++++++++++++++++++- 4 files changed, 74 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index a464e21fc..f55b604d3 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -47,7 +47,6 @@ public class StructureFunction implements Function { @Override public Void apply(Location location, Rotation rotation, int recursions) { - System.out.println("executing structure function"); Vector2 xz = new Vector2(x.apply(location, rotation, recursions).doubleValue(), z.apply(location, rotation, recursions).doubleValue()); diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index d59a7bd8e..667d9a1d5 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -51,9 +51,9 @@ public class ParserTest { long t = System.nanoTime() - l; System.out.println("Took " + (double) t / 1000000); - block.apply(null, Rotation.NONE, recursions); + block.apply(null, Rotation.NONE, 0); - block.apply(null, Rotation.NONE, recursions); + block.apply(null, Rotation.NONE, 0); } private static class Test1 implements Function { diff --git a/common/src/test/java/structure/TokenizerTest.java b/common/src/test/java/structure/TokenizerTest.java index fe7a01ae4..73e0fd6e2 100644 --- a/common/src/test/java/structure/TokenizerTest.java +++ b/common/src/test/java/structure/TokenizerTest.java @@ -11,7 +11,7 @@ import java.io.IOException; public class TokenizerTest { @Test public void tokens() throws IOException, TokenizerException { - Tokenizer tokenizer = new Tokenizer(IOUtils.toString(getClass().getResourceAsStream("/target/server/plugins/Terra/test.tesf"))); + Tokenizer tokenizer = new Tokenizer(IOUtils.toString(getClass().getResourceAsStream("/test.tesf"))); // Actual run long l = System.nanoTime(); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java index d405787dc..6dd51cc08 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java @@ -2,12 +2,21 @@ package com.dfsek.terra.bukkit.command.command.structure; import com.dfsek.terra.bukkit.command.PlayerCommand; import com.dfsek.terra.bukkit.structure.WorldEditUtil; +import org.bukkit.Bukkit; import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.block.Sign; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; import java.util.Collections; import java.util.List; @@ -19,10 +28,71 @@ public class ExportCommand extends PlayerCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { Location[] l = WorldEditUtil.getSelectionLocations(sender); - /*if(l == null) return true; + if(l == null) return true; Location l1 = l[0]; Location l2 = l[1]; + + StringBuilder scriptBuilder = new StringBuilder("id \"" + args[0] + "\";\nnum y = 0;\n"); + + int centerX = 0; + int centerY = 0; + int centerZ = 0; + + for(int x = l1.getBlockX(); x <= l2.getBlockX(); x++) { + for(int y = l1.getBlockY(); y <= l2.getBlockY(); y++) { + for(int z = l1.getBlockZ(); z <= l2.getBlockZ(); z++) { + Block block = new Location(l1.getWorld(), x, y, z).getBlock(); + BlockState state = block.getState(); + if(state instanceof Sign) { + Sign sign = (Sign) state; + if(sign.getLine(0).equals("[TERRA]") && sign.getLine(1).equals("[CENTER]")) { + centerX = x - l1.getBlockX(); + centerY = y - l1.getBlockY(); + centerZ = z - l1.getBlockZ(); + } + } + } + } + } + + for(int x = l1.getBlockX(); x <= l2.getBlockX(); x++) { + for(int y = l1.getBlockY(); y <= l2.getBlockY(); y++) { + for(int z = l1.getBlockZ(); z <= l2.getBlockZ(); z++) { + Block block = new Location(l1.getWorld(), x, y, z).getBlock(); + if(block.getType().equals(Material.STRUCTURE_VOID)) continue; + scriptBuilder.append("block(").append(x - l1.getBlockX() - centerX).append(", y + ").append(y - l1.getBlockY() - centerY).append(", ").append(z - l1.getBlockZ() - centerZ).append(", ") + .append("\""); + BlockState state = block.getState(); + if(state instanceof Sign) { + Sign sign = (Sign) state; + if(sign.getLine(0).equals("[TERRA]")) { + scriptBuilder.append(Bukkit.createBlockData(sign.getLine(2) + sign.getLine(3)).getAsString(false)); + } + } else { + scriptBuilder.append(block.getBlockData().getAsString(false)); + } + scriptBuilder.append("\");\n"); + } + } + } + + File file = new File(getMain().getDataFolder() + File.separator + "export" + File.separator + "structures", args[0] + ".tesf"); + try { + file.getParentFile().mkdirs(); + file.createNewFile(); + } catch(IOException e) { + e.printStackTrace(); + } + try(BufferedWriter writer = new BufferedWriter(new FileWriter(file))) { + writer.write(scriptBuilder.toString()); + } catch(IOException e) { + e.printStackTrace(); + } + + + + /* Structure structure; try { structure = new Structure(l1, l2, args[0]); From fc82eff93bb9f112317741a63a2abd615386355c Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 23 Dec 2020 23:03:42 -0700 Subject: [PATCH 102/210] add remapShadedJar task to Fabric --- platforms/fabric/build.gradle.kts | 7 +++++++ .../com/dfsek/terra/fabric/TerraFabricPlugin.java | 15 +++++++++++++-- .../fabric/src/main/resources/terra.accesswidener | 1 + 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/platforms/fabric/build.gradle.kts b/platforms/fabric/build.gradle.kts index f8fe56354..78d279159 100644 --- a/platforms/fabric/build.gradle.kts +++ b/platforms/fabric/build.gradle.kts @@ -1,5 +1,6 @@ import com.dfsek.terra.configureCommon import net.fabricmc.loom.LoomGradleExtension +import net.fabricmc.loom.task.RemapJarTask buildscript { repositories { @@ -29,6 +30,12 @@ configure { accessWidener("src/main/resources/terra.accesswidener") } +tasks.register("remapShadedJar") { + setProperty("input", file("build/libs/fabric-${version}-shaded.jar")) + setProperty("addNestedDependencies", false) + setProperty("remapAccessWidener", true) +} + dependencies { "shadedApi"(project(":common")) "shadedImplementation"("org.yaml:snakeyaml:1.27") diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 2d9a3ebe6..21633edad 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -92,7 +92,17 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { .add("LARGE_SPRUCE", ConfiguredFeatures.PINE) .add("SMALL_JUNGLE", ConfiguredFeatures.JUNGLE_TREE) .add("SWAMP_OAK", ConfiguredFeatures.SWAMP_TREE) - .add("TALL_BIRCH", ConfiguredFeatures.BIRCH_TALL)).build(); + .add("TALL_BIRCH", ConfiguredFeatures.BIRCH_TALL) + .add("ACACIA", ConfiguredFeatures.ACACIA) + .add("BIRCH", ConfiguredFeatures.BIRCH) + .add("DARK_OAK", ConfiguredFeatures.DARK_OAK) + .add("OAK", ConfiguredFeatures.OAK) + .add("CHORUS_PLANT", ConfiguredFeatures.CHORUS_PLANT) + .add("SPRUCE", ConfiguredFeatures.SPRUCE) + .add("JUNGLE_BUSH", ConfiguredFeatures.JUNGLE_BUSH) + .add("MEGA_SPRUCE", ConfiguredFeatures.MEGA_SPRUCE) + .add("CRIMSON_FUNGUS", ConfiguredFeatures.CRIMSON_FUNGI) + .add("WARPED_FUNGUS", ConfiguredFeatures.WARPED_FUNGI)).build(); private final PluginConfig plugin = new PluginConfig(); @Override @@ -160,7 +170,8 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { @Override public void saveDefaultConfig() { try(InputStream stream = getClass().getResourceAsStream("/config.yml")) { - FileUtils.copyInputStreamToFile(stream, new File(getDataFolder(), "config.yml")); + File configFile = new File(getDataFolder(), "config.yml"); + if(!configFile.exists()) FileUtils.copyInputStreamToFile(stream, configFile); } catch(IOException e) { e.printStackTrace(); } diff --git a/platforms/fabric/src/main/resources/terra.accesswidener b/platforms/fabric/src/main/resources/terra.accesswidener index 56b2a20c4..edfa21bd4 100644 --- a/platforms/fabric/src/main/resources/terra.accesswidener +++ b/platforms/fabric/src/main/resources/terra.accesswidener @@ -1,5 +1,6 @@ accessWidener v1 named extendable method net/minecraft/client/world/GeneratorType (Ljava/lang/String;)V + accessible field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties; mutable field net/minecraft/server/world/ServerWorld worldProperties Lnet/minecraft/world/level/ServerWorldProperties; \ No newline at end of file From 5d6b060deebad0d932f45a8f9f23854640c4c676 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 24 Dec 2020 02:06:05 -0700 Subject: [PATCH 103/210] Add math functions --- .../terra/api/structures/parser/Parser.java | 58 ++++++++++++++----- .../lang/functions/builtin/AbsFunction.java | 32 ++++++++++ .../lang/functions/builtin/MathFunction.java | 22 +++++++ .../lang/functions/builtin/PowFunction.java | 34 +++++++++++ .../lang/functions/builtin/SqrtFunction.java | 32 ++++++++++ 5 files changed, 165 insertions(+), 13 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/MathFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 0826ff12c..0e17da62f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -11,6 +11,9 @@ import com.dfsek.terra.api.structures.parser.lang.constants.NumericConstant; import com.dfsek.terra.api.structures.parser.lang.constants.StringConstant; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.parser.lang.functions.builtin.AbsFunction; +import com.dfsek.terra.api.structures.parser.lang.functions.builtin.PowFunction; +import com.dfsek.terra.api.structures.parser.lang.functions.builtin.SqrtFunction; import com.dfsek.terra.api.structures.parser.lang.keywords.BreakKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.ContinueKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword; @@ -42,14 +45,18 @@ import com.dfsek.terra.api.structures.tokenizer.Token; import com.dfsek.terra.api.structures.tokenizer.Tokenizer; import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; import com.dfsek.terra.api.util.GlueList; +import com.google.common.collect.Sets; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; public class Parser { private final String data; private final Map>> functions = new HashMap<>(); + private final Set builtinFunctions = Sets.newHashSet("abs", "sqrt", "pow"); + private String id; public Parser(String data) { @@ -141,7 +148,8 @@ public class Parser { } else if(id.getType().equals(Token.Type.GROUP_BEGIN)) { // Parse grouped expression expression = parseGroup(tokens, variableMap); } else { - if(functions.containsKey(id.getContent())) expression = parseFunction(tokens, false, variableMap); + if(functions.containsKey(id.getContent()) || builtinFunctions.contains(id.getContent())) + expression = parseFunction(tokens, false, variableMap); else if(variableMap.containsKey(id.getContent())) { ParserUtil.checkType(tokens.remove(0), Token.Type.IDENTIFIER); expression = new Getter(variableMap.get(id.getContent())); @@ -280,7 +288,7 @@ public class Parser { ParserUtil.checkType(name, Token.Type.IDENTIFIER); // Name must be an identifier. - if(functions.containsKey(name.getContent()) || parsedVariables.containsKey(name.getContent())) + if(functions.containsKey(name.getContent()) || parsedVariables.containsKey(name.getContent()) || builtinFunctions.contains(name.getContent())) throw new ParseException(name.getContent() + " is already defined in this scope: " + name.getPosition()); parsedVariables.put(name.getContent(), temp); @@ -313,11 +321,12 @@ public class Parser { return new Assignment<>((Variable) variable, (Returnable) expression, name.getPosition()); } + @SuppressWarnings("unchecked") private Function parseFunction(List tokens, boolean fullStatement, Map> variableMap) throws ParseException { Token identifier = tokens.remove(0); ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier - if(!functions.containsKey(identifier.getContent())) + if(!functions.containsKey(identifier.getContent()) && !builtinFunctions.contains(identifier.getContent())) throw new ParseException("No such function " + identifier.getContent() + ": " + identifier.getPosition()); ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); // Second is body begin @@ -325,22 +334,45 @@ public class Parser { List> args = getArgs(tokens, variableMap); // Extract arguments, consume the rest. - tokens.remove(0); // Remove body end + ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_END); // Remove body end if(fullStatement) ParserUtil.checkType(tokens.get(0), Token.Type.STATEMENT_END); - FunctionBuilder builder = functions.get(identifier.getContent()); + if(functions.containsKey(identifier.getContent())) { + FunctionBuilder builder = functions.get(identifier.getContent()); - if(builder.argNumber() != -1 && args.size() != builder.argNumber()) - throw new ParseException("Expected " + builder.argNumber() + " arguments, found " + args.size() + ": " + identifier.getPosition()); + if(builder.argNumber() != -1 && args.size() != builder.argNumber()) + throw new ParseException("Expected " + builder.argNumber() + " arguments, found " + args.size() + ": " + identifier.getPosition()); - for(int i = 0; i < args.size(); i++) { - Returnable argument = args.get(i); - if(builder.getArgument(i) == null) - throw new ParseException("Unexpected argument at position " + i + " in function " + identifier.getContent() + ": " + identifier.getPosition()); - ParserUtil.checkReturnType(argument, builder.getArgument(i)); + for(int i = 0; i < args.size(); i++) { + Returnable argument = args.get(i); + if(builder.getArgument(i) == null) + throw new ParseException("Unexpected argument at position " + i + " in function " + identifier.getContent() + ": " + identifier.getPosition()); + ParserUtil.checkReturnType(argument, builder.getArgument(i)); + } + return builder.build(args, identifier.getPosition()); + } else { + switch(identifier.getContent()) { + case "abs": + ParserUtil.checkReturnType(args.get(0), Returnable.ReturnType.NUMBER); + if(args.size() != 1) + throw new ParseException("Expected 1 arguments; found " + args.size() + ": " + identifier.getPosition()); + return new AbsFunction(identifier.getPosition(), (Returnable) args.get(0)); + case "sqrt": + ParserUtil.checkReturnType(args.get(0), Returnable.ReturnType.NUMBER); + if(args.size() != 1) + throw new ParseException("Expected 1 arguments; found " + args.size() + ": " + identifier.getPosition()); + return new SqrtFunction(identifier.getPosition(), (Returnable) args.get(0)); + case "pow": + ParserUtil.checkReturnType(args.get(0), Returnable.ReturnType.NUMBER); + ParserUtil.checkReturnType(args.get(1), Returnable.ReturnType.NUMBER); + if(args.size() != 2) + throw new ParseException("Expected 1 arguments; found " + args.size() + ": " + identifier.getPosition()); + return new PowFunction(identifier.getPosition(), (Returnable) args.get(0), (Returnable) args.get(1)); + default: + throw new UnsupportedOperationException("Unsupported function: " + identifier.getContent()); + } } - return builder.build(args, identifier.getPosition()); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java new file mode 100644 index 000000000..fa70f33f2 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.api.structures.parser.lang.functions.builtin; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; + +public class AbsFunction extends MathFunction { + private final Returnable returnable; + + public AbsFunction(Position position, Returnable returnable) { + super(position); + this.returnable = returnable; + } + + @Override + public String name() { + return "abs"; + } + + @Override + public Number apply(Location location, Rotation rotation, int recursions) { + return FastMath.abs(returnable.apply(location, rotation, recursions).doubleValue()); + } + + @Override + public Number apply(Location location, Chunk chunk, Rotation rotation, int recursions) { + return FastMath.abs(returnable.apply(location, chunk, rotation, recursions).doubleValue()); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/MathFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/MathFunction.java new file mode 100644 index 000000000..f05da3b83 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/MathFunction.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.api.structures.parser.lang.functions.builtin; + +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public abstract class MathFunction implements Function { + private final Position position; + + protected MathFunction(Position position) { + this.position = position; + } + + @Override + public ReturnType returnType() { + return ReturnType.NUMBER; + } + + @Override + public Position getPosition() { + return position; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java new file mode 100644 index 000000000..0b09d3c48 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.api.structures.parser.lang.functions.builtin; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; + +public class PowFunction extends MathFunction { + private final Returnable base; + private final Returnable power; + + public PowFunction(Position position, Returnable base, Returnable power) { + super(position); + this.base = base; + this.power = power; + } + + @Override + public String name() { + return "pow"; + } + + @Override + public Number apply(Location location, Rotation rotation, int recursions) { + return FastMath.pow(base.apply(location, rotation, recursions).doubleValue(), power.apply(location, rotation, recursions).doubleValue()); + } + + @Override + public Number apply(Location location, Chunk chunk, Rotation rotation, int recursions) { + return FastMath.pow(base.apply(location, chunk, rotation, recursions).doubleValue(), power.apply(location, chunk, rotation, recursions).doubleValue()); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java new file mode 100644 index 000000000..62ade97be --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.api.structures.parser.lang.functions.builtin; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; + +public class SqrtFunction extends MathFunction { + private final Returnable returnable; + + public SqrtFunction(Position position, Returnable returnable) { + super(position); + this.returnable = returnable; + } + + @Override + public String name() { + return "sqrt"; + } + + @Override + public Number apply(Location location, Rotation rotation, int recursions) { + return FastMath.sqrt(returnable.apply(location, rotation, recursions).doubleValue()); + } + + @Override + public Number apply(Location location, Chunk chunk, Rotation rotation, int recursions) { + return FastMath.sqrt(returnable.apply(location, chunk, rotation, recursions).doubleValue()); + } +} From 9adc03d56b3e2425aa02028b35f5361764769286 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 24 Dec 2020 02:06:19 -0700 Subject: [PATCH 104/210] Reimplement structure trees with TerraScripts --- .../api/structures/parser/lang/Block.java | 4 +- .../parser/lang/variables/Assignment.java | 4 +- .../parser/lang/variables/Getter.java | 4 +- .../dfsek/terra/config/base/ConfigPack.java | 23 ++++++---- .../terra/config/templates/TreeTemplate.java | 10 ++--- .../generation/items/tree/TerraTree.java | 45 +++---------------- .../dfsek/terra/registry/TreeRegistry.java | 6 +++ 7 files changed, 37 insertions(+), 59 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index 5a3f7a975..0232213c1 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -21,7 +21,7 @@ public class Block implements Item { } @Override - public ReturnLevel apply(Location location, Rotation rotation, int recursions) { + public synchronized ReturnLevel apply(Location location, Rotation rotation, int recursions) { for(Item item : items) { Object result = item.apply(location, rotation, recursions); if(result instanceof ReturnLevel) { @@ -33,7 +33,7 @@ public class Block implements Item { } @Override - public ReturnLevel apply(Location location, Chunk chunk, Rotation rotation, int recursions) { + public synchronized ReturnLevel apply(Location location, Chunk chunk, Rotation rotation, int recursions) { for(Item item : items) { Object result = item.apply(location, chunk, rotation, recursions); if(result instanceof ReturnLevel) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java index 169e4b4d8..9aae90bfe 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java @@ -19,14 +19,14 @@ public class Assignment implements Item { } @Override - public T apply(Location location, Rotation rotation, int recursions) { + public synchronized T apply(Location location, Rotation rotation, int recursions) { T val = value.apply(location, rotation, recursions); delegate.setValue(val); return val; } @Override - public T apply(Location location, Chunk chunk, Rotation rotation, int recursions) { + public synchronized T apply(Location location, Chunk chunk, Rotation rotation, int recursions) { T val = value.apply(location, chunk, rotation, recursions); delegate.setValue(val); return val; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java index 2383e0a5a..fe2804c72 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java @@ -19,12 +19,12 @@ public class Getter implements Returnable { } @Override - public Object apply(Location location, Rotation rotation, int recursions) { + public synchronized Object apply(Location location, Rotation rotation, int recursions) { return delegate.getValue(); } @Override - public Object apply(Location location, Chunk chunk, Rotation rotation, int recursions) { + public synchronized Object apply(Location location, Chunk chunk, Rotation rotation, int recursions) { return delegate.getValue(); } diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 8fdda699f..b9d63aacc 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -25,6 +25,7 @@ import com.dfsek.terra.config.factories.FloraFactory; import com.dfsek.terra.config.factories.OreFactory; import com.dfsek.terra.config.factories.PaletteFactory; import com.dfsek.terra.config.factories.TerraFactory; +import com.dfsek.terra.config.factories.TreeFactory; import com.dfsek.terra.config.files.FolderLoader; import com.dfsek.terra.config.files.Loader; import com.dfsek.terra.config.files.ZIPLoader; @@ -37,6 +38,7 @@ import com.dfsek.terra.config.templates.CarverTemplate; import com.dfsek.terra.config.templates.FloraTemplate; import com.dfsek.terra.config.templates.OreTemplate; import com.dfsek.terra.config.templates.PaletteTemplate; +import com.dfsek.terra.config.templates.TreeTemplate; import com.dfsek.terra.generation.items.TerraStructure; import com.dfsek.terra.generation.items.ores.Ore; import com.dfsek.terra.registry.BiomeGridRegistry; @@ -143,20 +145,22 @@ public class ConfigPack implements LoaderRegistrar { } abstractConfigLoader .registerLoader(LootTable.class, new LootTableLoader(loader, main)); // These loaders need access to the Loader instance to get files. - loader - .open("palettes", ".yml").then(streams -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.load(streams, PaletteTemplate::new), main)).close() - .open("ores", ".yml").then(streams -> buildAll(new OreFactory(), oreRegistry, abstractConfigLoader.load(streams, OreTemplate::new), main)).close() - .open("flora", ".yml").then(streams -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.load(streams, FloraTemplate::new), main)).close() - .open("carving", ".yml").then(streams -> buildAll(new CarverFactory(this), carverRegistry, abstractConfigLoader.load(streams, CarverTemplate::new), main)).close() - .open("biomes", ".yml").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this, main)), main)).close() - .open("grids", ".yml").then(streams -> buildAll(new BiomeGridFactory(), biomeGridRegistry, abstractConfigLoader.load(streams, BiomeGridTemplate::new), main)).close(); - loader.open("structures/data", ".tesf").then(streams -> streams.forEach(stream -> { StructureScript structureScript = new StructureScript(stream, main, scriptRegistry); scriptRegistry.add(structureScript.getId(), structureScript); })).close(); + loader + .open("palettes", ".yml").then(streams -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.load(streams, PaletteTemplate::new), main)).close() + .open("ores", ".yml").then(streams -> buildAll(new OreFactory(), oreRegistry, abstractConfigLoader.load(streams, OreTemplate::new), main)).close() + .open("structures/trees", ".yml").then(streams -> buildAll(new TreeFactory(), treeRegistry, abstractConfigLoader.load(streams, TreeTemplate::new), main)).close() + .open("flora", ".yml").then(streams -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.load(streams, FloraTemplate::new), main)).close() + .open("carving", ".yml").then(streams -> buildAll(new CarverFactory(this), carverRegistry, abstractConfigLoader.load(streams, CarverTemplate::new), main)).close() + .open("biomes", ".yml").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this, main)), main)).close() + .open("grids", ".yml").then(streams -> buildAll(new BiomeGridFactory(), biomeGridRegistry, abstractConfigLoader.load(streams, BiomeGridTemplate::new), main)).close(); + + for(UserDefinedBiome b : biomeRegistry.entries()) { try { Objects.requireNonNull(b.getErode()); // Throws NPE if it cannot load erosion biomes. @@ -237,7 +241,8 @@ public class ConfigPack implements LoaderRegistrar { .registerLoader(UserDefinedCarver.class, carverRegistry) .registerLoader(Flora.class, floraRegistry) .registerLoader(Ore.class, oreRegistry) - .registerLoader(Tree.class, treeRegistry); + .registerLoader(Tree.class, treeRegistry) + .registerLoader(StructureScript.class, scriptRegistry); } public ScriptRegistry getScriptRegistry() { diff --git a/common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java index 67f0f6a41..f872d5603 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java @@ -3,14 +3,14 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.util.MaterialSet; @SuppressWarnings({"unused", "FieldMayBeFinal"}) public class TreeTemplate extends AbstractableTemplate { - @Value("files") + @Value("script") @Abstractable - private ProbabilityCollection structures; + private StructureScript structure; @Value("id") private String id; @@ -24,8 +24,8 @@ public class TreeTemplate extends AbstractableTemplate { @Abstractable private MaterialSet spawnable; - public ProbabilityCollection getStructures() { - return structures; + public StructureScript getStructures() { + return structure; } public String getID() { diff --git a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index 84a3905e2..dfec790cf 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -1,8 +1,8 @@ package com.dfsek.terra.generation.items.tree; -import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.script.StructureScript; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.util.MaterialSet; @@ -11,26 +11,18 @@ import java.util.Random; public class TerraTree implements Tree { private final MaterialSet spawnable; private final int yOffset; - private final ProbabilityCollection structure; + private final StructureScript structure; - public TerraTree(MaterialSet spawnable, int yOffset, ProbabilityCollection structure) { + public TerraTree(MaterialSet spawnable, int yOffset, StructureScript structure) { this.spawnable = spawnable; this.yOffset = yOffset; this.structure = structure; } @Override - public boolean plant(Location location, Random random) { - /* - Location mut = location.clone().subtract(0, yOffset, 0); - if(!spawnable.contains(location.getBlock().getType())) return false; - Structure struc = structure.get(random); - Rotation rotation = Rotation.fromDegrees(random.nextInt(4) * 90); - if(!struc.checkSpawns(mut, rotation, null)) return false; - struc.paste(mut, rotation, null);*/ + public synchronized boolean plant(Location location, Random random) { + structure.execute(location.clone().add(0, yOffset, 0), Rotation.fromDegrees(90 * random.nextInt(4)), 0); return true; - - } @Override @@ -38,29 +30,4 @@ public class TerraTree implements Tree { return spawnable; } - public boolean plantBlockCheck(Location location, Random random, TerraPlugin main) { - /* - Location mut = location.clone().subtract(0, yOffset, 0); - if(!spawnable.contains(location.getBlock().getType())) return false; - Structure struc = structure.get(random); - Rotation rotation = Rotation.fromDegrees(random.nextInt(4) * 90); - StructureInfo info = struc.getStructureInfo(); - for(StructureContainedBlock spawn : struc.getSpawns()) { - Vector2 rot = RotationUtil.rotateVector(new Vector2(spawn.getX() - info.getCenterX(), spawn.getZ() - info.getCenterZ()), rotation); - int x = (int) rot.getX(); - int z = (int) rot.getZ(); - switch(spawn.getRequirement()) { - case AIR: - if(!mut.clone().add(x, spawn.getY() - 1, z).getBlock().isPassable()) return false; - break; - case LAND: - if(!mut.clone().add(x, spawn.getY() - 1, z).getBlock().getType().isSolid()) return false; - break; - } - } - struc.paste(mut, rotation, main); - - */ - return true; - } } diff --git a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java index b9c6f0a6a..0c145a06c 100644 --- a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java @@ -68,6 +68,12 @@ public class TreeRegistry extends TerraRegistry { } } + @Override + public boolean add(String name, Tree value) { + System.out.println("Added " + name); + return super.add(name, value); + } + private final class FractalTreeHolder implements Tree { private final FractalTree tree; From 7127943298977e72aac29c3b297c12b8b030f502 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 24 Dec 2020 02:17:46 -0700 Subject: [PATCH 105/210] remove chunk apply method --- .../terra/api/structures/parser/lang/Block.java | 13 ------------- .../terra/api/structures/parser/lang/Item.java | 3 --- .../lang/constants/ConstantExpression.java | 7 ------- .../lang/functions/builtin/AbsFunction.java | 6 ------ .../lang/functions/builtin/PowFunction.java | 6 ------ .../lang/functions/builtin/SqrtFunction.java | 6 ------ .../parser/lang/keywords/BreakKeyword.java | 6 ------ .../parser/lang/keywords/ContinueKeyword.java | 6 ------ .../parser/lang/keywords/IfKeyword.java | 7 ------- .../parser/lang/keywords/ReturnKeyword.java | 6 ------ .../parser/lang/keywords/WhileKeyword.java | 11 ----------- .../parser/lang/operations/BinaryOperation.java | 6 ------ .../parser/lang/operations/UnaryOperation.java | 6 ------ .../parser/lang/variables/Assignment.java | 8 -------- .../structures/parser/lang/variables/Getter.java | 6 ------ .../api/structures/script/StructureScript.java | 5 ----- .../script/functions/BlockFunction.java | 7 ------- .../script/functions/CheckFunction.java | 16 ++++------------ .../script/functions/RandomFunction.java | 6 ------ .../script/functions/RecursionsFunction.java | 6 ------ .../script/functions/StructureFunction.java | 6 ------ common/src/test/java/structure/ParserTest.java | 6 ------ 22 files changed, 4 insertions(+), 151 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index 0232213c1..805e219ad 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; @@ -32,18 +31,6 @@ public class Block implements Item { return ReturnLevel.NONE; } - @Override - public synchronized ReturnLevel apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - for(Item item : items) { - Object result = item.apply(location, chunk, rotation, recursions); - if(result instanceof ReturnLevel) { - ReturnLevel level = (ReturnLevel) result; - if(!level.equals(ReturnLevel.NONE)) return level; - } - } - return ReturnLevel.NONE; - } - @Override public Position getPosition() { return position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java index 4ec95cbfd..7e9e3f476 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java @@ -1,14 +1,11 @@ package com.dfsek.terra.api.structures.parser.lang; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; public interface Item { T apply(Location location, Rotation rotation, int recursions); - T apply(Location location, Chunk chunk, Rotation rotation, int recursions); - Position getPosition(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java index a4b54c470..cfc24b5e2 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang.constants; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; @@ -20,12 +19,6 @@ public abstract class ConstantExpression implements Returnable { return constant; } - - @Override - public T apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return constant; - } - @Override public Position getPosition() { return position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java index fa70f33f2..743fed554 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang.functions.builtin; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; @@ -24,9 +23,4 @@ public class AbsFunction extends MathFunction { public Number apply(Location location, Rotation rotation, int recursions) { return FastMath.abs(returnable.apply(location, rotation, recursions).doubleValue()); } - - @Override - public Number apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return FastMath.abs(returnable.apply(location, chunk, rotation, recursions).doubleValue()); - } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java index 0b09d3c48..806dd5f82 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang.functions.builtin; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; @@ -26,9 +25,4 @@ public class PowFunction extends MathFunction { public Number apply(Location location, Rotation rotation, int recursions) { return FastMath.pow(base.apply(location, rotation, recursions).doubleValue(), power.apply(location, rotation, recursions).doubleValue()); } - - @Override - public Number apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return FastMath.pow(base.apply(location, chunk, rotation, recursions).doubleValue(), power.apply(location, chunk, rotation, recursions).doubleValue()); - } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java index 62ade97be..7ba11cb5c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang.functions.builtin; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; @@ -24,9 +23,4 @@ public class SqrtFunction extends MathFunction { public Number apply(Location location, Rotation rotation, int recursions) { return FastMath.sqrt(returnable.apply(location, rotation, recursions).doubleValue()); } - - @Override - public Number apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return FastMath.sqrt(returnable.apply(location, chunk, rotation, recursions).doubleValue()); - } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java index ac03e792e..72c0bd474 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang.keywords; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.structure.Rotation; @@ -19,11 +18,6 @@ public class BreakKeyword implements Keyword { return Block.ReturnLevel.BREAK; } - @Override - public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return Block.ReturnLevel.BREAK; - } - @Override public Position getPosition() { return position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java index 67ac5a0b2..c9f13216b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang.keywords; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.structure.Rotation; @@ -19,11 +18,6 @@ public class ContinueKeyword implements Keyword { return Block.ReturnLevel.CONTINUE; } - @Override - public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return Block.ReturnLevel.CONTINUE; - } - @Override public Position getPosition() { return position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java index 8d51f7d10..ad2f974b5 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang.keywords; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.parser.lang.Returnable; @@ -25,12 +24,6 @@ public class IfKeyword implements Keyword { return Block.ReturnLevel.NONE; } - @Override - public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - if(statement.apply(location, chunk, rotation, recursions)) return conditional.apply(location, chunk, rotation, recursions); - return Block.ReturnLevel.NONE; - } - @Override public Position getPosition() { return position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java index c4c46b151..a9f1edb99 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang.keywords; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.structure.Rotation; @@ -19,11 +18,6 @@ public class ReturnKeyword implements Keyword { return Block.ReturnLevel.RETURN; } - @Override - public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return Block.ReturnLevel.RETURN; - } - @Override public Position getPosition() { return position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java index 889f279f9..f147880ab 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang.keywords; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.parser.lang.Returnable; @@ -29,16 +28,6 @@ public class WhileKeyword implements Keyword { return Block.ReturnLevel.NONE; } - @Override - public Block.ReturnLevel apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - while(statement.apply(location, chunk, rotation, recursions)) { - Block.ReturnLevel level = conditional.apply(location, chunk, rotation, recursions); - if(level.equals(Block.ReturnLevel.BREAK)) break; - if(level.equals(Block.ReturnLevel.RETURN)) return Block.ReturnLevel.RETURN; - } - return Block.ReturnLevel.NONE; - } - @Override public Position getPosition() { return position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java index a9c1e7f51..ca79f3638 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang.operations; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; @@ -28,9 +27,4 @@ public abstract class BinaryOperation implements Returnable { public O apply(Location location, Rotation rotation, int recursions) { return apply(left.apply(location, rotation, recursions), right.apply(location, rotation, recursions)); } - - @Override - public O apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return apply(left.apply(location, chunk, rotation, recursions), right.apply(location, chunk, rotation, recursions)); - } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java index 689edd476..69e6b0a88 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang.operations; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; @@ -22,11 +21,6 @@ public abstract class UnaryOperation implements Returnable { return apply(input.apply(location, rotation, recursions)); } - @Override - public T apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return apply(input.apply(location, chunk, rotation, recursions)); - } - @Override public Position getPosition() { return position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java index 9aae90bfe..d58949728 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang.variables; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; @@ -25,13 +24,6 @@ public class Assignment implements Item { return val; } - @Override - public synchronized T apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - T val = value.apply(location, chunk, rotation, recursions); - delegate.setValue(val); - return val; - } - @Override public Position getPosition() { return position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java index fe2804c72..e3d32338d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.parser.lang.variables; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; @@ -23,11 +22,6 @@ public class Getter implements Returnable { return delegate.getValue(); } - @Override - public synchronized Object apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return delegate.getValue(); - } - @Override public Position getPosition() { return delegate.getPosition(); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 7c850ed9c..59cbdf81b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -2,7 +2,6 @@ package com.dfsek.terra.api.structures.script; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; @@ -47,10 +46,6 @@ public class StructureScript { block.apply(location, rotation, recursions); } - public void execute(Location location, Chunk chunk, Rotation rotation, int recursions) { - block.apply(location, chunk, rotation, recursions); - } - public String getId() { return id; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index 8e29c3d71..619c8f6fa 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -4,7 +4,6 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression; @@ -44,12 +43,6 @@ public class BlockFunction implements Function { return null; } - @Override - public Void apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - //TODO: do - return null; - } - @Override public Position getPosition() { return position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index c36188658..02219c679 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -4,7 +4,6 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; @@ -33,19 +32,17 @@ public class CheckFunction implements Function { return "check"; } - private Vector3 getVector(Location location, Chunk chunk, Rotation rotation, int recursions) { - Vector2 xz = chunk == null ? new Vector2(x.apply(location, rotation, recursions).doubleValue(), z.apply(location, rotation, recursions).doubleValue()) - : new Vector2(x.apply(location, chunk, rotation, recursions).doubleValue(), z.apply(location, chunk, rotation, recursions).doubleValue()); + private Vector3 getVector(Location location, Rotation rotation, int recursions) { + Vector2 xz = new Vector2(x.apply(location, rotation, recursions).doubleValue(), z.apply(location, rotation, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); - return location.clone().add(chunk == null ? new Vector3(FastMath.roundToInt(xz.getX()), y.apply(location, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ())) - : new Vector3(FastMath.roundToInt(xz.getX()), y.apply(location, chunk, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))).toVector(); + return new Vector3(FastMath.roundToInt(xz.getX()), y.apply(location, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ())); } @Override public String apply(Location location, Rotation rotation, int recursions) { - return apply(getVector(location, null, rotation, recursions), location.getWorld()); + return apply(getVector(location, rotation, recursions), location.getWorld()); } private String apply(Vector3 vector, World world) { @@ -56,11 +53,6 @@ public class CheckFunction implements Function { return "AIR"; } - @Override - public String apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return apply(getVector(location, chunk, rotation, recursions), location.getWorld()); - } - @Override public Position getPosition() { return position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java index c65b5d598..33424aac9 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.structure.Rotation; @@ -34,11 +33,6 @@ public class RandomFunction implements Function { return ThreadLocalRandom.current().nextInt(numberReturnable.apply(location, rotation, recursions).intValue()); // TODO: deterministic random } - @Override - public Integer apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return ThreadLocalRandom.current().nextInt(numberReturnable.apply(location, chunk, rotation, recursions).intValue()); - } - @Override public Position getPosition() { return position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java index 2089f6af9..e0c53abbc 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.tokenizer.Position; @@ -28,11 +27,6 @@ public class RecursionsFunction implements Function { return recursions; } - @Override - public Number apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return recursions; - } - @Override public Position getPosition() { return position; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index f55b604d3..c85325df8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -3,7 +3,6 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.script.StructureScript; @@ -74,11 +73,6 @@ public class StructureFunction implements Function { return null; } - @Override - public Void apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return null; - } - @Override public Position getPosition() { return position; diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 667d9a1d5..0e47c266b 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -1,7 +1,6 @@ package structure; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; @@ -73,11 +72,6 @@ public class ParserTest { return null; } - @Override - public Void apply(Location location, Chunk chunk, Rotation rotation, int recursions) { - return null; - } - @Override public Position getPosition() { return position; From 058ec9f24d87f9fb1beed72eb1c8f22f062206ec Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 24 Dec 2020 02:40:28 -0700 Subject: [PATCH 106/210] store structures in Buffer --- .../api/structures/parser/lang/Block.java | 6 ++-- .../api/structures/parser/lang/Item.java | 4 +-- .../lang/constants/ConstantExpression.java | 4 +-- .../lang/functions/builtin/AbsFunction.java | 6 ++-- .../lang/functions/builtin/PowFunction.java | 6 ++-- .../lang/functions/builtin/SqrtFunction.java | 6 ++-- .../parser/lang/keywords/BreakKeyword.java | 4 +-- .../parser/lang/keywords/ContinueKeyword.java | 4 +-- .../parser/lang/keywords/IfKeyword.java | 6 ++-- .../parser/lang/keywords/ReturnKeyword.java | 4 +-- .../parser/lang/keywords/WhileKeyword.java | 8 ++--- .../lang/operations/BinaryOperation.java | 6 ++-- .../lang/operations/UnaryOperation.java | 6 ++-- .../parser/lang/variables/Assignment.java | 6 ++-- .../parser/lang/variables/Getter.java | 4 +-- .../structures/script/StructureScript.java | 12 +++++-- .../script/functions/BlockFunction.java | 10 +++--- .../script/functions/CheckFunction.java | 12 +++---- .../script/functions/RandomFunction.java | 6 ++-- .../script/functions/RecursionsFunction.java | 4 +-- .../script/functions/StructureFunction.java | 18 +++++----- .../structures/structure/buffer/Buffer.java | 10 ++++++ .../structure/buffer/BufferedBlock.java | 17 ++++++++++ .../structure/buffer/BufferedItem.java | 7 ++++ .../structure/buffer/IntermediateBuffer.java | 24 ++++++++++++++ .../structure/buffer/StructureBuffer.java | 33 +++++++++++++++++++ .../generation/items/tree/TerraTree.java | 2 +- .../src/test/java/structure/ParserTest.java | 6 ++-- .../structure/load/LoadRawCommand.java | 2 +- 29 files changed, 173 insertions(+), 70 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedBlock.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedItem.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index 805e219ad..a47b19709 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.structures.parser.lang; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.List; @@ -20,9 +20,9 @@ public class Block implements Item { } @Override - public synchronized ReturnLevel apply(Location location, Rotation rotation, int recursions) { + public synchronized ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { for(Item item : items) { - Object result = item.apply(location, rotation, recursions); + Object result = item.apply(buffer, rotation, recursions); if(result instanceof ReturnLevel) { ReturnLevel level = (ReturnLevel) result; if(!level.equals(ReturnLevel.NONE)) return level; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java index 7e9e3f476..3d6299821 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java @@ -1,11 +1,11 @@ package com.dfsek.terra.api.structures.parser.lang; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; public interface Item { - T apply(Location location, Rotation rotation, int recursions); + T apply(Buffer buffer, Rotation rotation, int recursions); Position getPosition(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java index cfc24b5e2..659b26d12 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.structures.parser.lang.constants; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; public abstract class ConstantExpression implements Returnable { @@ -15,7 +15,7 @@ public abstract class ConstantExpression implements Returnable { } @Override - public T apply(Location location, Rotation rotation, int recursions) { + public T apply(Buffer buffer, Rotation rotation, int recursions) { return constant; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java index 743fed554..1bb2e4aea 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.structures.parser.lang.functions.builtin; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; @@ -20,7 +20,7 @@ public class AbsFunction extends MathFunction { } @Override - public Number apply(Location location, Rotation rotation, int recursions) { - return FastMath.abs(returnable.apply(location, rotation, recursions).doubleValue()); + public Number apply(Buffer buffer, Rotation rotation, int recursions) { + return FastMath.abs(returnable.apply(buffer, rotation, recursions).doubleValue()); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java index 806dd5f82..7aa7d6313 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.structures.parser.lang.functions.builtin; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; @@ -22,7 +22,7 @@ public class PowFunction extends MathFunction { } @Override - public Number apply(Location location, Rotation rotation, int recursions) { - return FastMath.pow(base.apply(location, rotation, recursions).doubleValue(), power.apply(location, rotation, recursions).doubleValue()); + public Number apply(Buffer buffer, Rotation rotation, int recursions) { + return FastMath.pow(base.apply(buffer, rotation, recursions).doubleValue(), power.apply(buffer, rotation, recursions).doubleValue()); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java index 7ba11cb5c..2dd10f7a5 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.structures.parser.lang.functions.builtin; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; @@ -20,7 +20,7 @@ public class SqrtFunction extends MathFunction { } @Override - public Number apply(Location location, Rotation rotation, int recursions) { - return FastMath.sqrt(returnable.apply(location, rotation, recursions).doubleValue()); + public Number apply(Buffer buffer, Rotation rotation, int recursions) { + return FastMath.sqrt(returnable.apply(buffer, rotation, recursions).doubleValue()); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java index 72c0bd474..cca02e379 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.structures.parser.lang.keywords; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; public class BreakKeyword implements Keyword { @@ -14,7 +14,7 @@ public class BreakKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Location location, Rotation rotation, int recursions) { + public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { return Block.ReturnLevel.BREAK; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java index c9f13216b..84ecde967 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.structures.parser.lang.keywords; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; public class ContinueKeyword implements Keyword { @@ -14,7 +14,7 @@ public class ContinueKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Location location, Rotation rotation, int recursions) { + public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { return Block.ReturnLevel.CONTINUE; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java index ad2f974b5..678add710 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java @@ -1,10 +1,10 @@ package com.dfsek.terra.api.structures.parser.lang.keywords; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; public class IfKeyword implements Keyword { @@ -19,8 +19,8 @@ public class IfKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Location location, Rotation rotation, int recursions) { - if(statement.apply(location, rotation, recursions)) return conditional.apply(location, rotation, recursions); + public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { + if(statement.apply(buffer, rotation, recursions)) return conditional.apply(buffer, rotation, recursions); return Block.ReturnLevel.NONE; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java index a9f1edb99..0ef544adf 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.structures.parser.lang.keywords; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; public class ReturnKeyword implements Keyword { @@ -14,7 +14,7 @@ public class ReturnKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Location location, Rotation rotation, int recursions) { + public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { return Block.ReturnLevel.RETURN; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java index f147880ab..bdc1f17f3 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java @@ -1,10 +1,10 @@ package com.dfsek.terra.api.structures.parser.lang.keywords; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; public class WhileKeyword implements Keyword { @@ -19,9 +19,9 @@ public class WhileKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Location location, Rotation rotation, int recursions) { - while(statement.apply(location, rotation, recursions)) { - Block.ReturnLevel level = conditional.apply(location, rotation, recursions); + public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { + while(statement.apply(buffer, rotation, recursions)) { + Block.ReturnLevel level = conditional.apply(buffer, rotation, recursions); if(level.equals(Block.ReturnLevel.BREAK)) break; if(level.equals(Block.ReturnLevel.RETURN)) return Block.ReturnLevel.RETURN; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java index ca79f3638..b0940e64e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.structures.parser.lang.operations; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; public abstract class BinaryOperation implements Returnable { @@ -24,7 +24,7 @@ public abstract class BinaryOperation implements Returnable { } @Override - public O apply(Location location, Rotation rotation, int recursions) { - return apply(left.apply(location, rotation, recursions), right.apply(location, rotation, recursions)); + public O apply(Buffer buffer, Rotation rotation, int recursions) { + return apply(left.apply(buffer, rotation, recursions), right.apply(buffer, rotation, recursions)); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java index 69e6b0a88..9af54cf5a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.structures.parser.lang.operations; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; public abstract class UnaryOperation implements Returnable { @@ -17,8 +17,8 @@ public abstract class UnaryOperation implements Returnable { public abstract T apply(T input); @Override - public T apply(Location location, Rotation rotation, int recursions) { - return apply(input.apply(location, rotation, recursions)); + public T apply(Buffer buffer, Rotation rotation, int recursions) { + return apply(input.apply(buffer, rotation, recursions)); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java index d58949728..6fd672db2 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.structures.parser.lang.variables; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; public class Assignment implements Item { @@ -18,8 +18,8 @@ public class Assignment implements Item { } @Override - public synchronized T apply(Location location, Rotation rotation, int recursions) { - T val = value.apply(location, rotation, recursions); + public synchronized T apply(Buffer buffer, Rotation rotation, int recursions) { + T val = value.apply(buffer, rotation, recursions); delegate.setValue(val); return val; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java index e3d32338d..761ee1930 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.structures.parser.lang.variables; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; public class Getter implements Returnable { @@ -18,7 +18,7 @@ public class Getter implements Returnable { } @Override - public synchronized Object apply(Location location, Rotation rotation, int recursions) { + public synchronized Object apply(Buffer buffer, Rotation rotation, int recursions) { return delegate.getValue(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 59cbdf81b..4f1556c58 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -11,6 +11,8 @@ import com.dfsek.terra.api.structures.script.builders.RandomFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RecursionsFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer; import com.dfsek.terra.registry.ScriptRegistry; import org.apache.commons.io.IOUtils; @@ -42,8 +44,14 @@ public class StructureScript { this.id = parser.getID(); } - public void execute(Location location, Rotation rotation, int recursions) { - block.apply(location, rotation, recursions); + public void execute(Location location, Rotation rotation) { + StructureBuffer buffer = new StructureBuffer(location); + block.apply(buffer, rotation, 0); + buffer.paste(); + } + + public void executeInBuffer(Buffer buffer, Rotation rotation, int recursions) { + block.apply(buffer, rotation, recursions); } public String getId() { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index 619c8f6fa..60f2f6c11 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.structures.script.functions; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; @@ -10,6 +10,8 @@ import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.RotationUtil; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.structure.buffer.BufferedBlock; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; @@ -34,12 +36,12 @@ public class BlockFunction implements Function { } @Override - public Void apply(Location location, Rotation rotation, int recursions) { - Vector2 xz = new Vector2(x.apply(location, rotation, recursions).doubleValue(), z.apply(location, rotation, recursions).doubleValue()); + public Void apply(Buffer buffer, Rotation rotation, int recursions) { + Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); - location.clone().add(FastMath.roundToInt(xz.getX()), y.apply(location, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ())).getBlock().setBlockData(data, false); + buffer.addItem(new BufferedBlock(data), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index 02219c679..e4c65683a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -1,6 +1,5 @@ package com.dfsek.terra.api.structures.script.functions; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; @@ -9,6 +8,7 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.RotationUtil; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.world.LandCheck; import com.dfsek.terra.api.structures.world.OceanCheck; @@ -32,17 +32,17 @@ public class CheckFunction implements Function { return "check"; } - private Vector3 getVector(Location location, Rotation rotation, int recursions) { - Vector2 xz = new Vector2(x.apply(location, rotation, recursions).doubleValue(), z.apply(location, rotation, recursions).doubleValue()); + private Vector3 getVector(Buffer buffer, Rotation rotation, int recursions) { + Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); - return new Vector3(FastMath.roundToInt(xz.getX()), y.apply(location, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ())); + return new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ())).add(buffer.getOrigin().toVector()); } @Override - public String apply(Location location, Rotation rotation, int recursions) { - return apply(getVector(location, rotation, recursions), location.getWorld()); + public String apply(Buffer buffer, Rotation rotation, int recursions) { + return apply(getVector(buffer, rotation, recursions), buffer.getOrigin().getWorld()); } private String apply(Vector3 vector, World world) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java index 33424aac9..f07c0a88e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.structures.script.functions; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.concurrent.ThreadLocalRandom; @@ -29,8 +29,8 @@ public class RandomFunction implements Function { } @Override - public Integer apply(Location location, Rotation rotation, int recursions) { - return ThreadLocalRandom.current().nextInt(numberReturnable.apply(location, rotation, recursions).intValue()); // TODO: deterministic random + public Integer apply(Buffer buffer, Rotation rotation, int recursions) { + return ThreadLocalRandom.current().nextInt(numberReturnable.apply(buffer, rotation, recursions).intValue()); // TODO: deterministic random } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java index e0c53abbc..eb7fc7060 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java @@ -1,8 +1,8 @@ package com.dfsek.terra.api.structures.script.functions; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; public class RecursionsFunction implements Function { @@ -23,7 +23,7 @@ public class RecursionsFunction implements Function { } @Override - public Number apply(Location location, Rotation rotation, int recursions) { + public Number apply(Buffer buffer, Rotation rotation, int recursions) { return recursions; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index c85325df8..f6a252565 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -1,13 +1,15 @@ package com.dfsek.terra.api.structures.script.functions; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.RotationUtil; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.structure.buffer.IntermediateBuffer; import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.registry.ScriptRegistry; import net.jafama.FastMath; @@ -45,20 +47,20 @@ public class StructureFunction implements Function { } @Override - public Void apply(Location location, Rotation rotation, int recursions) { + public Void apply(Buffer buffer, Rotation rotation, int recursions) { - Vector2 xz = new Vector2(x.apply(location, rotation, recursions).doubleValue(), z.apply(location, rotation, recursions).doubleValue()); + Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); - StructureScript script = registry.get(id.apply(location, rotation, recursions)); + StructureScript script = registry.get(id.apply(buffer, rotation, recursions)); if(script == null) { - main.getLogger().severe("No such structure " + id.apply(location, rotation, recursions)); + main.getLogger().severe("No such structure " + id.apply(buffer, rotation, recursions)); return null; } Rotation rotation1; - String rotString = rotations.get(ThreadLocalRandom.current().nextInt(rotations.size())).apply(location, rotation, recursions); + String rotString = rotations.get(ThreadLocalRandom.current().nextInt(rotations.size())).apply(buffer, rotation, recursions); try { rotation1 = Rotation.valueOf(rotString); } catch(IllegalArgumentException e) { @@ -66,9 +68,9 @@ public class StructureFunction implements Function { return null; } - Location location1 = location.clone().add(FastMath.roundToInt(xz.getX()), y.apply(location, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ())); + Vector3 offset = new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ())); - script.execute(location1, rotation.rotate(rotation1), recursions + 1); + script.executeInBuffer(new IntermediateBuffer(buffer, offset), rotation.rotate(rotation1), recursions + 1); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java new file mode 100644 index 000000000..d08fcccb4 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.api.structures.structure.buffer; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; + +public interface Buffer { + Buffer addItem(BufferedItem item, Vector3 location); + + Location getOrigin(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedBlock.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedBlock.java new file mode 100644 index 000000000..95ea66058 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedBlock.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.api.structures.structure.buffer; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.BlockData; + +public class BufferedBlock implements BufferedItem { + private final BlockData data; + + public BufferedBlock(BlockData data) { + this.data = data; + } + + @Override + public void paste(Location origin) { + origin.getBlock().setBlockData(data, false); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedItem.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedItem.java new file mode 100644 index 000000000..d9d1f959c --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedItem.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.api.structures.structure.buffer; + +import com.dfsek.terra.api.math.vector.Location; + +public interface BufferedItem { + void paste(Location origin); +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java new file mode 100644 index 000000000..73aee8af8 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java @@ -0,0 +1,24 @@ +package com.dfsek.terra.api.structures.structure.buffer; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; + +public class IntermediateBuffer implements Buffer { + private final Buffer original; + private final Vector3 offset; + + public IntermediateBuffer(Buffer original, Vector3 offset) { + this.original = original; + this.offset = offset; + } + + @Override + public Buffer addItem(BufferedItem item, Vector3 location) { + return original.addItem(item, location.add(offset)); + } + + @Override + public Location getOrigin() { + return original.getOrigin().add(offset); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java new file mode 100644 index 000000000..2eef26a21 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.api.structures.structure.buffer; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; + +import java.util.HashMap; +import java.util.Map; + +public class StructureBuffer implements Buffer { + private final Map bufferedItemMap = new HashMap<>(); + private final Location origin; + + public StructureBuffer(Location origin) { + this.origin = origin; + } + + public void paste() { + bufferedItemMap.forEach(((vector3, item) -> { + item.paste(origin.clone().add(vector3)); + })); + } + + @Override + public Buffer addItem(BufferedItem item, Vector3 location) { + bufferedItemMap.put(location, item); + return this; + } + + @Override + public Location getOrigin() { + return origin; + } +} diff --git a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index dfec790cf..bbe7edd79 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -21,7 +21,7 @@ public class TerraTree implements Tree { @Override public synchronized boolean plant(Location location, Random random) { - structure.execute(location.clone().add(0, yOffset, 0), Rotation.fromDegrees(90 * random.nextInt(4)), 0); + structure.execute(location.clone().add(0, yOffset, 0), Rotation.fromDegrees(90 * random.nextInt(4))); return true; } diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 0e47c266b..f6e75b9ed 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -1,6 +1,5 @@ package structure; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; @@ -8,6 +7,7 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; @@ -67,8 +67,8 @@ public class ParserTest { } @Override - public Void apply(Location location, Rotation rotation, int recursions) { - System.out.println("string: " + a.apply(location, rotation, recursions) + ", double: " + b.apply(location, rotation, recursions)); + public Void apply(Buffer buffer, Rotation rotation, int recursions) { + System.out.println("string: " + a.apply(buffer, rotation, recursions) + ", double: " + b.apply(buffer, rotation, recursions)); return null; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index 92b185ca8..b125ddbbc 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -36,7 +36,7 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { TerraWorld terraWorld = getMain().getWorld(new BukkitWorld(sender.getWorld())); long t = System.nanoTime(); - terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), Rotation.fromDegrees(90 * ThreadLocalRandom.current().nextInt(4)), 0); + terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), Rotation.fromDegrees(90 * ThreadLocalRandom.current().nextInt(4))); long l = System.nanoTime() - t; sender.sendMessage("Took " + ((double) l) / 1000000 + "ms"); From c8434e73effe9af889aea8eebc52699925e97c1f Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 24 Dec 2020 02:49:27 -0700 Subject: [PATCH 107/210] implement robust equals and hashcode in Vector3 --- .../dfsek/terra/api/math/vector/Vector3.java | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java index cdba56120..e80616ee0 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java +++ b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java @@ -303,9 +303,42 @@ public class Vector3 implements Cloneable { } public Vector3 subtract(Vector3 end) { - x-=end.x; - y-=end.y; - z-=end.z; + x -= end.x; + y -= end.y; + z -= end.z; return this; } + + /** + * Returns a hash code for this vector + * + * @return hash code + */ + @Override + public int hashCode() { + int hash = 7; + + hash = 79 * hash + (int) (Double.doubleToLongBits(this.x) ^ (Double.doubleToLongBits(this.x) >>> 32)); + hash = 79 * hash + (int) (Double.doubleToLongBits(this.y) ^ (Double.doubleToLongBits(this.y) >>> 32)); + hash = 79 * hash + (int) (Double.doubleToLongBits(this.z) ^ (Double.doubleToLongBits(this.z) >>> 32)); + return hash; + } + + /** + * Checks to see if two objects are equal. + *

+ * Only two Vectors can ever return true. This method uses a fuzzy match + * to account for floating point errors. The epsilon can be retrieved + * with epsilon. + */ + @Override + public boolean equals(Object obj) { + if(!(obj instanceof Vector3)) { + return false; + } + + Vector3 other = (Vector3) obj; + + return Math.abs(x - other.x) < epsilon && Math.abs(y - other.y) < epsilon && Math.abs(z - other.z) < epsilon && (this.getClass().equals(obj.getClass())); + } } From 0780539326d4c9a223b4c5cbc655100bdfece7e0 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 24 Dec 2020 14:58:53 -0700 Subject: [PATCH 108/210] reimplement sapling override --- .../main/java/com/dfsek/terra/TerraWorld.java | 4 +- .../platform/generator/GeneratorWrapper.java | 6 +++ .../BukkitChunkGeneratorWrapper.java | 4 +- .../terra/bukkit/listeners/EventListener.java | 39 ++++++++++++++----- .../FabricChunkGeneratorWrapper.java | 4 +- 5 files changed, 42 insertions(+), 15 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/generator/GeneratorWrapper.java diff --git a/common/src/main/java/com/dfsek/terra/TerraWorld.java b/common/src/main/java/com/dfsek/terra/TerraWorld.java index 62efb8e94..6fddf3da5 100644 --- a/common/src/main/java/com/dfsek/terra/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/TerraWorld.java @@ -1,11 +1,11 @@ package com.dfsek.terra; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.generator.GeneratorWrapper; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.biome.BiomeZone; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.generation.MasterChunkGenerator; public class TerraWorld { private final TerraBiomeGrid grid; @@ -24,7 +24,7 @@ public class TerraWorld { } public static boolean isTerraWorld(World w) { - return w.getGenerator() instanceof MasterChunkGenerator; + return w.getGenerator().getHandle() instanceof GeneratorWrapper; } public TerraBiomeGrid getGrid() { diff --git a/common/src/main/java/com/dfsek/terra/api/platform/generator/GeneratorWrapper.java b/common/src/main/java/com/dfsek/terra/api/platform/generator/GeneratorWrapper.java new file mode 100644 index 000000000..60a05b386 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/generator/GeneratorWrapper.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.api.platform.generator; + +import com.dfsek.terra.api.platform.Handle; + +public interface GeneratorWrapper extends Handle { +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index 9f938d71c..695535ef4 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.generator; -import com.dfsek.terra.api.platform.Handle; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.generator.GeneratorWrapper; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.generation.population.PopulationManager; @@ -30,7 +30,7 @@ import java.util.logging.Level; import java.util.stream.Collectors; import java.util.stream.Stream; -public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Handle { +public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements GeneratorWrapper { private static final Map popMap = new HashMap<>(); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java index 8fb58bc2d..e56821ff0 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java @@ -1,6 +1,21 @@ package com.dfsek.terra.bukkit.listeners; +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.transform.MapTransform; +import com.dfsek.terra.api.transform.Transformer; +import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.api.world.tree.Tree; +import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.config.base.ConfigPack; +import com.dfsek.terra.debug.Debug; +import com.dfsek.terra.registry.TreeRegistry; +import org.bukkit.Material; +import org.bukkit.TreeType; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.world.StructureGrowEvent; @@ -15,9 +30,19 @@ public class EventListener implements Listener { this.main = main; } + private static final Transformer TREE_TYPE_STRING_TRANSFORMER = new Transformer.Builder() + .addTransform(new MapTransform() + .add(TreeType.COCOA_TREE, "JUNGLE_COCOA") + .add(TreeType.BIG_TREE, "LARGE_OAK") + .add(TreeType.TALL_REDWOOD, "LARGE_SPRUCE") + .add(TreeType.REDWOOD, "SPRUCE") + .add(TreeType.TREE, "OAK") + .add(TreeType.MEGA_REDWOOD, "MEGA_SPRUCE") + .add(TreeType.SWAMP, "SWAMP_OAK")) + .addTransform(TreeType::toString).build(); + @EventHandler public void onSaplingGrow(StructureGrowEvent e) { - /* World bukkit = new BukkitWorld(e.getWorld()); if(!TerraWorld.isTerraWorld(bukkit)) return; TerraWorld tw = main.getWorld(bukkit); @@ -28,14 +53,10 @@ public class EventListener implements Listener { BlockData data = block.getBlockData(); block.setType(Material.AIR); TreeRegistry registry = c.getTreeRegistry(); - Tree tree = registry.get(TreeType.fromBukkit(e.getSpecies()).toString()); - Debug.info("Overriding tree type: " + e.getSpecies()); - if(tree instanceof TerraTree) { - if(!((TerraTree) tree).plantBlockCheck(e.getLocation().subtract(0, 1, 0), new FastRandom(), main)) { - block.setBlockData(data); - } - } else if(!tree.plant(e.getLocation().subtract(0, 1, 0), new FastRandom(), main)) block.setBlockData(data); + Tree tree = registry.get(TREE_TYPE_STRING_TRANSFORMER.translate(e.getSpecies())); + Debug.info("Overrode tree type: " + e.getSpecies()); + org.bukkit.Location location = e.getLocation().subtract(0, 1, 0); + if(!tree.plant(new Location(bukkit, location.getX(), location.getY(), location.getZ()), new FastRandom())) block.setBlockData(data); - */ } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index f25e68d2e..e4c88358e 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -1,6 +1,6 @@ package com.dfsek.terra.fabric.world.generator; -import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.generator.GeneratorWrapper; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.fabric.TerraFabricPlugin; @@ -30,7 +30,7 @@ import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.StructuresConfig; import net.minecraft.world.gen.chunk.VerticalBlockSample; -public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Handle { +public class FabricChunkGeneratorWrapper extends ChunkGenerator implements GeneratorWrapper { private final long seed; private final MasterChunkGenerator delegate; private final TerraBiomeSource biomeSource; From aaa0c9952486f87e835c65b44b75fb0618d3eb0f Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 24 Dec 2020 22:59:51 -0700 Subject: [PATCH 109/210] Add FailKeyword --- .../terra/api/structures/parser/Parser.java | 4 ++- .../api/structures/parser/lang/Block.java | 2 +- .../parser/lang/keywords/FailKeyword.java | 30 +++++++++++++++++++ .../structures/script/StructureScript.java | 12 ++++++-- .../terra/api/structures/tokenizer/Token.java | 4 +++ .../api/structures/tokenizer/Tokenizer.java | 2 ++ 6 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/FailKeyword.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 0e17da62f..8f5fc8214 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -16,6 +16,7 @@ import com.dfsek.terra.api.structures.parser.lang.functions.builtin.PowFunction; import com.dfsek.terra.api.structures.parser.lang.functions.builtin.SqrtFunction; import com.dfsek.terra.api.structures.parser.lang.keywords.BreakKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.ContinueKeyword; +import com.dfsek.terra.api.structures.parser.lang.keywords.FailKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.ReturnKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.WhileKeyword; @@ -268,7 +269,7 @@ public class Parser { Token token = tokens.get(0); if(token.getType().equals(Token.Type.BLOCK_END)) break; // Stop parsing at block end. - ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE); + ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE, Token.Type.FAIL); if(token.isLoopLike()) { // Parse loop-like tokens (if, while, etc) parsedItems.add(parseLoopLike(tokens, parsedVariables)); @@ -299,6 +300,7 @@ public class Parser { } else if(token.getType().equals(Token.Type.RETURN)) parsedItems.add(new ReturnKeyword(tokens.remove(0).getPosition())); else if(token.getType().equals(Token.Type.BREAK)) parsedItems.add(new BreakKeyword(tokens.remove(0).getPosition())); else if(token.getType().equals(Token.Type.CONTINUE)) parsedItems.add(new ContinueKeyword(tokens.remove(0).getPosition())); + else if(token.getType().equals(Token.Type.FAIL)) parsedItems.add(new FailKeyword(tokens.remove(0).getPosition())); else throw new UnsupportedOperationException("Unexpected token " + token.getType() + ": " + token.getPosition()); if(!tokens.isEmpty()) ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END, Token.Type.BLOCK_END); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index a47b19709..e02d0053c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -37,6 +37,6 @@ public class Block implements Item { } public enum ReturnLevel { - NONE, BREAK, CONTINUE, RETURN + NONE, BREAK, CONTINUE, RETURN, FAIL } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/FailKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/FailKeyword.java new file mode 100644 index 000000000..bb4904cef --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/FailKeyword.java @@ -0,0 +1,30 @@ +package com.dfsek.terra.api.structures.parser.lang.keywords; + +import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.Keyword; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class FailKeyword implements Keyword { + private final Position position; + + public FailKeyword(Position position) { + this.position = position; + } + + @Override + public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { + return Block.ReturnLevel.FAIL; + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 4f1556c58..12a89c004 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -44,10 +44,18 @@ public class StructureScript { this.id = parser.getID(); } - public void execute(Location location, Rotation rotation) { + /** + * Paste the structure at a location + * + * @param location Location to paste structure + * @param rotation Rotation of structure + * @return Whether generation was successful + */ + public boolean execute(Location location, Rotation rotation) { StructureBuffer buffer = new StructureBuffer(location); - block.apply(buffer, rotation, 0); + Block.ReturnLevel level = block.apply(buffer, rotation, 0); buffer.paste(); + return !level.equals(Block.ReturnLevel.FAIL); } public void executeInBuffer(Buffer buffer, Rotation rotation, int recursions) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index b02413940..5916f9288 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -207,6 +207,10 @@ public class Token { * Break statement */ BREAK, + /** + * Fail statement. Like return keyword, but specifies that generation has failed. + */ + FAIL, /** * ID declaration */ diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index c6071bec1..a9f52e4f1 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -140,6 +140,8 @@ public class Tokenizer { return new Token(tokenString, Token.Type.CONTINUE, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("break")) return new Token(tokenString, Token.Type.BREAK, new Position(reader.getLine(), reader.getIndex())); + if(tokenString.equals("fail")) + return new Token(tokenString, Token.Type.FAIL, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("id")) return new Token(tokenString, Token.Type.ID, new Position(reader.getLine(), reader.getIndex())); From abc59901c10a7def51efa3c09e522875bad0991c Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 25 Dec 2020 00:12:28 -0700 Subject: [PATCH 110/210] Add for loops --- .../terra/api/structures/parser/Parser.java | 57 ++++++++++++++----- .../api/structures/parser/ParserUtil.java | 13 +++++ .../api/structures/parser/lang/Block.java | 12 +++- .../lang/keywords/looplike/ForKeyword.java | 45 +++++++++++++++ .../keywords/{ => looplike}/IfKeyword.java | 2 +- .../keywords/{ => looplike}/WhileKeyword.java | 4 +- .../terra/api/structures/tokenizer/Token.java | 9 ++- .../api/structures/tokenizer/Tokenizer.java | 2 + common/src/test/resources/test.tesf | 5 ++ 9 files changed, 128 insertions(+), 21 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java rename common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/{ => looplike}/IfKeyword.java (94%) rename common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/{ => looplike}/WhileKeyword.java (89%) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 8f5fc8214..21af51372 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -17,9 +17,10 @@ import com.dfsek.terra.api.structures.parser.lang.functions.builtin.SqrtFunction import com.dfsek.terra.api.structures.parser.lang.keywords.BreakKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.ContinueKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.FailKeyword; -import com.dfsek.terra.api.structures.parser.lang.keywords.IfKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.ReturnKeyword; -import com.dfsek.terra.api.structures.parser.lang.keywords.WhileKeyword; +import com.dfsek.terra.api.structures.parser.lang.keywords.looplike.ForKeyword; +import com.dfsek.terra.api.structures.parser.lang.keywords.looplike.IfKeyword; +import com.dfsek.terra.api.structures.parser.lang.keywords.looplike.WhileKeyword; import com.dfsek.terra.api.structures.parser.lang.operations.BinaryOperation; import com.dfsek.terra.api.structures.parser.lang.operations.BooleanAndOperation; import com.dfsek.terra.api.structures.parser.lang.operations.BooleanNotOperation; @@ -113,21 +114,52 @@ public class Parser { private Keyword parseLoopLike(List tokens, Map> variableMap) throws ParseException { Token identifier = tokens.remove(0); - ParserUtil.checkType(identifier, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP); + ParserUtil.checkType(identifier, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP); ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); - Returnable comparator = parseExpression(tokens, true, variableMap); - ParserUtil.checkReturnType(comparator, Returnable.ReturnType.BOOLEAN); + + if(identifier.getType().equals(Token.Type.FOR_LOOP)) { + Token f = tokens.get(0); + ParserUtil.checkType(f, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.IDENTIFIER); + Item initializer; + if(f.isVariableDeclaration()) { + Variable forVar = parseVariableDeclaration(tokens, ParserUtil.getVariableReturnType(f)); + Token name = tokens.get(1); + ParserUtil.checkType(tokens.remove(0), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); + initializer = parseAssignment(forVar, tokens, variableMap); + variableMap.put(name.getContent(), forVar); + } else initializer = parseExpression(tokens, true, variableMap); + ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END); + Returnable conditional = parseExpression(tokens, true, variableMap); + ParserUtil.checkReturnType(conditional, Returnable.ReturnType.BOOLEAN); + ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END); + + Item incrementer; + Token token = tokens.get(0); + if(variableMap.containsKey(token.getContent())) { // Assume variable assignment + Variable variable = variableMap.get(token.getContent()); + incrementer = parseAssignment(variable, tokens, variableMap); + } else incrementer = parseFunction(tokens, true, variableMap); + + ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_END); + + ParserUtil.checkType(tokens.remove(0), Token.Type.BLOCK_BEGIN); + + return new ForKeyword(parseBlock(tokens, variableMap), initializer, (Returnable) conditional, incrementer, identifier.getPosition()); + } + + Returnable first = parseExpression(tokens, true, variableMap); + ParserUtil.checkReturnType(first, Returnable.ReturnType.BOOLEAN); ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_END); ParserUtil.checkType(tokens.remove(0), Token.Type.BLOCK_BEGIN); if(identifier.getType().equals(Token.Type.IF_STATEMENT)) - return new IfKeyword(parseBlock(tokens, variableMap), (Returnable) comparator, identifier.getPosition()); // If statement + return new IfKeyword(parseBlock(tokens, variableMap), (Returnable) first, identifier.getPosition()); // If statement else if(identifier.getType().equals(Token.Type.WHILE_LOOP)) - return new WhileKeyword(parseBlock(tokens, variableMap), (Returnable) comparator, identifier.getPosition()); // While loop + return new WhileKeyword(parseBlock(tokens, variableMap), (Returnable) first, identifier.getPosition()); // While loop else throw new UnsupportedOperationException("Unknown keyword " + identifier.getContent() + ": " + identifier.getPosition()); } @@ -269,7 +301,8 @@ public class Parser { Token token = tokens.get(0); if(token.getType().equals(Token.Type.BLOCK_END)) break; // Stop parsing at block end. - ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE, Token.Type.FAIL); + ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, + Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE, Token.Type.FAIL); if(token.isLoopLike()) { // Parse loop-like tokens (if, while, etc) parsedItems.add(parseLoopLike(tokens, parsedVariables)); @@ -279,14 +312,8 @@ public class Parser { parsedItems.add(parseAssignment(variable, tokens, parsedVariables)); } else parsedItems.add(parseFunction(tokens, true, parsedVariables)); } else if(token.isVariableDeclaration()) { - Variable temp; - if(token.getType().equals(Token.Type.NUMBER_VARIABLE)) - temp = parseVariableDeclaration(tokens, Returnable.ReturnType.NUMBER); - else if(token.getType().equals(Token.Type.STRING_VARIABLE)) - temp = parseVariableDeclaration(tokens, Returnable.ReturnType.STRING); - else temp = parseVariableDeclaration(tokens, Returnable.ReturnType.BOOLEAN); + Variable temp = parseVariableDeclaration(tokens, ParserUtil.getVariableReturnType(token)); Token name = tokens.get(1); - ParserUtil.checkType(name, Token.Type.IDENTIFIER); // Name must be an identifier. if(functions.containsKey(name.getContent()) || parsedVariables.containsKey(name.getContent()) || builtinFunctions.contains(name.getContent())) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java index bb22de681..a44b7a634 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java @@ -46,4 +46,17 @@ public class ParserUtil { if(!token.isBinaryOperator()) throw new ParseException("Expected binary operator, found " + token.getType() + ": " + token.getPosition()); } + + public static Returnable.ReturnType getVariableReturnType(Token varToken) throws ParseException { + switch(varToken.getType()) { + case NUMBER_VARIABLE: + return Returnable.ReturnType.NUMBER; + case STRING_VARIABLE: + return Returnable.ReturnType.STRING; + case BOOLEAN_VARIABLE: + return Returnable.ReturnType.BOOLEAN; + default: + throw new ParseException("Unexpected token " + varToken.getType() + "; expected variable declaration: " + varToken.getPosition()); + } + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index e02d0053c..757ad40c7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -37,6 +37,16 @@ public class Block implements Item { } public enum ReturnLevel { - NONE, BREAK, CONTINUE, RETURN, FAIL + NONE(false), BREAK(false), CONTINUE(false), RETURN(true), FAIL(true); + + private final boolean returnFast; + + ReturnLevel(boolean returnFast) { + this.returnFast = returnFast; + } + + public boolean isReturnFast() { + return returnFast; + } } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java new file mode 100644 index 000000000..39f96a36a --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java @@ -0,0 +1,45 @@ +package com.dfsek.terra.api.structures.parser.lang.keywords.looplike; + +import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.Item; +import com.dfsek.terra.api.structures.parser.lang.Keyword; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class ForKeyword implements Keyword { + private final Block conditional; + private final Item initializer; + private final Returnable statement; + private final Item incrementer; + private final Position position; + + public ForKeyword(Block conditional, Item initializer, Returnable statement, Item incrementer, Position position) { + this.conditional = conditional; + this.initializer = initializer; + this.statement = statement; + this.incrementer = incrementer; + this.position = position; + } + + @Override + public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { + for(initializer.apply(buffer, rotation, recursions); statement.apply(buffer, rotation, recursions); incrementer.apply(buffer, rotation, recursions)) { + Block.ReturnLevel level = conditional.apply(buffer, rotation, recursions); + if(level.equals(Block.ReturnLevel.BREAK)) break; + if(level.isReturnFast()) return level; + } + return Block.ReturnLevel.NONE; + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java similarity index 94% rename from common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java rename to common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java index 678add710..62e4892b1 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/IfKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.structures.parser.lang.keywords; +package com.dfsek.terra.api.structures.parser.lang.keywords.looplike; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java similarity index 89% rename from common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java rename to common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java index bdc1f17f3..ab6629812 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/WhileKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.structures.parser.lang.keywords; +package com.dfsek.terra.api.structures.parser.lang.keywords.looplike; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; @@ -23,7 +23,7 @@ public class WhileKeyword implements Keyword { while(statement.apply(buffer, rotation, recursions)) { Block.ReturnLevel level = conditional.apply(buffer, rotation, recursions); if(level.equals(Block.ReturnLevel.BREAK)) break; - if(level.equals(Block.ReturnLevel.RETURN)) return Block.ReturnLevel.RETURN; + if(level.isReturnFast()) return level; } return Block.ReturnLevel.NONE; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 5916f9288..2acba38d1 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -70,7 +70,8 @@ public class Token { public boolean isLoopLike() { return type.equals(Type.IF_STATEMENT) - || type.equals(Type.WHILE_LOOP); + || type.equals(Type.WHILE_LOOP) + || type.equals(Type.FOR_LOOP); } public boolean isIdentifier() { @@ -214,6 +215,10 @@ public class Token { /** * ID declaration */ - ID + ID, + /** + * For loop initializer token + */ + FOR_LOOP } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index a9f52e4f1..f209bf0b2 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -133,6 +133,8 @@ public class Tokenizer { return new Token(tokenString, Token.Type.IF_STATEMENT, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("while")) return new Token(tokenString, Token.Type.WHILE_LOOP, new Position(reader.getLine(), reader.getIndex())); + if(tokenString.equals("for")) + return new Token(tokenString, Token.Type.FOR_LOOP, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("return")) return new Token(tokenString, Token.Type.RETURN, new Position(reader.getLine(), reader.getIndex())); diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 0ab62eebc..c511a3ba3 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -13,6 +13,11 @@ bool truetest = false; num iterator = 0; +for(num i = 0; i < 5; i = i + 1) { + test("i = " + i, iterator); +} + + while(iterator < 5) { test("always, even after " + 2, iterator); iterator = iterator + 1; From 2e68a0db5d0ffd90c9d730e6c751f5bcf020149c Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 25 Dec 2020 02:40:29 -0700 Subject: [PATCH 111/210] parser cleanup --- .../terra/api/structures/parser/Parser.java | 126 +++++++++--------- .../api/structures/parser/TokenHolder.java | 53 ++++++++ 2 files changed, 117 insertions(+), 62 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/TokenHolder.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 21af51372..46ce78a87 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -83,7 +83,7 @@ public class Parser { public Block parse() throws ParseException { Tokenizer tokenizer = new Tokenizer(data); - List tokens = new GlueList<>(); + TokenHolder tokens = new TokenHolder(); try { while(tokenizer.hasNext()) tokens.add(tokenizer.fetch()); } catch(TokenizerException e) { @@ -91,15 +91,15 @@ public class Parser { } // Parse ID - ParserUtil.checkType(tokens.remove(0), Token.Type.ID); // First token must be ID - Token idToken = tokens.get(0); - ParserUtil.checkType(tokens.remove(0), Token.Type.STRING); // Second token must be string literal containing ID - ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END); + ParserUtil.checkType(tokens.consume(), Token.Type.ID); // First token must be ID + Token idToken = tokens.get(); + ParserUtil.checkType(tokens.consume(), Token.Type.STRING); // Second token must be string literal containing ID + ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); this.id = idToken.getContent(); // Check for dangling brackets int blockLevel = 0; - for(Token t : tokens) { + for(Token t : tokens.getTokens()) { if(t.getType().equals(Token.Type.BLOCK_BEGIN)) blockLevel++; else if(t.getType().equals(Token.Type.BLOCK_END)) blockLevel--; if(blockLevel < 0) throw new ParseException("Dangling closing brace: " + t.getPosition()); @@ -111,40 +111,41 @@ public class Parser { @SuppressWarnings("unchecked") - private Keyword parseLoopLike(List tokens, Map> variableMap) throws ParseException { + private Keyword parseLoopLike(TokenHolder tokens, Map> variableMap) throws ParseException { - Token identifier = tokens.remove(0); + Token identifier = tokens.consume(); ParserUtil.checkType(identifier, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP); - ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); if(identifier.getType().equals(Token.Type.FOR_LOOP)) { - Token f = tokens.get(0); + Token f = tokens.get(); ParserUtil.checkType(f, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.IDENTIFIER); Item initializer; if(f.isVariableDeclaration()) { Variable forVar = parseVariableDeclaration(tokens, ParserUtil.getVariableReturnType(f)); - Token name = tokens.get(1); - ParserUtil.checkType(tokens.remove(0), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); + ParserUtil.checkType(tokens.consume(), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); + Token name = tokens.get(); + initializer = parseAssignment(forVar, tokens, variableMap); variableMap.put(name.getContent(), forVar); } else initializer = parseExpression(tokens, true, variableMap); - ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END); + ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); Returnable conditional = parseExpression(tokens, true, variableMap); ParserUtil.checkReturnType(conditional, Returnable.ReturnType.BOOLEAN); - ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END); + ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); Item incrementer; - Token token = tokens.get(0); + Token token = tokens.get(); if(variableMap.containsKey(token.getContent())) { // Assume variable assignment Variable variable = variableMap.get(token.getContent()); incrementer = parseAssignment(variable, tokens, variableMap); } else incrementer = parseFunction(tokens, true, variableMap); - ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_END); + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - ParserUtil.checkType(tokens.remove(0), Token.Type.BLOCK_BEGIN); + ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); return new ForKeyword(parseBlock(tokens, variableMap), initializer, (Returnable) conditional, incrementer, identifier.getPosition()); } @@ -152,9 +153,9 @@ public class Parser { Returnable first = parseExpression(tokens, true, variableMap); ParserUtil.checkReturnType(first, Returnable.ReturnType.BOOLEAN); - ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_END); + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - ParserUtil.checkType(tokens.remove(0), Token.Type.BLOCK_BEGIN); + ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); if(identifier.getType().equals(Token.Type.IF_STATEMENT)) return new IfKeyword(parseBlock(tokens, variableMap), (Returnable) first, identifier.getPosition()); // If statement @@ -164,14 +165,14 @@ public class Parser { } @SuppressWarnings("unchecked") - private Returnable parseExpression(List tokens, boolean full, Map> variableMap) throws ParseException { + private Returnable parseExpression(TokenHolder tokens, boolean full, Map> variableMap) throws ParseException { boolean booleanInverted = false; // Check for boolean not operator - if(tokens.get(0).getType().equals(Token.Type.BOOLEAN_NOT)) { + if(tokens.get().getType().equals(Token.Type.BOOLEAN_NOT)) { booleanInverted = true; - tokens.remove(0); + tokens.consume(); } - Token id = tokens.get(0); + Token id = tokens.get(); ParserUtil.checkType(id, Token.Type.IDENTIFIER, Token.Type.BOOLEAN, Token.Type.STRING, Token.Type.NUMBER, Token.Type.GROUP_BEGIN); @@ -184,7 +185,7 @@ public class Parser { if(functions.containsKey(id.getContent()) || builtinFunctions.contains(id.getContent())) expression = parseFunction(tokens, false, variableMap); else if(variableMap.containsKey(id.getContent())) { - ParserUtil.checkType(tokens.remove(0), Token.Type.IDENTIFIER); + ParserUtil.checkType(tokens.consume(), Token.Type.IDENTIFIER); expression = new Getter(variableMap.get(id.getContent())); } else throw new ParseException("Unexpected token: " + id.getContent() + " at " + id.getPosition()); } @@ -194,14 +195,14 @@ public class Parser { expression = new BooleanNotOperation((Returnable) expression, expression.getPosition()); } - if(full && tokens.get(0).isBinaryOperator()) { // Parse binary operations + if(full && tokens.get().isBinaryOperator()) { // Parse binary operations return parseBinaryOperation(expression, tokens, variableMap); } return expression; } - private ConstantExpression parseConstantExpression(List tokens) { - Token constantToken = tokens.remove(0); + private ConstantExpression parseConstantExpression(TokenHolder tokens) throws ParseException { + Token constantToken = tokens.consume(); Position position = constantToken.getPosition(); switch(constantToken.getType()) { case NUMBER: @@ -216,21 +217,21 @@ public class Parser { } } - private Returnable parseGroup(List tokens, Map> variableMap) throws ParseException { - ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); + private Returnable parseGroup(TokenHolder tokens, Map> variableMap) throws ParseException { + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); Returnable expression = parseExpression(tokens, true, variableMap); // Parse inside of group as a separate expression - ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_END); + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); return expression; } - private BinaryOperation parseBinaryOperation(Returnable left, List tokens, Map> variableMap) throws ParseException { - Token binaryOperator = tokens.remove(0); + private BinaryOperation parseBinaryOperation(Returnable left, TokenHolder tokens, Map> variableMap) throws ParseException { + Token binaryOperator = tokens.consume(); ParserUtil.checkBinaryOperator(binaryOperator); Returnable right = parseExpression(tokens, false, variableMap); - Token other = tokens.get(0); + Token other = tokens.get(); if(other.isBinaryOperator() && (other.getType().equals(Token.Type.MULTIPLICATION_OPERATOR) || other.getType().equals(Token.Type.DIVISION_OPERATOR))) { return assemble(left, parseBinaryOperation(right, tokens, variableMap), binaryOperator); } else if(other.isBinaryOperator()) { @@ -277,28 +278,28 @@ public class Parser { } } - private Variable parseVariableDeclaration(List tokens, Returnable.ReturnType type) throws ParseException { - ParserUtil.checkVarType(tokens.get(0), type); // Check for type mismatch + private Variable parseVariableDeclaration(TokenHolder tokens, Returnable.ReturnType type) throws ParseException { + ParserUtil.checkVarType(tokens.get(), type); // Check for type mismatch switch(type) { case NUMBER: - return new NumberVariable(0d, tokens.get(0).getPosition()); + return new NumberVariable(0d, tokens.get().getPosition()); case STRING: - return new StringVariable("", tokens.get(0).getPosition()); + return new StringVariable("", tokens.get().getPosition()); case BOOLEAN: - return new BooleanVariable(false, tokens.get(0).getPosition()); + return new BooleanVariable(false, tokens.get().getPosition()); } throw new UnsupportedOperationException("Unsupported variable type: " + type); } - private Block parseBlock(List tokens, Map> superVars) throws ParseException { + private Block parseBlock(TokenHolder tokens, Map> superVars) throws ParseException { List> parsedItems = new GlueList<>(); Map> parsedVariables = new HashMap<>(superVars); // New hashmap as to not mutate parent scope's declarations. - Token first = tokens.get(0); + Token first = tokens.get(); - while(tokens.size() > 0) { - Token token = tokens.get(0); + while(tokens.hasNext()) { + Token token = tokens.get(); if(token.getType().equals(Token.Type.BLOCK_END)) break; // Stop parsing at block end. ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, @@ -313,7 +314,9 @@ public class Parser { } else parsedItems.add(parseFunction(tokens, true, parsedVariables)); } else if(token.isVariableDeclaration()) { Variable temp = parseVariableDeclaration(tokens, ParserUtil.getVariableReturnType(token)); - Token name = tokens.get(1); + + ParserUtil.checkType(tokens.consume(), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); + Token name = tokens.get(); ParserUtil.checkType(name, Token.Type.IDENTIFIER); // Name must be an identifier. if(functions.containsKey(name.getContent()) || parsedVariables.containsKey(name.getContent()) || builtinFunctions.contains(name.getContent())) @@ -321,27 +324,26 @@ public class Parser { parsedVariables.put(name.getContent(), temp); - ParserUtil.checkType(tokens.remove(0), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); parsedItems.add(parseAssignment(temp, tokens, parsedVariables)); - } else if(token.getType().equals(Token.Type.RETURN)) parsedItems.add(new ReturnKeyword(tokens.remove(0).getPosition())); - else if(token.getType().equals(Token.Type.BREAK)) parsedItems.add(new BreakKeyword(tokens.remove(0).getPosition())); - else if(token.getType().equals(Token.Type.CONTINUE)) parsedItems.add(new ContinueKeyword(tokens.remove(0).getPosition())); - else if(token.getType().equals(Token.Type.FAIL)) parsedItems.add(new FailKeyword(tokens.remove(0).getPosition())); + } else if(token.getType().equals(Token.Type.RETURN)) parsedItems.add(new ReturnKeyword(tokens.consume().getPosition())); + else if(token.getType().equals(Token.Type.BREAK)) parsedItems.add(new BreakKeyword(tokens.consume().getPosition())); + else if(token.getType().equals(Token.Type.CONTINUE)) parsedItems.add(new ContinueKeyword(tokens.consume().getPosition())); + else if(token.getType().equals(Token.Type.FAIL)) parsedItems.add(new FailKeyword(tokens.consume().getPosition())); else throw new UnsupportedOperationException("Unexpected token " + token.getType() + ": " + token.getPosition()); - if(!tokens.isEmpty()) ParserUtil.checkType(tokens.remove(0), Token.Type.STATEMENT_END, Token.Type.BLOCK_END); + if(tokens.hasNext()) ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END, Token.Type.BLOCK_END); } return new Block(parsedItems, first.getPosition()); } @SuppressWarnings("unchecked") - private Assignment parseAssignment(Variable variable, List tokens, Map> variableMap) throws ParseException { - Token name = tokens.get(0); + private Assignment parseAssignment(Variable variable, TokenHolder tokens, Map> variableMap) throws ParseException { + Token name = tokens.get(); - ParserUtil.checkType(tokens.remove(0), Token.Type.IDENTIFIER); + ParserUtil.checkType(tokens.consume(), Token.Type.IDENTIFIER); - ParserUtil.checkType(tokens.remove(0), Token.Type.ASSIGNMENT); + ParserUtil.checkType(tokens.consume(), Token.Type.ASSIGNMENT); Returnable expression = parseExpression(tokens, true, variableMap); @@ -351,21 +353,21 @@ public class Parser { } @SuppressWarnings("unchecked") - private Function parseFunction(List tokens, boolean fullStatement, Map> variableMap) throws ParseException { - Token identifier = tokens.remove(0); + private Function parseFunction(TokenHolder tokens, boolean fullStatement, Map> variableMap) throws ParseException { + Token identifier = tokens.consume(); ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier if(!functions.containsKey(identifier.getContent()) && !builtinFunctions.contains(identifier.getContent())) throw new ParseException("No such function " + identifier.getContent() + ": " + identifier.getPosition()); - ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_BEGIN); // Second is body begin + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); // Second is body begin List> args = getArgs(tokens, variableMap); // Extract arguments, consume the rest. - ParserUtil.checkType(tokens.remove(0), Token.Type.GROUP_END); // Remove body end + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); // Remove body end - if(fullStatement) ParserUtil.checkType(tokens.get(0), Token.Type.STATEMENT_END); + if(fullStatement) ParserUtil.checkType(tokens.get(), Token.Type.STATEMENT_END); if(functions.containsKey(identifier.getContent())) { FunctionBuilder builder = functions.get(identifier.getContent()); @@ -405,13 +407,13 @@ public class Parser { } - private List> getArgs(List tokens, Map> variableMap) throws ParseException { + private List> getArgs(TokenHolder tokens, Map> variableMap) throws ParseException { List> args = new GlueList<>(); - while(!tokens.get(0).getType().equals(Token.Type.GROUP_END)) { + while(!tokens.get().getType().equals(Token.Type.GROUP_END)) { args.add(parseExpression(tokens, true, variableMap)); - ParserUtil.checkType(tokens.get(0), Token.Type.SEPARATOR, Token.Type.GROUP_END); - if(tokens.get(0).getType().equals(Token.Type.SEPARATOR)) tokens.remove(0); + ParserUtil.checkType(tokens.get(), Token.Type.SEPARATOR, Token.Type.GROUP_END); + if(tokens.get().getType().equals(Token.Type.SEPARATOR)) tokens.consume(); } return args; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/TokenHolder.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/TokenHolder.java new file mode 100644 index 000000000..6affc2cb4 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/TokenHolder.java @@ -0,0 +1,53 @@ +package com.dfsek.terra.api.structures.parser; + +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.tokenizer.Token; +import com.dfsek.terra.api.util.GlueList; + +import java.util.List; + +/** + * Data structure to hold tokens, where items are inserted at the top and removed from the bottom. + */ +public class TokenHolder { + private final List tokens = new GlueList<>(); + + /** + * Add a token to the top of the stack. + * + * @param token Token to add + */ + public void add(Token token) { + tokens.add(token); + } + + /** + * Get the token at the bottom of the stack. + * + * @return First token + * @throws ParseException If stack is empty + */ + public Token get() throws ParseException { + if(!hasNext()) throw new ParseException("Unexpected end of input"); + return tokens.get(0); + } + + /** + * Consume (get and remove) the token at the bottom of the stack. + * + * @return First token + * @throws ParseException If stack is empty + */ + public Token consume() throws ParseException { + if(!hasNext()) throw new ParseException("Unexpected end of input"); + return tokens.remove(0); + } + + public List getTokens() { + return tokens; + } + + public boolean hasNext() { + return tokens.size() > 0; + } +} From bbab6e39ff2f8babf10c85e3ea578a8fdb964113 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 25 Dec 2020 02:43:15 -0700 Subject: [PATCH 112/210] enforce scope definitions in for loop declarations --- .../java/com/dfsek/terra/api/structures/parser/Parser.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 46ce78a87..2d4f4bf1d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -128,6 +128,9 @@ public class Parser { ParserUtil.checkType(tokens.consume(), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); Token name = tokens.get(); + if(functions.containsKey(name.getContent()) || variableMap.containsKey(name.getContent()) || builtinFunctions.contains(name.getContent())) + throw new ParseException(name.getContent() + " is already defined in this scope: " + name.getPosition()); + initializer = parseAssignment(forVar, tokens, variableMap); variableMap.put(name.getContent(), forVar); } else initializer = parseExpression(tokens, true, variableMap); From 1c579e8e5be273cc15e036a363e8adb5cc16def1 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 25 Dec 2020 12:08:22 -0700 Subject: [PATCH 113/210] improve ParseException --- .../terra/api/structures/parser/Parser.java | 25 ++++++++++--------- .../api/structures/parser/ParserUtil.java | 14 +++++------ .../api/structures/parser/TokenHolder.java | 14 ++++++++--- .../parser/exceptions/ParseException.java | 21 ++++++++++------ .../builders/StructureFunctionBuilder.java | 2 +- .../script/functions/BlockFunction.java | 2 +- 6 files changed, 46 insertions(+), 32 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 2d4f4bf1d..df01dd94f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -87,7 +87,7 @@ public class Parser { try { while(tokenizer.hasNext()) tokens.add(tokenizer.fetch()); } catch(TokenizerException e) { - throw new ParseException("Failed to tokenize input", e); + throw new ParseException("Failed to tokenize input", new Position(0, 0), e); } // Parse ID @@ -102,9 +102,10 @@ public class Parser { for(Token t : tokens.getTokens()) { if(t.getType().equals(Token.Type.BLOCK_BEGIN)) blockLevel++; else if(t.getType().equals(Token.Type.BLOCK_END)) blockLevel--; - if(blockLevel < 0) throw new ParseException("Dangling closing brace: " + t.getPosition()); + if(blockLevel < 0) throw new ParseException("Dangling closing brace", t.getPosition()); } - if(blockLevel != 0) throw new ParseException("Dangling opening brace"); + if(blockLevel != 0) + throw new ParseException("Dangling opening brace", tokens.getTokens().get(tokens.getTokens().size() - 1).getPosition()); return parseBlock(tokens, new HashMap<>()); } @@ -129,7 +130,7 @@ public class Parser { Token name = tokens.get(); if(functions.containsKey(name.getContent()) || variableMap.containsKey(name.getContent()) || builtinFunctions.contains(name.getContent())) - throw new ParseException(name.getContent() + " is already defined in this scope: " + name.getPosition()); + throw new ParseException(name.getContent() + " is already defined in this scope", name.getPosition()); initializer = parseAssignment(forVar, tokens, variableMap); variableMap.put(name.getContent(), forVar); @@ -190,7 +191,7 @@ public class Parser { else if(variableMap.containsKey(id.getContent())) { ParserUtil.checkType(tokens.consume(), Token.Type.IDENTIFIER); expression = new Getter(variableMap.get(id.getContent())); - } else throw new ParseException("Unexpected token: " + id.getContent() + " at " + id.getPosition()); + } else throw new ParseException("Unexpected token \" " + id.getContent() + "\"", id.getPosition()); } if(booleanInverted) { // Invert operation if boolean not detected @@ -323,7 +324,7 @@ public class Parser { ParserUtil.checkType(name, Token.Type.IDENTIFIER); // Name must be an identifier. if(functions.containsKey(name.getContent()) || parsedVariables.containsKey(name.getContent()) || builtinFunctions.contains(name.getContent())) - throw new ParseException(name.getContent() + " is already defined in this scope: " + name.getPosition()); + throw new ParseException(name.getContent() + " is already defined in this scope", name.getPosition()); parsedVariables.put(name.getContent(), temp); @@ -361,7 +362,7 @@ public class Parser { ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier if(!functions.containsKey(identifier.getContent()) && !builtinFunctions.contains(identifier.getContent())) - throw new ParseException("No such function " + identifier.getContent() + ": " + identifier.getPosition()); + throw new ParseException("No such function \"" + identifier.getContent() + "\"", identifier.getPosition()); ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); // Second is body begin @@ -376,12 +377,12 @@ public class Parser { FunctionBuilder builder = functions.get(identifier.getContent()); if(builder.argNumber() != -1 && args.size() != builder.argNumber()) - throw new ParseException("Expected " + builder.argNumber() + " arguments, found " + args.size() + ": " + identifier.getPosition()); + throw new ParseException("Expected " + builder.argNumber() + " arguments, found " + args.size(), identifier.getPosition()); for(int i = 0; i < args.size(); i++) { Returnable argument = args.get(i); if(builder.getArgument(i) == null) - throw new ParseException("Unexpected argument at position " + i + " in function " + identifier.getContent() + ": " + identifier.getPosition()); + throw new ParseException("Unexpected argument at position " + i + " in function " + identifier.getContent(), identifier.getPosition()); ParserUtil.checkReturnType(argument, builder.getArgument(i)); } return builder.build(args, identifier.getPosition()); @@ -390,18 +391,18 @@ public class Parser { case "abs": ParserUtil.checkReturnType(args.get(0), Returnable.ReturnType.NUMBER); if(args.size() != 1) - throw new ParseException("Expected 1 arguments; found " + args.size() + ": " + identifier.getPosition()); + throw new ParseException("Expected 1 argument; found " + args.size(), identifier.getPosition()); return new AbsFunction(identifier.getPosition(), (Returnable) args.get(0)); case "sqrt": ParserUtil.checkReturnType(args.get(0), Returnable.ReturnType.NUMBER); if(args.size() != 1) - throw new ParseException("Expected 1 arguments; found " + args.size() + ": " + identifier.getPosition()); + throw new ParseException("Expected 1 argument; found " + args.size(), identifier.getPosition()); return new SqrtFunction(identifier.getPosition(), (Returnable) args.get(0)); case "pow": ParserUtil.checkReturnType(args.get(0), Returnable.ReturnType.NUMBER); ParserUtil.checkReturnType(args.get(1), Returnable.ReturnType.NUMBER); if(args.size() != 2) - throw new ParseException("Expected 1 arguments; found " + args.size() + ": " + identifier.getPosition()); + throw new ParseException("Expected 1 argument; found " + args.size(), identifier.getPosition()); return new PowFunction(identifier.getPosition(), (Returnable) args.get(0), (Returnable) args.get(1)); default: throw new UnsupportedOperationException("Unsupported function: " + identifier.getContent()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java index a44b7a634..c54169044 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java @@ -9,23 +9,23 @@ import java.util.Arrays; public class ParserUtil { public static void checkType(Token token, Token.Type... expected) throws ParseException { for(Token.Type type : expected) if(token.getType().equals(type)) return; - throw new ParseException("Expected " + Arrays.toString(expected) + " but found " + token.getType() + ": " + token.getPosition()); + throw new ParseException("Expected " + Arrays.toString(expected) + " but found " + token.getType(), token.getPosition()); } public static void checkReturnType(Returnable returnable, Returnable.ReturnType... types) throws ParseException { for(Returnable.ReturnType type : types) if(returnable.returnType().equals(type)) return; - throw new ParseException("Expected " + Arrays.toString(types) + " but found " + returnable.returnType() + ": " + returnable.getPosition()); + throw new ParseException("Expected " + Arrays.toString(types) + " but found " + returnable.returnType(), returnable.getPosition()); } public static void checkArithmeticOperation(Returnable left, Returnable right, Token operation) throws ParseException { if(!left.returnType().equals(Returnable.ReturnType.NUMBER) || !right.returnType().equals(Returnable.ReturnType.NUMBER)) { - throw new ParseException("Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType() + ": " + operation.getPosition()); + throw new ParseException("Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType(), operation.getPosition()); } } public static void checkBooleanOperation(Returnable left, Returnable right, Token operation) throws ParseException { if(!left.returnType().equals(Returnable.ReturnType.BOOLEAN) || !right.returnType().equals(Returnable.ReturnType.BOOLEAN)) { - throw new ParseException("Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType() + ": " + operation.getPosition()); + throw new ParseException("Operation " + operation.getType() + " not supported between " + left.returnType() + " and " + right.returnType(), operation.getPosition()); } } @@ -33,7 +33,7 @@ public class ParserUtil { if(returnType.equals(Returnable.ReturnType.STRING) && token.getType().equals(Token.Type.STRING_VARIABLE)) return; if(returnType.equals(Returnable.ReturnType.NUMBER) && token.getType().equals(Token.Type.NUMBER_VARIABLE)) return; if(returnType.equals(Returnable.ReturnType.BOOLEAN) && token.getType().equals(Token.Type.BOOLEAN_VARIABLE)) return; - throw new ParseException("Type mismatch, cannot convert from " + returnType + " to " + token.getType() + ": " + token.getPosition()); + throw new ParseException("Type mismatch, cannot convert from " + returnType + " to " + token.getType(), token.getPosition()); } /** @@ -44,7 +44,7 @@ public class ParserUtil { */ public static void checkBinaryOperator(Token token) throws ParseException { if(!token.isBinaryOperator()) - throw new ParseException("Expected binary operator, found " + token.getType() + ": " + token.getPosition()); + throw new ParseException("Expected binary operator, found " + token.getType(), token.getPosition()); } public static Returnable.ReturnType getVariableReturnType(Token varToken) throws ParseException { @@ -56,7 +56,7 @@ public class ParserUtil { case BOOLEAN_VARIABLE: return Returnable.ReturnType.BOOLEAN; default: - throw new ParseException("Unexpected token " + varToken.getType() + "; expected variable declaration: " + varToken.getPosition()); + throw new ParseException("Unexpected token " + varToken.getType() + "; expected variable declaration", varToken.getPosition()); } } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/TokenHolder.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/TokenHolder.java index 6affc2cb4..b8bb90023 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/TokenHolder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/TokenHolder.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.structures.parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Token; import com.dfsek.terra.api.util.GlueList; @@ -11,6 +12,7 @@ import java.util.List; */ public class TokenHolder { private final List tokens = new GlueList<>(); + private Position last; /** * Add a token to the top of the stack. @@ -28,8 +30,10 @@ public class TokenHolder { * @throws ParseException If stack is empty */ public Token get() throws ParseException { - if(!hasNext()) throw new ParseException("Unexpected end of input"); - return tokens.get(0); + if(!hasNext()) throw new ParseException("Unexpected end of input", last); + Token token = tokens.get(0); + last = token.getPosition(); + return token; } /** @@ -39,8 +43,10 @@ public class TokenHolder { * @throws ParseException If stack is empty */ public Token consume() throws ParseException { - if(!hasNext()) throw new ParseException("Unexpected end of input"); - return tokens.remove(0); + if(!hasNext()) throw new ParseException("Unexpected end of input", last); + Token token = tokens.remove(0); + last = token.getPosition(); + return token; } public List getTokens() { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/exceptions/ParseException.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/exceptions/ParseException.java index c8e3794d6..df833972f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/exceptions/ParseException.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/exceptions/ParseException.java @@ -1,19 +1,26 @@ package com.dfsek.terra.api.structures.parser.exceptions; +import com.dfsek.terra.api.structures.tokenizer.Position; + public class ParseException extends Exception { - public ParseException() { - super(); - } + private final Position position; - public ParseException(String message) { + public ParseException(String message, Position position) { super(message); + this.position = position; } - public ParseException(String message, Throwable cause) { + public ParseException(String message, Position position, Throwable cause) { super(message, cause); + this.position = position; } - public ParseException(Throwable cause) { - super(cause); + @Override + public String getMessage() { + return super.getMessage() + ": " + position; + } + + public Position getPosition() { + return position; } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java index 044bd97d6..e61a3527b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StructureFunctionBuilder.java @@ -23,7 +23,7 @@ public class StructureFunctionBuilder implements FunctionBuilder> argumentList, Position position) throws ParseException { - if(argumentList.size() < 5) throw new ParseException("Expected rotations: " + position); + if(argumentList.size() < 5) throw new ParseException("Expected rotations", position); return new StructureFunction((Returnable) argumentList.remove(0), (Returnable) argumentList.remove(0), (Returnable) argumentList.remove(0), (Returnable) argumentList.remove(0), argumentList.stream().map(item -> ((Returnable) item)).collect(Collectors.toList()), registry, position, main); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index 60f2f6c11..8f4b1541e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -22,7 +22,7 @@ public class BlockFunction implements Function { public BlockFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) throws ParseException { this.position = position; - if(!(data instanceof ConstantExpression)) throw new ParseException("Block data must be constant."); + if(!(data instanceof ConstantExpression)) throw new ParseException("Block data must be constant", data.getPosition()); this.data = main.getWorldHandle().createBlockData(((ConstantExpression) data).getConstant()); this.x = x; From a04bcf5b23846a60112454aa5fdc829c54e8b26f Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 25 Dec 2020 13:06:15 -0700 Subject: [PATCH 114/210] fix bukkit slab implementation --- .../main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java index 5433dcc76..2014c1a5f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java @@ -10,20 +10,20 @@ import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.bukkit.world.block.data.BukkitMultipleFacing; +import com.dfsek.terra.bukkit.world.block.data.BukkitSlab; import com.dfsek.terra.bukkit.world.block.data.BukkitStairs; import com.dfsek.terra.bukkit.world.block.data.BukkitWaterlogged; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.MultipleFacing; import org.bukkit.block.data.Waterlogged; +import org.bukkit.block.data.type.Slab; import org.bukkit.block.data.type.Stairs; public class BukkitWorldHandle implements WorldHandle { - private final TerraPlugin main; private Transformer treeTransformer; public BukkitWorldHandle(TerraPlugin main) { - this.main = main; } public void setTreeTransformer(Transformer treeTransformer) { @@ -50,6 +50,7 @@ public class BukkitWorldHandle implements WorldHandle { org.bukkit.block.data.BlockData bukkitData = Bukkit.createBlockData(data); if(bukkitData instanceof MultipleFacing) return new BukkitMultipleFacing((MultipleFacing) bukkitData); if(bukkitData instanceof Stairs) return new BukkitStairs((Stairs) bukkitData); + if(bukkitData instanceof Slab) return new BukkitSlab((Slab) bukkitData); if(bukkitData instanceof Waterlogged) return new BukkitWaterlogged((Waterlogged) bukkitData); return new BukkitBlockData(Bukkit.createBlockData(data)); } From 4b5013231c6791bfa0419799a7b067f05b4e66b1 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 25 Dec 2020 15:26:58 -0700 Subject: [PATCH 115/210] implement Marks --- .../structures/script/StructureScript.java | 6 ++- .../builders/GetMarkFunctionBuilder.java | 38 ++++++++++++++ .../script/builders/MarkFunctionBuilder.java | 40 ++++++++++++++ .../script/functions/BlockFunction.java | 7 +-- .../script/functions/GetMarkFunction.java | 49 +++++++++++++++++ .../script/functions/MarkFunction.java | 52 +++++++++++++++++++ .../structures/structure/buffer/Buffer.java | 6 +++ .../api/structures/structure/buffer/Cell.java | 31 +++++++++++ .../structure/buffer/IntermediateBuffer.java | 13 +++++ .../structure/buffer/StructureBuffer.java | 24 ++++++++- .../buffer/{ => items}/BufferedBlock.java | 2 +- .../buffer/{ => items}/BufferedItem.java | 2 +- .../structure/buffer/items/Mark.java | 13 +++++ 13 files changed, 275 insertions(+), 8 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/GetMarkFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/MarkFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Cell.java rename common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/{ => items}/BufferedBlock.java (85%) rename common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/{ => items}/BufferedItem.java (65%) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/Mark.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 12a89c004..5eeae4c5c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -7,6 +7,8 @@ import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.GetMarkFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.MarkFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RandomFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RecursionsFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder; @@ -34,7 +36,9 @@ public class StructureScript { .addFunction("check", new CheckFunctionBuilder(main)) .addFunction("structure", new StructureFunctionBuilder(registry, main)) .addFunction("randomInt", new RandomFunctionBuilder()) - .addFunction("recursions", new RecursionsFunctionBuilder()); + .addFunction("recursions", new RecursionsFunctionBuilder()) + .addFunction("setMark", new MarkFunctionBuilder()) + .addFunction("getMark", new GetMarkFunctionBuilder()); try { block = parser.parse(); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/GetMarkFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/GetMarkFunctionBuilder.java new file mode 100644 index 000000000..5da2fa0e5 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/GetMarkFunctionBuilder.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.functions.GetMarkFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class GetMarkFunctionBuilder implements FunctionBuilder { + + public GetMarkFunctionBuilder() { + } + + @SuppressWarnings("unchecked") + @Override + public GetMarkFunction build(List> argumentList, Position position) throws ParseException { + return new GetMarkFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), position); + } + + @Override + public int argNumber() { + return 3; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + switch(position) { + case 0: + case 1: + case 2: + return Returnable.ReturnType.NUMBER; + default: + return null; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/MarkFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/MarkFunctionBuilder.java new file mode 100644 index 000000000..cf73e0948 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/MarkFunctionBuilder.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.functions.MarkFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class MarkFunctionBuilder implements FunctionBuilder { + + public MarkFunctionBuilder() { + } + + @SuppressWarnings("unchecked") + @Override + public MarkFunction build(List> argumentList, Position position) throws ParseException { + return new MarkFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), position); + } + + @Override + public int argNumber() { + return 4; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + switch(position) { + case 0: + case 1: + case 2: + return Returnable.ReturnType.NUMBER; + case 3: + return Returnable.ReturnType.STRING; + default: + return null; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index 8f4b1541e..01dc7946c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -11,7 +11,7 @@ import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.structure.buffer.Buffer; -import com.dfsek.terra.api.structures.structure.buffer.BufferedBlock; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedBlock; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; @@ -40,8 +40,9 @@ public class BlockFunction implements Function { Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); - - buffer.addItem(new BufferedBlock(data), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + BlockData rot = data.clone(); + RotationUtil.rotateBlockData(rot, rotation.inverse()); + buffer.addItem(new BufferedBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java new file mode 100644 index 000000000..13ab0bf56 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java @@ -0,0 +1,49 @@ +package com.dfsek.terra.api.structures.script.functions; + +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.RotationUtil; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.structure.buffer.items.Mark; +import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; + +public class GetMarkFunction implements Function { + private final Returnable x, y, z; + private final Position position; + + public GetMarkFunction(Returnable x, Returnable y, Returnable z, Position position) throws ParseException { + this.position = position; + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public String name() { + return "block"; + } + + @Override + public String apply(Buffer buffer, Rotation rotation, int recursions) { + Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); + + RotationUtil.rotateVector(xz, rotation); + Mark mark = buffer.getMark(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + return mark == null ? "" : mark.getContent(); + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java new file mode 100644 index 000000000..562d47bfa --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java @@ -0,0 +1,52 @@ +package com.dfsek.terra.api.structures.script.functions; + +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.RotationUtil; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.structure.buffer.items.Mark; +import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; + +public class MarkFunction implements Function { + private final Returnable x, y, z; + private final Position position; + private final Returnable mark; + + public MarkFunction(Returnable x, Returnable y, Returnable z, Returnable mark, Position position) throws ParseException { + this.position = position; + this.mark = mark; + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public String name() { + return "block"; + } + + @Override + public Void apply(Buffer buffer, Rotation rotation, int recursions) { + Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); + + RotationUtil.rotateVector(xz, rotation); + + buffer.setMark(new Mark(mark.apply(buffer, rotation, recursions)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + return null; + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java index d08fcccb4..80a74afe5 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java @@ -2,9 +2,15 @@ package com.dfsek.terra.api.structures.structure.buffer; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; +import com.dfsek.terra.api.structures.structure.buffer.items.Mark; public interface Buffer { Buffer addItem(BufferedItem item, Vector3 location); Location getOrigin(); + + Mark getMark(Vector3 location); + + Buffer setMark(Mark mark, Vector3 location); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Cell.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Cell.java new file mode 100644 index 000000000..ab0b6742e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Cell.java @@ -0,0 +1,31 @@ +package com.dfsek.terra.api.structures.structure.buffer; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; +import com.dfsek.terra.api.structures.structure.buffer.items.Mark; +import com.dfsek.terra.api.util.GlueList; + +import java.util.List; + +public class Cell implements BufferedItem { + private final List items = new GlueList<>(); + private Mark mark = null; + + + @Override + public void paste(Location origin) { + items.forEach(item -> item.paste(origin)); + } + + public void add(BufferedItem item) { + items.add(item); + } + + public Mark getMark() { + return mark; + } + + public void setMark(Mark mark) { + this.mark = mark; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java index 73aee8af8..bc3614657 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java @@ -2,6 +2,8 @@ package com.dfsek.terra.api.structures.structure.buffer; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; +import com.dfsek.terra.api.structures.structure.buffer.items.Mark; public class IntermediateBuffer implements Buffer { private final Buffer original; @@ -21,4 +23,15 @@ public class IntermediateBuffer implements Buffer { public Location getOrigin() { return original.getOrigin().add(offset); } + + @Override + public Mark getMark(Vector3 location) { + return original.getMark(location.add(offset)); + } + + @Override + public Buffer setMark(Mark mark, Vector3 location) { + original.setMark(mark, location.add(offset)); + return this; + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java index 2eef26a21..85d7c132d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java @@ -2,12 +2,14 @@ package com.dfsek.terra.api.structures.structure.buffer; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; +import com.dfsek.terra.api.structures.structure.buffer.items.Mark; import java.util.HashMap; import java.util.Map; public class StructureBuffer implements Buffer { - private final Map bufferedItemMap = new HashMap<>(); + private final Map bufferedItemMap = new HashMap<>(); private final Location origin; public StructureBuffer(Location origin) { @@ -22,10 +24,28 @@ public class StructureBuffer implements Buffer { @Override public Buffer addItem(BufferedItem item, Vector3 location) { - bufferedItemMap.put(location, item); + bufferedItemMap.putIfAbsent(location, new Cell()); + bufferedItemMap.get(location).add(item); return this; } + @Override + public Mark getMark(Vector3 location) { + Cell cell = bufferedItemMap.get(location); + if(cell != null) { + return cell.getMark(); + } + return null; + } + + @Override + public Buffer setMark(Mark mark, Vector3 location) { + bufferedItemMap.putIfAbsent(location, new Cell()); + bufferedItemMap.get(location).setMark(mark); + return this; + } + + @Override public Location getOrigin() { return origin; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedBlock.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedBlock.java similarity index 85% rename from common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedBlock.java rename to common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedBlock.java index 95ea66058..1ed1b414d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedBlock.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedBlock.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.structures.structure.buffer; +package com.dfsek.terra.api.structures.structure.buffer.items; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.block.BlockData; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedItem.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedItem.java similarity index 65% rename from common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedItem.java rename to common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedItem.java index d9d1f959c..a4cfa2e17 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/BufferedItem.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedItem.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.structures.structure.buffer; +package com.dfsek.terra.api.structures.structure.buffer.items; import com.dfsek.terra.api.math.vector.Location; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/Mark.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/Mark.java new file mode 100644 index 000000000..532030b87 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/Mark.java @@ -0,0 +1,13 @@ +package com.dfsek.terra.api.structures.structure.buffer.items; + +public class Mark { + private final String content; + + public Mark(String content) { + this.content = content; + } + + public String getContent() { + return content; + } +} From a18d459343b4cc89ef9209d7fc34e8ce4a9fa586 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 25 Dec 2020 17:06:23 -0700 Subject: [PATCH 116/210] implement BukkitDirectional and BukkitRotatable --- .../dfsek/terra/bukkit/BukkitWorldHandle.java | 6 ++++++ .../world/block/data/BukkitDirectional.java | 21 +++++++++++++++++++ .../world/block/data/BukkitRotatable.java | 21 +++++++++++++++++++ 3 files changed, 48 insertions(+) create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java index 2014c1a5f..363d471c9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java @@ -9,13 +9,17 @@ import com.dfsek.terra.api.platform.world.WorldHandle; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; +import com.dfsek.terra.bukkit.world.block.data.BukkitDirectional; import com.dfsek.terra.bukkit.world.block.data.BukkitMultipleFacing; +import com.dfsek.terra.bukkit.world.block.data.BukkitRotatable; import com.dfsek.terra.bukkit.world.block.data.BukkitSlab; import com.dfsek.terra.bukkit.world.block.data.BukkitStairs; import com.dfsek.terra.bukkit.world.block.data.BukkitWaterlogged; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.block.data.Directional; import org.bukkit.block.data.MultipleFacing; +import org.bukkit.block.data.Rotatable; import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Slab; import org.bukkit.block.data.type.Stairs; @@ -51,6 +55,8 @@ public class BukkitWorldHandle implements WorldHandle { if(bukkitData instanceof MultipleFacing) return new BukkitMultipleFacing((MultipleFacing) bukkitData); if(bukkitData instanceof Stairs) return new BukkitStairs((Stairs) bukkitData); if(bukkitData instanceof Slab) return new BukkitSlab((Slab) bukkitData); + if(bukkitData instanceof Rotatable) return new BukkitRotatable((Rotatable) bukkitData); + if(bukkitData instanceof Directional) return new BukkitDirectional((Directional) bukkitData); if(bukkitData instanceof Waterlogged) return new BukkitWaterlogged((Waterlogged) bukkitData); return new BukkitBlockData(Bukkit.createBlockData(data)); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java new file mode 100644 index 000000000..176fa58d9 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.bukkit.world.block.data; + +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Directional; +import com.dfsek.terra.bukkit.world.block.BukkitBlockData; + +public class BukkitDirectional extends BukkitBlockData implements Directional { + public BukkitDirectional(org.bukkit.block.data.Directional delegate) { + super(delegate); + } + + @Override + public BlockFace getFacing() { + return BukkitEnumAdapter.fromBukkitBlockFace(((org.bukkit.block.data.Directional) getHandle()).getFacing()); + } + + @Override + public void setFacing(BlockFace facing) { + ((org.bukkit.block.data.Directional) getHandle()).setFacing(TerraEnumAdapter.fromTerraBlockFace(facing)); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java new file mode 100644 index 000000000..f6f184dcc --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.bukkit.world.block.data; + +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Rotatable; +import com.dfsek.terra.bukkit.world.block.BukkitBlockData; + +public class BukkitRotatable extends BukkitBlockData implements Rotatable { + public BukkitRotatable(org.bukkit.block.data.Rotatable delegate) { + super(delegate); + } + + @Override + public BlockFace getRotation() { + return BukkitEnumAdapter.fromBukkitBlockFace(((org.bukkit.block.data.Rotatable) getHandle()).getRotation()); + } + + @Override + public void setRotation(BlockFace face) { + ((org.bukkit.block.data.Rotatable) getHandle()).setRotation(TerraEnumAdapter.fromTerraBlockFace(face)); + } +} From 9685dbbb9d5e23acdcbd4a0417d9d5953e693093 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 25 Dec 2020 17:46:22 -0700 Subject: [PATCH 117/210] Fix IntermediateBuffer --- .../api/structures/script/functions/CheckFunction.java | 7 ++++--- .../structures/structure/buffer/IntermediateBuffer.java | 2 +- .../api/structures/structure/buffer/StructureBuffer.java | 2 +- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index e4c65683a..c23545b95 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.structures.script.functions; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; @@ -32,12 +33,12 @@ public class CheckFunction implements Function { return "check"; } - private Vector3 getVector(Buffer buffer, Rotation rotation, int recursions) { + private Location getVector(Buffer buffer, Rotation rotation, int recursions) { Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); - return new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ())).add(buffer.getOrigin().toVector()); + return buffer.getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); } @Override @@ -45,7 +46,7 @@ public class CheckFunction implements Function { return apply(getVector(buffer, rotation, recursions), buffer.getOrigin().getWorld()); } - private String apply(Vector3 vector, World world) { + private String apply(Location vector, World world) { if(new LandCheck(world, main).check(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ())) return "LAND"; if(new OceanCheck(world, main).check(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ())) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java index bc3614657..4011760c1 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java @@ -21,7 +21,7 @@ public class IntermediateBuffer implements Buffer { @Override public Location getOrigin() { - return original.getOrigin().add(offset); + return original.getOrigin().clone().add(offset); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java index 85d7c132d..e2e527a1f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java @@ -48,6 +48,6 @@ public class StructureBuffer implements Buffer { @Override public Location getOrigin() { - return origin; + return origin.clone(); } } From c6d7d1a947767a2da6f66f900aea8b2ac5de1fc5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 25 Dec 2020 17:46:29 -0700 Subject: [PATCH 118/210] implement PullFunction --- .../structures/script/StructureScript.java | 4 +- .../script/builders/PullFunctionBuilder.java | 43 ++++++++++++++ .../script/functions/PullFunction.java | 58 +++++++++++++++++++ .../buffer/items/BufferedPulledBlock.java | 26 +++++++++ 4 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/PullFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedPulledBlock.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 5eeae4c5c..743e94e37 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.GetMarkFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.MarkFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.PullFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RandomFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RecursionsFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder; @@ -38,7 +39,8 @@ public class StructureScript { .addFunction("randomInt", new RandomFunctionBuilder()) .addFunction("recursions", new RecursionsFunctionBuilder()) .addFunction("setMark", new MarkFunctionBuilder()) - .addFunction("getMark", new GetMarkFunctionBuilder()); + .addFunction("getMark", new GetMarkFunctionBuilder()) + .addFunction("pull", new PullFunctionBuilder(main)); try { block = parser.parse(); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/PullFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/PullFunctionBuilder.java new file mode 100644 index 000000000..0c5ab641d --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/PullFunctionBuilder.java @@ -0,0 +1,43 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.functions.PullFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class PullFunctionBuilder implements FunctionBuilder { + private final TerraPlugin main; + + public PullFunctionBuilder(TerraPlugin main) { + this.main = main; + } + + @SuppressWarnings("unchecked") + @Override + public PullFunction build(List> argumentList, Position position) throws ParseException { + return new PullFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position); + } + + @Override + public int argNumber() { + return 4; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + switch(position) { + case 0: + case 1: + case 2: + return Returnable.ReturnType.NUMBER; + case 3: + return Returnable.ReturnType.STRING; + default: + return null; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java new file mode 100644 index 000000000..52858215a --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java @@ -0,0 +1,58 @@ +package com.dfsek.terra.api.structures.script.functions; + +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.RotationUtil; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedPulledBlock; +import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; + +public class PullFunction implements Function { + private final BlockData data; + private final Returnable x, y, z; + private final Position position; + + public PullFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) throws ParseException { + this.position = position; + if(!(data instanceof ConstantExpression)) throw new ParseException("Block data must be constant", data.getPosition()); + + this.data = main.getWorldHandle().createBlockData(((ConstantExpression) data).getConstant()); + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public String name() { + return "pull"; + } + + @Override + public Void apply(Buffer buffer, Rotation rotation, int recursions) { + Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); + + RotationUtil.rotateVector(xz, rotation); + BlockData rot = data.clone(); + RotationUtil.rotateBlockData(rot, rotation.inverse()); + buffer.addItem(new BufferedPulledBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + return null; + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedPulledBlock.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedPulledBlock.java new file mode 100644 index 000000000..8132a53a8 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedPulledBlock.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.api.structures.structure.buffer.items; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; + +public class BufferedPulledBlock implements BufferedItem { + private final BlockData data; + + public BufferedPulledBlock(BlockData data) { + this.data = data; + } + + @Override + public void paste(Location origin) { + Block pos = origin.getBlock(); + while(pos.getY() > 0) { + if(!pos.isEmpty()) { + pos.setBlockData(data, false); + break; + } + pos = pos.getRelative(BlockFace.DOWN); + } + } +} From cccb706ad5ed1485b0df074f088dbb3a37553a2a Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 25 Dec 2020 20:22:19 -0700 Subject: [PATCH 119/210] pass random to structure gen --- .../api/structures/parser/lang/Block.java | 5 +- .../api/structures/parser/lang/Item.java | 4 +- .../lang/constants/ConstantExpression.java | 4 +- .../lang/functions/builtin/AbsFunction.java | 6 +- .../lang/functions/builtin/PowFunction.java | 6 +- .../lang/functions/builtin/SqrtFunction.java | 6 +- .../parser/lang/keywords/BreakKeyword.java | 4 +- .../parser/lang/keywords/ContinueKeyword.java | 4 +- .../parser/lang/keywords/FailKeyword.java | 4 +- .../parser/lang/keywords/ReturnKeyword.java | 4 +- .../lang/keywords/looplike/ForKeyword.java | 8 ++- .../lang/keywords/looplike/IfKeyword.java | 6 +- .../lang/keywords/looplike/WhileKeyword.java | 8 ++- .../lang/operations/BinaryOperation.java | 6 +- .../lang/operations/UnaryOperation.java | 6 +- .../parser/lang/variables/Assignment.java | 6 +- .../parser/lang/variables/Getter.java | 4 +- .../structures/script/StructureScript.java | 9 +-- .../script/functions/BlockFunction.java | 8 ++- .../script/functions/CheckFunction.java | 16 +++--- .../script/functions/GetMarkFunction.java | 8 ++- .../script/functions/MarkFunction.java | 8 ++- .../script/functions/PullFunction.java | 8 ++- .../script/functions/RandomFunction.java | 6 +- .../script/functions/RecursionsFunction.java | 4 +- .../script/functions/StructureFunction.java | 16 +++--- .../dfsek/terra/config/base/ConfigPack.java | 6 +- .../config/factories/StructureFactory.java | 2 +- .../config/templates/StructureTemplate.java | 20 +++++-- .../generation/items/TerraStructure.java | 12 ++-- .../generation/items/tree/TerraTree.java | 2 +- .../terra/population/StructurePopulator.java | 49 ++++++---------- .../terra/registry/StructureRegistry.java | 5 ++ .../dfsek/terra/registry/TreeRegistry.java | 1 - .../src/test/java/structure/ParserTest.java | 9 +-- .../structure/load/LoadRawCommand.java | 57 +------------------ 36 files changed, 166 insertions(+), 171 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index 757ad40c7..de890168e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.List; +import java.util.Random; public class Block implements Item { private final List> items; @@ -20,9 +21,9 @@ public class Block implements Item { } @Override - public synchronized ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { + public synchronized ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { for(Item item : items) { - Object result = item.apply(buffer, rotation, recursions); + Object result = item.apply(buffer, rotation, random, recursions); if(result instanceof ReturnLevel) { ReturnLevel level = (ReturnLevel) result; if(!level.equals(ReturnLevel.NONE)) return level; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java index 3d6299821..9b6c752f4 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java @@ -4,8 +4,10 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import java.util.Random; + public interface Item { - T apply(Buffer buffer, Rotation rotation, int recursions); + T apply(Buffer buffer, Rotation rotation, Random random, int recursions); Position getPosition(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java index 659b26d12..cb62ef26d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java @@ -5,6 +5,8 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import java.util.Random; + public abstract class ConstantExpression implements Returnable { private final T constant; private final Position position; @@ -15,7 +17,7 @@ public abstract class ConstantExpression implements Returnable { } @Override - public T apply(Buffer buffer, Rotation rotation, int recursions) { + public T apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return constant; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java index 1bb2e4aea..cb83489c8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java @@ -6,6 +6,8 @@ import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; +import java.util.Random; + public class AbsFunction extends MathFunction { private final Returnable returnable; @@ -20,7 +22,7 @@ public class AbsFunction extends MathFunction { } @Override - public Number apply(Buffer buffer, Rotation rotation, int recursions) { - return FastMath.abs(returnable.apply(buffer, rotation, recursions).doubleValue()); + public Number apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + return FastMath.abs(returnable.apply(buffer, rotation, random, recursions).doubleValue()); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java index 7aa7d6313..431f14075 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java @@ -6,6 +6,8 @@ import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; +import java.util.Random; + public class PowFunction extends MathFunction { private final Returnable base; private final Returnable power; @@ -22,7 +24,7 @@ public class PowFunction extends MathFunction { } @Override - public Number apply(Buffer buffer, Rotation rotation, int recursions) { - return FastMath.pow(base.apply(buffer, rotation, recursions).doubleValue(), power.apply(buffer, rotation, recursions).doubleValue()); + public Number apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + return FastMath.pow(base.apply(buffer, rotation, random, recursions).doubleValue(), power.apply(buffer, rotation, random, recursions).doubleValue()); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java index 2dd10f7a5..35e746f47 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java @@ -6,6 +6,8 @@ import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; +import java.util.Random; + public class SqrtFunction extends MathFunction { private final Returnable returnable; @@ -20,7 +22,7 @@ public class SqrtFunction extends MathFunction { } @Override - public Number apply(Buffer buffer, Rotation rotation, int recursions) { - return FastMath.sqrt(returnable.apply(buffer, rotation, recursions).doubleValue()); + public Number apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + return FastMath.sqrt(returnable.apply(buffer, rotation, random, recursions).doubleValue()); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java index cca02e379..6d205dbf3 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java @@ -6,6 +6,8 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import java.util.Random; + public class BreakKeyword implements Keyword { private final Position position; @@ -14,7 +16,7 @@ public class BreakKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { + public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return Block.ReturnLevel.BREAK; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java index 84ecde967..72b2cfa73 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java @@ -6,6 +6,8 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import java.util.Random; + public class ContinueKeyword implements Keyword { private final Position position; @@ -14,7 +16,7 @@ public class ContinueKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { + public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return Block.ReturnLevel.CONTINUE; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/FailKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/FailKeyword.java index bb4904cef..1277946a0 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/FailKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/FailKeyword.java @@ -6,6 +6,8 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import java.util.Random; + public class FailKeyword implements Keyword { private final Position position; @@ -14,7 +16,7 @@ public class FailKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { + public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return Block.ReturnLevel.FAIL; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java index 0ef544adf..27df59d2b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java @@ -6,6 +6,8 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import java.util.Random; + public class ReturnKeyword implements Keyword { private final Position position; @@ -14,7 +16,7 @@ public class ReturnKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { + public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return Block.ReturnLevel.RETURN; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java index 39f96a36a..6cdd7845c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java @@ -8,6 +8,8 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import java.util.Random; + public class ForKeyword implements Keyword { private final Block conditional; private final Item initializer; @@ -24,9 +26,9 @@ public class ForKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { - for(initializer.apply(buffer, rotation, recursions); statement.apply(buffer, rotation, recursions); incrementer.apply(buffer, rotation, recursions)) { - Block.ReturnLevel level = conditional.apply(buffer, rotation, recursions); + public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + for(initializer.apply(buffer, rotation, random, recursions); statement.apply(buffer, rotation, random, recursions); incrementer.apply(buffer, rotation, random, recursions)) { + Block.ReturnLevel level = conditional.apply(buffer, rotation, random, recursions); if(level.equals(Block.ReturnLevel.BREAK)) break; if(level.isReturnFast()) return level; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java index 62e4892b1..7d287b9e8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java @@ -7,6 +7,8 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import java.util.Random; + public class IfKeyword implements Keyword { private final Block conditional; private final Returnable statement; @@ -19,8 +21,8 @@ public class IfKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { - if(statement.apply(buffer, rotation, recursions)) return conditional.apply(buffer, rotation, recursions); + public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + if(statement.apply(buffer, rotation, random, recursions)) return conditional.apply(buffer, rotation, random, recursions); return Block.ReturnLevel.NONE; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java index ab6629812..014542d45 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java @@ -7,6 +7,8 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import java.util.Random; + public class WhileKeyword implements Keyword { private final Block conditional; private final Returnable statement; @@ -19,9 +21,9 @@ public class WhileKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, int recursions) { - while(statement.apply(buffer, rotation, recursions)) { - Block.ReturnLevel level = conditional.apply(buffer, rotation, recursions); + public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + while(statement.apply(buffer, rotation, random, recursions)) { + Block.ReturnLevel level = conditional.apply(buffer, rotation, random, recursions); if(level.equals(Block.ReturnLevel.BREAK)) break; if(level.isReturnFast()) return level; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java index b0940e64e..5c6fd1cfb 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java @@ -5,6 +5,8 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import java.util.Random; + public abstract class BinaryOperation implements Returnable { private final Returnable left; private final Returnable right; @@ -24,7 +26,7 @@ public abstract class BinaryOperation implements Returnable { } @Override - public O apply(Buffer buffer, Rotation rotation, int recursions) { - return apply(left.apply(buffer, rotation, recursions), right.apply(buffer, rotation, recursions)); + public O apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + return apply(left.apply(buffer, rotation, random, recursions), right.apply(buffer, rotation, random, recursions)); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java index 9af54cf5a..e1c145e95 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java @@ -5,6 +5,8 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import java.util.Random; + public abstract class UnaryOperation implements Returnable { private final Returnable input; private final Position position; @@ -17,8 +19,8 @@ public abstract class UnaryOperation implements Returnable { public abstract T apply(T input); @Override - public T apply(Buffer buffer, Rotation rotation, int recursions) { - return apply(input.apply(buffer, rotation, recursions)); + public T apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + return apply(input.apply(buffer, rotation, random, recursions)); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java index 6fd672db2..006769089 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java @@ -6,6 +6,8 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import java.util.Random; + public class Assignment implements Item { private final Variable delegate; private final Returnable value; @@ -18,8 +20,8 @@ public class Assignment implements Item { } @Override - public synchronized T apply(Buffer buffer, Rotation rotation, int recursions) { - T val = value.apply(buffer, rotation, recursions); + public synchronized T apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + T val = value.apply(buffer, rotation, random, recursions); delegate.setValue(val); return val; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java index 761ee1930..20823fb4f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java @@ -5,6 +5,8 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import java.util.Random; + public class Getter implements Returnable { private final Variable delegate; @@ -18,7 +20,7 @@ public class Getter implements Returnable { } @Override - public synchronized Object apply(Buffer buffer, Rotation rotation, int recursions) { + public synchronized Object apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return delegate.getValue(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 743e94e37..d090cba7c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -21,6 +21,7 @@ import org.apache.commons.io.IOUtils; import java.io.IOException; import java.io.InputStream; +import java.util.Random; public class StructureScript { private final Block block; @@ -57,15 +58,15 @@ public class StructureScript { * @param rotation Rotation of structure * @return Whether generation was successful */ - public boolean execute(Location location, Rotation rotation) { + public boolean execute(Location location, Random random, Rotation rotation) { StructureBuffer buffer = new StructureBuffer(location); - Block.ReturnLevel level = block.apply(buffer, rotation, 0); + Block.ReturnLevel level = block.apply(buffer, rotation, random, 0); buffer.paste(); return !level.equals(Block.ReturnLevel.FAIL); } - public void executeInBuffer(Buffer buffer, Rotation rotation, int recursions) { - block.apply(buffer, rotation, recursions); + public void executeInBuffer(Buffer buffer, Random random, Rotation rotation, int recursions) { + block.apply(buffer, rotation, random, recursions); } public String getId() { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index 01dc7946c..d216222c6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -15,6 +15,8 @@ import com.dfsek.terra.api.structures.structure.buffer.items.BufferedBlock; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; +import java.util.Random; + public class BlockFunction implements Function { private final BlockData data; private final Returnable x, y, z; @@ -36,13 +38,13 @@ public class BlockFunction implements Function { } @Override - public Void apply(Buffer buffer, Rotation rotation, int recursions) { - Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); + public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); BlockData rot = data.clone(); RotationUtil.rotateBlockData(rot, rotation.inverse()); - buffer.addItem(new BufferedBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + buffer.addItem(new BufferedBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index c23545b95..69a3cc73f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -15,6 +15,8 @@ import com.dfsek.terra.api.structures.world.LandCheck; import com.dfsek.terra.api.structures.world.OceanCheck; import net.jafama.FastMath; +import java.util.Random; + public class CheckFunction implements Function { private final TerraPlugin main; private final Returnable x, y, z; @@ -33,17 +35,17 @@ public class CheckFunction implements Function { return "check"; } - private Location getVector(Buffer buffer, Rotation rotation, int recursions) { - Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); + + @Override + public String apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + + Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); - return buffer.getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); - } + Location location = buffer.getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); - @Override - public String apply(Buffer buffer, Rotation rotation, int recursions) { - return apply(getVector(buffer, rotation, recursions), buffer.getOrigin().getWorld()); + return apply(location, buffer.getOrigin().getWorld()); } private String apply(Location vector, World world) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java index 13ab0bf56..34991865f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java @@ -12,6 +12,8 @@ import com.dfsek.terra.api.structures.structure.buffer.items.Mark; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; +import java.util.Random; + public class GetMarkFunction implements Function { private final Returnable x, y, z; private final Position position; @@ -29,11 +31,11 @@ public class GetMarkFunction implements Function { } @Override - public String apply(Buffer buffer, Rotation rotation, int recursions) { - Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); + public String apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); - Mark mark = buffer.getMark(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + Mark mark = buffer.getMark(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); return mark == null ? "" : mark.getContent(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java index 562d47bfa..a30a36c50 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java @@ -12,6 +12,8 @@ import com.dfsek.terra.api.structures.structure.buffer.items.Mark; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; +import java.util.Random; + public class MarkFunction implements Function { private final Returnable x, y, z; private final Position position; @@ -31,12 +33,12 @@ public class MarkFunction implements Function { } @Override - public Void apply(Buffer buffer, Rotation rotation, int recursions) { - Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); + public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); - buffer.setMark(new Mark(mark.apply(buffer, rotation, recursions)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + buffer.setMark(new Mark(mark.apply(buffer, rotation, random, recursions)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java index 52858215a..7f7734792 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java @@ -15,6 +15,8 @@ import com.dfsek.terra.api.structures.structure.buffer.items.BufferedPulledBlock import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; +import java.util.Random; + public class PullFunction implements Function { private final BlockData data; private final Returnable x, y, z; @@ -36,13 +38,13 @@ public class PullFunction implements Function { } @Override - public Void apply(Buffer buffer, Rotation rotation, int recursions) { - Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); + public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); BlockData rot = data.clone(); RotationUtil.rotateBlockData(rot, rotation.inverse()); - buffer.addItem(new BufferedPulledBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + buffer.addItem(new BufferedPulledBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java index f07c0a88e..b0fb3666c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java @@ -6,7 +6,7 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.concurrent.ThreadLocalRandom; +import java.util.Random; public class RandomFunction implements Function { private final Returnable numberReturnable; @@ -29,8 +29,8 @@ public class RandomFunction implements Function { } @Override - public Integer apply(Buffer buffer, Rotation rotation, int recursions) { - return ThreadLocalRandom.current().nextInt(numberReturnable.apply(buffer, rotation, recursions).intValue()); // TODO: deterministic random + public Integer apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + return random.nextInt(numberReturnable.apply(buffer, rotation, random, recursions).intValue()); // TODO: deterministic random } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java index eb7fc7060..57050332c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java @@ -5,6 +5,8 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import java.util.Random; + public class RecursionsFunction implements Function { private final Position position; @@ -23,7 +25,7 @@ public class RecursionsFunction implements Function { } @Override - public Number apply(Buffer buffer, Rotation rotation, int recursions) { + public Number apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return recursions; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index f6a252565..f0ca21093 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -15,7 +15,7 @@ import com.dfsek.terra.registry.ScriptRegistry; import net.jafama.FastMath; import java.util.List; -import java.util.concurrent.ThreadLocalRandom; +import java.util.Random; public class StructureFunction implements Function { private final ScriptRegistry registry; @@ -47,20 +47,20 @@ public class StructureFunction implements Function { } @Override - public Void apply(Buffer buffer, Rotation rotation, int recursions) { + public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - Vector2 xz = new Vector2(x.apply(buffer, rotation, recursions).doubleValue(), z.apply(buffer, rotation, recursions).doubleValue()); + Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); RotationUtil.rotateVector(xz, rotation); - StructureScript script = registry.get(id.apply(buffer, rotation, recursions)); + StructureScript script = registry.get(id.apply(buffer, rotation, random, recursions)); if(script == null) { - main.getLogger().severe("No such structure " + id.apply(buffer, rotation, recursions)); + main.getLogger().severe("No such structure " + id.apply(buffer, rotation, random, recursions)); return null; } Rotation rotation1; - String rotString = rotations.get(ThreadLocalRandom.current().nextInt(rotations.size())).apply(buffer, rotation, recursions); + String rotString = rotations.get(random.nextInt(rotations.size())).apply(buffer, rotation, random, recursions); try { rotation1 = Rotation.valueOf(rotString); } catch(IllegalArgumentException e) { @@ -68,9 +68,9 @@ public class StructureFunction implements Function { return null; } - Vector3 offset = new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, recursions).intValue(), FastMath.roundToInt(xz.getZ())); + Vector3 offset = new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ())); - script.executeInBuffer(new IntermediateBuffer(buffer, offset), rotation.rotate(rotation1), recursions + 1); + script.executeInBuffer(new IntermediateBuffer(buffer, offset), random, rotation.rotate(rotation1), recursions + 1); return null; } diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index b9d63aacc..dc48794c7 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -24,6 +24,7 @@ import com.dfsek.terra.config.factories.CarverFactory; import com.dfsek.terra.config.factories.FloraFactory; import com.dfsek.terra.config.factories.OreFactory; import com.dfsek.terra.config.factories.PaletteFactory; +import com.dfsek.terra.config.factories.StructureFactory; import com.dfsek.terra.config.factories.TerraFactory; import com.dfsek.terra.config.factories.TreeFactory; import com.dfsek.terra.config.files.FolderLoader; @@ -38,6 +39,7 @@ import com.dfsek.terra.config.templates.CarverTemplate; import com.dfsek.terra.config.templates.FloraTemplate; import com.dfsek.terra.config.templates.OreTemplate; import com.dfsek.terra.config.templates.PaletteTemplate; +import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.config.templates.TreeTemplate; import com.dfsek.terra.generation.items.TerraStructure; import com.dfsek.terra.generation.items.ores.Ore; @@ -155,6 +157,7 @@ public class ConfigPack implements LoaderRegistrar { .open("palettes", ".yml").then(streams -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.load(streams, PaletteTemplate::new), main)).close() .open("ores", ".yml").then(streams -> buildAll(new OreFactory(), oreRegistry, abstractConfigLoader.load(streams, OreTemplate::new), main)).close() .open("structures/trees", ".yml").then(streams -> buildAll(new TreeFactory(), treeRegistry, abstractConfigLoader.load(streams, TreeTemplate::new), main)).close() + .open("structures/structures", ".yml").then(streams -> buildAll(new StructureFactory(), structureRegistry, abstractConfigLoader.load(streams, StructureTemplate::new), main)).close() .open("flora", ".yml").then(streams -> buildAll(new FloraFactory(), floraRegistry, abstractConfigLoader.load(streams, FloraTemplate::new), main)).close() .open("carving", ".yml").then(streams -> buildAll(new CarverFactory(this), carverRegistry, abstractConfigLoader.load(streams, CarverTemplate::new), main)).close() .open("biomes", ".yml").then(streams -> buildAll(new BiomeFactory(this), biomeRegistry, abstractConfigLoader.load(streams, () -> new BiomeTemplate(this, main)), main)).close() @@ -242,7 +245,8 @@ public class ConfigPack implements LoaderRegistrar { .registerLoader(Flora.class, floraRegistry) .registerLoader(Ore.class, oreRegistry) .registerLoader(Tree.class, treeRegistry) - .registerLoader(StructureScript.class, scriptRegistry); + .registerLoader(StructureScript.class, scriptRegistry) + .registerLoader(TerraStructure.class, structureRegistry); } public ScriptRegistry getScriptRegistry() { diff --git a/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java index 0c8a65ce3..f8c54728a 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java @@ -8,6 +8,6 @@ import com.dfsek.terra.generation.items.TerraStructure; public class StructureFactory implements TerraFactory { @Override public TerraStructure build(StructureTemplate config, TerraPlugin main) throws LoadException { - return new TerraStructure(null, config.getBound(), config.getY(), config.getSpawn(), config.getLoot(), config); + return new TerraStructure(config.getStructures(), config.getBound(), config.getY(), config.getSpawn(), config.getLoot(), config); } } diff --git a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java index 05b5c4634..b4f241bb9 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java @@ -3,9 +3,11 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; +import com.dfsek.tectonic.config.ValidatedConfigTemplate; +import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.terra.api.loot.LootTable; -import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.procgen.GridSpawn; @@ -13,13 +15,13 @@ import java.util.List; import java.util.Map; @SuppressWarnings({"unused", "FieldMayBeFinal"}) -public class StructureTemplate extends AbstractableTemplate { +public class StructureTemplate extends AbstractableTemplate implements ValidatedConfigTemplate { @Value("id") private String id; - @Value("files") + @Value("script") @Abstractable - private ProbabilityCollection structures; + private StructureScript structure; @Value("spawn.start") @Abstractable @@ -50,8 +52,8 @@ public class StructureTemplate extends AbstractableTemplate { return id; } - public ProbabilityCollection getStructures() { - return structures; + public StructureScript getStructures() { + return structure; } public Range getY() { @@ -69,4 +71,10 @@ public class StructureTemplate extends AbstractableTemplate { public GridSpawn getSpawn() { return spawn; } + + @Override + public boolean validate() throws ValidationException { + System.out.println("added structure " + id); + return true; + } } diff --git a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java index 2119d038d..883490390 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java @@ -1,8 +1,8 @@ package com.dfsek.terra.generation.items; import com.dfsek.terra.api.loot.LootTable; -import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.procgen.GridSpawn; @@ -10,15 +10,15 @@ import java.util.Map; // TODO: implementation public class TerraStructure { - private final ProbabilityCollection structures; + private final StructureScript structure; private final Range bound; private final Range spawnStart; private final GridSpawn spawn; private final Map loot; private final StructureTemplate template; - public TerraStructure(ProbabilityCollection structures, Range bound, Range spawnStart, GridSpawn spawn, Map loot, StructureTemplate template) { - this.structures = structures; + public TerraStructure(StructureScript structures, Range bound, Range spawnStart, GridSpawn spawn, Map loot, StructureTemplate template) { + this.structure = structures; this.bound = bound; this.spawnStart = spawnStart; this.spawn = spawn; @@ -30,8 +30,8 @@ public class TerraStructure { return template; } - public ProbabilityCollection getStructures() { - return structures; + public StructureScript getStructure() { + return structure; } public Range getBound() { diff --git a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index bbe7edd79..90a124e9a 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -21,7 +21,7 @@ public class TerraTree implements Tree { @Override public synchronized boolean plant(Location location, Random random) { - structure.execute(location.clone().add(0, yOffset, 0), Rotation.fromDegrees(90 * random.nextInt(4))); + structure.execute(location.clone().add(0, yOffset, 0), random, Rotation.fromDegrees(90 * random.nextInt(4))); return true; } diff --git a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java index a037bb555..f99c6bcc5 100644 --- a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -1,9 +1,20 @@ package com.dfsek.terra.population; +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.profiler.ProfileFuture; +import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; +import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import com.dfsek.terra.config.base.ConfigPack; +import com.dfsek.terra.debug.Debug; +import com.dfsek.terra.generation.items.TerraStructure; +import com.dfsek.terra.util.PopulationUtil; +import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; import java.util.Random; @@ -18,7 +29,6 @@ public class StructurePopulator implements TerraBlockPopulator { @SuppressWarnings("try") @Override public void populate(@NotNull World world, @NotNull Random r, @NotNull Chunk chunk) { - /* TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("StructureTime")) { Random random = PopulationUtil.getRandom(chunk); @@ -27,42 +37,17 @@ public class StructurePopulator implements TerraBlockPopulator { if(!tw.isSafe()) return; TerraBiomeGrid grid = tw.getGrid(); ConfigPack config = tw.getConfig(); - structure: for(TerraStructure conf : config.getStructures()) { Location spawn = conf.getSpawn().getNearestSpawn(cx + 8, cz + 8, world.getSeed()).toLocation(world); + + if(!(FastMath.floorDiv(spawn.getBlockX(), 16) == chunk.getX()) || !(FastMath.floorDiv(spawn.getBlockZ(), 16) == chunk.getZ())) + continue; + if(!((UserDefinedBiome) grid.getBiome(spawn)).getConfig().getStructures().contains(conf)) continue; - Random r2 = new FastRandom(spawn.hashCode()); - Structure struc = conf.getStructures().get(r2); - Rotation rotation = Rotation.fromDegrees(r2.nextInt(4) * 90); - for(int y = conf.getSpawnStart().get(r2); y > 0; y--) { - if(!conf.getBound().isInRange(y)) continue structure; - spawn.setY(y); - if(!struc.checkSpawns(spawn, rotation, main)) continue; - double horizontal = struc.getStructureInfo().getMaxHorizontal(); - if(FastMath.abs((cx + 8) - spawn.getBlockX()) <= horizontal && FastMath.abs((cz + 8) - spawn.getBlockZ()) <= horizontal) { - struc.paste(spawn, chunk, rotation, main); - for(StructureContainedInventory i : struc.getInventories()) { - try { - Vector2 lootCoords = RotationUtil.rotateVector(new Vector2(i.getX() - struc.getStructureInfo().getCenterX(), i.getZ() - struc.getStructureInfo().getCenterZ()), rotation.inverse()); - Location inv = spawn.clone().add(lootCoords.getX(), i.getY(), lootCoords.getZ()); - if(FastMath.floorDiv(inv.getBlockX(), 16) != chunk.getX() || FastMath.floorDiv(inv.getBlockZ(), 16) != chunk.getZ()) - continue; - LootTable table = conf.getLoot().get(i.getUid()); - if(table == null) continue; - table.fillInventory(((BlockInventoryHolder) inv.getBlock().getState()).getInventory(), random); - } catch(ClassCastException e) { - Debug.error("Could not populate structure loot!"); - Debug.stack(e); - } - } - for(Feature f : conf.getTemplate().getFeatures()) f.apply(struc, rotation, spawn, chunk); // Apply features. - break; - } - } + Debug.info("Generating structure at (" + spawn.getBlockX() + ", " + spawn.getBlockY() + ", " + spawn.getBlockZ() + ")"); + conf.getStructure().execute(spawn.setY(conf.getSpawnStart().get(random)), random, Rotation.fromDegrees(90 * random.nextInt(4))); } } - - */ } } diff --git a/common/src/main/java/com/dfsek/terra/registry/StructureRegistry.java b/common/src/main/java/com/dfsek/terra/registry/StructureRegistry.java index 70af101f2..65f1de110 100644 --- a/common/src/main/java/com/dfsek/terra/registry/StructureRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/StructureRegistry.java @@ -3,4 +3,9 @@ package com.dfsek.terra.registry; import com.dfsek.terra.generation.items.TerraStructure; public class StructureRegistry extends TerraRegistry { + @Override + public boolean add(String name, TerraStructure value) { + System.out.println("added structure " + name + " to registry"); + return super.add(name, value); + } } diff --git a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java index 0c145a06c..b705de472 100644 --- a/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/TreeRegistry.java @@ -70,7 +70,6 @@ public class TreeRegistry extends TerraRegistry { @Override public boolean add(String name, Tree value) { - System.out.println("Added " + name); return super.add(name, value); } diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index f6e75b9ed..707501fea 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -14,6 +14,7 @@ import org.junit.jupiter.api.Test; import java.io.IOException; import java.util.List; +import java.util.Random; public class ParserTest { @Test @@ -50,9 +51,9 @@ public class ParserTest { long t = System.nanoTime() - l; System.out.println("Took " + (double) t / 1000000); - block.apply(null, Rotation.NONE, 0); + block.apply(null, Rotation.NONE, new Random(), 0); - block.apply(null, Rotation.NONE, 0); + block.apply(null, Rotation.NONE, new Random(), 0); } private static class Test1 implements Function { @@ -67,8 +68,8 @@ public class ParserTest { } @Override - public Void apply(Buffer buffer, Rotation rotation, int recursions) { - System.out.println("string: " + a.apply(buffer, rotation, recursions) + ", double: " + b.apply(buffer, rotation, recursions)); + public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + System.out.println("string: " + a.apply(buffer, rotation, random, recursions) + ", double: " + b.apply(buffer, rotation, random, recursions)); return null; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index b125ddbbc..43964e9f4 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -3,6 +3,7 @@ package com.dfsek.terra.bukkit.command.command.structure.load; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; import org.bukkit.block.Sign; @@ -36,65 +37,11 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { TerraWorld terraWorld = getMain().getWorld(new BukkitWorld(sender.getWorld())); long t = System.nanoTime(); - terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), Rotation.fromDegrees(90 * ThreadLocalRandom.current().nextInt(4))); + terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), new FastRandom(), Rotation.fromDegrees(90 * ThreadLocalRandom.current().nextInt(4))); long l = System.nanoTime() - t; sender.sendMessage("Took " + ((double) l) / 1000000 + "ms"); - /* - try { - WorldHandle handle = ((TerraBukkitPlugin) getMain()).getWorldHandle(); - Structure struc = Structure.load(new File(getMain().getDataFolder() + File.separator + "export" + File.separator + "structures", args[0] + ".tstructure")); - StructureInfo info = struc.getStructureInfo(); - int centerX = info.getCenterX(); - int centerZ = info.getCenterZ(); - for(StructureContainedBlock[][] level0 : struc.getRawStructure()) { - for(StructureContainedBlock[] level1 : level0) { - for(StructureContainedBlock block : level1) { - Location bLocation = sender.getLocation().add(block.getX() - centerX, block.getY(), block.getZ() - centerZ); - if(!block.getPull().equals(StructureContainedBlock.Pull.NONE)) { - handle.setBlockData(bLocation.getBlock(), Material.OAK_SIGN.createBlockData(), false); - Sign sign = (Sign) bLocation.getBlock().getState(); - sign.setLine(1, "[PULL=" + block.getPull() + "_" + block.getPullOffset() + "]"); - String data = block.getBlockData().getAsString(true); - setTerraSign(sign, data); - sign.update(); - } else if(!block.getRequirement().equals(StructureSpawnRequirement.BLANK)) { - handle.setBlockData(bLocation.getBlock(), Material.OAK_SIGN.createBlockData(), false); - Sign sign = (Sign) bLocation.getBlock().getState(); - sign.setLine(1, "[SPAWN=" + block.getRequirement() + "]"); - String data = block.getBlockData().getAsString(true); - setTerraSign(sign, data); - sign.update(); - } else { - handle.setBlockData(bLocation.getBlock(), block.getBlockData(), false); - if(block.getState() != null) { - block.getState().getState(bLocation.getBlock().getState()).update(true, false); - } - } - } - } - } - - for(int y = 0; y < struc.getStructureInfo().getSizeY(); y++) { - StructureContainedBlock block = struc.getRawStructure()[centerX][centerZ][y]; - if(block.getRequirement().equals(StructureSpawnRequirement.BLANK) && block.getPull().equals(StructureContainedBlock.Pull.NONE)) { - Location bLocation = sender.getLocation().add(block.getX() - centerX, block.getY(), block.getZ() - centerZ); - handle.setBlockData(bLocation.getBlock(), Material.OAK_SIGN.createBlockData(), false); - Sign sign = (Sign) bLocation.getBlock().getState(); - sign.setLine(1, "[CENTER]"); - String data = block.getBlockData().getAsString(true); - setTerraSign(sign, data); - sign.update(); - break; - } - } - } catch(IOException e) { - e.printStackTrace(); - LangUtil.send("command.structure.invalid", sender, args[0]); - } - - */ return true; } From 5db149434190f809030942ad943becc9a479ea5d Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 25 Dec 2020 20:43:41 -0700 Subject: [PATCH 120/210] implement script structures with chunkification(tm) --- .../structures/script/StructureScript.java | 8 +++++ .../structure/buffer/StructureBuffer.java | 9 +++++ .../terra/population/StructurePopulator.java | 12 +++---- .../structure/load/LoadFullCommand.java | 36 +++++++++---------- .../structure/load/LoadRawCommand.java | 7 ++-- 5 files changed, 44 insertions(+), 28 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index d090cba7c..acf7b147d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -2,6 +2,7 @@ package com.dfsek.terra.api.structures.script; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; @@ -65,6 +66,13 @@ public class StructureScript { return !level.equals(Block.ReturnLevel.FAIL); } + public boolean execute(Location location, Chunk chunk, Random random, Rotation rotation) { + StructureBuffer buffer = new StructureBuffer(location); + Block.ReturnLevel level = block.apply(buffer, rotation, random, 0); + buffer.paste(chunk); + return !level.equals(Block.ReturnLevel.FAIL); + } + public void executeInBuffer(Buffer buffer, Random random, Rotation rotation, int recursions) { block.apply(buffer, rotation, random, recursions); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java index e2e527a1f..3d6ef9494 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java @@ -2,8 +2,10 @@ package com.dfsek.terra.api.structures.structure.buffer; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; import com.dfsek.terra.api.structures.structure.buffer.items.Mark; +import net.jafama.FastMath; import java.util.HashMap; import java.util.Map; @@ -17,7 +19,14 @@ public class StructureBuffer implements Buffer { } public void paste() { + bufferedItemMap.forEach(((vector3, item) -> item.paste(origin.clone().add(vector3)))); + } + + public void paste(Chunk chunk) { bufferedItemMap.forEach(((vector3, item) -> { + Location current = origin.clone().add(vector3); + if(FastMath.floorDiv(current.getBlockX(), 16) != chunk.getX() || FastMath.floorDiv(current.getBlockZ(), 16) != chunk.getZ()) + return; item.paste(origin.clone().add(vector3)); })); } diff --git a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java index f99c6bcc5..68c397f69 100644 --- a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -1,19 +1,19 @@ package com.dfsek.terra.population; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.profiler.ProfileFuture; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.items.TerraStructure; -import com.dfsek.terra.util.PopulationUtil; import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; @@ -31,7 +31,6 @@ public class StructurePopulator implements TerraBlockPopulator { public void populate(@NotNull World world, @NotNull Random r, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("StructureTime")) { - Random random = PopulationUtil.getRandom(chunk); int cx = (chunk.getX() << 4); int cz = (chunk.getZ() << 4); if(!tw.isSafe()) return; @@ -40,13 +39,10 @@ public class StructurePopulator implements TerraBlockPopulator { for(TerraStructure conf : config.getStructures()) { Location spawn = conf.getSpawn().getNearestSpawn(cx + 8, cz + 8, world.getSeed()).toLocation(world); - if(!(FastMath.floorDiv(spawn.getBlockX(), 16) == chunk.getX()) || !(FastMath.floorDiv(spawn.getBlockZ(), 16) == chunk.getZ())) - continue; - if(!((UserDefinedBiome) grid.getBiome(spawn)).getConfig().getStructures().contains(conf)) continue; - Debug.info("Generating structure at (" + spawn.getBlockX() + ", " + spawn.getBlockY() + ", " + spawn.getBlockZ() + ")"); - conf.getStructure().execute(spawn.setY(conf.getSpawnStart().get(random)), random, Rotation.fromDegrees(90 * random.nextInt(4))); + Random random = new FastRandom(MathUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), FastMath.floorDiv(spawn.getBlockZ(), 16), world.getSeed())); + conf.getStructure().execute(spawn.setY(conf.getSpawnStart().get(random)), chunk, random, Rotation.fromDegrees(90 * random.nextInt(4))); } } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java index 9c41388d1..b16ba77f9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java @@ -1,6 +1,13 @@ package com.dfsek.terra.bukkit.command.command.structure.load; +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.bukkit.BukkitChunk; +import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; +import com.dfsek.terra.util.PopulationUtil; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -21,25 +28,18 @@ public class LoadFullCommand extends LoadCommand implements DebugCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { - /* - try { - Rotation r; - try { - r = Rotation.fromDegrees(Integer.parseInt(args[1])); - } catch(NumberFormatException e) { - LangUtil.send("command.structure.invalid-rotation", sender, args[1]); - return true; - } - Structure struc = Structure.load(new File(getMain().getDataFolder() + File.separator + "export" + File.separator + "structures", args[0] + ".tstructure")); - if(chunk) struc.paste(sender.getLocation(), sender.getLocation().getChunk(), r, (TerraBukkitPlugin) getMain()); - else struc.paste(sender.getLocation(), r, (TerraBukkitPlugin) getMain()); - //sender.sendMessage(String.valueOf(struc.checkSpawns(sender.getLocation(), r))); - } catch(IOException e) { - e.printStackTrace(); - LangUtil.send("command.structure.invalid", sender, args[0]); - } + TerraWorld terraWorld = getMain().getWorld(new BukkitWorld(sender.getWorld())); + long t = System.nanoTime(); + FastRandom chunk = PopulationUtil.getRandom(new BukkitChunk(sender.getLocation().getChunk())); - */ + if(this.chunk) { + terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), new BukkitChunk(sender.getLocation().getChunk()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); + } else { + terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); + } + long l = System.nanoTime() - t; + + sender.sendMessage("Took " + ((double) l) / 1000000 + "ms"); return true; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index 43964e9f4..aadd39e12 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -4,8 +4,10 @@ import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.bukkit.BukkitChunk; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; +import com.dfsek.terra.util.PopulationUtil; import org.bukkit.block.Sign; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -14,7 +16,6 @@ import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; -import java.util.concurrent.ThreadLocalRandom; import java.util.stream.Collectors; public class LoadRawCommand extends LoadCommand implements DebugCommand { @@ -37,7 +38,9 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { TerraWorld terraWorld = getMain().getWorld(new BukkitWorld(sender.getWorld())); long t = System.nanoTime(); - terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), new FastRandom(), Rotation.fromDegrees(90 * ThreadLocalRandom.current().nextInt(4))); + FastRandom chunk = PopulationUtil.getRandom(new BukkitChunk(sender.getLocation().getChunk())); + + terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); long l = System.nanoTime() - t; sender.sendMessage("Took " + ((double) l) / 1000000 + "ms"); From 49f3c16a387d156d04a25bf55b49984c05102c05 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 25 Dec 2020 21:47:56 -0700 Subject: [PATCH 121/210] Implement BukkitOrientable --- .../dfsek/terra/bukkit/BukkitWorldHandle.java | 3 ++ .../world/block/data/BukkitEnumAdapter.java | 14 +++++++++ .../world/block/data/BukkitOrientable.java | 30 +++++++++++++++++++ .../world/block/data/TerraEnumAdapter.java | 14 +++++++++ 4 files changed, 61 insertions(+) create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java index 363d471c9..90f382204 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java @@ -11,6 +11,7 @@ import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.bukkit.world.block.data.BukkitDirectional; import com.dfsek.terra.bukkit.world.block.data.BukkitMultipleFacing; +import com.dfsek.terra.bukkit.world.block.data.BukkitOrientable; import com.dfsek.terra.bukkit.world.block.data.BukkitRotatable; import com.dfsek.terra.bukkit.world.block.data.BukkitSlab; import com.dfsek.terra.bukkit.world.block.data.BukkitStairs; @@ -19,6 +20,7 @@ import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.Directional; import org.bukkit.block.data.MultipleFacing; +import org.bukkit.block.data.Orientable; import org.bukkit.block.data.Rotatable; import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Slab; @@ -57,6 +59,7 @@ public class BukkitWorldHandle implements WorldHandle { if(bukkitData instanceof Slab) return new BukkitSlab((Slab) bukkitData); if(bukkitData instanceof Rotatable) return new BukkitRotatable((Rotatable) bukkitData); if(bukkitData instanceof Directional) return new BukkitDirectional((Directional) bukkitData); + if(bukkitData instanceof Orientable) return new BukkitOrientable((Orientable) bukkitData); if(bukkitData instanceof Waterlogged) return new BukkitWaterlogged((Waterlogged) bukkitData); return new BukkitBlockData(Bukkit.createBlockData(data)); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java index 25cfce14d..6d4a02445 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java @@ -1,6 +1,7 @@ package com.dfsek.terra.bukkit.world.block.data; +import com.dfsek.terra.api.platform.block.Axis; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Bisected; import com.dfsek.terra.api.platform.block.data.Slab; @@ -27,6 +28,19 @@ public final class BukkitEnumAdapter { } } + public static Axis fromBukkitAxis(org.bukkit.Axis axis) { + switch(axis) { + case X: + return Axis.X; + case Y: + return Axis.Y; + case Z: + return Axis.Z; + default: + throw new IllegalStateException(); + } + } + public static Bisected.Half fromBukkitHalf(org.bukkit.block.data.Bisected.Half half) { switch(half) { case BOTTOM: diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java new file mode 100644 index 000000000..b0793ce41 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java @@ -0,0 +1,30 @@ +package com.dfsek.terra.bukkit.world.block.data; + +import com.dfsek.terra.api.platform.block.Axis; +import com.dfsek.terra.api.platform.block.data.Orientable; +import com.dfsek.terra.bukkit.world.block.BukkitBlockData; + +import java.util.Set; +import java.util.stream.Collectors; + +public class BukkitOrientable extends BukkitBlockData implements Orientable { + + public BukkitOrientable(org.bukkit.block.data.Orientable delegate) { + super(delegate); + } + + @Override + public Set getAxes() { + return ((org.bukkit.block.data.Orientable) getHandle()).getAxes().stream().map(BukkitEnumAdapter::fromBukkitAxis).collect(Collectors.toSet()); + } + + @Override + public Axis getAxis() { + return BukkitEnumAdapter.fromBukkitAxis(((org.bukkit.block.data.Orientable) getHandle()).getAxis()); + } + + @Override + public void setAxis(Axis axis) { + ((org.bukkit.block.data.Orientable) getHandle()).setAxis(TerraEnumAdapter.fromTerraAxis(axis)); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java index 16094077b..426a8eeea 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java @@ -2,6 +2,7 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.BlockFace; +import org.bukkit.Axis; import org.bukkit.block.data.Bisected; import org.bukkit.block.data.type.Slab; import org.bukkit.block.data.type.Stairs; @@ -38,6 +39,19 @@ public final class TerraEnumAdapter { } } + public static Axis fromTerraAxis(com.dfsek.terra.api.platform.block.Axis axis) { + switch(axis) { + case Z: + return Axis.Z; + case Y: + return Axis.Y; + case X: + return Axis.X; + default: + throw new IllegalStateException(); + } + } + public static org.bukkit.block.BlockFace fromTerraBlockFace(BlockFace face) { switch(face) { case DOWN: From bc175979232d9f4926839c90feff8f27f30a66e2 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 25 Dec 2020 22:39:52 -0700 Subject: [PATCH 122/210] Implement structure caching mechanism --- .../dfsek/terra/api/math/vector/Location.java | 55 +++++++++++++++++++ .../structures/script/StructureScript.java | 19 ++++++- .../structure/buffer/StructureBuffer.java | 8 +++ 3 files changed, 79 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java b/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java index 38e67bc13..ee86b74ef 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java +++ b/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java @@ -3,9 +3,13 @@ package com.dfsek.terra.api.math.vector; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.world.World; +import java.util.Objects; + public class Location implements Cloneable { private World world; private Vector3 vector; + private double pitch; + private double yaw; public Location(World w, double x, double y, double z) { this.world = w; @@ -102,6 +106,57 @@ public class Location implements Cloneable { return this; } + @Override + public boolean equals(Object obj) { + if(!(obj instanceof Location)) { + return false; + } + final Location other = (Location) obj; + + World world = this.world; + World otherWorld = other.world; + if(!Objects.equals(world, otherWorld)) { + return false; + } + if(Double.doubleToLongBits(this.vector.getX()) != Double.doubleToLongBits(other.vector.getX())) { + return false; + } + if(Double.doubleToLongBits(this.vector.getY()) != Double.doubleToLongBits(other.vector.getY())) { + return false; + } + return Double.doubleToLongBits(this.vector.getZ()) == Double.doubleToLongBits(other.vector.getZ()); + } + + public double getPitch() { + return pitch; + } + + public void setPitch(double pitch) { + this.pitch = pitch; + } + + public double getYaw() { + return yaw; + } + + public void setYaw(double yaw) { + this.yaw = yaw; + } + + @Override + public int hashCode() { + int hash = 3; + + World world = (this.world == null) ? null : this.world; + hash = 19 * hash + (world != null ? world.hashCode() : 0); + hash = 19 * hash + (int) (Double.doubleToLongBits(this.vector.getX()) ^ (Double.doubleToLongBits(this.vector.getX()) >>> 32)); + hash = 19 * hash + (int) (Double.doubleToLongBits(this.vector.getY()) ^ (Double.doubleToLongBits(this.vector.getY()) >>> 32)); + hash = 19 * hash + (int) (Double.doubleToLongBits(this.vector.getZ()) ^ (Double.doubleToLongBits(this.vector.getZ()) >>> 32)); + hash = 19 * hash + (int) (Double.doubleToLongBits(this.pitch) ^ Double.doubleToLongBits(this.pitch) >>> 32); + hash = 19 * hash + (int) (Double.doubleToLongBits(this.yaw) ^ Double.doubleToLongBits(this.yaw) >>> 32); + return hash; + } + public Vector3 toVector() { return vector.clone(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index acf7b147d..8449d66e7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -22,11 +22,19 @@ import org.apache.commons.io.IOUtils; import java.io.IOException; import java.io.InputStream; +import java.util.LinkedHashMap; +import java.util.Map; import java.util.Random; public class StructureScript { private final Block block; private final String id; + private final LinkedHashMap cache = new LinkedHashMap() { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return this.size() > 128; + } + }; public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry) { Parser parser; @@ -67,10 +75,15 @@ public class StructureScript { } public boolean execute(Location location, Chunk chunk, Random random, Rotation rotation) { - StructureBuffer buffer = new StructureBuffer(location); - Block.ReturnLevel level = block.apply(buffer, rotation, random, 0); + StructureBuffer buffer = cache.computeIfAbsent(location, loc -> { + System.out.println("Recalculating for (" + loc.getBlockX() + ", " + loc.getBlockZ() + "), chunk {" + chunk.getX() + ", " + chunk.getZ() + "}, cache size: " + cache.size()); + StructureBuffer buf = new StructureBuffer(loc); + Block.ReturnLevel level = block.apply(buf, rotation, random, 0); + buf.setSucceeded(!level.equals(Block.ReturnLevel.FAIL)); + return buf; + }); buffer.paste(chunk); - return !level.equals(Block.ReturnLevel.FAIL); + return buffer.succeeded(); } public void executeInBuffer(Buffer buffer, Random random, Rotation rotation, int recursions) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java index 3d6ef9494..bb0afb6dd 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java @@ -13,6 +13,7 @@ import java.util.Map; public class StructureBuffer implements Buffer { private final Map bufferedItemMap = new HashMap<>(); private final Location origin; + private boolean succeeded; public StructureBuffer(Location origin) { this.origin = origin; @@ -54,6 +55,13 @@ public class StructureBuffer implements Buffer { return this; } + public void setSucceeded(boolean succeeded) { + this.succeeded = succeeded; + } + + public boolean succeeded() { + return succeeded; + } @Override public Location getOrigin() { From ddc2cea42735d3bbbf262a6152505d342dfc6a27 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 26 Dec 2020 01:38:54 -0700 Subject: [PATCH 123/210] implement all Bukkit block data --- .../dfsek/terra/bukkit/BukkitWorldHandle.java | 16 +- .../terra/bukkit/world/block/BukkitBlock.java | 6 +- .../block/data/BukkitAnaloguePowerable.java | 25 ++ .../world/block/data/BukkitDirectional.java | 4 +- .../world/block/data/BukkitEnumAdapter.java | 218 +++++++++++++++++- .../block/data/BukkitMultipleFacing.java | 8 +- .../world/block/data/BukkitOrientable.java | 6 +- .../bukkit/world/block/data/BukkitRail.java | 20 ++ .../world/block/data/BukkitRedstoneWire.java | 28 +++ .../world/block/data/BukkitRotatable.java | 4 +- .../bukkit/world/block/data/BukkitSlab.java | 4 +- .../bukkit/world/block/data/BukkitStairs.java | 12 +- .../bukkit/world/block/data/BukkitWall.java | 30 +++ .../world/block/data/TerraEnumAdapter.java | 112 --------- 14 files changed, 353 insertions(+), 140 deletions(-) create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitAnaloguePowerable.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRedstoneWire.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWall.java delete mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java index 90f382204..31813cc79 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java @@ -9,22 +9,28 @@ import com.dfsek.terra.api.platform.world.WorldHandle; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; +import com.dfsek.terra.bukkit.world.block.data.BukkitAnaloguePowerable; import com.dfsek.terra.bukkit.world.block.data.BukkitDirectional; import com.dfsek.terra.bukkit.world.block.data.BukkitMultipleFacing; import com.dfsek.terra.bukkit.world.block.data.BukkitOrientable; +import com.dfsek.terra.bukkit.world.block.data.BukkitRedstoneWire; import com.dfsek.terra.bukkit.world.block.data.BukkitRotatable; import com.dfsek.terra.bukkit.world.block.data.BukkitSlab; import com.dfsek.terra.bukkit.world.block.data.BukkitStairs; +import com.dfsek.terra.bukkit.world.block.data.BukkitWall; import com.dfsek.terra.bukkit.world.block.data.BukkitWaterlogged; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.block.data.AnaloguePowerable; import org.bukkit.block.data.Directional; import org.bukkit.block.data.MultipleFacing; import org.bukkit.block.data.Orientable; import org.bukkit.block.data.Rotatable; import org.bukkit.block.data.Waterlogged; +import org.bukkit.block.data.type.RedstoneWire; import org.bukkit.block.data.type.Slab; import org.bukkit.block.data.type.Stairs; +import org.bukkit.block.data.type.Wall; public class BukkitWorldHandle implements WorldHandle { private Transformer treeTransformer; @@ -54,13 +60,21 @@ public class BukkitWorldHandle implements WorldHandle { @Override public BlockData createBlockData(String data) { org.bukkit.block.data.BlockData bukkitData = Bukkit.createBlockData(data); - if(bukkitData instanceof MultipleFacing) return new BukkitMultipleFacing((MultipleFacing) bukkitData); + if(bukkitData instanceof Stairs) return new BukkitStairs((Stairs) bukkitData); if(bukkitData instanceof Slab) return new BukkitSlab((Slab) bukkitData); + if(bukkitData instanceof Wall) return new BukkitWall((Wall) bukkitData); + + if(bukkitData instanceof RedstoneWire) return new BukkitRedstoneWire((RedstoneWire) bukkitData); + if(bukkitData instanceof AnaloguePowerable) return new BukkitAnaloguePowerable((AnaloguePowerable) bukkitData); + + if(bukkitData instanceof MultipleFacing) return new BukkitMultipleFacing((MultipleFacing) bukkitData); if(bukkitData instanceof Rotatable) return new BukkitRotatable((Rotatable) bukkitData); if(bukkitData instanceof Directional) return new BukkitDirectional((Directional) bukkitData); if(bukkitData instanceof Orientable) return new BukkitOrientable((Orientable) bukkitData); + if(bukkitData instanceof Waterlogged) return new BukkitWaterlogged((Waterlogged) bukkitData); + return new BukkitBlockData(Bukkit.createBlockData(data)); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java index 028d88530..b520f6011 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java @@ -6,7 +6,7 @@ import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.bukkit.BukkitWorld; -import com.dfsek.terra.bukkit.world.block.data.TerraEnumAdapter; +import com.dfsek.terra.bukkit.world.block.data.BukkitEnumAdapter; public class BukkitBlock implements Block { private final org.bukkit.block.Block delegate; @@ -27,12 +27,12 @@ public class BukkitBlock implements Block { @Override public Block getRelative(BlockFace face) { - return new BukkitBlock(delegate.getRelative(TerraEnumAdapter.fromTerraBlockFace(face))); + return new BukkitBlock(delegate.getRelative(BukkitEnumAdapter.adapt(face))); } @Override public Block getRelative(BlockFace face, int len) { - return new BukkitBlock(delegate.getRelative(TerraEnumAdapter.fromTerraBlockFace(face), len)); + return new BukkitBlock(delegate.getRelative(BukkitEnumAdapter.adapt(face), len)); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitAnaloguePowerable.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitAnaloguePowerable.java new file mode 100644 index 000000000..37e6b504f --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitAnaloguePowerable.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.bukkit.world.block.data; + +import com.dfsek.terra.api.platform.block.data.AnaloguePowerable; +import com.dfsek.terra.bukkit.world.block.BukkitBlockData; + +public class BukkitAnaloguePowerable extends BukkitBlockData implements AnaloguePowerable { + public BukkitAnaloguePowerable(org.bukkit.block.data.AnaloguePowerable delegate) { + super(delegate); + } + + @Override + public int getMaximumPower() { + return ((org.bukkit.block.data.AnaloguePowerable) getHandle()).getMaximumPower(); + } + + @Override + public int getPower() { + return ((org.bukkit.block.data.AnaloguePowerable) getHandle()).getPower(); + } + + @Override + public void setPower(int power) { + ((org.bukkit.block.data.AnaloguePowerable) getHandle()).setPower(power); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java index 176fa58d9..b06f08688 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java @@ -11,11 +11,11 @@ public class BukkitDirectional extends BukkitBlockData implements Directional { @Override public BlockFace getFacing() { - return BukkitEnumAdapter.fromBukkitBlockFace(((org.bukkit.block.data.Directional) getHandle()).getFacing()); + return BukkitEnumAdapter.adapt(((org.bukkit.block.data.Directional) getHandle()).getFacing()); } @Override public void setFacing(BlockFace facing) { - ((org.bukkit.block.data.Directional) getHandle()).setFacing(TerraEnumAdapter.fromTerraBlockFace(facing)); + ((org.bukkit.block.data.Directional) getHandle()).setFacing(BukkitEnumAdapter.adapt(facing)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java index 6d4a02445..c72128775 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java @@ -4,14 +4,17 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.Axis; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Bisected; +import com.dfsek.terra.api.platform.block.data.Rail; +import com.dfsek.terra.api.platform.block.data.RedstoneWire; import com.dfsek.terra.api.platform.block.data.Slab; import com.dfsek.terra.api.platform.block.data.Stairs; +import org.bukkit.block.data.type.Wall; /** * Utility class to adapt Bukkit enums to Terra enums. */ public final class BukkitEnumAdapter { - public static Stairs.Shape fromBukkitStair(org.bukkit.block.data.type.Stairs.Shape shape) { + public static Stairs.Shape adapt(org.bukkit.block.data.type.Stairs.Shape shape) { switch(shape) { case STRAIGHT: return Stairs.Shape.STRAIGHT; @@ -28,7 +31,7 @@ public final class BukkitEnumAdapter { } } - public static Axis fromBukkitAxis(org.bukkit.Axis axis) { + public static Axis adapt(org.bukkit.Axis axis) { switch(axis) { case X: return Axis.X; @@ -41,7 +44,7 @@ public final class BukkitEnumAdapter { } } - public static Bisected.Half fromBukkitHalf(org.bukkit.block.data.Bisected.Half half) { + public static Bisected.Half adapt(org.bukkit.block.data.Bisected.Half half) { switch(half) { case BOTTOM: return Bisected.Half.BOTTOM; @@ -52,7 +55,7 @@ public final class BukkitEnumAdapter { } } - public static BlockFace fromBukkitBlockFace(org.bukkit.block.BlockFace face) { + public static BlockFace adapt(org.bukkit.block.BlockFace face) { switch(face) { case DOWN: return BlockFace.DOWN; @@ -97,7 +100,7 @@ public final class BukkitEnumAdapter { } } - public static Slab.Type fromBukkitSlabType(org.bukkit.block.data.type.Slab.Type type) { + public static Slab.Type adapt(org.bukkit.block.data.type.Slab.Type type) { switch(type) { case BOTTOM: return Slab.Type.BOTTOM; @@ -110,4 +113,209 @@ public final class BukkitEnumAdapter { } } + public static RedstoneWire.Connection adapt(org.bukkit.block.data.type.RedstoneWire.Connection connection) { + switch(connection) { + case NONE: + return RedstoneWire.Connection.NONE; + case UP: + return RedstoneWire.Connection.UP; + case SIDE: + return RedstoneWire.Connection.SIDE; + default: + throw new IllegalStateException(); + } + } + + public static org.bukkit.block.data.type.RedstoneWire.Connection adapt(RedstoneWire.Connection connection) { + switch(connection) { + case SIDE: + return org.bukkit.block.data.type.RedstoneWire.Connection.SIDE; + case UP: + return org.bukkit.block.data.type.RedstoneWire.Connection.UP; + case NONE: + return org.bukkit.block.data.type.RedstoneWire.Connection.NONE; + default: + throw new IllegalStateException(); + } + } + + public static org.bukkit.block.data.type.Stairs.Shape adapt(Stairs.Shape shape) { + switch(shape) { + case STRAIGHT: + return org.bukkit.block.data.type.Stairs.Shape.STRAIGHT; + case INNER_LEFT: + return org.bukkit.block.data.type.Stairs.Shape.INNER_LEFT; + case OUTER_LEFT: + return org.bukkit.block.data.type.Stairs.Shape.OUTER_LEFT; + case INNER_RIGHT: + return org.bukkit.block.data.type.Stairs.Shape.INNER_RIGHT; + case OUTER_RIGHT: + return org.bukkit.block.data.type.Stairs.Shape.OUTER_RIGHT; + default: + throw new IllegalStateException(); + } + } + + public static Rail.Shape adapt(org.bukkit.block.data.Rail.Shape shape) { + switch(shape) { + case SOUTH_WEST: + return Rail.Shape.SOUTH_WEST; + case SOUTH_EAST: + return Rail.Shape.SOUTH_EAST; + case NORTH_EAST: + return Rail.Shape.NORTH_EAST; + case NORTH_WEST: + return Rail.Shape.NORTH_WEST; + case ASCENDING_EAST: + return Rail.Shape.ASCENDING_EAST; + case ASCENDING_WEST: + return Rail.Shape.ASCENDING_WEST; + case ASCENDING_SOUTH: + return Rail.Shape.ASCENDING_SOUTH; + case ASCENDING_NORTH: + return Rail.Shape.ASCENDING_NORTH; + case NORTH_SOUTH: + return Rail.Shape.NORTH_SOUTH; + case EAST_WEST: + return Rail.Shape.EAST_WEST; + default: + throw new IllegalStateException(); + } + } + + public static org.bukkit.block.data.Rail.Shape adapt(Rail.Shape shape) { + switch(shape) { + case EAST_WEST: + return org.bukkit.block.data.Rail.Shape.EAST_WEST; + case NORTH_SOUTH: + return org.bukkit.block.data.Rail.Shape.NORTH_SOUTH; + case ASCENDING_NORTH: + return org.bukkit.block.data.Rail.Shape.ASCENDING_NORTH; + case ASCENDING_SOUTH: + return org.bukkit.block.data.Rail.Shape.ASCENDING_SOUTH; + case ASCENDING_WEST: + return org.bukkit.block.data.Rail.Shape.ASCENDING_WEST; + case ASCENDING_EAST: + return org.bukkit.block.data.Rail.Shape.ASCENDING_EAST; + case NORTH_WEST: + return org.bukkit.block.data.Rail.Shape.NORTH_WEST; + case NORTH_EAST: + return org.bukkit.block.data.Rail.Shape.NORTH_EAST; + case SOUTH_EAST: + return org.bukkit.block.data.Rail.Shape.SOUTH_EAST; + case SOUTH_WEST: + return org.bukkit.block.data.Rail.Shape.SOUTH_WEST; + default: + throw new IllegalStateException(); + } + } + + + public static org.bukkit.block.data.Bisected.Half adapt(Bisected.Half half) { + switch(half) { + case TOP: + return org.bukkit.block.data.Bisected.Half.TOP; + case BOTTOM: + return org.bukkit.block.data.Bisected.Half.BOTTOM; + default: + throw new IllegalStateException(); + } + } + + public static org.bukkit.Axis adapt(Axis axis) { + switch(axis) { + case Z: + return org.bukkit.Axis.Z; + case Y: + return org.bukkit.Axis.Y; + case X: + return org.bukkit.Axis.X; + default: + throw new IllegalStateException(); + } + } + + public static org.bukkit.block.BlockFace adapt(BlockFace face) { + switch(face) { + case DOWN: + return org.bukkit.block.BlockFace.DOWN; + case UP: + return org.bukkit.block.BlockFace.UP; + case NORTH_WEST: + return org.bukkit.block.BlockFace.NORTH_WEST; + case NORTH_EAST: + return org.bukkit.block.BlockFace.NORTH_EAST; + case SOUTH_EAST: + return org.bukkit.block.BlockFace.SOUTH_EAST; + case SOUTH_WEST: + return org.bukkit.block.BlockFace.SOUTH_WEST; + case NORTH_NORTH_WEST: + return org.bukkit.block.BlockFace.NORTH_NORTH_WEST; + case WEST_NORTH_WEST: + return org.bukkit.block.BlockFace.WEST_NORTH_WEST; + case WEST_SOUTH_WEST: + return org.bukkit.block.BlockFace.WEST_SOUTH_WEST; + case SOUTH_SOUTH_WEST: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST; + case EAST_NORTH_EAST: + return org.bukkit.block.BlockFace.EAST_NORTH_EAST; + case WEST: + return org.bukkit.block.BlockFace.WEST; + case SOUTH: + return org.bukkit.block.BlockFace.SOUTH; + case EAST: + return org.bukkit.block.BlockFace.EAST; + case NORTH: + return org.bukkit.block.BlockFace.NORTH; + case SELF: + return org.bukkit.block.BlockFace.SELF; + case EAST_SOUTH_EAST: + return org.bukkit.block.BlockFace.EAST_SOUTH_EAST; + case NORTH_NORTH_EAST: + return org.bukkit.block.BlockFace.NORTH_NORTH_EAST; + case SOUTH_SOUTH_EAST: + return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST; + default: + throw new IllegalStateException(); + } + } + + public static org.bukkit.block.data.type.Slab.Type adapt(Slab.Type type) { + switch(type) { + case TOP: + return org.bukkit.block.data.type.Slab.Type.TOP; + case DOUBLE: + return org.bukkit.block.data.type.Slab.Type.DOUBLE; + case BOTTOM: + return org.bukkit.block.data.type.Slab.Type.BOTTOM; + default: + throw new IllegalStateException(); + } + } + + public static Wall.Height adapt(com.dfsek.terra.api.platform.block.data.Wall.Height height) { + switch(height) { + case NONE: + return Wall.Height.NONE; + case LOW: + return Wall.Height.LOW; + case TALL: + return Wall.Height.TALL; + default: + throw new IllegalStateException(); + } + } + + public static com.dfsek.terra.api.platform.block.data.Wall.Height adapt(Wall.Height height) { + switch(height) { + case TALL: + return com.dfsek.terra.api.platform.block.data.Wall.Height.TALL; + case LOW: + return com.dfsek.terra.api.platform.block.data.Wall.Height.LOW; + case NONE: + return com.dfsek.terra.api.platform.block.data.Wall.Height.NONE; + default: + throw new IllegalStateException(); + } + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java index 4b9b7b3e3..ff6f4aae6 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java @@ -15,21 +15,21 @@ public class BukkitMultipleFacing extends BukkitBlockData implements MultipleFac @Override public Set getFaces() { - return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).getFaces().stream().map(BukkitEnumAdapter::fromBukkitBlockFace).collect(Collectors.toSet()); + return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).getFaces().stream().map(BukkitEnumAdapter::adapt).collect(Collectors.toSet()); } @Override public void setFace(BlockFace face, boolean facing) { - ((org.bukkit.block.data.MultipleFacing) super.getHandle()).setFace(TerraEnumAdapter.fromTerraBlockFace(face), facing); + ((org.bukkit.block.data.MultipleFacing) super.getHandle()).setFace(BukkitEnumAdapter.adapt(face), facing); } @Override public Set getAllowedFaces() { - return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).getAllowedFaces().stream().map(BukkitEnumAdapter::fromBukkitBlockFace).collect(Collectors.toSet()); + return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).getAllowedFaces().stream().map(BukkitEnumAdapter::adapt).collect(Collectors.toSet()); } @Override public boolean hasFace(BlockFace f) { - return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).hasFace(TerraEnumAdapter.fromTerraBlockFace(f)); + return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).hasFace(BukkitEnumAdapter.adapt(f)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java index b0793ce41..e328d4ba8 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java @@ -15,16 +15,16 @@ public class BukkitOrientable extends BukkitBlockData implements Orientable { @Override public Set getAxes() { - return ((org.bukkit.block.data.Orientable) getHandle()).getAxes().stream().map(BukkitEnumAdapter::fromBukkitAxis).collect(Collectors.toSet()); + return ((org.bukkit.block.data.Orientable) getHandle()).getAxes().stream().map(BukkitEnumAdapter::adapt).collect(Collectors.toSet()); } @Override public Axis getAxis() { - return BukkitEnumAdapter.fromBukkitAxis(((org.bukkit.block.data.Orientable) getHandle()).getAxis()); + return BukkitEnumAdapter.adapt(((org.bukkit.block.data.Orientable) getHandle()).getAxis()); } @Override public void setAxis(Axis axis) { - ((org.bukkit.block.data.Orientable) getHandle()).setAxis(TerraEnumAdapter.fromTerraAxis(axis)); + ((org.bukkit.block.data.Orientable) getHandle()).setAxis(BukkitEnumAdapter.adapt(axis)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java new file mode 100644 index 000000000..61bee5d38 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.bukkit.world.block.data; + +import com.dfsek.terra.api.platform.block.data.Rail; +import com.dfsek.terra.bukkit.world.block.BukkitBlockData; + +public class BukkitRail extends BukkitBlockData implements Rail { + public BukkitRail(org.bukkit.block.data.Rail delegate) { + super(delegate); + } + + @Override + public Shape getShape() { + return BukkitEnumAdapter.adapt(((org.bukkit.block.data.Rail) getHandle()).getShape()); + } + + @Override + public void setShape(Shape newShape) { + ((org.bukkit.block.data.Rail) getHandle()).setShape(BukkitEnumAdapter.adapt(newShape)); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRedstoneWire.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRedstoneWire.java new file mode 100644 index 000000000..05f28f2cf --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRedstoneWire.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.bukkit.world.block.data; + +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.RedstoneWire; + +import java.util.Set; +import java.util.stream.Collectors; + +public class BukkitRedstoneWire extends BukkitAnaloguePowerable implements RedstoneWire { + public BukkitRedstoneWire(org.bukkit.block.data.type.RedstoneWire delegate) { + super(delegate); + } + + @Override + public Set getAllowedFaces() { + return ((org.bukkit.block.data.type.RedstoneWire) getHandle()).getAllowedFaces().stream().map(BukkitEnumAdapter::adapt).collect(Collectors.toSet()); + } + + @Override + public Connection getFace(BlockFace face) { + return BukkitEnumAdapter.adapt(((org.bukkit.block.data.type.RedstoneWire) getHandle()).getFace(BukkitEnumAdapter.adapt(face))); + } + + @Override + public void setFace(BlockFace face, Connection connection) { + ((org.bukkit.block.data.type.RedstoneWire) getHandle()).setFace(BukkitEnumAdapter.adapt(face), BukkitEnumAdapter.adapt(connection)); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java index f6f184dcc..784f33d77 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java @@ -11,11 +11,11 @@ public class BukkitRotatable extends BukkitBlockData implements Rotatable { @Override public BlockFace getRotation() { - return BukkitEnumAdapter.fromBukkitBlockFace(((org.bukkit.block.data.Rotatable) getHandle()).getRotation()); + return BukkitEnumAdapter.adapt(((org.bukkit.block.data.Rotatable) getHandle()).getRotation()); } @Override public void setRotation(BlockFace face) { - ((org.bukkit.block.data.Rotatable) getHandle()).setRotation(TerraEnumAdapter.fromTerraBlockFace(face)); + ((org.bukkit.block.data.Rotatable) getHandle()).setRotation(BukkitEnumAdapter.adapt(face)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java index 96c746e41..d9c18efa0 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java @@ -9,11 +9,11 @@ public class BukkitSlab extends BukkitWaterlogged implements Slab { @Override public Type getType() { - return BukkitEnumAdapter.fromBukkitSlabType(((org.bukkit.block.data.type.Slab) getHandle()).getType()); + return BukkitEnumAdapter.adapt(((org.bukkit.block.data.type.Slab) getHandle()).getType()); } @Override public void setType(Type type) { - ((org.bukkit.block.data.type.Slab) getHandle()).setType(TerraEnumAdapter.fromTerraSlabType(type)); + ((org.bukkit.block.data.type.Slab) getHandle()).setType(BukkitEnumAdapter.adapt(type)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java index ed2a0d490..c89c6812f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java @@ -12,32 +12,32 @@ public class BukkitStairs extends BukkitBlockData implements Stairs { @Override public Shape getShape() { - return BukkitEnumAdapter.fromBukkitStair(((org.bukkit.block.data.type.Stairs) super.getHandle()).getShape()); + return BukkitEnumAdapter.adapt(((org.bukkit.block.data.type.Stairs) super.getHandle()).getShape()); } @Override public void setShape(Shape shape) { - ((org.bukkit.block.data.type.Stairs) super.getHandle()).setShape(TerraEnumAdapter.fromTerraStair(shape)); + ((org.bukkit.block.data.type.Stairs) super.getHandle()).setShape(BukkitEnumAdapter.adapt(shape)); } @Override public Half getHalf() { - return BukkitEnumAdapter.fromBukkitHalf(((org.bukkit.block.data.type.Stairs) super.getHandle()).getHalf()); + return BukkitEnumAdapter.adapt(((org.bukkit.block.data.type.Stairs) super.getHandle()).getHalf()); } @Override public void setHalf(Half half) { - ((org.bukkit.block.data.type.Stairs) super.getHandle()).setHalf(TerraEnumAdapter.fromTerraHalf(half)); + ((org.bukkit.block.data.type.Stairs) super.getHandle()).setHalf(BukkitEnumAdapter.adapt(half)); } @Override public BlockFace getFacing() { - return BukkitEnumAdapter.fromBukkitBlockFace(((org.bukkit.block.data.type.Stairs) super.getHandle()).getFacing()); + return BukkitEnumAdapter.adapt(((org.bukkit.block.data.type.Stairs) super.getHandle()).getFacing()); } @Override public void setFacing(BlockFace facing) { - ((org.bukkit.block.data.type.Stairs) super.getHandle()).setFacing(TerraEnumAdapter.fromTerraBlockFace(facing)); + ((org.bukkit.block.data.type.Stairs) super.getHandle()).setFacing(BukkitEnumAdapter.adapt(facing)); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWall.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWall.java new file mode 100644 index 000000000..f30ad5781 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWall.java @@ -0,0 +1,30 @@ +package com.dfsek.terra.bukkit.world.block.data; + +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.data.Wall; + +public class BukkitWall extends BukkitWaterlogged implements Wall { + public BukkitWall(org.bukkit.block.data.type.Wall delegate) { + super(delegate); + } + + @Override + public boolean isUp() { + return ((org.bukkit.block.data.type.Wall) getHandle()).isUp(); + } + + @Override + public void setUp(boolean up) { + ((org.bukkit.block.data.type.Wall) getHandle()).setUp(up); + } + + @Override + public void setHeight(BlockFace face, Height height) { + ((org.bukkit.block.data.type.Wall) getHandle()).setHeight(BukkitEnumAdapter.adapt(face), BukkitEnumAdapter.adapt(height)); + } + + @Override + public Height getHeight(BlockFace face) { + return BukkitEnumAdapter.adapt(((org.bukkit.block.data.type.Wall) getHandle()).getHeight(BukkitEnumAdapter.adapt(face))); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java deleted file mode 100644 index 426a8eeea..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/TerraEnumAdapter.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.dfsek.terra.bukkit.world.block.data; - - -import com.dfsek.terra.api.platform.block.BlockFace; -import org.bukkit.Axis; -import org.bukkit.block.data.Bisected; -import org.bukkit.block.data.type.Slab; -import org.bukkit.block.data.type.Stairs; - -/** - * Utility class to adapt Terra enums to Bukkit enums - */ -public final class TerraEnumAdapter { - public static Stairs.Shape fromTerraStair(com.dfsek.terra.api.platform.block.data.Stairs.Shape shape) { - switch(shape) { - case STRAIGHT: - return Stairs.Shape.STRAIGHT; - case INNER_LEFT: - return Stairs.Shape.INNER_LEFT; - case OUTER_LEFT: - return Stairs.Shape.OUTER_LEFT; - case INNER_RIGHT: - return Stairs.Shape.INNER_RIGHT; - case OUTER_RIGHT: - return Stairs.Shape.OUTER_RIGHT; - default: - throw new IllegalStateException(); - } - } - - public static Bisected.Half fromTerraHalf(com.dfsek.terra.api.platform.block.data.Bisected.Half half) { - switch(half) { - case TOP: - return Bisected.Half.TOP; - case BOTTOM: - return Bisected.Half.BOTTOM; - default: - throw new IllegalStateException(); - } - } - - public static Axis fromTerraAxis(com.dfsek.terra.api.platform.block.Axis axis) { - switch(axis) { - case Z: - return Axis.Z; - case Y: - return Axis.Y; - case X: - return Axis.X; - default: - throw new IllegalStateException(); - } - } - - public static org.bukkit.block.BlockFace fromTerraBlockFace(BlockFace face) { - switch(face) { - case DOWN: - return org.bukkit.block.BlockFace.DOWN; - case UP: - return org.bukkit.block.BlockFace.UP; - case NORTH_WEST: - return org.bukkit.block.BlockFace.NORTH_WEST; - case NORTH_EAST: - return org.bukkit.block.BlockFace.NORTH_EAST; - case SOUTH_EAST: - return org.bukkit.block.BlockFace.SOUTH_EAST; - case SOUTH_WEST: - return org.bukkit.block.BlockFace.SOUTH_WEST; - case NORTH_NORTH_WEST: - return org.bukkit.block.BlockFace.NORTH_NORTH_WEST; - case WEST_NORTH_WEST: - return org.bukkit.block.BlockFace.WEST_NORTH_WEST; - case WEST_SOUTH_WEST: - return org.bukkit.block.BlockFace.WEST_SOUTH_WEST; - case SOUTH_SOUTH_WEST: - return org.bukkit.block.BlockFace.SOUTH_SOUTH_WEST; - case EAST_NORTH_EAST: - return org.bukkit.block.BlockFace.EAST_NORTH_EAST; - case WEST: - return org.bukkit.block.BlockFace.WEST; - case SOUTH: - return org.bukkit.block.BlockFace.SOUTH; - case EAST: - return org.bukkit.block.BlockFace.EAST; - case NORTH: - return org.bukkit.block.BlockFace.NORTH; - case SELF: - return org.bukkit.block.BlockFace.SELF; - case EAST_SOUTH_EAST: - return org.bukkit.block.BlockFace.EAST_SOUTH_EAST; - case NORTH_NORTH_EAST: - return org.bukkit.block.BlockFace.NORTH_NORTH_EAST; - case SOUTH_SOUTH_EAST: - return org.bukkit.block.BlockFace.SOUTH_SOUTH_EAST; - default: - throw new IllegalStateException(); - } - } - - public static Slab.Type fromTerraSlabType(com.dfsek.terra.api.platform.block.data.Slab.Type type) { - switch(type) { - case TOP: - return Slab.Type.TOP; - case DOUBLE: - return Slab.Type.DOUBLE; - case BOTTOM: - return Slab.Type.BOTTOM; - default: - throw new IllegalStateException(); - } - } -} From 18819ae53d1bf23b4262cfa3b05b0f593f4248c2 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 26 Dec 2020 03:06:25 -0700 Subject: [PATCH 124/210] fabric implementations --- .../terra/fabric/world/FabricWorldHandle.java | 6 ++ .../block/data/FabricAnaloguePowerable.java | 29 ++++++ .../world/block/data/FabricEnumAdapter.java | 95 ++++++++++++++++++- .../world/block/data/FabricOrientable.java | 32 +++++++ .../fabric/world/block/data/FabricSlab.java | 4 +- .../fabric/world/block/data/FabricStairs.java | 12 +-- .../world/block/data/TerraEnumAdapter.java | 72 -------------- .../world/features/PopulatorFeature.java | 2 + .../FabricChunkGeneratorWrapper.java | 6 ++ .../fabric/world/handles/FabricWorld.java | 18 +++- .../world/FabricSeededWorldAccess.java | 10 ++ 11 files changed, 200 insertions(+), 86 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricAnaloguePowerable.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricOrientable.java delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index 2211cbeb7..e2c411429 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricMaterialData; import com.dfsek.terra.fabric.world.block.data.FabricMultipleFacing; +import com.dfsek.terra.fabric.world.block.data.FabricOrientable; import com.dfsek.terra.fabric.world.block.data.FabricSlab; import com.dfsek.terra.fabric.world.block.data.FabricStairs; import com.dfsek.terra.fabric.world.block.data.FabricWaterlogged; @@ -49,8 +50,13 @@ public class FabricWorldHandle implements WorldHandle { try { BlockState state = parser.parse(true).getBlockState(); if(state == null) throw new IllegalArgumentException("Invalid data: " + data); + if(state.contains(Properties.STAIR_SHAPE)) return new FabricStairs(state); + if(state.contains(Properties.SLAB_TYPE)) return new FabricSlab(state); + + if(state.contains(Properties.AXIS)) return new FabricOrientable(state); + if(state.getProperties().containsAll(Arrays.asList(Properties.NORTH, Properties.SOUTH, Properties.EAST, Properties.WEST))) return new FabricMultipleFacing(state); if(state.contains(Properties.WATERLOGGED)) return new FabricWaterlogged(state); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricAnaloguePowerable.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricAnaloguePowerable.java new file mode 100644 index 000000000..2e7a55347 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricAnaloguePowerable.java @@ -0,0 +1,29 @@ +package com.dfsek.terra.fabric.world.block.data; + +import com.dfsek.terra.api.platform.block.data.AnaloguePowerable; +import com.dfsek.terra.fabric.world.block.FabricBlockData; +import net.minecraft.block.BlockState; + +/** + * None of this actually has implementation, TODO: implement this if we ever end up needing it. + */ +public class FabricAnaloguePowerable extends FabricBlockData implements AnaloguePowerable { + public FabricAnaloguePowerable(BlockState delegate) { + super(delegate); + } + + @Override + public int getMaximumPower() { + return 0; + } + + @Override + public int getPower() { + return 0; + } + + @Override + public void setPower(int power) { + + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java index 35e35eec7..98f883059 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricEnumAdapter.java @@ -1,5 +1,6 @@ package com.dfsek.terra.fabric.world.block.data; +import com.dfsek.terra.api.platform.block.Axis; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Bisected; import com.dfsek.terra.api.platform.block.data.Slab; @@ -10,7 +11,7 @@ import net.minecraft.block.enums.StairShape; import net.minecraft.util.math.Direction; public final class FabricEnumAdapter { - public static Stairs.Shape fromFabricStairShape(StairShape shape) { + public static Stairs.Shape adapt(StairShape shape) { switch(shape) { case OUTER_RIGHT: return Stairs.Shape.OUTER_RIGHT; @@ -27,7 +28,7 @@ public final class FabricEnumAdapter { } } - public static Bisected.Half fromFabricHalf(BlockHalf half) { + public static Bisected.Half adapt(BlockHalf half) { switch(half) { case BOTTOM: return Bisected.Half.BOTTOM; @@ -38,7 +39,7 @@ public final class FabricEnumAdapter { } } - public static BlockFace fromFabricDirection(Direction direction) { + public static BlockFace adapt(Direction direction) { switch(direction) { case DOWN: return BlockFace.DOWN; @@ -57,7 +58,7 @@ public final class FabricEnumAdapter { } } - public static Slab.Type fromFabricSlabType(SlabType type) { + public static Slab.Type adapt(SlabType type) { switch(type) { case BOTTOM: return Slab.Type.BOTTOM; @@ -69,4 +70,90 @@ public final class FabricEnumAdapter { throw new IllegalStateException(); } } + + public static StairShape adapt(Stairs.Shape shape) { + switch(shape) { + case STRAIGHT: + return StairShape.STRAIGHT; + case INNER_LEFT: + return StairShape.INNER_LEFT; + case OUTER_LEFT: + return StairShape.OUTER_LEFT; + case INNER_RIGHT: + return StairShape.INNER_RIGHT; + case OUTER_RIGHT: + return StairShape.OUTER_RIGHT; + default: + throw new IllegalStateException(); + } + } + + public static BlockHalf adapt(Bisected.Half half) { + switch(half) { + case TOP: + return BlockHalf.TOP; + case BOTTOM: + return BlockHalf.BOTTOM; + default: + throw new IllegalStateException(); + } + } + + public static Direction adapt(BlockFace face) { + switch(face) { + case SOUTH: + return Direction.SOUTH; + case NORTH: + return Direction.NORTH; + case EAST: + return Direction.EAST; + case WEST: + return Direction.WEST; + case UP: + return Direction.UP; + case DOWN: + return Direction.DOWN; + default: + throw new IllegalArgumentException(); + } + } + + public static SlabType adapt(Slab.Type type) { + switch(type) { + case DOUBLE: + return SlabType.DOUBLE; + case TOP: + return SlabType.TOP; + case BOTTOM: + return SlabType.BOTTOM; + default: + throw new IllegalStateException(); + } + } + + public static Axis adapt(Direction.Axis axis) { + switch(axis) { + case X: + return Axis.X; + case Y: + return Axis.Y; + case Z: + return Axis.Z; + default: + throw new IllegalStateException(); + } + } + + public static Direction.Axis adapt(Axis axis) { + switch(axis) { + case Z: + return Direction.Axis.Z; + case Y: + return Direction.Axis.Y; + case X: + return Direction.Axis.X; + default: + throw new IllegalStateException(); + } + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricOrientable.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricOrientable.java new file mode 100644 index 000000000..c817a917a --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricOrientable.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.fabric.world.block.data; + +import com.dfsek.terra.api.platform.block.Axis; +import com.dfsek.terra.api.platform.block.data.Orientable; +import com.dfsek.terra.fabric.world.block.FabricBlockData; +import net.minecraft.block.BlockState; +import net.minecraft.state.property.Properties; + +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; + +public class FabricOrientable extends FabricBlockData implements Orientable { + public FabricOrientable(BlockState delegate) { + super(delegate); + } + + @Override + public Set getAxes() { + return Arrays.stream(Axis.values()).collect(Collectors.toSet()); + } + + @Override + public Axis getAxis() { + return FabricEnumAdapter.adapt(getHandle().get(Properties.AXIS)); + } + + @Override + public void setAxis(Axis axis) { + delegate = delegate.with(Properties.AXIS, FabricEnumAdapter.adapt(axis)); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java index ec1b103d0..a6ca5f5de 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricSlab.java @@ -11,11 +11,11 @@ public class FabricSlab extends FabricWaterlogged implements Slab { @Override public Type getType() { - return FabricEnumAdapter.fromFabricSlabType(delegate.get(Properties.SLAB_TYPE)); + return FabricEnumAdapter.adapt(delegate.get(Properties.SLAB_TYPE)); } @Override public void setType(Type type) { - delegate = delegate.with(Properties.SLAB_TYPE, TerraEnumAdapter.fromTerraSlabType(type)); + delegate = delegate.with(Properties.SLAB_TYPE, FabricEnumAdapter.adapt(type)); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java index 9997e6767..ec268f784 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/FabricStairs.java @@ -12,31 +12,31 @@ public class FabricStairs extends FabricWaterlogged implements Stairs { @Override public Shape getShape() { - return FabricEnumAdapter.fromFabricStairShape(getHandle().get(Properties.STAIR_SHAPE)); + return FabricEnumAdapter.adapt(getHandle().get(Properties.STAIR_SHAPE)); } @Override public void setShape(Shape shape) { - super.delegate = getHandle().with(Properties.STAIR_SHAPE, TerraEnumAdapter.fromTerraStairShape(shape)); + super.delegate = getHandle().with(Properties.STAIR_SHAPE, FabricEnumAdapter.adapt(shape)); } @Override public Half getHalf() { - return FabricEnumAdapter.fromFabricHalf(getHandle().get(Properties.BLOCK_HALF)); + return FabricEnumAdapter.adapt(getHandle().get(Properties.BLOCK_HALF)); } @Override public void setHalf(Half half) { - super.delegate = getHandle().with(Properties.BLOCK_HALF, TerraEnumAdapter.fromTerraHalf(half)); + super.delegate = getHandle().with(Properties.BLOCK_HALF, FabricEnumAdapter.adapt(half)); } @Override public BlockFace getFacing() { - return FabricEnumAdapter.fromFabricDirection(getHandle().get(Properties.HORIZONTAL_FACING)); + return FabricEnumAdapter.adapt(getHandle().get(Properties.HORIZONTAL_FACING)); } @Override public void setFacing(BlockFace facing) { - super.delegate = getHandle().with(Properties.HORIZONTAL_FACING, TerraEnumAdapter.fromTerraBlockFace(facing)); + super.delegate = getHandle().with(Properties.HORIZONTAL_FACING, FabricEnumAdapter.adapt(facing)); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java deleted file mode 100644 index a207c45d3..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/data/TerraEnumAdapter.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.dfsek.terra.fabric.world.block.data; - -import com.dfsek.terra.api.platform.block.BlockFace; -import com.dfsek.terra.api.platform.block.data.Bisected; -import com.dfsek.terra.api.platform.block.data.Slab; -import com.dfsek.terra.api.platform.block.data.Stairs; -import net.minecraft.block.enums.BlockHalf; -import net.minecraft.block.enums.SlabType; -import net.minecraft.block.enums.StairShape; -import net.minecraft.util.math.Direction; - -public final class TerraEnumAdapter { - public static StairShape fromTerraStairShape(Stairs.Shape shape) { - switch(shape) { - case STRAIGHT: - return StairShape.STRAIGHT; - case INNER_LEFT: - return StairShape.INNER_LEFT; - case OUTER_LEFT: - return StairShape.OUTER_LEFT; - case INNER_RIGHT: - return StairShape.INNER_RIGHT; - case OUTER_RIGHT: - return StairShape.OUTER_RIGHT; - default: - throw new IllegalStateException(); - } - } - - public static BlockHalf fromTerraHalf(Bisected.Half half) { - switch(half) { - case TOP: - return BlockHalf.TOP; - case BOTTOM: - return BlockHalf.BOTTOM; - default: - throw new IllegalStateException(); - } - } - - public static Direction fromTerraBlockFace(BlockFace face) { - switch(face) { - case SOUTH: - return Direction.SOUTH; - case NORTH: - return Direction.NORTH; - case EAST: - return Direction.EAST; - case WEST: - return Direction.WEST; - case UP: - return Direction.UP; - case DOWN: - return Direction.DOWN; - default: - throw new IllegalArgumentException(); - } - } - - public static SlabType fromTerraSlabType(Slab.Type type) { - switch(type) { - case DOUBLE: - return SlabType.DOUBLE; - case TOP: - return SlabType.TOP; - case BOTTOM: - return SlabType.BOTTOM; - default: - throw new IllegalStateException(); - } - } -} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java index 1168a0bbe..ca16ccd1f 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java @@ -4,6 +4,7 @@ import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.fabric.world.handles.FabricWorld; import com.dfsek.terra.fabric.world.handles.chunk.FabricChunkWorldAccess; +import com.dfsek.terra.fabric.world.handles.world.FabricSeededWorldAccess; import com.mojang.serialization.Codec; import net.minecraft.util.math.BlockPos; import net.minecraft.world.StructureWorldAccess; @@ -27,6 +28,7 @@ public class PopulatorFeature extends Feature { FabricChunkWorldAccess chunk = new FabricChunkWorldAccess(world, pos.getX() >> 4, pos.getZ() >> 4); FabricWorld world1 = new FabricWorld(world.toServerWorld(), new FabricChunkGenerator(chunkGenerator)); gen.getCavePopulator().populate(world1, random, chunk); + gen.getStructurePopulator().populate(new FabricSeededWorldAccess(world, world.getSeed(), chunkGenerator), random, chunk); gen.getOrePopulator().populate(world1, random, chunk); gen.getTreePopulator().populate(world1, random, chunk); gen.getFloraPopulator().populate(world1, random, chunk); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index e4c88358e..c94f7afa2 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -10,6 +10,7 @@ import com.dfsek.terra.generation.MasterChunkGenerator; import com.dfsek.terra.population.CavePopulator; import com.dfsek.terra.population.FloraPopulator; import com.dfsek.terra.population.OrePopulator; +import com.dfsek.terra.population.StructurePopulator; import com.dfsek.terra.population.TreePopulator; import com.mojang.serialization.Codec; import com.mojang.serialization.codecs.RecordCodecBuilder; @@ -49,6 +50,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener private final FloraPopulator floraPopulator = new FloraPopulator(TerraFabricPlugin.getInstance()); private final OrePopulator orePopulator = new OrePopulator(TerraFabricPlugin.getInstance()); private final TreePopulator treePopulator = new TreePopulator(TerraFabricPlugin.getInstance()); + private final StructurePopulator structurePopulator = new StructurePopulator(TerraFabricPlugin.getInstance()); public TreePopulator getTreePopulator() { return treePopulator; @@ -66,6 +68,10 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener return floraPopulator; } + public StructurePopulator getStructurePopulator() { + return structurePopulator; + } + public FabricChunkGeneratorWrapper(TerraBiomeSource biomeSource, long seed, ConfigPack configPack) { super(biomeSource, new StructuresConfig(false)); this.pack = configPack; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java index ddd905466..dad97da57 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java @@ -7,8 +7,10 @@ import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.handles.chunk.FabricChunk; import net.minecraft.server.world.ServerWorld; +import net.minecraft.util.math.BlockPos; import java.io.File; import java.util.UUID; @@ -64,12 +66,24 @@ public class FabricWorld implements World { @Override public Block getBlockAt(int x, int y, int z) { - return null; + BlockPos pos = new BlockPos(x, y, z); + return new FabricBlock(pos, delegate.world); + } + + @Override + public int hashCode() { + return delegate.generator.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof FabricWorld)) return false; + return ((FabricWorld) obj).delegate.generator.equals(delegate.generator); } @Override public Block getBlockAt(Location l) { - return null; + return getBlockAt(l.getBlockX(), l.getBlockY(), l.getBlockZ()); } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java index b3684a08a..987be26c9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java @@ -85,6 +85,16 @@ public class FabricSeededWorldAccess implements World { } + @Override + public int hashCode() { + return handle.worldAccess.hashCode(); + } + + @Override + public boolean equals(Object obj) { + return super.equals(obj); + } + @Override public Handle getHandle() { return handle; From 5ff47bad18941eeb05a9b4b4fb8ef2952ab24fe3 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 26 Dec 2020 21:36:15 -0700 Subject: [PATCH 125/210] improve cache configs --- .../api/structures/script/StructureScript.java | 13 +++++++------ .../java/com/dfsek/terra/carving/CarverCache.java | 2 +- .../com/dfsek/terra/config/base/PluginConfig.java | 15 +++++++++++---- platforms/bukkit/src/main/resources/config.yml | 5 +++-- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 8449d66e7..1038e1be2 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -29,12 +29,7 @@ import java.util.Random; public class StructureScript { private final Block block; private final String id; - private final LinkedHashMap cache = new LinkedHashMap() { - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return this.size() > 128; - } - }; + private final LinkedHashMap cache; public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry) { Parser parser; @@ -58,6 +53,12 @@ public class StructureScript { throw new RuntimeException(e); } this.id = parser.getID(); + this.cache = new LinkedHashMap() { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return this.size() > main.getTerraConfig().getStructureCache(); + } + }; } /** diff --git a/common/src/main/java/com/dfsek/terra/carving/CarverCache.java b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java index 6dcbcfe9f..809dd6936 100644 --- a/common/src/main/java/com/dfsek/terra/carving/CarverCache.java +++ b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java @@ -29,7 +29,7 @@ public class CarverCache { } public List getPoints(int chunkX, int chunkZ, UserDefinedCarver carver) { - if(carvers.size() > main.getTerraConfig().getCacheSize() * 2) carvers.clear(); + if(carvers.size() > main.getTerraConfig().getCarverCacheSize()) carvers.clear(); return carvers.computeIfAbsent((((long) chunkX) << 32) | (chunkZ & 0xffffffffL), key -> { TerraBiomeGrid grid = main.getWorld(w).getGrid(); if(carver.isChunkCarved(w, chunkX, chunkZ, new FastRandom(MathUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed() + carver.hashCode())))) { diff --git a/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java b/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java index c8ef7c82b..93596768a 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java @@ -35,9 +35,12 @@ public class PluginConfig implements ConfigTemplate { @Default private int biomeSearch = 4; - @Value("cache-size") + @Value("cache.carver") @Default - private int cacheSize = 384; + private int carverCache = 512; + @Value("cache.structure") + @Default + private int structureCache = 128; @Value("dump-default") @Default @@ -80,7 +83,11 @@ public class PluginConfig implements ConfigTemplate { return biomeSearch; } - public int getCacheSize() { - return cacheSize; + public int getCarverCacheSize() { + return carverCache; + } + + public int getStructureCache() { + return structureCache; } } diff --git a/platforms/bukkit/src/main/resources/config.yml b/platforms/bukkit/src/main/resources/config.yml index b13793a3f..c262958ae 100644 --- a/platforms/bukkit/src/main/resources/config.yml +++ b/platforms/bukkit/src/main/resources/config.yml @@ -1,9 +1,10 @@ debug: false data-save: PT6M language: "en_us" -fail-type: SHUTDOWN dump-default: true biome-search-resolution: 4 -cache-size: 384 +cache: + carver: 512 + structure: 128 master-disable: caves: false \ No newline at end of file From c4da8580954cbcde0cbb976778095c0949836a9c Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 26 Dec 2020 22:22:17 -0700 Subject: [PATCH 126/210] reimplement structure probability collections --- .../dfsek/terra/config/templates/StructureTemplate.java | 7 ++++--- .../com/dfsek/terra/config/templates/TreeTemplate.java | 7 ++++--- .../com/dfsek/terra/generation/items/TerraStructure.java | 7 ++++--- .../com/dfsek/terra/generation/items/tree/TerraTree.java | 7 ++++--- .../com/dfsek/terra/population/StructurePopulator.java | 2 +- 5 files changed, 17 insertions(+), 13 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java index b4f241bb9..40dfa7be2 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java @@ -6,6 +6,7 @@ import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; import com.dfsek.terra.api.loot.LootTable; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.util.GlueList; @@ -19,9 +20,9 @@ public class StructureTemplate extends AbstractableTemplate implements Validated @Value("id") private String id; - @Value("script") + @Value("scripts") @Abstractable - private StructureScript structure; + private ProbabilityCollection structure; @Value("spawn.start") @Abstractable @@ -52,7 +53,7 @@ public class StructureTemplate extends AbstractableTemplate implements Validated return id; } - public StructureScript getStructures() { + public ProbabilityCollection getStructures() { return structure; } diff --git a/common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java index f872d5603..33702c5a4 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/TreeTemplate.java @@ -3,14 +3,15 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.util.MaterialSet; @SuppressWarnings({"unused", "FieldMayBeFinal"}) public class TreeTemplate extends AbstractableTemplate { - @Value("script") + @Value("scripts") @Abstractable - private StructureScript structure; + private ProbabilityCollection structure; @Value("id") private String id; @@ -24,7 +25,7 @@ public class TreeTemplate extends AbstractableTemplate { @Abstractable private MaterialSet spawnable; - public StructureScript getStructures() { + public ProbabilityCollection getStructures() { return structure; } diff --git a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java index 883490390..f1b5bbb93 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java @@ -1,6 +1,7 @@ package com.dfsek.terra.generation.items; import com.dfsek.terra.api.loot.LootTable; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.config.templates.StructureTemplate; @@ -10,14 +11,14 @@ import java.util.Map; // TODO: implementation public class TerraStructure { - private final StructureScript structure; + private final ProbabilityCollection structure; private final Range bound; private final Range spawnStart; private final GridSpawn spawn; private final Map loot; private final StructureTemplate template; - public TerraStructure(StructureScript structures, Range bound, Range spawnStart, GridSpawn spawn, Map loot, StructureTemplate template) { + public TerraStructure(ProbabilityCollection structures, Range bound, Range spawnStart, GridSpawn spawn, Map loot, StructureTemplate template) { this.structure = structures; this.bound = bound; this.spawnStart = spawnStart; @@ -30,7 +31,7 @@ public class TerraStructure { return template; } - public StructureScript getStructure() { + public ProbabilityCollection getStructure() { return structure; } diff --git a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index 90a124e9a..9fc9e09b0 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -1,5 +1,6 @@ package com.dfsek.terra.generation.items.tree; +import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.structures.structure.Rotation; @@ -11,9 +12,9 @@ import java.util.Random; public class TerraTree implements Tree { private final MaterialSet spawnable; private final int yOffset; - private final StructureScript structure; + private final ProbabilityCollection structure; - public TerraTree(MaterialSet spawnable, int yOffset, StructureScript structure) { + public TerraTree(MaterialSet spawnable, int yOffset, ProbabilityCollection structure) { this.spawnable = spawnable; this.yOffset = yOffset; this.structure = structure; @@ -21,7 +22,7 @@ public class TerraTree implements Tree { @Override public synchronized boolean plant(Location location, Random random) { - structure.execute(location.clone().add(0, yOffset, 0), random, Rotation.fromDegrees(90 * random.nextInt(4))); + structure.get(random).execute(location.clone().add(0, yOffset, 0), random, Rotation.fromDegrees(90 * random.nextInt(4))); return true; } diff --git a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java index 68c397f69..90c594a67 100644 --- a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -42,7 +42,7 @@ public class StructurePopulator implements TerraBlockPopulator { if(!((UserDefinedBiome) grid.getBiome(spawn)).getConfig().getStructures().contains(conf)) continue; Random random = new FastRandom(MathUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), FastMath.floorDiv(spawn.getBlockZ(), 16), world.getSeed())); - conf.getStructure().execute(spawn.setY(conf.getSpawnStart().get(random)), chunk, random, Rotation.fromDegrees(90 * random.nextInt(4))); + conf.getStructure().get(random).execute(spawn.setY(conf.getSpawnStart().get(random)), chunk, random, Rotation.fromDegrees(90 * random.nextInt(4))); } } } From c7d43142f2d3543b7d909c485a7d16d921f89e24 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 26 Dec 2020 22:43:51 -0700 Subject: [PATCH 127/210] remove structure bound --- .../dfsek/terra/config/templates/StructureTemplate.java | 8 -------- 1 file changed, 8 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java index 40dfa7be2..cc4d0f8ae 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java @@ -28,10 +28,6 @@ public class StructureTemplate extends AbstractableTemplate implements Validated @Abstractable private Range y; - @Value("spawn.bound") - @Abstractable - private Range bound; - @Value("spawn") @Abstractable private GridSpawn spawn; @@ -61,10 +57,6 @@ public class StructureTemplate extends AbstractableTemplate implements Validated return y; } - public Range getBound() { - return bound; - } - public List getFeatures() { return features; } From f6312a01d7d6eaf4a92bb5d65d77d6bb525ef594 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 27 Dec 2020 00:27:58 -0700 Subject: [PATCH 128/210] reimplement locate command --- .../structures/script/StructureScript.java | 5 +++ .../terra/async/AsyncStructureFinder.java | 36 +++++++++++++++++++ .../config/factories/StructureFactory.java | 2 +- .../generation/items/TerraStructure.java | 8 +---- .../command/structure/LocateCommand.java | 27 ++++++++++---- 5 files changed, 63 insertions(+), 15 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 1038e1be2..91b144805 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -87,6 +87,11 @@ public class StructureScript { return buffer.succeeded(); } + public boolean test(Location location, Random random, Rotation rotation) { + StructureBuffer buffer = new StructureBuffer(location); + return !block.apply(buffer, rotation, random, 0).equals(Block.ReturnLevel.FAIL); + } + public void executeInBuffer(Buffer buffer, Random random, Rotation rotation, int recursions) { block.apply(buffer, rotation, random, recursions); } diff --git a/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java b/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java new file mode 100644 index 000000000..2c4b04b74 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java @@ -0,0 +1,36 @@ +package com.dfsek.terra.async; + +import com.dfsek.terra.api.math.MathUtil; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import com.dfsek.terra.generation.items.TerraStructure; +import net.jafama.FastMath; +import org.jetbrains.annotations.NotNull; + +import java.util.Random; +import java.util.function.Consumer; + +public class AsyncStructureFinder extends AsyncFeatureFinder { + public AsyncStructureFinder(TerraBiomeGrid grid, TerraStructure target, @NotNull Location origin, int startRadius, int maxRadius, Consumer callback, TerraPlugin main) { + super(grid, target, origin, startRadius, maxRadius, callback, main); + setSearchSize(target.getSpawn().getWidth() + 2 * target.getSpawn().getSeparation()); + } + + @Override + public Vector3 finalizeVector(Vector3 orig) { + return target.getSpawn().getChunkSpawn(orig.getBlockX(), orig.getBlockZ(), world.getSeed()); + } + + @Override + public boolean isValid(int x, int z, TerraStructure target) { + Location spawn = target.getSpawn().getChunkSpawn(x, z, world.getSeed()).toLocation(world); + if(!((UserDefinedBiome) grid.getBiome(spawn)).getConfig().getStructures().contains(target)) return false; + Random random = new FastRandom(MathUtil.getCarverChunkSeed(FastMath.floorDiv(spawn.getBlockX(), 16), FastMath.floorDiv(spawn.getBlockZ(), 16), world.getSeed())); + return target.getStructure().get(random).test(spawn.setY(target.getSpawnStart().get(random)), random, Rotation.fromDegrees(90 * random.nextInt(4))); + } +} diff --git a/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java index f8c54728a..857103336 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java @@ -8,6 +8,6 @@ import com.dfsek.terra.generation.items.TerraStructure; public class StructureFactory implements TerraFactory { @Override public TerraStructure build(StructureTemplate config, TerraPlugin main) throws LoadException { - return new TerraStructure(config.getStructures(), config.getBound(), config.getY(), config.getSpawn(), config.getLoot(), config); + return new TerraStructure(config.getStructures(), config.getY(), config.getSpawn(), config.getLoot(), config); } } diff --git a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java index f1b5bbb93..3fda0fbd6 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java @@ -12,15 +12,13 @@ import java.util.Map; // TODO: implementation public class TerraStructure { private final ProbabilityCollection structure; - private final Range bound; private final Range spawnStart; private final GridSpawn spawn; private final Map loot; private final StructureTemplate template; - public TerraStructure(ProbabilityCollection structures, Range bound, Range spawnStart, GridSpawn spawn, Map loot, StructureTemplate template) { + public TerraStructure(ProbabilityCollection structures, Range spawnStart, GridSpawn spawn, Map loot, StructureTemplate template) { this.structure = structures; - this.bound = bound; this.spawnStart = spawnStart; this.spawn = spawn; this.loot = loot; @@ -35,10 +33,6 @@ public class TerraStructure { return structure; } - public Range getBound() { - return bound; - } - public Range getSpawnStart() { return spawnStart; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java index 342880ef9..a9badebe7 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java @@ -1,8 +1,21 @@ package com.dfsek.terra.bukkit.command.command.structure; +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.async.AsyncStructureFinder; import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.TerraBukkitPlugin; import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.config.lang.LangUtil; +import com.dfsek.terra.generation.items.TerraStructure; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -11,6 +24,7 @@ import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; +import java.util.Objects; public class LocateCommand extends WorldCommand { private final boolean tp; @@ -32,15 +46,14 @@ public class LocateCommand extends WorldCommand { LangUtil.send("command.structure.invalid-radius", new BukkitCommandSender(sender), args[1]); return true; } - /* TerraStructure s; try { - s = Objects.requireNonNull(((TerraBukkitPlugin) getMain()).getWorld(world).getConfig().getStructure(id)); + s = Objects.requireNonNull(getMain().getWorld(new BukkitWorld(world)).getConfig().getStructure(id)); } catch(IllegalArgumentException | NullPointerException e) { - LangUtil.send("command.structure.invalid", sender, id); + //LangUtil.send("command.structure.invalid", sender, id); return true; } - Bukkit.getScheduler().runTaskAsynchronously(getMain(), new AsyncStructureFinder(((TerraBukkitPlugin) getMain()).getWorld(world).getGrid(), s, sender.getLocation(), 0, maxRadius, (location) -> { + Bukkit.getScheduler().runTaskAsynchronously((TerraBukkitPlugin) getMain(), new AsyncStructureFinder(getMain().getWorld(new BukkitWorld(world)).getGrid(), s, new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), 0, maxRadius, (location) -> { if(sender.isOnline()) { if(location != null) { ComponentBuilder cm = new ComponentBuilder(String.format("The nearest %s is at ", id.toLowerCase())) @@ -48,14 +61,14 @@ public class LocateCommand extends WorldCommand { .event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("/minecraft:tp %s %d.0 %.2f %d.0", sender.getName(), location.getBlockX(), sender.getLocation().getY(), location.getBlockZ()))) .event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new BaseComponent[] {new TextComponent("Click to teleport")})) .color(ChatColor.GREEN) - .append(String.format(" (%.1f blocks away)", location.add(new Vector(0, sender.getLocation().getY(), 0)).distance(sender.getLocation().toVector())), ComponentBuilder.FormatRetention.NONE); + .append(String.format(" (%.1f blocks away)", location.add(new Vector3(0, sender.getLocation().getY(), 0)).distance( + new Vector3(sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()))), ComponentBuilder.FormatRetention.NONE); sender.spigot().sendMessage(cm.create()); } else sender.sendMessage("Unable to locate structure. "); } - }, (TerraBukkitPlugin) getMain())); + }, getMain())); - */ return true; } From 283495832fd732f980b37d5f623555a8a0c290ee Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 27 Dec 2020 20:42:42 -0700 Subject: [PATCH 129/210] Add else if and else --- .../terra/api/structures/parser/Parser.java | 134 ++++++++++++------ .../lang/keywords/looplike/IfKeyword.java | 35 ++++- .../terra/api/structures/tokenizer/Token.java | 6 +- .../api/structures/tokenizer/Tokenizer.java | 2 + common/src/test/resources/test.tesf | 20 +++ 5 files changed, 149 insertions(+), 48 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index df01dd94f..a8208c7fb 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -54,6 +54,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +@SuppressWarnings("unchecked") public class Parser { private final String data; private final Map>> functions = new HashMap<>(); @@ -111,7 +112,6 @@ public class Parser { } - @SuppressWarnings("unchecked") private Keyword parseLoopLike(TokenHolder tokens, Map> variableMap) throws ParseException { Token identifier = tokens.consume(); @@ -119,56 +119,100 @@ public class Parser { ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); - - if(identifier.getType().equals(Token.Type.FOR_LOOP)) { - Token f = tokens.get(); - ParserUtil.checkType(f, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.IDENTIFIER); - Item initializer; - if(f.isVariableDeclaration()) { - Variable forVar = parseVariableDeclaration(tokens, ParserUtil.getVariableReturnType(f)); - ParserUtil.checkType(tokens.consume(), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); - Token name = tokens.get(); - - if(functions.containsKey(name.getContent()) || variableMap.containsKey(name.getContent()) || builtinFunctions.contains(name.getContent())) - throw new ParseException(name.getContent() + " is already defined in this scope", name.getPosition()); - - initializer = parseAssignment(forVar, tokens, variableMap); - variableMap.put(name.getContent(), forVar); - } else initializer = parseExpression(tokens, true, variableMap); - ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); - Returnable conditional = parseExpression(tokens, true, variableMap); - ParserUtil.checkReturnType(conditional, Returnable.ReturnType.BOOLEAN); - ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); - - Item incrementer; - Token token = tokens.get(); - if(variableMap.containsKey(token.getContent())) { // Assume variable assignment - Variable variable = variableMap.get(token.getContent()); - incrementer = parseAssignment(variable, tokens, variableMap); - } else incrementer = parseFunction(tokens, true, variableMap); - - ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - - ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); - - return new ForKeyword(parseBlock(tokens, variableMap), initializer, (Returnable) conditional, incrementer, identifier.getPosition()); + switch(identifier.getType()) { + case FOR_LOOP: + return parseForLoop(tokens, variableMap, identifier.getPosition()); + case IF_STATEMENT: + return parseIfStatement(tokens, variableMap, identifier.getPosition()); + case WHILE_LOOP: + return parseWhileLoop(tokens, variableMap, identifier.getPosition()); + default: + throw new UnsupportedOperationException("Unknown keyword " + identifier.getContent() + ": " + identifier.getPosition()); } + } + private WhileKeyword parseWhileLoop(TokenHolder tokens, Map> variableMap, Position start) throws ParseException { Returnable first = parseExpression(tokens, true, variableMap); ParserUtil.checkReturnType(first, Returnable.ReturnType.BOOLEAN); ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); - - if(identifier.getType().equals(Token.Type.IF_STATEMENT)) - return new IfKeyword(parseBlock(tokens, variableMap), (Returnable) first, identifier.getPosition()); // If statement - else if(identifier.getType().equals(Token.Type.WHILE_LOOP)) - return new WhileKeyword(parseBlock(tokens, variableMap), (Returnable) first, identifier.getPosition()); // While loop - else throw new UnsupportedOperationException("Unknown keyword " + identifier.getContent() + ": " + identifier.getPosition()); + return new WhileKeyword(parseStatementBlock(tokens, variableMap), (Returnable) first, start); // While loop + } + + private IfKeyword parseIfStatement(TokenHolder tokens, Map> variableMap, Position start) throws ParseException { + Returnable condition = parseExpression(tokens, true, variableMap); + ParserUtil.checkReturnType(condition, Returnable.ReturnType.BOOLEAN); + + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); + + Block elseBlock = null; + Block statement = parseStatementBlock(tokens, variableMap); + + List, Block>> elseIf = new GlueList<>(); + + System.out.println(tokens.get()); + + while(tokens.get().getType().equals(Token.Type.ELSE)) { + tokens.consume(); // Consume else. + System.out.println("int: " + tokens.get()); + if(tokens.get().getType().equals(Token.Type.IF_STATEMENT)) { + System.out.println("else if"); + tokens.consume(); // Consume if. + Returnable elseCondition = parseExpression(tokens, true, variableMap); + ParserUtil.checkReturnType(elseCondition, Returnable.ReturnType.BOOLEAN); + elseIf.add(new IfKeyword.Pair<>((Returnable) elseCondition, parseStatementBlock(tokens, variableMap))); + } else { + elseBlock = parseStatementBlock(tokens, variableMap); + break; // Else must be last. + } + } + + return new IfKeyword(statement, (Returnable) condition, elseIf, elseBlock, start); // If statement + } + + private Block parseStatementBlock(TokenHolder tokens, Map> variableMap) throws ParseException { + ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); + Block block = parseBlock(tokens, variableMap); + ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_END); + return block; + } + + private ForKeyword parseForLoop(TokenHolder tokens, Map> variableMap, Position start) throws ParseException { + Token f = tokens.get(); + ParserUtil.checkType(f, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.IDENTIFIER); + Item initializer; + if(f.isVariableDeclaration()) { + Variable forVar = parseVariableDeclaration(tokens, ParserUtil.getVariableReturnType(f)); + ParserUtil.checkType(tokens.consume(), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); + Token name = tokens.get(); + + if(functions.containsKey(name.getContent()) || variableMap.containsKey(name.getContent()) || builtinFunctions.contains(name.getContent())) + throw new ParseException(name.getContent() + " is already defined in this scope", name.getPosition()); + + initializer = parseAssignment(forVar, tokens, variableMap); + variableMap.put(name.getContent(), forVar); + } else initializer = parseExpression(tokens, true, variableMap); + ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); + Returnable conditional = parseExpression(tokens, true, variableMap); + ParserUtil.checkReturnType(conditional, Returnable.ReturnType.BOOLEAN); + ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); + + Item incrementer; + Token token = tokens.get(); + if(variableMap.containsKey(token.getContent())) { // Assume variable assignment + Variable variable = variableMap.get(token.getContent()); + incrementer = parseAssignment(variable, tokens, variableMap); + } else incrementer = parseFunction(tokens, true, variableMap); + + ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); + + ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); + Block block = parseBlock(tokens, variableMap); + ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_END); + return new ForKeyword(block, initializer, (Returnable) conditional, incrementer, start); } - @SuppressWarnings("unchecked") private Returnable parseExpression(TokenHolder tokens, boolean full, Map> variableMap) throws ParseException { boolean booleanInverted = false; // Check for boolean not operator if(tokens.get().getType().equals(Token.Type.BOOLEAN_NOT)) { @@ -244,7 +288,6 @@ public class Parser { return assemble(left, right, binaryOperator); } - @SuppressWarnings("unchecked") private BinaryOperation assemble(Returnable left, Returnable right, Token binaryOperator) throws ParseException { if(binaryOperator.isStrictNumericOperator()) ParserUtil.checkArithmeticOperation(left, right, binaryOperator); // Numeric type checking @@ -311,6 +354,7 @@ public class Parser { if(token.isLoopLike()) { // Parse loop-like tokens (if, while, etc) parsedItems.add(parseLoopLike(tokens, parsedVariables)); + continue; // No statement end } else if(token.isIdentifier()) { // Parse identifiers if(parsedVariables.containsKey(token.getContent())) { // Assume variable assignment Variable variable = parsedVariables.get(token.getContent()); @@ -336,12 +380,11 @@ public class Parser { else if(token.getType().equals(Token.Type.FAIL)) parsedItems.add(new FailKeyword(tokens.consume().getPosition())); else throw new UnsupportedOperationException("Unexpected token " + token.getType() + ": " + token.getPosition()); - if(tokens.hasNext()) ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END, Token.Type.BLOCK_END); + if(tokens.hasNext()) ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); } return new Block(parsedItems, first.getPosition()); } - @SuppressWarnings("unchecked") private Assignment parseAssignment(Variable variable, TokenHolder tokens, Map> variableMap) throws ParseException { Token name = tokens.get(); @@ -356,7 +399,6 @@ public class Parser { return new Assignment<>((Variable) variable, (Returnable) expression, name.getPosition()); } - @SuppressWarnings("unchecked") private Function parseFunction(TokenHolder tokens, boolean fullStatement, Map> variableMap) throws ParseException { Token identifier = tokens.consume(); ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java index 7d287b9e8..7a5f4ee88 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java @@ -6,26 +6,41 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; +import org.jetbrains.annotations.Nullable; +import java.util.List; import java.util.Random; public class IfKeyword implements Keyword { private final Block conditional; private final Returnable statement; private final Position position; + private final List, Block>> elseIf; + private final Block elseBlock; - public IfKeyword(Block conditional, Returnable statement, Position position) { + public IfKeyword(Block conditional, Returnable statement, List, Block>> elseIf, @Nullable Block elseBlock, Position position) { this.conditional = conditional; this.statement = statement; this.position = position; + this.elseIf = elseIf; + this.elseBlock = elseBlock; } @Override public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { if(statement.apply(buffer, rotation, random, recursions)) return conditional.apply(buffer, rotation, random, recursions); + else { + for(Pair, Block> pair : elseIf) { + if(pair.getLeft().apply(buffer, rotation, random, recursions)) { + return pair.getRight().apply(buffer, rotation, random, recursions); + } + } + if(elseBlock != null) return elseBlock.apply(buffer, rotation, random, recursions); + } return Block.ReturnLevel.NONE; } + @Override public Position getPosition() { return position; @@ -35,4 +50,22 @@ public class IfKeyword implements Keyword { public ReturnType returnType() { return ReturnType.VOID; } + + public static class Pair { + private final L left; + private final R right; + + public Pair(L left, R right) { + this.left = left; + this.right = right; + } + + public L getLeft() { + return left; + } + + public R getRight() { + return right; + } + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 2acba38d1..31af0c837 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -219,6 +219,10 @@ public class Token { /** * For loop initializer token */ - FOR_LOOP + FOR_LOOP, + /** + * Else keyword + */ + ELSE } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index f209bf0b2..b5335f1c9 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -131,6 +131,8 @@ public class Tokenizer { if(tokenString.equals("if")) return new Token(tokenString, Token.Type.IF_STATEMENT, new Position(reader.getLine(), reader.getIndex())); + if(tokenString.equals("else")) + return new Token(tokenString, Token.Type.ELSE, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("while")) return new Token(tokenString, Token.Type.WHILE_LOOP, new Position(reader.getLine(), reader.getIndex())); if(tokenString.equals("for")) diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index c511a3ba3..543f55399 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -27,6 +27,26 @@ while(iterator < 5) { test("not after " + 2, iterator); } +if(true) { + test("true!" + 2, iterator); +} else { + test("false!" + 2, iterator); + } + +if(false) { + test("true!" + 2, iterator); +} else { + test("false!" + 2, iterator); +} + +if(false) { + test("true again!" + 2, iterator); +} else if(true == true) { + test("false again!" + 2, iterator); +} else { + test("not logged!" + 2, iterator); +} + if(true && !(boolean && false) && true) { num scopedVar = 2; From 7cf34dbd8a562f925843c2ae9bffca784f1ca0fe Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 27 Dec 2020 20:52:35 -0700 Subject: [PATCH 130/210] allow single statement loops --- .../terra/api/structures/parser/Parser.java | 90 ++++++++++--------- common/src/test/resources/test.tesf | 6 ++ 2 files changed, 55 insertions(+), 41 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index a8208c7fb..706939bce 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -49,6 +49,7 @@ import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; import com.dfsek.terra.api.util.GlueList; import com.google.common.collect.Sets; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -172,10 +173,18 @@ public class Parser { } private Block parseStatementBlock(TokenHolder tokens, Map> variableMap) throws ParseException { - ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); - Block block = parseBlock(tokens, variableMap); - ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_END); - return block; + + if(tokens.get().getType().equals(Token.Type.BLOCK_BEGIN)) { + ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); + Block block = parseBlock(tokens, variableMap); + ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_END); + return block; + } else { + Position position = tokens.get().getPosition(); + Block block = new Block(Collections.singletonList(parseItem(tokens, variableMap)), position); + ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); + return block; + } } private ForKeyword parseForLoop(TokenHolder tokens, Map> variableMap, Position start) throws ParseException { @@ -207,10 +216,7 @@ public class Parser { ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); - Block block = parseBlock(tokens, variableMap); - ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_END); - return new ForKeyword(block, initializer, (Returnable) conditional, incrementer, start); + return new ForKeyword(parseStatementBlock(tokens, variableMap), initializer, (Returnable) conditional, incrementer, start); } private Returnable parseExpression(TokenHolder tokens, boolean full, Map> variableMap) throws ParseException { @@ -348,43 +354,45 @@ public class Parser { while(tokens.hasNext()) { Token token = tokens.get(); if(token.getType().equals(Token.Type.BLOCK_END)) break; // Stop parsing at block end. - - ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, - Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE, Token.Type.FAIL); - - if(token.isLoopLike()) { // Parse loop-like tokens (if, while, etc) - parsedItems.add(parseLoopLike(tokens, parsedVariables)); - continue; // No statement end - } else if(token.isIdentifier()) { // Parse identifiers - if(parsedVariables.containsKey(token.getContent())) { // Assume variable assignment - Variable variable = parsedVariables.get(token.getContent()); - parsedItems.add(parseAssignment(variable, tokens, parsedVariables)); - } else parsedItems.add(parseFunction(tokens, true, parsedVariables)); - } else if(token.isVariableDeclaration()) { - Variable temp = parseVariableDeclaration(tokens, ParserUtil.getVariableReturnType(token)); - - ParserUtil.checkType(tokens.consume(), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); - Token name = tokens.get(); - ParserUtil.checkType(name, Token.Type.IDENTIFIER); // Name must be an identifier. - - if(functions.containsKey(name.getContent()) || parsedVariables.containsKey(name.getContent()) || builtinFunctions.contains(name.getContent())) - throw new ParseException(name.getContent() + " is already defined in this scope", name.getPosition()); - - parsedVariables.put(name.getContent(), temp); - - - parsedItems.add(parseAssignment(temp, tokens, parsedVariables)); - } else if(token.getType().equals(Token.Type.RETURN)) parsedItems.add(new ReturnKeyword(tokens.consume().getPosition())); - else if(token.getType().equals(Token.Type.BREAK)) parsedItems.add(new BreakKeyword(tokens.consume().getPosition())); - else if(token.getType().equals(Token.Type.CONTINUE)) parsedItems.add(new ContinueKeyword(tokens.consume().getPosition())); - else if(token.getType().equals(Token.Type.FAIL)) parsedItems.add(new FailKeyword(tokens.consume().getPosition())); - else throw new UnsupportedOperationException("Unexpected token " + token.getType() + ": " + token.getPosition()); - - if(tokens.hasNext()) ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); + parsedItems.add(parseItem(tokens, parsedVariables)); + if(tokens.hasNext() && !token.isLoopLike()) ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); } return new Block(parsedItems, first.getPosition()); } + private Item parseItem(TokenHolder tokens, Map> variableMap) throws ParseException { + Token token = tokens.get(); + ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, + Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE, Token.Type.FAIL); + + if(token.isLoopLike()) { // Parse loop-like tokens (if, while, etc) + return parseLoopLike(tokens, variableMap); + } else if(token.isIdentifier()) { // Parse identifiers + if(variableMap.containsKey(token.getContent())) { // Assume variable assignment + Variable variable = variableMap.get(token.getContent()); + return parseAssignment(variable, tokens, variableMap); + } else return parseFunction(tokens, true, variableMap); + } else if(token.isVariableDeclaration()) { + Variable temp = parseVariableDeclaration(tokens, ParserUtil.getVariableReturnType(token)); + + ParserUtil.checkType(tokens.consume(), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); + Token name = tokens.get(); + ParserUtil.checkType(name, Token.Type.IDENTIFIER); // Name must be an identifier. + + if(functions.containsKey(name.getContent()) || variableMap.containsKey(name.getContent()) || builtinFunctions.contains(name.getContent())) + throw new ParseException(name.getContent() + " is already defined in this scope", name.getPosition()); + + variableMap.put(name.getContent(), temp); + + + return parseAssignment(temp, tokens, variableMap); + } else if(token.getType().equals(Token.Type.RETURN)) return new ReturnKeyword(tokens.consume().getPosition()); + else if(token.getType().equals(Token.Type.BREAK)) return new BreakKeyword(tokens.consume().getPosition()); + else if(token.getType().equals(Token.Type.CONTINUE)) return new ContinueKeyword(tokens.consume().getPosition()); + else if(token.getType().equals(Token.Type.FAIL)) return new FailKeyword(tokens.consume().getPosition()); + else throw new UnsupportedOperationException("Unexpected token " + token.getType() + ": " + token.getPosition()); + } + private Assignment parseAssignment(Variable variable, TokenHolder tokens, Map> variableMap) throws ParseException { Token name = tokens.get(); diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 543f55399..028c121b9 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -17,6 +17,9 @@ for(num i = 0; i < 5; i = i + 1) { test("i = " + i, iterator); } +for(num j = 0; j < 5; j = j + 1) test("single statement j = " + j, iterator); + + while(iterator < 5) { test("always, even after " + 2, iterator); @@ -27,6 +30,9 @@ while(iterator < 5) { test("not after " + 2, iterator); } +if(true) test("single statement" + 2, iterator); +else if(true) test("another single statement" + 2, iterator); + if(true) { test("true!" + 2, iterator); } else { From 8db263e19b5bf81418dfb03bc4e183cb893b84ea Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 27 Dec 2020 20:55:01 -0700 Subject: [PATCH 131/210] fix EOF issues --- .../com/dfsek/terra/api/structures/parser/Parser.java | 4 +--- common/src/test/resources/test.tesf | 9 +++++---- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 706939bce..84de91448 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -152,9 +152,7 @@ public class Parser { List, Block>> elseIf = new GlueList<>(); - System.out.println(tokens.get()); - - while(tokens.get().getType().equals(Token.Type.ELSE)) { + while(tokens.hasNext() && tokens.get().getType().equals(Token.Type.ELSE)) { tokens.consume(); // Consume else. System.out.println("int: " + tokens.get()); if(tokens.get().getType().equals(Token.Type.IF_STATEMENT)) { diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 028c121b9..8743834b1 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -54,10 +54,7 @@ if(false) { } -if(true && !(boolean && false) && true) { - num scopedVar = 2; - test("if statement" + 2 + stringVar, 1 + testVar + scopedVar); -} + // comment /* @@ -66,3 +63,7 @@ fsdfsd test("fdsgdf" + 2, 1 + testVar); +if(true && !(boolean && false) && true) { + num scopedVar = 2; + test("if statement" + 2 + stringVar, 1 + testVar + scopedVar); +} \ No newline at end of file From 447c82f74a3333737a889c5328bbcb0e3c364b9b Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 27 Dec 2020 21:08:48 -0700 Subject: [PATCH 132/210] StructureFunction returns boolean based on pass/fail --- .../terra/api/structures/script/StructureScript.java | 4 ++-- .../structures/script/functions/StructureFunction.java | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 91b144805..1b02c9df9 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -92,8 +92,8 @@ public class StructureScript { return !block.apply(buffer, rotation, random, 0).equals(Block.ReturnLevel.FAIL); } - public void executeInBuffer(Buffer buffer, Random random, Rotation rotation, int recursions) { - block.apply(buffer, rotation, random, recursions); + public boolean executeInBuffer(Buffer buffer, Random random, Rotation rotation, int recursions) { + return !block.apply(buffer, rotation, random, recursions).equals(Block.ReturnLevel.FAIL); } public String getId() { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index f0ca21093..7ba3ef3da 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -17,7 +17,7 @@ import net.jafama.FastMath; import java.util.List; import java.util.Random; -public class StructureFunction implements Function { +public class StructureFunction implements Function { private final ScriptRegistry registry; private final Returnable id; private final Returnable x, y, z; @@ -43,11 +43,11 @@ public class StructureFunction implements Function { @Override public ReturnType returnType() { - return ReturnType.VOID; + return ReturnType.BOOLEAN; } @Override - public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public Boolean apply(Buffer buffer, Rotation rotation, Random random, int recursions) { Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); @@ -70,9 +70,7 @@ public class StructureFunction implements Function { Vector3 offset = new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ())); - script.executeInBuffer(new IntermediateBuffer(buffer, offset), random, rotation.rotate(rotation1), recursions + 1); - - return null; + return script.executeInBuffer(new IntermediateBuffer(buffer, offset), random, rotation.rotate(rotation1), recursions + 1); } @Override From 7d0149b59df2840213b9c3760667cb44dca49166 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 29 Dec 2020 19:23:37 -0700 Subject: [PATCH 133/210] brain moment --- .../terra/bukkit/command/command/structure/ExportCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java index 6dd51cc08..ebf246d2f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java @@ -68,7 +68,7 @@ public class ExportCommand extends PlayerCommand { Sign sign = (Sign) state; if(sign.getLine(0).equals("[TERRA]")) { scriptBuilder.append(Bukkit.createBlockData(sign.getLine(2) + sign.getLine(3)).getAsString(false)); - } + } else scriptBuilder.append(block.getBlockData().getAsString(false)); } else { scriptBuilder.append(block.getBlockData().getAsString(false)); } From a68b85c522c151705c57e574efd3a6435f95a82a Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 30 Dec 2020 00:03:02 -0700 Subject: [PATCH 134/210] elevation tweaks & general cleanup --- .../interpolation/ChunkInterpolator3.java | 29 +++++------- .../api/math/interpolation/Interpolator.java | 26 +++------- .../api/math/interpolation/Interpolator3.java | 10 ++-- .../dfsek/terra/api/world/biome/Biome.java | 7 --- .../terra/api/world/biome/Decorator.java | 20 -------- .../terra/api/world/biome/Generator.java | 19 ++------ .../dfsek/terra/biome/UserDefinedBiome.java | 16 +------ .../terra/config/factories/BiomeFactory.java | 5 +- .../generation/ElevationInterpolator.java | 44 ++++++++--------- .../generation/MasterChunkGenerator.java | 5 +- .../generation/UserDefinedDecorator.java | 47 ------------------- .../generation/config/WorldGenerator.java | 9 +--- .../command/structure/ExportCommand.java | 15 ++++-- 13 files changed, 66 insertions(+), 186 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/api/world/biome/Decorator.java delete mode 100644 common/src/main/java/com/dfsek/terra/generation/UserDefinedDecorator.java diff --git a/common/src/main/java/com/dfsek/terra/api/math/interpolation/ChunkInterpolator3.java b/common/src/main/java/com/dfsek/terra/api/math/interpolation/ChunkInterpolator3.java index a5f3f9b9b..048e61c64 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/interpolation/ChunkInterpolator3.java +++ b/common/src/main/java/com/dfsek/terra/api/math/interpolation/ChunkInterpolator3.java @@ -15,9 +15,6 @@ public class ChunkInterpolator3 { private final Generator[][] gens = new Generator[7][7]; private final boolean[][] needsBiomeInterp = new boolean[5][5]; private final double[][][] noiseStorage = new double[7][7][65]; - private final int xOrigin; - private final int zOrigin; - private final World w; /** * Instantiates a 3D ChunkInterpolator at a pair of chunk coordinates, with a BiomeGrid and FastNoiseLite instance. @@ -27,9 +24,8 @@ public class ChunkInterpolator3 { * @param grid BiomeGrid to use for noise fetching. */ public ChunkInterpolator3(World w, int chunkX, int chunkZ, BiomeGrid grid) { - this.xOrigin = chunkX << 4; - this.zOrigin = chunkZ << 4; - this.w = w; + int xOrigin = chunkX << 4; + int zOrigin = chunkZ << 4; for(int x = -1; x < 6; x++) { @@ -39,11 +35,17 @@ public class ChunkInterpolator3 { } for(int x = 0; x < 5; x++) { for(int z = 0; z < 5; z++) { - needsBiomeInterp[x][z] = compareGens(x+1, z+1); + needsBiomeInterp[x][z] = compareGens(x + 1, z + 1); } } - storeNoise(); + for(byte x = -1; x < 6; x++) { + for(byte z = -1; z < 6; z++) { + for(int y = 0; y < 65; y++) { + noiseStorage[x + 1][z + 1][y] = gens[x + 1][z + 1].getNoise(w, (x << 2) + xOrigin, y << 2, (z << 2) + zOrigin); + } + } + } for(byte x = 0; x < 4; x++) { for(byte z = 0; z < 4; z++) { @@ -56,7 +58,7 @@ public class ChunkInterpolator3 { biomeAvg(x, y, z + 1), biomeAvg(x + 1, y, z + 1), biomeAvg(x, y + 1, z + 1), - biomeAvg(x + 1, y + 1, z + 1), gens[x+1][z+1].getInterpolationType()); + biomeAvg(x + 1, y + 1, z + 1)); } } } @@ -80,15 +82,6 @@ public class ChunkInterpolator3 { return !comp.equals(gens[x - 1][z + 1]); } - private void storeNoise() { - for(byte x = - 1; x < 6; x++) { - for(byte z = - 1; z < 6; z++) { - for(int y = 0; y < 64; y++) { - noiseStorage[x + 1][z + 1][y] = gens[x + 1][z + 1].getNoise(w, (x << 2) + xOrigin, y << 2, (z << 2) + zOrigin); - } - } - } - } private double biomeAvg(int x, int y, int z) { if(needsBiomeInterp[x][z]) return (noiseStorage[x + 2][z + 1][y] diff --git a/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator.java b/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator.java index 00466b9b9..493168981 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator.java +++ b/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator.java @@ -1,13 +1,10 @@ package com.dfsek.terra.api.math.interpolation; -import net.jafama.FastMath; - /** * Class for bilinear interpolation of values arranged on a unit square. */ public class Interpolator { private final double v0, v1, v2, v3; - private final Type type; /** * Constructs an interpolator with given values as vertices of a unit square. @@ -17,12 +14,11 @@ public class Interpolator { * @param v2 - (0,1) * @param v3 - (1,1) */ - public Interpolator(double v0, double v1, double v2, double v3, Type type) { + public Interpolator(double v0, double v1, double v2, double v3) { this.v0 = v0; this.v1 = v1; this.v2 = v2; this.v3 = v3; - this.type = type; } /** @@ -33,12 +29,9 @@ public class Interpolator { * @param v1 - Value at v1. * @return double - The interpolated value. */ - public static double lerp(double t, double v0, double v1, Type type) { - switch(type) { - case LINEAR: return v0 + t * (v1 - v0); - case NEAREST_NEIGHBOR: return FastMath.abs(v0-t) > FastMath.abs(v1-t) ? v1 : v0; - default: throw new IllegalStateException(); - } + public static double lerp(double t, double v0, double v1) { + return v0 + t * (v1 - v0); + } /** @@ -49,13 +42,8 @@ public class Interpolator { * @return double - The interpolated value. */ public double bilerp(double s, double t) { - double v01 = lerp(s, v0, v1, type); - double v23 = lerp(s, v2, v3, type); - double v = lerp(t, v01, v23, type); - return v; - } - - public enum Type { - LINEAR, NEAREST_NEIGHBOR + double v01 = lerp(s, v0, v1); + double v23 = lerp(s, v2, v3); + return lerp(t, v01, v23); } } \ No newline at end of file diff --git a/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator3.java b/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator3.java index 4ef669a59..5b54c0f9a 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator3.java +++ b/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator3.java @@ -5,7 +5,6 @@ package com.dfsek.terra.api.math.interpolation; */ public class Interpolator3 { private final double _000, _100, _010, _110, _001, _101, _011, _111; - private final Interpolator.Type type; /** * Constructs an interpolator with given values as vertices of a unit cube. @@ -20,7 +19,7 @@ public class Interpolator3 { */ public Interpolator3(double _000, double _100, double _010, double _110, double _001, double _101, - double _011, double _111, Interpolator.Type type) { + double _011, double _111) { this._000 = _000; this._001 = _001; this._010 = _010; @@ -29,12 +28,11 @@ public class Interpolator3 { this._101 = _101; this._110 = _110; this._111 = _111; - this.type = type; } public double trilerp(double x, double y, double z) { - Interpolator top = new Interpolator(_000, _010, _001, _011, type); - Interpolator bottom = new Interpolator(_100, _110, _101, _111, type); - return Interpolator.lerp(x, top.bilerp(y, z), bottom.bilerp(y, z), type); + Interpolator top = new Interpolator(_000, _010, _001, _011); + Interpolator bottom = new Interpolator(_100, _110, _101, _111); + return Interpolator.lerp(x, top.bilerp(y, z), bottom.bilerp(y, z)); } } \ No newline at end of file diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/Biome.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Biome.java index 0bdfba763..25ad009dc 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/Biome.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/Biome.java @@ -23,13 +23,6 @@ public interface Biome { */ Generator getGenerator(); - /** - * Returns the Decorator instance containing information about the population in the biome. - * - * @return Decorator - the Decorator instance. - */ - Decorator getDecorator(); - /** * Gets the BiomeTerrain instance used to generate the biome in this world. * diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/Decorator.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Decorator.java deleted file mode 100644 index ff0bf1ab1..000000000 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/Decorator.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dfsek.terra.api.world.biome; - -import com.dfsek.terra.api.math.ProbabilityCollection; -import com.dfsek.terra.api.world.flora.Flora; -import com.dfsek.terra.api.world.tree.Tree; - -public abstract class Decorator { - - - public abstract ProbabilityCollection getTrees(); - - public abstract int getTreeDensity(); - - public abstract boolean overrideStructureChance(); - - public abstract ProbabilityCollection getFlora(); - - public abstract int getFloraChance(); - -} diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java index 1dd2b7310..5f3336348 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java @@ -1,11 +1,10 @@ package com.dfsek.terra.api.world.biome; -import com.dfsek.terra.api.math.interpolation.Interpolator; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.palette.Palette; -public abstract class Generator { +public interface Generator { /** * Gets the 3D noise at a pair of coordinates using the provided FastNoiseLite instance. * @@ -14,27 +13,19 @@ public abstract class Generator { * @param z - The z coordinate. * @return double - Noise value at the specified coordinates. */ - public abstract double getNoise(World w, int x, int y, int z); + double getNoise(World w, int x, int y, int z); /** * Gets the BlocPalette to generate the biome with. * * @return BlocPalette - The biome's palette. */ - public abstract Palette getPalette(int y); + Palette getPalette(int y); /** * Returns true if the biome should be interpolated just once, false to use advanced interpolation + blending. + * * @return Whether biome should use minimal interpolation */ - public abstract boolean useMinimalInterpolation(); - - - /** - * Get the type of interpolation to use in this biome. - * @return Interpolation type - */ - public Interpolator.Type getInterpolationType() { - return Interpolator.Type.LINEAR; - } + boolean useMinimalInterpolation(); } diff --git a/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java b/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java index 4b74662e5..2be4e0ff8 100644 --- a/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java +++ b/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java @@ -2,19 +2,16 @@ package com.dfsek.terra.biome; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.biome.Biome; -import com.dfsek.terra.api.world.biome.Decorator; import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.builder.GeneratorBuilder; import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.generation.UserDefinedDecorator; /** * Class representing a config-defined biome */ public class UserDefinedBiome implements Biome { private final GeneratorBuilder gen; - private final UserDefinedDecorator decorator; private final com.dfsek.terra.api.platform.world.Biome vanilla; private final String id; private final BiomeTemplate config; @@ -22,9 +19,8 @@ public class UserDefinedBiome implements Biome { private UserDefinedBiome erode; - public UserDefinedBiome(com.dfsek.terra.api.platform.world.Biome vanilla, UserDefinedDecorator dec, GeneratorBuilder gen, BiomeTemplate config, ConfigPack pack) { + public UserDefinedBiome(com.dfsek.terra.api.platform.world.Biome vanilla, GeneratorBuilder gen, BiomeTemplate config, ConfigPack pack) { this.vanilla = vanilla; - this.decorator = dec; this.gen = gen; this.id = config.getID(); this.config = config; @@ -52,16 +48,6 @@ public class UserDefinedBiome implements Biome { } - /** - * Returns the Decorator instance containing information about the population in the biome. - * - * @return Decorator - the Decorator instance. - */ - @Override - public Decorator getDecorator() { - return decorator; - } - public String getID() { return id; } diff --git a/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java index b06a9e0ae..b0c41c1f4 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java @@ -1,12 +1,10 @@ package com.dfsek.terra.config.factories; -import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.builder.GeneratorBuilder; import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.generation.UserDefinedDecorator; public class BiomeFactory implements TerraFactory { private final ConfigPack pack; @@ -17,7 +15,6 @@ public class BiomeFactory implements TerraFactory(), new ProbabilityCollection<>(), 0, 0); GeneratorBuilder generatorBuilder = new GeneratorBuilder(); generatorBuilder.setElevationEquation(template.getElevationEquation()); generatorBuilder.setNoiseEquation(template.getNoiseEquation()); @@ -28,6 +25,6 @@ public class BiomeFactory implements TerraFactory flora; - private final ProbabilityCollection trees; - private final int floraChance; - private final int treeDensity; - - public UserDefinedDecorator(ProbabilityCollection flora, ProbabilityCollection trees, int floraChance, int treeDensity) { - this.flora = flora; - this.trees = trees; - - this.floraChance = floraChance; - this.treeDensity = treeDensity; - } - - @Override - public ProbabilityCollection getTrees() { - return trees; - } - - @Override - public int getTreeDensity() { - return treeDensity; - } - - @Override - public boolean overrideStructureChance() { - return false; - } - - @Override - public ProbabilityCollection getFlora() { - return flora; - } - - @Override - public int getFloraChance() { - return floraChance; - } -} diff --git a/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java index b05e8eb11..5c99c61d0 100644 --- a/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java @@ -1,6 +1,5 @@ package com.dfsek.terra.generation.config; -import com.dfsek.terra.api.math.interpolation.Interpolator; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.biome.Generator; @@ -17,7 +16,7 @@ import parsii.tokenizer.ParseException; import java.util.Map; -public class WorldGenerator extends Generator { +public class WorldGenerator implements Generator { @SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"}) private final PaletteHolder palettes; @SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"}) @@ -33,7 +32,6 @@ public class WorldGenerator extends Generator { private final Variable elevationZVar; private final boolean elevationInterpolation; - @SuppressWarnings({"rawtypes", "unchecked"}) public WorldGenerator(long seed, String equation, String elevateEquation, Scope vScope, Map noiseBuilders, PaletteHolder palettes, PaletteHolder slantPalettes, boolean preventSmooth, boolean elevationInterpolation) { Parser p = new Parser(); p.registerFunction("rand", new RandomFunction()); @@ -117,11 +115,6 @@ public class WorldGenerator extends Generator { return preventSmooth; } - @Override - public Interpolator.Type getInterpolationType() { - return Interpolator.Type.LINEAR; - } - public boolean interpolateElevation() { return elevationInterpolation; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java index ebf246d2f..5c7ec65e8 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java @@ -8,6 +8,7 @@ import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.Sign; +import org.bukkit.block.data.BlockData; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -59,6 +60,7 @@ public class ExportCommand extends PlayerCommand { for(int x = l1.getBlockX(); x <= l2.getBlockX(); x++) { for(int y = l1.getBlockY(); y <= l2.getBlockY(); y++) { for(int z = l1.getBlockZ(); z <= l2.getBlockZ(); z++) { + String data; Block block = new Location(l1.getWorld(), x, y, z).getBlock(); if(block.getType().equals(Material.STRUCTURE_VOID)) continue; scriptBuilder.append("block(").append(x - l1.getBlockX() - centerX).append(", y + ").append(y - l1.getBlockY() - centerY).append(", ").append(z - l1.getBlockZ() - centerZ).append(", ") @@ -67,12 +69,17 @@ public class ExportCommand extends PlayerCommand { if(state instanceof Sign) { Sign sign = (Sign) state; if(sign.getLine(0).equals("[TERRA]")) { - scriptBuilder.append(Bukkit.createBlockData(sign.getLine(2) + sign.getLine(3)).getAsString(false)); - } else scriptBuilder.append(block.getBlockData().getAsString(false)); + data = sign.getLine(2) + sign.getLine(3); + BlockData data1 = Bukkit.createBlockData(sign.getLine(2) + sign.getLine(3)); + if(data1.getMaterial().equals(Material.STRUCTURE_VOID)) continue; + scriptBuilder.append(data1.getAsString(false)); + } else { + data = block.getBlockData().getAsString(false); + } } else { - scriptBuilder.append(block.getBlockData().getAsString(false)); + data = block.getBlockData().getAsString(false); } - scriptBuilder.append("\");\n"); + scriptBuilder.append(data).append("\");\n"); } } } From ce45bacc6f738816b02ce5c0a26de1eff62d99c8 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 30 Dec 2020 01:45:20 -0700 Subject: [PATCH 135/210] better biome blending --- .../com/dfsek/terra/api/math/MathUtil.java | 27 +++++++++ .../interpolation/ChunkInterpolator3.java | 59 +++++++++---------- .../terra/api/world/biome/Generator.java | 6 -- .../config/builder/GeneratorBuilder.java | 3 +- .../generation/ElevationInterpolator.java | 18 +++--- .../generation/MasterChunkGenerator.java | 4 +- .../generation/config/WorldGenerator.java | 10 +--- 7 files changed, 70 insertions(+), 57 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java b/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java index b2313758b..b1a5aa687 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java @@ -55,4 +55,31 @@ public class MathUtil { } return hash; } + + /** + * Compute binary logarithm + * + * @param bits Input + * @return Binary logarithm + */ + public static int binlog(int bits) { + int log = 0; + if((bits & 0xffff0000) != 0) { + bits >>>= 16; + log = 16; + } + if(bits >= 256) { + bits >>>= 8; + log += 8; + } + if(bits >= 16) { + bits >>>= 4; + log += 4; + } + if(bits >= 4) { + bits >>>= 2; + log += 2; + } + return log + (bits >>> 1); + } } diff --git a/common/src/main/java/com/dfsek/terra/api/math/interpolation/ChunkInterpolator3.java b/common/src/main/java/com/dfsek/terra/api/math/interpolation/ChunkInterpolator3.java index 048e61c64..171c54fa9 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/interpolation/ChunkInterpolator3.java +++ b/common/src/main/java/com/dfsek/terra/api/math/interpolation/ChunkInterpolator3.java @@ -15,6 +15,7 @@ public class ChunkInterpolator3 { private final Generator[][] gens = new Generator[7][7]; private final boolean[][] needsBiomeInterp = new boolean[5][5]; private final double[][][] noiseStorage = new double[7][7][65]; + private final int smooth; /** * Instantiates a 3D ChunkInterpolator at a pair of chunk coordinates, with a BiomeGrid and FastNoiseLite instance. @@ -23,14 +24,15 @@ public class ChunkInterpolator3 { * @param chunkZ Z coordinate of the chunk. * @param grid BiomeGrid to use for noise fetching. */ - public ChunkInterpolator3(World w, int chunkX, int chunkZ, BiomeGrid grid) { + public ChunkInterpolator3(World w, int chunkX, int chunkZ, BiomeGrid grid, int smooth) { int xOrigin = chunkX << 4; int zOrigin = chunkZ << 4; + this.smooth = smooth; for(int x = -1; x < 6; x++) { for(int z = -1; z < 6; z++) { - gens[x + 1][z + 1] = grid.getBiome(xOrigin + (x << 2), zOrigin + (z << 2), GenerationPhase.BASE).getGenerator(); + gens[x + 1][z + 1] = grid.getBiome(xOrigin + (x * smooth), zOrigin + (z * smooth), GenerationPhase.BASE).getGenerator(); } } for(int x = 0; x < 5; x++) { @@ -42,7 +44,7 @@ public class ChunkInterpolator3 { for(byte x = -1; x < 6; x++) { for(byte z = -1; z < 6; z++) { for(int y = 0; y < 65; y++) { - noiseStorage[x + 1][z + 1][y] = gens[x + 1][z + 1].getNoise(w, (x << 2) + xOrigin, y << 2, (z << 2) + zOrigin); + noiseStorage[x + 1][z + 1][y] = gens[x + 1][z + 1].getNoise(w, (x * smooth) + xOrigin, y << 2, (z * smooth) + zOrigin); } } } @@ -64,43 +66,40 @@ public class ChunkInterpolator3 { } } + private static int reRange(int value, int high) { + return FastMath.max(FastMath.min(value, high), 0); + } + private boolean compareGens(int x, int z) { Generator comp = gens[x][z]; - if(!comp.equals(gens[x+1][z])) return true; + if(!comp.equals(gens[x + 1][z])) return true; - if(!comp.equals(gens[x][z+1])) return true; + if(!comp.equals(gens[x][z + 1])) return true; - if(!comp.equals(gens[x-1][z])) return true; + if(!comp.equals(gens[x - 1][z])) return true; - if(!comp.equals(gens[x][z-1])) return true; + if(!comp.equals(gens[x][z - 1])) return true; - if(!comp.equals(gens[x+1][z+1])) return true; + if(!comp.equals(gens[x + 1][z + 1])) return true; - if(!comp.equals(gens[x-1][z-1])) return true; + if(!comp.equals(gens[x - 1][z - 1])) return true; - if(!comp.equals(gens[x+1][z-1])) return true; + if(!comp.equals(gens[x + 1][z - 1])) return true; return !comp.equals(gens[x - 1][z + 1]); } private double biomeAvg(int x, int y, int z) { - if(needsBiomeInterp[x][z]) return (noiseStorage[x + 2][z + 1][y] - + noiseStorage[x][z + 1][y] - + noiseStorage[x + 1][z + 2][y] - + noiseStorage[x + 1][z][y] - + noiseStorage[x][z][y] - + noiseStorage[x + 2][z + 2][y] - + noiseStorage[x + 2][z][y] - + noiseStorage[x][z + 2][y] - + noiseStorage[x + 1][z + 1][y] - ) / 9D; - else { - if(gens[x+1][z+1].useMinimalInterpolation()) return noiseStorage[x+1][z+1][y]; - else return (noiseStorage[x + 2][z + 1][y] - + noiseStorage[x][z + 1][y] - + noiseStorage[x + 1][z + 2][y] - + noiseStorage[x + 1][z][y] - + noiseStorage[x+1][z+1][y]) / 5D; + if(needsBiomeInterp[x][z]) { + double t = 0d; + for(int xi = 0; xi <= 2; xi++) { + for(int zi = 0; zi <= 2; zi++) { + t += noiseStorage[x + xi][z + zi][y]; + } + } + return t / 9d; + } else { + return noiseStorage[x + 1][z + 1][y]; } } @@ -112,10 +111,6 @@ public class ChunkInterpolator3 { * @return double - The interpolated noise at the coordinates. */ public double getNoise(double x, double y, double z) { - return interpGrid[reRange(((int) x) / 4, 3)][reRange(((int) y) / 4, 63)][reRange(((int) z) / 4, 3)].trilerp((x % 4) / 4, (y % 4) / 4, (z % 4) / 4); - } - - private static int reRange(int value, int high) { - return FastMath.max(FastMath.min(value, high), 0); + return interpGrid[reRange(((int) x) / smooth, 3)][reRange(((int) y) / 4, 63)][reRange(((int) z) / smooth, 3)].trilerp((x % smooth) / smooth, (y % 4) / 4, (z % smooth) / smooth); } } diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java index 5f3336348..6c844d7a0 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java @@ -22,10 +22,4 @@ public interface Generator { */ Palette getPalette(int y); - /** - * Returns true if the biome should be interpolated just once, false to use advanced interpolation + blending. - * - * @return Whether biome should use minimal interpolation - */ - boolean useMinimalInterpolation(); } diff --git a/common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java index d63460942..42cf84ac6 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java @@ -27,8 +27,9 @@ public class GeneratorBuilder { private boolean interpolateElevation; + public WorldGenerator build(long seed) { - return gens.computeIfAbsent(seed, k -> new WorldGenerator(seed, noiseEquation, elevationEquation, varScope, noiseBuilderMap, palettes, slantPalettes, preventInterpolation, interpolateElevation)); + return gens.computeIfAbsent(seed, k -> new WorldGenerator(seed, noiseEquation, elevationEquation, varScope, noiseBuilderMap, palettes, slantPalettes, interpolateElevation)); } public String getNoiseEquation() { diff --git a/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java b/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java index ef66f17dd..2de0df41a 100644 --- a/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java +++ b/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.math.interpolation.Interpolator; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.config.WorldGenerator; +import net.jafama.FastMath; public class ElevationInterpolator { private final WorldGenerator[][] gens; @@ -12,17 +13,20 @@ public class ElevationInterpolator { private final int zOrigin; private final TerraBiomeGrid grid; private final int smooth; + private final int pow; public ElevationInterpolator(int chunkX, int chunkZ, TerraBiomeGrid grid, int smooth) { this.xOrigin = chunkX << 4; this.zOrigin = chunkZ << 4; this.grid = grid; this.smooth = smooth; - this.gens = new WorldGenerator[10][10]; + this.pow = FastMath.log2(smooth); + this.gens = new WorldGenerator[6 + 2 * pow][6 + 2 * pow]; - for(int x = -2; x < 8; x++) { - for(int z = -2; z < 8; z++) { - gens[x + 2][z + 2] = (WorldGenerator) grid.getBiome(xOrigin + (x * smooth), zOrigin + (z * smooth), GenerationPhase.BASE).getGenerator(); + + for(int x = -pow; x < 6 + pow; x++) { + for(int z = -pow; z < 6 + pow; z++) { + gens[x + pow][z + pow] = (WorldGenerator) grid.getBiome(xOrigin + (x * smooth), zOrigin + (z * smooth), GenerationPhase.BASE).getGenerator(); } } @@ -45,12 +49,12 @@ public class ElevationInterpolator { } private WorldGenerator getStoredGen(int x, int z) { - return gens[x + 2][z + 2]; + return gens[x + pow][z + pow]; } private boolean compareGens(int x, int z, WorldGenerator comp) { - for(int xi = x - 2; xi <= x + 2; xi++) { - for(int zi = z - 2; zi <= z + 2; zi++) { + for(int xi = x - pow; xi <= x + pow; xi++) { + for(int zi = z - pow; zi <= z + pow; zi++) { if(!comp.equals(getStoredGen(xi, zi))) return true; } } diff --git a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java index fe1bb641a..7365a5571 100644 --- a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java @@ -88,7 +88,7 @@ public class MasterChunkGenerator implements TerraChunkGenerator { try(ProfileFuture ignore = tw.getProfiler().measure("TotalChunkGenTime")) { ChunkInterpolator3 interp; try(ProfileFuture ignored = tw.getProfiler().measure("ChunkBaseGenTime")) { - interp = new ChunkInterpolator3(world, chunkX, chunkZ, tw.getGrid()); + interp = new ChunkInterpolator3(world, chunkX, chunkZ, tw.getGrid(), 16); if(!tw.isSafe()) return chunk; int xOrig = (chunkX << 4); @@ -96,7 +96,7 @@ public class MasterChunkGenerator implements TerraChunkGenerator { ElevationInterpolator elevationInterpolator; try(ProfileFuture ignored1 = tw.getProfiler().measure("ElevationTime")) { - elevationInterpolator = new ElevationInterpolator(chunkX, chunkZ, tw.getGrid(), 8); + elevationInterpolator = new ElevationInterpolator(chunkX, chunkZ, tw.getGrid(), 4); } Sampler sampler = new Sampler(interp, elevationInterpolator); diff --git a/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java index 5c99c61d0..05f5f331a 100644 --- a/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java @@ -22,7 +22,6 @@ public class WorldGenerator implements Generator { @SuppressWarnings({"unchecked", "rawtypes", "RedundantSuppression"}) private final PaletteHolder slantPalettes; - private final boolean preventSmooth; private final Expression noiseExp; private final Expression elevationExp; private final Variable xVar; @@ -32,7 +31,7 @@ public class WorldGenerator implements Generator { private final Variable elevationZVar; private final boolean elevationInterpolation; - public WorldGenerator(long seed, String equation, String elevateEquation, Scope vScope, Map noiseBuilders, PaletteHolder palettes, PaletteHolder slantPalettes, boolean preventSmooth, boolean elevationInterpolation) { + public WorldGenerator(long seed, String equation, String elevateEquation, Scope vScope, Map noiseBuilders, PaletteHolder palettes, PaletteHolder slantPalettes, boolean elevationInterpolation) { Parser p = new Parser(); p.registerFunction("rand", new RandomFunction()); Parser ep = new Parser(); @@ -44,8 +43,6 @@ public class WorldGenerator implements Generator { zVar = s.create("z"); s.create("seed").setValue(seed); - this.preventSmooth = preventSmooth; - this.palettes = palettes; this.slantPalettes = slantPalettes; @@ -110,11 +107,6 @@ public class WorldGenerator implements Generator { } - @Override - public boolean useMinimalInterpolation() { - return preventSmooth; - } - public boolean interpolateElevation() { return elevationInterpolation; } From d16c28aebdedde5700fa27a775604b7eb6cee95e Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 30 Dec 2020 02:41:57 -0700 Subject: [PATCH 136/210] cleanup generation code --- .../terra/api/structures/world/AirCheck.java | 4 ++-- .../terra/api/structures/world/LandCheck.java | 4 ++-- .../api/structures/world/OceanCheck.java | 4 ++-- .../dfsek/terra/api/world/biome/Biome.java | 11 +--------- .../terra/api/world/biome/Generator.java | 3 +-- .../dfsek/terra/biome/UserDefinedBiome.java | 10 ---------- .../biome/grid/master/TerraBiomeGrid.java | 2 ++ .../grid/master/TerraRadialBiomeGrid.java | 8 ++++++-- .../grid/master/TerraStandardBiomeGrid.java | 9 +++++++-- .../generation/MasterChunkGenerator.java | 12 ++--------- .../com/dfsek/terra/generation/Sampler.java | 18 ----------------- .../generation/config/WorldGenerator.java | 3 +-- .../{ => math}/ElevationInterpolator.java | 17 +++++++++------- .../dfsek/terra/generation/math/Sampler.java | 20 +++++++++++++++++++ .../interpolation/ChunkInterpolator3.java | 14 ++++++------- .../math/interpolation/Interpolator.java | 2 +- .../math/interpolation/Interpolator3.java | 2 +- .../java/com/dfsek/terra/math/MathUtil.java | 2 +- .../com/dfsek/terra/util/PaletteUtil.java | 2 +- 19 files changed, 67 insertions(+), 80 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/generation/Sampler.java rename common/src/main/java/com/dfsek/terra/generation/{ => math}/ElevationInterpolator.java (87%) create mode 100644 common/src/main/java/com/dfsek/terra/generation/math/Sampler.java rename common/src/main/java/com/dfsek/terra/{api => generation}/math/interpolation/ChunkInterpolator3.java (92%) rename common/src/main/java/com/dfsek/terra/{api => generation}/math/interpolation/Interpolator.java (95%) rename common/src/main/java/com/dfsek/terra/{api => generation}/math/interpolation/Interpolator3.java (96%) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java index 9e7ff9f04..57b0e6cee 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java @@ -19,7 +19,7 @@ public class AirCheck extends SpawnCheck { UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); BiomeTemplate c = b.getConfig(); if(y <= c.getSeaLevel()) return false; - double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); - return b.getGenerator().getNoise(world, x, y, z) + elevation <= 0; + double elevation = ((WorldGenerator) b.getGenerator(world)).getElevation(x, z); + return b.getGenerator(world).getNoise(x, y, z) + elevation <= 0; } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java index 964dcd416..d76c0578f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java @@ -16,7 +16,7 @@ public class LandCheck extends SpawnCheck { public boolean check(int x, int y, int z) { TerraWorld tw = main.getWorld(world); UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); - double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); - return b.getGenerator().getNoise(world, x, y, z) + elevation > 0; + double elevation = ((WorldGenerator) b.getGenerator(world)).getElevation(x, z); + return b.getGenerator(world).getNoise(x, y, z) + elevation > 0; } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java index ef70cd0e2..a8262f1fd 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java @@ -19,7 +19,7 @@ public class OceanCheck extends SpawnCheck { UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); BiomeTemplate c = b.getConfig(); if(y > c.getSeaLevel()) return false; - double elevation = ((WorldGenerator) b.getGenerator()).getElevation(x, z); - return b.getGenerator().getNoise(world, x, y, z) + elevation <= 0; + double elevation = ((WorldGenerator) b.getGenerator(world)).getElevation(x, z); + return b.getGenerator(world).getNoise(x, y, z) + elevation <= 0; } } diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/Biome.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Biome.java index 25ad009dc..36a8caa4e 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/Biome.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/Biome.java @@ -21,14 +21,5 @@ public interface Biome { * * @return BiomeTerrain - The terrain generation instance. */ - Generator getGenerator(); - - /** - * Gets the BiomeTerrain instance used to generate the biome in this world. - * - * @return BiomeTerrain - The terrain generation instance. - */ - default Generator getGenerator(World w) { - return getGenerator(); - } + Generator getGenerator(World w); } diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java index 6c844d7a0..4478b9667 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java @@ -1,7 +1,6 @@ package com.dfsek.terra.api.world.biome; import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.palette.Palette; public interface Generator { @@ -13,7 +12,7 @@ public interface Generator { * @param z - The z coordinate. * @return double - Noise value at the specified coordinates. */ - double getNoise(World w, int x, int y, int z); + double getNoise(int x, int y, int z); /** * Gets the BlocPalette to generate the biome with. diff --git a/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java b/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java index 2be4e0ff8..8e6baac81 100644 --- a/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java +++ b/common/src/main/java/com/dfsek/terra/biome/UserDefinedBiome.java @@ -37,16 +37,6 @@ public class UserDefinedBiome implements Biome { return vanilla; } - /** - * Gets the Generator instance used to generate the biome. - * - * @return Generator - The terrain generation instance. - */ - @Override - public Generator getGenerator() { - return gen.build(0); - } - public String getID() { return id; diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java index 0a4713b2f..322cf6e17 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java @@ -27,6 +27,8 @@ public abstract class TerraBiomeGrid extends BiomeGrid { RADIAL, STANDARD } + public abstract boolean isEroded(int x, int z); + public static final class TerraBiomeGridBuilder { private final long seed; private final ConfigPack config; diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java index 08fb334eb..753d8b8b5 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java @@ -15,7 +15,6 @@ import com.dfsek.terra.config.base.ConfigPackTemplate; import net.jafama.FastMath; public class TerraRadialBiomeGrid extends TerraBiomeGrid { - private static final int failNum = 0; private final double radiusSq; private final BiomeGrid internal; private CoordinatePerturb perturb; @@ -39,6 +38,11 @@ public class TerraRadialBiomeGrid extends TerraBiomeGrid { return (UserDefinedGrid) zone.getGrid(x, z); } + @Override + public boolean isEroded(int x, int z) { + return erode != null && erode.isEroded(x, z); + } + @Override public Biome getBiome(int x, int z, GenerationPhase phase) { int xp = x, zp = z; @@ -54,7 +58,7 @@ public class TerraRadialBiomeGrid extends TerraBiomeGrid { } else { b = (UserDefinedBiome) internal.getBiome(xp, zp, phase); } - if(erode != null && erode.isEroded(xp, zp)) return b.getErode(); + if(isEroded(xp, zp)) return b.getErode(); return b; } diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java index 06dd5f865..8e5548f88 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java @@ -13,7 +13,6 @@ import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; public class TerraStandardBiomeGrid extends TerraBiomeGrid { - private static final int failNum = 0; private CoordinatePerturb perturb; private ErosionNoise erode; @@ -33,6 +32,11 @@ public class TerraStandardBiomeGrid extends TerraBiomeGrid { return (UserDefinedGrid) zone.getGrid(x, z); } + @Override + public boolean isEroded(int x, int z) { + return erode != null && erode.isEroded(x, z); + } + @Override public Biome getBiome(int x, int z, GenerationPhase phase) { int xp = x, zp = z; @@ -43,10 +47,11 @@ public class TerraStandardBiomeGrid extends TerraBiomeGrid { } UserDefinedBiome b = (UserDefinedBiome) zone.getGrid(xp, zp).getBiome(xp, zp, phase); - if(erode != null && erode.isEroded(xp, zp)) return b.getErode(); + if(isEroded(xp, zp)) return b.getErode(); return b; } + @Override public Biome getBiome(Location l, GenerationPhase phase) { return getBiome(l.getBlockX(), l.getBlockZ(), phase); diff --git a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java index 7365a5571..9bed8df74 100644 --- a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java @@ -1,7 +1,6 @@ package com.dfsek.terra.generation; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.math.interpolation.ChunkInterpolator3; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; @@ -23,6 +22,7 @@ import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.palette.SinglePalette; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; +import com.dfsek.terra.generation.math.Sampler; import com.dfsek.terra.util.PaletteUtil; import org.jetbrains.annotations.NotNull; @@ -86,20 +86,12 @@ public class MasterChunkGenerator implements TerraChunkGenerator { TerraWorld tw = main.getWorld(world); com.dfsek.terra.api.world.biome.BiomeGrid grid = tw.getGrid(); try(ProfileFuture ignore = tw.getProfiler().measure("TotalChunkGenTime")) { - ChunkInterpolator3 interp; try(ProfileFuture ignored = tw.getProfiler().measure("ChunkBaseGenTime")) { - interp = new ChunkInterpolator3(world, chunkX, chunkZ, tw.getGrid(), 16); - if(!tw.isSafe()) return chunk; int xOrig = (chunkX << 4); int zOrig = (chunkZ << 4); - ElevationInterpolator elevationInterpolator; - try(ProfileFuture ignored1 = tw.getProfiler().measure("ElevationTime")) { - elevationInterpolator = new ElevationInterpolator(chunkX, chunkZ, tw.getGrid(), 4); - } - - Sampler sampler = new Sampler(interp, elevationInterpolator); + Sampler sampler = new Sampler(chunkX, chunkZ, tw.getGrid(), world, 4, 8); for(byte x = 0; x < 16; x++) { for(byte z = 0; z < 16; z++) { diff --git a/common/src/main/java/com/dfsek/terra/generation/Sampler.java b/common/src/main/java/com/dfsek/terra/generation/Sampler.java deleted file mode 100644 index 8fbc1f00d..000000000 --- a/common/src/main/java/com/dfsek/terra/generation/Sampler.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dfsek.terra.generation; - -import com.dfsek.terra.api.math.interpolation.ChunkInterpolator3; -import net.jafama.FastMath; - -public class Sampler { - private final ChunkInterpolator3 interpolator; - private final ElevationInterpolator elevationInterpolator; - - public Sampler(ChunkInterpolator3 interpolator, ElevationInterpolator elevationInterpolator) { - this.interpolator = interpolator; - this.elevationInterpolator = elevationInterpolator; - } - - public double sample(double x, double y, double z) { - return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation(FastMath.roundToInt(x), FastMath.roundToInt(z)); - } -} diff --git a/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java index 05f5f331a..e09707a37 100644 --- a/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java @@ -1,7 +1,6 @@ package com.dfsek.terra.generation.config; import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; @@ -85,7 +84,7 @@ public class WorldGenerator implements Generator { } @Override - public synchronized double getNoise(World world, int x, int y, int z) { + public synchronized double getNoise(int x, int y, int z) { xVar.setValue(x); yVar.setValue(y); zVar.setValue(z); diff --git a/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java b/common/src/main/java/com/dfsek/terra/generation/math/ElevationInterpolator.java similarity index 87% rename from common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java rename to common/src/main/java/com/dfsek/terra/generation/math/ElevationInterpolator.java index 2de0df41a..fe4a02720 100644 --- a/common/src/main/java/com/dfsek/terra/generation/ElevationInterpolator.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/ElevationInterpolator.java @@ -1,9 +1,10 @@ -package com.dfsek.terra.generation; +package com.dfsek.terra.generation.math; -import com.dfsek.terra.api.math.interpolation.Interpolator; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.world.biome.BiomeGrid; import com.dfsek.terra.api.world.generation.GenerationPhase; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.config.WorldGenerator; +import com.dfsek.terra.generation.math.interpolation.Interpolator; import net.jafama.FastMath; public class ElevationInterpolator { @@ -11,22 +12,24 @@ public class ElevationInterpolator { private final double[][] values = new double[18][18]; private final int xOrigin; private final int zOrigin; - private final TerraBiomeGrid grid; + private final BiomeGrid grid; private final int smooth; private final int pow; + private final World world; - public ElevationInterpolator(int chunkX, int chunkZ, TerraBiomeGrid grid, int smooth) { + public ElevationInterpolator(World world, int chunkX, int chunkZ, BiomeGrid grid, int smooth) { this.xOrigin = chunkX << 4; this.zOrigin = chunkZ << 4; this.grid = grid; this.smooth = smooth; this.pow = FastMath.log2(smooth); this.gens = new WorldGenerator[6 + 2 * pow][6 + 2 * pow]; + this.world = world; for(int x = -pow; x < 6 + pow; x++) { for(int z = -pow; z < 6 + pow; z++) { - gens[x + pow][z + pow] = (WorldGenerator) grid.getBiome(xOrigin + (x * smooth), zOrigin + (z * smooth), GenerationPhase.BASE).getGenerator(); + gens[x + pow][z + pow] = (WorldGenerator) grid.getBiome(xOrigin + (x * smooth), zOrigin + (z * smooth), GenerationPhase.BASE).getGenerator(world); } } @@ -45,7 +48,7 @@ public class ElevationInterpolator { } private WorldGenerator getGenerator(int x, int z) { - return (WorldGenerator) grid.getBiome(xOrigin + x, zOrigin + z, GenerationPhase.BASE).getGenerator(); + return (WorldGenerator) grid.getBiome(xOrigin + x, zOrigin + z, GenerationPhase.BASE).getGenerator(world); } private WorldGenerator getStoredGen(int x, int z) { diff --git a/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java b/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java new file mode 100644 index 000000000..63f517bd2 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.generation.math; + +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import com.dfsek.terra.generation.math.interpolation.ChunkInterpolator3; +import net.jafama.FastMath; + +public class Sampler { + private final ChunkInterpolator3 interpolator; + private final ElevationInterpolator elevationInterpolator; + + public Sampler(int x, int z, TerraBiomeGrid grid, World world, int elevationSmooth, int generationSmooth) { + this.interpolator = new ChunkInterpolator3(world, x, z, grid, generationSmooth); + this.elevationInterpolator = new ElevationInterpolator(world, x, z, grid, elevationSmooth); + } + + public double sample(double x, double y, double z) { + return interpolator.getNoise(x, y, z) + elevationInterpolator.getElevation(FastMath.roundToInt(x), FastMath.roundToInt(z)); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/math/interpolation/ChunkInterpolator3.java b/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ChunkInterpolator3.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/api/math/interpolation/ChunkInterpolator3.java rename to common/src/main/java/com/dfsek/terra/generation/math/interpolation/ChunkInterpolator3.java index 171c54fa9..5e8a64273 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/interpolation/ChunkInterpolator3.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ChunkInterpolator3.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.api.math.interpolation; +package com.dfsek.terra.generation.math.interpolation; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.world.biome.BiomeGrid; import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import net.jafama.FastMath; /** @@ -18,23 +18,23 @@ public class ChunkInterpolator3 { private final int smooth; /** - * Instantiates a 3D ChunkInterpolator at a pair of chunk coordinates, with a BiomeGrid and FastNoiseLite instance. + * Instantiates a 3D ChunkInterpolator at a pair of chunk coordinates. * * @param chunkX X coordinate of the chunk. * @param chunkZ Z coordinate of the chunk. * @param grid BiomeGrid to use for noise fetching. */ - public ChunkInterpolator3(World w, int chunkX, int chunkZ, BiomeGrid grid, int smooth) { + public ChunkInterpolator3(World w, int chunkX, int chunkZ, TerraBiomeGrid grid, int smooth) { int xOrigin = chunkX << 4; int zOrigin = chunkZ << 4; this.smooth = smooth; - for(int x = -1; x < 6; x++) { for(int z = -1; z < 6; z++) { - gens[x + 1][z + 1] = grid.getBiome(xOrigin + (x * smooth), zOrigin + (z * smooth), GenerationPhase.BASE).getGenerator(); + gens[x + 1][z + 1] = grid.getBiome(xOrigin + (x * smooth), zOrigin + (z * smooth), GenerationPhase.BASE).getGenerator(w); } } + for(int x = 0; x < 5; x++) { for(int z = 0; z < 5; z++) { needsBiomeInterp[x][z] = compareGens(x + 1, z + 1); @@ -44,7 +44,7 @@ public class ChunkInterpolator3 { for(byte x = -1; x < 6; x++) { for(byte z = -1; z < 6; z++) { for(int y = 0; y < 65; y++) { - noiseStorage[x + 1][z + 1][y] = gens[x + 1][z + 1].getNoise(w, (x * smooth) + xOrigin, y << 2, (z * smooth) + zOrigin); + noiseStorage[x + 1][z + 1][y] = gens[x + 1][z + 1].getNoise((x * smooth) + xOrigin, y << 2, (z * smooth) + zOrigin); } } } diff --git a/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator.java b/common/src/main/java/com/dfsek/terra/generation/math/interpolation/Interpolator.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator.java rename to common/src/main/java/com/dfsek/terra/generation/math/interpolation/Interpolator.java index 493168981..7d6c403bd 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/interpolation/Interpolator.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.math.interpolation; +package com.dfsek.terra.generation.math.interpolation; /** * Class for bilinear interpolation of values arranged on a unit square. diff --git a/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator3.java b/common/src/main/java/com/dfsek/terra/generation/math/interpolation/Interpolator3.java similarity index 96% rename from common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator3.java rename to common/src/main/java/com/dfsek/terra/generation/math/interpolation/Interpolator3.java index 5b54c0f9a..e464ae8ba 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/interpolation/Interpolator3.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/interpolation/Interpolator3.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.math.interpolation; +package com.dfsek.terra.generation.math.interpolation; /** * Class for bilinear interpolation of values arranged on a unit square. diff --git a/common/src/main/java/com/dfsek/terra/math/MathUtil.java b/common/src/main/java/com/dfsek/terra/math/MathUtil.java index bf084ceb3..646996494 100644 --- a/common/src/main/java/com/dfsek/terra/math/MathUtil.java +++ b/common/src/main/java/com/dfsek/terra/math/MathUtil.java @@ -1,6 +1,6 @@ package com.dfsek.terra.math; -import com.dfsek.terra.generation.Sampler; +import com.dfsek.terra.generation.math.Sampler; public final class MathUtil { private static final double CONST = 0.55; diff --git a/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java b/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java index 0ea5a706d..bb2979f11 100644 --- a/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java +++ b/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java @@ -4,7 +4,7 @@ import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.generation.Sampler; +import com.dfsek.terra.generation.math.Sampler; import com.dfsek.terra.math.MathUtil; public final class PaletteUtil { From c283f37390df058b0188bf464bdaf300f7f3b289 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 30 Dec 2020 13:55:15 -0700 Subject: [PATCH 137/210] fix spawn checks at biome edge --- .../terra/api/structures/world/AirCheck.java | 8 ++++---- .../terra/api/structures/world/LandCheck.java | 7 +------ .../api/structures/world/OceanCheck.java | 8 ++++---- .../api/structures/world/SpawnCheck.java | 19 +++++++++++++++++++ .../dfsek/terra/config/base/PluginConfig.java | 8 ++++++++ 5 files changed, 36 insertions(+), 14 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java index 57b0e6cee..27440a22a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java @@ -5,8 +5,8 @@ import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.generation.config.WorldGenerator; public class AirCheck extends SpawnCheck { public AirCheck(World world, TerraPlugin main) { @@ -16,10 +16,10 @@ public class AirCheck extends SpawnCheck { @Override public boolean check(int x, int y, int z) { TerraWorld tw = main.getWorld(world); - UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); + TerraBiomeGrid g = tw.getGrid(); + UserDefinedBiome b = (UserDefinedBiome) g.getBiome(x, z, GenerationPhase.POPULATE); BiomeTemplate c = b.getConfig(); if(y <= c.getSeaLevel()) return false; - double elevation = ((WorldGenerator) b.getGenerator(world)).getElevation(x, z); - return b.getGenerator(world).getNoise(x, y, z) + elevation <= 0; + return sample(x, y, z, g) <= 0; } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java index d76c0578f..fbf566903 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java @@ -3,9 +3,6 @@ package com.dfsek.terra.api.structures.world; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.world.generation.GenerationPhase; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.generation.config.WorldGenerator; public class LandCheck extends SpawnCheck { public LandCheck(World world, TerraPlugin main) { @@ -15,8 +12,6 @@ public class LandCheck extends SpawnCheck { @Override public boolean check(int x, int y, int z) { TerraWorld tw = main.getWorld(world); - UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); - double elevation = ((WorldGenerator) b.getGenerator(world)).getElevation(x, z); - return b.getGenerator(world).getNoise(x, y, z) + elevation > 0; + return sample(x, y, z, tw.getGrid()) > 0; } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java index a8262f1fd..248dfdb8a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java @@ -5,8 +5,8 @@ import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.generation.config.WorldGenerator; public class OceanCheck extends SpawnCheck { public OceanCheck(World world, TerraPlugin main) { @@ -16,10 +16,10 @@ public class OceanCheck extends SpawnCheck { @Override public boolean check(int x, int y, int z) { TerraWorld tw = main.getWorld(world); - UserDefinedBiome b = (UserDefinedBiome) tw.getGrid().getBiome(x, z, GenerationPhase.POPULATE); + TerraBiomeGrid grid = tw.getGrid(); + UserDefinedBiome b = (UserDefinedBiome) grid.getBiome(x, z, GenerationPhase.POPULATE); BiomeTemplate c = b.getConfig(); if(y > c.getSeaLevel()) return false; - double elevation = ((WorldGenerator) b.getGenerator(world)).getElevation(x, z); - return b.getGenerator(world).getNoise(x, y, z) + elevation <= 0; + return sample(x, y, z, grid) <= 0; } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/SpawnCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/SpawnCheck.java index 25bf32683..fe6e23947 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/world/SpawnCheck.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/world/SpawnCheck.java @@ -2,16 +2,35 @@ package com.dfsek.terra.api.structures.world; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import com.dfsek.terra.generation.math.Sampler; +import net.jafama.FastMath; + +import java.util.LinkedHashMap; +import java.util.Map; public abstract class SpawnCheck { protected final World world; protected final TerraPlugin main; + private final Map cache; protected SpawnCheck(World world, TerraPlugin main) { this.world = world; this.main = main; + cache = new LinkedHashMap() { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > main.getTerraConfig().getCheckCache(); + } + }; } public abstract boolean check(int x, int y, int z); + protected double sample(int x, int y, int z, TerraBiomeGrid grid) { + int cx = FastMath.floorDiv(x, 16); + int cz = FastMath.floorDiv(z, 16); + long key = (((long) cx) << 32) | (cz & 0xffffffffL); + return cache.computeIfAbsent(key, k -> new Sampler(cx, cz, grid, world, 4, 8)).sample(x - (cx << 4), y, z - (cz << 4)); + } } diff --git a/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java b/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java index 93596768a..3608049aa 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java @@ -42,6 +42,10 @@ public class PluginConfig implements ConfigTemplate { @Default private int structureCache = 128; + @Value("cache.checks") + @Default + private int checkCache = 128; + @Value("dump-default") @Default private boolean dumpDefaultConfig = true; @@ -90,4 +94,8 @@ public class PluginConfig implements ConfigTemplate { public int getStructureCache() { return structureCache; } + + public int getCheckCache() { + return checkCache; + } } From 2be4b36d1a873c94a4b1c7666c8f78058e2020a9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 30 Dec 2020 17:57:16 -0700 Subject: [PATCH 138/210] configurable blending distance --- .../com/dfsek/terra/api/math/MathUtil.java | 32 ++++++------------- .../terra/config/base/ConfigPackTemplate.java | 27 ++++++++++++++++ .../generation/MasterChunkGenerator.java | 2 +- 3 files changed, 37 insertions(+), 24 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java b/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java index b1a5aa687..ba762f18b 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java @@ -8,7 +8,9 @@ import java.util.Random; /** * Utility class for mathematical functions. */ -public class MathUtil { +public final class MathUtil { + private static final double EPSILON = 0.1E-5; + /** * Gets the standard deviation of an array of doubles. * @@ -57,29 +59,13 @@ public class MathUtil { } /** - * Compute binary logarithm + * Compare 2 floating-point values with epsilon to account for rounding errors * - * @param bits Input - * @return Binary logarithm + * @param a Value 1 + * @param b Value 2 + * @return Whether these values are equal */ - public static int binlog(int bits) { - int log = 0; - if((bits & 0xffff0000) != 0) { - bits >>>= 16; - log = 16; - } - if(bits >= 256) { - bits >>>= 8; - log += 8; - } - if(bits >= 16) { - bits >>>= 4; - log += 4; - } - if(bits >= 4) { - bits >>>= 2; - log += 2; - } - return log + (bits >>> 1); + public static boolean equals(double a, double b) { + return a == b || FastMath.abs(a - b) < EPSILON; } } diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java index 3ab396c95..23aecf693 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java @@ -4,9 +4,11 @@ import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; +import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.config.NoiseBuilder; import com.dfsek.terra.image.ImageLoader; +import net.jafama.FastMath; import java.util.HashMap; import java.util.List; @@ -51,6 +53,16 @@ public class ConfigPackTemplate implements ValidatedConfigTemplate { @Default private double blendAmp = 4.0D; + @Value("blend.terrain.base") + @Default + private int baseBlend = 4; + + + @Value("blend.terrain.elevation") + @Default + private int elevationBlend = 4; + + @Value("erode.enable") @Default private boolean erode = false; @@ -243,12 +255,27 @@ public class ConfigPackTemplate implements ValidatedConfigTemplate { return imageLoader; } + public int getBaseBlend() { + return baseBlend; + } + + public int getElevationBlend() { + return elevationBlend; + } + @Override public boolean validate() throws ValidationException { if(gridType.equals(TerraBiomeGrid.Type.RADIAL) && internalGrid == null) throw new ValidationException("No internal BiomeGrid specified"); if(biomeZChannel.equals(biomeXChannel) || zoneChannel.equals(biomeXChannel) || zoneChannel.equals(biomeZChannel)) throw new ValidationException("2 objects share the same image channels: biome-x and biome-z"); + + if(!MathUtil.equals(FastMath.log(baseBlend) / FastMath.log(2d), FastMath.round(FastMath.log(baseBlend) / FastMath.log(2d)))) { + throw new ValidationException("Biome base blend value \"" + baseBlend + "\" is not a power of 2."); + } + if(!MathUtil.equals(FastMath.log(elevationBlend) / FastMath.log(2d), FastMath.round(FastMath.log(elevationBlend) / FastMath.log(2d)))) { + throw new ValidationException("Biome elevation blend value \"" + baseBlend + "\" is not a power of 2."); + } return true; } } diff --git a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java index 9bed8df74..3f5224bd5 100644 --- a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java @@ -91,7 +91,7 @@ public class MasterChunkGenerator implements TerraChunkGenerator { int xOrig = (chunkX << 4); int zOrig = (chunkZ << 4); - Sampler sampler = new Sampler(chunkX, chunkZ, tw.getGrid(), world, 4, 8); + Sampler sampler = new Sampler(chunkX, chunkZ, tw.getGrid(), world, configPack.getTemplate().getElevationBlend(), configPack.getTemplate().getBaseBlend()); for(byte x = 0; x < 16; x++) { for(byte z = 0; z < 16; z++) { From 99acadaf59b07a19a08d316e773a4ac7e195008c Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 30 Dec 2020 18:05:32 -0700 Subject: [PATCH 139/210] fix tscript comment issues --- .../dfsek/terra/api/structures/parser/Parser.java | 6 +++++- .../terra/api/structures/tokenizer/Tokenizer.java | 13 ++----------- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 84de91448..a0c5cf800 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -87,7 +87,11 @@ public class Parser { TokenHolder tokens = new TokenHolder(); try { - while(tokenizer.hasNext()) tokens.add(tokenizer.fetch()); + Token t = tokenizer.fetch(); + while(t != null) { + tokens.add(t); + t = tokenizer.fetch(); + } } catch(TokenizerException e) { throw new ParseException("Failed to tokenize input", new Position(0, 0), e); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index b5335f1c9..cd25b52f4 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -18,23 +18,14 @@ public class Tokenizer { reader = new Lookahead(new StringReader(data + '\0')); } - public boolean hasNext() { - - int whiteEnd = 0; - - while(!reader.next(whiteEnd).isEOF() && reader.next(whiteEnd).isWhitespace()) whiteEnd++; // Consume whitespace. - - return !reader.next(whiteEnd).isEOF(); - } - public Token fetch() throws TokenizerException { while(!reader.current().isEOF() && reader.current().isWhitespace()) reader.consume(); - if(reader.current().isEOF()) return null; // EOF - if(reader.matches("//", true)) skipLine(); // Skip line if comment + while(reader.matches("//", true)) skipLine(); // Skip line if comment if(reader.matches("/*", true)) skipTo("*/"); // Skip multi line comment + if(reader.current().isEOF()) return null; // EOF if(reader.matches("==", true)) return new Token("==", Token.Type.EQUALS_OPERATOR, new Position(reader.getLine(), reader.getIndex())); From 80498241707ce0a2ce7952001aa22c69ce64e992 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 30 Dec 2020 20:32:55 -0700 Subject: [PATCH 140/210] improve Transformer st handling --- .../java/com/dfsek/terra/api/transform/Transformer.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/transform/Transformer.java b/common/src/main/java/com/dfsek/terra/api/transform/Transformer.java index ed66fda10..aabdf331c 100644 --- a/common/src/main/java/com/dfsek/terra/api/transform/Transformer.java +++ b/common/src/main/java/com/dfsek/terra/api/transform/Transformer.java @@ -1,5 +1,7 @@ package com.dfsek.terra.api.transform; +import java.io.PrintWriter; +import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedHashMap; @@ -42,8 +44,9 @@ public class Transformer { } StringBuilder exBuilder = new StringBuilder("Could not transform input; all attempts failed: ").append(from.toString()).append("\n"); for(Exception exception : exceptions) { - exBuilder.append(exception.getMessage()).append("\n"); - exception.printStackTrace(); + StringWriter writer = new StringWriter(); + exception.printStackTrace(new PrintWriter(writer)); + exBuilder.append("\n").append(writer.toString()); } throw new AttemptsFailedException(exBuilder.toString()); } From bccfcdf9a13743026157da47871d87162ebe6f0f Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 30 Dec 2020 21:03:28 -0700 Subject: [PATCH 141/210] implement check cache --- .../main/java/com/dfsek/terra/TerraWorld.java | 6 +++ .../structures/script/StructureScript.java | 5 +- .../script/builders/CheckFunctionBuilder.java | 7 ++- .../script/functions/CheckFunction.java | 34 ++++++++++--- .../terra/api/structures/world/AirCheck.java | 25 ---------- .../api/structures/world/CheckCache.java | 49 +++++++++++++++++++ .../terra/api/structures/world/LandCheck.java | 17 ------- .../api/structures/world/OceanCheck.java | 25 ---------- .../api/structures/world/SpawnCheck.java | 36 -------------- .../dfsek/terra/config/base/ConfigPack.java | 4 +- 10 files changed, 92 insertions(+), 116 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/world/CheckCache.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/world/SpawnCheck.java diff --git a/common/src/main/java/com/dfsek/terra/TerraWorld.java b/common/src/main/java/com/dfsek/terra/TerraWorld.java index 6fddf3da5..350b6b67f 100644 --- a/common/src/main/java/com/dfsek/terra/TerraWorld.java +++ b/common/src/main/java/com/dfsek/terra/TerraWorld.java @@ -13,6 +13,7 @@ public class TerraWorld { private final ConfigPack config; private final boolean safe; private final TerraProfiler profiler; + private final World world; public TerraWorld(World w, ConfigPack c, TerraPlugin main) { @@ -20,9 +21,14 @@ public class TerraWorld { profiler = new TerraProfiler(w); this.grid = new TerraBiomeGrid.TerraBiomeGridBuilder(w.getSeed(), c, main).build(); this.zone = grid.getZone(); + this.world = w; safe = true; } + public World getWorld() { + return world; + } + public static boolean isTerraWorld(World w) { return w.getGenerator().getHandle() instanceof GeneratorWrapper; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 1b02c9df9..2187eb2cb 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -17,6 +17,7 @@ import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer; +import com.dfsek.terra.api.structures.world.CheckCache; import com.dfsek.terra.registry.ScriptRegistry; import org.apache.commons.io.IOUtils; @@ -31,7 +32,7 @@ public class StructureScript { private final String id; private final LinkedHashMap cache; - public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry) { + public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, CheckCache cache) { Parser parser; try { parser = new Parser(IOUtils.toString(inputStream)); @@ -39,7 +40,7 @@ public class StructureScript { throw new RuntimeException(e); } parser.addFunction("block", new BlockFunctionBuilder(main)) - .addFunction("check", new CheckFunctionBuilder(main)) + .addFunction("check", new CheckFunctionBuilder(main, cache)) .addFunction("structure", new StructureFunctionBuilder(registry, main)) .addFunction("randomInt", new RandomFunctionBuilder()) .addFunction("recursions", new RecursionsFunctionBuilder()) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckFunctionBuilder.java index d5e1ce757..bac7b422f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckFunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckFunctionBuilder.java @@ -6,20 +6,23 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.script.functions.CheckFunction; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.api.structures.world.CheckCache; import java.util.List; public class CheckFunctionBuilder implements FunctionBuilder { private final TerraPlugin main; + private final CheckCache cache; - public CheckFunctionBuilder(TerraPlugin main) { + public CheckFunctionBuilder(TerraPlugin main, CheckCache cache) { this.main = main; + this.cache = cache; } @SuppressWarnings("unchecked") @Override public CheckFunction build(List> argumentList, Position position) throws ParseException { - return new CheckFunction(main, (Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), position); + return new CheckFunction(main, (Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), cache, position); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index 69a3cc73f..bef383108 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.structures.script.functions; +import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; @@ -11,8 +12,11 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.api.structures.world.LandCheck; -import com.dfsek.terra.api.structures.world.OceanCheck; +import com.dfsek.terra.api.structures.world.CheckCache; +import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import com.dfsek.terra.config.templates.BiomeTemplate; import net.jafama.FastMath; import java.util.Random; @@ -21,13 +25,15 @@ public class CheckFunction implements Function { private final TerraPlugin main; private final Returnable x, y, z; private final Position position; + private final CheckCache cache; - public CheckFunction(TerraPlugin main, Returnable x, Returnable y, Returnable z, Position position) { + public CheckFunction(TerraPlugin main, Returnable x, Returnable y, Returnable z, CheckCache cache, Position position) { this.main = main; this.x = x; this.y = y; this.z = z; this.position = position; + this.cache = cache; } @Override @@ -49,11 +55,23 @@ public class CheckFunction implements Function { } private String apply(Location vector, World world) { - if(new LandCheck(world, main).check(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ())) - return "LAND"; - if(new OceanCheck(world, main).check(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ())) - return "OCEAN"; - return "AIR"; + TerraWorld tw = main.getWorld(world); + double comp = sample(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ(), world); + + if(comp > 0) return "LAND"; // If noise val is greater than zero, location will always be land. + + TerraBiomeGrid grid = tw.getGrid(); + UserDefinedBiome b = (UserDefinedBiome) grid.getBiome(vector.getBlockX(), vector.getBlockZ(), GenerationPhase.POPULATE); + BiomeTemplate c = b.getConfig(); + + if(vector.getY() > c.getSeaLevel()) return "AIR"; // Above sea level + return "OCEAN"; // Below sea level + } + + private double sample(int x, int y, int z, World w) { + int cx = FastMath.floorDiv(x, 16); + int cz = FastMath.floorDiv(z, 16); + return cache.get(w, x, z).sample(x - (cx << 4), y, z - (cz << 4)); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java deleted file mode 100644 index 27440a22a..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/world/AirCheck.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dfsek.terra.api.structures.world; - -import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.world.generation.GenerationPhase; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import com.dfsek.terra.config.templates.BiomeTemplate; - -public class AirCheck extends SpawnCheck { - public AirCheck(World world, TerraPlugin main) { - super(world, main); - } - - @Override - public boolean check(int x, int y, int z) { - TerraWorld tw = main.getWorld(world); - TerraBiomeGrid g = tw.getGrid(); - UserDefinedBiome b = (UserDefinedBiome) g.getBiome(x, z, GenerationPhase.POPULATE); - BiomeTemplate c = b.getConfig(); - if(y <= c.getSeaLevel()) return false; - return sample(x, y, z, g) <= 0; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/CheckCache.java b/common/src/main/java/com/dfsek/terra/api/structures/world/CheckCache.java new file mode 100644 index 000000000..da51a69c0 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/world/CheckCache.java @@ -0,0 +1,49 @@ +package com.dfsek.terra.api.structures.world; + +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.generation.math.Sampler; +import net.jafama.FastMath; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +public class CheckCache { + private final Map cache; + private final TerraPlugin main; + + public CheckCache(TerraPlugin main) { + cache = new HashMap<>(); + this.main = main; + } + + public Sampler get(World world, int x, int z) { + return cache.computeIfAbsent(world.getSeed(), seed -> new Container(world, new LinkedHashMap() { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > main.getTerraConfig().getCheckCache(); + } + })).get(x, z); + } + + + private class Container { + private final World world; + private final Map cache; + + private Container(World world, Map cache) { + this.world = world; + this.cache = cache; + } + + public Sampler get(int x, int z) { + int cx = FastMath.floorDiv(x, 16); + int cz = FastMath.floorDiv(z, 16); + long key = (((long) cx) << 32) | (cz & 0xffffffffL); + TerraWorld tw = main.getWorld(world); + return cache.computeIfAbsent(key, k -> new Sampler(cx, cz, tw.getGrid(), world, 4, 8)); + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java deleted file mode 100644 index fbf566903..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/world/LandCheck.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dfsek.terra.api.structures.world; - -import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.World; - -public class LandCheck extends SpawnCheck { - public LandCheck(World world, TerraPlugin main) { - super(world, main); - } - - @Override - public boolean check(int x, int y, int z) { - TerraWorld tw = main.getWorld(world); - return sample(x, y, z, tw.getGrid()) > 0; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java deleted file mode 100644 index 248dfdb8a..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/world/OceanCheck.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dfsek.terra.api.structures.world; - -import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.world.generation.GenerationPhase; -import com.dfsek.terra.biome.UserDefinedBiome; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import com.dfsek.terra.config.templates.BiomeTemplate; - -public class OceanCheck extends SpawnCheck { - public OceanCheck(World world, TerraPlugin main) { - super(world, main); - } - - @Override - public boolean check(int x, int y, int z) { - TerraWorld tw = main.getWorld(world); - TerraBiomeGrid grid = tw.getGrid(); - UserDefinedBiome b = (UserDefinedBiome) grid.getBiome(x, z, GenerationPhase.POPULATE); - BiomeTemplate c = b.getConfig(); - if(y > c.getSeaLevel()) return false; - return sample(x, y, z, grid) <= 0; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/SpawnCheck.java b/common/src/main/java/com/dfsek/terra/api/structures/world/SpawnCheck.java deleted file mode 100644 index fe6e23947..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/world/SpawnCheck.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.dfsek.terra.api.structures.world; - -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import com.dfsek.terra.generation.math.Sampler; -import net.jafama.FastMath; - -import java.util.LinkedHashMap; -import java.util.Map; - -public abstract class SpawnCheck { - protected final World world; - protected final TerraPlugin main; - private final Map cache; - - protected SpawnCheck(World world, TerraPlugin main) { - this.world = world; - this.main = main; - cache = new LinkedHashMap() { - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > main.getTerraConfig().getCheckCache(); - } - }; - } - - public abstract boolean check(int x, int y, int z); - - protected double sample(int x, int y, int z, TerraBiomeGrid grid) { - int cx = FastMath.floorDiv(x, 16); - int cz = FastMath.floorDiv(z, 16); - long key = (((long) cx) << 32) | (cz & 0xffffffffL); - return cache.computeIfAbsent(key, k -> new Sampler(cx, cz, grid, world, 4, 8)).sample(x - (cx << 4), y, z - (cz << 4)); - } -} diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index dc48794c7..3fd7e09b1 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.loot.LootTable; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.structures.script.StructureScript; +import com.dfsek.terra.api.structures.world.CheckCache; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.Palette; @@ -148,8 +149,9 @@ public class ConfigPack implements LoaderRegistrar { abstractConfigLoader .registerLoader(LootTable.class, new LootTableLoader(loader, main)); // These loaders need access to the Loader instance to get files. + CheckCache checkCache = new CheckCache(main); loader.open("structures/data", ".tesf").then(streams -> streams.forEach(stream -> { - StructureScript structureScript = new StructureScript(stream, main, scriptRegistry); + StructureScript structureScript = new StructureScript(stream, main, scriptRegistry, checkCache); scriptRegistry.add(structureScript.getId(), structureScript); })).close(); From 97f6cda4ad2a6312c6ce956a2c542f6557001b84 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 30 Dec 2020 21:10:52 -0700 Subject: [PATCH 142/210] remove debug logging --- .../terra/api/structures/script/StructureScript.java | 1 - .../java/com/dfsek/terra/config/files/Loader.java | 5 ----- .../terra/config/templates/StructureTemplate.java | 11 ++--------- .../com/dfsek/terra/registry/StructureRegistry.java | 5 ----- 4 files changed, 2 insertions(+), 20 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 2187eb2cb..4c7c83098 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -78,7 +78,6 @@ public class StructureScript { public boolean execute(Location location, Chunk chunk, Random random, Rotation rotation) { StructureBuffer buffer = cache.computeIfAbsent(location, loc -> { - System.out.println("Recalculating for (" + loc.getBlockX() + ", " + loc.getBlockZ() + "), chunk {" + chunk.getX() + ", " + chunk.getZ() + "}, cache size: " + cache.size()); StructureBuffer buf = new StructureBuffer(loc); Block.ReturnLevel level = block.apply(buf, rotation, random, 0); buf.setSucceeded(!level.equals(Block.ReturnLevel.FAIL)); diff --git a/common/src/main/java/com/dfsek/terra/config/files/Loader.java b/common/src/main/java/com/dfsek/terra/config/files/Loader.java index efd65392d..b05840db6 100644 --- a/common/src/main/java/com/dfsek/terra/config/files/Loader.java +++ b/common/src/main/java/com/dfsek/terra/config/files/Loader.java @@ -25,11 +25,6 @@ public abstract class Loader { public Loader thenNames(Consumer> consumer) { consumer.accept(new GlueList<>(streams.keySet())); - System.out.println("names ^ "); - streams.forEach((name, stream) -> { - System.out.println(name); - }); - System.out.println("names ^ "); return this; } diff --git a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java index cc4d0f8ae..231c91bac 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java @@ -3,8 +3,7 @@ package com.dfsek.terra.config.templates; import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; -import com.dfsek.tectonic.config.ValidatedConfigTemplate; -import com.dfsek.tectonic.exception.ValidationException; +import com.dfsek.tectonic.config.ConfigTemplate; import com.dfsek.terra.api.loot.LootTable; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; @@ -16,7 +15,7 @@ import java.util.List; import java.util.Map; @SuppressWarnings({"unused", "FieldMayBeFinal"}) -public class StructureTemplate extends AbstractableTemplate implements ValidatedConfigTemplate { +public class StructureTemplate extends AbstractableTemplate implements ConfigTemplate { @Value("id") private String id; @@ -64,10 +63,4 @@ public class StructureTemplate extends AbstractableTemplate implements Validated public GridSpawn getSpawn() { return spawn; } - - @Override - public boolean validate() throws ValidationException { - System.out.println("added structure " + id); - return true; - } } diff --git a/common/src/main/java/com/dfsek/terra/registry/StructureRegistry.java b/common/src/main/java/com/dfsek/terra/registry/StructureRegistry.java index 65f1de110..70af101f2 100644 --- a/common/src/main/java/com/dfsek/terra/registry/StructureRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/StructureRegistry.java @@ -3,9 +3,4 @@ package com.dfsek.terra.registry; import com.dfsek.terra.generation.items.TerraStructure; public class StructureRegistry extends TerraRegistry { - @Override - public boolean add(String name, TerraStructure value) { - System.out.println("added structure " + name + " to registry"); - return super.add(name, value); - } } From 1826adf1c2bef6622302a3d63814c90b701d891f Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 30 Dec 2020 21:38:23 -0700 Subject: [PATCH 143/210] remove more logging --- .../main/java/com/dfsek/terra/api/structures/parser/Parser.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index a0c5cf800..0443827f9 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -158,9 +158,7 @@ public class Parser { while(tokens.hasNext() && tokens.get().getType().equals(Token.Type.ELSE)) { tokens.consume(); // Consume else. - System.out.println("int: " + tokens.get()); if(tokens.get().getType().equals(Token.Type.IF_STATEMENT)) { - System.out.println("else if"); tokens.consume(); // Consume if. Returnable elseCondition = parseExpression(tokens, true, variableMap); ParserUtil.checkReturnType(elseCondition, Returnable.ReturnType.BOOLEAN); From 92afe1c9ab906a7b6dd6ca8741bf3f6b88ec75c6 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 31 Dec 2020 01:50:47 -0700 Subject: [PATCH 144/210] refactor blockdata --- .../script/functions/LootFunction.java | 48 +++++++++++++ .../structure/buffer/StructureBuffer.java | 6 +- .../buffer/items/BufferedLootApplication.java | 11 +++ .../test/java/structure/TokenizerTest.java | 6 +- .../dfsek/terra/bukkit/BukkitWorldHandle.java | 39 +---------- .../generator/BukkitChunkGenerator.java | 4 +- .../terra/bukkit/world/block/BukkitBlock.java | 3 +- .../bukkit/world/block/BukkitBlockData.java | 39 ----------- .../world/block/BukkitMaterialData.java | 3 +- .../block/data/BukkitAnaloguePowerable.java | 1 - .../world/block/data/BukkitBlockData.java | 68 +++++++++++++++++++ .../world/block/data/BukkitDirectional.java | 1 - .../block/data/BukkitMultipleFacing.java | 1 - .../world/block/data/BukkitOrientable.java | 1 - .../bukkit/world/block/data/BukkitRail.java | 1 - .../world/block/data/BukkitRotatable.java | 1 - .../bukkit/world/block/data/BukkitStairs.java | 1 - .../world/block/data/BukkitWaterlogged.java | 1 - 18 files changed, 140 insertions(+), 95 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java delete mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java new file mode 100644 index 000000000..109fa55b0 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.api.structures.script.functions; + +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.Random; + +public class LootFunction implements Function { + private final Returnable data; + private final Returnable x, y, z; + private final Position position; + + public LootFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) { + this.position = position; + this.data = data; + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public String name() { + return "block"; + } + + @Override + public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); + + + return null; + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java index bb0afb6dd..0f76ac936 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java @@ -34,8 +34,7 @@ public class StructureBuffer implements Buffer { @Override public Buffer addItem(BufferedItem item, Vector3 location) { - bufferedItemMap.putIfAbsent(location, new Cell()); - bufferedItemMap.get(location).add(item); + bufferedItemMap.computeIfAbsent(location, l -> new Cell()).add(item); return this; } @@ -50,8 +49,7 @@ public class StructureBuffer implements Buffer { @Override public Buffer setMark(Mark mark, Vector3 location) { - bufferedItemMap.putIfAbsent(location, new Cell()); - bufferedItemMap.get(location).setMark(mark); + bufferedItemMap.computeIfAbsent(location, l -> new Cell()).setMark(mark); return this; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java new file mode 100644 index 000000000..f0b4652ef --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.structures.structure.buffer.items; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.BlockData; + +public class BufferedLootApplication implements BufferedItem { + @Override + public void paste(Location origin) { + BlockData data = origin.getBlock().getBlockData(); + } +} diff --git a/common/src/test/java/structure/TokenizerTest.java b/common/src/test/java/structure/TokenizerTest.java index 73e0fd6e2..994171733 100644 --- a/common/src/test/java/structure/TokenizerTest.java +++ b/common/src/test/java/structure/TokenizerTest.java @@ -15,10 +15,10 @@ public class TokenizerTest { // Actual run long l = System.nanoTime(); - - while(tokenizer.hasNext()) { - Token t = tokenizer.fetch(); + Token t = tokenizer.fetch(); + while(t != null) { System.out.println(t); + t = tokenizer.fetch(); } System.out.println((double) (System.nanoTime() - l) / 1000000); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java index 31813cc79..1a2843ad9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java @@ -7,30 +7,10 @@ import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.world.WorldHandle; import com.dfsek.terra.api.transform.Transformer; -import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; -import com.dfsek.terra.bukkit.world.block.data.BukkitAnaloguePowerable; -import com.dfsek.terra.bukkit.world.block.data.BukkitDirectional; -import com.dfsek.terra.bukkit.world.block.data.BukkitMultipleFacing; -import com.dfsek.terra.bukkit.world.block.data.BukkitOrientable; -import com.dfsek.terra.bukkit.world.block.data.BukkitRedstoneWire; -import com.dfsek.terra.bukkit.world.block.data.BukkitRotatable; -import com.dfsek.terra.bukkit.world.block.data.BukkitSlab; -import com.dfsek.terra.bukkit.world.block.data.BukkitStairs; -import com.dfsek.terra.bukkit.world.block.data.BukkitWall; -import com.dfsek.terra.bukkit.world.block.data.BukkitWaterlogged; +import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.block.data.AnaloguePowerable; -import org.bukkit.block.data.Directional; -import org.bukkit.block.data.MultipleFacing; -import org.bukkit.block.data.Orientable; -import org.bukkit.block.data.Rotatable; -import org.bukkit.block.data.Waterlogged; -import org.bukkit.block.data.type.RedstoneWire; -import org.bukkit.block.data.type.Slab; -import org.bukkit.block.data.type.Stairs; -import org.bukkit.block.data.type.Wall; public class BukkitWorldHandle implements WorldHandle { private Transformer treeTransformer; @@ -60,22 +40,7 @@ public class BukkitWorldHandle implements WorldHandle { @Override public BlockData createBlockData(String data) { org.bukkit.block.data.BlockData bukkitData = Bukkit.createBlockData(data); - - if(bukkitData instanceof Stairs) return new BukkitStairs((Stairs) bukkitData); - if(bukkitData instanceof Slab) return new BukkitSlab((Slab) bukkitData); - if(bukkitData instanceof Wall) return new BukkitWall((Wall) bukkitData); - - if(bukkitData instanceof RedstoneWire) return new BukkitRedstoneWire((RedstoneWire) bukkitData); - if(bukkitData instanceof AnaloguePowerable) return new BukkitAnaloguePowerable((AnaloguePowerable) bukkitData); - - if(bukkitData instanceof MultipleFacing) return new BukkitMultipleFacing((MultipleFacing) bukkitData); - if(bukkitData instanceof Rotatable) return new BukkitRotatable((Rotatable) bukkitData); - if(bukkitData instanceof Directional) return new BukkitDirectional((Directional) bukkitData); - if(bukkitData instanceof Orientable) return new BukkitOrientable((Orientable) bukkitData); - - if(bukkitData instanceof Waterlogged) return new BukkitWaterlogged((Waterlogged) bukkitData); - - return new BukkitBlockData(Bukkit.createBlockData(data)); + return BukkitBlockData.newInstance(bukkitData); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java index f72ecae54..da5979414 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java @@ -7,7 +7,7 @@ import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.bukkit.BukkitBiomeGrid; import com.dfsek.terra.bukkit.BukkitWorld; -import com.dfsek.terra.bukkit.world.block.BukkitBlockData; +import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -95,7 +95,7 @@ public class BukkitChunkGenerator implements com.dfsek.terra.api.platform.genera @Override public @NotNull BlockData getBlockData(int x, int y, int z) { - return new BukkitBlockData(delegate.getBlockData(x, y, z)); + return BukkitBlockData.newInstance(delegate.getBlockData(x, y, z)); } } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java index b520f6011..e890163af 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.data.BukkitEnumAdapter; public class BukkitBlock implements Block { @@ -22,7 +23,7 @@ public class BukkitBlock implements Block { @Override public BlockData getBlockData() { - return new BukkitBlockData(delegate.getBlockData()); + return BukkitBlockData.newInstance(delegate.getBlockData()); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java deleted file mode 100644 index c03f3c7f6..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlockData.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.dfsek.terra.bukkit.world.block; - -import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.block.MaterialData; - -public class BukkitBlockData implements BlockData { - private org.bukkit.block.data.BlockData delegate; - - public BukkitBlockData(org.bukkit.block.data.BlockData delegate) { - this.delegate = delegate; - } - - - @Override - public org.bukkit.block.data.BlockData getHandle() { - return delegate; - } - - @Override - public MaterialData getMaterial() { - return new BukkitMaterialData(delegate.getMaterial()); - } - - @Override - public boolean matches(MaterialData materialData) { - return delegate.getMaterial().equals(((BukkitMaterialData) materialData).getHandle()); - } - - @Override - public BukkitBlockData clone() { - try { - BukkitBlockData n = (BukkitBlockData) super.clone(); - n.delegate = delegate.clone(); - return n; - } catch(CloneNotSupportedException e) { - throw new Error(e); - } - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java index f919b690a..e0bfba568 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitMaterialData.java @@ -2,6 +2,7 @@ package com.dfsek.terra.bukkit.world.block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; +import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; import org.bukkit.Material; public class BukkitMaterialData implements MaterialData { @@ -38,7 +39,7 @@ public class BukkitMaterialData implements MaterialData { @Override public BlockData createBlockData() { - return new BukkitBlockData(delegate.createBlockData()); + return BukkitBlockData.newInstance(delegate.createBlockData()); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitAnaloguePowerable.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitAnaloguePowerable.java index 37e6b504f..71cd99513 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitAnaloguePowerable.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitAnaloguePowerable.java @@ -1,7 +1,6 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.data.AnaloguePowerable; -import com.dfsek.terra.bukkit.world.block.BukkitBlockData; public class BukkitAnaloguePowerable extends BukkitBlockData implements AnaloguePowerable { public BukkitAnaloguePowerable(org.bukkit.block.data.AnaloguePowerable delegate) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java new file mode 100644 index 000000000..7515ea66e --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java @@ -0,0 +1,68 @@ +package com.dfsek.terra.bukkit.world.block.data; + +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; +import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; +import org.bukkit.block.data.AnaloguePowerable; +import org.bukkit.block.data.Directional; +import org.bukkit.block.data.MultipleFacing; +import org.bukkit.block.data.Orientable; +import org.bukkit.block.data.Rotatable; +import org.bukkit.block.data.Waterlogged; +import org.bukkit.block.data.type.RedstoneWire; +import org.bukkit.block.data.type.Slab; +import org.bukkit.block.data.type.Stairs; +import org.bukkit.block.data.type.Wall; + +public class BukkitBlockData implements BlockData { + private org.bukkit.block.data.BlockData delegate; + + protected BukkitBlockData(org.bukkit.block.data.BlockData delegate) { + this.delegate = delegate; + } + + public static BukkitBlockData newInstance(org.bukkit.block.data.BlockData bukkitData) { + if(bukkitData instanceof Stairs) return new BukkitStairs((Stairs) bukkitData); + if(bukkitData instanceof Slab) return new BukkitSlab((Slab) bukkitData); + if(bukkitData instanceof Wall) return new BukkitWall((Wall) bukkitData); + + if(bukkitData instanceof RedstoneWire) return new BukkitRedstoneWire((RedstoneWire) bukkitData); + if(bukkitData instanceof AnaloguePowerable) return new BukkitAnaloguePowerable((AnaloguePowerable) bukkitData); + + if(bukkitData instanceof MultipleFacing) return new BukkitMultipleFacing((MultipleFacing) bukkitData); + if(bukkitData instanceof Rotatable) return new BukkitRotatable((Rotatable) bukkitData); + if(bukkitData instanceof Directional) return new BukkitDirectional((Directional) bukkitData); + if(bukkitData instanceof Orientable) return new BukkitOrientable((Orientable) bukkitData); + + if(bukkitData instanceof Waterlogged) return new BukkitWaterlogged((Waterlogged) bukkitData); + + return new BukkitBlockData(bukkitData); + } + + + @Override + public org.bukkit.block.data.BlockData getHandle() { + return delegate; + } + + @Override + public MaterialData getMaterial() { + return new BukkitMaterialData(delegate.getMaterial()); + } + + @Override + public boolean matches(MaterialData materialData) { + return delegate.getMaterial().equals(((BukkitMaterialData) materialData).getHandle()); + } + + @Override + public BukkitBlockData clone() { + try { + BukkitBlockData n = (BukkitBlockData) super.clone(); + n.delegate = delegate.clone(); + return n; + } catch(CloneNotSupportedException e) { + throw new Error(e); + } + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java index b06f08688..5ab504f26 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java @@ -2,7 +2,6 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Directional; -import com.dfsek.terra.bukkit.world.block.BukkitBlockData; public class BukkitDirectional extends BukkitBlockData implements Directional { public BukkitDirectional(org.bukkit.block.data.Directional delegate) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java index ff6f4aae6..9d31536ef 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java @@ -2,7 +2,6 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.MultipleFacing; -import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import java.util.Set; import java.util.stream.Collectors; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java index e328d4ba8..c4e147049 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java @@ -2,7 +2,6 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.Axis; import com.dfsek.terra.api.platform.block.data.Orientable; -import com.dfsek.terra.bukkit.world.block.BukkitBlockData; import java.util.Set; import java.util.stream.Collectors; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java index 61bee5d38..36ba8b1b2 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java @@ -1,7 +1,6 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.data.Rail; -import com.dfsek.terra.bukkit.world.block.BukkitBlockData; public class BukkitRail extends BukkitBlockData implements Rail { public BukkitRail(org.bukkit.block.data.Rail delegate) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java index 784f33d77..687bd14c5 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java @@ -2,7 +2,6 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Rotatable; -import com.dfsek.terra.bukkit.world.block.BukkitBlockData; public class BukkitRotatable extends BukkitBlockData implements Rotatable { public BukkitRotatable(org.bukkit.block.data.Rotatable delegate) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java index c89c6812f..60de3ac7d 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java @@ -2,7 +2,6 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Stairs; -import com.dfsek.terra.bukkit.world.block.BukkitBlockData; public class BukkitStairs extends BukkitBlockData implements Stairs { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java index 181e6fc85..b75c6c170 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWaterlogged.java @@ -1,7 +1,6 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.data.Waterlogged; -import com.dfsek.terra.bukkit.world.block.BukkitBlockData; public class BukkitWaterlogged extends BukkitBlockData implements Waterlogged { public BukkitWaterlogged(org.bukkit.block.data.Waterlogged delegate) { From ad5823055de2c297c570bd491021efe80264a4ca Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 31 Dec 2020 02:03:47 -0700 Subject: [PATCH 145/210] do precedence better --- .../terra/api/structures/parser/Parser.java | 2 +- .../api/structures/parser/ParserUtil.java | 23 +++++++++++++++++++ common/src/test/resources/test.tesf | 9 +++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 0443827f9..78f9cbfea 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -286,7 +286,7 @@ public class Parser { Returnable right = parseExpression(tokens, false, variableMap); Token other = tokens.get(); - if(other.isBinaryOperator() && (other.getType().equals(Token.Type.MULTIPLICATION_OPERATOR) || other.getType().equals(Token.Type.DIVISION_OPERATOR))) { + if(ParserUtil.hasPrecedence(binaryOperator.getType(), other.getType())) { return assemble(left, parseBinaryOperation(right, tokens, variableMap), binaryOperator); } else if(other.isBinaryOperator()) { return parseBinaryOperation(assemble(left, right, binaryOperator), tokens, variableMap); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java index c54169044..e42349ac1 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java @@ -5,8 +5,26 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.tokenizer.Token; import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; public class ParserUtil { + + private static final Map> PRECEDENCE = new HashMap<>(); + private static final List ARITHMETIC = Arrays.asList(Token.Type.ADDITION_OPERATOR, Token.Type.SUBTRACTION_OPERATOR, Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR); + + static { // Setup precedence + PRECEDENCE.put(Token.Type.ADDITION_OPERATOR, Arrays.asList(Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR)); + PRECEDENCE.put(Token.Type.SUBTRACTION_OPERATOR, Arrays.asList(Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR)); + PRECEDENCE.put(Token.Type.EQUALS_OPERATOR, ARITHMETIC); + PRECEDENCE.put(Token.Type.NOT_EQUALS_OPERATOR, ARITHMETIC); + PRECEDENCE.put(Token.Type.GREATER_THAN_OPERATOR, ARITHMETIC); + PRECEDENCE.put(Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR, ARITHMETIC); + PRECEDENCE.put(Token.Type.LESS_THAN_OPERATOR, ARITHMETIC); + PRECEDENCE.put(Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, ARITHMETIC); + } + public static void checkType(Token token, Token.Type... expected) throws ParseException { for(Token.Type type : expected) if(token.getType().equals(type)) return; throw new ParseException("Expected " + Arrays.toString(expected) + " but found " + token.getType(), token.getPosition()); @@ -59,4 +77,9 @@ public class ParserUtil { throw new ParseException("Unexpected token " + varToken.getType() + "; expected variable declaration", varToken.getPosition()); } } + + public static boolean hasPrecedence(Token.Type first, Token.Type second) { + if(!PRECEDENCE.containsKey(first)) return false; + return PRECEDENCE.get(first).contains(second); + } } diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 8743834b1..f1108abda 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -7,6 +7,11 @@ num testVar = 3.4; bool boolean = true; str stringVar = "hello!"; +num precedence = 2 + 2 * 2; +test("precedence: " + precedence, 2); +num precedence2 = 2 * 2 + 2; +test("precedence 2: " + precedence2, 2); + bool iftest = false; bool truetest = false; @@ -19,7 +24,9 @@ for(num i = 0; i < 5; i = i + 1) { for(num j = 0; j < 5; j = j + 1) test("single statement j = " + j, iterator); - +if(4 + 2 == 2 + 4) { + test("new thing " + 2, iterator); +} while(iterator < 5) { test("always, even after " + 2, iterator); From 122fbd841c83969b82eebccc779aeb7dcffc3079 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 31 Dec 2020 02:06:53 -0700 Subject: [PATCH 146/210] correct scope wackiness in for loops --- .../java/com/dfsek/terra/api/structures/parser/Parser.java | 3 ++- common/src/test/resources/test.tesf | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 78f9cbfea..341915b08 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -187,7 +187,8 @@ public class Parser { } } - private ForKeyword parseForLoop(TokenHolder tokens, Map> variableMap, Position start) throws ParseException { + private ForKeyword parseForLoop(TokenHolder tokens, Map> old, Position start) throws ParseException { + Map> variableMap = new HashMap<>(old); Token f = tokens.get(); ParserUtil.checkType(f, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.IDENTIFIER); Item initializer; diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index f1108abda..88090881f 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -22,6 +22,10 @@ for(num i = 0; i < 5; i = i + 1) { test("i = " + i, iterator); } +for(num i = 0; i < 5; i = i + 1) { + test("i = " + i, iterator); +} + for(num j = 0; j < 5; j = j + 1) test("single statement j = " + j, iterator); if(4 + 2 == 2 + 4) { From 792b6efd127af6f8a0fdc906fc3afcf990dbb902 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 31 Dec 2020 02:30:41 -0700 Subject: [PATCH 147/210] allow data to be returned --- .../terra/api/structures/parser/Parser.java | 10 ++--- .../api/structures/parser/ParserUtil.java | 3 ++ .../api/structures/parser/lang/Block.java | 30 ++++++++++--- .../lang/functions/def/DefinedFunction.java | 34 ++++++++++++++ .../lang/functions/def/FunctionBlock.java | 44 +++++++++++++++++++ .../keywords/{ => flow}/BreakKeyword.java | 2 +- .../keywords/{ => flow}/ContinueKeyword.java | 2 +- .../lang/keywords/{ => flow}/FailKeyword.java | 2 +- .../keywords/{ => flow}/ReturnKeyword.java | 2 +- .../lang/keywords/looplike/ForKeyword.java | 12 ++--- .../lang/keywords/looplike/IfKeyword.java | 6 +-- .../lang/keywords/looplike/WhileKeyword.java | 12 ++--- .../structures/script/StructureScript.java | 8 ++-- 13 files changed, 133 insertions(+), 34 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/FunctionBlock.java rename common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/{ => flow}/BreakKeyword.java (92%) rename common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/{ => flow}/ContinueKeyword.java (92%) rename common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/{ => flow}/FailKeyword.java (92%) rename common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/{ => flow}/ReturnKeyword.java (92%) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 341915b08..5d4509aa5 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -14,10 +14,10 @@ import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.parser.lang.functions.builtin.AbsFunction; import com.dfsek.terra.api.structures.parser.lang.functions.builtin.PowFunction; import com.dfsek.terra.api.structures.parser.lang.functions.builtin.SqrtFunction; -import com.dfsek.terra.api.structures.parser.lang.keywords.BreakKeyword; -import com.dfsek.terra.api.structures.parser.lang.keywords.ContinueKeyword; -import com.dfsek.terra.api.structures.parser.lang.keywords.FailKeyword; -import com.dfsek.terra.api.structures.parser.lang.keywords.ReturnKeyword; +import com.dfsek.terra.api.structures.parser.lang.keywords.flow.BreakKeyword; +import com.dfsek.terra.api.structures.parser.lang.keywords.flow.ContinueKeyword; +import com.dfsek.terra.api.structures.parser.lang.keywords.flow.FailKeyword; +import com.dfsek.terra.api.structures.parser.lang.keywords.flow.ReturnKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.looplike.ForKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.looplike.IfKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.looplike.WhileKeyword; @@ -188,7 +188,7 @@ public class Parser { } private ForKeyword parseForLoop(TokenHolder tokens, Map> old, Position start) throws ParseException { - Map> variableMap = new HashMap<>(old); + Map> variableMap = new HashMap<>(old); // New scope Token f = tokens.get(); ParserUtil.checkType(f, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.IDENTIFIER); Item initializer; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java index e42349ac1..0462d630c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java @@ -13,6 +13,7 @@ public class ParserUtil { private static final Map> PRECEDENCE = new HashMap<>(); private static final List ARITHMETIC = Arrays.asList(Token.Type.ADDITION_OPERATOR, Token.Type.SUBTRACTION_OPERATOR, Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR); + private static final List COMPARISON = Arrays.asList(Token.Type.EQUALS_OPERATOR, Token.Type.NOT_EQUALS_OPERATOR, Token.Type.LESS_THAN_OPERATOR, Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, Token.Type.GREATER_THAN_OPERATOR, Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR); static { // Setup precedence PRECEDENCE.put(Token.Type.ADDITION_OPERATOR, Arrays.asList(Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR)); @@ -23,6 +24,8 @@ public class ParserUtil { PRECEDENCE.put(Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR, ARITHMETIC); PRECEDENCE.put(Token.Type.LESS_THAN_OPERATOR, ARITHMETIC); PRECEDENCE.put(Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, ARITHMETIC); + PRECEDENCE.put(Token.Type.BOOLEAN_AND, COMPARISON); + PRECEDENCE.put(Token.Type.BOOLEAN_OR, COMPARISON); } public static void checkType(Token token, Token.Type... expected) throws ParseException { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index de890168e..3bddbbd3b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -7,7 +7,7 @@ import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.List; import java.util.Random; -public class Block implements Item { +public class Block implements Item> { private final List> items; private final Position position; @@ -21,15 +21,15 @@ public class Block implements Item { } @Override - public synchronized ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public synchronized ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { for(Item item : items) { Object result = item.apply(buffer, rotation, random, recursions); - if(result instanceof ReturnLevel) { - ReturnLevel level = (ReturnLevel) result; - if(!level.equals(ReturnLevel.NONE)) return level; + if(result instanceof ReturnInfo) { + ReturnInfo level = (ReturnInfo) result; + if(!level.getLevel().equals(ReturnLevel.NONE)) return level; } } - return ReturnLevel.NONE; + return new ReturnInfo<>(ReturnLevel.NONE, null); } @Override @@ -37,6 +37,24 @@ public class Block implements Item { return position; } + public static class ReturnInfo { + private final ReturnLevel level; + private final T data; + + public ReturnInfo(ReturnLevel level, T data) { + this.level = level; + this.data = data; + } + + public ReturnLevel getLevel() { + return level; + } + + public T getData() { + return data; + } + } + public enum ReturnLevel { NONE(false), BREAK(false), CONTINUE(false), RETURN(true), FAIL(true); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java new file mode 100644 index 000000000..a34084104 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java @@ -0,0 +1,34 @@ +package com.dfsek.terra.api.structures.parser.lang.functions.def; + +import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.Random; + +public abstract class DefinedFunction implements Function { + private final Block block; + private final String name; + + protected DefinedFunction(Block block, String name) { + this.block = block; + this.name = name; + } + + @Override + public String name() { + return name; + } + + @Override + public T apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + return null; + } + + @Override + public Position getPosition() { + return null; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/FunctionBlock.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/FunctionBlock.java new file mode 100644 index 000000000..e374d5d71 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/FunctionBlock.java @@ -0,0 +1,44 @@ +package com.dfsek.terra.api.structures.parser.lang.functions.def; + +import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.Item; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; +import java.util.Random; + +public class FunctionBlock implements Item> { + private final List> items; + private final Position position; + private final T defaultVal; + + public FunctionBlock(List> items, T defaultVal, Position position) { + this.items = items; + this.position = position; + this.defaultVal = defaultVal; + } + + public List> getItems() { + return items; + } + + @SuppressWarnings("unchecked") + @Override + public synchronized Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + for(Item item : items) { + Object result = item.apply(buffer, rotation, random, recursions); + if(result instanceof Block.ReturnInfo) { + Block.ReturnInfo level = (Block.ReturnInfo) result; + if(!level.getLevel().equals(Block.ReturnLevel.NONE)) return level; + } + } + return new Block.ReturnInfo<>(Block.ReturnLevel.NONE, defaultVal); + } + + @Override + public Position getPosition() { + return position; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/BreakKeyword.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java rename to common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/BreakKeyword.java index 6d205dbf3..0887fb995 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/BreakKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/BreakKeyword.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.structures.parser.lang.keywords; +package com.dfsek.terra.api.structures.parser.lang.keywords.flow; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ContinueKeyword.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java rename to common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ContinueKeyword.java index 72b2cfa73..5460598f8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ContinueKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ContinueKeyword.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.structures.parser.lang.keywords; +package com.dfsek.terra.api.structures.parser.lang.keywords.flow; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/FailKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/FailKeyword.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/FailKeyword.java rename to common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/FailKeyword.java index 1277946a0..0f52b19f2 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/FailKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/FailKeyword.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.structures.parser.lang.keywords; +package com.dfsek.terra.api.structures.parser.lang.keywords.flow; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ReturnKeyword.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java rename to common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ReturnKeyword.java index 27df59d2b..239110439 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/ReturnKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ReturnKeyword.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.structures.parser.lang.keywords; +package com.dfsek.terra.api.structures.parser.lang.keywords.flow; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.Keyword; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java index 6cdd7845c..5f9eb4c89 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java @@ -10,7 +10,7 @@ import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.Random; -public class ForKeyword implements Keyword { +public class ForKeyword implements Keyword> { private final Block conditional; private final Item initializer; private final Returnable statement; @@ -26,13 +26,13 @@ public class ForKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { for(initializer.apply(buffer, rotation, random, recursions); statement.apply(buffer, rotation, random, recursions); incrementer.apply(buffer, rotation, random, recursions)) { - Block.ReturnLevel level = conditional.apply(buffer, rotation, random, recursions); - if(level.equals(Block.ReturnLevel.BREAK)) break; - if(level.isReturnFast()) return level; + Block.ReturnInfo level = conditional.apply(buffer, rotation, random, recursions); + if(level.getLevel().equals(Block.ReturnLevel.BREAK)) break; + if(level.getLevel().isReturnFast()) return level; } - return Block.ReturnLevel.NONE; + return new Block.ReturnInfo<>(Block.ReturnLevel.NONE, null); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java index 7a5f4ee88..683bca13c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java @@ -11,7 +11,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Random; -public class IfKeyword implements Keyword { +public class IfKeyword implements Keyword> { private final Block conditional; private final Returnable statement; private final Position position; @@ -27,7 +27,7 @@ public class IfKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { if(statement.apply(buffer, rotation, random, recursions)) return conditional.apply(buffer, rotation, random, recursions); else { for(Pair, Block> pair : elseIf) { @@ -37,7 +37,7 @@ public class IfKeyword implements Keyword { } if(elseBlock != null) return elseBlock.apply(buffer, rotation, random, recursions); } - return Block.ReturnLevel.NONE; + return new Block.ReturnInfo<>(Block.ReturnLevel.NONE, null); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java index 014542d45..c08c0d51f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java @@ -9,7 +9,7 @@ import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.Random; -public class WhileKeyword implements Keyword { +public class WhileKeyword implements Keyword> { private final Block conditional; private final Returnable statement; private final Position position; @@ -21,13 +21,13 @@ public class WhileKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { while(statement.apply(buffer, rotation, random, recursions)) { - Block.ReturnLevel level = conditional.apply(buffer, rotation, random, recursions); - if(level.equals(Block.ReturnLevel.BREAK)) break; - if(level.isReturnFast()) return level; + Block.ReturnInfo level = conditional.apply(buffer, rotation, random, recursions); + if(level.getLevel().equals(Block.ReturnLevel.BREAK)) break; + if(level.getLevel().isReturnFast()) return level; } - return Block.ReturnLevel.NONE; + return new Block.ReturnInfo<>(Block.ReturnLevel.NONE, null); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 4c7c83098..6306b01a7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -71,16 +71,16 @@ public class StructureScript { */ public boolean execute(Location location, Random random, Rotation rotation) { StructureBuffer buffer = new StructureBuffer(location); - Block.ReturnLevel level = block.apply(buffer, rotation, random, 0); + Block.ReturnInfo level = block.apply(buffer, rotation, random, 0); buffer.paste(); - return !level.equals(Block.ReturnLevel.FAIL); + return !level.getLevel().equals(Block.ReturnLevel.FAIL); } public boolean execute(Location location, Chunk chunk, Random random, Rotation rotation) { StructureBuffer buffer = cache.computeIfAbsent(location, loc -> { StructureBuffer buf = new StructureBuffer(loc); - Block.ReturnLevel level = block.apply(buf, rotation, random, 0); - buf.setSucceeded(!level.equals(Block.ReturnLevel.FAIL)); + Block.ReturnInfo level = block.apply(buf, rotation, random, 0); + buf.setSucceeded(!level.getLevel().equals(Block.ReturnLevel.FAIL)); return buf; }); buffer.paste(chunk); From 0c3e3f2bc682e278f882ef243199e9b275bf8c76 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 31 Dec 2020 02:44:33 -0700 Subject: [PATCH 148/210] fix flow keyword issues --- .../structures/parser/lang/keywords/flow/BreakKeyword.java | 6 +++--- .../parser/lang/keywords/flow/ContinueKeyword.java | 6 +++--- .../structures/parser/lang/keywords/flow/FailKeyword.java | 6 +++--- .../parser/lang/keywords/flow/ReturnKeyword.java | 6 +++--- common/src/test/resources/test.tesf | 7 +++++-- .../command/command/structure/load/LoadRawCommand.java | 4 ++-- 6 files changed, 19 insertions(+), 16 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/BreakKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/BreakKeyword.java index 0887fb995..1211007fd 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/BreakKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/BreakKeyword.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.Random; -public class BreakKeyword implements Keyword { +public class BreakKeyword implements Keyword> { private final Position position; public BreakKeyword(Position position) { @@ -16,8 +16,8 @@ public class BreakKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - return Block.ReturnLevel.BREAK; + public Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + return new Block.ReturnInfo<>(Block.ReturnLevel.BREAK, null); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ContinueKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ContinueKeyword.java index 5460598f8..a958b80a6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ContinueKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ContinueKeyword.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.Random; -public class ContinueKeyword implements Keyword { +public class ContinueKeyword implements Keyword> { private final Position position; public ContinueKeyword(Position position) { @@ -16,8 +16,8 @@ public class ContinueKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - return Block.ReturnLevel.CONTINUE; + public Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + return new Block.ReturnInfo<>(Block.ReturnLevel.CONTINUE, null); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/FailKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/FailKeyword.java index 0f52b19f2..1885d26e6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/FailKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/FailKeyword.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.Random; -public class FailKeyword implements Keyword { +public class FailKeyword implements Keyword> { private final Position position; public FailKeyword(Position position) { @@ -16,8 +16,8 @@ public class FailKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - return Block.ReturnLevel.FAIL; + public Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + return new Block.ReturnInfo<>(Block.ReturnLevel.FAIL, null); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ReturnKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ReturnKeyword.java index 239110439..7f2d2c87b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ReturnKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ReturnKeyword.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.Random; -public class ReturnKeyword implements Keyword { +public class ReturnKeyword implements Keyword> { private final Position position; public ReturnKeyword(Position position) { @@ -16,8 +16,8 @@ public class ReturnKeyword implements Keyword { } @Override - public Block.ReturnLevel apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - return Block.ReturnLevel.RETURN; + public Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + return new Block.ReturnInfo<>(Block.ReturnLevel.RETURN, null); } @Override diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 88090881f..76d3fd061 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -7,9 +7,9 @@ num testVar = 3.4; bool boolean = true; str stringVar = "hello!"; -num precedence = 2 + 2 * 2; +num precedence = (3 + 2) * 2 + 3; test("precedence: " + precedence, 2); -num precedence2 = 2 * 2 + 2; +num precedence2 = 3 * 2 + 2 * 3; test("precedence 2: " + precedence2, 2); bool iftest = false; @@ -20,6 +20,9 @@ num iterator = 0; for(num i = 0; i < 5; i = i + 1) { test("i = " + i, iterator); + if(i > 1 + 1) { + test("more than 2", iterator); + } } for(num i = 0; i < 5; i = i + 1) { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index aadd39e12..1a0008cb3 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -40,10 +40,10 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { long t = System.nanoTime(); FastRandom chunk = PopulationUtil.getRandom(new BukkitChunk(sender.getLocation().getChunk())); - terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); + boolean success = terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); long l = System.nanoTime() - t; - sender.sendMessage("Took " + ((double) l) / 1000000 + "ms"); + sender.sendMessage("Took " + ((double) l) / 1000000 + "ms. Success: " + success); return true; } From aa41cc4d3dbb69ef58dbe92036e13b60c2e54d63 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 31 Dec 2020 02:49:48 -0700 Subject: [PATCH 149/210] only allow loop flow control in loop --- .../terra/api/structures/parser/Parser.java | 36 ++++++++++--------- common/src/test/resources/test.tesf | 3 ++ 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 5d4509aa5..76ef37386 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -113,11 +113,11 @@ public class Parser { if(blockLevel != 0) throw new ParseException("Dangling opening brace", tokens.getTokens().get(tokens.getTokens().size() - 1).getPosition()); - return parseBlock(tokens, new HashMap<>()); + return parseBlock(tokens, new HashMap<>(), false); } - private Keyword parseLoopLike(TokenHolder tokens, Map> variableMap) throws ParseException { + private Keyword parseLoopLike(TokenHolder tokens, Map> variableMap, boolean loop) throws ParseException { Token identifier = tokens.consume(); ParserUtil.checkType(identifier, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP); @@ -128,7 +128,7 @@ public class Parser { case FOR_LOOP: return parseForLoop(tokens, variableMap, identifier.getPosition()); case IF_STATEMENT: - return parseIfStatement(tokens, variableMap, identifier.getPosition()); + return parseIfStatement(tokens, variableMap, identifier.getPosition(), loop); case WHILE_LOOP: return parseWhileLoop(tokens, variableMap, identifier.getPosition()); default: @@ -142,17 +142,17 @@ public class Parser { ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - return new WhileKeyword(parseStatementBlock(tokens, variableMap), (Returnable) first, start); // While loop + return new WhileKeyword(parseStatementBlock(tokens, variableMap, true), (Returnable) first, start); // While loop } - private IfKeyword parseIfStatement(TokenHolder tokens, Map> variableMap, Position start) throws ParseException { + private IfKeyword parseIfStatement(TokenHolder tokens, Map> variableMap, Position start, boolean loop) throws ParseException { Returnable condition = parseExpression(tokens, true, variableMap); ParserUtil.checkReturnType(condition, Returnable.ReturnType.BOOLEAN); ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); Block elseBlock = null; - Block statement = parseStatementBlock(tokens, variableMap); + Block statement = parseStatementBlock(tokens, variableMap, loop); List, Block>> elseIf = new GlueList<>(); @@ -162,9 +162,9 @@ public class Parser { tokens.consume(); // Consume if. Returnable elseCondition = parseExpression(tokens, true, variableMap); ParserUtil.checkReturnType(elseCondition, Returnable.ReturnType.BOOLEAN); - elseIf.add(new IfKeyword.Pair<>((Returnable) elseCondition, parseStatementBlock(tokens, variableMap))); + elseIf.add(new IfKeyword.Pair<>((Returnable) elseCondition, parseStatementBlock(tokens, variableMap, loop))); } else { - elseBlock = parseStatementBlock(tokens, variableMap); + elseBlock = parseStatementBlock(tokens, variableMap, loop); break; // Else must be last. } } @@ -172,16 +172,16 @@ public class Parser { return new IfKeyword(statement, (Returnable) condition, elseIf, elseBlock, start); // If statement } - private Block parseStatementBlock(TokenHolder tokens, Map> variableMap) throws ParseException { + private Block parseStatementBlock(TokenHolder tokens, Map> variableMap, boolean loop) throws ParseException { if(tokens.get().getType().equals(Token.Type.BLOCK_BEGIN)) { ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); - Block block = parseBlock(tokens, variableMap); + Block block = parseBlock(tokens, variableMap, loop); ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_END); return block; } else { Position position = tokens.get().getPosition(); - Block block = new Block(Collections.singletonList(parseItem(tokens, variableMap)), position); + Block block = new Block(Collections.singletonList(parseItem(tokens, variableMap, loop)), position); ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); return block; } @@ -217,7 +217,7 @@ public class Parser { ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); - return new ForKeyword(parseStatementBlock(tokens, variableMap), initializer, (Returnable) conditional, incrementer, start); + return new ForKeyword(parseStatementBlock(tokens, variableMap, true), initializer, (Returnable) conditional, incrementer, start); } private Returnable parseExpression(TokenHolder tokens, boolean full, Map> variableMap) throws ParseException { @@ -345,7 +345,7 @@ public class Parser { throw new UnsupportedOperationException("Unsupported variable type: " + type); } - private Block parseBlock(TokenHolder tokens, Map> superVars) throws ParseException { + private Block parseBlock(TokenHolder tokens, Map> superVars, boolean loop) throws ParseException { List> parsedItems = new GlueList<>(); Map> parsedVariables = new HashMap<>(superVars); // New hashmap as to not mutate parent scope's declarations. @@ -355,19 +355,21 @@ public class Parser { while(tokens.hasNext()) { Token token = tokens.get(); if(token.getType().equals(Token.Type.BLOCK_END)) break; // Stop parsing at block end. - parsedItems.add(parseItem(tokens, parsedVariables)); + parsedItems.add(parseItem(tokens, parsedVariables, loop)); if(tokens.hasNext() && !token.isLoopLike()) ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); } return new Block(parsedItems, first.getPosition()); } - private Item parseItem(TokenHolder tokens, Map> variableMap) throws ParseException { + private Item parseItem(TokenHolder tokens, Map> variableMap, boolean loop) throws ParseException { Token token = tokens.get(); - ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, + if(loop) ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE, Token.Type.FAIL); + else ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, + Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, Token.Type.FAIL); if(token.isLoopLike()) { // Parse loop-like tokens (if, while, etc) - return parseLoopLike(tokens, variableMap); + return parseLoopLike(tokens, variableMap, loop); } else if(token.isIdentifier()) { // Parse identifiers if(variableMap.containsKey(token.getContent())) { // Assume variable assignment Variable variable = variableMap.get(token.getContent()); diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index 76d3fd061..ee20157ff 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -18,10 +18,13 @@ bool truetest = false; num iterator = 0; + + for(num i = 0; i < 5; i = i + 1) { test("i = " + i, iterator); if(i > 1 + 1) { test("more than 2", iterator); + continue; } } From 166c0f7dfb0336989bcdeab0122b7b1926b3d3d9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 31 Dec 2020 16:10:45 -0700 Subject: [PATCH 150/210] reimplement structure spawn command --- .../lang/functions/def/DefinedFunction.java | 11 +++++----- .../lang/functions/def/FunctionBlock.java | 8 ++++---- .../dfsek/terra/config/base/ConfigPack.java | 8 +++++++- .../command/structure/SpawnCommand.java | 20 ++++++++++++------- 4 files changed, 30 insertions(+), 17 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java index a34084104..923a399ad 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java @@ -1,6 +1,5 @@ package com.dfsek.terra.api.structures.parser.lang.functions.def; -import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; @@ -9,12 +8,14 @@ import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.Random; public abstract class DefinedFunction implements Function { - private final Block block; + private final FunctionBlock block; private final String name; + private final Position position; - protected DefinedFunction(Block block, String name) { + protected DefinedFunction(FunctionBlock block, String name, Position position) { this.block = block; this.name = name; + this.position = position; } @Override @@ -24,11 +25,11 @@ public abstract class DefinedFunction implements Function { @Override public T apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - return null; + return block.apply(buffer, rotation, random, recursions); } @Override public Position getPosition() { - return null; + return position; } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/FunctionBlock.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/FunctionBlock.java index e374d5d71..f0a55ab2f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/FunctionBlock.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/FunctionBlock.java @@ -9,7 +9,7 @@ import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.List; import java.util.Random; -public class FunctionBlock implements Item> { +public class FunctionBlock implements Item { private final List> items; private final Position position; private final T defaultVal; @@ -26,15 +26,15 @@ public class FunctionBlock implements Item> { @SuppressWarnings("unchecked") @Override - public synchronized Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public synchronized T apply(Buffer buffer, Rotation rotation, Random random, int recursions) { for(Item item : items) { Object result = item.apply(buffer, rotation, random, recursions); if(result instanceof Block.ReturnInfo) { Block.ReturnInfo level = (Block.ReturnInfo) result; - if(!level.getLevel().equals(Block.ReturnLevel.NONE)) return level; + if(level.getLevel().equals(Block.ReturnLevel.RETURN)) return level.getData(); } } - return new Block.ReturnInfo<>(Block.ReturnLevel.NONE, defaultVal); + return defaultVal; } @Override diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 3fd7e09b1..2a2f4247e 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -91,10 +91,12 @@ public class ConfigPack implements LoaderRegistrar { private final ConfigLoader selfLoader = new ConfigLoader(); private final Scope varScope = new Scope(); + private final CheckCache checkCache; public ConfigPack(File folder, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); + this.checkCache = new CheckCache(main); floraRegistry = new FloraRegistry(main); paletteRegistry = new PaletteRegistry(main); treeRegistry = new TreeRegistry(main); @@ -116,6 +118,7 @@ public class ConfigPack implements LoaderRegistrar { public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); + this.checkCache = new CheckCache(main); floraRegistry = new FloraRegistry(main); paletteRegistry = new PaletteRegistry(main); treeRegistry = new TreeRegistry(main); @@ -149,7 +152,6 @@ public class ConfigPack implements LoaderRegistrar { abstractConfigLoader .registerLoader(LootTable.class, new LootTableLoader(loader, main)); // These loaders need access to the Loader instance to get files. - CheckCache checkCache = new CheckCache(main); loader.open("structures/data", ".tesf").then(streams -> streams.forEach(stream -> { StructureScript structureScript = new StructureScript(stream, main, scriptRegistry, checkCache); scriptRegistry.add(structureScript.getId(), structureScript); @@ -258,4 +260,8 @@ public class ConfigPack implements LoaderRegistrar { public BiomeRegistry getBiomeRegistry() { return biomeRegistry; } + + public CheckCache getCheckCache() { + return checkCache; + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java index bf8462ae7..f604a5f5b 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java @@ -1,5 +1,12 @@ package com.dfsek.terra.bukkit.command.command.structure; +import com.dfsek.terra.api.structures.parser.lang.constants.NumericConstant; +import com.dfsek.terra.api.structures.script.functions.CheckFunction; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer; +import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; import com.dfsek.terra.bukkit.command.WorldCommand; import org.bukkit.Location; @@ -23,14 +30,13 @@ public class SpawnCommand extends WorldCommand implements DebugCommand { int x = p.getBlockX(); int y = p.getBlockY(); int z = p.getBlockZ(); - /* - boolean air = StructureSpawnRequirement.AIR.getInstance(world, (TerraBukkitPlugin) getMain()).matches(x, y, z); - boolean ground = StructureSpawnRequirement.LAND.getInstance(world, (TerraBukkitPlugin) getMain()).matches(x, y, z); - boolean sea = StructureSpawnRequirement.OCEAN.getInstance(world, (TerraBukkitPlugin) getMain()).matches(x, y, z); + Position dummy = new Position(0, 0); + com.dfsek.terra.api.platform.world.World w = new BukkitWorld(world); + String check = new CheckFunction(getMain(), new NumericConstant(0, dummy), new NumericConstant(0, dummy), new NumericConstant(0, dummy), getMain().getWorld(w).getConfig().getCheckCache(), dummy).apply(new StructureBuffer( + new com.dfsek.terra.api.math.vector.Location(w, x, y, z) + ), Rotation.NONE, new FastRandom(), 0); - sender.sendMessage("AIR: " + air + "\nLAND: " + ground + "\nOCEAN: " + sea); - - */ + sender.sendMessage("Found: " + check); return true; } From 356771bceaaaeb2d3769b2f3b6d0bd16cd6cf19a Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 31 Dec 2020 20:37:14 -0700 Subject: [PATCH 151/210] work on inventory stuff --- .../dfsek/terra/api/platform/block/Block.java | 3 ++ .../api/platform/block/state/BlockState.java | 17 +++++- .../api/platform/block/state/Container.java | 6 +++ .../inventory/BlockInventoryHolder.java | 7 +++ .../platform/inventory/InventoryHolder.java | 7 +++ .../platform/inventory/item/Damageable.java | 5 +- .../dfsek/terra/bukkit/BukkitItemHandle.java | 1 + .../dfsek/terra/bukkit/BukkitItemMeta.java | 16 ------ .../terra/bukkit/world/block/BukkitBlock.java | 8 ++- .../world/block/state/BukkitBlockState.java | 54 +++++++++++++++++++ .../world/block/state/BukkitContainer.java | 16 ++++++ .../world/inventory/BukkitInventory.java | 32 +++++++++++ .../world/inventory/BukkitItemMeta.java | 23 ++++++++ .../inventory}/BukkitItemStack.java | 6 +-- .../inventory/meta/BukkitDamageable.java | 26 +++++++++ .../terra/fabric/world/block/FabricBlock.java | 6 +++ 16 files changed, 210 insertions(+), 23 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/block/state/Container.java create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/inventory/BlockInventoryHolder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/inventory/InventoryHolder.java delete mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemMeta.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitContainer.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitInventory.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemMeta.java rename platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/{ => world/inventory}/BukkitItemStack.java (88%) create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitDamageable.java diff --git a/common/src/main/java/com/dfsek/terra/api/platform/block/Block.java b/common/src/main/java/com/dfsek/terra/api/platform/block/Block.java index c29b982aa..47242d6e2 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/block/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/Block.java @@ -2,12 +2,15 @@ package com.dfsek.terra.api.platform.block; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.block.state.BlockState; public interface Block extends Handle { void setBlockData(BlockData data, boolean physics); BlockData getBlockData(); + BlockState getState(); + Block getRelative(BlockFace face); Block getRelative(BlockFace face, int len); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/block/state/BlockState.java b/common/src/main/java/com/dfsek/terra/api/platform/block/state/BlockState.java index b5fc693ce..74fdd2be9 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/block/state/BlockState.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/state/BlockState.java @@ -1,4 +1,19 @@ package com.dfsek.terra.api.platform.block.state; -public interface BlockState { +import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; + +public interface BlockState extends Handle { + Block getBlock(); + + int getX(); + + int getY(); + + int getZ(); + + BlockData getBlockData(); + + boolean update(boolean applyPhysics); } diff --git a/common/src/main/java/com/dfsek/terra/api/platform/block/state/Container.java b/common/src/main/java/com/dfsek/terra/api/platform/block/state/Container.java new file mode 100644 index 000000000..450b8d09a --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/state/Container.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.api.platform.block.state; + +import com.dfsek.terra.api.platform.inventory.BlockInventoryHolder; + +public interface Container extends BlockState, BlockInventoryHolder { +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/inventory/BlockInventoryHolder.java b/common/src/main/java/com/dfsek/terra/api/platform/inventory/BlockInventoryHolder.java new file mode 100644 index 000000000..157d8837e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/inventory/BlockInventoryHolder.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.api.platform.inventory; + +import com.dfsek.terra.api.platform.block.Block; + +public interface BlockInventoryHolder extends InventoryHolder { + Block getBlock(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/inventory/InventoryHolder.java b/common/src/main/java/com/dfsek/terra/api/platform/inventory/InventoryHolder.java new file mode 100644 index 000000000..c8550a121 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/inventory/InventoryHolder.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.api.platform.inventory; + +import com.dfsek.terra.api.platform.Handle; + +public interface InventoryHolder extends Handle { + Inventory getInventory(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/Damageable.java b/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/Damageable.java index b4c6a5596..160388c94 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/Damageable.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/Damageable.java @@ -2,9 +2,10 @@ package com.dfsek.terra.api.platform.inventory.item; import com.dfsek.terra.api.platform.Handle; -public interface Damageable extends Handle, Cloneable { - Damageable clone(); +public interface Damageable extends Handle { int getDamage(); + void setDamage(int damage); + boolean hasDamage(); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java index 29c8d8eca..fa6d7fd3b 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.inventory.ItemHandle; import com.dfsek.terra.api.platform.inventory.ItemStack; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; +import com.dfsek.terra.bukkit.world.inventory.BukkitItemStack; public class BukkitItemHandle implements ItemHandle { @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemMeta.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemMeta.java deleted file mode 100644 index a4742e02c..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemMeta.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.dfsek.terra.bukkit; - -import com.dfsek.terra.api.platform.inventory.item.ItemMeta; - -public class BukkitItemMeta implements ItemMeta { - private final org.bukkit.inventory.meta.ItemMeta delegate; - - public BukkitItemMeta(org.bukkit.inventory.meta.ItemMeta delegate) { - this.delegate = delegate; - } - - @Override - public org.bukkit.inventory.meta.ItemMeta getHandle() { - return delegate; - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java index e890163af..ad933841a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.MaterialData; +import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.data.BukkitEnumAdapter; @@ -26,6 +27,11 @@ public class BukkitBlock implements Block { return BukkitBlockData.newInstance(delegate.getBlockData()); } + @Override + public BlockState getState() { + return null; + } + @Override public Block getRelative(BlockFace face) { return new BukkitBlock(delegate.getRelative(BukkitEnumAdapter.adapt(face))); @@ -72,7 +78,7 @@ public class BukkitBlock implements Block { } @Override - public Object getHandle() { + public org.bukkit.block.Block getHandle() { return delegate; } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java new file mode 100644 index 000000000..85e9e4183 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java @@ -0,0 +1,54 @@ +package com.dfsek.terra.bukkit.world.block.state; + +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.state.BlockState; +import com.dfsek.terra.bukkit.world.block.BukkitBlock; +import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; + +public class BukkitBlockState implements BlockState { + private final org.bukkit.block.BlockState delegate; + + protected BukkitBlockState(org.bukkit.block.BlockState block) { + this.delegate = block; + } + + public static BukkitBlockState newInstance(org.bukkit.block.BlockState block) { + return new BukkitBlockState(block); + } + + @Override + public org.bukkit.block.BlockState getHandle() { + return delegate; + } + + @Override + public Block getBlock() { + return new BukkitBlock(delegate.getBlock()); + } + + @Override + public int getX() { + return delegate.getX(); + } + + @Override + public int getY() { + return delegate.getY(); + } + + @Override + public int getZ() { + return delegate.getZ(); + } + + @Override + public BlockData getBlockData() { + return BukkitBlockData.newInstance(delegate.getBlockData()); + } + + @Override + public boolean update(boolean applyPhysics) { + return delegate.update(true, applyPhysics); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitContainer.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitContainer.java new file mode 100644 index 000000000..d68254b36 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitContainer.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.bukkit.world.block.state; + +import com.dfsek.terra.api.platform.block.state.Container; +import com.dfsek.terra.api.platform.inventory.Inventory; +import com.dfsek.terra.bukkit.world.inventory.BukkitInventory; + +public class BukkitContainer extends BukkitBlockState implements Container { + protected BukkitContainer(org.bukkit.block.Container block) { + super(block); + } + + @Override + public Inventory getInventory() { + return new BukkitInventory(((org.bukkit.block.Container) getHandle()).getInventory()); + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitInventory.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitInventory.java new file mode 100644 index 000000000..87e8aeb3d --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitInventory.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.bukkit.world.inventory; + +import com.dfsek.terra.api.platform.inventory.Inventory; +import com.dfsek.terra.api.platform.inventory.ItemStack; + +public class BukkitInventory implements Inventory { + private final org.bukkit.inventory.Inventory delegate; + + public BukkitInventory(org.bukkit.inventory.Inventory delegate) { + this.delegate = delegate; + } + + @Override + public int getSize() { + return delegate.getSize(); + } + + @Override + public ItemStack getItem(int slot) { + return new BukkitItemStack(delegate.getItem(slot)); + } + + @Override + public void setItem(int slot, ItemStack newStack) { + delegate.setItem(slot, ((BukkitItemStack) newStack).getHandle()); + } + + @Override + public org.bukkit.inventory.Inventory getHandle() { + return delegate; + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemMeta.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemMeta.java new file mode 100644 index 000000000..3e9e4299f --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemMeta.java @@ -0,0 +1,23 @@ +package com.dfsek.terra.bukkit.world.inventory; + +import com.dfsek.terra.api.platform.inventory.item.ItemMeta; +import com.dfsek.terra.bukkit.world.inventory.meta.BukkitDamageable; +import org.bukkit.inventory.meta.Damageable; + +public class BukkitItemMeta implements ItemMeta { + private final org.bukkit.inventory.meta.ItemMeta delegate; + + protected BukkitItemMeta(org.bukkit.inventory.meta.ItemMeta delegate) { + this.delegate = delegate; + } + + public static BukkitItemMeta newInstance(org.bukkit.inventory.meta.ItemMeta delegate) { + if(delegate instanceof Damageable) return new BukkitDamageable((Damageable) delegate); + return new BukkitItemMeta(delegate); + } + + @Override + public org.bukkit.inventory.meta.ItemMeta getHandle() { + return delegate; + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemStack.java similarity index 88% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemStack.java index 54836de15..5d94c45c5 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemStack.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemStack.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit; +package com.dfsek.terra.bukkit.world.inventory; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.inventory.ItemStack; @@ -6,7 +6,7 @@ import com.dfsek.terra.api.platform.inventory.item.ItemMeta; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; public class BukkitItemStack implements ItemStack { - protected org.bukkit.inventory.ItemStack delegate; + private org.bukkit.inventory.ItemStack delegate; public BukkitItemStack(org.bukkit.inventory.ItemStack delegate) { this.delegate = delegate; @@ -41,7 +41,7 @@ public class BukkitItemStack implements ItemStack { @Override public ItemMeta getItemMeta() { - return new BukkitItemMeta(delegate.getItemMeta()); + return BukkitItemMeta.newInstance(delegate.getItemMeta()); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitDamageable.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitDamageable.java new file mode 100644 index 000000000..0c2ba018f --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitDamageable.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.bukkit.world.inventory.meta; + +import com.dfsek.terra.api.platform.inventory.item.Damageable; +import com.dfsek.terra.bukkit.world.inventory.BukkitItemMeta; +import org.bukkit.inventory.meta.ItemMeta; + +public class BukkitDamageable extends BukkitItemMeta implements Damageable { + public BukkitDamageable(org.bukkit.inventory.meta.Damageable delegate) { + super((ItemMeta) delegate); + } + + @Override + public int getDamage() { + return ((org.bukkit.inventory.meta.Damageable) getHandle()).getDamage(); + } + + @Override + public void setDamage(int damage) { + ((org.bukkit.inventory.meta.Damageable) getHandle()).setDamage(damage); + } + + @Override + public boolean hasDamage() { + return ((org.bukkit.inventory.meta.Damageable) getHandle()).hasDamage(); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java index 9e0d8bfd9..2b22b99ba 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlock.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.MaterialData; +import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.fabric.world.FabricAdapters; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; import net.minecraft.util.math.BlockPos; @@ -27,6 +28,11 @@ public class FabricBlock implements Block { return new FabricBlockData(delegate.worldAccess.getBlockState(delegate.position)); } + @Override + public BlockState getState() { + return null; + } + @Override public Block getRelative(BlockFace face) { return getRelative(face, 1); From a9df684b800452d0bc731851fd29770b50292173 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 31 Dec 2020 23:20:16 -0700 Subject: [PATCH 152/210] reimplement loot tables --- .../dfsek/terra/config/base/ConfigPack.java | 21 +++++++++--- .../com/dfsek/terra/config/files/Loader.java | 9 +++-- .../terra/config/loaders/LootTableLoader.java | 34 ------------------- .../config/templates/StructureTemplate.java | 4 +-- .../generation/items/TerraStructure.java | 7 ++-- .../dfsek/terra/registry/LootRegistry.java | 6 ++++ 6 files changed, 34 insertions(+), 47 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java create mode 100644 common/src/main/java/com/dfsek/terra/registry/LootRegistry.java diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 2a2f4247e..6de2e6ed2 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -32,7 +32,6 @@ import com.dfsek.terra.config.files.FolderLoader; import com.dfsek.terra.config.files.Loader; import com.dfsek.terra.config.files.ZIPLoader; import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.config.loaders.LootTableLoader; import com.dfsek.terra.config.templates.AbstractableTemplate; import com.dfsek.terra.config.templates.BiomeGridTemplate; import com.dfsek.terra.config.templates.BiomeTemplate; @@ -48,12 +47,15 @@ import com.dfsek.terra.registry.BiomeGridRegistry; import com.dfsek.terra.registry.BiomeRegistry; import com.dfsek.terra.registry.CarverRegistry; import com.dfsek.terra.registry.FloraRegistry; +import com.dfsek.terra.registry.LootRegistry; import com.dfsek.terra.registry.OreRegistry; import com.dfsek.terra.registry.PaletteRegistry; import com.dfsek.terra.registry.ScriptRegistry; import com.dfsek.terra.registry.StructureRegistry; import com.dfsek.terra.registry.TerraRegistry; import com.dfsek.terra.registry.TreeRegistry; +import org.apache.commons.io.IOUtils; +import org.json.simple.parser.ParseException; import parsii.eval.Scope; import java.io.File; @@ -61,6 +63,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; @@ -86,6 +89,7 @@ public class ConfigPack implements LoaderRegistrar { private final OreRegistry oreRegistry = new OreRegistry(); private final TreeRegistry treeRegistry; private final ScriptRegistry scriptRegistry = new ScriptRegistry(); + private final LootRegistry lootRegistry = new LootRegistry(); private final AbstractConfigLoader abstractConfigLoader = new AbstractConfigLoader(); private final ConfigLoader selfLoader = new ConfigLoader(); @@ -149,13 +153,19 @@ public class ConfigPack implements LoaderRegistrar { for(Map.Entry var : template.getVariables().entrySet()) { varScope.create(var.getKey()).setValue(var.getValue()); } - abstractConfigLoader - .registerLoader(LootTable.class, new LootTableLoader(loader, main)); // These loaders need access to the Loader instance to get files. loader.open("structures/data", ".tesf").then(streams -> streams.forEach(stream -> { StructureScript structureScript = new StructureScript(stream, main, scriptRegistry, checkCache); scriptRegistry.add(structureScript.getId(), structureScript); - })).close(); + })).close().open("structures/loot", ".json").thenEntries(entries -> { + for(Map.Entry entry : entries) { + try { + lootRegistry.add(entry.getKey(), new LootTable(IOUtils.toString(entry.getValue(), StandardCharsets.UTF_8), main)); + } catch(ParseException | IOException | NullPointerException e) { + throw new LoadException("Unable to load loot", e); + } + } + }).close(); loader .open("palettes", ".yml").then(streams -> buildAll(new PaletteFactory(), paletteRegistry, abstractConfigLoader.load(streams, PaletteTemplate::new), main)).close() @@ -250,7 +260,8 @@ public class ConfigPack implements LoaderRegistrar { .registerLoader(Ore.class, oreRegistry) .registerLoader(Tree.class, treeRegistry) .registerLoader(StructureScript.class, scriptRegistry) - .registerLoader(TerraStructure.class, structureRegistry); + .registerLoader(TerraStructure.class, structureRegistry) + .registerLoader(LootTable.class, lootRegistry); } public ScriptRegistry getScriptRegistry() { diff --git a/common/src/main/java/com/dfsek/terra/config/files/Loader.java b/common/src/main/java/com/dfsek/terra/config/files/Loader.java index b05840db6..5c06ec7ac 100644 --- a/common/src/main/java/com/dfsek/terra/config/files/Loader.java +++ b/common/src/main/java/com/dfsek/terra/config/files/Loader.java @@ -8,7 +8,7 @@ import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.function.Consumer; +import java.util.Set; public abstract class Loader { protected final Map streams = new HashMap<>(); @@ -23,11 +23,16 @@ public abstract class Loader { return this; } - public Loader thenNames(Consumer> consumer) { + public Loader thenNames(ExceptionalConsumer> consumer) throws ConfigException { consumer.accept(new GlueList<>(streams.keySet())); return this; } + public Loader thenEntries(ExceptionalConsumer>> consumer) throws ConfigException { + consumer.accept(streams.entrySet()); + return this; + } + /** * Get a single file from this Loader. * diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java deleted file mode 100644 index bca5044e8..000000000 --- a/common/src/main/java/com/dfsek/terra/config/loaders/LootTableLoader.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.dfsek.terra.config.loaders; - -import com.dfsek.tectonic.exception.LoadException; -import com.dfsek.tectonic.loading.ConfigLoader; -import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.loot.LootTable; -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.config.files.Loader; -import org.apache.commons.io.IOUtils; -import org.json.simple.parser.ParseException; - -import java.io.IOException; -import java.io.InputStream; -import java.lang.reflect.Type; -import java.nio.charset.StandardCharsets; - -public class LootTableLoader implements TypeLoader { - private final Loader loader; - private final TerraPlugin main; - - public LootTableLoader(Loader loader, TerraPlugin main) { - this.loader = loader; - this.main = main; - } - - @Override - public LootTable load(Type type, Object o, ConfigLoader configLoader) throws LoadException { - try(InputStream stream = loader.get("structures/loot/" + o + ".json")) { - return new LootTable(IOUtils.toString(stream, StandardCharsets.UTF_8), main); - } catch(IOException | ParseException | NullPointerException e) { - throw new LoadException("Unable to load loot", e); - } - } -} diff --git a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java index 231c91bac..c4041fa62 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java @@ -33,14 +33,14 @@ public class StructureTemplate extends AbstractableTemplate implements ConfigTem @Value("loot") @Abstractable - private Map loot; + private Map loot; @Value("features") @Abstractable @Default private List features = new GlueList<>(); - public Map getLoot() { + public Map getLoot() { return loot; } diff --git a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java index 3fda0fbd6..a2e39dd97 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java @@ -9,15 +9,14 @@ import com.dfsek.terra.procgen.GridSpawn; import java.util.Map; -// TODO: implementation public class TerraStructure { private final ProbabilityCollection structure; private final Range spawnStart; private final GridSpawn spawn; - private final Map loot; + private final Map loot; private final StructureTemplate template; - public TerraStructure(ProbabilityCollection structures, Range spawnStart, GridSpawn spawn, Map loot, StructureTemplate template) { + public TerraStructure(ProbabilityCollection structures, Range spawnStart, GridSpawn spawn, Map loot, StructureTemplate template) { this.structure = structures; this.spawnStart = spawnStart; this.spawn = spawn; @@ -41,7 +40,7 @@ public class TerraStructure { return spawn; } - public Map getLoot() { + public Map getLoot() { return loot; } } diff --git a/common/src/main/java/com/dfsek/terra/registry/LootRegistry.java b/common/src/main/java/com/dfsek/terra/registry/LootRegistry.java new file mode 100644 index 000000000..a824c9d31 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/registry/LootRegistry.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.registry; + +import com.dfsek.terra.api.loot.LootTable; + +public class LootRegistry extends TerraRegistry { +} From ce033b09563c3d2fed08f8eae22b598549f9741a Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 1 Jan 2021 00:08:03 -0700 Subject: [PATCH 153/210] implement LootFunction --- .../structures/script/StructureScript.java | 7 ++- .../script/builders/LootFunctionBuilder.java | 45 +++++++++++++++++++ .../script/functions/LootFunction.java | 22 ++++++++- .../script/functions/StructureFunction.java | 5 ++- .../structure/buffer/StructureBuffer.java | 4 +- .../buffer/items/BufferedLootApplication.java | 22 ++++++++- .../dfsek/terra/config/base/ConfigPack.java | 2 +- .../config/factories/StructureFactory.java | 2 +- .../config/templates/StructureTemplate.java | 10 ----- .../generation/items/TerraStructure.java | 11 +---- .../terra/bukkit/world/block/BukkitBlock.java | 3 +- .../world/block/state/BukkitBlockState.java | 2 + .../world/inventory/BukkitInventory.java | 3 +- 13 files changed, 105 insertions(+), 33 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 6306b01a7..99b73a377 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.GetMarkFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.LootFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.MarkFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.PullFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RandomFunctionBuilder; @@ -18,6 +19,7 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer; import com.dfsek.terra.api.structures.world.CheckCache; +import com.dfsek.terra.registry.LootRegistry; import com.dfsek.terra.registry.ScriptRegistry; import org.apache.commons.io.IOUtils; @@ -32,7 +34,7 @@ public class StructureScript { private final String id; private final LinkedHashMap cache; - public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, CheckCache cache) { + public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, LootRegistry lootRegistry, CheckCache cache) { Parser parser; try { parser = new Parser(IOUtils.toString(inputStream)); @@ -46,7 +48,8 @@ public class StructureScript { .addFunction("recursions", new RecursionsFunctionBuilder()) .addFunction("setMark", new MarkFunctionBuilder()) .addFunction("getMark", new GetMarkFunctionBuilder()) - .addFunction("pull", new PullFunctionBuilder(main)); + .addFunction("pull", new PullFunctionBuilder(main)) + .addFunction("loot", new LootFunctionBuilder(main, lootRegistry)); try { block = parser.parse(); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java new file mode 100644 index 000000000..db9677e54 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/LootFunctionBuilder.java @@ -0,0 +1,45 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.functions.LootFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.registry.LootRegistry; + +import java.util.List; + +public class LootFunctionBuilder implements FunctionBuilder { + private final TerraPlugin main; + private final LootRegistry registry; + + public LootFunctionBuilder(TerraPlugin main, LootRegistry registry) { + this.main = main; + this.registry = registry; + } + + @SuppressWarnings("unchecked") + @Override + public LootFunction build(List> argumentList, Position position) { + return new LootFunction(registry, (Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position); + } + + @Override + public int argNumber() { + return 4; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + switch(position) { + case 0: + case 1: + case 2: + return Returnable.ReturnType.NUMBER; + case 3: + return Returnable.ReturnType.STRING; + default: + return null; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java index 109fa55b0..cecc70a88 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java @@ -1,26 +1,36 @@ package com.dfsek.terra.api.structures.script.functions; +import com.dfsek.terra.api.loot.LootTable; import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedLootApplication; import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.registry.LootRegistry; +import net.jafama.FastMath; import java.util.Random; public class LootFunction implements Function { + private final LootRegistry registry; private final Returnable data; private final Returnable x, y, z; private final Position position; + private final TerraPlugin main; - public LootFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) { + public LootFunction(LootRegistry registry, Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) { + this.registry = registry; this.position = position; this.data = data; this.x = x; this.y = y; this.z = z; + this.main = main; } @Override @@ -32,7 +42,17 @@ public class LootFunction implements Function { public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); + RotationUtil.rotateVector(xz, rotation); + String id = data.apply(buffer, rotation, random, recursions); + LootTable table = registry.get(id); + + if(table == null) { + main.getLogger().severe("No such loot table " + id); + return null; + } + + buffer.addItem(new BufferedLootApplication(table, main), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index 7ba3ef3da..44a0dc3a8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -53,9 +53,10 @@ public class StructureFunction implements Function { RotationUtil.rotateVector(xz, rotation); - StructureScript script = registry.get(id.apply(buffer, rotation, random, recursions)); + String app = id.apply(buffer, rotation, random, recursions); + StructureScript script = registry.get(app); if(script == null) { - main.getLogger().severe("No such structure " + id.apply(buffer, rotation, random, recursions)); + main.getLogger().severe("No such structure " + app); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java index 0f76ac936..62261bf64 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java @@ -7,11 +7,11 @@ import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; import com.dfsek.terra.api.structures.structure.buffer.items.Mark; import net.jafama.FastMath; -import java.util.HashMap; +import java.util.LinkedHashMap; import java.util.Map; public class StructureBuffer implements Buffer { - private final Map bufferedItemMap = new HashMap<>(); + private final Map bufferedItemMap = new LinkedHashMap<>(); private final Location origin; private boolean succeeded; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java index f0b4652ef..4924e6b60 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java @@ -1,11 +1,29 @@ package com.dfsek.terra.api.structures.structure.buffer.items; +import com.dfsek.terra.api.loot.LootTable; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.state.BlockState; +import com.dfsek.terra.api.platform.block.state.Container; +import com.dfsek.terra.api.util.FastRandom; public class BufferedLootApplication implements BufferedItem { + private final LootTable table; + private final TerraPlugin main; + + public BufferedLootApplication(LootTable table, TerraPlugin main) { + this.table = table; + this.main = main; + } + @Override public void paste(Location origin) { - BlockData data = origin.getBlock().getBlockData(); + BlockState data = origin.getBlock().getState(); + if(!(data instanceof Container)) { + main.getLogger().severe("Failed to place loot at " + origin + "; block " + data.toString() + " is not container."); + return; + } + Container container = (Container) data; + table.fillInventory(container.getInventory(), new FastRandom(origin.hashCode())); } } diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 6de2e6ed2..46d421ada 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -155,7 +155,7 @@ public class ConfigPack implements LoaderRegistrar { } loader.open("structures/data", ".tesf").then(streams -> streams.forEach(stream -> { - StructureScript structureScript = new StructureScript(stream, main, scriptRegistry, checkCache); + StructureScript structureScript = new StructureScript(stream, main, scriptRegistry, lootRegistry, checkCache); scriptRegistry.add(structureScript.getId(), structureScript); })).close().open("structures/loot", ".json").thenEntries(entries -> { for(Map.Entry entry : entries) { diff --git a/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java index 857103336..19c418c80 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java @@ -8,6 +8,6 @@ import com.dfsek.terra.generation.items.TerraStructure; public class StructureFactory implements TerraFactory { @Override public TerraStructure build(StructureTemplate config, TerraPlugin main) throws LoadException { - return new TerraStructure(config.getStructures(), config.getY(), config.getSpawn(), config.getLoot(), config); + return new TerraStructure(config.getStructures(), config.getY(), config.getSpawn(), config); } } diff --git a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java index c4041fa62..1130bb984 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java @@ -4,7 +4,6 @@ import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.terra.api.loot.LootTable; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.structures.script.StructureScript; @@ -12,7 +11,6 @@ import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.procgen.GridSpawn; import java.util.List; -import java.util.Map; @SuppressWarnings({"unused", "FieldMayBeFinal"}) public class StructureTemplate extends AbstractableTemplate implements ConfigTemplate { @@ -31,19 +29,11 @@ public class StructureTemplate extends AbstractableTemplate implements ConfigTem @Abstractable private GridSpawn spawn; - @Value("loot") - @Abstractable - private Map loot; - @Value("features") @Abstractable @Default private List features = new GlueList<>(); - public Map getLoot() { - return loot; - } - public String getID() { return id; } diff --git a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java index a2e39dd97..fa327c9d8 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java @@ -1,26 +1,21 @@ package com.dfsek.terra.generation.items; -import com.dfsek.terra.api.loot.LootTable; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.procgen.GridSpawn; -import java.util.Map; - public class TerraStructure { private final ProbabilityCollection structure; private final Range spawnStart; private final GridSpawn spawn; - private final Map loot; private final StructureTemplate template; - public TerraStructure(ProbabilityCollection structures, Range spawnStart, GridSpawn spawn, Map loot, StructureTemplate template) { + public TerraStructure(ProbabilityCollection structures, Range spawnStart, GridSpawn spawn, StructureTemplate template) { this.structure = structures; this.spawnStart = spawnStart; this.spawn = spawn; - this.loot = loot; this.template = template; } @@ -39,8 +34,4 @@ public class TerraStructure { public GridSpawn getSpawn() { return spawn; } - - public Map getLoot() { - return loot; - } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java index ad933841a..49ba5ccee 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.data.BukkitEnumAdapter; +import com.dfsek.terra.bukkit.world.block.state.BukkitBlockState; public class BukkitBlock implements Block { private final org.bukkit.block.Block delegate; @@ -29,7 +30,7 @@ public class BukkitBlock implements Block { @Override public BlockState getState() { - return null; + return BukkitBlockState.newInstance(delegate.getState()); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java index 85e9e4183..c20b6182b 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.bukkit.world.block.BukkitBlock; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; +import org.bukkit.block.Container; public class BukkitBlockState implements BlockState { private final org.bukkit.block.BlockState delegate; @@ -14,6 +15,7 @@ public class BukkitBlockState implements BlockState { } public static BukkitBlockState newInstance(org.bukkit.block.BlockState block) { + if(block instanceof Container) return new BukkitContainer((Container) block); return new BukkitBlockState(block); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitInventory.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitInventory.java index 87e8aeb3d..f567bff01 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitInventory.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitInventory.java @@ -17,7 +17,8 @@ public class BukkitInventory implements Inventory { @Override public ItemStack getItem(int slot) { - return new BukkitItemStack(delegate.getItem(slot)); + org.bukkit.inventory.ItemStack itemStack = delegate.getItem(slot); + return itemStack == null ? null : new BukkitItemStack(itemStack); } @Override From 8da2b63f315b115519f151383e16aeb4985c1fc9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 1 Jan 2021 00:27:36 -0700 Subject: [PATCH 154/210] refactor --- .../com/dfsek/terra/api/{gaea => }/Gaea.java | 2 +- .../dfsek/terra/api/platform/TerraPlugin.java | 7 ++++-- .../com/dfsek/terra/api/platform/Tree.java | 4 ---- .../api/platform/handle/EntityHandle.java | 4 ++++ .../{inventory => handle}/ItemHandle.java | 3 ++- .../{world => handle}/WorldHandle.java | 4 ++-- .../dfsek/terra/api/platform/world/Tree.java | 6 +++++ .../dfsek/terra/api/platform/world/World.java | 1 - .../api/{ => structures}/loot/Entry.java | 8 +++---- .../api/{ => structures}/loot/LootTable.java | 2 +- .../terra/api/{ => structures}/loot/Pool.java | 2 +- .../loot/functions/AmountFunction.java | 2 +- .../loot/functions/DamageFunction.java | 2 +- .../loot/functions/Function.java | 2 +- .../script/functions/LootFunction.java | 2 +- .../buffer/items/BufferedLootApplication.java | 2 +- .../dfsek/terra/api/world/carving/Carver.java | 23 +------------------ .../population/PopulationManager.java | 2 +- .../world/tree/fractal/trees/IceSpike.java | 2 +- .../tree/fractal/trees/ShatteredTree.java | 2 +- .../fractal/trees/SmallShatteredTree.java | 2 +- .../dfsek/terra/config/base/ConfigPack.java | 2 +- .../generation/items/flora/TerraFlora.java | 2 +- .../items/ores/DeformedSphereOre.java | 2 +- .../generation/items/ores/VanillaOre.java | 2 +- .../dfsek/terra/population/CavePopulator.java | 2 +- .../dfsek/terra/registry/LootRegistry.java | 2 +- .../com/dfsek/terra/bukkit/BukkitPlayer.java | 1 + .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 15 +++++++++--- .../command/biome/BiomeInfoCommand.java | 2 +- .../geometry/DeformedSphereCommand.java | 2 +- .../command/geometry/SphereCommand.java | 2 +- .../command/command/geometry/TubeCommand.java | 2 +- .../command/command/profile/QueryCommand.java | 2 +- .../command/command/profile/ResetCommand.java | 2 +- .../command/command/profile/StartCommand.java | 2 +- .../command/command/profile/StopCommand.java | 2 +- .../command/structure/LocateCommand.java | 2 +- .../command/structure/SpawnCommand.java | 2 +- .../structure/load/LoadFullCommand.java | 4 ++-- .../structure/load/LoadRawCommand.java | 4 ++-- .../generator/BukkitChunkGenerator.java | 4 ++-- .../BukkitChunkGeneratorWrapper.java | 4 ++-- .../bukkit/generator/BukkitPopulator.java | 4 ++-- .../generator/BukkitPopulatorWrapper.java | 4 ++-- .../{ => handles}/BukkitItemHandle.java | 4 ++-- .../{ => handles}/BukkitWorldHandle.java | 6 ++--- .../terra/bukkit/listeners/EventListener.java | 2 +- .../terra/bukkit/util/BukkitConversions.java | 2 +- .../bukkit/{ => world}/BukkitBiomeGrid.java | 3 +-- .../terra/bukkit/{ => world}/BukkitChunk.java | 2 +- .../terra/bukkit/{ => world}/BukkitTree.java | 6 ++--- .../terra/bukkit/{ => world}/BukkitWorld.java | 4 ++-- .../terra/bukkit/world/block/BukkitBlock.java | 2 +- .../dfsek/terra/fabric/TerraFabricPlugin.java | 10 ++++++-- .../fabric/inventory/FabricItemHandle.java | 2 +- .../dfsek/terra/fabric/world/FabricTree.java | 2 +- .../terra/fabric/world/FabricWorldHandle.java | 4 ++-- .../fabric/world/handles/FabricWorld.java | 2 +- .../world/FabricSeededWorldAccess.java | 2 +- .../handles/world/FabricWorldAccess.java | 2 +- .../handles/world/FabricWorldChunkRegion.java | 2 +- 62 files changed, 108 insertions(+), 105 deletions(-) rename common/src/main/java/com/dfsek/terra/api/{gaea => }/Gaea.java (91%) delete mode 100644 common/src/main/java/com/dfsek/terra/api/platform/Tree.java create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/handle/EntityHandle.java rename common/src/main/java/com/dfsek/terra/api/platform/{inventory => handle}/ItemHandle.java (60%) rename common/src/main/java/com/dfsek/terra/api/platform/{world => handle}/WorldHandle.java (85%) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/Tree.java rename common/src/main/java/com/dfsek/terra/api/{ => structures}/loot/Entry.java (92%) rename common/src/main/java/com/dfsek/terra/api/{ => structures}/loot/LootTable.java (98%) rename common/src/main/java/com/dfsek/terra/api/{ => structures}/loot/Pool.java (97%) rename common/src/main/java/com/dfsek/terra/api/{ => structures}/loot/functions/AmountFunction.java (94%) rename common/src/main/java/com/dfsek/terra/api/{ => structures}/loot/functions/DamageFunction.java (96%) rename common/src/main/java/com/dfsek/terra/api/{ => structures}/loot/functions/Function.java (89%) rename platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/{ => handles}/BukkitItemHandle.java (84%) rename platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/{ => handles}/BukkitWorldHandle.java (91%) rename platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/{ => world}/BukkitBiomeGrid.java (92%) rename platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/{ => world}/BukkitChunk.java (95%) rename platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/{ => world}/BukkitTree.java (93%) rename platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/{ => world}/BukkitWorld.java (96%) diff --git a/common/src/main/java/com/dfsek/terra/api/gaea/Gaea.java b/common/src/main/java/com/dfsek/terra/api/Gaea.java similarity index 91% rename from common/src/main/java/com/dfsek/terra/api/gaea/Gaea.java rename to common/src/main/java/com/dfsek/terra/api/Gaea.java index 5254fe730..4c0890fca 100644 --- a/common/src/main/java/com/dfsek/terra/api/gaea/Gaea.java +++ b/common/src/main/java/com/dfsek/terra/api/Gaea.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.gaea; +package com.dfsek.terra.api; import com.dfsek.terra.api.platform.world.World; diff --git a/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java b/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java index b47890b4a..5721cf888 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java @@ -3,9 +3,10 @@ package com.dfsek.terra.api.platform; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.lang.Language; -import com.dfsek.terra.api.platform.inventory.ItemHandle; +import com.dfsek.terra.api.platform.handle.EntityHandle; +import com.dfsek.terra.api.platform.handle.ItemHandle; +import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.WorldHandle; import com.dfsek.terra.config.base.PluginConfig; import com.dfsek.terra.registry.ConfigRegistry; @@ -36,4 +37,6 @@ public interface TerraPlugin extends LoaderRegistrar { ItemHandle getItemHandle(); void saveDefaultConfig(); + + EntityHandle getEntityHandle(); } diff --git a/common/src/main/java/com/dfsek/terra/api/platform/Tree.java b/common/src/main/java/com/dfsek/terra/api/platform/Tree.java deleted file mode 100644 index a4f4a3d9e..000000000 --- a/common/src/main/java/com/dfsek/terra/api/platform/Tree.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra.api.platform; - -public interface Tree extends Handle, com.dfsek.terra.api.world.tree.Tree { -} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/handle/EntityHandle.java b/common/src/main/java/com/dfsek/terra/api/platform/handle/EntityHandle.java new file mode 100644 index 000000000..0661fbfa5 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/handle/EntityHandle.java @@ -0,0 +1,4 @@ +package com.dfsek.terra.api.platform.handle; + +public interface EntityHandle { +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemHandle.java b/common/src/main/java/com/dfsek/terra/api/platform/handle/ItemHandle.java similarity index 60% rename from common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemHandle.java rename to common/src/main/java/com/dfsek/terra/api/platform/handle/ItemHandle.java index a812cbc18..ce26fa2ac 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/inventory/ItemHandle.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/handle/ItemHandle.java @@ -1,6 +1,7 @@ -package com.dfsek.terra.api.platform.inventory; +package com.dfsek.terra.api.platform.handle; import com.dfsek.terra.api.platform.block.MaterialData; +import com.dfsek.terra.api.platform.inventory.ItemStack; public interface ItemHandle { ItemStack newItemStack(MaterialData material, int amount); diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/WorldHandle.java b/common/src/main/java/com/dfsek/terra/api/platform/handle/WorldHandle.java similarity index 85% rename from common/src/main/java/com/dfsek/terra/api/platform/world/WorldHandle.java rename to common/src/main/java/com/dfsek/terra/api/platform/handle/WorldHandle.java index 9f0cb7559..dd7f8e0f9 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/WorldHandle.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/handle/WorldHandle.java @@ -1,9 +1,9 @@ -package com.dfsek.terra.api.platform.world; +package com.dfsek.terra.api.platform.handle; -import com.dfsek.terra.api.platform.Tree; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; +import com.dfsek.terra.api.platform.world.Tree; /** * Interface to be implemented for world manipulation. diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/Tree.java b/common/src/main/java/com/dfsek/terra/api/platform/world/Tree.java new file mode 100644 index 000000000..c9a6a1cb5 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/Tree.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.api.platform.world; + +import com.dfsek.terra.api.platform.Handle; + +public interface Tree extends Handle, com.dfsek.terra.api.world.tree.Tree { +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/World.java b/common/src/main/java/com/dfsek/terra/api/platform/world/World.java index 38e5acd61..cdb10ceb3 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/World.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/World.java @@ -3,7 +3,6 @@ package com.dfsek.terra.api.platform.world; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Entity; import com.dfsek.terra.api.platform.Handle; -import com.dfsek.terra.api.platform.Tree; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; diff --git a/common/src/main/java/com/dfsek/terra/api/loot/Entry.java b/common/src/main/java/com/dfsek/terra/api/structures/loot/Entry.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/api/loot/Entry.java rename to common/src/main/java/com/dfsek/terra/api/structures/loot/Entry.java index 59528eb38..66a819baf 100644 --- a/common/src/main/java/com/dfsek/terra/api/loot/Entry.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/loot/Entry.java @@ -1,11 +1,11 @@ -package com.dfsek.terra.api.loot; +package com.dfsek.terra.api.structures.loot; -import com.dfsek.terra.api.loot.functions.AmountFunction; -import com.dfsek.terra.api.loot.functions.DamageFunction; -import com.dfsek.terra.api.loot.functions.Function; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.structures.loot.functions.AmountFunction; +import com.dfsek.terra.api.structures.loot.functions.DamageFunction; +import com.dfsek.terra.api.structures.loot.functions.Function; import com.dfsek.terra.api.util.GlueList; import net.jafama.FastMath; import org.json.simple.JSONArray; diff --git a/common/src/main/java/com/dfsek/terra/api/loot/LootTable.java b/common/src/main/java/com/dfsek/terra/api/structures/loot/LootTable.java similarity index 98% rename from common/src/main/java/com/dfsek/terra/api/loot/LootTable.java rename to common/src/main/java/com/dfsek/terra/api/structures/loot/LootTable.java index eb4be5f8c..9e57de215 100644 --- a/common/src/main/java/com/dfsek/terra/api/loot/LootTable.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/loot/LootTable.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.loot; +package com.dfsek.terra.api.structures.loot; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.inventory.Inventory; diff --git a/common/src/main/java/com/dfsek/terra/api/loot/Pool.java b/common/src/main/java/com/dfsek/terra/api/structures/loot/Pool.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/api/loot/Pool.java rename to common/src/main/java/com/dfsek/terra/api/structures/loot/Pool.java index 899d55ec6..d45be375f 100644 --- a/common/src/main/java/com/dfsek/terra/api/loot/Pool.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/loot/Pool.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.loot; +package com.dfsek.terra.api.structures.loot; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.platform.TerraPlugin; diff --git a/common/src/main/java/com/dfsek/terra/api/loot/functions/AmountFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/AmountFunction.java similarity index 94% rename from common/src/main/java/com/dfsek/terra/api/loot/functions/AmountFunction.java rename to common/src/main/java/com/dfsek/terra/api/structures/loot/functions/AmountFunction.java index cacfdb9bd..b268fb637 100644 --- a/common/src/main/java/com/dfsek/terra/api/loot/functions/AmountFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/AmountFunction.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.loot.functions; +package com.dfsek.terra.api.structures.loot.functions; import com.dfsek.terra.api.platform.inventory.ItemStack; diff --git a/common/src/main/java/com/dfsek/terra/api/loot/functions/DamageFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/DamageFunction.java similarity index 96% rename from common/src/main/java/com/dfsek/terra/api/loot/functions/DamageFunction.java rename to common/src/main/java/com/dfsek/terra/api/structures/loot/functions/DamageFunction.java index 948967ad0..3afb8ecdb 100644 --- a/common/src/main/java/com/dfsek/terra/api/loot/functions/DamageFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/DamageFunction.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.loot.functions; +package com.dfsek.terra.api.structures.loot.functions; import com.dfsek.terra.api.platform.inventory.ItemStack; import com.dfsek.terra.api.platform.inventory.item.Damageable; diff --git a/common/src/main/java/com/dfsek/terra/api/loot/functions/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/Function.java similarity index 89% rename from common/src/main/java/com/dfsek/terra/api/loot/functions/Function.java rename to common/src/main/java/com/dfsek/terra/api/structures/loot/functions/Function.java index 643310626..b3993abe6 100644 --- a/common/src/main/java/com/dfsek/terra/api/loot/functions/Function.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/Function.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.loot.functions; +package com.dfsek.terra.api.structures.loot.functions; import com.dfsek.terra.api.platform.inventory.ItemStack; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java index cecc70a88..fd4467d65 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java @@ -1,9 +1,9 @@ package com.dfsek.terra.api.structures.script.functions; -import com.dfsek.terra.api.loot.LootTable; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.structure.Rotation; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java index 4924e6b60..bf2d2c2f6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java @@ -1,10 +1,10 @@ package com.dfsek.terra.api.structures.structure.buffer.items; -import com.dfsek.terra.api.loot.LootTable; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.api.platform.block.state.Container; +import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.util.FastRandom; public class BufferedLootApplication implements BufferedItem { diff --git a/common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java b/common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java index e7d75133a..c0b21ae26 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java +++ b/common/src/main/java/com/dfsek/terra/api/world/carving/Carver.java @@ -1,9 +1,7 @@ package com.dfsek.terra.api.world.carving; -import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.util.FastRandom; import net.jafama.FastMath; import java.util.Random; @@ -20,26 +18,7 @@ public abstract class Carver { this.maxY = maxY; } - public void carve(int chunkX, int chunkZ, World w, BiConsumer consumer) { - for(int x = chunkX - carvingRadius; x <= chunkX + carvingRadius; x++) { - for(int z = chunkZ - carvingRadius; z <= chunkZ + carvingRadius; z++) { - if(isChunkCarved(w, x, z, new FastRandom(MathUtil.hashToLong(this.getClass().getName() + "_" + x + "&" + z)))) { - long seed = MathUtil.getCarverChunkSeed(x, z, w.getSeed()); - Random r = new FastRandom(seed); - Worm carving = getWorm(seed, new Vector3((x << 4) + r.nextInt(16), r.nextInt(maxY - minY + 1) + minY, (z << 4) + r.nextInt(16))); - Vector3 origin = carving.getOrigin(); - for(int i = 0; i < carving.getLength(); i++) { - carving.step(); - if(carving.getRunning().clone().setY(0).distanceSquared(origin.clone().setY(0)) > sixtyFourSq) - break; - if(FastMath.floorDiv(origin.getBlockX(), 16) != chunkX && FastMath.floorDiv(origin.getBlockZ(), 16) != chunkZ) - continue; - carving.getPoint().carve(chunkX, chunkZ, consumer); - } - } - } - } - } + public abstract void carve(int chunkX, int chunkZ, World w, BiConsumer consumer); public int getCarvingRadius() { return carvingRadius; diff --git a/common/src/main/java/com/dfsek/terra/api/world/generation/population/PopulationManager.java b/common/src/main/java/com/dfsek/terra/api/world/generation/population/PopulationManager.java index 4be710a6b..dba3643a2 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/generation/population/PopulationManager.java +++ b/common/src/main/java/com/dfsek/terra/api/world/generation/population/PopulationManager.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.world.generation.population; -import com.dfsek.terra.api.gaea.Gaea; +import com.dfsek.terra.api.Gaea; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java index 35b1d0c83..ea45144dd 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/IceSpike.java @@ -5,7 +5,7 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.api.world.tree.fractal.TreeGeometry; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java index a65f54538..50839b746 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/ShatteredTree.java @@ -5,7 +5,7 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.api.world.tree.fractal.TreeGeometry; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java index 575542912..50e681870 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/trees/SmallShatteredTree.java @@ -5,7 +5,7 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.world.tree.fractal.FractalTree; import com.dfsek.terra.api.world.tree.fractal.TreeGeometry; import com.dfsek.terra.util.MaterialSet; diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 46d421ada..f1ba1c6f5 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -6,8 +6,8 @@ import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.LoaderRegistrar; -import com.dfsek.terra.api.loot.LootTable; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.structures.world.CheckCache; import com.dfsek.terra.api.world.biome.Biome; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java b/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java index bcb72ce54..ce700c3e8 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java @@ -9,8 +9,8 @@ import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Directional; import com.dfsek.terra.api.platform.block.data.MultipleFacing; import com.dfsek.terra.api.platform.block.data.Rotatable; +import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.WorldHandle; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.api.world.flora.Flora; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java index c8f72a584..94332344d 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java @@ -6,8 +6,8 @@ import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.WorldHandle; import com.dfsek.terra.util.MaterialSet; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java b/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java index 98e549e13..4e1f5364c 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java @@ -5,8 +5,8 @@ import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Chunk; -import com.dfsek.terra.api.platform.world.WorldHandle; import com.dfsek.terra.util.MaterialSet; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/population/CavePopulator.java b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java index a04c86005..208211b07 100644 --- a/common/src/main/java/com/dfsek/terra/population/CavePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java @@ -6,9 +6,9 @@ import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; +import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.WorldHandle; import com.dfsek.terra.api.profiler.ProfileFuture; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.carving.UserDefinedCarver; diff --git a/common/src/main/java/com/dfsek/terra/registry/LootRegistry.java b/common/src/main/java/com/dfsek/terra/registry/LootRegistry.java index a824c9d31..0104bb66c 100644 --- a/common/src/main/java/com/dfsek/terra/registry/LootRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/LootRegistry.java @@ -1,6 +1,6 @@ package com.dfsek.terra.registry; -import com.dfsek.terra.api.loot.LootTable; +import com.dfsek.terra.api.structures.loot.LootTable; public class LootRegistry extends TerraRegistry { } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java index 026277941..e24a75eec 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java @@ -2,6 +2,7 @@ package com.dfsek.terra.bukkit; import com.dfsek.terra.api.Player; import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.bukkit.world.BukkitWorld; public class BukkitPlayer implements Player { private final org.bukkit.entity.Player delegate; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 7abefd247..1c4c4de05 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -5,23 +5,27 @@ import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.GenericLoaders; import com.dfsek.terra.api.lang.Language; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.Tree; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; -import com.dfsek.terra.api.platform.inventory.ItemHandle; +import com.dfsek.terra.api.platform.handle.EntityHandle; +import com.dfsek.terra.api.platform.handle.ItemHandle; +import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Biome; +import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.WorldHandle; import com.dfsek.terra.api.transform.MapTransform; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.command.command.TerraCommand; import com.dfsek.terra.bukkit.command.command.structure.LocateCommand; import com.dfsek.terra.bukkit.generator.BukkitChunkGenerator; import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; +import com.dfsek.terra.bukkit.handles.BukkitItemHandle; +import com.dfsek.terra.bukkit.handles.BukkitWorldHandle; import com.dfsek.terra.bukkit.listeners.EventListener; import com.dfsek.terra.bukkit.listeners.SpigotListener; import com.dfsek.terra.bukkit.util.PaperUtil; import com.dfsek.terra.bukkit.world.BukkitBiome; +import com.dfsek.terra.bukkit.world.BukkitTree; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.PluginConfig; import com.dfsek.terra.config.lang.LangUtil; @@ -70,6 +74,11 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { return itemHandle; } + @Override + public EntityHandle getEntityHandle() { + return null; + } + public void setHandle(WorldHandle handle) { getLogger().warning("|-------------------------------------------------------|"); getLogger().warning("A third-party addon has injected a custom WorldHandle!"); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java index 7208bf296..37a72b0fc 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java @@ -2,8 +2,8 @@ package com.dfsek.terra.bukkit.command.command.biome; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.bukkit.BukkitCommandSender; -import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.lang.LangUtil; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java index 6e363bf0f..e8c677fcb 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java @@ -4,8 +4,8 @@ import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitPlayer; -import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.PlayerCommand; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.procgen.voxel.DeformedSphere; import org.bukkit.command.Command; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java index 0bc1b5883..f0bebfa1f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java @@ -3,8 +3,8 @@ package com.dfsek.terra.bukkit.command.command.geometry; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitPlayer; -import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.PlayerCommand; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.procgen.voxel.Sphere; import org.bukkit.command.Command; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java index 0d1385771..6f4e7db47 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java @@ -2,10 +2,10 @@ package com.dfsek.terra.bukkit.command.command.geometry; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.bukkit.BukkitCommandSender; -import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.PlayerCommand; import com.dfsek.terra.bukkit.structure.WorldEditUtil; import com.dfsek.terra.bukkit.util.BukkitConversions; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.procgen.voxel.Tube; import org.bukkit.Location; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java index 84ae1624a..8987d6636 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java @@ -1,8 +1,8 @@ package com.dfsek.terra.bukkit.command.command.profile; import com.dfsek.terra.api.profiler.WorldProfiler; -import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.world.BukkitWorld; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java index f86224dc9..19d687d47 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java @@ -2,8 +2,8 @@ package com.dfsek.terra.bukkit.command.command.profile; import com.dfsek.terra.api.profiler.WorldProfiler; import com.dfsek.terra.bukkit.BukkitCommandSender; -import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java index 8a6a077a2..8dd41ce67 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java @@ -2,8 +2,8 @@ package com.dfsek.terra.bukkit.command.command.profile; import com.dfsek.terra.api.profiler.WorldProfiler; import com.dfsek.terra.bukkit.BukkitCommandSender; -import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java index 2477d52ae..39dea2544 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java @@ -2,8 +2,8 @@ package com.dfsek.terra.bukkit.command.command.profile; import com.dfsek.terra.api.profiler.WorldProfiler; import com.dfsek.terra.bukkit.BukkitCommandSender; -import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java index a9badebe7..00585091c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java @@ -4,9 +4,9 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.async.AsyncStructureFinder; import com.dfsek.terra.bukkit.BukkitCommandSender; -import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.TerraBukkitPlugin; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.generation.items.TerraStructure; import net.md_5.bungee.api.ChatColor; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java index f604a5f5b..0942b6170 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java @@ -6,9 +6,9 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer; import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.util.FastRandom; -import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.world.BukkitWorld; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.Command; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java index b16ba77f9..b6021146e 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java @@ -4,9 +4,9 @@ import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.util.FastRandom; -import com.dfsek.terra.bukkit.BukkitChunk; -import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; +import com.dfsek.terra.bukkit.world.BukkitChunk; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.util.PopulationUtil; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index 1a0008cb3..b57981e2d 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -4,9 +4,9 @@ import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.util.FastRandom; -import com.dfsek.terra.bukkit.BukkitChunk; -import com.dfsek.terra.bukkit.BukkitWorld; import com.dfsek.terra.bukkit.command.DebugCommand; +import com.dfsek.terra.bukkit.world.BukkitChunk; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.util.PopulationUtil; import org.bukkit.block.Sign; import org.bukkit.command.Command; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java index da5979414..624354589 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGenerator.java @@ -5,8 +5,8 @@ import com.dfsek.terra.api.platform.generator.BlockPopulator; import com.dfsek.terra.api.platform.world.BiomeGrid; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; -import com.dfsek.terra.bukkit.BukkitBiomeGrid; -import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitBiomeGrid; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index 695535ef4..9010fce42 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -5,8 +5,8 @@ import com.dfsek.terra.api.platform.generator.GeneratorWrapper; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.generation.population.PopulationManager; -import com.dfsek.terra.bukkit.BukkitBiomeGrid; -import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitBiomeGrid; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.MasterChunkGenerator; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulator.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulator.java index dae8b73fc..a8f72122f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulator.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulator.java @@ -3,8 +3,8 @@ package com.dfsek.terra.bukkit.generator; import com.dfsek.terra.api.platform.generator.BlockPopulator; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.bukkit.BukkitChunk; -import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitChunk; +import com.dfsek.terra.bukkit.world.BukkitWorld; import java.util.Random; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java index 566de2470..6a3a9a238 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java @@ -1,8 +1,8 @@ package com.dfsek.terra.bukkit.generator; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; -import com.dfsek.terra.bukkit.BukkitChunk; -import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitChunk; +import com.dfsek.terra.bukkit.world.BukkitWorld; import org.bukkit.Chunk; import org.bukkit.World; import org.bukkit.generator.BlockPopulator; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitItemHandle.java similarity index 84% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitItemHandle.java index fa6d7fd3b..8116e2f80 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitItemHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitItemHandle.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.bukkit; +package com.dfsek.terra.bukkit.handles; import com.dfsek.terra.api.platform.block.MaterialData; -import com.dfsek.terra.api.platform.inventory.ItemHandle; +import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.inventory.ItemStack; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.bukkit.world.inventory.BukkitItemStack; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java similarity index 91% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java index 1a2843ad9..f9d6e4c77 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java @@ -1,11 +1,11 @@ -package com.dfsek.terra.bukkit; +package com.dfsek.terra.bukkit.handles; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.Tree; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; -import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.handle.WorldHandle; +import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java index e56821ff0..59c5f12ec 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.transform.MapTransform; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.tree.Tree; -import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.registry.TreeRegistry; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java index 6ad2f0cfc..9d0673950 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java @@ -1,7 +1,7 @@ package com.dfsek.terra.bukkit.util; import com.dfsek.terra.api.math.vector.Vector3; -import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitWorld; import org.bukkit.Location; import org.bukkit.util.Vector; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitBiomeGrid.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeGrid.java similarity index 92% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitBiomeGrid.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeGrid.java index 649cafd57..da1fdfc51 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitBiomeGrid.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitBiomeGrid.java @@ -1,8 +1,7 @@ -package com.dfsek.terra.bukkit; +package com.dfsek.terra.bukkit.world; import com.dfsek.terra.api.platform.world.Biome; import com.dfsek.terra.api.platform.world.BiomeGrid; -import com.dfsek.terra.bukkit.world.BukkitBiome; import org.bukkit.generator.ChunkGenerator; import org.jetbrains.annotations.NotNull; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitChunk.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitChunk.java similarity index 95% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitChunk.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitChunk.java index e74cb3b86..da42f8266 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitChunk.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitChunk.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit; +package com.dfsek.terra.bukkit.world; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.world.Chunk; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java similarity index 93% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java index 19ded559c..cef57c41f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitTree.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java @@ -1,10 +1,10 @@ -package com.dfsek.terra.bukkit; +package com.dfsek.terra.bukkit.world; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.Tree; import com.dfsek.terra.api.platform.block.MaterialData; -import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.handle.WorldHandle; +import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.bukkit.util.BukkitConversions; import com.dfsek.terra.util.MaterialSet; import org.bukkit.TreeType; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorld.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java similarity index 96% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorld.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java index 34beda546..33f41de53 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitWorld.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java @@ -1,10 +1,10 @@ -package com.dfsek.terra.bukkit; +package com.dfsek.terra.bukkit.world; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.Tree; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.bukkit.generator.BukkitChunkGenerator; import com.dfsek.terra.bukkit.world.block.BukkitBlock; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java index 49ba5ccee..04f56e999 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java @@ -6,7 +6,7 @@ import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.block.state.BlockState; -import com.dfsek.terra.bukkit.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.data.BukkitEnumAdapter; import com.dfsek.terra.bukkit.world.block.state.BukkitBlockState; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 21633edad..7f191059b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -7,9 +7,10 @@ import com.dfsek.terra.api.lang.Language; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; -import com.dfsek.terra.api.platform.inventory.ItemHandle; +import com.dfsek.terra.api.platform.handle.EntityHandle; +import com.dfsek.terra.api.platform.handle.ItemHandle; +import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.api.platform.world.WorldHandle; import com.dfsek.terra.api.transform.MapTransform; import com.dfsek.terra.api.transform.NotNullValidator; import com.dfsek.terra.api.transform.Transformer; @@ -177,6 +178,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } } + @Override + public EntityHandle getEntityHandle() { + return null; + } + Transformer biomeFixer = new Transformer.Builder() .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse(id)), new NotNullValidator<>()) .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse("minecraft:" + id.toLowerCase())), new NotNullValidator<>()).build(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java index 35d5b5869..203be849b 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java @@ -1,7 +1,7 @@ package com.dfsek.terra.fabric.inventory; import com.dfsek.terra.api.platform.block.MaterialData; -import com.dfsek.terra.api.platform.inventory.ItemHandle; +import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.inventory.ItemStack; public class FabricItemHandle implements ItemHandle { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java index 99546947f..4006afd73 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricTree.java @@ -1,8 +1,8 @@ package com.dfsek.terra.fabric.world; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.Tree; import com.dfsek.terra.api.platform.block.MaterialData; +import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import com.dfsek.terra.fabric.world.handles.world.FabricWorldAccess; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index e2c411429..266bab2e3 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -1,10 +1,10 @@ package com.dfsek.terra.fabric.world; -import com.dfsek.terra.api.platform.Tree; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; -import com.dfsek.terra.api.platform.world.WorldHandle; +import com.dfsek.terra.api.platform.handle.WorldHandle; +import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricMaterialData; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java index dad97da57..36e77afeb 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java @@ -2,10 +2,10 @@ package com.dfsek.terra.fabric.world.handles; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Entity; -import com.dfsek.terra.api.platform.Tree; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.handles.chunk.FabricChunk; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java index 987be26c9..813e6d9a1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java @@ -2,10 +2,10 @@ package com.dfsek.terra.fabric.world.handles.world; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Entity; -import com.dfsek.terra.api.platform.Tree; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index 09e3222bc..b292a0391 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -2,10 +2,10 @@ package com.dfsek.terra.fabric.world.handles.world; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Entity; -import com.dfsek.terra.api.platform.Tree; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java index cb46e53e7..e8c31f5b2 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java @@ -2,10 +2,10 @@ package com.dfsek.terra.fabric.world.handles.world; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.Entity; -import com.dfsek.terra.api.platform.Tree; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; From 044aa738a3fad066a9f59afa1f1cea3045916f2a Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 1 Jan 2021 01:50:01 -0700 Subject: [PATCH 155/210] cleanup & add entity support --- .../com/dfsek/terra/api/platform/Entity.java | 4 ---- .../dfsek/terra/api/platform/TerraPlugin.java | 3 --- .../terra/api/platform/handle/EntityHandle.java | 4 ---- .../terra/api/platform/handle/WorldHandle.java | 3 +++ .../dfsek/terra/api/platform/world/World.java | 8 ++++---- .../terra/api/platform/world/entity/Entity.java | 6 ++++++ .../api/platform/world/entity/EntityType.java | 6 ++++++ .../world/tree/fractal/EntitySpawnHolder.java | 2 +- .../api/world/tree/fractal/FractalTree.java | 7 ++++--- .../com/dfsek/terra/bukkit/BukkitEntity.java | 2 +- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 6 ------ .../bukkit/command/command/FixChunkCommand.java | 2 +- .../command/command/structure/LocateCommand.java | 4 ++-- .../command/structure/load/LoadCommand.java | 4 +--- .../command/structure/load/LoadFullCommand.java | 6 +++--- .../command/structure/load/LoadRawCommand.java | 4 ++-- .../terra/bukkit/handles/BukkitWorldHandle.java | 7 +++++++ ...BukkitEnumAdapter.java => BukkitAdapter.java} | 13 +++++++++++-- .../dfsek/terra/bukkit/world/BukkitWorld.java | 7 ++++++- .../terra/bukkit/world/block/BukkitBlock.java | 6 +++--- .../world/block/data/BukkitDirectional.java | 5 +++-- .../world/block/data/BukkitMultipleFacing.java | 9 +++++---- .../world/block/data/BukkitOrientable.java | 7 ++++--- .../bukkit/world/block/data/BukkitRail.java | 5 +++-- .../world/block/data/BukkitRedstoneWire.java | 7 ++++--- .../bukkit/world/block/data/BukkitRotatable.java | 5 +++-- .../bukkit/world/block/data/BukkitSlab.java | 5 +++-- .../bukkit/world/block/data/BukkitStairs.java | 13 +++++++------ .../bukkit/world/block/data/BukkitWall.java | 5 +++-- .../bukkit/world/entity/BukkitEntityType.java | 16 ++++++++++++++++ .../dfsek/terra/fabric/TerraFabricPlugin.java | 6 ------ .../terra/fabric/world/FabricWorldHandle.java | 6 ++++++ .../terra/fabric/world/handles/FabricWorld.java | 10 +++++----- .../handles/world/FabricSeededWorldAccess.java | 8 ++++---- .../world/handles/world/FabricWorldAccess.java | 8 ++++---- .../handles/world/FabricWorldChunkRegion.java | 8 ++++---- 36 files changed, 135 insertions(+), 92 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/api/platform/Entity.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/platform/handle/EntityHandle.java create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/entity/Entity.java create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/world/entity/EntityType.java rename platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/{block/data/BukkitEnumAdapter.java => BukkitAdapter.java} (95%) create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/entity/BukkitEntityType.java diff --git a/common/src/main/java/com/dfsek/terra/api/platform/Entity.java b/common/src/main/java/com/dfsek/terra/api/platform/Entity.java deleted file mode 100644 index b29d81bc6..000000000 --- a/common/src/main/java/com/dfsek/terra/api/platform/Entity.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra.api.platform; - -public interface Entity extends Handle { -} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java b/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java index 5721cf888..317fa40f8 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java @@ -3,7 +3,6 @@ package com.dfsek.terra.api.platform; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.lang.Language; -import com.dfsek.terra.api.platform.handle.EntityHandle; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.World; @@ -37,6 +36,4 @@ public interface TerraPlugin extends LoaderRegistrar { ItemHandle getItemHandle(); void saveDefaultConfig(); - - EntityHandle getEntityHandle(); } diff --git a/common/src/main/java/com/dfsek/terra/api/platform/handle/EntityHandle.java b/common/src/main/java/com/dfsek/terra/api/platform/handle/EntityHandle.java deleted file mode 100644 index 0661fbfa5..000000000 --- a/common/src/main/java/com/dfsek/terra/api/platform/handle/EntityHandle.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra.api.platform.handle; - -public interface EntityHandle { -} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/handle/WorldHandle.java b/common/src/main/java/com/dfsek/terra/api/platform/handle/WorldHandle.java index dd7f8e0f9..c03cda1bf 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/handle/WorldHandle.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/handle/WorldHandle.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.world.Tree; +import com.dfsek.terra.api.platform.world.entity.EntityType; /** * Interface to be implemented for world manipulation. @@ -20,4 +21,6 @@ public interface WorldHandle { MaterialData createMaterialData(String data); Tree getTree(String id); + + EntityType getEntity(String id); } diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/World.java b/common/src/main/java/com/dfsek/terra/api/platform/world/World.java index cdb10ceb3..52ff12e25 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/world/World.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/World.java @@ -1,14 +1,14 @@ package com.dfsek.terra.api.platform.world; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.Entity; import com.dfsek.terra.api.platform.Handle; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.entity.Entity; +import com.dfsek.terra.api.platform.world.entity.EntityType; import java.io.File; import java.util.UUID; -import java.util.function.Consumer; public interface World extends Handle { long getSeed(); @@ -31,7 +31,7 @@ public interface World extends Handle { Block getBlockAt(Location l); - boolean generateTree(Location l, Tree vanillaTreeType); // TODO: Bukkit treetype is bad + boolean generateTree(Location l, Tree vanillaTreeType); - void spawn(Location location, Class entity, Consumer consumer); // TODO: Bukkit Entity is bad + Entity spawnEntity(Location location, EntityType entityType); } diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/entity/Entity.java b/common/src/main/java/com/dfsek/terra/api/platform/world/entity/Entity.java new file mode 100644 index 000000000..2972749d5 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/entity/Entity.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.api.platform.world.entity; + +import com.dfsek.terra.api.platform.Handle; + +public interface Entity extends Handle { +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/world/entity/EntityType.java b/common/src/main/java/com/dfsek/terra/api/platform/world/entity/EntityType.java new file mode 100644 index 000000000..45699b60b --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/world/entity/EntityType.java @@ -0,0 +1,6 @@ +package com.dfsek.terra.api.platform.world.entity; + +import com.dfsek.terra.api.platform.Handle; + +public interface EntityType extends Handle { +} diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/EntitySpawnHolder.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/EntitySpawnHolder.java index e51941c19..ed485dd60 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/EntitySpawnHolder.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/EntitySpawnHolder.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.world.tree.fractal; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.Entity; +import com.dfsek.terra.api.platform.world.entity.Entity; import java.util.function.Consumer; diff --git a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/FractalTree.java b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/FractalTree.java index 9269012ab..76be0e183 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/FractalTree.java +++ b/common/src/main/java/com/dfsek/terra/api/world/tree/fractal/FractalTree.java @@ -1,9 +1,10 @@ package com.dfsek.terra.api.world.tree.fractal; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.Entity; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.world.entity.Entity; +import com.dfsek.terra.api.platform.world.entity.EntityType; import com.dfsek.terra.util.MaterialSet; import java.util.Random; @@ -41,7 +42,7 @@ public abstract class FractalTree { */ public abstract void grow(Location origin, Random random); - public void spawnEntity(Location spawn, Class clazz, Consumer consumer) { - spawn.getWorld().spawn(spawn, clazz, consumer); + public void spawnEntity(Location spawn, EntityType type, Consumer consumer) { + consumer.accept(spawn.getWorld().spawnEntity(spawn, type)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java index 587b48246..5ef812e0f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitEntity.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit; -import com.dfsek.terra.api.platform.Entity; +import com.dfsek.terra.api.platform.world.entity.Entity; public class BukkitEntity implements Entity { private final org.bukkit.entity.Entity entity; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 1c4c4de05..80f53a76c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -7,7 +7,6 @@ import com.dfsek.terra.api.lang.Language; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; -import com.dfsek.terra.api.platform.handle.EntityHandle; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Biome; @@ -74,11 +73,6 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { return itemHandle; } - @Override - public EntityHandle getEntityHandle() { - return null; - } - public void setHandle(WorldHandle handle) { getLogger().warning("|-------------------------------------------------------|"); getLogger().warning("A third-party addon has injected a custom WorldHandle!"); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/FixChunkCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/FixChunkCommand.java index 737ffa0ea..d666ece29 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/FixChunkCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/FixChunkCommand.java @@ -17,7 +17,7 @@ public class FixChunkCommand extends WorldCommand { @Override public boolean execute(@NotNull Player player, @NotNull Command command, @NotNull String s, @NotNull String[] strings, World world) { - //TerraChunkGenerator.fixChunk(player.getLocation().getChunk()); + //MasterChunkGenerator.fixChunk(player.getLocation().getChunk()); return true; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java index 00585091c..0472ebac0 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java @@ -1,11 +1,11 @@ package com.dfsek.terra.bukkit.command.command.structure; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.async.AsyncStructureFinder; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.TerraBukkitPlugin; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.generation.items.TerraStructure; @@ -53,7 +53,7 @@ public class LocateCommand extends WorldCommand { //LangUtil.send("command.structure.invalid", sender, id); return true; } - Bukkit.getScheduler().runTaskAsynchronously((TerraBukkitPlugin) getMain(), new AsyncStructureFinder(getMain().getWorld(new BukkitWorld(world)).getGrid(), s, new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), 0, maxRadius, (location) -> { + Bukkit.getScheduler().runTaskAsynchronously((TerraBukkitPlugin) getMain(), new AsyncStructureFinder(getMain().getWorld(new BukkitWorld(world)).getGrid(), s, BukkitAdapter.adapt(sender.getLocation()), 0, maxRadius, (location) -> { if(sender.isOnline()) { if(location != null) { ComponentBuilder cm = new ComponentBuilder(String.format("The nearest %s is at ", id.toLowerCase())) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadCommand.java index ea842cc51..d83a39a94 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadCommand.java @@ -23,9 +23,7 @@ public class LoadCommand extends PlayerCommand implements DebugCommand { List names = new ArrayList<>(); TerraWorld terraWorld = getMain().getWorld(world); - terraWorld.getConfig().getScriptRegistry().forEach(script -> { - names.add(script.getId()); - }); + terraWorld.getConfig().getScriptRegistry().forEach(script -> names.add(script.getId())); return names; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java index b6021146e..cafacf131 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java @@ -1,10 +1,10 @@ package com.dfsek.terra.bukkit.command.command.structure.load; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.bukkit.command.DebugCommand; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.BukkitChunk; import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.util.PopulationUtil; @@ -33,9 +33,9 @@ public class LoadFullCommand extends LoadCommand implements DebugCommand { FastRandom chunk = PopulationUtil.getRandom(new BukkitChunk(sender.getLocation().getChunk())); if(this.chunk) { - terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), new BukkitChunk(sender.getLocation().getChunk()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); + terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(BukkitAdapter.adapt(sender.getLocation()), new BukkitChunk(sender.getLocation().getChunk()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); } else { - terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); + terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(BukkitAdapter.adapt(sender.getLocation()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); } long l = System.nanoTime() - t; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index b57981e2d..eaccda40a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -1,10 +1,10 @@ package com.dfsek.terra.bukkit.command.command.structure.load; import com.dfsek.terra.TerraWorld; -import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.bukkit.command.DebugCommand; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.BukkitChunk; import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.util.PopulationUtil; @@ -40,7 +40,7 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { long t = System.nanoTime(); FastRandom chunk = PopulationUtil.getRandom(new BukkitChunk(sender.getLocation().getChunk())); - boolean success = terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(new Location(new BukkitWorld(sender.getWorld()), sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); + boolean success = terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(BukkitAdapter.adapt(sender.getLocation()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); long l = System.nanoTime() - t; sender.sendMessage("Took " + ((double) l) / 1000000 + "ms. Success: " + success); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java index f9d6e4c77..6841a4e19 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitWorldHandle.java @@ -6,9 +6,11 @@ import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Tree; +import com.dfsek.terra.api.platform.world.entity.EntityType; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; +import com.dfsek.terra.bukkit.world.entity.BukkitEntityType; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -52,4 +54,9 @@ public class BukkitWorldHandle implements WorldHandle { public Tree getTree(String id) { return treeTransformer.translate(id); } + + @Override + public EntityType getEntity(String id) { + return new BukkitEntityType(org.bukkit.entity.EntityType.valueOf(id)); + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java similarity index 95% rename from platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java rename to platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java index c72128775..afb468173 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitEnumAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.bukkit.world.block.data; +package com.dfsek.terra.bukkit.world; import com.dfsek.terra.api.platform.block.Axis; @@ -8,12 +8,13 @@ import com.dfsek.terra.api.platform.block.data.Rail; import com.dfsek.terra.api.platform.block.data.RedstoneWire; import com.dfsek.terra.api.platform.block.data.Slab; import com.dfsek.terra.api.platform.block.data.Stairs; +import org.bukkit.Location; import org.bukkit.block.data.type.Wall; /** * Utility class to adapt Bukkit enums to Terra enums. */ -public final class BukkitEnumAdapter { +public final class BukkitAdapter { public static Stairs.Shape adapt(org.bukkit.block.data.type.Stairs.Shape shape) { switch(shape) { case STRAIGHT: @@ -318,4 +319,12 @@ public final class BukkitEnumAdapter { throw new IllegalStateException(); } } + + public static Location adapt(com.dfsek.terra.api.math.vector.Location location) { + return new Location(((BukkitWorld) location.getWorld()).getHandle(), location.getX(), location.getY(), location.getZ()); + } + + public static com.dfsek.terra.api.math.vector.Location adapt(Location location) { + return new com.dfsek.terra.api.math.vector.Location(new BukkitWorld(location.getWorld()), location.getX(), location.getY(), location.getZ()); + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java index 33f41de53..f2269b22d 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java @@ -6,8 +6,12 @@ import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.entity.Entity; +import com.dfsek.terra.api.platform.world.entity.EntityType; +import com.dfsek.terra.bukkit.BukkitEntity; import com.dfsek.terra.bukkit.generator.BukkitChunkGenerator; import com.dfsek.terra.bukkit.world.block.BukkitBlock; +import com.dfsek.terra.bukkit.world.entity.BukkitEntityType; import java.io.File; import java.util.UUID; @@ -75,7 +79,8 @@ public class BukkitWorld implements World { } @Override - public void spawn(Location l, Class entity, java.util.function.Consumer consumer) { + public Entity spawnEntity(Location location, EntityType entityType) { + return new BukkitEntity(delegate.spawnEntity(BukkitAdapter.adapt(location), ((BukkitEntityType) entityType).getHandle())); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java index 04f56e999..4acf8697a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java @@ -6,9 +6,9 @@ import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.block.state.BlockState; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; -import com.dfsek.terra.bukkit.world.block.data.BukkitEnumAdapter; import com.dfsek.terra.bukkit.world.block.state.BukkitBlockState; public class BukkitBlock implements Block { @@ -35,12 +35,12 @@ public class BukkitBlock implements Block { @Override public Block getRelative(BlockFace face) { - return new BukkitBlock(delegate.getRelative(BukkitEnumAdapter.adapt(face))); + return new BukkitBlock(delegate.getRelative(BukkitAdapter.adapt(face))); } @Override public Block getRelative(BlockFace face, int len) { - return new BukkitBlock(delegate.getRelative(BukkitEnumAdapter.adapt(face), len)); + return new BukkitBlock(delegate.getRelative(BukkitAdapter.adapt(face), len)); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java index 5ab504f26..13d610774 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitDirectional.java @@ -2,6 +2,7 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Directional; +import com.dfsek.terra.bukkit.world.BukkitAdapter; public class BukkitDirectional extends BukkitBlockData implements Directional { public BukkitDirectional(org.bukkit.block.data.Directional delegate) { @@ -10,11 +11,11 @@ public class BukkitDirectional extends BukkitBlockData implements Directional { @Override public BlockFace getFacing() { - return BukkitEnumAdapter.adapt(((org.bukkit.block.data.Directional) getHandle()).getFacing()); + return BukkitAdapter.adapt(((org.bukkit.block.data.Directional) getHandle()).getFacing()); } @Override public void setFacing(BlockFace facing) { - ((org.bukkit.block.data.Directional) getHandle()).setFacing(BukkitEnumAdapter.adapt(facing)); + ((org.bukkit.block.data.Directional) getHandle()).setFacing(BukkitAdapter.adapt(facing)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java index 9d31536ef..4e01a62f3 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitMultipleFacing.java @@ -2,6 +2,7 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.MultipleFacing; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import java.util.Set; import java.util.stream.Collectors; @@ -14,21 +15,21 @@ public class BukkitMultipleFacing extends BukkitBlockData implements MultipleFac @Override public Set getFaces() { - return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).getFaces().stream().map(BukkitEnumAdapter::adapt).collect(Collectors.toSet()); + return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).getFaces().stream().map(BukkitAdapter::adapt).collect(Collectors.toSet()); } @Override public void setFace(BlockFace face, boolean facing) { - ((org.bukkit.block.data.MultipleFacing) super.getHandle()).setFace(BukkitEnumAdapter.adapt(face), facing); + ((org.bukkit.block.data.MultipleFacing) super.getHandle()).setFace(BukkitAdapter.adapt(face), facing); } @Override public Set getAllowedFaces() { - return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).getAllowedFaces().stream().map(BukkitEnumAdapter::adapt).collect(Collectors.toSet()); + return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).getAllowedFaces().stream().map(BukkitAdapter::adapt).collect(Collectors.toSet()); } @Override public boolean hasFace(BlockFace f) { - return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).hasFace(BukkitEnumAdapter.adapt(f)); + return ((org.bukkit.block.data.MultipleFacing) super.getHandle()).hasFace(BukkitAdapter.adapt(f)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java index c4e147049..c6cfdca18 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitOrientable.java @@ -2,6 +2,7 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.Axis; import com.dfsek.terra.api.platform.block.data.Orientable; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import java.util.Set; import java.util.stream.Collectors; @@ -14,16 +15,16 @@ public class BukkitOrientable extends BukkitBlockData implements Orientable { @Override public Set getAxes() { - return ((org.bukkit.block.data.Orientable) getHandle()).getAxes().stream().map(BukkitEnumAdapter::adapt).collect(Collectors.toSet()); + return ((org.bukkit.block.data.Orientable) getHandle()).getAxes().stream().map(BukkitAdapter::adapt).collect(Collectors.toSet()); } @Override public Axis getAxis() { - return BukkitEnumAdapter.adapt(((org.bukkit.block.data.Orientable) getHandle()).getAxis()); + return BukkitAdapter.adapt(((org.bukkit.block.data.Orientable) getHandle()).getAxis()); } @Override public void setAxis(Axis axis) { - ((org.bukkit.block.data.Orientable) getHandle()).setAxis(BukkitEnumAdapter.adapt(axis)); + ((org.bukkit.block.data.Orientable) getHandle()).setAxis(BukkitAdapter.adapt(axis)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java index 36ba8b1b2..ae85d2b76 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRail.java @@ -1,6 +1,7 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.data.Rail; +import com.dfsek.terra.bukkit.world.BukkitAdapter; public class BukkitRail extends BukkitBlockData implements Rail { public BukkitRail(org.bukkit.block.data.Rail delegate) { @@ -9,11 +10,11 @@ public class BukkitRail extends BukkitBlockData implements Rail { @Override public Shape getShape() { - return BukkitEnumAdapter.adapt(((org.bukkit.block.data.Rail) getHandle()).getShape()); + return BukkitAdapter.adapt(((org.bukkit.block.data.Rail) getHandle()).getShape()); } @Override public void setShape(Shape newShape) { - ((org.bukkit.block.data.Rail) getHandle()).setShape(BukkitEnumAdapter.adapt(newShape)); + ((org.bukkit.block.data.Rail) getHandle()).setShape(BukkitAdapter.adapt(newShape)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRedstoneWire.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRedstoneWire.java index 05f28f2cf..708c1316b 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRedstoneWire.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRedstoneWire.java @@ -2,6 +2,7 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.RedstoneWire; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import java.util.Set; import java.util.stream.Collectors; @@ -13,16 +14,16 @@ public class BukkitRedstoneWire extends BukkitAnaloguePowerable implements Redst @Override public Set getAllowedFaces() { - return ((org.bukkit.block.data.type.RedstoneWire) getHandle()).getAllowedFaces().stream().map(BukkitEnumAdapter::adapt).collect(Collectors.toSet()); + return ((org.bukkit.block.data.type.RedstoneWire) getHandle()).getAllowedFaces().stream().map(BukkitAdapter::adapt).collect(Collectors.toSet()); } @Override public Connection getFace(BlockFace face) { - return BukkitEnumAdapter.adapt(((org.bukkit.block.data.type.RedstoneWire) getHandle()).getFace(BukkitEnumAdapter.adapt(face))); + return BukkitAdapter.adapt(((org.bukkit.block.data.type.RedstoneWire) getHandle()).getFace(BukkitAdapter.adapt(face))); } @Override public void setFace(BlockFace face, Connection connection) { - ((org.bukkit.block.data.type.RedstoneWire) getHandle()).setFace(BukkitEnumAdapter.adapt(face), BukkitEnumAdapter.adapt(connection)); + ((org.bukkit.block.data.type.RedstoneWire) getHandle()).setFace(BukkitAdapter.adapt(face), BukkitAdapter.adapt(connection)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java index 687bd14c5..0da5c04b9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitRotatable.java @@ -2,6 +2,7 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Rotatable; +import com.dfsek.terra.bukkit.world.BukkitAdapter; public class BukkitRotatable extends BukkitBlockData implements Rotatable { public BukkitRotatable(org.bukkit.block.data.Rotatable delegate) { @@ -10,11 +11,11 @@ public class BukkitRotatable extends BukkitBlockData implements Rotatable { @Override public BlockFace getRotation() { - return BukkitEnumAdapter.adapt(((org.bukkit.block.data.Rotatable) getHandle()).getRotation()); + return BukkitAdapter.adapt(((org.bukkit.block.data.Rotatable) getHandle()).getRotation()); } @Override public void setRotation(BlockFace face) { - ((org.bukkit.block.data.Rotatable) getHandle()).setRotation(BukkitEnumAdapter.adapt(face)); + ((org.bukkit.block.data.Rotatable) getHandle()).setRotation(BukkitAdapter.adapt(face)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java index d9c18efa0..6ddf160b3 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitSlab.java @@ -1,6 +1,7 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.data.Slab; +import com.dfsek.terra.bukkit.world.BukkitAdapter; public class BukkitSlab extends BukkitWaterlogged implements Slab { public BukkitSlab(org.bukkit.block.data.type.Slab delegate) { @@ -9,11 +10,11 @@ public class BukkitSlab extends BukkitWaterlogged implements Slab { @Override public Type getType() { - return BukkitEnumAdapter.adapt(((org.bukkit.block.data.type.Slab) getHandle()).getType()); + return BukkitAdapter.adapt(((org.bukkit.block.data.type.Slab) getHandle()).getType()); } @Override public void setType(Type type) { - ((org.bukkit.block.data.type.Slab) getHandle()).setType(BukkitEnumAdapter.adapt(type)); + ((org.bukkit.block.data.type.Slab) getHandle()).setType(BukkitAdapter.adapt(type)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java index 60de3ac7d..c54d4a993 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitStairs.java @@ -2,6 +2,7 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Stairs; +import com.dfsek.terra.bukkit.world.BukkitAdapter; public class BukkitStairs extends BukkitBlockData implements Stairs { @@ -11,32 +12,32 @@ public class BukkitStairs extends BukkitBlockData implements Stairs { @Override public Shape getShape() { - return BukkitEnumAdapter.adapt(((org.bukkit.block.data.type.Stairs) super.getHandle()).getShape()); + return BukkitAdapter.adapt(((org.bukkit.block.data.type.Stairs) super.getHandle()).getShape()); } @Override public void setShape(Shape shape) { - ((org.bukkit.block.data.type.Stairs) super.getHandle()).setShape(BukkitEnumAdapter.adapt(shape)); + ((org.bukkit.block.data.type.Stairs) super.getHandle()).setShape(BukkitAdapter.adapt(shape)); } @Override public Half getHalf() { - return BukkitEnumAdapter.adapt(((org.bukkit.block.data.type.Stairs) super.getHandle()).getHalf()); + return BukkitAdapter.adapt(((org.bukkit.block.data.type.Stairs) super.getHandle()).getHalf()); } @Override public void setHalf(Half half) { - ((org.bukkit.block.data.type.Stairs) super.getHandle()).setHalf(BukkitEnumAdapter.adapt(half)); + ((org.bukkit.block.data.type.Stairs) super.getHandle()).setHalf(BukkitAdapter.adapt(half)); } @Override public BlockFace getFacing() { - return BukkitEnumAdapter.adapt(((org.bukkit.block.data.type.Stairs) super.getHandle()).getFacing()); + return BukkitAdapter.adapt(((org.bukkit.block.data.type.Stairs) super.getHandle()).getFacing()); } @Override public void setFacing(BlockFace facing) { - ((org.bukkit.block.data.type.Stairs) super.getHandle()).setFacing(BukkitEnumAdapter.adapt(facing)); + ((org.bukkit.block.data.type.Stairs) super.getHandle()).setFacing(BukkitAdapter.adapt(facing)); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWall.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWall.java index f30ad5781..5fffd7802 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWall.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWall.java @@ -2,6 +2,7 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Wall; +import com.dfsek.terra.bukkit.world.BukkitAdapter; public class BukkitWall extends BukkitWaterlogged implements Wall { public BukkitWall(org.bukkit.block.data.type.Wall delegate) { @@ -20,11 +21,11 @@ public class BukkitWall extends BukkitWaterlogged implements Wall { @Override public void setHeight(BlockFace face, Height height) { - ((org.bukkit.block.data.type.Wall) getHandle()).setHeight(BukkitEnumAdapter.adapt(face), BukkitEnumAdapter.adapt(height)); + ((org.bukkit.block.data.type.Wall) getHandle()).setHeight(BukkitAdapter.adapt(face), BukkitAdapter.adapt(height)); } @Override public Height getHeight(BlockFace face) { - return BukkitEnumAdapter.adapt(((org.bukkit.block.data.type.Wall) getHandle()).getHeight(BukkitEnumAdapter.adapt(face))); + return BukkitAdapter.adapt(((org.bukkit.block.data.type.Wall) getHandle()).getHeight(BukkitAdapter.adapt(face))); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/entity/BukkitEntityType.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/entity/BukkitEntityType.java new file mode 100644 index 000000000..58732bada --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/entity/BukkitEntityType.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.bukkit.world.entity; + +import com.dfsek.terra.api.platform.world.entity.EntityType; + +public class BukkitEntityType implements EntityType { + private final org.bukkit.entity.EntityType delegate; + + public BukkitEntityType(org.bukkit.entity.EntityType delegate) { + this.delegate = delegate; + } + + @Override + public org.bukkit.entity.EntityType getHandle() { + return delegate; + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 7f191059b..310ee1985 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -7,7 +7,6 @@ import com.dfsek.terra.api.lang.Language; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; -import com.dfsek.terra.api.platform.handle.EntityHandle; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.World; @@ -178,11 +177,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } } - @Override - public EntityHandle getEntityHandle() { - return null; - } - Transformer biomeFixer = new Transformer.Builder() .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse(id)), new NotNullValidator<>()) .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse("minecraft:" + id.toLowerCase())), new NotNullValidator<>()).build(); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java index 266bab2e3..452a55e8a 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/FabricWorldHandle.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Tree; +import com.dfsek.terra.api.platform.world.entity.EntityType; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.fabric.world.block.FabricBlockData; import com.dfsek.terra.fabric.world.block.FabricMaterialData; @@ -75,4 +76,9 @@ public class FabricWorldHandle implements WorldHandle { public Tree getTree(String id) { return new FabricTree(treeTransformer.translate(id)); } + + @Override + public EntityType getEntity(String id) { + return null; + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java index 36e77afeb..5ac4f144c 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/FabricWorld.java @@ -1,12 +1,13 @@ package com.dfsek.terra.fabric.world.handles; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.Entity; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.entity.Entity; +import com.dfsek.terra.api.platform.world.entity.EntityType; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.handles.chunk.FabricChunk; import net.minecraft.server.world.ServerWorld; @@ -14,7 +15,6 @@ import net.minecraft.util.math.BlockPos; import java.io.File; import java.util.UUID; -import java.util.function.Consumer; public class FabricWorld implements World { @@ -92,8 +92,8 @@ public class FabricWorld implements World { } @Override - public void spawn(Location location, Class entity, Consumer consumer) { - + public Entity spawnEntity(Location location, EntityType entityType) { + return null; } @Override @@ -101,7 +101,7 @@ public class FabricWorld implements World { return null; } - private final class Handle { + private static final class Handle { private final ServerWorld world; private final ChunkGenerator generator; diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java index 813e6d9a1..c2e2bf946 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricSeededWorldAccess.java @@ -1,12 +1,13 @@ package com.dfsek.terra.fabric.world.handles.world; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.Entity; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.entity.Entity; +import com.dfsek.terra.api.platform.world.entity.EntityType; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.util.math.BlockPos; @@ -14,7 +15,6 @@ import net.minecraft.world.WorldAccess; import java.io.File; import java.util.UUID; -import java.util.function.Consumer; public class FabricSeededWorldAccess implements World { @@ -81,8 +81,8 @@ public class FabricSeededWorldAccess implements World { } @Override - public void spawn(Location location, Class entity, Consumer consumer) { - + public Entity spawnEntity(Location location, EntityType entityType) { + return null; } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java index b292a0391..4dbb4adf9 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldAccess.java @@ -1,12 +1,13 @@ package com.dfsek.terra.fabric.world.handles.world; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.Entity; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.entity.Entity; +import com.dfsek.terra.api.platform.world.entity.EntityType; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.util.math.BlockPos; @@ -16,7 +17,6 @@ import net.minecraft.world.WorldAccess; import java.io.File; import java.util.UUID; -import java.util.function.Consumer; public class FabricWorldAccess implements World { private final WorldAccess delegate; @@ -82,8 +82,8 @@ public class FabricWorldAccess implements World { } @Override - public void spawn(Location location, Class entity, Consumer consumer) { - + public Entity spawnEntity(Location location, EntityType entityType) { + return null; } @Override diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java index e8c31f5b2..e0e2fadb1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/handles/world/FabricWorldChunkRegion.java @@ -1,12 +1,13 @@ package com.dfsek.terra.fabric.world.handles.world; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.Entity; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.entity.Entity; +import com.dfsek.terra.api.platform.world.entity.EntityType; import com.dfsek.terra.fabric.world.block.FabricBlock; import com.dfsek.terra.fabric.world.generator.FabricChunkGenerator; import net.minecraft.util.math.BlockPos; @@ -14,7 +15,6 @@ import net.minecraft.world.ChunkRegion; import java.io.File; import java.util.UUID; -import java.util.function.Consumer; public class FabricWorldChunkRegion implements World { private final Handle delegate; @@ -91,8 +91,8 @@ public class FabricWorldChunkRegion implements World { } @Override - public void spawn(Location location, Class entity, Consumer consumer) { - + public Entity spawnEntity(Location location, EntityType entityType) { + return null; } @Override From 61c93b47ca8e1583c10592b1b096dab29246a12b Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 1 Jan 2021 03:28:06 -0700 Subject: [PATCH 156/210] implement EntityFunction --- .../parser/lang/functions/Function.java | 1 - .../lang/functions/builtin/AbsFunction.java | 5 -- .../lang/functions/builtin/PowFunction.java | 5 -- .../lang/functions/builtin/SqrtFunction.java | 5 -- .../lang/functions/def/DefinedFunction.java | 5 -- .../structures/script/StructureScript.java | 4 +- .../builders/EntityFunctionBuilder.java | 43 +++++++++++++++ .../script/functions/BlockFunction.java | 5 -- .../script/functions/CheckFunction.java | 5 -- .../script/functions/EntityFunction.java | 54 +++++++++++++++++++ .../script/functions/GetMarkFunction.java | 5 -- .../script/functions/LootFunction.java | 5 -- .../script/functions/MarkFunction.java | 5 -- .../script/functions/PullFunction.java | 5 -- .../script/functions/RandomFunction.java | 5 -- .../script/functions/RecursionsFunction.java | 5 -- .../script/functions/StructureFunction.java | 5 -- .../buffer/items/BufferedEntity.java | 18 +++++++ .../src/test/java/structure/ParserTest.java | 5 -- 19 files changed, 118 insertions(+), 72 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/EntityFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedEntity.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java index 1ebd54b85..aaa826d12 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/Function.java @@ -3,5 +3,4 @@ package com.dfsek.terra.api.structures.parser.lang.functions; import com.dfsek.terra.api.structures.parser.lang.Returnable; public interface Function extends Returnable { - String name(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java index cb83489c8..0e71693e0 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java @@ -16,11 +16,6 @@ public class AbsFunction extends MathFunction { this.returnable = returnable; } - @Override - public String name() { - return "abs"; - } - @Override public Number apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return FastMath.abs(returnable.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java index 431f14075..03f21a69f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java @@ -18,11 +18,6 @@ public class PowFunction extends MathFunction { this.power = power; } - @Override - public String name() { - return "pow"; - } - @Override public Number apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return FastMath.pow(base.apply(buffer, rotation, random, recursions).doubleValue(), power.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java index 35e746f47..3dbc1ce85 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java @@ -16,11 +16,6 @@ public class SqrtFunction extends MathFunction { this.returnable = returnable; } - @Override - public String name() { - return "sqrt"; - } - @Override public Number apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return FastMath.sqrt(returnable.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java index 923a399ad..f06654de3 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java @@ -18,11 +18,6 @@ public abstract class DefinedFunction implements Function { this.position = position; } - @Override - public String name() { - return name; - } - @Override public T apply(Buffer buffer, Rotation rotation, Random random, int recursions) { return block.apply(buffer, rotation, random, recursions); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 99b73a377..cca20d6c3 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -8,6 +8,7 @@ import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.EntityFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.GetMarkFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.LootFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.MarkFunctionBuilder; @@ -49,7 +50,8 @@ public class StructureScript { .addFunction("setMark", new MarkFunctionBuilder()) .addFunction("getMark", new GetMarkFunctionBuilder()) .addFunction("pull", new PullFunctionBuilder(main)) - .addFunction("loot", new LootFunctionBuilder(main, lootRegistry)); + .addFunction("loot", new LootFunctionBuilder(main, lootRegistry)) + .addFunction("entity", new EntityFunctionBuilder(main)); try { block = parser.parse(); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/EntityFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/EntityFunctionBuilder.java new file mode 100644 index 000000000..fff23ce78 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/EntityFunctionBuilder.java @@ -0,0 +1,43 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.functions.EntityFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class EntityFunctionBuilder implements FunctionBuilder { + private final TerraPlugin main; + + public EntityFunctionBuilder(TerraPlugin main) { + this.main = main; + } + + @SuppressWarnings("unchecked") + @Override + public EntityFunction build(List> argumentList, Position position) throws ParseException { + return new EntityFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position); + } + + @Override + public int argNumber() { + return 4; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + switch(position) { + case 0: + case 1: + case 2: + return Returnable.ReturnType.NUMBER; + case 3: + return Returnable.ReturnType.STRING; + default: + return null; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index d216222c6..44f671c61 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -32,11 +32,6 @@ public class BlockFunction implements Function { this.z = z; } - @Override - public String name() { - return "block"; - } - @Override public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index bef383108..67e4c6a73 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -36,11 +36,6 @@ public class CheckFunction implements Function { this.cache = cache; } - @Override - public String name() { - return "check"; - } - @Override public String apply(Buffer buffer, Rotation rotation, Random random, int recursions) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java new file mode 100644 index 000000000..3a81a8351 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java @@ -0,0 +1,54 @@ +package com.dfsek.terra.api.structures.script.functions; + +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.world.entity.EntityType; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.RotationUtil; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedEntity; +import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; + +import java.util.Random; + +public class EntityFunction implements Function { + private final EntityType data; + private final Returnable x, y, z; + private final Position position; + + public EntityFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) throws ParseException { + this.position = position; + if(!(data instanceof ConstantExpression)) throw new ParseException("Entity data must be constant", data.getPosition()); + + this.data = main.getWorldHandle().getEntity(((ConstantExpression) data).getConstant()); + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); + + RotationUtil.rotateVector(xz, rotation); + + buffer.addItem(new BufferedEntity(data), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + return null; + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java index 34991865f..86540f2f0 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java @@ -25,11 +25,6 @@ public class GetMarkFunction implements Function { this.z = z; } - @Override - public String name() { - return "block"; - } - @Override public String apply(Buffer buffer, Rotation rotation, Random random, int recursions) { Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java index fd4467d65..1fddda10f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java @@ -33,11 +33,6 @@ public class LootFunction implements Function { this.main = main; } - @Override - public String name() { - return "block"; - } - @Override public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java index a30a36c50..979aeffca 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java @@ -27,11 +27,6 @@ public class MarkFunction implements Function { this.z = z; } - @Override - public String name() { - return "block"; - } - @Override public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java index 7f7734792..ad323307f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java @@ -32,11 +32,6 @@ public class PullFunction implements Function { this.z = z; } - @Override - public String name() { - return "pull"; - } - @Override public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java index b0fb3666c..f1175b35b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java @@ -18,11 +18,6 @@ public class RandomFunction implements Function { } - @Override - public String name() { - return "randomInt"; - } - @Override public ReturnType returnType() { return ReturnType.NUMBER; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java index 57050332c..ee37a4a49 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java @@ -14,11 +14,6 @@ public class RecursionsFunction implements Function { this.position = position; } - @Override - public String name() { - return "recursions"; - } - @Override public ReturnType returnType() { return ReturnType.NUMBER; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index 44a0dc3a8..58bbfaee9 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -36,11 +36,6 @@ public class StructureFunction implements Function { this.rotations = rotations; } - @Override - public String name() { - return "structure"; - } - @Override public ReturnType returnType() { return ReturnType.BOOLEAN; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedEntity.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedEntity.java new file mode 100644 index 000000000..f75b4383b --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedEntity.java @@ -0,0 +1,18 @@ +package com.dfsek.terra.api.structures.structure.buffer.items; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.world.entity.EntityType; + +public class BufferedEntity implements BufferedItem { + + private final EntityType type; + + public BufferedEntity(EntityType type) { + this.type = type; + } + + @Override + public void paste(Location origin) { + origin.getWorld().spawnEntity(origin, type); + } +} diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index 707501fea..b670cedbd 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -78,11 +78,6 @@ public class ParserTest { return position; } - @Override - public String name() { - return null; - } - @Override public ReturnType returnType() { return ReturnType.VOID; From 556584f9f5554d4c42b98f73e98be9d1a1c2b0da Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 1 Jan 2021 16:05:42 -0700 Subject: [PATCH 157/210] improve BukkitAdapter, fix LocateCommand --- .../com/dfsek/terra/bukkit/BukkitPlayer.java | 4 ++-- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 2 +- .../command/biome/BiomeInfoCommand.java | 4 ++-- .../geometry/DeformedSphereCommand.java | 4 ++-- .../command/geometry/SphereCommand.java | 4 ++-- .../command/command/geometry/TubeCommand.java | 4 ++-- .../command/command/profile/QueryCommand.java | 4 ++-- .../command/command/profile/ResetCommand.java | 4 ++-- .../command/command/profile/StartCommand.java | 4 ++-- .../command/command/profile/StopCommand.java | 4 ++-- .../command/structure/LocateCommand.java | 21 ++++++++----------- .../command/structure/SpawnCommand.java | 4 ++-- .../command/structure/StructureCommand.java | 2 +- .../structure/load/LoadFullCommand.java | 5 ++--- .../structure/load/LoadRawCommand.java | 8 +++---- .../BukkitChunkGeneratorWrapper.java | 4 ++-- .../generator/BukkitPopulatorWrapper.java | 5 ++--- .../terra/bukkit/listeners/EventListener.java | 4 ++-- .../terra/bukkit/world/BukkitAdapter.java | 20 +++++++++++++++++- .../dfsek/terra/bukkit/world/BukkitChunk.java | 2 +- .../dfsek/terra/bukkit/world/BukkitWorld.java | 2 +- .../terra/bukkit/world/block/BukkitBlock.java | 3 +-- 22 files changed, 64 insertions(+), 54 deletions(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java index e24a75eec..c59491a59 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/BukkitPlayer.java @@ -2,7 +2,7 @@ package com.dfsek.terra.bukkit; import com.dfsek.terra.api.Player; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.bukkit.world.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitAdapter; public class BukkitPlayer implements Player { private final org.bukkit.entity.Player delegate; @@ -19,6 +19,6 @@ public class BukkitPlayer implements Player { @Override public Location getLocation() { org.bukkit.Location bukkit = delegate.getLocation(); - return new Location(new BukkitWorld(bukkit.getWorld()), bukkit.getX(), bukkit.getY(), bukkit.getZ()); + return new Location(BukkitAdapter.adapt(bukkit.getWorld()), bukkit.getX(), bukkit.getY(), bukkit.getZ()); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 80f53a76c..ef88d6ace 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -121,7 +121,7 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { c.setExecutor(command); c.setTabCompleter(command); - LocateCommand locate = new LocateCommand(command, false); + LocateCommand locate = new LocateCommand(command); PluginCommand locatePl = Objects.requireNonNull(getCommand("locate")); locatePl.setExecutor(locate); // Override locate command. Once Paper accepts StructureLocateEvent this will be unneeded on Paper implementations. locatePl.setTabCompleter(locate); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java index 37a72b0fc..ec1533693 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java @@ -3,7 +3,7 @@ package com.dfsek.terra.bukkit.command.command.biome; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.command.WorldCommand; -import com.dfsek.terra.bukkit.world.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.lang.LangUtil; @@ -27,7 +27,7 @@ public class BiomeInfoCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { String id = args[0]; - ConfigPack cfg = getMain().getWorld(new BukkitWorld(world)).getConfig(); + ConfigPack cfg = getMain().getWorld(BukkitAdapter.adapt(world)).getConfig(); UserDefinedBiome b; try { b = cfg.getBiome(id); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java index e8c677fcb..28c2faef7 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java @@ -5,7 +5,7 @@ import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitPlayer; import com.dfsek.terra.bukkit.command.PlayerCommand; -import com.dfsek.terra.bukkit.world.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.procgen.voxel.DeformedSphere; import org.bukkit.command.Command; @@ -50,7 +50,7 @@ public class DeformedSphereCommand extends PlayerCommand { n.setFrequency(freq); DeformedSphere sphere = new DeformedSphere(new BukkitPlayer(sender).getLocation().toVector(), radius, deform, n); for(Vector3 v : sphere.getGeometry()) { - v.toLocation(new BukkitWorld(sender.getWorld())).getBlock().setBlockData(getMain().getWorldHandle().createBlockData("minecraft:stone"), false); + v.toLocation(BukkitAdapter.adapt(sender.getWorld())).getBlock().setBlockData(getMain().getWorldHandle().createBlockData("minecraft:stone"), false); } return true; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java index f0bebfa1f..0c7f51ab2 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java @@ -4,7 +4,7 @@ import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitPlayer; import com.dfsek.terra.bukkit.command.PlayerCommand; -import com.dfsek.terra.bukkit.world.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.procgen.voxel.Sphere; import org.bukkit.command.Command; @@ -31,7 +31,7 @@ public class SphereCommand extends PlayerCommand { } Sphere sphere = new Sphere(new BukkitPlayer(sender).getLocation().toVector(), radius); for(Vector3 v : sphere.getGeometry()) { - v.toLocation(new BukkitWorld(sender.getWorld())).getBlock().setBlockData(getMain().getWorldHandle().createBlockData("minecraft:stone"), false); + v.toLocation(BukkitAdapter.adapt(sender.getWorld())).getBlock().setBlockData(getMain().getWorldHandle().createBlockData("minecraft:stone"), false); } return true; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java index 6f4e7db47..b4bc6c103 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java @@ -5,7 +5,7 @@ import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.command.PlayerCommand; import com.dfsek.terra.bukkit.structure.WorldEditUtil; import com.dfsek.terra.bukkit.util.BukkitConversions; -import com.dfsek.terra.bukkit.world.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.procgen.voxel.Tube; import org.bukkit.Location; @@ -35,7 +35,7 @@ public class TubeCommand extends PlayerCommand { } Tube tube = new Tube(BukkitConversions.toTerraVector(l[0].toVector()), BukkitConversions.toTerraVector(l[1].toVector()), radius); for(Vector3 v : tube.getGeometry()) { - v.toLocation(new BukkitWorld(sender.getWorld())).getBlock().setBlockData(getMain().getWorldHandle().createBlockData("minecraft:stone"), false); + v.toLocation(BukkitAdapter.adapt(sender.getWorld())).getBlock().setBlockData(getMain().getWorldHandle().createBlockData("minecraft:stone"), false); } return true; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java index 8987d6636..9cdf9f10a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/QueryCommand.java @@ -2,7 +2,7 @@ package com.dfsek.terra.bukkit.command.command.profile; import com.dfsek.terra.api.profiler.WorldProfiler; import com.dfsek.terra.bukkit.command.WorldCommand; -import com.dfsek.terra.bukkit.world.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -19,7 +19,7 @@ public class QueryCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = getMain().getWorld(new BukkitWorld(world)).getProfiler(); + WorldProfiler profile = getMain().getWorld(BukkitAdapter.adapt(world)).getProfiler(); sender.sendMessage(profile.getResultsFormatted()); return true; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java index 19d687d47..eb7e5a3b7 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/ResetCommand.java @@ -3,7 +3,7 @@ package com.dfsek.terra.bukkit.command.command.profile; import com.dfsek.terra.api.profiler.WorldProfiler; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.command.WorldCommand; -import com.dfsek.terra.bukkit.world.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; @@ -21,7 +21,7 @@ public class ResetCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = getMain().getWorld(new BukkitWorld(world)).getProfiler(); + WorldProfiler profile = getMain().getWorld(BukkitAdapter.adapt(world)).getProfiler(); profile.reset(); LangUtil.send("command.profile.reset", new BukkitCommandSender(sender)); return true; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java index 8dd41ce67..cadcb1446 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StartCommand.java @@ -3,7 +3,7 @@ package com.dfsek.terra.bukkit.command.command.profile; import com.dfsek.terra.api.profiler.WorldProfiler; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.command.WorldCommand; -import com.dfsek.terra.bukkit.world.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; @@ -21,7 +21,7 @@ public class StartCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = getMain().getWorld(new BukkitWorld(world)).getProfiler(); + WorldProfiler profile = getMain().getWorld(BukkitAdapter.adapt(world)).getProfiler(); profile.setProfiling(true); LangUtil.send("command.profile.start", new BukkitCommandSender(sender)); return true; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java index 39dea2544..f5d24b1d3 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/profile/StopCommand.java @@ -3,7 +3,7 @@ package com.dfsek.terra.bukkit.command.command.profile; import com.dfsek.terra.api.profiler.WorldProfiler; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.command.WorldCommand; -import com.dfsek.terra.bukkit.world.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; @@ -21,7 +21,7 @@ public class StopCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - WorldProfiler profile = getMain().getWorld(new BukkitWorld(world)).getProfiler(); + WorldProfiler profile = getMain().getWorld(BukkitAdapter.adapt(world)).getProfiler(); profile.setProfiling(false); LangUtil.send("command.profile.stop", new BukkitCommandSender(sender)); return true; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java index 0472ebac0..bc05256e4 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java @@ -1,12 +1,12 @@ package com.dfsek.terra.bukkit.command.command.structure; +import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.async.AsyncStructureFinder; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.TerraBukkitPlugin; import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.bukkit.world.BukkitAdapter; -import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.generation.items.TerraStructure; import net.md_5.bungee.api.ChatColor; @@ -25,13 +25,12 @@ import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; public class LocateCommand extends WorldCommand { - private final boolean tp; - public LocateCommand(com.dfsek.terra.bukkit.command.Command parent, boolean tp) { + public LocateCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); - this.tp = tp; } @SuppressWarnings("DuplicatedCode") @@ -48,12 +47,12 @@ public class LocateCommand extends WorldCommand { } TerraStructure s; try { - s = Objects.requireNonNull(getMain().getWorld(new BukkitWorld(world)).getConfig().getStructure(id)); + s = Objects.requireNonNull(getMain().getWorld(BukkitAdapter.adapt(world)).getConfig().getStructure(id)); } catch(IllegalArgumentException | NullPointerException e) { - //LangUtil.send("command.structure.invalid", sender, id); + LangUtil.send("command.structure.invalid", new BukkitCommandSender(sender), id); return true; } - Bukkit.getScheduler().runTaskAsynchronously((TerraBukkitPlugin) getMain(), new AsyncStructureFinder(getMain().getWorld(new BukkitWorld(world)).getGrid(), s, BukkitAdapter.adapt(sender.getLocation()), 0, maxRadius, (location) -> { + Bukkit.getScheduler().runTaskAsynchronously((TerraBukkitPlugin) getMain(), new AsyncStructureFinder(getMain().getWorld(BukkitAdapter.adapt(world)).getGrid(), s, BukkitAdapter.adapt(sender.getLocation()), 0, maxRadius, (location) -> { if(sender.isOnline()) { if(location != null) { ComponentBuilder cm = new ComponentBuilder(String.format("The nearest %s is at ", id.toLowerCase())) @@ -74,7 +73,7 @@ public class LocateCommand extends WorldCommand { @Override public String getName() { - return tp ? "teleport" : "locate"; + return "locate"; } @Override @@ -89,15 +88,13 @@ public class LocateCommand extends WorldCommand { @Override public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { - /* - if(!(sender instanceof Player) || !(((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator)) + if(!(sender instanceof Player) || !(TerraWorld.isTerraWorld(BukkitAdapter.adapt(((Player) sender).getWorld())))) return Collections.emptyList(); - List ids = ((TerraBukkitPlugin) getMain()).getWorld(((Player) sender).getWorld()).getConfig().getStructureIDs(); + List ids = getMain().getWorld(BukkitAdapter.adapt(((Player) sender).getWorld())).getConfig().getStructureIDs(); if(args.length == 1) return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); - */ return Collections.emptyList(); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java index 0942b6170..59d77fbd9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.bukkit.command.DebugCommand; import com.dfsek.terra.bukkit.command.WorldCommand; -import com.dfsek.terra.bukkit.world.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.command.Command; @@ -31,7 +31,7 @@ public class SpawnCommand extends WorldCommand implements DebugCommand { int y = p.getBlockY(); int z = p.getBlockZ(); Position dummy = new Position(0, 0); - com.dfsek.terra.api.platform.world.World w = new BukkitWorld(world); + com.dfsek.terra.api.platform.world.World w = BukkitAdapter.adapt(world); String check = new CheckFunction(getMain(), new NumericConstant(0, dummy), new NumericConstant(0, dummy), new NumericConstant(0, dummy), getMain().getWorld(w).getConfig().getCheckCache(), dummy).apply(new StructureBuffer( new com.dfsek.terra.api.math.vector.Location(w, x, y, z) ), Rotation.NONE, new FastRandom(), 0); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/StructureCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/StructureCommand.java index a1991af62..16c6b277a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/StructureCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/StructureCommand.java @@ -31,7 +31,7 @@ public class StructureCommand extends PlayerCommand { @Override public List getSubCommands() { - return Arrays.asList(new ExportCommand(this), new LoadCommand(this), new LocateCommand(this, false), new LocateCommand(this, true), new SpawnCommand(this)); + return Arrays.asList(new ExportCommand(this), new LoadCommand(this), new LocateCommand(this), new SpawnCommand(this)); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java index cafacf131..7308063b8 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadFullCommand.java @@ -6,7 +6,6 @@ import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.bukkit.command.DebugCommand; import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.BukkitChunk; -import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.util.PopulationUtil; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -28,12 +27,12 @@ public class LoadFullCommand extends LoadCommand implements DebugCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { - TerraWorld terraWorld = getMain().getWorld(new BukkitWorld(sender.getWorld())); + TerraWorld terraWorld = getMain().getWorld(BukkitAdapter.adapt(sender.getWorld())); long t = System.nanoTime(); FastRandom chunk = PopulationUtil.getRandom(new BukkitChunk(sender.getLocation().getChunk())); if(this.chunk) { - terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(BukkitAdapter.adapt(sender.getLocation()), new BukkitChunk(sender.getLocation().getChunk()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); + terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(BukkitAdapter.adapt(sender.getLocation()), BukkitAdapter.adapt(sender.getLocation().getChunk()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); } else { terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(BukkitAdapter.adapt(sender.getLocation()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java index eaccda40a..1c5defcb9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/load/LoadRawCommand.java @@ -5,8 +5,6 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.bukkit.command.DebugCommand; import com.dfsek.terra.bukkit.world.BukkitAdapter; -import com.dfsek.terra.bukkit.world.BukkitChunk; -import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.util.PopulationUtil; import org.bukkit.block.Sign; import org.bukkit.command.Command; @@ -36,9 +34,9 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String s, @NotNull String[] args) { - TerraWorld terraWorld = getMain().getWorld(new BukkitWorld(sender.getWorld())); + TerraWorld terraWorld = getMain().getWorld(BukkitAdapter.adapt(sender.getWorld())); long t = System.nanoTime(); - FastRandom chunk = PopulationUtil.getRandom(new BukkitChunk(sender.getLocation().getChunk())); + FastRandom chunk = PopulationUtil.getRandom(BukkitAdapter.adapt(sender.getLocation().getChunk())); boolean success = terraWorld.getConfig().getScriptRegistry().get(args[0]).execute(BukkitAdapter.adapt(sender.getLocation()), chunk, Rotation.fromDegrees(90 * chunk.nextInt(4))); long l = System.nanoTime() - t; @@ -66,7 +64,7 @@ public class LoadRawCommand extends LoadCommand implements DebugCommand { @Override public List getTabCompletions(@NotNull CommandSender commandSender, @NotNull String s, @NotNull String[] args) { if(args.length == 1) { - return getStructureNames(new BukkitWorld(((Player) commandSender).getWorld())).stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); + return getStructureNames(BukkitAdapter.adapt(((Player) commandSender).getWorld())).stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); } return Collections.emptyList(); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index 9010fce42..0f88c5532 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -5,8 +5,8 @@ import com.dfsek.terra.api.platform.generator.GeneratorWrapper; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.world.generation.TerraChunkGenerator; import com.dfsek.terra.api.world.generation.population.PopulationManager; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.BukkitBiomeGrid; -import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.MasterChunkGenerator; @@ -82,7 +82,7 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Gener @Override public @NotNull ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { - BukkitWorld bukkitWorld = new BukkitWorld(world); + com.dfsek.terra.api.platform.world.World bukkitWorld = BukkitAdapter.adapt(world); if(needsLoad) load(bukkitWorld); // Load population data for world. delegate.generateBiomes(bukkitWorld, random, x, z, new BukkitBiomeGrid(biome)); return (ChunkData) delegate.generateChunkData(bukkitWorld, random, x, z, new BukkitChunkGenerator.BukkitChunkData(createChunkData(world))).getHandle(); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java index 6a3a9a238..83d9fb891 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java @@ -1,8 +1,7 @@ package com.dfsek.terra.bukkit.generator; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; -import com.dfsek.terra.bukkit.world.BukkitChunk; -import com.dfsek.terra.bukkit.world.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import org.bukkit.Chunk; import org.bukkit.World; import org.bukkit.generator.BlockPopulator; @@ -19,6 +18,6 @@ public class BukkitPopulatorWrapper extends BlockPopulator { @Override public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk source) { - delegate.populate(new BukkitWorld(world), random, new BukkitChunk(source)); + delegate.populate(BukkitAdapter.adapt(world), random, BukkitAdapter.adapt(source)); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java index 59c5f12ec..91ad5b7cb 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.transform.MapTransform; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.world.tree.Tree; -import com.dfsek.terra.bukkit.world.BukkitWorld; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.registry.TreeRegistry; @@ -43,7 +43,7 @@ public class EventListener implements Listener { @EventHandler public void onSaplingGrow(StructureGrowEvent e) { - World bukkit = new BukkitWorld(e.getWorld()); + World bukkit = BukkitAdapter.adapt(e.getWorld()); if(!TerraWorld.isTerraWorld(bukkit)) return; TerraWorld tw = main.getWorld(bukkit); ConfigPack c = tw.getConfig(); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java index afb468173..3248c8af8 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java @@ -8,6 +8,8 @@ import com.dfsek.terra.api.platform.block.data.Rail; import com.dfsek.terra.api.platform.block.data.RedstoneWire; import com.dfsek.terra.api.platform.block.data.Slab; import com.dfsek.terra.api.platform.block.data.Stairs; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.World; import org.bukkit.Location; import org.bukkit.block.data.type.Wall; @@ -325,6 +327,22 @@ public final class BukkitAdapter { } public static com.dfsek.terra.api.math.vector.Location adapt(Location location) { - return new com.dfsek.terra.api.math.vector.Location(new BukkitWorld(location.getWorld()), location.getX(), location.getY(), location.getZ()); + return new com.dfsek.terra.api.math.vector.Location(adapt(location.getWorld()), location.getX(), location.getY(), location.getZ()); + } + + public static World adapt(org.bukkit.World world) { + return new BukkitWorld(world); + } + + public static org.bukkit.World adapt(World world) { + return (org.bukkit.World) world.getHandle(); + } + + public static Chunk adapt(org.bukkit.Chunk chunk) { + return new BukkitChunk(chunk); + } + + public static org.bukkit.Chunk adapt(Chunk chunk) { + return (org.bukkit.Chunk) chunk.getHandle(); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitChunk.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitChunk.java index da42f8266..c3cdafb51 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitChunk.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitChunk.java @@ -24,7 +24,7 @@ public class BukkitChunk implements Chunk { @Override public World getWorld() { - return new BukkitWorld(delegate.getWorld()); + return BukkitAdapter.adapt(delegate.getWorld()); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java index f2269b22d..16c19fd1c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java @@ -55,7 +55,7 @@ public class BukkitWorld implements World { @Override public Chunk getChunkAt(int x, int z) { - return new BukkitChunk(delegate.getChunkAt(x, z)); + return BukkitAdapter.adapt(delegate.getChunkAt(x, z)); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java index 4acf8697a..aaa5a9b47 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/BukkitBlock.java @@ -7,7 +7,6 @@ import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.bukkit.world.BukkitAdapter; -import com.dfsek.terra.bukkit.world.BukkitWorld; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; import com.dfsek.terra.bukkit.world.block.state.BukkitBlockState; @@ -50,7 +49,7 @@ public class BukkitBlock implements Block { @Override public Location getLocation() { - return new Location(new BukkitWorld(delegate.getWorld()), delegate.getX(), delegate.getY(), delegate.getZ()); + return BukkitAdapter.adapt(delegate.getLocation()); } @Override From 07731c06c022c6cba6de33eb4534da55a83502e1 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 1 Jan 2021 17:36:53 -0700 Subject: [PATCH 158/210] implement biome commands --- .../command/command/biome/BiomeCommand.java | 16 ++++--- .../command/biome/BiomeInfoCommand.java | 9 ++-- .../command/biome/BiomeLocateCommand.java | 45 +++++++++++-------- .../command/structure/LocateCommand.java | 7 ++- .../terra/bukkit/world/BukkitAdapter.java | 20 +++++++++ 5 files changed, 62 insertions(+), 35 deletions(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java index 06e1b0b15..f7d131903 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeCommand.java @@ -1,6 +1,11 @@ package com.dfsek.terra.bukkit.command.command.biome; +import com.dfsek.terra.api.world.generation.GenerationPhase; +import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.world.BukkitAdapter; +import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -18,12 +23,9 @@ public class BiomeCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World w) { - /* - TerraBiomeGrid grid = ((TerraBukkitPlugin) getMain()).getWorld(sender.getWorld()).getGrid(); - UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome(sender.getLocation(), GenerationPhase.POPULATE); - LangUtil.send("command.biome.in", sender, biome.getID()); - - */ + TerraBiomeGrid grid = getMain().getWorld(BukkitAdapter.adapt(sender.getWorld())).getGrid(); + UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome(BukkitAdapter.adapt(sender.getLocation()), GenerationPhase.POPULATE); + LangUtil.send("command.biome.in", BukkitAdapter.adapt(sender), biome.getID()); return true; } @@ -34,7 +36,7 @@ public class BiomeCommand extends WorldCommand { @Override public List getSubCommands() { - return Arrays.asList(new BiomeLocateCommand(this, true), new BiomeLocateCommand(this, false), new BiomeInfoCommand(this)); + return Arrays.asList(new BiomeLocateCommand(this), new BiomeInfoCommand(this)); } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java index ec1533693..93029c56b 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java @@ -1,5 +1,6 @@ package com.dfsek.terra.bukkit.command.command.biome; +import com.dfsek.terra.TerraWorld; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.command.WorldCommand; @@ -18,6 +19,7 @@ import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class BiomeInfoCommand extends WorldCommand { public BiomeInfoCommand(com.dfsek.terra.bukkit.command.Command parent) { @@ -84,14 +86,11 @@ public class BiomeInfoCommand extends WorldCommand { @Override public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { - /* - if(!(sender instanceof Player) || !(((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator)) + if(!(sender instanceof Player) || !TerraWorld.isTerraWorld(BukkitAdapter.adapt(((Player) sender).getWorld()))) return Collections.emptyList(); - List ids = ((TerraBukkitPlugin) getMain()).getWorld(((Player) sender).getWorld()).getConfig().getBiomeIDs(); + List ids = getMain().getWorld(BukkitAdapter.adapt(((Player) sender).getWorld())).getConfig().getBiomeIDs(); if(args.length == 1) return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); - - */ return Collections.emptyList(); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java index 8e29c25a3..28d4faa7c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeLocateCommand.java @@ -1,6 +1,20 @@ package com.dfsek.terra.bukkit.command.command.biome; +import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.async.AsyncBiomeFinder; +import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.bukkit.TerraBukkitPlugin; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.world.BukkitAdapter; +import com.dfsek.terra.config.lang.LangUtil; +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -9,54 +23,50 @@ import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; public class BiomeLocateCommand extends WorldCommand { - private final boolean tp; - - public BiomeLocateCommand(com.dfsek.terra.bukkit.command.Command parent, boolean teleport) { + public BiomeLocateCommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); - this.tp = teleport; } @SuppressWarnings("DuplicatedCode") @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - /* String id = args[0]; int maxRadius; try { maxRadius = Integer.parseInt(args[1]); } catch(NumberFormatException e) { - LangUtil.send("command.biome.invalid-radius", sender, args[1]); + LangUtil.send("command.biome.invalid-radius", BukkitAdapter.adapt(sender), args[1]); return true; } UserDefinedBiome b; try { - b = ((TerraBukkitPlugin) getMain()).getWorld(world).getConfig().getBiome(id); + b = getMain().getWorld(BukkitAdapter.adapt(world)).getConfig().getBiome(id); } catch(IllegalArgumentException | NullPointerException e) { - LangUtil.send("command.biome.invalid", sender, id); + LangUtil.send("command.biome.invalid", BukkitAdapter.adapt(sender), id); return true; } - Bukkit.getScheduler().runTaskAsynchronously(getMain(), new AsyncBiomeFinder(((TerraBukkitPlugin) getMain()).getWorld(world).getGrid(), b, sender.getLocation().clone().multiply((1D / ((TerraBukkitPlugin) getMain()).getTerraConfig().getBiomeSearchResolution())), 0, maxRadius, location -> { + Bukkit.getScheduler().runTaskAsynchronously((TerraBukkitPlugin) getMain(), new AsyncBiomeFinder(getMain().getWorld(BukkitAdapter.adapt(world)).getGrid(), b, BukkitAdapter.adapt(sender.getLocation().clone().multiply((1D / ((TerraBukkitPlugin) getMain()).getTerraConfig().getBiomeSearchResolution()))), 0, maxRadius, location -> { if(location != null) { ComponentBuilder cm = new ComponentBuilder(String.format("The nearest %s is at ", id.toLowerCase())) .append(String.format("[%d, ~, %d]", location.getBlockX(), location.getBlockZ()), ComponentBuilder.FormatRetention.NONE) .event(new ClickEvent(ClickEvent.Action.RUN_COMMAND, String.format("/minecraft:tp %s %d.0 %.2f %d.0", sender.getName(), location.getBlockX(), sender.getLocation().getY(), location.getBlockZ()))) .event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new BaseComponent[] {new TextComponent("Click to teleport")})) .color(ChatColor.GREEN) - .append(String.format(" (%.1f blocks away)", location.add(new Vector(0, sender.getLocation().getY(), 0)).distance(sender.getLocation().toVector())), ComponentBuilder.FormatRetention.NONE); + .append(String.format(" (%.1f blocks away)", location.add(new Vector3(0, sender.getLocation().getY(), 0)).distance(BukkitAdapter.adapt(sender.getLocation().toVector()))), ComponentBuilder.FormatRetention.NONE); sender.spigot().sendMessage(cm.create()); // LangUtil.send("command.biome.biome-found", sender, String.valueOf(location.getBlockX()), String.valueOf(location.getBlockZ())); - } else LangUtil.send("command.biome.unable-to-locate", sender); - }, (TerraBukkitPlugin) getMain())); + } else LangUtil.send("command.biome.unable-to-locate", BukkitAdapter.adapt(sender)); + }, getMain())); - */ return true; } @Override public String getName() { - return tp ? "teleport" : "locate"; + return "locate"; } @Override @@ -71,14 +81,11 @@ public class BiomeLocateCommand extends WorldCommand { @Override public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { - /* - if(!(sender instanceof Player) || !(((Player) sender).getWorld().getGenerator() instanceof TerraChunkGenerator)) + if(!(sender instanceof Player) || !TerraWorld.isTerraWorld(BukkitAdapter.adapt(((Player) sender).getWorld()))) return Collections.emptyList(); - List ids = ((TerraBukkitPlugin) getMain()).getWorld(((Player) sender).getWorld()).getConfig().getBiomeIDs(); + List ids = getMain().getWorld(BukkitAdapter.adapt(((Player) sender).getWorld())).getConfig().getBiomeIDs(); if(args.length == 1) return ids.stream().filter(string -> string.toUpperCase().startsWith(args[0].toUpperCase())).collect(Collectors.toList()); - - */ return Collections.emptyList(); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java index bc05256e4..9503111e0 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java @@ -3,7 +3,6 @@ package com.dfsek.terra.bukkit.command.command.structure; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.async.AsyncStructureFinder; -import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.TerraBukkitPlugin; import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.bukkit.world.BukkitAdapter; @@ -42,14 +41,14 @@ public class LocateCommand extends WorldCommand { try { maxRadius = Integer.parseInt(args[1]); } catch(NumberFormatException e) { - LangUtil.send("command.structure.invalid-radius", new BukkitCommandSender(sender), args[1]); + LangUtil.send("command.structure.invalid-radius", BukkitAdapter.adapt(sender), args[1]); return true; } TerraStructure s; try { s = Objects.requireNonNull(getMain().getWorld(BukkitAdapter.adapt(world)).getConfig().getStructure(id)); } catch(IllegalArgumentException | NullPointerException e) { - LangUtil.send("command.structure.invalid", new BukkitCommandSender(sender), id); + LangUtil.send("command.structure.invalid", BukkitAdapter.adapt(sender), id); return true; } Bukkit.getScheduler().runTaskAsynchronously((TerraBukkitPlugin) getMain(), new AsyncStructureFinder(getMain().getWorld(BukkitAdapter.adapt(world)).getGrid(), s, BukkitAdapter.adapt(sender.getLocation()), 0, maxRadius, (location) -> { @@ -61,7 +60,7 @@ public class LocateCommand extends WorldCommand { .event(new HoverEvent(HoverEvent.Action.SHOW_TEXT, new BaseComponent[] {new TextComponent("Click to teleport")})) .color(ChatColor.GREEN) .append(String.format(" (%.1f blocks away)", location.add(new Vector3(0, sender.getLocation().getY(), 0)).distance( - new Vector3(sender.getLocation().getX(), sender.getLocation().getY(), sender.getLocation().getZ()))), ComponentBuilder.FormatRetention.NONE); + BukkitAdapter.adapt(sender.getLocation().toVector()))), ComponentBuilder.FormatRetention.NONE); sender.spigot().sendMessage(cm.create()); } else sender.sendMessage("Unable to locate structure. "); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java index 3248c8af8..7e522a62a 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java @@ -1,6 +1,8 @@ package com.dfsek.terra.bukkit.world; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.platform.CommandSender; import com.dfsek.terra.api.platform.block.Axis; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.block.data.Bisected; @@ -10,8 +12,10 @@ import com.dfsek.terra.api.platform.block.data.Slab; import com.dfsek.terra.api.platform.block.data.Stairs; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.bukkit.BukkitCommandSender; import org.bukkit.Location; import org.bukkit.block.data.type.Wall; +import org.bukkit.util.Vector; /** * Utility class to adapt Bukkit enums to Terra enums. @@ -330,6 +334,22 @@ public final class BukkitAdapter { return new com.dfsek.terra.api.math.vector.Location(adapt(location.getWorld()), location.getX(), location.getY(), location.getZ()); } + public static Vector adapt(Vector3 vector3) { + return new Vector(vector3.getX(), vector3.getY(), vector3.getZ()); + } + + public static Vector3 adapt(Vector vector) { + return new Vector3(vector.getX(), vector.getY(), vector.getZ()); + } + + public static CommandSender adapt(org.bukkit.command.CommandSender sender) { + return new BukkitCommandSender(sender); + } + + public static org.bukkit.command.CommandSender adapt(CommandSender sender) { + return ((BukkitCommandSender) sender).getHandle(); + } + public static World adapt(org.bukkit.World world) { return new BukkitWorld(world); } From 256761eb5be6458f5e2ab08fba8ce1d36a5d03d4 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 1 Jan 2021 17:43:10 -0700 Subject: [PATCH 159/210] fix version command --- .../main/java/com/dfsek/terra/api/platform/TerraPlugin.java | 2 ++ .../main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java | 5 +++++ .../dfsek/terra/bukkit/command/command/VersionCommand.java | 2 +- platforms/bukkit/src/main/resources/lang/en_us.yml | 2 +- .../main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java | 5 +++++ 5 files changed, 14 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java b/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java index 317fa40f8..07afd428b 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java @@ -36,4 +36,6 @@ public interface TerraPlugin extends LoaderRegistrar { ItemHandle getItemHandle(); void saveDefaultConfig(); + + String platformName(); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index ef88d6ace..fa3f8fb32 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -73,6 +73,11 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { return itemHandle; } + @Override + public String platformName() { + return "Bukkit"; + } + public void setHandle(WorldHandle handle) { getLogger().warning("|-------------------------------------------------------|"); getLogger().warning("A third-party addon has injected a custom WorldHandle!"); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/VersionCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/VersionCommand.java index 6513fe48d..b9686d186 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/VersionCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/VersionCommand.java @@ -28,7 +28,7 @@ public class VersionCommand extends Command { @Override public boolean execute(@NotNull CommandSender sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args) { String terraVersion = ((TerraBukkitPlugin) getMain()).getDescription().getVersion(); - LangUtil.send("command.version", new BukkitCommandSender(sender), terraVersion); + LangUtil.send("command.version", new BukkitCommandSender(sender), terraVersion, getMain().platformName()); return true; } diff --git a/platforms/bukkit/src/main/resources/lang/en_us.yml b/platforms/bukkit/src/main/resources/lang/en_us.yml index 1e3d5f5f3..048e36e0f 100644 --- a/platforms/bukkit/src/main/resources/lang/en_us.yml +++ b/platforms/bukkit/src/main/resources/lang/en_us.yml @@ -12,7 +12,7 @@ command: world: "This command must be executed in a Terra world!" reload: "Reloaded Terra config." reload-error: "Errors occurred while reloading Terra configurations. See logs for more information." - version: "This server is running Terra version \"%1$s\", implementing Gaea version \"%2$s\"" + version: "This server is running Terra version \"%1$s\", on platform \"%2$s\"" main-menu: - "--------------------Terra--------------------" - "reload - Reload configuration data" diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 310ee1985..090beacb8 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -177,6 +177,11 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { } } + @Override + public String platformName() { + return "Fabric"; + } + Transformer biomeFixer = new Transformer.Builder() .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse(id)), new NotNullValidator<>()) .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse("minecraft:" + id.toLowerCase())), new NotNullValidator<>()).build(); From ec722014e68aaeabea8e54df2337595a25822212 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 1 Jan 2021 17:45:06 -0700 Subject: [PATCH 160/210] finalize commands --- .../command/command/FixChunkCommand.java | 4 +- .../bukkit/command/command/OreCommand.java | 63 ------------------- .../command/command/SaveDataCommand.java | 3 +- .../bukkit/command/command/TerraCommand.java | 1 - 4 files changed, 5 insertions(+), 66 deletions(-) delete mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/OreCommand.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/FixChunkCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/FixChunkCommand.java index d666ece29..4b9d730d7 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/FixChunkCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/FixChunkCommand.java @@ -1,6 +1,8 @@ package com.dfsek.terra.bukkit.command.command; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -17,7 +19,7 @@ public class FixChunkCommand extends WorldCommand { @Override public boolean execute(@NotNull Player player, @NotNull Command command, @NotNull String s, @NotNull String[] strings, World world) { - //MasterChunkGenerator.fixChunk(player.getLocation().getChunk()); + BukkitChunkGeneratorWrapper.fixChunk(BukkitAdapter.adapt(player.getLocation().getChunk())); return true; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/OreCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/OreCommand.java deleted file mode 100644 index 145f5dc8e..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/OreCommand.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.dfsek.terra.bukkit.command.command; - -import com.dfsek.terra.bukkit.command.WorldCommand; -import org.bukkit.World; -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.util.Collections; -import java.util.List; - -public class OreCommand extends WorldCommand { - public OreCommand(com.dfsek.terra.bukkit.command.Command parent) { - super(parent); - } - - @Override - public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World w) { - /* - Block bl = sender.getTargetBlockExact(25); - if(args.length > 0) { - OreConfig ore = TerraWorld.getWorld(w).getConfig().getOre(args[0]); - if(ore == null) { - LangUtil.send("command.ore.invalid-ore", sender, args[0]); - return true; - } - if(bl == null) { - LangUtil.send("command.ore.out-of-range", sender); - return true; - } - Vector source = new Vector(FastMath.floorMod(bl.getX(), 16), bl.getY(), FastMath.floorMod(bl.getZ(), 16)); - ore.doVein(source, bl.getChunk(), new FastRandom()); - } else { - LangUtil.send("command.ore.main-menu", sender); - } - */ - return true; - - - // TODO: implementation - } - - @Override - public String getName() { - return "ore"; - } - - @Override - public List getSubCommands() { - return Collections.emptyList(); - } - - @Override - public int arguments() { - return 1; - } - - @Override - public List getTabCompletions(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { - return Collections.emptyList(); - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/SaveDataCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/SaveDataCommand.java index d996539ec..4cb09daba 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/SaveDataCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/SaveDataCommand.java @@ -3,6 +3,7 @@ package com.dfsek.terra.bukkit.command.command; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.command.Command; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.World; import org.bukkit.command.CommandSender; @@ -39,7 +40,7 @@ public class SaveDataCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, org.bukkit.command.@NotNull Command command, @NotNull String label, @NotNull String[] args, World w) { - //TerraChunkGenerator.saveAll(); + BukkitChunkGeneratorWrapper.saveAll(); LangUtil.send("debug.data-save", new BukkitCommandSender(sender), w.getName()); return true; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java index 7ceed79e6..ba3f16e96 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/TerraCommand.java @@ -19,7 +19,6 @@ import java.util.List; public class TerraCommand extends Command { private final List commands = Arrays.asList(new ReloadCommand(this), new BiomeCommand(this), - new OreCommand(this), new ProfileCommand(this), new SaveDataCommand(this), new StructureCommand(this), From a51727b63680dcc94d2ff6c0706a0beae27669b4 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 1 Jan 2021 18:09:58 -0700 Subject: [PATCH 161/210] fix exporting weirdness --- .../command/structure/ExportCommand.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java index 5c7ec65e8..43ca69af0 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/ExportCommand.java @@ -60,26 +60,22 @@ public class ExportCommand extends PlayerCommand { for(int x = l1.getBlockX(); x <= l2.getBlockX(); x++) { for(int y = l1.getBlockY(); y <= l2.getBlockY(); y++) { for(int z = l1.getBlockZ(); z <= l2.getBlockZ(); z++) { - String data; + Block block = new Location(l1.getWorld(), x, y, z).getBlock(); + BlockData data = block.getBlockData(); if(block.getType().equals(Material.STRUCTURE_VOID)) continue; - scriptBuilder.append("block(").append(x - l1.getBlockX() - centerX).append(", y + ").append(y - l1.getBlockY() - centerY).append(", ").append(z - l1.getBlockZ() - centerZ).append(", ") - .append("\""); BlockState state = block.getState(); if(state instanceof Sign) { Sign sign = (Sign) state; if(sign.getLine(0).equals("[TERRA]")) { - data = sign.getLine(2) + sign.getLine(3); - BlockData data1 = Bukkit.createBlockData(sign.getLine(2) + sign.getLine(3)); - if(data1.getMaterial().equals(Material.STRUCTURE_VOID)) continue; - scriptBuilder.append(data1.getAsString(false)); - } else { - data = block.getBlockData().getAsString(false); + data = Bukkit.createBlockData(sign.getLine(2) + sign.getLine(3)); } - } else { - data = block.getBlockData().getAsString(false); } - scriptBuilder.append(data).append("\");\n"); + if(!data.getMaterial().equals(Material.STRUCTURE_VOID)) { + scriptBuilder.append("block(").append(x - l1.getBlockX() - centerX).append(", y + ").append(y - l1.getBlockY() - centerY).append(", ").append(z - l1.getBlockZ() - centerZ).append(", ") + .append("\""); + scriptBuilder.append(data.getAsString(false)).append("\");\n"); + } } } } From 6bac82da259931f308385f5ab4456b174af64ad4 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 1 Jan 2021 19:55:33 -0700 Subject: [PATCH 162/210] fix terrascript loading logging --- .../api/structures/script/StructureScript.java | 8 ++------ .../com/dfsek/terra/config/base/ConfigPack.java | 16 +++++++++++----- .../dfsek/terra/config/files/FolderLoader.java | 3 ++- .../com/dfsek/terra/config/files/ZIPLoader.java | 3 ++- .../generator/BukkitChunkGeneratorWrapper.java | 4 ++-- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index cca20d6c3..3b685b738 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -35,7 +35,7 @@ public class StructureScript { private final String id; private final LinkedHashMap cache; - public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, LootRegistry lootRegistry, CheckCache cache) { + public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, LootRegistry lootRegistry, CheckCache cache) throws ParseException { Parser parser; try { parser = new Parser(IOUtils.toString(inputStream)); @@ -53,11 +53,7 @@ public class StructureScript { .addFunction("loot", new LootFunctionBuilder(main, lootRegistry)) .addFunction("entity", new EntityFunctionBuilder(main)); - try { - block = parser.parse(); - } catch(ParseException e) { - throw new RuntimeException(e); - } + block = parser.parse(); this.id = parser.getID(); this.cache = new LinkedHashMap() { @Override diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index f1ba1c6f5..89cd9d54b 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -154,15 +154,21 @@ public class ConfigPack implements LoaderRegistrar { varScope.create(var.getKey()).setValue(var.getValue()); } - loader.open("structures/data", ".tesf").then(streams -> streams.forEach(stream -> { - StructureScript structureScript = new StructureScript(stream, main, scriptRegistry, lootRegistry, checkCache); - scriptRegistry.add(structureScript.getId(), structureScript); - })).close().open("structures/loot", ".json").thenEntries(entries -> { + loader.open("structures/data", ".tesf").thenEntries(entries -> { + for(Map.Entry entry : entries) { + try { + StructureScript structureScript = new StructureScript(entry.getValue(), main, scriptRegistry, lootRegistry, checkCache); + scriptRegistry.add(structureScript.getId(), structureScript); + } catch(com.dfsek.terra.api.structures.parser.exceptions.ParseException e) { + throw new LoadException("Unable to load script \"" + entry.getKey() + "\"", e); + } + } + }).close().open("structures/loot", ".json").thenEntries(entries -> { for(Map.Entry entry : entries) { try { lootRegistry.add(entry.getKey(), new LootTable(IOUtils.toString(entry.getValue(), StandardCharsets.UTF_8), main)); } catch(ParseException | IOException | NullPointerException e) { - throw new LoadException("Unable to load loot", e); + throw new LoadException("Unable to load loot table \"" + entry.getKey() + "\"", e); } } }).close(); diff --git a/common/src/main/java/com/dfsek/terra/config/files/FolderLoader.java b/common/src/main/java/com/dfsek/terra/config/files/FolderLoader.java index 7af67ca05..6c5a483dd 100644 --- a/common/src/main/java/com/dfsek/terra/config/files/FolderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/files/FolderLoader.java @@ -31,7 +31,8 @@ public class FolderLoader extends Loader { try(Stream paths = Files.walk(newPath.toPath())) { paths.filter(Files::isRegularFile).filter(file -> file.toString().toLowerCase().endsWith(extension)).forEach(file -> { try { - streams.put(newPath.toURI().relativize(file.toUri()).getPath(), new FileInputStream(file.toFile())); + String rel = newPath.toPath().relativize(file).toString(); + streams.put(rel, new FileInputStream(file.toFile())); } catch(FileNotFoundException e) { e.printStackTrace(); } diff --git a/common/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java b/common/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java index 5d5750f2b..7e4003e77 100644 --- a/common/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/files/ZIPLoader.java @@ -30,7 +30,8 @@ public class ZIPLoader extends Loader { ZipEntry entry = entries.nextElement(); if(!entry.isDirectory() && entry.getName().startsWith(directory) && entry.getName().endsWith(extension)) { try { - streams.put(entry.getName(), file.getInputStream(entry)); + String rel = entry.getName().substring(directory.length() + 1); + streams.put(rel, file.getInputStream(entry)); } catch(IOException e) { e.printStackTrace(); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java index 0f88c5532..673ad3ed2 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitChunkGeneratorWrapper.java @@ -1,5 +1,6 @@ package com.dfsek.terra.bukkit.generator; +import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.generator.GeneratorWrapper; import com.dfsek.terra.api.platform.world.Chunk; @@ -9,7 +10,6 @@ import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.BukkitBiomeGrid; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.generation.MasterChunkGenerator; import com.dfsek.terra.population.CavePopulator; import com.dfsek.terra.population.FloraPopulator; import com.dfsek.terra.population.OrePopulator; @@ -64,7 +64,7 @@ public class BukkitChunkGeneratorWrapper extends ChunkGenerator implements Gener } public static synchronized void fixChunk(Chunk c) { - if(!(c.getWorld().getGenerator() instanceof MasterChunkGenerator)) throw new IllegalArgumentException(); + if(!TerraWorld.isTerraWorld(c.getWorld())) throw new IllegalArgumentException(); popMap.get(c.getWorld()).checkNeighbors(c.getX(), c.getZ(), c.getWorld()); } From 77f348912fed3234586a0311c16aa24575a2e9f2 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 2 Jan 2021 00:44:16 -0700 Subject: [PATCH 163/210] completely redo internal TerraScript args --- .../terra/api/structures/parser/Parser.java | 38 +++----------- .../api/structures/parser/lang/Block.java | 7 +-- .../parser/lang/ImplementationArguments.java | 7 +++ .../api/structures/parser/lang/Item.java | 6 +-- .../lang/constants/ConstantExpression.java | 7 +-- .../lang/functions/builtin/AbsFunction.java | 23 --------- .../lang/functions/builtin/MathFunction.java | 22 -------- .../lang/functions/builtin/PowFunction.java | 25 --------- .../lang/functions/builtin/SqrtFunction.java | 23 --------- .../lang/functions/def/DefinedFunction.java | 9 ++-- .../lang/functions/def/FunctionBlock.java | 8 ++- .../lang/keywords/flow/BreakKeyword.java | 7 +-- .../lang/keywords/flow/ContinueKeyword.java | 7 +-- .../lang/keywords/flow/FailKeyword.java | 7 +-- .../lang/keywords/flow/ReturnKeyword.java | 7 +-- .../lang/keywords/looplike/ForKeyword.java | 11 ++-- .../lang/keywords/looplike/IfKeyword.java | 14 +++-- .../lang/keywords/looplike/WhileKeyword.java | 11 ++-- .../lang/operations/BinaryOperation.java | 9 ++-- .../lang/operations/UnaryOperation.java | 9 ++-- .../parser/lang/variables/Assignment.java | 9 ++-- .../parser/lang/variables/Getter.java | 7 +-- .../script/TerraImplementationArguments.java | 37 ++++++++++++++ .../builders/BinaryNumberFunctionBuilder.java | 51 +++++++++++++++++++ .../builders/UnaryNumberFunctionBuilder.java | 50 ++++++++++++++++++ .../script/functions/BlockFunction.java | 17 +++---- .../script/functions/CheckFunction.java | 17 +++---- .../script/functions/EntityFunction.java | 15 +++--- .../script/functions/GetMarkFunction.java | 18 +++---- .../script/functions/LootFunction.java | 17 +++---- .../script/functions/MarkFunction.java | 15 +++--- .../script/functions/PullFunction.java | 17 +++---- .../script/functions/RandomFunction.java | 10 ++-- .../script/functions/RecursionsFunction.java | 10 ++-- .../script/functions/StructureFunction.java | 19 +++---- .../src/test/java/structure/ParserTest.java | 16 +++--- .../command/structure/SpawnCommand.java | 5 +- 37 files changed, 277 insertions(+), 310 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ImplementationArguments.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/MathFunction.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/TerraImplementationArguments.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/BinaryNumberFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/UnaryNumberFunctionBuilder.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 76ef37386..56b66eeb7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -11,9 +11,6 @@ import com.dfsek.terra.api.structures.parser.lang.constants.NumericConstant; import com.dfsek.terra.api.structures.parser.lang.constants.StringConstant; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; -import com.dfsek.terra.api.structures.parser.lang.functions.builtin.AbsFunction; -import com.dfsek.terra.api.structures.parser.lang.functions.builtin.PowFunction; -import com.dfsek.terra.api.structures.parser.lang.functions.builtin.SqrtFunction; import com.dfsek.terra.api.structures.parser.lang.keywords.flow.BreakKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.flow.ContinueKeyword; import com.dfsek.terra.api.structures.parser.lang.keywords.flow.FailKeyword; @@ -47,19 +44,16 @@ import com.dfsek.terra.api.structures.tokenizer.Token; import com.dfsek.terra.api.structures.tokenizer.Tokenizer; import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; import com.dfsek.terra.api.util.GlueList; -import com.google.common.collect.Sets; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; @SuppressWarnings("unchecked") public class Parser { private final String data; private final Map>> functions = new HashMap<>(); - private final Set builtinFunctions = Sets.newHashSet("abs", "sqrt", "pow"); private String id; @@ -67,7 +61,7 @@ public class Parser { this.data = data; } - public Parser addFunction(String name, FunctionBuilder> functionBuilder) { + public Parser registerFunction(String name, FunctionBuilder> functionBuilder) { functions.put(name, functionBuilder); return this; } @@ -197,7 +191,7 @@ public class Parser { ParserUtil.checkType(tokens.consume(), Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.NUMBER_VARIABLE); Token name = tokens.get(); - if(functions.containsKey(name.getContent()) || variableMap.containsKey(name.getContent()) || builtinFunctions.contains(name.getContent())) + if(functions.containsKey(name.getContent()) || variableMap.containsKey(name.getContent())) throw new ParseException(name.getContent() + " is already defined in this scope", name.getPosition()); initializer = parseAssignment(forVar, tokens, variableMap); @@ -237,7 +231,7 @@ public class Parser { } else if(id.getType().equals(Token.Type.GROUP_BEGIN)) { // Parse grouped expression expression = parseGroup(tokens, variableMap); } else { - if(functions.containsKey(id.getContent()) || builtinFunctions.contains(id.getContent())) + if(functions.containsKey(id.getContent())) expression = parseFunction(tokens, false, variableMap); else if(variableMap.containsKey(id.getContent())) { ParserUtil.checkType(tokens.consume(), Token.Type.IDENTIFIER); @@ -382,7 +376,7 @@ public class Parser { Token name = tokens.get(); ParserUtil.checkType(name, Token.Type.IDENTIFIER); // Name must be an identifier. - if(functions.containsKey(name.getContent()) || variableMap.containsKey(name.getContent()) || builtinFunctions.contains(name.getContent())) + if(functions.containsKey(name.getContent()) || variableMap.containsKey(name.getContent())) throw new ParseException(name.getContent() + " is already defined in this scope", name.getPosition()); variableMap.put(name.getContent(), temp); @@ -414,7 +408,7 @@ public class Parser { Token identifier = tokens.consume(); ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier - if(!functions.containsKey(identifier.getContent()) && !builtinFunctions.contains(identifier.getContent())) + if(!functions.containsKey(identifier.getContent())) throw new ParseException("No such function \"" + identifier.getContent() + "\"", identifier.getPosition()); ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); // Second is body begin @@ -439,28 +433,8 @@ public class Parser { ParserUtil.checkReturnType(argument, builder.getArgument(i)); } return builder.build(args, identifier.getPosition()); - } else { - switch(identifier.getContent()) { - case "abs": - ParserUtil.checkReturnType(args.get(0), Returnable.ReturnType.NUMBER); - if(args.size() != 1) - throw new ParseException("Expected 1 argument; found " + args.size(), identifier.getPosition()); - return new AbsFunction(identifier.getPosition(), (Returnable) args.get(0)); - case "sqrt": - ParserUtil.checkReturnType(args.get(0), Returnable.ReturnType.NUMBER); - if(args.size() != 1) - throw new ParseException("Expected 1 argument; found " + args.size(), identifier.getPosition()); - return new SqrtFunction(identifier.getPosition(), (Returnable) args.get(0)); - case "pow": - ParserUtil.checkReturnType(args.get(0), Returnable.ReturnType.NUMBER); - ParserUtil.checkReturnType(args.get(1), Returnable.ReturnType.NUMBER); - if(args.size() != 2) - throw new ParseException("Expected 1 argument; found " + args.size(), identifier.getPosition()); - return new PowFunction(identifier.getPosition(), (Returnable) args.get(0), (Returnable) args.get(1)); - default: - throw new UnsupportedOperationException("Unsupported function: " + identifier.getContent()); - } } + throw new UnsupportedOperationException("Unsupported function: " + identifier.getContent()); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java index 3bddbbd3b..e709a0a73 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Block.java @@ -1,11 +1,8 @@ package com.dfsek.terra.api.structures.parser.lang; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.List; -import java.util.Random; public class Block implements Item> { private final List> items; @@ -21,9 +18,9 @@ public class Block implements Item> { } @Override - public synchronized ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public synchronized ReturnInfo apply(ImplementationArguments implementationArguments) { for(Item item : items) { - Object result = item.apply(buffer, rotation, random, recursions); + Object result = item.apply(implementationArguments); if(result instanceof ReturnInfo) { ReturnInfo level = (ReturnInfo) result; if(!level.getLevel().equals(ReturnLevel.NONE)) return level; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ImplementationArguments.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ImplementationArguments.java new file mode 100644 index 000000000..cd71207a2 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/ImplementationArguments.java @@ -0,0 +1,7 @@ +package com.dfsek.terra.api.structures.parser.lang; + +/** + * Arguments passed to {@link Item}s by the implementation + */ +public interface ImplementationArguments { +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java index 9b6c752f4..f8b714d87 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/Item.java @@ -1,13 +1,9 @@ package com.dfsek.terra.api.structures.parser.lang; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public interface Item { - T apply(Buffer buffer, Rotation rotation, Random random, int recursions); + T apply(ImplementationArguments implementationArguments); Position getPosition(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java index cb62ef26d..730270f5e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/constants/ConstantExpression.java @@ -1,12 +1,9 @@ package com.dfsek.terra.api.structures.parser.lang.constants; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public abstract class ConstantExpression implements Returnable { private final T constant; private final Position position; @@ -17,7 +14,7 @@ public abstract class ConstantExpression implements Returnable { } @Override - public T apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public T apply(ImplementationArguments implementationArguments) { return constant; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java deleted file mode 100644 index 0e71693e0..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/AbsFunction.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.dfsek.terra.api.structures.parser.lang.functions.builtin; - -import com.dfsek.terra.api.structures.parser.lang.Returnable; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; -import com.dfsek.terra.api.structures.tokenizer.Position; -import net.jafama.FastMath; - -import java.util.Random; - -public class AbsFunction extends MathFunction { - private final Returnable returnable; - - public AbsFunction(Position position, Returnable returnable) { - super(position); - this.returnable = returnable; - } - - @Override - public Number apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - return FastMath.abs(returnable.apply(buffer, rotation, random, recursions).doubleValue()); - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/MathFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/MathFunction.java deleted file mode 100644 index f05da3b83..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/MathFunction.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.dfsek.terra.api.structures.parser.lang.functions.builtin; - -import com.dfsek.terra.api.structures.parser.lang.functions.Function; -import com.dfsek.terra.api.structures.tokenizer.Position; - -public abstract class MathFunction implements Function { - private final Position position; - - protected MathFunction(Position position) { - this.position = position; - } - - @Override - public ReturnType returnType() { - return ReturnType.NUMBER; - } - - @Override - public Position getPosition() { - return position; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java deleted file mode 100644 index 03f21a69f..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/PowFunction.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.dfsek.terra.api.structures.parser.lang.functions.builtin; - -import com.dfsek.terra.api.structures.parser.lang.Returnable; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; -import com.dfsek.terra.api.structures.tokenizer.Position; -import net.jafama.FastMath; - -import java.util.Random; - -public class PowFunction extends MathFunction { - private final Returnable base; - private final Returnable power; - - public PowFunction(Position position, Returnable base, Returnable power) { - super(position); - this.base = base; - this.power = power; - } - - @Override - public Number apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - return FastMath.pow(base.apply(buffer, rotation, random, recursions).doubleValue(), power.apply(buffer, rotation, random, recursions).doubleValue()); - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java deleted file mode 100644 index 3dbc1ce85..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/builtin/SqrtFunction.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.dfsek.terra.api.structures.parser.lang.functions.builtin; - -import com.dfsek.terra.api.structures.parser.lang.Returnable; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; -import com.dfsek.terra.api.structures.tokenizer.Position; -import net.jafama.FastMath; - -import java.util.Random; - -public class SqrtFunction extends MathFunction { - private final Returnable returnable; - - public SqrtFunction(Position position, Returnable returnable) { - super(position); - this.returnable = returnable; - } - - @Override - public Number apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - return FastMath.sqrt(returnable.apply(buffer, rotation, random, recursions).doubleValue()); - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java index f06654de3..cfecc9f98 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/DefinedFunction.java @@ -1,12 +1,9 @@ package com.dfsek.terra.api.structures.parser.lang.functions.def; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.functions.Function; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public abstract class DefinedFunction implements Function { private final FunctionBlock block; private final String name; @@ -19,8 +16,8 @@ public abstract class DefinedFunction implements Function { } @Override - public T apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - return block.apply(buffer, rotation, random, recursions); + public T apply(ImplementationArguments implementationArguments) { + return block.apply(implementationArguments); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/FunctionBlock.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/FunctionBlock.java index f0a55ab2f..0bf74c60c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/FunctionBlock.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/functions/def/FunctionBlock.java @@ -1,13 +1,11 @@ package com.dfsek.terra.api.structures.parser.lang.functions.def; import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Item; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.List; -import java.util.Random; public class FunctionBlock implements Item { private final List> items; @@ -26,9 +24,9 @@ public class FunctionBlock implements Item { @SuppressWarnings("unchecked") @Override - public synchronized T apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public synchronized T apply(ImplementationArguments implementationArguments) { for(Item item : items) { - Object result = item.apply(buffer, rotation, random, recursions); + Object result = item.apply(implementationArguments); if(result instanceof Block.ReturnInfo) { Block.ReturnInfo level = (Block.ReturnInfo) result; if(level.getLevel().equals(Block.ReturnLevel.RETURN)) return level.getData(); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/BreakKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/BreakKeyword.java index 1211007fd..04068f356 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/BreakKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/BreakKeyword.java @@ -1,13 +1,10 @@ package com.dfsek.terra.api.structures.parser.lang.keywords.flow; import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Keyword; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public class BreakKeyword implements Keyword> { private final Position position; @@ -16,7 +13,7 @@ public class BreakKeyword implements Keyword> { } @Override - public Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public Block.ReturnInfo apply(ImplementationArguments implementationArguments) { return new Block.ReturnInfo<>(Block.ReturnLevel.BREAK, null); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ContinueKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ContinueKeyword.java index a958b80a6..fc345a9fd 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ContinueKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ContinueKeyword.java @@ -1,13 +1,10 @@ package com.dfsek.terra.api.structures.parser.lang.keywords.flow; import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Keyword; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public class ContinueKeyword implements Keyword> { private final Position position; @@ -16,7 +13,7 @@ public class ContinueKeyword implements Keyword> { } @Override - public Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public Block.ReturnInfo apply(ImplementationArguments implementationArguments) { return new Block.ReturnInfo<>(Block.ReturnLevel.CONTINUE, null); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/FailKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/FailKeyword.java index 1885d26e6..0b08a04e4 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/FailKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/FailKeyword.java @@ -1,13 +1,10 @@ package com.dfsek.terra.api.structures.parser.lang.keywords.flow; import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Keyword; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public class FailKeyword implements Keyword> { private final Position position; @@ -16,7 +13,7 @@ public class FailKeyword implements Keyword> { } @Override - public Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public Block.ReturnInfo apply(ImplementationArguments implementationArguments) { return new Block.ReturnInfo<>(Block.ReturnLevel.FAIL, null); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ReturnKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ReturnKeyword.java index 7f2d2c87b..3895cdfc5 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ReturnKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/flow/ReturnKeyword.java @@ -1,13 +1,10 @@ package com.dfsek.terra.api.structures.parser.lang.keywords.flow; import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Keyword; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public class ReturnKeyword implements Keyword> { private final Position position; @@ -16,7 +13,7 @@ public class ReturnKeyword implements Keyword> { } @Override - public Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public Block.ReturnInfo apply(ImplementationArguments implementationArguments) { return new Block.ReturnInfo<>(Block.ReturnLevel.RETURN, null); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java index 5f9eb4c89..10d33e25b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/ForKeyword.java @@ -1,15 +1,12 @@ package com.dfsek.terra.api.structures.parser.lang.keywords.looplike; import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.parser.lang.Returnable; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public class ForKeyword implements Keyword> { private final Block conditional; private final Item initializer; @@ -26,9 +23,9 @@ public class ForKeyword implements Keyword> { } @Override - public Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - for(initializer.apply(buffer, rotation, random, recursions); statement.apply(buffer, rotation, random, recursions); incrementer.apply(buffer, rotation, random, recursions)) { - Block.ReturnInfo level = conditional.apply(buffer, rotation, random, recursions); + public Block.ReturnInfo apply(ImplementationArguments implementationArguments) { + for(initializer.apply(implementationArguments); statement.apply(implementationArguments); incrementer.apply(implementationArguments)) { + Block.ReturnInfo level = conditional.apply(implementationArguments); if(level.getLevel().equals(Block.ReturnLevel.BREAK)) break; if(level.getLevel().isReturnFast()) return level; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java index 683bca13c..b6e0845f6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/IfKeyword.java @@ -1,15 +1,13 @@ package com.dfsek.terra.api.structures.parser.lang.keywords.looplike; import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.parser.lang.Returnable; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Random; public class IfKeyword implements Keyword> { private final Block conditional; @@ -27,15 +25,15 @@ public class IfKeyword implements Keyword> { } @Override - public Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - if(statement.apply(buffer, rotation, random, recursions)) return conditional.apply(buffer, rotation, random, recursions); + public Block.ReturnInfo apply(ImplementationArguments implementationArguments) { + if(statement.apply(implementationArguments)) return conditional.apply(implementationArguments); else { for(Pair, Block> pair : elseIf) { - if(pair.getLeft().apply(buffer, rotation, random, recursions)) { - return pair.getRight().apply(buffer, rotation, random, recursions); + if(pair.getLeft().apply(implementationArguments)) { + return pair.getRight().apply(implementationArguments); } } - if(elseBlock != null) return elseBlock.apply(buffer, rotation, random, recursions); + if(elseBlock != null) return elseBlock.apply(implementationArguments); } return new Block.ReturnInfo<>(Block.ReturnLevel.NONE, null); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java index c08c0d51f..72029f7e2 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/keywords/looplike/WhileKeyword.java @@ -1,14 +1,11 @@ package com.dfsek.terra.api.structures.parser.lang.keywords.looplike; import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Keyword; import com.dfsek.terra.api.structures.parser.lang.Returnable; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public class WhileKeyword implements Keyword> { private final Block conditional; private final Returnable statement; @@ -21,9 +18,9 @@ public class WhileKeyword implements Keyword> { } @Override - public Block.ReturnInfo apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - while(statement.apply(buffer, rotation, random, recursions)) { - Block.ReturnInfo level = conditional.apply(buffer, rotation, random, recursions); + public Block.ReturnInfo apply(ImplementationArguments implementationArguments) { + while(statement.apply(implementationArguments)) { + Block.ReturnInfo level = conditional.apply(implementationArguments); if(level.getLevel().equals(Block.ReturnLevel.BREAK)) break; if(level.getLevel().isReturnFast()) return level; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java index 5c6fd1cfb..6d35d49b2 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/BinaryOperation.java @@ -1,12 +1,9 @@ package com.dfsek.terra.api.structures.parser.lang.operations; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public abstract class BinaryOperation implements Returnable { private final Returnable left; private final Returnable right; @@ -26,7 +23,7 @@ public abstract class BinaryOperation implements Returnable { } @Override - public O apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - return apply(left.apply(buffer, rotation, random, recursions), right.apply(buffer, rotation, random, recursions)); + public O apply(ImplementationArguments implementationArguments) { + return apply(left.apply(implementationArguments), right.apply(implementationArguments)); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java index e1c145e95..312975fdd 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/UnaryOperation.java @@ -1,12 +1,9 @@ package com.dfsek.terra.api.structures.parser.lang.operations; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public abstract class UnaryOperation implements Returnable { private final Returnable input; private final Position position; @@ -19,8 +16,8 @@ public abstract class UnaryOperation implements Returnable { public abstract T apply(T input); @Override - public T apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - return apply(input.apply(buffer, rotation, random, recursions)); + public T apply(ImplementationArguments implementationArguments) { + return apply(input.apply(implementationArguments)); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java index 006769089..52a588191 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Assignment.java @@ -1,13 +1,10 @@ package com.dfsek.terra.api.structures.parser.lang.variables; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Item; import com.dfsek.terra.api.structures.parser.lang.Returnable; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public class Assignment implements Item { private final Variable delegate; private final Returnable value; @@ -20,8 +17,8 @@ public class Assignment implements Item { } @Override - public synchronized T apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - T val = value.apply(buffer, rotation, random, recursions); + public synchronized T apply(ImplementationArguments implementationArguments) { + T val = value.apply(implementationArguments); delegate.setValue(val); return val; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java index 20823fb4f..b7a1ca856 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/variables/Getter.java @@ -1,12 +1,9 @@ package com.dfsek.terra.api.structures.parser.lang.variables; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public class Getter implements Returnable { private final Variable delegate; @@ -20,7 +17,7 @@ public class Getter implements Returnable { } @Override - public synchronized Object apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public synchronized Object apply(ImplementationArguments implementationArguments) { return delegate.getValue(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/TerraImplementationArguments.java b/common/src/main/java/com/dfsek/terra/api/structures/script/TerraImplementationArguments.java new file mode 100644 index 000000000..4183bc583 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/TerraImplementationArguments.java @@ -0,0 +1,37 @@ +package com.dfsek.terra.api.structures.script; + +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; +import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.structure.buffer.Buffer; + +import java.util.Random; + +public class TerraImplementationArguments implements ImplementationArguments { + private final Buffer buffer; + private final Rotation rotation; + private final Random random; + private final int recursions; + + public TerraImplementationArguments(Buffer buffer, Rotation rotation, Random random, int recursions) { + this.buffer = buffer; + this.rotation = rotation; + this.random = random; + this.recursions = recursions; + } + + public Buffer getBuffer() { + return buffer; + } + + public int getRecursions() { + return recursions; + } + + public Random getRandom() { + return random; + } + + public Rotation getRotation() { + return rotation; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BinaryNumberFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BinaryNumberFunctionBuilder.java new file mode 100644 index 000000000..52deee579 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BinaryNumberFunctionBuilder.java @@ -0,0 +1,51 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; +import java.util.function.BiFunction; + +public class BinaryNumberFunctionBuilder implements FunctionBuilder> { + + private final BiFunction function; + + public BinaryNumberFunctionBuilder(BiFunction function) { + this.function = function; + } + + @Override + public Function build(List> argumentList, Position position) { + return new Function() { + @Override + public ReturnType returnType() { + return ReturnType.NUMBER; + } + + @SuppressWarnings("unchecked") + @Override + public Number apply(ImplementationArguments implementationArguments) { + return function.apply(((Returnable) argumentList.get(0)).apply(implementationArguments), ((Returnable) argumentList.get(1)).apply(implementationArguments)); + } + + @Override + public Position getPosition() { + return position; + } + }; + } + + @Override + public int argNumber() { + return 2; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + if(position == 0 || position == 1) return Returnable.ReturnType.NUMBER; + return null; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/UnaryNumberFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/UnaryNumberFunctionBuilder.java new file mode 100644 index 000000000..93bfe01ba --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/UnaryNumberFunctionBuilder.java @@ -0,0 +1,50 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class UnaryNumberFunctionBuilder implements FunctionBuilder> { + + private final java.util.function.Function function; + + public UnaryNumberFunctionBuilder(java.util.function.Function function) { + this.function = function; + } + + @Override + public Function build(List> argumentList, Position position) { + return new Function() { + @Override + public ReturnType returnType() { + return ReturnType.NUMBER; + } + + @SuppressWarnings("unchecked") + @Override + public Number apply(ImplementationArguments implementationArguments) { + return function.apply(((Returnable) argumentList.get(0)).apply(implementationArguments)); + } + + @Override + public Position getPosition() { + return position; + } + }; + } + + @Override + public int argNumber() { + return 1; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + if(position == 0) return Returnable.ReturnType.NUMBER; + return null; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index 44f671c61..953d3505a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -5,18 +5,16 @@ import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression; import com.dfsek.terra.api.structures.parser.lang.functions.Function; -import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.items.BufferedBlock; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; -import java.util.Random; - public class BlockFunction implements Function { private final BlockData data; private final Returnable x, y, z; @@ -33,13 +31,14 @@ public class BlockFunction implements Function { } @Override - public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); + public Void apply(ImplementationArguments implementationArguments) { + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; + Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); - RotationUtil.rotateVector(xz, rotation); + RotationUtil.rotateVector(xz, arguments.getRotation()); BlockData rot = data.clone(); - RotationUtil.rotateBlockData(rot, rotation.inverse()); - buffer.addItem(new BufferedBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse()); + arguments.getBuffer().addItem(new BufferedBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index 67e4c6a73..13d8efdf3 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -6,11 +6,11 @@ import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; -import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.world.CheckCache; import com.dfsek.terra.api.world.generation.GenerationPhase; @@ -19,8 +19,6 @@ import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.config.templates.BiomeTemplate; import net.jafama.FastMath; -import java.util.Random; - public class CheckFunction implements Function { private final TerraPlugin main; private final Returnable x, y, z; @@ -38,15 +36,16 @@ public class CheckFunction implements Function { @Override - public String apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public String apply(ImplementationArguments implementationArguments) { + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); + Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); - RotationUtil.rotateVector(xz, rotation); + RotationUtil.rotateVector(xz, arguments.getRotation()); - Location location = buffer.getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + Location location = arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); - return apply(location, buffer.getOrigin().getWorld()); + return apply(location, arguments.getBuffer().getOrigin().getWorld()); } private String apply(Location vector, World world) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java index 3a81a8351..614603d09 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java @@ -5,18 +5,16 @@ import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.entity.EntityType; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression; import com.dfsek.terra.api.structures.parser.lang.functions.Function; -import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.items.BufferedEntity; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; -import java.util.Random; - public class EntityFunction implements Function { private final EntityType data; private final Returnable x, y, z; @@ -33,12 +31,13 @@ public class EntityFunction implements Function { } @Override - public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); + public Void apply(ImplementationArguments implementationArguments) { + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; + Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); - RotationUtil.rotateVector(xz, rotation); + RotationUtil.rotateVector(xz, arguments.getRotation()); - buffer.addItem(new BufferedEntity(data), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + arguments.getBuffer().addItem(new BufferedEntity(data), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java index 86540f2f0..797544529 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java @@ -2,23 +2,20 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; -import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; -import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.items.Mark; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; -import java.util.Random; - public class GetMarkFunction implements Function { private final Returnable x, y, z; private final Position position; - public GetMarkFunction(Returnable x, Returnable y, Returnable z, Position position) throws ParseException { + public GetMarkFunction(Returnable x, Returnable y, Returnable z, Position position) { this.position = position; this.x = x; this.y = y; @@ -26,11 +23,12 @@ public class GetMarkFunction implements Function { } @Override - public String apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); + public String apply(ImplementationArguments implementationArguments) { + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; + Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); - RotationUtil.rotateVector(xz, rotation); - Mark mark = buffer.getMark(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + RotationUtil.rotateVector(xz, arguments.getRotation()); + Mark mark = arguments.getBuffer().getMark(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); return mark == null ? "" : mark.getContent(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java index 1fddda10f..d1f197e25 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java @@ -4,18 +4,16 @@ import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.structures.loot.LootTable; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; -import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.items.BufferedLootApplication; import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.registry.LootRegistry; import net.jafama.FastMath; -import java.util.Random; - public class LootFunction implements Function { private final LootRegistry registry; private final Returnable data; @@ -34,12 +32,13 @@ public class LootFunction implements Function { } @Override - public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); + public Void apply(ImplementationArguments implementationArguments) { + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; + Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); - RotationUtil.rotateVector(xz, rotation); + RotationUtil.rotateVector(xz, arguments.getRotation()); - String id = data.apply(buffer, rotation, random, recursions); + String id = data.apply(implementationArguments); LootTable table = registry.get(id); if(table == null) { @@ -47,7 +46,7 @@ public class LootFunction implements Function { return null; } - buffer.addItem(new BufferedLootApplication(table, main), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + arguments.getBuffer().addItem(new BufferedLootApplication(table, main), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java index 979aeffca..671973eb3 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java @@ -3,17 +3,15 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; -import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.items.Mark; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; -import java.util.Random; - public class MarkFunction implements Function { private final Returnable x, y, z; private final Position position; @@ -28,12 +26,13 @@ public class MarkFunction implements Function { } @Override - public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); + public Void apply(ImplementationArguments implementationArguments) { + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; + Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); - RotationUtil.rotateVector(xz, rotation); + RotationUtil.rotateVector(xz, arguments.getRotation()); - buffer.setMark(new Mark(mark.apply(buffer, rotation, random, recursions)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + arguments.getBuffer().setMark(new Mark(mark.apply(implementationArguments)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java index ad323307f..8f6e45a86 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java @@ -5,18 +5,16 @@ import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.constants.ConstantExpression; import com.dfsek.terra.api.structures.parser.lang.functions.Function; -import com.dfsek.terra.api.structures.structure.Rotation; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.items.BufferedPulledBlock; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; -import java.util.Random; - public class PullFunction implements Function { private final BlockData data; private final Returnable x, y, z; @@ -33,13 +31,14 @@ public class PullFunction implements Function { } @Override - public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); + public Void apply(ImplementationArguments implementationArguments) { + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; + Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); - RotationUtil.rotateVector(xz, rotation); + RotationUtil.rotateVector(xz, arguments.getRotation()); BlockData rot = data.clone(); - RotationUtil.rotateBlockData(rot, rotation.inverse()); - buffer.addItem(new BufferedPulledBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ()))); + RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse()); + arguments.getBuffer().addItem(new BufferedPulledBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java index f1175b35b..e61952bfe 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RandomFunction.java @@ -1,13 +1,11 @@ package com.dfsek.terra.api.structures.script.functions; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public class RandomFunction implements Function { private final Returnable numberReturnable; private final Position position; @@ -24,8 +22,8 @@ public class RandomFunction implements Function { } @Override - public Integer apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - return random.nextInt(numberReturnable.apply(buffer, rotation, random, recursions).intValue()); // TODO: deterministic random + public Integer apply(ImplementationArguments implementationArguments) { + return ((TerraImplementationArguments) implementationArguments).getRandom().nextInt(numberReturnable.apply(implementationArguments).intValue()); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java index ee37a4a49..a8725d57f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/RecursionsFunction.java @@ -1,12 +1,10 @@ package com.dfsek.terra.api.structures.script.functions; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.functions.Function; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.tokenizer.Position; -import java.util.Random; - public class RecursionsFunction implements Function { private final Position position; @@ -20,8 +18,8 @@ public class RecursionsFunction implements Function { } @Override - public Number apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - return recursions; + public Number apply(ImplementationArguments implementationArguments) { + return ((TerraImplementationArguments) implementationArguments).getRecursions(); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index 58bbfaee9..7a4c41184 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -3,19 +3,19 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.script.StructureScript; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.RotationUtil; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.IntermediateBuffer; import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.registry.ScriptRegistry; import net.jafama.FastMath; import java.util.List; -import java.util.Random; public class StructureFunction implements Function { private final ScriptRegistry registry; @@ -42,13 +42,14 @@ public class StructureFunction implements Function { } @Override - public Boolean apply(Buffer buffer, Rotation rotation, Random random, int recursions) { + public Boolean apply(ImplementationArguments implementationArguments) { + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; - Vector2 xz = new Vector2(x.apply(buffer, rotation, random, recursions).doubleValue(), z.apply(buffer, rotation, random, recursions).doubleValue()); + Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); - RotationUtil.rotateVector(xz, rotation); + RotationUtil.rotateVector(xz, arguments.getRotation()); - String app = id.apply(buffer, rotation, random, recursions); + String app = id.apply(implementationArguments); StructureScript script = registry.get(app); if(script == null) { main.getLogger().severe("No such structure " + app); @@ -56,7 +57,7 @@ public class StructureFunction implements Function { } Rotation rotation1; - String rotString = rotations.get(random.nextInt(rotations.size())).apply(buffer, rotation, random, recursions); + String rotString = rotations.get(arguments.getRandom().nextInt(rotations.size())).apply(implementationArguments); try { rotation1 = Rotation.valueOf(rotString); } catch(IllegalArgumentException e) { @@ -64,9 +65,9 @@ public class StructureFunction implements Function { return null; } - Vector3 offset = new Vector3(FastMath.roundToInt(xz.getX()), y.apply(buffer, rotation, random, recursions).intValue(), FastMath.roundToInt(xz.getZ())); + Vector3 offset = new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ())); - return script.executeInBuffer(new IntermediateBuffer(buffer, offset), random, rotation.rotate(rotation1), recursions + 1); + return script.executeInBuffer(new IntermediateBuffer(arguments.getBuffer(), offset), arguments.getRandom(), arguments.getRotation().rotate(rotation1), arguments.getRecursions() + 1); } @Override diff --git a/common/src/test/java/structure/ParserTest.java b/common/src/test/java/structure/ParserTest.java index b670cedbd..4dd7e1b68 100644 --- a/common/src/test/java/structure/ParserTest.java +++ b/common/src/test/java/structure/ParserTest.java @@ -3,27 +3,25 @@ package structure; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; -import com.dfsek.terra.api.structures.structure.Rotation; -import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.tokenizer.Position; import org.apache.commons.io.IOUtils; import org.junit.jupiter.api.Test; import java.io.IOException; import java.util.List; -import java.util.Random; public class ParserTest { @Test public void parse() throws IOException, ParseException { Parser parser = new Parser(IOUtils.toString(getClass().getResourceAsStream("/test.tesf"))); - parser.addFunction("test", new FunctionBuilder() { + parser.registerFunction("test", new FunctionBuilder() { @Override - public Test1 build(List> argumentList, Position position) throws ParseException { + public Test1 build(List> argumentList, Position position) { return new Test1(argumentList.get(0), argumentList.get(1), position); } @@ -51,9 +49,9 @@ public class ParserTest { long t = System.nanoTime() - l; System.out.println("Took " + (double) t / 1000000); - block.apply(null, Rotation.NONE, new Random(), 0); + block.apply(null); - block.apply(null, Rotation.NONE, new Random(), 0); + block.apply(null); } private static class Test1 implements Function { @@ -68,8 +66,8 @@ public class ParserTest { } @Override - public Void apply(Buffer buffer, Rotation rotation, Random random, int recursions) { - System.out.println("string: " + a.apply(buffer, rotation, random, recursions) + ", double: " + b.apply(buffer, rotation, random, recursions)); + public Void apply(ImplementationArguments implementationArguments) { + System.out.println("string: " + a.apply(implementationArguments) + ", double: " + b.apply(implementationArguments)); return null; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java index 59d77fbd9..ef3104cce 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java @@ -1,6 +1,7 @@ package com.dfsek.terra.bukkit.command.command.structure; import com.dfsek.terra.api.structures.parser.lang.constants.NumericConstant; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.script.functions.CheckFunction; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer; @@ -32,9 +33,9 @@ public class SpawnCommand extends WorldCommand implements DebugCommand { int z = p.getBlockZ(); Position dummy = new Position(0, 0); com.dfsek.terra.api.platform.world.World w = BukkitAdapter.adapt(world); - String check = new CheckFunction(getMain(), new NumericConstant(0, dummy), new NumericConstant(0, dummy), new NumericConstant(0, dummy), getMain().getWorld(w).getConfig().getCheckCache(), dummy).apply(new StructureBuffer( + String check = new CheckFunction(getMain(), new NumericConstant(0, dummy), new NumericConstant(0, dummy), new NumericConstant(0, dummy), getMain().getWorld(w).getConfig().getCheckCache(), dummy).apply(new TerraImplementationArguments(new StructureBuffer( new com.dfsek.terra.api.math.vector.Location(w, x, y, z) - ), Rotation.NONE, new FastRandom(), 0); + ), Rotation.NONE, new FastRandom(), 0)); sender.sendMessage("Found: " + check); return true; From ddc218c4d480a2c7947f7f531391306f2114da82 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 2 Jan 2021 00:44:26 -0700 Subject: [PATCH 164/210] Add more math functions --- .../structures/script/StructureScript.java | 40 ++++++++++++------- 1 file changed, 26 insertions(+), 14 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 3b685b738..2af28fe94 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.script.builders.BinaryNumberFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.EntityFunctionBuilder; @@ -16,12 +17,14 @@ import com.dfsek.terra.api.structures.script.builders.PullFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RandomFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RecursionsFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.UnaryNumberFunctionBuilder; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer; import com.dfsek.terra.api.structures.world.CheckCache; import com.dfsek.terra.registry.LootRegistry; import com.dfsek.terra.registry.ScriptRegistry; +import net.jafama.FastMath; import org.apache.commons.io.IOUtils; import java.io.IOException; @@ -42,16 +45,25 @@ public class StructureScript { } catch(IOException e) { throw new RuntimeException(e); } - parser.addFunction("block", new BlockFunctionBuilder(main)) - .addFunction("check", new CheckFunctionBuilder(main, cache)) - .addFunction("structure", new StructureFunctionBuilder(registry, main)) - .addFunction("randomInt", new RandomFunctionBuilder()) - .addFunction("recursions", new RecursionsFunctionBuilder()) - .addFunction("setMark", new MarkFunctionBuilder()) - .addFunction("getMark", new GetMarkFunctionBuilder()) - .addFunction("pull", new PullFunctionBuilder(main)) - .addFunction("loot", new LootFunctionBuilder(main, lootRegistry)) - .addFunction("entity", new EntityFunctionBuilder(main)); + parser.registerFunction("block", new BlockFunctionBuilder(main)) + .registerFunction("check", new CheckFunctionBuilder(main, cache)) + .registerFunction("structure", new StructureFunctionBuilder(registry, main)) + .registerFunction("randomInt", new RandomFunctionBuilder()) + .registerFunction("recursions", new RecursionsFunctionBuilder()) + .registerFunction("setMark", new MarkFunctionBuilder()) + .registerFunction("getMark", new GetMarkFunctionBuilder()) + .registerFunction("pull", new PullFunctionBuilder(main)) + .registerFunction("loot", new LootFunctionBuilder(main, lootRegistry)) + .registerFunction("entity", new EntityFunctionBuilder(main)) + .registerFunction("abs", new UnaryNumberFunctionBuilder(number -> FastMath.abs(number.doubleValue()))) + .registerFunction("pow", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.pow(number.doubleValue(), number2.doubleValue()))) + .registerFunction("sqrt", new UnaryNumberFunctionBuilder(number -> FastMath.sqrt(number.doubleValue()))) + .registerFunction("floor", new UnaryNumberFunctionBuilder(number -> FastMath.floor(number.doubleValue()))) + .registerFunction("ceil", new UnaryNumberFunctionBuilder(number -> FastMath.ceil(number.doubleValue()))) + .registerFunction("log", new UnaryNumberFunctionBuilder(number -> FastMath.log(number.doubleValue()))) + .registerFunction("round", new UnaryNumberFunctionBuilder(number -> FastMath.round(number.doubleValue()))) + .registerFunction("max", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.max(number.doubleValue(), number2.doubleValue()))) + .registerFunction("min", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.min(number.doubleValue(), number2.doubleValue()))); block = parser.parse(); this.id = parser.getID(); @@ -72,7 +84,7 @@ public class StructureScript { */ public boolean execute(Location location, Random random, Rotation rotation) { StructureBuffer buffer = new StructureBuffer(location); - Block.ReturnInfo level = block.apply(buffer, rotation, random, 0); + Block.ReturnInfo level = block.apply(new TerraImplementationArguments(buffer, rotation, random, 0)); buffer.paste(); return !level.getLevel().equals(Block.ReturnLevel.FAIL); } @@ -80,7 +92,7 @@ public class StructureScript { public boolean execute(Location location, Chunk chunk, Random random, Rotation rotation) { StructureBuffer buffer = cache.computeIfAbsent(location, loc -> { StructureBuffer buf = new StructureBuffer(loc); - Block.ReturnInfo level = block.apply(buf, rotation, random, 0); + Block.ReturnInfo level = block.apply(new TerraImplementationArguments(buf, rotation, random, 0)); buf.setSucceeded(!level.getLevel().equals(Block.ReturnLevel.FAIL)); return buf; }); @@ -90,11 +102,11 @@ public class StructureScript { public boolean test(Location location, Random random, Rotation rotation) { StructureBuffer buffer = new StructureBuffer(location); - return !block.apply(buffer, rotation, random, 0).equals(Block.ReturnLevel.FAIL); + return !block.apply(new TerraImplementationArguments(buffer, rotation, random, 0)).equals(Block.ReturnLevel.FAIL); } public boolean executeInBuffer(Buffer buffer, Random random, Rotation rotation, int recursions) { - return !block.apply(buffer, rotation, random, recursions).equals(Block.ReturnLevel.FAIL); + return !block.apply(new TerraImplementationArguments(buffer, rotation, random, recursions)).equals(Block.ReturnLevel.FAIL); } public String getId() { From b209c49877b7f93627b89c7d78a02663aa081c08 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 2 Jan 2021 00:50:07 -0700 Subject: [PATCH 165/210] BukkitRail --- .../dfsek/terra/bukkit/world/block/data/BukkitBlockData.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java index 7515ea66e..63b54316c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java @@ -7,6 +7,7 @@ import org.bukkit.block.data.AnaloguePowerable; import org.bukkit.block.data.Directional; import org.bukkit.block.data.MultipleFacing; import org.bukkit.block.data.Orientable; +import org.bukkit.block.data.Rail; import org.bukkit.block.data.Rotatable; import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.RedstoneWire; @@ -22,6 +23,8 @@ public class BukkitBlockData implements BlockData { } public static BukkitBlockData newInstance(org.bukkit.block.data.BlockData bukkitData) { + + if(bukkitData instanceof Rail) return new BukkitRail((Rail) bukkitData); if(bukkitData instanceof Stairs) return new BukkitStairs((Stairs) bukkitData); if(bukkitData instanceof Slab) return new BukkitSlab((Slab) bukkitData); if(bukkitData instanceof Wall) return new BukkitWall((Wall) bukkitData); From 0fef1619d232631568c49808560681367d117dd9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 2 Jan 2021 01:08:45 -0700 Subject: [PATCH 166/210] implement ModuloOperation --- .../terra/api/structures/parser/Parser.java | 3 +++ .../api/structures/parser/ParserUtil.java | 2 +- .../lang/operations/ModuloOperation.java | 20 +++++++++++++++++++ .../script/builders/BlockFunctionBuilder.java | 10 ++++++++-- .../script/functions/BlockFunction.java | 6 ++++-- .../structure/buffer/items/BufferedBlock.java | 8 ++++++-- .../terra/api/structures/tokenizer/Token.java | 10 ++++++++-- .../api/structures/tokenizer/Tokenizer.java | 2 ++ 8 files changed, 52 insertions(+), 9 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ModuloOperation.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 56b66eeb7..f88a02703 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -24,6 +24,7 @@ import com.dfsek.terra.api.structures.parser.lang.operations.BooleanNotOperation import com.dfsek.terra.api.structures.parser.lang.operations.BooleanOrOperation; import com.dfsek.terra.api.structures.parser.lang.operations.ConcatenationOperation; import com.dfsek.terra.api.structures.parser.lang.operations.DivisionOperation; +import com.dfsek.terra.api.structures.parser.lang.operations.ModuloOperation; import com.dfsek.terra.api.structures.parser.lang.operations.MultiplicationOperation; import com.dfsek.terra.api.structures.parser.lang.operations.NumberAdditionOperation; import com.dfsek.terra.api.structures.parser.lang.operations.SubtractionOperation; @@ -321,6 +322,8 @@ public class Parser { return new BooleanAndOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); case BOOLEAN_OR: return new BooleanOrOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); + case MODULO_OPERATOR: + return new ModuloOperation((Returnable) left, (Returnable) right, binaryOperator.getPosition()); default: throw new UnsupportedOperationException("Unsupported binary operator: " + binaryOperator.getType()); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java index 0462d630c..212d99d70 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java @@ -12,7 +12,7 @@ import java.util.Map; public class ParserUtil { private static final Map> PRECEDENCE = new HashMap<>(); - private static final List ARITHMETIC = Arrays.asList(Token.Type.ADDITION_OPERATOR, Token.Type.SUBTRACTION_OPERATOR, Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR); + private static final List ARITHMETIC = Arrays.asList(Token.Type.ADDITION_OPERATOR, Token.Type.SUBTRACTION_OPERATOR, Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR, Token.Type.MODULO_OPERATOR); private static final List COMPARISON = Arrays.asList(Token.Type.EQUALS_OPERATOR, Token.Type.NOT_EQUALS_OPERATOR, Token.Type.LESS_THAN_OPERATOR, Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, Token.Type.GREATER_THAN_OPERATOR, Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR); static { // Setup precedence diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ModuloOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ModuloOperation.java new file mode 100644 index 000000000..44ef9a7d1 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/ModuloOperation.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class ModuloOperation extends BinaryOperation { + public ModuloOperation(Returnable left, Returnable right, Position start) { + super(left, right, start); + } + + @Override + public Number apply(Number left, Number right) { + return left.doubleValue() % right.doubleValue(); + } + + @Override + public ReturnType returnType() { + return ReturnType.NUMBER; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java index 8997bd937..116681866 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BlockFunctionBuilder.java @@ -3,6 +3,7 @@ package com.dfsek.terra.api.structures.script.builders; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.constants.BooleanConstant; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.script.functions.BlockFunction; import com.dfsek.terra.api.structures.tokenizer.Position; @@ -19,12 +20,15 @@ public class BlockFunctionBuilder implements FunctionBuilder { @SuppressWarnings("unchecked") @Override public BlockFunction build(List> argumentList, Position position) throws ParseException { - return new BlockFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position); + if(argumentList.size() < 4) throw new ParseException("Expected data", position); + Returnable booleanReturnable = new BooleanConstant(true, position); + if(argumentList.size() == 5) booleanReturnable = (Returnable) argumentList.get(4); + return new BlockFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), booleanReturnable, main, position); } @Override public int argNumber() { - return 4; + return -1; } @Override @@ -36,6 +40,8 @@ public class BlockFunctionBuilder implements FunctionBuilder { return Returnable.ReturnType.NUMBER; case 3: return Returnable.ReturnType.STRING; + case 4: + return Returnable.ReturnType.BOOLEAN; default: return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index 953d3505a..215c37d0f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -19,8 +19,9 @@ public class BlockFunction implements Function { private final BlockData data; private final Returnable x, y, z; private final Position position; + private final Returnable overwrite; - public BlockFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) throws ParseException { + public BlockFunction(Returnable x, Returnable y, Returnable z, Returnable data, Returnable overwrite, TerraPlugin main, Position position) throws ParseException { this.position = position; if(!(data instanceof ConstantExpression)) throw new ParseException("Block data must be constant", data.getPosition()); @@ -28,6 +29,7 @@ public class BlockFunction implements Function { this.x = x; this.y = y; this.z = z; + this.overwrite = overwrite; } @Override @@ -38,7 +40,7 @@ public class BlockFunction implements Function { RotationUtil.rotateVector(xz, arguments.getRotation()); BlockData rot = data.clone(); RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse()); - arguments.getBuffer().addItem(new BufferedBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); + arguments.getBuffer().addItem(new BufferedBlock(rot, overwrite.apply(implementationArguments)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedBlock.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedBlock.java index 1ed1b414d..932efbd15 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedBlock.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedBlock.java @@ -1,17 +1,21 @@ package com.dfsek.terra.api.structures.structure.buffer.items; import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; public class BufferedBlock implements BufferedItem { private final BlockData data; + private final boolean overwrite; - public BufferedBlock(BlockData data) { + public BufferedBlock(BlockData data, boolean overwrite) { this.data = data; + this.overwrite = overwrite; } @Override public void paste(Location origin) { - origin.getBlock().setBlockData(data, false); + Block block = origin.getBlock(); + if(overwrite || block.isEmpty()) block.setBlockData(data, false); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java index 31af0c837..b74a206f7 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Token.java @@ -44,7 +44,8 @@ public class Token { || type.equals(Type.LESS_THAN_OR_EQUALS_OPERATOR) || type.equals(Type.GREATER_THAN_OR_EQUALS_OPERATOR) || type.equals(Type.BOOLEAN_OR) - || type.equals(Type.BOOLEAN_AND); + || type.equals(Type.BOOLEAN_AND) + || type.equals(Type.MODULO_OPERATOR); } public boolean isStrictNumericOperator() { @@ -54,7 +55,8 @@ public class Token { || type.equals(Type.GREATER_THAN_OPERATOR) || type.equals(Type.LESS_THAN_OPERATOR) || type.equals(Type.LESS_THAN_OR_EQUALS_OPERATOR) - || type.equals(Type.GREATER_THAN_OR_EQUALS_OPERATOR); + || type.equals(Type.GREATER_THAN_OR_EQUALS_OPERATOR) + || type.equals(Type.MODULO_OPERATOR); } public boolean isStrictBooleanOperator() { @@ -164,6 +166,10 @@ public class Token { * Division operator */ DIVISION_OPERATOR, + /** + * Modulo operator. + */ + MODULO_OPERATOR, /** * Boolean not operator */ diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index cd25b52f4..857bcf157 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -96,6 +96,8 @@ public class Tokenizer { return new Token(reader.consume().toString(), Token.Type.MULTIPLICATION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is('/')) return new Token(reader.consume().toString(), Token.Type.DIVISION_OPERATOR, new Position(reader.getLine(), reader.getIndex())); + if(reader.current().is('%')) + return new Token(reader.consume().toString(), Token.Type.MODULO_OPERATOR, new Position(reader.getLine(), reader.getIndex())); if(reader.current().is('!')) return new Token(reader.consume().toString(), Token.Type.BOOLEAN_NOT, new Position(reader.getLine(), reader.getIndex())); From a5105f9f9dbcf0be435908d2a6a3c0e6a79591a5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 2 Jan 2021 03:40:51 -0700 Subject: [PATCH 167/210] implement precedence matrix and NegationOperation --- .../terra/api/structures/parser/Parser.java | 8 +++++ .../api/structures/parser/ParserUtil.java | 36 ++++++++++++------- .../lang/operations/NegationOperation.java | 20 +++++++++++ .../api/structures/tokenizer/Tokenizer.java | 4 +-- common/src/test/resources/test.tesf | 15 +++++++- 5 files changed, 67 insertions(+), 16 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NegationOperation.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index f88a02703..8b948bfee 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -26,6 +26,7 @@ import com.dfsek.terra.api.structures.parser.lang.operations.ConcatenationOperat import com.dfsek.terra.api.structures.parser.lang.operations.DivisionOperation; import com.dfsek.terra.api.structures.parser.lang.operations.ModuloOperation; import com.dfsek.terra.api.structures.parser.lang.operations.MultiplicationOperation; +import com.dfsek.terra.api.structures.parser.lang.operations.NegationOperation; import com.dfsek.terra.api.structures.parser.lang.operations.NumberAdditionOperation; import com.dfsek.terra.api.structures.parser.lang.operations.SubtractionOperation; import com.dfsek.terra.api.structures.parser.lang.operations.statements.EqualsStatement; @@ -217,9 +218,13 @@ public class Parser { private Returnable parseExpression(TokenHolder tokens, boolean full, Map> variableMap) throws ParseException { boolean booleanInverted = false; // Check for boolean not operator + boolean negate = false; if(tokens.get().getType().equals(Token.Type.BOOLEAN_NOT)) { booleanInverted = true; tokens.consume(); + } else if(tokens.get().getType().equals(Token.Type.SUBTRACTION_OPERATOR)) { + negate = true; + tokens.consume(); } Token id = tokens.get(); @@ -243,6 +248,9 @@ public class Parser { if(booleanInverted) { // Invert operation if boolean not detected ParserUtil.checkReturnType(expression, Returnable.ReturnType.BOOLEAN); expression = new BooleanNotOperation((Returnable) expression, expression.getPosition()); + } else if(negate) { + ParserUtil.checkReturnType(expression, Returnable.ReturnType.NUMBER); + expression = new NegationOperation((Returnable) expression, expression.getPosition()); } if(full && tokens.get().isBinaryOperator()) { // Parse binary operations diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java index 212d99d70..724ac9099 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/ParserUtil.java @@ -11,21 +11,31 @@ import java.util.Map; public class ParserUtil { - private static final Map> PRECEDENCE = new HashMap<>(); + private static final Map> PRECEDENCE = new HashMap<>(); // If second has precedence, true. private static final List ARITHMETIC = Arrays.asList(Token.Type.ADDITION_OPERATOR, Token.Type.SUBTRACTION_OPERATOR, Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR, Token.Type.MODULO_OPERATOR); private static final List COMPARISON = Arrays.asList(Token.Type.EQUALS_OPERATOR, Token.Type.NOT_EQUALS_OPERATOR, Token.Type.LESS_THAN_OPERATOR, Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, Token.Type.GREATER_THAN_OPERATOR, Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR); static { // Setup precedence - PRECEDENCE.put(Token.Type.ADDITION_OPERATOR, Arrays.asList(Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR)); - PRECEDENCE.put(Token.Type.SUBTRACTION_OPERATOR, Arrays.asList(Token.Type.MULTIPLICATION_OPERATOR, Token.Type.DIVISION_OPERATOR)); - PRECEDENCE.put(Token.Type.EQUALS_OPERATOR, ARITHMETIC); - PRECEDENCE.put(Token.Type.NOT_EQUALS_OPERATOR, ARITHMETIC); - PRECEDENCE.put(Token.Type.GREATER_THAN_OPERATOR, ARITHMETIC); - PRECEDENCE.put(Token.Type.GREATER_THAN_OR_EQUALS_OPERATOR, ARITHMETIC); - PRECEDENCE.put(Token.Type.LESS_THAN_OPERATOR, ARITHMETIC); - PRECEDENCE.put(Token.Type.LESS_THAN_OR_EQUALS_OPERATOR, ARITHMETIC); - PRECEDENCE.put(Token.Type.BOOLEAN_AND, COMPARISON); - PRECEDENCE.put(Token.Type.BOOLEAN_OR, COMPARISON); + Map add = new HashMap<>(); // Addition/subtraction before Multiplication/division. + add.put(Token.Type.MULTIPLICATION_OPERATOR, true); + add.put(Token.Type.DIVISION_OPERATOR, true); + + PRECEDENCE.put(Token.Type.ADDITION_OPERATOR, add); + PRECEDENCE.put(Token.Type.SUBTRACTION_OPERATOR, add); + + Map numericBoolean = new HashMap<>(); + + ARITHMETIC.forEach(op -> numericBoolean.put(op, true)); // Numbers before comparison + COMPARISON.forEach(op -> PRECEDENCE.put(op, numericBoolean)); + + + Map booleanOps = new HashMap<>(); + ARITHMETIC.forEach(op -> booleanOps.put(op, true)); // Everything before boolean + COMPARISON.forEach(op -> booleanOps.put(op, true)); + + + PRECEDENCE.put(Token.Type.BOOLEAN_AND, booleanOps); + PRECEDENCE.put(Token.Type.BOOLEAN_OR, booleanOps); } public static void checkType(Token token, Token.Type... expected) throws ParseException { @@ -83,6 +93,8 @@ public class ParserUtil { public static boolean hasPrecedence(Token.Type first, Token.Type second) { if(!PRECEDENCE.containsKey(first)) return false; - return PRECEDENCE.get(first).contains(second); + Map pre = PRECEDENCE.get(first); + if(!pre.containsKey(second)) return false; + return pre.get(second); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NegationOperation.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NegationOperation.java new file mode 100644 index 000000000..cf4b01de7 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/lang/operations/NegationOperation.java @@ -0,0 +1,20 @@ +package com.dfsek.terra.api.structures.parser.lang.operations; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public class NegationOperation extends UnaryOperation { + public NegationOperation(Returnable input, Position position) { + super(input, position); + } + + @Override + public Number apply(Number input) { + return -input.doubleValue(); + } + + @Override + public ReturnType returnType() { + return ReturnType.NUMBER; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index 857bcf157..d856d4653 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -148,13 +148,11 @@ public class Tokenizer { private boolean isNumberLike() { return reader.current().isDigit() - || reader.current().is('_', '.', '-', 'E'); + || reader.current().is('_', '.', 'E'); } private boolean isNumberStart() { return reader.current().isDigit() - || reader.current().is('-') && reader.next(1).isDigit() - || reader.current().is('-') && reader.next(1).is('.') && reader.next(2).isDigit() || reader.current().is('.') && reader.next(1).isDigit(); } diff --git a/common/src/test/resources/test.tesf b/common/src/test/resources/test.tesf index ee20157ff..93fe11eda 100644 --- a/common/src/test/resources/test.tesf +++ b/common/src/test/resources/test.tesf @@ -1,5 +1,11 @@ id "testScript"; +bool thing1 = 2 > (2+2) || false; + +if(2 > 2 || 3 + 4 <= 2 && 4 + 5 > 2 / 3) { + test("ok", 2); +} + test("minecraft:green_w" + "ool", (2 * (3+1) * (2 * (1+1)))); // @@ -7,7 +13,7 @@ num testVar = 3.4; bool boolean = true; str stringVar = "hello!"; -num precedence = (3 + 2) * 2 + 3; +num precedence = 3 + 2 * 2 + 3; test("precedence: " + precedence, 2); num precedence2 = 3 * 2 + 2 * 3; test("precedence 2: " + precedence2, 2); @@ -17,6 +23,13 @@ bool iftest = false; bool truetest = false; num iterator = 0; +num thing = 4 - 2-2+2-2+2; +test("4 - 2 = " + thing, 2); + +thing = -2; +test("-2 = " + thing, 2); +thing = -thing; +test("--2 = " + thing, 2); From de9eb26ebc665c641ad0a506c4d329d1adb05249 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 2 Jan 2021 18:33:28 -0700 Subject: [PATCH 168/210] fix check fail for search --- .../dfsek/terra/api/structures/script/StructureScript.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 2af28fe94..ad9979c86 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -102,11 +102,11 @@ public class StructureScript { public boolean test(Location location, Random random, Rotation rotation) { StructureBuffer buffer = new StructureBuffer(location); - return !block.apply(new TerraImplementationArguments(buffer, rotation, random, 0)).equals(Block.ReturnLevel.FAIL); + return !block.apply(new TerraImplementationArguments(buffer, rotation, random, 0)).getLevel().equals(Block.ReturnLevel.FAIL); } public boolean executeInBuffer(Buffer buffer, Random random, Rotation rotation, int recursions) { - return !block.apply(new TerraImplementationArguments(buffer, rotation, random, recursions)).equals(Block.ReturnLevel.FAIL); + return !block.apply(new TerraImplementationArguments(buffer, rotation, random, recursions)).getLevel().equals(Block.ReturnLevel.FAIL); } public String getId() { From a785d7b8921fa62df6e152ce97c9ac49811646a6 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 2 Jan 2021 20:19:08 -0700 Subject: [PATCH 169/210] add 2d biomes support --- .../terra/api/world/biome/Generator.java | 3 ++ .../config/builder/GeneratorBuilder.java | 22 +++++++++++++- .../terra/config/factories/BiomeFactory.java | 2 ++ .../terra/config/templates/BiomeTemplate.java | 18 +++++++++++ .../generation/config/WorldGenerator.java | 30 ++++++++++++++----- .../dfsek/terra/generation/math/Sampler.java | 6 ++-- ...erpolator3.java => ChunkInterpolator.java} | 20 ++++++++++--- 7 files changed, 86 insertions(+), 15 deletions(-) rename common/src/main/java/com/dfsek/terra/generation/math/interpolation/{ChunkInterpolator3.java => ChunkInterpolator.java} (81%) diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java index 4478b9667..794838860 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/Generator.java @@ -21,4 +21,7 @@ public interface Generator { */ Palette getPalette(int y); + boolean is2d(); + + double get2dBase(); } diff --git a/common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java b/common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java index 42cf84ac6..1767ce2f6 100644 --- a/common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java +++ b/common/src/main/java/com/dfsek/terra/config/builder/GeneratorBuilder.java @@ -27,9 +27,29 @@ public class GeneratorBuilder { private boolean interpolateElevation; + private boolean noise2d; + + private double base; + public WorldGenerator build(long seed) { - return gens.computeIfAbsent(seed, k -> new WorldGenerator(seed, noiseEquation, elevationEquation, varScope, noiseBuilderMap, palettes, slantPalettes, interpolateElevation)); + return gens.computeIfAbsent(seed, k -> new WorldGenerator(seed, noiseEquation, elevationEquation, varScope, noiseBuilderMap, palettes, slantPalettes, interpolateElevation, noise2d, base)); + } + + public boolean isNoise2d() { + return noise2d; + } + + public void setNoise2d(boolean noise2d) { + this.noise2d = noise2d; + } + + public double getBase() { + return base; + } + + public void setBase(double base) { + this.base = base; } public String getNoiseEquation() { diff --git a/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java index b0c41c1f4..b4d158c9b 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/BiomeFactory.java @@ -23,6 +23,8 @@ public class BiomeFactory implements TerraFactory noiseBuilders, PaletteHolder palettes, PaletteHolder slantPalettes, boolean elevationInterpolation, boolean noise2d, double base) { + this.palettes = palettes; + this.slantPalettes = slantPalettes; + + this.elevationInterpolation = elevationInterpolation; + this.noise2d = noise2d; + this.base = base; - public WorldGenerator(long seed, String equation, String elevateEquation, Scope vScope, Map noiseBuilders, PaletteHolder palettes, PaletteHolder slantPalettes, boolean elevationInterpolation) { Parser p = new Parser(); p.registerFunction("rand", new RandomFunction()); Parser ep = new Parser(); @@ -38,14 +47,11 @@ public class WorldGenerator implements Generator { Scope s = new Scope().withParent(vScope); xVar = s.create("x"); - yVar = s.create("y"); + if(!noise2d) yVar = s.create("y"); + else yVar = null; zVar = s.create("z"); s.create("seed").setValue(seed); - this.palettes = palettes; - this.slantPalettes = slantPalettes; - - this.elevationInterpolation = elevationInterpolation; for(Map.Entry e : noiseBuilders.entrySet()) { switch(e.getValue().getDimensions()) { @@ -86,7 +92,7 @@ public class WorldGenerator implements Generator { @Override public synchronized double getNoise(int x, int y, int z) { xVar.setValue(x); - yVar.setValue(y); + if(!noise2d) yVar.setValue(y); zVar.setValue(z); return noiseExp.evaluate(); } @@ -101,6 +107,16 @@ public class WorldGenerator implements Generator { return palettes.getPalette(y); } + @Override + public boolean is2d() { + return noise2d; + } + + @Override + public double get2dBase() { + return base; + } + public Palette getSlantPalette(int y) { return slantPalettes.getPalette(y); } diff --git a/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java b/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java index 63f517bd2..51a3aeec0 100644 --- a/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java @@ -2,15 +2,15 @@ package com.dfsek.terra.generation.math; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import com.dfsek.terra.generation.math.interpolation.ChunkInterpolator3; +import com.dfsek.terra.generation.math.interpolation.ChunkInterpolator; import net.jafama.FastMath; public class Sampler { - private final ChunkInterpolator3 interpolator; + private final ChunkInterpolator interpolator; private final ElevationInterpolator elevationInterpolator; public Sampler(int x, int z, TerraBiomeGrid grid, World world, int elevationSmooth, int generationSmooth) { - this.interpolator = new ChunkInterpolator3(world, x, z, grid, generationSmooth); + this.interpolator = new ChunkInterpolator(world, x, z, grid, generationSmooth); this.elevationInterpolator = new ElevationInterpolator(world, x, z, grid, elevationSmooth); } diff --git a/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ChunkInterpolator3.java b/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ChunkInterpolator.java similarity index 81% rename from common/src/main/java/com/dfsek/terra/generation/math/interpolation/ChunkInterpolator3.java rename to common/src/main/java/com/dfsek/terra/generation/math/interpolation/ChunkInterpolator.java index 5e8a64273..e97e9d151 100644 --- a/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ChunkInterpolator3.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ChunkInterpolator.java @@ -10,7 +10,7 @@ import net.jafama.FastMath; * Class to abstract away the 16 Interpolators needed to generate a chunk.
* Contains method to get interpolated noise at a coordinate within the chunk. */ -public class ChunkInterpolator3 { +public class ChunkInterpolator { private final Interpolator3[][][] interpGrid = new Interpolator3[4][64][4]; private final Generator[][] gens = new Generator[7][7]; private final boolean[][] needsBiomeInterp = new boolean[5][5]; @@ -24,7 +24,7 @@ public class ChunkInterpolator3 { * @param chunkZ Z coordinate of the chunk. * @param grid BiomeGrid to use for noise fetching. */ - public ChunkInterpolator3(World w, int chunkX, int chunkZ, TerraBiomeGrid grid, int smooth) { + public ChunkInterpolator(World w, int chunkX, int chunkZ, TerraBiomeGrid grid, int smooth) { int xOrigin = chunkX << 4; int zOrigin = chunkZ << 4; this.smooth = smooth; @@ -43,8 +43,16 @@ public class ChunkInterpolator3 { for(byte x = -1; x < 6; x++) { for(byte z = -1; z < 6; z++) { - for(int y = 0; y < 65; y++) { - noiseStorage[x + 1][z + 1][y] = gens[x + 1][z + 1].getNoise((x * smooth) + xOrigin, y << 2, (z * smooth) + zOrigin); + Generator generator = gens[x + 1][z + 1]; + if(generator.is2d()) { + double n = generator.getNoise((x * smooth) + xOrigin, 0, (z * smooth) + zOrigin); + for(int y = 0; y < 65; y++) { + noiseStorage[x + 1][z + 1][y] = n + noise2dExtrude(y << 2, generator.get2dBase()); + } + } else { + for(int y = 0; y < 65; y++) { + noiseStorage[x + 1][z + 1][y] = generator.getNoise((x * smooth) + xOrigin, y << 2, (z * smooth) + zOrigin); + } } } } @@ -113,4 +121,8 @@ public class ChunkInterpolator3 { public double getNoise(double x, double y, double z) { return interpGrid[reRange(((int) x) / smooth, 3)][reRange(((int) y) / 4, 63)][reRange(((int) z) / smooth, 3)].trilerp((x % smooth) / smooth, (y % 4) / 4, (z % smooth) / smooth); } + + private static double noise2dExtrude(double y, double base) { + return ((-FastMath.pow2((y / base))) + 1); + } } From fed24920f88d74dbfcccd3e93131cb114906a474 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 2 Jan 2021 20:19:18 -0700 Subject: [PATCH 170/210] Add error message to BiomeGridFactory --- .../com/dfsek/terra/config/factories/BiomeGridFactory.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java index b290b659e..3f514269e 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java @@ -1,5 +1,6 @@ package com.dfsek.terra.config.factories; +import com.dfsek.tectonic.exception.LoadException; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.biome.UserDefinedBiome; @@ -12,7 +13,7 @@ import java.util.List; public class BiomeGridFactory implements TerraFactory { @Override - public UserDefinedGridBuilder build(BiomeGridTemplate config, TerraPlugin main) { + public UserDefinedGridBuilder build(BiomeGridTemplate config, TerraPlugin main) throws LoadException { UserDefinedGridBuilder holder = new UserDefinedGridBuilder(); holder.setXFreq(config.getXFreq()); @@ -25,7 +26,7 @@ public class BiomeGridFactory implements TerraFactory layer = config.getGrid().get(x); - if(!(layer.size() == zSize)) throw new IllegalArgumentException(); + if(!(layer.size() == zSize)) throw new LoadException("Expected " + zSize + " biomes in row " + x + ", found " + layer.size()); for(int z = 0; z < zSize; z++) { biomes[x][z] = layer.get(z); } From 315230af2756813b04d40d20474963a70a88db43 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 3 Jan 2021 13:24:17 -0700 Subject: [PATCH 171/210] implement SamplerCache for drastically increased structure perf --- .../structures/script/StructureScript.java | 4 ++-- .../script/builders/CheckFunctionBuilder.java | 6 ++--- .../script/functions/CheckFunction.java | 6 ++--- .../dfsek/terra/config/base/ConfigPack.java | 14 ++++++------ .../generation/MasterChunkGenerator.java | 8 +++++-- .../math/SamplerCache.java} | 22 ++++++++++++++----- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 5 +++-- .../command/structure/SpawnCommand.java | 2 +- .../bukkit/src/main/resources/config.yml | 2 +- .../FabricChunkGeneratorWrapper.java | 2 +- 10 files changed, 44 insertions(+), 27 deletions(-) rename common/src/main/java/com/dfsek/terra/{api/structures/world/CheckCache.java => generation/math/SamplerCache.java} (64%) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index ad9979c86..b8eb03a89 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -21,7 +21,7 @@ import com.dfsek.terra.api.structures.script.builders.UnaryNumberFunctionBuilder import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer; -import com.dfsek.terra.api.structures.world.CheckCache; +import com.dfsek.terra.generation.math.SamplerCache; import com.dfsek.terra.registry.LootRegistry; import com.dfsek.terra.registry.ScriptRegistry; import net.jafama.FastMath; @@ -38,7 +38,7 @@ public class StructureScript { private final String id; private final LinkedHashMap cache; - public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, LootRegistry lootRegistry, CheckCache cache) throws ParseException { + public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, LootRegistry lootRegistry, SamplerCache cache) throws ParseException { Parser parser; try { parser = new Parser(IOUtils.toString(inputStream)); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckFunctionBuilder.java index bac7b422f..81399b183 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckFunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckFunctionBuilder.java @@ -6,15 +6,15 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.script.functions.CheckFunction; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.api.structures.world.CheckCache; +import com.dfsek.terra.generation.math.SamplerCache; import java.util.List; public class CheckFunctionBuilder implements FunctionBuilder { private final TerraPlugin main; - private final CheckCache cache; + private final SamplerCache cache; - public CheckFunctionBuilder(TerraPlugin main, CheckCache cache) { + public CheckFunctionBuilder(TerraPlugin main, SamplerCache cache) { this.main = main; this.cache = cache; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index 13d8efdf3..05de2816b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -12,20 +12,20 @@ import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.api.structures.world.CheckCache; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.config.templates.BiomeTemplate; +import com.dfsek.terra.generation.math.SamplerCache; import net.jafama.FastMath; public class CheckFunction implements Function { private final TerraPlugin main; private final Returnable x, y, z; private final Position position; - private final CheckCache cache; + private final SamplerCache cache; - public CheckFunction(TerraPlugin main, Returnable x, Returnable y, Returnable z, CheckCache cache, Position position) { + public CheckFunction(TerraPlugin main, Returnable x, Returnable y, Returnable z, SamplerCache cache, Position position) { this.main = main; this.x = x; this.y = y; diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 89cd9d54b..8bb85e12f 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -9,7 +9,6 @@ import com.dfsek.terra.api.LoaderRegistrar; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.structures.loot.LootTable; import com.dfsek.terra.api.structures.script.StructureScript; -import com.dfsek.terra.api.structures.world.CheckCache; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.api.world.palette.Palette; @@ -43,6 +42,7 @@ import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.config.templates.TreeTemplate; import com.dfsek.terra.generation.items.TerraStructure; import com.dfsek.terra.generation.items.ores.Ore; +import com.dfsek.terra.generation.math.SamplerCache; import com.dfsek.terra.registry.BiomeGridRegistry; import com.dfsek.terra.registry.BiomeRegistry; import com.dfsek.terra.registry.CarverRegistry; @@ -95,12 +95,12 @@ public class ConfigPack implements LoaderRegistrar { private final ConfigLoader selfLoader = new ConfigLoader(); private final Scope varScope = new Scope(); - private final CheckCache checkCache; + private final SamplerCache samplerCache; public ConfigPack(File folder, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); - this.checkCache = new CheckCache(main); + this.samplerCache = new SamplerCache(main); floraRegistry = new FloraRegistry(main); paletteRegistry = new PaletteRegistry(main); treeRegistry = new TreeRegistry(main); @@ -122,7 +122,7 @@ public class ConfigPack implements LoaderRegistrar { public ConfigPack(ZipFile file, TerraPlugin main) throws ConfigException { long l = System.nanoTime(); - this.checkCache = new CheckCache(main); + this.samplerCache = new SamplerCache(main); floraRegistry = new FloraRegistry(main); paletteRegistry = new PaletteRegistry(main); treeRegistry = new TreeRegistry(main); @@ -157,7 +157,7 @@ public class ConfigPack implements LoaderRegistrar { loader.open("structures/data", ".tesf").thenEntries(entries -> { for(Map.Entry entry : entries) { try { - StructureScript structureScript = new StructureScript(entry.getValue(), main, scriptRegistry, lootRegistry, checkCache); + StructureScript structureScript = new StructureScript(entry.getValue(), main, scriptRegistry, lootRegistry, samplerCache); scriptRegistry.add(structureScript.getId(), structureScript); } catch(com.dfsek.terra.api.structures.parser.exceptions.ParseException e) { throw new LoadException("Unable to load script \"" + entry.getKey() + "\"", e); @@ -278,7 +278,7 @@ public class ConfigPack implements LoaderRegistrar { return biomeRegistry; } - public CheckCache getCheckCache() { - return checkCache; + public SamplerCache getSamplerCache() { + return samplerCache; } } diff --git a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java index 3f5224bd5..e67d013d6 100644 --- a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java @@ -23,6 +23,7 @@ import com.dfsek.terra.biome.palette.SinglePalette; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.math.Sampler; +import com.dfsek.terra.generation.math.SamplerCache; import com.dfsek.terra.util.PaletteUtil; import org.jetbrains.annotations.NotNull; @@ -37,12 +38,15 @@ public class MasterChunkGenerator implements TerraChunkGenerator { private final MaterialData water; private final SinglePalette blank; + private final SamplerCache cache; - public MasterChunkGenerator(ConfigPack c, TerraPlugin main) { + + public MasterChunkGenerator(ConfigPack c, TerraPlugin main, SamplerCache cache) { this.configPack = c; this.main = main; water = main.getWorldHandle().createMaterialData("minecraft:water"); blank = new SinglePalette<>(main.getWorldHandle().createBlockData("minecraft:air")); + this.cache = cache; } @Override @@ -91,7 +95,7 @@ public class MasterChunkGenerator implements TerraChunkGenerator { int xOrig = (chunkX << 4); int zOrig = (chunkZ << 4); - Sampler sampler = new Sampler(chunkX, chunkZ, tw.getGrid(), world, configPack.getTemplate().getElevationBlend(), configPack.getTemplate().getBaseBlend()); + Sampler sampler = cache.getChunk(world, chunkX, chunkZ); for(byte x = 0; x < 16; x++) { for(byte z = 0; z < 16; z++) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/world/CheckCache.java b/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java similarity index 64% rename from common/src/main/java/com/dfsek/terra/api/structures/world/CheckCache.java rename to common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java index da51a69c0..6c915fd2e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/world/CheckCache.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java @@ -1,20 +1,19 @@ -package com.dfsek.terra.api.structures.world; +package com.dfsek.terra.generation.math; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; -import com.dfsek.terra.generation.math.Sampler; import net.jafama.FastMath; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; -public class CheckCache { +public class SamplerCache { private final Map cache; private final TerraPlugin main; - public CheckCache(TerraPlugin main) { + public SamplerCache(TerraPlugin main) { cache = new HashMap<>(); this.main = main; } @@ -28,6 +27,15 @@ public class CheckCache { })).get(x, z); } + public Sampler getChunk(World world, int chunkX, int chunkZ) { + return cache.computeIfAbsent(world.getSeed(), seed -> new Container(world, new LinkedHashMap() { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return size() > main.getTerraConfig().getCheckCache(); + } + })).getChunk(chunkX, chunkZ); + } + private class Container { private final World world; @@ -41,9 +49,13 @@ public class CheckCache { public Sampler get(int x, int z) { int cx = FastMath.floorDiv(x, 16); int cz = FastMath.floorDiv(z, 16); + return getChunk(cx, cz); + } + + public Sampler getChunk(int cx, int cz) { long key = (((long) cx) << 32) | (cz & 0xffffffffL); TerraWorld tw = main.getWorld(world); - return cache.computeIfAbsent(key, k -> new Sampler(cx, cz, tw.getGrid(), world, 4, 8)); + return cache.computeIfAbsent(key, k -> new Sampler(cx, cz, tw.getGrid(), world, tw.getConfig().getTemplate().getBaseBlend(), tw.getConfig().getTemplate().getElevationBlend())); } } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index fa3f8fb32..e18276438 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -145,8 +145,9 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { public @Nullable ChunkGenerator getDefaultWorldGenerator(@NotNull String worldName, @Nullable String id) { return new BukkitChunkGeneratorWrapper(generatorMap.computeIfAbsent(worldName, name -> { if(!registry.contains(id)) throw new IllegalArgumentException("No such config pack \"" + id + "\""); - worlds.put(worldName, registry.get(id)); - return new MasterChunkGenerator(registry.get(id), this); + ConfigPack pack = registry.get(id); + worlds.put(worldName, pack); + return new MasterChunkGenerator(registry.get(id), this, pack.getSamplerCache()); })); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java index ef3104cce..fb65819de 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/SpawnCommand.java @@ -33,7 +33,7 @@ public class SpawnCommand extends WorldCommand implements DebugCommand { int z = p.getBlockZ(); Position dummy = new Position(0, 0); com.dfsek.terra.api.platform.world.World w = BukkitAdapter.adapt(world); - String check = new CheckFunction(getMain(), new NumericConstant(0, dummy), new NumericConstant(0, dummy), new NumericConstant(0, dummy), getMain().getWorld(w).getConfig().getCheckCache(), dummy).apply(new TerraImplementationArguments(new StructureBuffer( + String check = new CheckFunction(getMain(), new NumericConstant(0, dummy), new NumericConstant(0, dummy), new NumericConstant(0, dummy), getMain().getWorld(w).getConfig().getSamplerCache(), dummy).apply(new TerraImplementationArguments(new StructureBuffer( new com.dfsek.terra.api.math.vector.Location(w, x, y, z) ), Rotation.NONE, new FastRandom(), 0)); diff --git a/platforms/bukkit/src/main/resources/config.yml b/platforms/bukkit/src/main/resources/config.yml index c262958ae..503a395cb 100644 --- a/platforms/bukkit/src/main/resources/config.yml +++ b/platforms/bukkit/src/main/resources/config.yml @@ -5,6 +5,6 @@ dump-default: true biome-search-resolution: 4 cache: carver: 512 - structure: 128 + structure: 1024 master-disable: caves: false \ No newline at end of file diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java index c94f7afa2..24c830b78 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/generator/FabricChunkGeneratorWrapper.java @@ -76,7 +76,7 @@ public class FabricChunkGeneratorWrapper extends ChunkGenerator implements Gener super(biomeSource, new StructuresConfig(false)); this.pack = configPack; - this.delegate = new MasterChunkGenerator(configPack, TerraFabricPlugin.getInstance()); + this.delegate = new MasterChunkGenerator(configPack, TerraFabricPlugin.getInstance(), pack.getSamplerCache()); delegate.getMain().getLogger().info("Loading world..."); this.biomeSource = biomeSource; From 90cc88f05f2627dc44610a7e7828527c1ba085d9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 3 Jan 2021 13:28:10 -0700 Subject: [PATCH 172/210] set min heap size in testWithPaper --- platforms/bukkit/build.gradle.kts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/platforms/bukkit/build.gradle.kts b/platforms/bukkit/build.gradle.kts index 564a983e6..2a04443bf 100644 --- a/platforms/bukkit/build.gradle.kts +++ b/platforms/bukkit/build.gradle.kts @@ -98,7 +98,8 @@ val testWithPaper = task(name = "testWithPaper") { "-XX:G1RSetUpdatingPauseTimePercent=5", "-XX:SurvivorRatio=32", "-XX:+PerfDisableSharedMem", "-XX:MaxTenuringThreshold=1", "-Dusing.aikars.flags=https://mcflags.emc.gs", "-Daikars.new.flags=true", "-DIReallyKnowWhatIAmDoingISwear") - maxHeapSize = "2G" + maxHeapSize = "3G" + minHeapSize = "3G" args = listOf("nogui") workingDir = file("${testDir}/") classpath = files("${testDir}/paper.jar") From bf4a831781743821b22e18a3d1e4d85e525215e2 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 3 Jan 2021 13:33:03 -0700 Subject: [PATCH 173/210] fix GridSpawn salt --- .../terra/config/loaders/config/GridSpawnLoader.java | 2 +- .../main/java/com/dfsek/terra/procgen/GridSpawn.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java index bae39cbcc..1c753ecbc 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java @@ -12,6 +12,6 @@ public class GridSpawnLoader implements TypeLoader { @Override public GridSpawn load(Type type, Object o, ConfigLoader configLoader) { Map map = (Map) o; - return new GridSpawn(map.get("width"), map.get("padding"), map.getOrDefault("seed", 0)); + return new GridSpawn(map.get("width"), map.get("padding"), map.getOrDefault("salt", 0)); } } diff --git a/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java b/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java index a1d9561e9..14715a840 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java +++ b/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java @@ -14,12 +14,12 @@ import java.util.Random; public class GridSpawn { private final int separation; private final int width; - private final int seedOffset; + private final int salt; - public GridSpawn(int width, int separation, int seedOffset) { + public GridSpawn(int width, int separation, int salt) { this.separation = separation; this.width = width; - this.seedOffset = seedOffset; + this.salt = salt; } /** @@ -36,7 +36,7 @@ public class GridSpawn { List zones = new GlueList<>(); for(int xi = structureChunkX - 1; xi <= structureChunkX + 1; xi++) { for(int zi = structureChunkZ - 1; zi <= structureChunkZ + 1; zi++) { - zones.add(getChunkSpawn(xi, zi, seed + seedOffset)); + zones.add(getChunkSpawn(xi, zi, seed)); } } Vector3 shortest = zones.get(0); @@ -56,7 +56,7 @@ public class GridSpawn { * @return Vector representing spawnpoint */ public Vector3 getChunkSpawn(int structureChunkX, int structureChunkZ, long seed) { - Random r = new FastRandom(MathUtil.getCarverChunkSeed(structureChunkX, structureChunkZ, seed + seedOffset)); + Random r = new FastRandom(MathUtil.getCarverChunkSeed(structureChunkX, structureChunkZ, seed + salt)); int offsetX = r.nextInt(width); int offsetZ = r.nextInt(width); int sx = structureChunkX * (width + 2 * separation) + offsetX; From 86d42a03a050a6938d3e05832212a431accadd35 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 3 Jan 2021 13:48:16 -0700 Subject: [PATCH 174/210] decrease default cache size --- platforms/bukkit/src/main/resources/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platforms/bukkit/src/main/resources/config.yml b/platforms/bukkit/src/main/resources/config.yml index 503a395cb..c262958ae 100644 --- a/platforms/bukkit/src/main/resources/config.yml +++ b/platforms/bukkit/src/main/resources/config.yml @@ -5,6 +5,6 @@ dump-default: true biome-search-resolution: 4 cache: carver: 512 - structure: 1024 + structure: 128 master-disable: caves: false \ No newline at end of file From c7d3e5294a853b5ec643ae0707821f65de2a3c2e Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 3 Jan 2021 19:43:01 -0700 Subject: [PATCH 175/210] fix mem leak --- .../dfsek/terra/config/base/PluginConfig.java | 9 ++--- .../terra/generation/math/SamplerCache.java | 36 +++++++++---------- .../bukkit/src/main/resources/config.yml | 1 + 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java b/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java index 3608049aa..b61d8291a 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java @@ -38,13 +38,14 @@ public class PluginConfig implements ConfigTemplate { @Value("cache.carver") @Default private int carverCache = 512; + @Value("cache.structure") @Default private int structureCache = 128; - @Value("cache.checks") + @Value("cache.sampler") @Default - private int checkCache = 128; + private int samplerCache = 512; @Value("dump-default") @Default @@ -95,7 +96,7 @@ public class PluginConfig implements ConfigTemplate { return structureCache; } - public int getCheckCache() { - return checkCache; + public int getSamplerCache() { + return samplerCache; } } diff --git a/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java b/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java index 6c915fd2e..967f13488 100644 --- a/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java @@ -5,45 +5,42 @@ import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; import net.jafama.FastMath; +import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; public class SamplerCache { - private final Map cache; + private final Map containerMap; private final TerraPlugin main; public SamplerCache(TerraPlugin main) { - cache = new HashMap<>(); + containerMap = new HashMap<>(); this.main = main; } public Sampler get(World world, int x, int z) { - return cache.computeIfAbsent(world.getSeed(), seed -> new Container(world, new LinkedHashMap() { - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > main.getTerraConfig().getCheckCache(); - } - })).get(x, z); + return containerMap.computeIfAbsent(world.getSeed(), seed -> new Container(world)).get(x, z); } public Sampler getChunk(World world, int chunkX, int chunkZ) { - return cache.computeIfAbsent(world.getSeed(), seed -> new Container(world, new LinkedHashMap() { - @Override - protected boolean removeEldestEntry(Map.Entry eldest) { - return size() > main.getTerraConfig().getCheckCache(); - } - })).getChunk(chunkX, chunkZ); + return containerMap.computeIfAbsent(world.getSeed(), seed -> new Container(world)).getChunk(chunkX, chunkZ); } private class Container { private final World world; - private final Map cache; + private final TerraWorld terraWorld; + private final Map cache = Collections.synchronizedMap(new LinkedHashMap() { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return this.size() > main.getTerraConfig().getSamplerCache(); + } + }); - private Container(World world, Map cache) { + private Container(World world) { this.world = world; - this.cache = cache; + terraWorld = main.getWorld(world); } public Sampler get(int x, int z) { @@ -54,8 +51,9 @@ public class SamplerCache { public Sampler getChunk(int cx, int cz) { long key = (((long) cx) << 32) | (cz & 0xffffffffL); - TerraWorld tw = main.getWorld(world); - return cache.computeIfAbsent(key, k -> new Sampler(cx, cz, tw.getGrid(), world, tw.getConfig().getTemplate().getBaseBlend(), tw.getConfig().getTemplate().getElevationBlend())); + synchronized(cache) { + return cache.computeIfAbsent(key, k -> new Sampler(cx, cz, terraWorld.getGrid(), world, terraWorld.getConfig().getTemplate().getBaseBlend(), terraWorld.getConfig().getTemplate().getElevationBlend())); + } } } } diff --git a/platforms/bukkit/src/main/resources/config.yml b/platforms/bukkit/src/main/resources/config.yml index c262958ae..fc5ac9ad3 100644 --- a/platforms/bukkit/src/main/resources/config.yml +++ b/platforms/bukkit/src/main/resources/config.yml @@ -6,5 +6,6 @@ biome-search-resolution: 4 cache: carver: 512 structure: 128 + sampler: 512 master-disable: caves: false \ No newline at end of file From b26847f2505181f20a7f2a8a4e6a91c060a8d1fa Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 3 Jan 2021 19:49:15 -0700 Subject: [PATCH 176/210] implement BiomeFunction --- .../structures/script/StructureScript.java | 2 + .../script/builders/BiomeFunctionBuilder.java | 40 ++++++++++++++ .../script/functions/BiomeFunction.java | 54 +++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/BiomeFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index b8eb03a89..a0a4f5c4b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -7,6 +7,7 @@ import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.script.builders.BinaryNumberFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.BiomeFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.EntityFunctionBuilder; @@ -55,6 +56,7 @@ public class StructureScript { .registerFunction("pull", new PullFunctionBuilder(main)) .registerFunction("loot", new LootFunctionBuilder(main, lootRegistry)) .registerFunction("entity", new EntityFunctionBuilder(main)) + .registerFunction("biome", new BiomeFunctionBuilder(main)) .registerFunction("abs", new UnaryNumberFunctionBuilder(number -> FastMath.abs(number.doubleValue()))) .registerFunction("pow", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.pow(number.doubleValue(), number2.doubleValue()))) .registerFunction("sqrt", new UnaryNumberFunctionBuilder(number -> FastMath.sqrt(number.doubleValue()))) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BiomeFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BiomeFunctionBuilder.java new file mode 100644 index 000000000..cceb13fb7 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/BiomeFunctionBuilder.java @@ -0,0 +1,40 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.functions.BiomeFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class BiomeFunctionBuilder implements FunctionBuilder { + private final TerraPlugin main; + + public BiomeFunctionBuilder(TerraPlugin main) { + this.main = main; + } + + @SuppressWarnings("unchecked") + @Override + public BiomeFunction build(List> argumentList, Position position) { + return new BiomeFunction(main, (Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), position); + } + + @Override + public int argNumber() { + return 3; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + switch(position) { + case 0: + case 1: + case 2: + return Returnable.ReturnType.NUMBER; + default: + return null; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.java new file mode 100644 index 000000000..55b88e140 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BiomeFunction.java @@ -0,0 +1,54 @@ +package com.dfsek.terra.api.structures.script.functions; + +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; +import com.dfsek.terra.api.structures.structure.RotationUtil; +import com.dfsek.terra.api.structures.tokenizer.Position; +import com.dfsek.terra.biome.UserDefinedBiome; +import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; +import net.jafama.FastMath; + +public class BiomeFunction implements Function { + private final TerraPlugin main; + private final Returnable x, y, z; + private final Position position; + + + public BiomeFunction(TerraPlugin main, Returnable x, Returnable y, Returnable z, Position position) { + this.main = main; + this.x = x; + this.y = y; + this.z = z; + this.position = position; + } + + + @Override + public String apply(ImplementationArguments implementationArguments) { + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; + + Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); + + RotationUtil.rotateVector(xz, arguments.getRotation()); + + TerraBiomeGrid grid = main.getWorld(arguments.getBuffer().getOrigin().getWorld()).getGrid(); + + return ((UserDefinedBiome) grid.getBiome(arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))))).getID(); + } + + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.STRING; + } +} From 1536a13d3c5755e92b5f9768703119681df93fc3 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 3 Jan 2021 20:16:59 -0700 Subject: [PATCH 177/210] fix minor issues & cleanup --- .../java/com/dfsek/terra/generation/MasterChunkGenerator.java | 4 ++++ .../java/com/dfsek/terra/generation/math/SamplerCache.java | 3 +++ .../main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java | 4 ++-- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java index e67d013d6..0abb1a2d1 100644 --- a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java @@ -221,4 +221,8 @@ public class MasterChunkGenerator implements TerraChunkGenerator { } } } + + public SamplerCache getCache() { + return cache; + } } diff --git a/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java b/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java index 967f13488..36399fc57 100644 --- a/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java @@ -27,6 +27,9 @@ public class SamplerCache { return containerMap.computeIfAbsent(world.getSeed(), seed -> new Container(world)).getChunk(chunkX, chunkZ); } + public void clear() { + containerMap.clear(); + } private class Container { private final World world; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index e18276438..4ca20f319 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -16,7 +16,6 @@ import com.dfsek.terra.api.transform.MapTransform; import com.dfsek.terra.api.transform.Transformer; import com.dfsek.terra.bukkit.command.command.TerraCommand; import com.dfsek.terra.bukkit.command.command.structure.LocateCommand; -import com.dfsek.terra.bukkit.generator.BukkitChunkGenerator; import com.dfsek.terra.bukkit.generator.BukkitChunkGeneratorWrapper; import com.dfsek.terra.bukkit.handles.BukkitItemHandle; import com.dfsek.terra.bukkit.handles.BukkitWorldHandle; @@ -61,6 +60,7 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { public void reload() { Map newMap = new HashMap<>(); worldMap.forEach((world, tw) -> { + ((MasterChunkGenerator) ((BukkitChunkGeneratorWrapper) world.getGenerator().getHandle()).getHandle()).getCache().clear(); String packID = tw.getConfig().getTemplate().getID(); newMap.put(world, new TerraWorld(world, registry.get(packID), this)); }); @@ -167,7 +167,7 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { } public TerraWorld getWorld(World w) { - if(!(w.getGenerator() instanceof BukkitChunkGenerator)) + if(!TerraWorld.isTerraWorld(w)) throw new IllegalArgumentException("Not a Terra world! " + w.getGenerator()); if(!worlds.containsKey(w.getName())) { getLogger().warning("Unexpected world load detected: \"" + w.getName() + "\""); From fff918e0eece48f3ab7d752c4f13d83ed865a817 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 3 Jan 2021 20:29:10 -0700 Subject: [PATCH 178/210] Add CheckBlockFunction, which mustn't be discussed without mentioning that it shall be covered with disclaimers. --- .../terra/api/platform/block/BlockData.java | 2 + .../structures/script/StructureScript.java | 4 +- .../builders/CheckBlockFunctionBuilder.java | 33 +++++++++++++ .../script/functions/CheckBlockFunction.java | 48 +++++++++++++++++++ .../world/block/data/BukkitBlockData.java | 5 ++ .../fabric/world/block/FabricBlockData.java | 5 ++ 6 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckBlockFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckBlockFunction.java diff --git a/common/src/main/java/com/dfsek/terra/api/platform/block/BlockData.java b/common/src/main/java/com/dfsek/terra/api/platform/block/BlockData.java index de2434e04..d58979fa6 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/block/BlockData.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/BlockData.java @@ -8,4 +8,6 @@ public interface BlockData extends Cloneable, Handle { boolean matches(MaterialData materialData); BlockData clone(); + + String getAsString(); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index a0a4f5c4b..055e2a087 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -9,6 +9,7 @@ import com.dfsek.terra.api.structures.parser.lang.Block; import com.dfsek.terra.api.structures.script.builders.BinaryNumberFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BiomeFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.CheckBlockFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.EntityFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.GetMarkFunctionBuilder; @@ -56,7 +57,8 @@ public class StructureScript { .registerFunction("pull", new PullFunctionBuilder(main)) .registerFunction("loot", new LootFunctionBuilder(main, lootRegistry)) .registerFunction("entity", new EntityFunctionBuilder(main)) - .registerFunction("biome", new BiomeFunctionBuilder(main)) + .registerFunction("getBiome", new BiomeFunctionBuilder(main)) + .registerFunction("getBlock", new CheckBlockFunctionBuilder()) .registerFunction("abs", new UnaryNumberFunctionBuilder(number -> FastMath.abs(number.doubleValue()))) .registerFunction("pow", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.pow(number.doubleValue(), number2.doubleValue()))) .registerFunction("sqrt", new UnaryNumberFunctionBuilder(number -> FastMath.sqrt(number.doubleValue()))) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckBlockFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckBlockFunctionBuilder.java new file mode 100644 index 000000000..98eeb2665 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/CheckBlockFunctionBuilder.java @@ -0,0 +1,33 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.functions.CheckBlockFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class CheckBlockFunctionBuilder implements FunctionBuilder { + @SuppressWarnings("unchecked") + @Override + public CheckBlockFunction build(List> argumentList, Position position) { + return new CheckBlockFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), position); + } + + @Override + public int argNumber() { + return 3; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + switch(position) { + case 0: + case 1: + case 2: + return Returnable.ReturnType.NUMBER; + default: + return null; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckBlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckBlockFunction.java new file mode 100644 index 000000000..2c238cc64 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckBlockFunction.java @@ -0,0 +1,48 @@ +package com.dfsek.terra.api.structures.script.functions; + +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; +import com.dfsek.terra.api.structures.structure.RotationUtil; +import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; + +public class CheckBlockFunction implements Function { + private final Returnable x, y, z; + private final Position position; + + public CheckBlockFunction(Returnable x, Returnable y, Returnable z, Position position) { + this.x = x; + this.y = y; + this.z = z; + this.position = position; + } + + + @Override + public String apply(ImplementationArguments implementationArguments) { + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; + + Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); + + RotationUtil.rotateVector(xz, arguments.getRotation()); + + String data = arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))).getBlock().getBlockData().getAsString(); + if(data.contains("[")) return data.substring(0, data.indexOf('[')); // Strip properties + else return data; + } + + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.STRING; + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java index 63b54316c..0b8b2aa13 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java @@ -68,4 +68,9 @@ public class BukkitBlockData implements BlockData { throw new Error(e); } } + + @Override + public String getAsString() { + return delegate.getAsString(false); + } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java index 0f0d4f602..f7fac5fb4 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/block/FabricBlockData.java @@ -30,6 +30,11 @@ public class FabricBlockData implements BlockData { } } + @Override + public String getAsString() { + return delegate.toString(); + } + @Override public BlockState getHandle() { return delegate; From 3c12a98ef3c74061dbf873293af20aab2b739656 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 3 Jan 2021 21:52:11 -0700 Subject: [PATCH 179/210] update .gitignore --- .gitignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1c84c6c0f..2acf9e5c9 100644 --- a/.gitignore +++ b/.gitignore @@ -138,4 +138,7 @@ build !lib/*.jar .idea/Terra.iml /run/ -.idea/**.iml \ No newline at end of file +.idea/**.iml +/lang/ +/packs/ +/config.yml From ee093397d307f2ca4743c1eea70ad866a4e9e741 Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 4 Jan 2021 00:21:49 -0700 Subject: [PATCH 180/210] begin work on janky pregenerator --- .gitignore | 1 + .../items/state/BufferedStateManipulator.java | 27 +++++ .../world/generation/TerraChunkGenerator.java | 2 +- .../generation/MasterChunkGenerator.java | 2 +- platforms/region/build.gradle.kts | 26 ++++ .../java/com/dfsek/terra/RegionGenerator.java | 18 +++ .../com/dfsek/terra/StandalonePlugin.java | 111 ++++++++++++++++++ .../java/com/dfsek/terra/platform/Data.java | 71 +++++++++++ .../dfsek/terra/platform/DirectChunkData.java | 41 +++++++ .../com/dfsek/terra/platform/DirectWorld.java | 88 ++++++++++++++ .../com/dfsek/terra/platform/GenWrapper.java | 67 +++++++++++ .../com/dfsek/terra/platform/RawBiome.java | 16 +++ .../com/dfsek/terra/platform/RawTree.java | 25 ++++ .../dfsek/terra/platform/RawWorldHandle.java | 45 +++++++ .../com/dfsek/terra/region/Generator.java | 87 ++++++++++++++ .../com/dfsek/terra/region/RegionWriter.java | 5 + settings.gradle.kts | 2 +- 17 files changed, 631 insertions(+), 3 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/state/BufferedStateManipulator.java create mode 100644 platforms/region/build.gradle.kts create mode 100644 platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java create mode 100644 platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java create mode 100644 platforms/region/src/main/java/com/dfsek/terra/platform/Data.java create mode 100644 platforms/region/src/main/java/com/dfsek/terra/platform/DirectChunkData.java create mode 100644 platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java create mode 100644 platforms/region/src/main/java/com/dfsek/terra/platform/GenWrapper.java create mode 100644 platforms/region/src/main/java/com/dfsek/terra/platform/RawBiome.java create mode 100644 platforms/region/src/main/java/com/dfsek/terra/platform/RawTree.java create mode 100644 platforms/region/src/main/java/com/dfsek/terra/platform/RawWorldHandle.java create mode 100644 platforms/region/src/main/java/com/dfsek/terra/region/Generator.java create mode 100644 platforms/region/src/main/java/com/dfsek/terra/region/RegionWriter.java diff --git a/.gitignore b/.gitignore index 2acf9e5c9..ab2a28212 100644 --- a/.gitignore +++ b/.gitignore @@ -142,3 +142,4 @@ build /lang/ /packs/ /config.yml +/region/ diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/state/BufferedStateManipulator.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/state/BufferedStateManipulator.java new file mode 100644 index 000000000..ec8f72c41 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/state/BufferedStateManipulator.java @@ -0,0 +1,27 @@ +package com.dfsek.terra.api.structures.structure.buffer.items.state; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.state.BlockState; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; + +@SuppressWarnings("unchecked") +public abstract class BufferedStateManipulator implements BufferedItem { + private final TerraPlugin main; + + protected BufferedStateManipulator(TerraPlugin main) { + this.main = main; + } + + @Override + public void paste(Location origin) { + BlockState state = origin.getBlock().getState(); + try { + apply((T) state); + } catch(ClassCastException e) { + main.getLogger().warning("Could not find expected BlockState at " + origin + "; found " + origin.getBlock().getBlockData().getAsString()); + } + } + + public abstract void apply(T state); +} diff --git a/common/src/main/java/com/dfsek/terra/api/world/generation/TerraChunkGenerator.java b/common/src/main/java/com/dfsek/terra/api/world/generation/TerraChunkGenerator.java index 85d2cea78..5273916a1 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/generation/TerraChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/generation/TerraChunkGenerator.java @@ -10,7 +10,7 @@ import org.jetbrains.annotations.NotNull; import java.util.Random; public interface TerraChunkGenerator { - ChunkGenerator.ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, ChunkGenerator.ChunkData original); + ChunkGenerator.ChunkData generateChunkData(@NotNull World world, Random random, int x, int z, ChunkGenerator.ChunkData original); void generateBiomes(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome); diff --git a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java index 0abb1a2d1..ed049ebe6 100644 --- a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java @@ -86,7 +86,7 @@ public class MasterChunkGenerator implements TerraChunkGenerator { @Override @SuppressWarnings({"try"}) - public ChunkGenerator.ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int chunkX, int chunkZ, ChunkGenerator.ChunkData chunk) { + public ChunkGenerator.ChunkData generateChunkData(@NotNull World world, Random random, int chunkX, int chunkZ, ChunkGenerator.ChunkData chunk) { TerraWorld tw = main.getWorld(world); com.dfsek.terra.api.world.biome.BiomeGrid grid = tw.getGrid(); try(ProfileFuture ignore = tw.getProfiler().measure("TotalChunkGenTime")) { diff --git a/platforms/region/build.gradle.kts b/platforms/region/build.gradle.kts new file mode 100644 index 000000000..3d467c794 --- /dev/null +++ b/platforms/region/build.gradle.kts @@ -0,0 +1,26 @@ +import com.dfsek.terra.configureCommon +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + +plugins { + `java-library` +} + +configureCommon() + +group = "com.dfsek.terra" + +repositories { + mavenCentral() + maven { url = uri("https://jitpack.io/") } +} + +dependencies { + "shadedApi"(project(":common")) + "shadedImplementation"("com.github.Querz:NBT:5.2") // Standalone NBT API + "shadedImplementation"("org.yaml:snakeyaml:1.27") + "shadedImplementation"("com.googlecode.json-simple:json-simple:1.1.1") +} + +tasks.named("shadowJar") { + relocate("net.querz", "com.dfsek.terra.libs.nbt") +} \ No newline at end of file diff --git a/platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java b/platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java new file mode 100644 index 000000000..52ceb47f6 --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java @@ -0,0 +1,18 @@ +package com.dfsek.terra; + +import com.dfsek.terra.region.Generator; + +import java.io.IOException; +import java.util.concurrent.ThreadLocalRandom; + +public class RegionGenerator { + public static void main(String[] args) throws IOException { + long seed; + if(args.length == 1) seed = Long.parseLong(args[0]); + else seed = ThreadLocalRandom.current().nextLong(); + + Generator generator = new Generator(seed); + + generator.generate(); + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java new file mode 100644 index 000000000..741c34674 --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java @@ -0,0 +1,111 @@ +package com.dfsek.terra; + +import com.dfsek.tectonic.loading.TypeRegistry; +import com.dfsek.terra.api.GenericLoaders; +import com.dfsek.terra.api.lang.Language; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; +import com.dfsek.terra.api.platform.handle.ItemHandle; +import com.dfsek.terra.api.platform.handle.WorldHandle; +import com.dfsek.terra.api.platform.world.Biome; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.config.base.PluginConfig; +import com.dfsek.terra.config.lang.LangUtil; +import com.dfsek.terra.platform.RawBiome; +import com.dfsek.terra.platform.RawWorldHandle; +import com.dfsek.terra.registry.ConfigRegistry; + +import java.io.File; +import java.io.IOException; +import java.util.logging.Logger; + +public class StandalonePlugin implements TerraPlugin { + private final ConfigRegistry registry = new ConfigRegistry(); + private final PluginConfig config = new PluginConfig(); + private final RawWorldHandle worldHandle = new RawWorldHandle(); + + @Override + public WorldHandle getWorldHandle() { + return worldHandle; + } + + @Override + public boolean isEnabled() { + return true; + } + + @Override + public TerraWorld getWorld(World world) { + return new TerraWorld(world, registry.get("DEFAULT"), this); + } + + @Override + public Logger getLogger() { + return Logger.getLogger("Terra"); + } + + @Override + public PluginConfig getTerraConfig() { + return config; + } + + @Override + public File getDataFolder() { + return new File("."); + } + + @Override + public boolean isDebug() { + return true; + } + + @Override + public Language getLanguage() { + try { + return new Language(new File(getDataFolder(), "lang/en_us.yml")); + } catch(IOException e) { + throw new IllegalArgumentException(); + } + } + + @Override + public ConfigRegistry getRegistry() { + return registry; + } + + @Override + public void reload() { + throw new UnsupportedOperationException(); + } + + @Override + public ItemHandle getItemHandle() { + return null; + } + + @Override + public void saveDefaultConfig() { + + } + + @Override + public String platformName() { + return "Standalone"; + } + + @Override + public void register(TypeRegistry registry) { + registry + .registerLoader(BlockData.class, (t, o, l) -> worldHandle.createBlockData((String) o)) + .registerLoader(Biome.class, (t, o, l) -> new RawBiome(o.toString())) + .registerLoader(MaterialData.class, (t, o, l) -> worldHandle.createMaterialData((String) o)); + new GenericLoaders(this).register(registry); + } + + public void load() { + LangUtil.load("en_us", this); + registry.loadAll(this); + config.load(this); + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java b/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java new file mode 100644 index 000000000..705ff12ad --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java @@ -0,0 +1,71 @@ +package com.dfsek.terra.platform; + +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; +import net.querz.nbt.tag.CompoundTag; + +public class Data implements BlockData, MaterialData { + private final CompoundTag data; + private final String noProp; + + public Data(String data) { + this.data = new CompoundTag(); + if(data.contains("[")) noProp = data.substring(0, data.indexOf('[')); // Strip properties for now TODO: actually do properties lol + else noProp = data; + this.data.putString("Name", noProp); + } + + @Override + public MaterialData getMaterial() { + return this; + } + + @Override + public boolean matches(MaterialData materialData) { + return ((Data) materialData).noProp.equals(noProp); + } + + @Override + public boolean matches(BlockData other) { + return ((Data) other).noProp.equals(noProp); + } + + @Override + public boolean isSolid() { + return !isAir(); //TODO: actual implementation + } + + @Override + public boolean isAir() { + return noProp.equals("minecraft:air"); + } + + @Override + public double getMaxDurability() { + return 0; + } + + @Override + public BlockData createBlockData() { + return this; + } + + @Override + public BlockData clone() { + try { + return (BlockData) super.clone(); + } catch(CloneNotSupportedException e) { + throw new Error(e); + } + } + + @Override + public String getAsString() { + return noProp; + } + + @Override + public CompoundTag getHandle() { + return data; + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectChunkData.java b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectChunkData.java new file mode 100644 index 000000000..a0c694680 --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectChunkData.java @@ -0,0 +1,41 @@ +package com.dfsek.terra.platform; + +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import net.querz.mca.Chunk; +import net.querz.nbt.tag.CompoundTag; +import org.jetbrains.annotations.NotNull; + +public class DirectChunkData implements ChunkGenerator.ChunkData { + private final Chunk delegate; + private final int offX; + private final int offZ; + + public DirectChunkData(Chunk delegate, int offX, int offZ) { + this.delegate = delegate; + this.offX = offX; + this.offZ = offZ; + } + + @Override + public Object getHandle() { + return delegate; + } + + @Override + public int getMaxHeight() { + return 255; + } + + @Override + public void setBlock(int x, int y, int z, @NotNull BlockData blockData) { + delegate.setBlockStateAt(x, y, z, ((Data) blockData).getHandle(), false); + } + + @Override + public @NotNull BlockData getBlockData(int x, int y, int z) { + CompoundTag tag = delegate.getBlockStateAt(x, y, z); + if(tag == null) return new Data("minecraft:air"); + return new Data(tag.getString("Name")); + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java new file mode 100644 index 000000000..71bc47b6d --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java @@ -0,0 +1,88 @@ +package com.dfsek.terra.platform; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.Chunk; +import com.dfsek.terra.api.platform.world.Tree; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.platform.world.entity.Entity; +import com.dfsek.terra.api.platform.world.entity.EntityType; + +import java.io.File; +import java.util.UUID; + +public class DirectWorld implements World { + private final long seed; + private final GenWrapper generator; + + public DirectWorld(long seed, GenWrapper generator) { + this.seed = seed; + this.generator = generator; + } + + @Override + public long getSeed() { + return seed; + } + + @Override + public int getMaxHeight() { + return 255; + } + + @Override + public ChunkGenerator getGenerator() { + return generator; + } + + @Override + public String getName() { + return null; + } + + @Override + public UUID getUID() { + return null; + } + + @Override + public boolean isChunkGenerated(int x, int z) { + return false; + } + + @Override + public Chunk getChunkAt(int x, int z) { + return null; + } + + @Override + public File getWorldFolder() { + return null; + } + + @Override + public Block getBlockAt(int x, int y, int z) { + return null; + } + + @Override + public Block getBlockAt(Location l) { + return null; + } + + @Override + public boolean generateTree(Location l, Tree vanillaTreeType) { + return false; + } + + @Override + public Entity spawnEntity(Location location, EntityType entityType) { + return null; + } + + @Override + public Object getHandle() { + return generator; + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/GenWrapper.java b/platforms/region/src/main/java/com/dfsek/terra/platform/GenWrapper.java new file mode 100644 index 000000000..9b68bc4a2 --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/GenWrapper.java @@ -0,0 +1,67 @@ +package com.dfsek.terra.platform; + +import com.dfsek.terra.api.platform.generator.BlockPopulator; +import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.BiomeGrid; +import com.dfsek.terra.api.platform.world.World; +import com.dfsek.terra.api.world.generation.TerraChunkGenerator; +import com.dfsek.terra.generation.MasterChunkGenerator; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +public class GenWrapper implements ChunkGenerator { + private final MasterChunkGenerator generator; + + public GenWrapper(MasterChunkGenerator generator) { + this.generator = generator; + } + + @Override + public Object getHandle() { + return generator; + } + + @Override + public boolean isParallelCapable() { + return true; + } + + @Override + public boolean shouldGenerateCaves() { + return true; + } + + @Override + public boolean shouldGenerateDecorations() { + return true; + } + + @Override + public boolean shouldGenerateMobs() { + return true; + } + + @Override + public boolean shouldGenerateStructures() { + return true; + } + + @Override + public ChunkData generateChunkData(@NotNull World world, @NotNull Random random, int x, int z, @NotNull BiomeGrid biome) { + throw new UnsupportedOperationException(); // gen is directly handled by Generator + } + + @Override + public List getDefaultPopulators(World world) { + return Collections.emptyList(); + } + + @Override + public @Nullable TerraChunkGenerator getTerraGenerator() { + return generator; + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/RawBiome.java b/platforms/region/src/main/java/com/dfsek/terra/platform/RawBiome.java new file mode 100644 index 000000000..d9082aa4c --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/RawBiome.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.platform; + +import com.dfsek.terra.api.platform.world.Biome; + +public class RawBiome implements Biome { + private final String id; + + public RawBiome(String id) { + this.id = id; + } + + @Override + public Object getHandle() { + return id; + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/RawTree.java b/platforms/region/src/main/java/com/dfsek/terra/platform/RawTree.java new file mode 100644 index 000000000..b1ced73b6 --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/RawTree.java @@ -0,0 +1,25 @@ +package com.dfsek.terra.platform; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.block.MaterialData; +import com.dfsek.terra.api.platform.world.Tree; + +import java.util.Random; +import java.util.Set; + +public class RawTree implements Tree { // TODO: implement + @Override + public Object getHandle() { + return null; + } + + @Override + public boolean plant(Location l, Random r) { + return false; + } + + @Override + public Set getSpawnable() { + return null; + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/RawWorldHandle.java b/platforms/region/src/main/java/com/dfsek/terra/platform/RawWorldHandle.java new file mode 100644 index 000000000..c88ef66a7 --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/RawWorldHandle.java @@ -0,0 +1,45 @@ +package com.dfsek.terra.platform; + +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.MaterialData; +import com.dfsek.terra.api.platform.handle.WorldHandle; +import com.dfsek.terra.api.platform.world.Tree; +import com.dfsek.terra.api.platform.world.entity.EntityType; + +public class RawWorldHandle implements WorldHandle { + @Override + public void setBlockData(Block block, BlockData data, boolean physics) { + + } + + @Override + public BlockData getBlockData(Block block) { + return null; + } + + @Override + public MaterialData getType(Block block) { + return null; + } + + @Override + public BlockData createBlockData(String data) { + return new Data(data); + } + + @Override + public MaterialData createMaterialData(String data) { + return new Data(data); + } + + @Override + public Tree getTree(String id) { + return new RawTree(); + } + + @Override + public EntityType getEntity(String id) { + return null; + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java new file mode 100644 index 000000000..f7415c15e --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java @@ -0,0 +1,87 @@ +package com.dfsek.terra.region; + +import com.dfsek.terra.StandalonePlugin; +import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.util.GlueList; +import com.dfsek.terra.generation.MasterChunkGenerator; +import com.dfsek.terra.generation.math.SamplerCache; +import com.dfsek.terra.platform.DirectChunkData; +import com.dfsek.terra.platform.DirectWorld; +import com.dfsek.terra.platform.GenWrapper; +import net.querz.mca.Chunk; +import net.querz.mca.MCAFile; +import net.querz.mca.MCAUtil; + +import java.io.File; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Generator { + private final Map files = new HashMap<>(); + + private final long seed; + + public Generator(long seed) { + this.seed = seed; + } + + public void generate() throws IOException { + + int rad = 50; + + StandalonePlugin plugin = new StandalonePlugin(); + plugin.load(); + + + MasterChunkGenerator generator = new MasterChunkGenerator(plugin.getRegistry().get("DEFAULT"), plugin, new SamplerCache(plugin)); + GenWrapper wrapper = new GenWrapper(generator); + + int count = 0; + + List times = new GlueList<>(); + + for(int cx = -rad; cx <= rad; cx++) { + for(int cz = -rad; cz <= rad; cz++) { + long start = System.nanoTime(); + + long key = (((long) MCAUtil.chunkToRegion(cx)) << 32) | (MCAUtil.chunkToRegion(cz) & 0xffffffffL); + + int finalCx = cx; + int finalCz = cz; + MCAFile file = files.computeIfAbsent(key, k -> new MCAFile(MCAUtil.chunkToRegion(finalCx), MCAUtil.chunkToRegion(finalCz))); + + Chunk chunk = Chunk.newChunk(); + + ChunkGenerator.ChunkData chunkData = new DirectChunkData(chunk, cx, cz); + generator.generateChunkData(new DirectWorld(seed, wrapper), null, cx, cz, chunkData); + + file.setChunk(cx, cz, chunk); + + long end = System.nanoTime() - start; + count++; + times.add((double) end / 1000000); + + if(count % 200 == 0) { + double total = 0; + for(double d : times) total += d; + double avg = total / count; + + double pct = ((double) count / (rad * rad * 2 * 2)) * 100D; + + plugin.getLogger().info("Generated " + count + " chunks. " + (1 / avg) * 1000 + "cps; " + pct + "%"); + } + } + } + + for(Map.Entry entry : files.entrySet()) { + entry.getValue().cleanupPalettesAndBlockStates(); + int x = (int) (entry.getKey() >> 32); + int z = (int) (long) entry.getKey(); + File file = new File("region", MCAUtil.createNameFromRegionLocation(x, z)); + file.getParentFile().mkdirs(); + MCAUtil.write(entry.getValue(), file); + } + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/region/RegionWriter.java b/platforms/region/src/main/java/com/dfsek/terra/region/RegionWriter.java new file mode 100644 index 000000000..7ae434669 --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/region/RegionWriter.java @@ -0,0 +1,5 @@ +package com.dfsek.terra.region; + +public class RegionWriter { + +} diff --git a/settings.gradle.kts b/settings.gradle.kts index 61c60a585..682f7912b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -11,7 +11,7 @@ rootProject.name = "Terra" include("common") include("platforms:bukkit") include("platforms:fabric") - +include("platforms:region") pluginManagement { repositories { From 75fbda5a9fb2cd38f17403d76f8ce446c643df4c Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 4 Jan 2021 01:29:51 -0700 Subject: [PATCH 181/210] continue work on janky pregenerator --- .../dfsek/terra/api/math/vector/Location.java | 5 ++ .../generation/MasterChunkGenerator.java | 14 +-- .../java/com/dfsek/terra/DirectUtils.java | 17 ++++ .../java/com/dfsek/terra/platform/Data.java | 23 +++++ .../com/dfsek/terra/platform/DirectBlock.java | 85 +++++++++++++++++++ .../terra/platform/DirectBlockState.java | 42 +++++++++ .../dfsek/terra/platform/DirectChunkData.java | 37 ++++++-- .../com/dfsek/terra/platform/DirectWorld.java | 30 ++++++- .../com/dfsek/terra/platform/RawTree.java | 3 +- .../com/dfsek/terra/region/Generator.java | 41 +++++---- 10 files changed, 265 insertions(+), 32 deletions(-) create mode 100644 platforms/region/src/main/java/com/dfsek/terra/DirectUtils.java create mode 100644 platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlock.java create mode 100644 platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlockState.java diff --git a/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java b/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java index ee86b74ef..69443a7d7 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java +++ b/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java @@ -160,4 +160,9 @@ public class Location implements Cloneable { public Vector3 toVector() { return vector.clone(); } + + @Override + public String toString() { + return "(" + getX() + ", " + getY() + ", " + getZ() + ")"; + } } diff --git a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java index ed049ebe6..272acfaf2 100644 --- a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java @@ -152,8 +152,10 @@ public class MasterChunkGenerator implements TerraChunkGenerator { Palette stairPalette = stairs.get(down.getMaterial()); if(stairPalette != null) { BlockData stair = stairPalette.get(0, block.getBlockX(), block.getBlockZ()).clone(); - Stairs stairNew = (Stairs) stair; - if(placeStair(orig, chunk, block, thresh, sampler, stairNew)) return; // Successfully placed part. + if(stair instanceof Stairs) { + Stairs stairNew = (Stairs) stair; + if(placeStair(orig, chunk, block, thresh, sampler, stairNew)) return; // Successfully placed part. + } } } BlockData slab = slabs.getOrDefault(down.getMaterial(), blank).get(0, block.getBlockX(), block.getBlockZ()); @@ -171,9 +173,11 @@ public class MasterChunkGenerator implements TerraChunkGenerator { Palette stairPalette = stairs.get(up.getMaterial()); if(stairPalette != null) { BlockData stair = stairPalette.get(0, block.getBlockX(), block.getBlockZ()).clone(); - Stairs stairNew = (Stairs) stair.clone(); - stairNew.setHalf(Bisected.Half.TOP); - if(placeStair(orig, chunk, block, thresh, sampler, stairNew)) return; // Successfully placed part. + if(stair instanceof Stairs) { + Stairs stairNew = (Stairs) stair.clone(); + stairNew.setHalf(Bisected.Half.TOP); + if(placeStair(orig, chunk, block, thresh, sampler, stairNew)) return; // Successfully placed part. + } } } BlockData slab = slabs.getOrDefault(up.getMaterial(), blank).get(0, block.getBlockX(), block.getBlockZ()).clone(); diff --git a/platforms/region/src/main/java/com/dfsek/terra/DirectUtils.java b/platforms/region/src/main/java/com/dfsek/terra/DirectUtils.java new file mode 100644 index 000000000..f5beb0bbd --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/DirectUtils.java @@ -0,0 +1,17 @@ +package com.dfsek.terra; + +import net.querz.mca.MCAUtil; + +public final class DirectUtils { + + /** + * Compute long region ID from chunk coords + * + * @param x X + * @param z Z + * @return Region IS + */ + public static long regionID(int x, int z) { + return (((long) MCAUtil.chunkToRegion(x)) << 32) | (MCAUtil.chunkToRegion(z) & 0xffffffffL); + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java b/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java index 705ff12ad..8ac9d5902 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java @@ -15,6 +15,18 @@ public class Data implements BlockData, MaterialData { this.data.putString("Name", noProp); } + public Data(CompoundTag tag) { + if(tag == null) { + this.data = new CompoundTag(); + data.putString("Name", "minecraft:air"); + } else { + this.data = tag; + } + String id = data.getString("Name"); + if(id.contains("[")) noProp = id.substring(0, id.indexOf('[')); // Strip properties for now TODO: actually do properties lol + else noProp = id; + } + @Override public MaterialData getMaterial() { return this; @@ -68,4 +80,15 @@ public class Data implements BlockData, MaterialData { public CompoundTag getHandle() { return data; } + + @Override + public int hashCode() { + return noProp.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if(!(obj instanceof Data)) return false; + return ((Data) obj).noProp.equals(noProp); + } } diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlock.java b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlock.java new file mode 100644 index 000000000..5dfa4194f --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlock.java @@ -0,0 +1,85 @@ +package com.dfsek.terra.platform; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.BlockFace; +import com.dfsek.terra.api.platform.block.MaterialData; +import com.dfsek.terra.api.platform.block.state.BlockState; +import net.jafama.FastMath; + +public class DirectBlock implements Block { + private final DirectWorld world; + private final Vector3 pos; + + public DirectBlock(DirectWorld world, Vector3 pos) { + this.world = world; + this.pos = pos; + } + + @Override + public void setBlockData(BlockData data, boolean physics) { + world.compute(FastMath.floorDiv(pos.getBlockX(), 16), FastMath.floorDiv(pos.getBlockZ(), 16)).setBlockStateAt(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ(), ((Data) data).getHandle(), false); + } + + @Override + public BlockData getBlockData() { + return new Data(world.getData(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ())); + } + + @Override + public BlockState getState() { + return new DirectBlockState(); + } + + @Override + public Block getRelative(BlockFace face) { + return world.getBlockAt(pos.getBlockX() + face.getModX(), pos.getBlockY() + face.getModY(), pos.getBlockZ() + face.getModZ()); + } + + @Override + public Block getRelative(BlockFace face, int len) { + return world.getBlockAt(pos.getBlockX() + face.getModX() * len, pos.getBlockY() + face.getModY() * len, pos.getBlockZ() + face.getModZ() * len); + } + + @Override + public boolean isEmpty() { + return getBlockData().getAsString().equals("minecraft:air"); + } + + @Override + public Location getLocation() { + return pos.toLocation(world); + } + + @Override + public MaterialData getType() { + return new Data(world.getData(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ())); + } + + @Override + public int getX() { + return pos.getBlockX(); + } + + @Override + public int getZ() { + return pos.getBlockY(); + } + + @Override + public int getY() { + return pos.getBlockY(); + } + + @Override + public boolean isPassable() { + return false; + } + + @Override + public Object getHandle() { + return world; + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlockState.java b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlockState.java new file mode 100644 index 000000000..db759cb44 --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlockState.java @@ -0,0 +1,42 @@ +package com.dfsek.terra.platform; + +import com.dfsek.terra.api.platform.block.Block; +import com.dfsek.terra.api.platform.block.BlockData; +import com.dfsek.terra.api.platform.block.state.BlockState; + +public class DirectBlockState implements BlockState { + @Override + public Block getBlock() { + return null; + } + + @Override + public int getX() { + return 0; + } + + @Override + public int getY() { + return 0; + } + + @Override + public int getZ() { + return 0; + } + + @Override + public BlockData getBlockData() { + return null; + } + + @Override + public boolean update(boolean applyPhysics) { + return false; + } + + @Override + public Object getHandle() { + return null; + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectChunkData.java b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectChunkData.java index a0c694680..4a2c0a82a 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectChunkData.java +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectChunkData.java @@ -1,20 +1,25 @@ package com.dfsek.terra.platform; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.platform.world.World; import net.querz.mca.Chunk; import net.querz.nbt.tag.CompoundTag; import org.jetbrains.annotations.NotNull; -public class DirectChunkData implements ChunkGenerator.ChunkData { +public class DirectChunkData implements ChunkGenerator.ChunkData, com.dfsek.terra.api.platform.world.Chunk { private final Chunk delegate; - private final int offX; - private final int offZ; + private final DirectWorld world; + private final int x; + private final int z; - public DirectChunkData(Chunk delegate, int offX, int offZ) { + public DirectChunkData(Chunk delegate, DirectWorld world, int x, int z) { this.delegate = delegate; - this.offX = offX; - this.offZ = offZ; + this.world = world; + this.x = x; + this.z = z; } @Override @@ -38,4 +43,24 @@ public class DirectChunkData implements ChunkGenerator.ChunkData { if(tag == null) return new Data("minecraft:air"); return new Data(tag.getString("Name")); } + + @Override + public int getX() { + return x; + } + + @Override + public int getZ() { + return z; + } + + @Override + public World getWorld() { + return world; + } + + @Override + public Block getBlock(int x, int y, int z) { + return new DirectBlock(world, new Vector3(x + (this.x << 4), y, z + (this.z << 4))); + } } diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java index 71bc47b6d..9bc95b02c 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java @@ -1,6 +1,8 @@ package com.dfsek.terra.platform; +import com.dfsek.terra.DirectUtils; import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.generator.ChunkGenerator; import com.dfsek.terra.api.platform.world.Chunk; @@ -8,13 +10,20 @@ import com.dfsek.terra.api.platform.world.Tree; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.platform.world.entity.Entity; import com.dfsek.terra.api.platform.world.entity.EntityType; +import net.jafama.FastMath; +import net.querz.mca.MCAFile; +import net.querz.mca.MCAUtil; +import net.querz.nbt.tag.CompoundTag; import java.io.File; +import java.util.HashMap; +import java.util.Map; import java.util.UUID; public class DirectWorld implements World { private final long seed; private final GenWrapper generator; + private final Map files = new HashMap<>(); public DirectWorld(long seed, GenWrapper generator) { this.seed = seed; @@ -53,7 +62,10 @@ public class DirectWorld implements World { @Override public Chunk getChunkAt(int x, int z) { - return null; + MCAFile file = compute(x, z); + net.querz.mca.Chunk chunk = file.getChunk(x, z); + if(chunk == null) chunk = net.querz.mca.Chunk.newChunk(); + return new DirectChunkData(chunk, this, x, z); } @Override @@ -63,12 +75,12 @@ public class DirectWorld implements World { @Override public Block getBlockAt(int x, int y, int z) { - return null; + return new DirectBlock(this, new Vector3(x, y, z)); } @Override public Block getBlockAt(Location l) { - return null; + return getBlockAt(l.getBlockX(), l.getBlockY(), l.getBlockZ()); } @Override @@ -85,4 +97,16 @@ public class DirectWorld implements World { public Object getHandle() { return generator; } + + public MCAFile compute(int x, int z) { + return files.computeIfAbsent(DirectUtils.regionID(x, z), k -> new MCAFile(MCAUtil.chunkToRegion(x), MCAUtil.chunkToRegion(z))); + } + + public CompoundTag getData(int x, int y, int z) { + return compute(FastMath.floorDiv(x, 16), FastMath.floorDiv(z, 16)).getBlockStateAt(x, y, z); + } + + public Map getFiles() { + return files; + } } diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/RawTree.java b/platforms/region/src/main/java/com/dfsek/terra/platform/RawTree.java index b1ced73b6..36110aaf5 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/RawTree.java +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/RawTree.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.world.Tree; +import java.util.Collections; import java.util.Random; import java.util.Set; @@ -20,6 +21,6 @@ public class RawTree implements Tree { // TODO: implement @Override public Set getSpawnable() { - return null; + return Collections.emptySet(); } } diff --git a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java index f7415c15e..a0ebd78b9 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java +++ b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java @@ -1,26 +1,28 @@ package com.dfsek.terra.region; import com.dfsek.terra.StandalonePlugin; -import com.dfsek.terra.api.platform.generator.ChunkGenerator; +import com.dfsek.terra.api.math.MathUtil; +import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.util.GlueList; import com.dfsek.terra.generation.MasterChunkGenerator; import com.dfsek.terra.generation.math.SamplerCache; import com.dfsek.terra.platform.DirectChunkData; import com.dfsek.terra.platform.DirectWorld; import com.dfsek.terra.platform.GenWrapper; -import net.querz.mca.Chunk; +import com.dfsek.terra.population.CavePopulator; +import com.dfsek.terra.population.FloraPopulator; +import com.dfsek.terra.population.OrePopulator; +import com.dfsek.terra.population.StructurePopulator; +import com.dfsek.terra.population.TreePopulator; import net.querz.mca.MCAFile; import net.querz.mca.MCAUtil; import java.io.File; import java.io.IOException; -import java.util.HashMap; import java.util.List; import java.util.Map; public class Generator { - private final Map files = new HashMap<>(); - private final long seed; public Generator(long seed) { @@ -29,7 +31,7 @@ public class Generator { public void generate() throws IOException { - int rad = 50; + int rad = 25; StandalonePlugin plugin = new StandalonePlugin(); plugin.load(); @@ -38,26 +40,31 @@ public class Generator { MasterChunkGenerator generator = new MasterChunkGenerator(plugin.getRegistry().get("DEFAULT"), plugin, new SamplerCache(plugin)); GenWrapper wrapper = new GenWrapper(generator); + FloraPopulator floraPopulator = new FloraPopulator(plugin); + StructurePopulator structurePopulator = new StructurePopulator(plugin); + TreePopulator treePopulator = new TreePopulator(plugin); + OrePopulator orePopulator = new OrePopulator(plugin); + CavePopulator cavePopulator = new CavePopulator(plugin); + int count = 0; List times = new GlueList<>(); + DirectWorld world = new DirectWorld(seed, wrapper); + for(int cx = -rad; cx <= rad; cx++) { for(int cz = -rad; cz <= rad; cz++) { long start = System.nanoTime(); - long key = (((long) MCAUtil.chunkToRegion(cx)) << 32) | (MCAUtil.chunkToRegion(cz) & 0xffffffffL); + DirectChunkData chunkData = (DirectChunkData) world.getChunkAt(cx, cz); + generator.generateChunkData(world, null, cx, cz, chunkData); - int finalCx = cx; - int finalCz = cz; - MCAFile file = files.computeIfAbsent(key, k -> new MCAFile(MCAUtil.chunkToRegion(finalCx), MCAUtil.chunkToRegion(finalCz))); + cavePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, seed)), chunkData); + structurePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, seed)), chunkData); + orePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, seed)), chunkData); + floraPopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, seed)), chunkData); + treePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, seed)), chunkData); - Chunk chunk = Chunk.newChunk(); - - ChunkGenerator.ChunkData chunkData = new DirectChunkData(chunk, cx, cz); - generator.generateChunkData(new DirectWorld(seed, wrapper), null, cx, cz, chunkData); - - file.setChunk(cx, cz, chunk); long end = System.nanoTime() - start; count++; @@ -75,7 +82,7 @@ public class Generator { } } - for(Map.Entry entry : files.entrySet()) { + for(Map.Entry entry : world.getFiles().entrySet()) { entry.getValue().cleanupPalettesAndBlockStates(); int x = (int) (entry.getKey() >> 32); int z = (int) (long) entry.getKey(); From bd0726db37e666f677d75451f489d8ebd50d030e Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 4 Jan 2021 01:58:25 -0700 Subject: [PATCH 182/210] implement properties in janky pregen --- .../java/com/dfsek/terra/platform/Data.java | 19 +++++++++++++++---- .../com/dfsek/terra/platform/DirectWorld.java | 5 ++++- .../com/dfsek/terra/region/Generator.java | 1 + 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java b/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java index 8ac9d5902..033866ede 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java @@ -10,8 +10,19 @@ public class Data implements BlockData, MaterialData { public Data(String data) { this.data = new CompoundTag(); - if(data.contains("[")) noProp = data.substring(0, data.indexOf('[')); // Strip properties for now TODO: actually do properties lol - else noProp = data; + if(data.contains("[")) { + noProp = data.substring(0, data.indexOf('[')); // Strip properties + String properties = data.substring(data.indexOf('[') + 1, data.indexOf(']')); + String[] props = properties.split(","); + CompoundTag pTag = new CompoundTag(); + for(String property : props) { + String name = property.substring(0, property.indexOf('=')); + String val = property.substring(property.indexOf('=') + 1); + + pTag.putString(name, val); + } + this.data.put("Properties", pTag); + } else noProp = data; this.data.putString("Name", noProp); } @@ -23,10 +34,10 @@ public class Data implements BlockData, MaterialData { this.data = tag; } String id = data.getString("Name"); - if(id.contains("[")) noProp = id.substring(0, id.indexOf('[')); // Strip properties for now TODO: actually do properties lol - else noProp = id; + noProp = id; } + @Override public MaterialData getMaterial() { return this; diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java index 9bc95b02c..dcf6e79f5 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java @@ -64,7 +64,10 @@ public class DirectWorld implements World { public Chunk getChunkAt(int x, int z) { MCAFile file = compute(x, z); net.querz.mca.Chunk chunk = file.getChunk(x, z); - if(chunk == null) chunk = net.querz.mca.Chunk.newChunk(); + if(chunk == null) { + chunk = net.querz.mca.Chunk.newChunk(); + file.setChunk(x, z, chunk); + } return new DirectChunkData(chunk, this, x, z); } diff --git a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java index a0ebd78b9..730c3be95 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java +++ b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java @@ -83,6 +83,7 @@ public class Generator { } for(Map.Entry entry : world.getFiles().entrySet()) { + if(entry.getValue() == null) continue; entry.getValue().cleanupPalettesAndBlockStates(); int x = (int) (entry.getKey() >> 32); int z = (int) (long) entry.getKey(); From 87a1b0bf5a1373e74ab458ac503593e34ddb8b9f Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 4 Jan 2021 03:17:54 -0700 Subject: [PATCH 183/210] multithreaded jankiness --- .../com/dfsek/terra/carving/CarverCache.java | 50 ++++---- .../java/com/dfsek/terra/RegionGenerator.java | 5 +- .../java/com/dfsek/terra/async/Counter.java | 17 +++ .../dfsek/terra/async/GenerationWorker.java | 57 +++++++++ .../java/com/dfsek/terra/platform/Data.java | 3 +- .../com/dfsek/terra/platform/DirectBlock.java | 4 +- .../com/dfsek/terra/platform/DirectWorld.java | 19 ++- .../com/dfsek/terra/region/Generator.java | 113 +++++++++++------- 8 files changed, 199 insertions(+), 69 deletions(-) create mode 100644 platforms/region/src/main/java/com/dfsek/terra/async/Counter.java create mode 100644 platforms/region/src/main/java/com/dfsek/terra/async/GenerationWorker.java diff --git a/common/src/main/java/com/dfsek/terra/carving/CarverCache.java b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java index 809dd6936..c6ce44956 100644 --- a/common/src/main/java/com/dfsek/terra/carving/CarverCache.java +++ b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java @@ -12,7 +12,8 @@ import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import java.util.HashMap; +import java.util.Collections; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Random; @@ -20,35 +21,42 @@ import java.util.Random; public class CarverCache { private final World w; - private final Map> carvers = new HashMap<>(); + private final Map> carvers; private final TerraPlugin main; public CarverCache(World w, TerraPlugin main) { this.w = w; this.main = main; + carvers = Collections.synchronizedMap(new LinkedHashMap>() { + @Override + protected boolean removeEldestEntry(Map.Entry eldest) { + return this.size() > main.getTerraConfig().getCarverCacheSize(); + } + }); } public List getPoints(int chunkX, int chunkZ, UserDefinedCarver carver) { - if(carvers.size() > main.getTerraConfig().getCarverCacheSize()) carvers.clear(); - return carvers.computeIfAbsent((((long) chunkX) << 32) | (chunkZ & 0xffffffffL), key -> { - TerraBiomeGrid grid = main.getWorld(w).getGrid(); - if(carver.isChunkCarved(w, chunkX, chunkZ, new FastRandom(MathUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed() + carver.hashCode())))) { - long seed = MathUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed()); - carver.getSeedVar().setValue(seed); - Random r = new FastRandom(seed); - Worm carving = carver.getWorm(seed, new Vector3((chunkX << 4) + r.nextInt(16), carver.getConfig().getHeight().get(r), (chunkZ << 4) + r.nextInt(16))); - List points = new GlueList<>(); - for(int i = 0; i < carving.getLength(); i++) { - carving.step(); - Biome biome = grid.getBiome(carving.getRunning().toLocation(w), GenerationPhase.POPULATE); - if(!((UserDefinedBiome) biome).getConfig().getCarvers().containsKey(carver)) { // Stop if we enter a biome this carver is not present in - return new GlueList<>(); + synchronized(carvers) { + return carvers.computeIfAbsent((((long) chunkX) << 32) | (chunkZ & 0xffffffffL), key -> { + TerraBiomeGrid grid = main.getWorld(w).getGrid(); + if(carver.isChunkCarved(w, chunkX, chunkZ, new FastRandom(MathUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed() + carver.hashCode())))) { + long seed = MathUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed()); + carver.getSeedVar().setValue(seed); + Random r = new FastRandom(seed); + Worm carving = carver.getWorm(seed, new Vector3((chunkX << 4) + r.nextInt(16), carver.getConfig().getHeight().get(r), (chunkZ << 4) + r.nextInt(16))); + List points = new GlueList<>(); + for(int i = 0; i < carving.getLength(); i++) { + carving.step(); + Biome biome = grid.getBiome(carving.getRunning().toLocation(w), GenerationPhase.POPULATE); + if(!((UserDefinedBiome) biome).getConfig().getCarvers().containsKey(carver)) { // Stop if we enter a biome this carver is not present in + return new GlueList<>(); + } + points.add(carving.getPoint()); } - points.add(carving.getPoint()); + return points; } - return points; - } - return new GlueList<>(); - }); + return new GlueList<>(); + }); + } } } diff --git a/platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java b/platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java index 52ceb47f6..59a48910b 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java +++ b/platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java @@ -6,12 +6,13 @@ import java.io.IOException; import java.util.concurrent.ThreadLocalRandom; public class RegionGenerator { - public static void main(String[] args) throws IOException { + public static void main(String[] args) throws IOException, InterruptedException { long seed; if(args.length == 1) seed = Long.parseLong(args[0]); else seed = ThreadLocalRandom.current().nextLong(); - Generator generator = new Generator(seed); + StandalonePlugin plugin = new StandalonePlugin(); + Generator generator = new Generator(seed, plugin); generator.generate(); } diff --git a/platforms/region/src/main/java/com/dfsek/terra/async/Counter.java b/platforms/region/src/main/java/com/dfsek/terra/async/Counter.java new file mode 100644 index 000000000..57566f20d --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/async/Counter.java @@ -0,0 +1,17 @@ +package com.dfsek.terra.async; + +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; + +public class Counter { + private final AtomicInteger integer = new AtomicInteger(); + private final Consumer update; + + public Counter(Consumer update) { + this.update = update; + } + + public void add() { + update.accept(integer.addAndGet(1)); + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/async/GenerationWorker.java b/platforms/region/src/main/java/com/dfsek/terra/async/GenerationWorker.java new file mode 100644 index 000000000..0561d1f9f --- /dev/null +++ b/platforms/region/src/main/java/com/dfsek/terra/async/GenerationWorker.java @@ -0,0 +1,57 @@ +package com.dfsek.terra.async; + +import com.dfsek.terra.DirectUtils; +import com.dfsek.terra.api.math.MathUtil; +import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.platform.DirectChunkData; +import com.dfsek.terra.platform.DirectWorld; +import com.dfsek.terra.region.Generator; +import net.querz.mca.MCAUtil; + +import java.io.File; +import java.util.concurrent.RecursiveAction; + +public class GenerationWorker extends RecursiveAction { + private final int x; + private final int z; + private final DirectWorld world; + private final Generator generator; + private final Counter counter; + + public GenerationWorker(int x, int z, DirectWorld world, Generator generator, Counter counter) { + this.x = x; + this.z = z; + this.world = world; + this.generator = generator; + this.counter = counter; + } + + + @Override + protected void compute() { + for(int cx = x * 32; cx < x * 32 + 32; cx++) { + for(int cz = z * 32; cz <= z * 32 + 32; cz++) { + DirectChunkData chunkData = (DirectChunkData) world.getChunkAt(cx, cz); + generator.getGenerator().generateChunkData(world, null, cx, cz, chunkData); + + generator.getCavePopulator().populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); + generator.getStructurePopulator().populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); + generator.getOrePopulator().populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); + generator.getFloraPopulator().populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); + generator.getTreePopulator().populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); + + counter.add(); + } + } + long regionID = DirectUtils.regionID(x, z); + try { + File file = new File("region", MCAUtil.createNameFromRegionLocation(x, z)); + file.getParentFile().mkdirs(); + MCAUtil.write(world.getFiles().get(regionID), file); + } catch(Exception e) { + e.printStackTrace(); + } + world.getFiles().remove(regionID); + System.out.println("Saved region [" + x + "," + z + "]. " + world.getFiles().size() + " regions remain loaded."); + } +} diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java b/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java index 033866ede..0ba30f150 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/Data.java @@ -33,8 +33,7 @@ public class Data implements BlockData, MaterialData { } else { this.data = tag; } - String id = data.getString("Name"); - noProp = id; + noProp = data.getString("Name"); } diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlock.java b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlock.java index 5dfa4194f..55372978b 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlock.java +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectBlock.java @@ -20,7 +20,9 @@ public class DirectBlock implements Block { @Override public void setBlockData(BlockData data, boolean physics) { - world.compute(FastMath.floorDiv(pos.getBlockX(), 16), FastMath.floorDiv(pos.getBlockZ(), 16)).setBlockStateAt(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ(), ((Data) data).getHandle(), false); + synchronized(world) { + world.compute(FastMath.floorDiv(pos.getBlockX(), 16), FastMath.floorDiv(pos.getBlockZ(), 16)).setBlockStateAt(pos.getBlockX(), pos.getBlockY(), pos.getBlockZ(), ((Data) data).getHandle(), false); + } } @Override diff --git a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java index dcf6e79f5..b3c3b344a 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java +++ b/platforms/region/src/main/java/com/dfsek/terra/platform/DirectWorld.java @@ -16,6 +16,8 @@ import net.querz.mca.MCAUtil; import net.querz.nbt.tag.CompoundTag; import java.io.File; +import java.io.IOException; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.UUID; @@ -23,7 +25,7 @@ import java.util.UUID; public class DirectWorld implements World { private final long seed; private final GenWrapper generator; - private final Map files = new HashMap<>(); + private final Map files = Collections.synchronizedMap(new HashMap<>()); public DirectWorld(long seed, GenWrapper generator) { this.seed = seed; @@ -102,7 +104,20 @@ public class DirectWorld implements World { } public MCAFile compute(int x, int z) { - return files.computeIfAbsent(DirectUtils.regionID(x, z), k -> new MCAFile(MCAUtil.chunkToRegion(x), MCAUtil.chunkToRegion(z))); + synchronized(files) { + return files.computeIfAbsent(DirectUtils.regionID(x, z), k -> { + File test = new File("region", MCAUtil.createNameFromChunkLocation(x, z)); + if(test.exists()) { + try { + System.out.println("Re-loading " + MCAUtil.createNameFromChunkLocation(x, z)); + return MCAUtil.read(test); + } catch(IOException e) { + e.printStackTrace(); + } + } + return new MCAFile(MCAUtil.chunkToRegion(x), MCAUtil.chunkToRegion(z)); + }); + } } public CompoundTag getData(int x, int y, int z) { diff --git a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java index 730c3be95..43fcd3352 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java +++ b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java @@ -1,12 +1,11 @@ package com.dfsek.terra.region; import com.dfsek.terra.StandalonePlugin; -import com.dfsek.terra.api.math.MathUtil; -import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.util.GlueList; +import com.dfsek.terra.async.Counter; +import com.dfsek.terra.async.GenerationWorker; import com.dfsek.terra.generation.MasterChunkGenerator; import com.dfsek.terra.generation.math.SamplerCache; -import com.dfsek.terra.platform.DirectChunkData; import com.dfsek.terra.platform.DirectWorld; import com.dfsek.terra.platform.GenWrapper; import com.dfsek.terra.population.CavePopulator; @@ -21,67 +20,69 @@ import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; +import java.util.concurrent.ForkJoinTask; +import java.util.concurrent.atomic.AtomicLong; public class Generator { private final long seed; + FloraPopulator floraPopulator; + StructurePopulator structurePopulator; + TreePopulator treePopulator; + OrePopulator orePopulator; + CavePopulator cavePopulator; + MasterChunkGenerator generator; - public Generator(long seed) { + public Generator(long seed, StandalonePlugin plugin) { + plugin.load(); + floraPopulator = new FloraPopulator(plugin); + structurePopulator = new StructurePopulator(plugin); + treePopulator = new TreePopulator(plugin); + orePopulator = new OrePopulator(plugin); + cavePopulator = new CavePopulator(plugin); + generator = new MasterChunkGenerator(plugin.getRegistry().get("DEFAULT"), plugin, new SamplerCache(plugin)); this.seed = seed; } public void generate() throws IOException { - int rad = 25; - - StandalonePlugin plugin = new StandalonePlugin(); - plugin.load(); + int rad = 64; + System.out.println("Total mem: " + Runtime.getRuntime().maxMemory() / 1024 / 1024 / 1024 + "GB"); - MasterChunkGenerator generator = new MasterChunkGenerator(plugin.getRegistry().get("DEFAULT"), plugin, new SamplerCache(plugin)); GenWrapper wrapper = new GenWrapper(generator); - - FloraPopulator floraPopulator = new FloraPopulator(plugin); - StructurePopulator structurePopulator = new StructurePopulator(plugin); - TreePopulator treePopulator = new TreePopulator(plugin); - OrePopulator orePopulator = new OrePopulator(plugin); - CavePopulator cavePopulator = new CavePopulator(plugin); - - int count = 0; - - List times = new GlueList<>(); - DirectWorld world = new DirectWorld(seed, wrapper); - for(int cx = -rad; cx <= rad; cx++) { - for(int cz = -rad; cz <= rad; cz++) { - long start = System.nanoTime(); + AtomicLong l = new AtomicLong(System.nanoTime()); - DirectChunkData chunkData = (DirectChunkData) world.getChunkAt(cx, cz); - generator.generateChunkData(world, null, cx, cz, chunkData); + Counter counter = new Counter((id) -> { + if(id % 200 == 0) { + long c = System.nanoTime(); - cavePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, seed)), chunkData); - structurePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, seed)), chunkData); - orePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, seed)), chunkData); - floraPopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, seed)), chunkData); - treePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, seed)), chunkData); + long diff = c - l.get(); + + double ms = (double) diff / 1000000; + + System.out.println("[" + Thread.currentThread().getName() + "] Generated " + id + " chunks. " + (200d / ms) * 1000 + " cps. " + world.getFiles().size() + " Regions loaded."); + l.set(System.nanoTime()); + } + }); - long end = System.nanoTime() - start; - count++; - times.add((double) end / 1000000); + List workers = new GlueList<>(); - if(count % 200 == 0) { - double total = 0; - for(double d : times) total += d; - double avg = total / count; - double pct = ((double) count / (rad * rad * 2 * 2)) * 100D; - - plugin.getLogger().info("Generated " + count + " chunks. " + (1 / avg) * 1000 + "cps; " + pct + "%"); - } + for(int x = -rad / 32; x <= rad / 32; x++) { + for(int z = -rad / 32; z <= rad / 32; z++) { + workers.add(new GenerationWorker(x, z, world, this, counter)); } } + + ForkJoinTask.invokeAll(workers); + + + System.out.println("Saving..."); + for(Map.Entry entry : world.getFiles().entrySet()) { if(entry.getValue() == null) continue; entry.getValue().cleanupPalettesAndBlockStates(); @@ -91,5 +92,35 @@ public class Generator { file.getParentFile().mkdirs(); MCAUtil.write(entry.getValue(), file); } + + System.out.println("Done in " + (System.nanoTime() - l.get()) / 1000000000 + "s"); + } + + public StructurePopulator getStructurePopulator() { + return structurePopulator; + } + + public OrePopulator getOrePopulator() { + return orePopulator; + } + + public CavePopulator getCavePopulator() { + return cavePopulator; + } + + public TreePopulator getTreePopulator() { + return treePopulator; + } + + public FloraPopulator getFloraPopulator() { + return floraPopulator; + } + + public long getSeed() { + return seed; + } + + public MasterChunkGenerator getGenerator() { + return generator; } } From 26504d6d83f84cbb662a9abe13695e58b9d1d37a Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 4 Jan 2021 10:52:51 -0700 Subject: [PATCH 184/210] revert some stuff --- .../java/com/dfsek/terra/RegionGenerator.java | 2 +- .../java/com/dfsek/terra/async/Counter.java | 17 ----- .../dfsek/terra/async/GenerationWorker.java | 57 -------------- .../com/dfsek/terra/region/Generator.java | 74 ++++++------------- 4 files changed, 22 insertions(+), 128 deletions(-) delete mode 100644 platforms/region/src/main/java/com/dfsek/terra/async/Counter.java delete mode 100644 platforms/region/src/main/java/com/dfsek/terra/async/GenerationWorker.java diff --git a/platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java b/platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java index 59a48910b..cf57a310b 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java +++ b/platforms/region/src/main/java/com/dfsek/terra/RegionGenerator.java @@ -6,7 +6,7 @@ import java.io.IOException; import java.util.concurrent.ThreadLocalRandom; public class RegionGenerator { - public static void main(String[] args) throws IOException, InterruptedException { + public static void main(String[] args) throws IOException { long seed; if(args.length == 1) seed = Long.parseLong(args[0]); else seed = ThreadLocalRandom.current().nextLong(); diff --git a/platforms/region/src/main/java/com/dfsek/terra/async/Counter.java b/platforms/region/src/main/java/com/dfsek/terra/async/Counter.java deleted file mode 100644 index 57566f20d..000000000 --- a/platforms/region/src/main/java/com/dfsek/terra/async/Counter.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.dfsek.terra.async; - -import java.util.concurrent.atomic.AtomicInteger; -import java.util.function.Consumer; - -public class Counter { - private final AtomicInteger integer = new AtomicInteger(); - private final Consumer update; - - public Counter(Consumer update) { - this.update = update; - } - - public void add() { - update.accept(integer.addAndGet(1)); - } -} diff --git a/platforms/region/src/main/java/com/dfsek/terra/async/GenerationWorker.java b/platforms/region/src/main/java/com/dfsek/terra/async/GenerationWorker.java deleted file mode 100644 index 0561d1f9f..000000000 --- a/platforms/region/src/main/java/com/dfsek/terra/async/GenerationWorker.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.dfsek.terra.async; - -import com.dfsek.terra.DirectUtils; -import com.dfsek.terra.api.math.MathUtil; -import com.dfsek.terra.api.util.FastRandom; -import com.dfsek.terra.platform.DirectChunkData; -import com.dfsek.terra.platform.DirectWorld; -import com.dfsek.terra.region.Generator; -import net.querz.mca.MCAUtil; - -import java.io.File; -import java.util.concurrent.RecursiveAction; - -public class GenerationWorker extends RecursiveAction { - private final int x; - private final int z; - private final DirectWorld world; - private final Generator generator; - private final Counter counter; - - public GenerationWorker(int x, int z, DirectWorld world, Generator generator, Counter counter) { - this.x = x; - this.z = z; - this.world = world; - this.generator = generator; - this.counter = counter; - } - - - @Override - protected void compute() { - for(int cx = x * 32; cx < x * 32 + 32; cx++) { - for(int cz = z * 32; cz <= z * 32 + 32; cz++) { - DirectChunkData chunkData = (DirectChunkData) world.getChunkAt(cx, cz); - generator.getGenerator().generateChunkData(world, null, cx, cz, chunkData); - - generator.getCavePopulator().populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); - generator.getStructurePopulator().populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); - generator.getOrePopulator().populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); - generator.getFloraPopulator().populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); - generator.getTreePopulator().populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); - - counter.add(); - } - } - long regionID = DirectUtils.regionID(x, z); - try { - File file = new File("region", MCAUtil.createNameFromRegionLocation(x, z)); - file.getParentFile().mkdirs(); - MCAUtil.write(world.getFiles().get(regionID), file); - } catch(Exception e) { - e.printStackTrace(); - } - world.getFiles().remove(regionID); - System.out.println("Saved region [" + x + "," + z + "]. " + world.getFiles().size() + " regions remain loaded."); - } -} diff --git a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java index 43fcd3352..0ce54bbf3 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java +++ b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java @@ -1,11 +1,11 @@ package com.dfsek.terra.region; import com.dfsek.terra.StandalonePlugin; -import com.dfsek.terra.api.util.GlueList; -import com.dfsek.terra.async.Counter; -import com.dfsek.terra.async.GenerationWorker; +import com.dfsek.terra.api.math.MathUtil; +import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.generation.MasterChunkGenerator; import com.dfsek.terra.generation.math.SamplerCache; +import com.dfsek.terra.platform.DirectChunkData; import com.dfsek.terra.platform.DirectWorld; import com.dfsek.terra.platform.GenWrapper; import com.dfsek.terra.population.CavePopulator; @@ -18,10 +18,7 @@ import net.querz.mca.MCAUtil; import java.io.File; import java.io.IOException; -import java.util.List; import java.util.Map; -import java.util.concurrent.ForkJoinTask; -import java.util.concurrent.atomic.AtomicLong; public class Generator { private final long seed; @@ -52,34 +49,33 @@ public class Generator { GenWrapper wrapper = new GenWrapper(generator); DirectWorld world = new DirectWorld(seed, wrapper); - AtomicLong l = new AtomicLong(System.nanoTime()); + long l = System.nanoTime(); + int count = 0; - Counter counter = new Counter((id) -> { - if(id % 200 == 0) { - long c = System.nanoTime(); + for(int cx = -rad; cx <= rad; cx++) { + for(int cz = -rad; cz <= rad; cz++) { + DirectChunkData chunkData = (DirectChunkData) world.getChunkAt(cx, cz); + generator.generateChunkData(world, null, cx, cz, chunkData); - long diff = c - l.get(); + cavePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); + structurePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); + orePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); + floraPopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); + treePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); + count++; - double ms = (double) diff / 1000000; + if(count % 200 == 0) { + long n = System.nanoTime(); - System.out.println("[" + Thread.currentThread().getName() + "] Generated " + id + " chunks. " + (200d / ms) * 1000 + " cps. " + world.getFiles().size() + " Regions loaded."); - l.set(System.nanoTime()); - } - }); + System.out.println("Generated " + count + " chunks. " + 200 / ((double) (n - l) / 1000000) * 1000 + "cps."); + l = System.nanoTime(); - List workers = new GlueList<>(); - - - for(int x = -rad / 32; x <= rad / 32; x++) { - for(int z = -rad / 32; z <= rad / 32; z++) { - workers.add(new GenerationWorker(x, z, world, this, counter)); + } } } - ForkJoinTask.invokeAll(workers); - System.out.println("Saving..."); @@ -93,34 +89,6 @@ public class Generator { MCAUtil.write(entry.getValue(), file); } - System.out.println("Done in " + (System.nanoTime() - l.get()) / 1000000000 + "s"); - } - - public StructurePopulator getStructurePopulator() { - return structurePopulator; - } - - public OrePopulator getOrePopulator() { - return orePopulator; - } - - public CavePopulator getCavePopulator() { - return cavePopulator; - } - - public TreePopulator getTreePopulator() { - return treePopulator; - } - - public FloraPopulator getFloraPopulator() { - return floraPopulator; - } - - public long getSeed() { - return seed; - } - - public MasterChunkGenerator getGenerator() { - return generator; + System.out.println("Done in " + (System.nanoTime() - l) / 1000000000 + "s"); } } From aec1d671fa37f4d267df5623b890c2d6ba64116a Mon Sep 17 00:00:00 2001 From: dfsek Date: Mon, 4 Jan 2021 21:59:29 -0700 Subject: [PATCH 185/210] fix StructureScript#test --- .../structures/script/StructureScript.java | 9 +++- .../builders/UnaryStringFunctionBuilder.java | 51 +++++++++++++++++++ .../bukkit/src/main/resources/config.yml | 2 +- 3 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/UnaryStringFunctionBuilder.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 055e2a087..2498a125e 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -20,9 +20,11 @@ import com.dfsek.terra.api.structures.script.builders.RandomFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RecursionsFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.UnaryNumberFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.UnaryStringFunctionBuilder; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer; +import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.math.SamplerCache; import com.dfsek.terra.registry.LootRegistry; import com.dfsek.terra.registry.ScriptRegistry; @@ -38,6 +40,7 @@ import java.util.Random; public class StructureScript { private final Block block; private final String id; + String tempID; private final LinkedHashMap cache; public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, LootRegistry lootRegistry, SamplerCache cache) throws ParseException { @@ -47,6 +50,7 @@ public class StructureScript { } catch(IOException e) { throw new RuntimeException(e); } + parser.registerFunction("block", new BlockFunctionBuilder(main)) .registerFunction("check", new CheckFunctionBuilder(main, cache)) .registerFunction("structure", new StructureFunctionBuilder(registry, main)) @@ -59,6 +63,7 @@ public class StructureScript { .registerFunction("entity", new EntityFunctionBuilder(main)) .registerFunction("getBiome", new BiomeFunctionBuilder(main)) .registerFunction("getBlock", new CheckBlockFunctionBuilder()) + .registerFunction("print", new UnaryStringFunctionBuilder(string -> Debug.info("[" + tempID + "] " + string))) .registerFunction("abs", new UnaryNumberFunctionBuilder(number -> FastMath.abs(number.doubleValue()))) .registerFunction("pow", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.pow(number.doubleValue(), number2.doubleValue()))) .registerFunction("sqrt", new UnaryNumberFunctionBuilder(number -> FastMath.sqrt(number.doubleValue()))) @@ -71,6 +76,7 @@ public class StructureScript { block = parser.parse(); this.id = parser.getID(); + tempID = id; this.cache = new LinkedHashMap() { @Override protected boolean removeEldestEntry(Map.Entry eldest) { @@ -106,7 +112,8 @@ public class StructureScript { public boolean test(Location location, Random random, Rotation rotation) { StructureBuffer buffer = new StructureBuffer(location); - return !block.apply(new TerraImplementationArguments(buffer, rotation, random, 0)).getLevel().equals(Block.ReturnLevel.FAIL); + block.apply(new TerraImplementationArguments(buffer, rotation, random, 0)); + return buffer.succeeded(); } public boolean executeInBuffer(Buffer buffer, Random random, Rotation rotation, int recursions) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/UnaryStringFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/UnaryStringFunctionBuilder.java new file mode 100644 index 000000000..f3436899a --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/UnaryStringFunctionBuilder.java @@ -0,0 +1,51 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class UnaryStringFunctionBuilder implements FunctionBuilder> { + + private final java.util.function.Consumer function; + + public UnaryStringFunctionBuilder(java.util.function.Consumer function) { + this.function = function; + } + + @Override + public Function build(List> argumentList, Position position) { + return new Function() { + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } + + @SuppressWarnings("unchecked") + @Override + public Void apply(ImplementationArguments implementationArguments) { + function.accept(((Returnable) argumentList.get(0)).apply(implementationArguments)); + return null; + } + + @Override + public Position getPosition() { + return position; + } + }; + } + + @Override + public int argNumber() { + return 1; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + if(position == 0) return Returnable.ReturnType.NUMBER; + return null; + } +} diff --git a/platforms/bukkit/src/main/resources/config.yml b/platforms/bukkit/src/main/resources/config.yml index fc5ac9ad3..9ad3c8b47 100644 --- a/platforms/bukkit/src/main/resources/config.yml +++ b/platforms/bukkit/src/main/resources/config.yml @@ -5,7 +5,7 @@ dump-default: true biome-search-resolution: 4 cache: carver: 512 - structure: 128 + structure: 32 sampler: 512 master-disable: caves: false \ No newline at end of file From a38eba2916eccc67f3c55d6a8ce5136606cde994 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 5 Jan 2021 01:04:15 -0700 Subject: [PATCH 186/210] implement StateFunction --- .../api/platform/block/state/BlockState.java | 4 + .../api/platform/block/state/MobSpawner.java | 38 ++++++++ .../api/platform/block/state/SerialState.java | 94 +++++++++++++++++++ .../terra/api/platform/block/state/Sign.java | 11 +++ .../structures/script/StructureScript.java | 2 + .../script/builders/StateFunctionBuilder.java | 44 +++++++++ .../script/functions/StateFunction.java | 49 ++++++++++ .../items/BufferedStateManipulator.java | 26 +++++ .../items/state/BufferedStateManipulator.java | 27 ------ .../generation/items/tree/TerraTree.java | 4 +- .../terra/bukkit/listeners/EventListener.java | 3 +- .../world/block/state/BukkitBlockState.java | 2 + .../world/block/state/BukkitContainer.java | 2 + .../bukkit/world/block/state/BukkitSign.java | 32 +++++++ 14 files changed, 306 insertions(+), 32 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/block/state/MobSpawner.java create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/block/state/SerialState.java create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/block/state/Sign.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/StateFunctionBuilder.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/functions/StateFunction.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedStateManipulator.java delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/state/BufferedStateManipulator.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java diff --git a/common/src/main/java/com/dfsek/terra/api/platform/block/state/BlockState.java b/common/src/main/java/com/dfsek/terra/api/platform/block/state/BlockState.java index 74fdd2be9..47f5f51b7 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/block/state/BlockState.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/state/BlockState.java @@ -16,4 +16,8 @@ public interface BlockState extends Handle { BlockData getBlockData(); boolean update(boolean applyPhysics); + + default void applyState(String state) { + // Do nothing by default. + } } diff --git a/common/src/main/java/com/dfsek/terra/api/platform/block/state/MobSpawner.java b/common/src/main/java/com/dfsek/terra/api/platform/block/state/MobSpawner.java new file mode 100644 index 000000000..6f2772135 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/state/MobSpawner.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.api.platform.block.state; + +import com.dfsek.terra.api.platform.world.entity.EntityType; +import org.jetbrains.annotations.NotNull; + +public interface MobSpawner extends BlockState { + EntityType getSpawnedType(); + + void setSpawnedType(@NotNull EntityType creatureType); + + int getDelay(); + + void setDelay(int delay); + + int getMinSpawnDelay(); + + void setMinSpawnDelay(int delay); + + int getMaxSpawnDelay(); + + void setMaxSpawnDelay(int delay); + + int getSpawnCount(); + + void setSpawnCount(int spawnCount); + + int getMaxNearbyEntities(); + + void setMaxNearbyEntities(int maxNearbyEntities); + + int getRequiredPlayerRange(); + + void setRequiredPlayerRange(int requiredPlayerRange); + + int getSpawnRange(); + + void setSpawnRange(int spawnRange); +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/block/state/SerialState.java b/common/src/main/java/com/dfsek/terra/api/platform/block/state/SerialState.java new file mode 100644 index 000000000..7c05c1253 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/state/SerialState.java @@ -0,0 +1,94 @@ +package com.dfsek.terra.api.platform.block.state; + +import java.util.HashMap; +import java.util.Map; + +public class SerialState { + protected final Map> properties = new HashMap<>(); + + public SerialState() { + } + + public static Map parse(String props) { + String[] sep = props.split(","); + Map map = new HashMap<>(); + for(String item : sep) { + map.put(item.substring(0, item.indexOf('=')), item.substring(item.indexOf('=') + 1)); + } + return map; + } + + private void checkExists(String prop) { + if(!properties.containsKey(prop)) throw new IllegalArgumentException("No such property \"" + prop + "\""); + } + + private void checkType(Class clazz, Object o, String id) { + if(!clazz.isInstance(o)) + throw new IllegalArgumentException("Invalid data for property " + id + ": " + o); + } + + public void setProperty(String id, Object value) { + checkExists(id); + Property prop = properties.get(id); + checkType(prop.getValueClass(), value, id); + prop.setValue(value); + } + + public int getInteger(String id) { + checkExists(id); + Property prop = properties.get(id); + checkType(Integer.class, prop.getValue(), id); + return (Integer) prop.getValue(); + } + + public String getString(String id) { + checkExists(id); + Property prop = properties.get(id); + checkType(String.class, prop.getValue(), id); + return (String) prop.getValue(); + } + + public long getLong(String id) { + checkExists(id); + Property prop = properties.get(id); + checkType(Long.class, prop.getValue(), id); + return (Long) prop.getValue(); + } + + public boolean getBoolean(String id) { + checkExists(id); + Property prop = properties.get(id); + checkType(Boolean.class, prop.getValue(), id); + return (Boolean) prop.getValue(); + } + + @SuppressWarnings("unchecked") + public T get(String id, Class clazz) { + checkExists(id); + Property prop = properties.get(id); + checkType(clazz, prop.getValue(), id); + return (T) prop.getValue(); + } + + protected static class Property { + private final Class clazz; + private Object value; + + public Property(Class clazz) { + this.clazz = clazz; + } + + public Class getValueClass() { + return clazz; + } + + @SuppressWarnings("unchecked") + public T getValue() { + return (T) value; + } + + public void setValue(Object value) { + this.value = value; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/block/state/Sign.java b/common/src/main/java/com/dfsek/terra/api/platform/block/state/Sign.java new file mode 100644 index 000000000..0cc901816 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/block/state/Sign.java @@ -0,0 +1,11 @@ +package com.dfsek.terra.api.platform.block.state; + +import org.jetbrains.annotations.NotNull; + +public interface Sign extends BlockState { + @NotNull String[] getLines(); + + @NotNull String getLine(int index) throws IndexOutOfBoundsException; + + void setLine(int index, @NotNull String line) throws IndexOutOfBoundsException; +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 2498a125e..c5bdc61ab 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -18,6 +18,7 @@ import com.dfsek.terra.api.structures.script.builders.MarkFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.PullFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RandomFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RecursionsFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.StateFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.UnaryNumberFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.UnaryStringFunctionBuilder; @@ -63,6 +64,7 @@ public class StructureScript { .registerFunction("entity", new EntityFunctionBuilder(main)) .registerFunction("getBiome", new BiomeFunctionBuilder(main)) .registerFunction("getBlock", new CheckBlockFunctionBuilder()) + .registerFunction("state", new StateFunctionBuilder(main)) .registerFunction("print", new UnaryStringFunctionBuilder(string -> Debug.info("[" + tempID + "] " + string))) .registerFunction("abs", new UnaryNumberFunctionBuilder(number -> FastMath.abs(number.doubleValue()))) .registerFunction("pow", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.pow(number.doubleValue(), number2.doubleValue()))) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StateFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StateFunctionBuilder.java new file mode 100644 index 000000000..0ebf71c9b --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/StateFunctionBuilder.java @@ -0,0 +1,44 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.functions.StateFunction; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class StateFunctionBuilder implements FunctionBuilder { + private final TerraPlugin main; + + public StateFunctionBuilder(TerraPlugin main) { + this.main = main; + } + + @SuppressWarnings("unchecked") + @Override + public StateFunction build(List> argumentList, Position position) throws ParseException { + if(argumentList.size() < 4) throw new ParseException("Expected data", position); + return new StateFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), main, position); + } + + @Override + public int argNumber() { + return 4; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + switch(position) { + case 0: + case 1: + case 2: + return Returnable.ReturnType.NUMBER; + case 3: + return Returnable.ReturnType.STRING; + default: + return null; + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StateFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StateFunction.java new file mode 100644 index 000000000..54f40462e --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StateFunction.java @@ -0,0 +1,49 @@ +package com.dfsek.terra.api.structures.script.functions; + +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; +import com.dfsek.terra.api.structures.structure.RotationUtil; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedStateManipulator; +import com.dfsek.terra.api.structures.tokenizer.Position; +import net.jafama.FastMath; + +public class StateFunction implements Function { + private final Returnable data; + private final Returnable x, y, z; + private final Position position; + private final TerraPlugin main; + + public StateFunction(Returnable x, Returnable y, Returnable z, Returnable data, TerraPlugin main, Position position) { + this.position = position; + this.main = main; + this.data = data; + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public Void apply(ImplementationArguments implementationArguments) { + TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; + Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); + RotationUtil.rotateVector(xz, arguments.getRotation()); + + arguments.getBuffer().addItem(new BufferedStateManipulator(main, data.apply(implementationArguments)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); + return null; + } + + @Override + public Position getPosition() { + return position; + } + + @Override + public ReturnType returnType() { + return ReturnType.VOID; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedStateManipulator.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedStateManipulator.java new file mode 100644 index 000000000..c091c151c --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedStateManipulator.java @@ -0,0 +1,26 @@ +package com.dfsek.terra.api.structures.structure.buffer.items; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.block.state.BlockState; + +public class BufferedStateManipulator implements BufferedItem { + private final TerraPlugin main; + private final String data; + + public BufferedStateManipulator(TerraPlugin main, String state) { + this.main = main; + this.data = state; + } + + @Override + public void paste(Location origin) { + BlockState state = origin.getBlock().getState(); + try { + state.applyState(data); + state.update(false); + } catch(ClassCastException e) { + main.getLogger().warning("Could not apply BlockState at " + origin + ": " + e.getMessage()); + } + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/state/BufferedStateManipulator.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/state/BufferedStateManipulator.java deleted file mode 100644 index ec8f72c41..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/state/BufferedStateManipulator.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.dfsek.terra.api.structures.structure.buffer.items.state; - -import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.platform.TerraPlugin; -import com.dfsek.terra.api.platform.block.state.BlockState; -import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; - -@SuppressWarnings("unchecked") -public abstract class BufferedStateManipulator implements BufferedItem { - private final TerraPlugin main; - - protected BufferedStateManipulator(TerraPlugin main) { - this.main = main; - } - - @Override - public void paste(Location origin) { - BlockState state = origin.getBlock().getState(); - try { - apply((T) state); - } catch(ClassCastException e) { - main.getLogger().warning("Could not find expected BlockState at " + origin + "; found " + origin.getBlock().getBlockData().getAsString()); - } - } - - public abstract void apply(T state); -} diff --git a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java index 9fc9e09b0..c01875d76 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java @@ -22,13 +22,11 @@ public class TerraTree implements Tree { @Override public synchronized boolean plant(Location location, Random random) { - structure.get(random).execute(location.clone().add(0, yOffset, 0), random, Rotation.fromDegrees(90 * random.nextInt(4))); - return true; + return structure.get(random).execute(location.clone().add(0, yOffset, 0), random, Rotation.fromDegrees(90 * random.nextInt(4))); } @Override public MaterialSet getSpawnable() { return spawnable; } - } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java index 91ad5b7cb..0c05fdc93 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/EventListener.java @@ -55,8 +55,7 @@ public class EventListener implements Listener { TreeRegistry registry = c.getTreeRegistry(); Tree tree = registry.get(TREE_TYPE_STRING_TRANSFORMER.translate(e.getSpecies())); Debug.info("Overrode tree type: " + e.getSpecies()); - org.bukkit.Location location = e.getLocation().subtract(0, 1, 0); + org.bukkit.Location location = e.getLocation(); if(!tree.plant(new Location(bukkit, location.getX(), location.getY(), location.getZ()), new FastRandom())) block.setBlockData(data); - } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java index c20b6182b..bff9d1a67 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.bukkit.world.block.BukkitBlock; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; import org.bukkit.block.Container; +import org.bukkit.block.Sign; public class BukkitBlockState implements BlockState { private final org.bukkit.block.BlockState delegate; @@ -16,6 +17,7 @@ public class BukkitBlockState implements BlockState { public static BukkitBlockState newInstance(org.bukkit.block.BlockState block) { if(block instanceof Container) return new BukkitContainer((Container) block); + if(block instanceof Sign) return new BukkitSign((Sign) block); return new BukkitBlockState(block); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitContainer.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitContainer.java index d68254b36..c95040f8c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitContainer.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitContainer.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.platform.inventory.Inventory; import com.dfsek.terra.bukkit.world.inventory.BukkitInventory; public class BukkitContainer extends BukkitBlockState implements Container { + protected BukkitContainer(org.bukkit.block.Container block) { super(block); } @@ -13,4 +14,5 @@ public class BukkitContainer extends BukkitBlockState implements Container { public Inventory getInventory() { return new BukkitInventory(((org.bukkit.block.Container) getHandle()).getInventory()); } + } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java new file mode 100644 index 000000000..f14eacf1f --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.bukkit.world.block.state; + +import com.dfsek.terra.api.platform.block.state.SerialState; +import com.dfsek.terra.api.platform.block.state.Sign; +import org.jetbrains.annotations.NotNull; + +public class BukkitSign extends BukkitBlockState implements Sign { + protected BukkitSign(org.bukkit.block.Sign block) { + super(block); + } + + @Override + public @NotNull String[] getLines() { + return ((org.bukkit.block.Sign) getHandle()).getLines(); + } + + @Override + public @NotNull String getLine(int index) throws IndexOutOfBoundsException { + return ((org.bukkit.block.Sign) getHandle()).getLine(index); + } + + @Override + public void setLine(int index, @NotNull String line) throws IndexOutOfBoundsException { + ((org.bukkit.block.Sign) getHandle()).setLine(index, line); + } + + + @Override + public void applyState(String state) { + SerialState.parse(state).forEach((k, v) -> setLine(Integer.parseInt(k), v)); + } +} From aa406d9b8bf8aceb38f1668d7714c71fe3d86fb5 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 5 Jan 2021 01:07:58 -0700 Subject: [PATCH 187/210] properly handle BufferedStateManipulator application exception --- .../structure/buffer/items/BufferedStateManipulator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedStateManipulator.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedStateManipulator.java index c091c151c..f17de342d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedStateManipulator.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedStateManipulator.java @@ -19,7 +19,7 @@ public class BufferedStateManipulator implements BufferedItem { try { state.applyState(data); state.update(false); - } catch(ClassCastException e) { + } catch(Exception e) { main.getLogger().warning("Could not apply BlockState at " + origin + ": " + e.getMessage()); } } From d0a24f7041298bcb072889088747917dbe83a4ff Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 5 Jan 2021 01:23:54 -0700 Subject: [PATCH 188/210] add spawner state info --- .../world/block/state/BukkitBlockState.java | 2 + .../world/block/state/BukkitMobSpawner.java | 128 ++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java index bff9d1a67..c96c520de 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitBlockState.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.platform.block.state.BlockState; import com.dfsek.terra.bukkit.world.block.BukkitBlock; import com.dfsek.terra.bukkit.world.block.data.BukkitBlockData; import org.bukkit.block.Container; +import org.bukkit.block.CreatureSpawner; import org.bukkit.block.Sign; public class BukkitBlockState implements BlockState { @@ -18,6 +19,7 @@ public class BukkitBlockState implements BlockState { public static BukkitBlockState newInstance(org.bukkit.block.BlockState block) { if(block instanceof Container) return new BukkitContainer((Container) block); if(block instanceof Sign) return new BukkitSign((Sign) block); + if(block instanceof CreatureSpawner) return new BukkitMobSpawner((CreatureSpawner) block); return new BukkitBlockState(block); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java new file mode 100644 index 000000000..b3a4e64aa --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java @@ -0,0 +1,128 @@ +package com.dfsek.terra.bukkit.world.block.state; + +import com.dfsek.terra.api.platform.block.state.MobSpawner; +import com.dfsek.terra.api.platform.block.state.SerialState; +import com.dfsek.terra.api.platform.world.entity.EntityType; +import com.dfsek.terra.bukkit.world.entity.BukkitEntityType; +import org.bukkit.block.CreatureSpawner; +import org.jetbrains.annotations.NotNull; + +public class BukkitMobSpawner extends BukkitBlockState implements MobSpawner { + protected BukkitMobSpawner(CreatureSpawner block) { + super(block); + } + + @Override + public EntityType getSpawnedType() { + return new BukkitEntityType(((CreatureSpawner) getHandle()).getSpawnedType()); + } + + @Override + public void setSpawnedType(@NotNull EntityType creatureType) { + ((CreatureSpawner) getHandle()).setSpawnedType(((BukkitEntityType) creatureType).getHandle()); + } + + @Override + public int getDelay() { + return ((CreatureSpawner) getHandle()).getDelay(); + } + + @Override + public void setDelay(int delay) { + ((CreatureSpawner) getHandle()).setDelay(delay); + } + + @Override + public int getMinSpawnDelay() { + return ((CreatureSpawner) getHandle()).getMinSpawnDelay(); + } + + @Override + public void setMinSpawnDelay(int delay) { + ((CreatureSpawner) getHandle()).setMinSpawnDelay(delay); + } + + @Override + public int getMaxSpawnDelay() { + return ((CreatureSpawner) getHandle()).getMaxSpawnDelay(); + } + + @Override + public void setMaxSpawnDelay(int delay) { + ((CreatureSpawner) getHandle()).setMaxSpawnDelay(delay); + } + + @Override + public int getSpawnCount() { + return ((CreatureSpawner) getHandle()).getSpawnCount(); + } + + @Override + public void setSpawnCount(int spawnCount) { + ((CreatureSpawner) getHandle()).setSpawnCount(spawnCount); + } + + @Override + public int getMaxNearbyEntities() { + return ((CreatureSpawner) getHandle()).getMaxNearbyEntities(); + } + + @Override + public void setMaxNearbyEntities(int maxNearbyEntities) { + ((CreatureSpawner) getHandle()).setMaxNearbyEntities(maxNearbyEntities); + } + + @Override + public int getRequiredPlayerRange() { + return ((CreatureSpawner) getHandle()).getRequiredPlayerRange(); + } + + @Override + public void setRequiredPlayerRange(int requiredPlayerRange) { + ((CreatureSpawner) getHandle()).setRequiredPlayerRange(requiredPlayerRange); + } + + @Override + public int getSpawnRange() { + return ((CreatureSpawner) getHandle()).getSpawnRange(); + } + + @Override + public void setSpawnRange(int spawnRange) { + ((CreatureSpawner) getHandle()).setSpawnRange(spawnRange); + } + + @Override + public void applyState(String state) { + SerialState.parse(state).forEach((k, v) -> { + switch(k) { + case "type": + setSpawnedType(new BukkitEntityType(org.bukkit.entity.EntityType.valueOf(v))); + return; + case "delay": + setDelay(Integer.parseInt(v)); + return; + case "min_delay": + setMinSpawnDelay(Integer.parseInt(v)); + return; + case "max_delay": + setMaxSpawnDelay(Integer.parseInt(v)); + return; + case "count": + setSpawnCount(Integer.parseInt(v)); + return; + case "range": + setSpawnRange(Integer.parseInt(v)); + return; + case "max_nearby": + setMaxNearbyEntities(Integer.parseInt(v)); + return; + case "activate": + setRequiredPlayerRange(Integer.parseInt(v)); + return; + default: + throw new IllegalArgumentException("Invalid property: " + k); + } + }); + } +} From 32b3b4cd3f2a4ff291b56c881c50e54a36459104 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 5 Jan 2021 02:00:01 -0700 Subject: [PATCH 189/210] fix StructureScript return issues --- .../structures/script/StructureScript.java | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index c5bdc61ab..8de232bb2 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -102,22 +102,25 @@ public class StructureScript { } public boolean execute(Location location, Chunk chunk, Random random, Rotation rotation) { - StructureBuffer buffer = cache.computeIfAbsent(location, loc -> { - StructureBuffer buf = new StructureBuffer(loc); - Block.ReturnInfo level = block.apply(new TerraImplementationArguments(buf, rotation, random, 0)); - buf.setSucceeded(!level.getLevel().equals(Block.ReturnLevel.FAIL)); - return buf; - }); + StructureBuffer buffer = computeBuffer(location, random, rotation); buffer.paste(chunk); return buffer.succeeded(); } public boolean test(Location location, Random random, Rotation rotation) { - StructureBuffer buffer = new StructureBuffer(location); - block.apply(new TerraImplementationArguments(buffer, rotation, random, 0)); + StructureBuffer buffer = computeBuffer(location, random, rotation); return buffer.succeeded(); } + private StructureBuffer computeBuffer(Location location, Random random, Rotation rotation) { + return cache.computeIfAbsent(location, loc -> { + StructureBuffer buf = new StructureBuffer(loc); + Block.ReturnInfo level = block.apply(new TerraImplementationArguments(buf, rotation, random, 0)); + buf.setSucceeded(!level.getLevel().equals(Block.ReturnLevel.FAIL)); + return buf; + }); + } + public boolean executeInBuffer(Buffer buffer, Random random, Rotation rotation, int recursions) { return !block.apply(new TerraImplementationArguments(buffer, rotation, random, recursions)).getLevel().equals(Block.ReturnLevel.FAIL); } From 5a64424b1601d03cd8d256de716037cd2b072e52 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 5 Jan 2021 02:04:05 -0700 Subject: [PATCH 190/210] reimplement ender eye redirection --- .../dfsek/terra/config/base/ConfigPack.java | 1 + .../terra/config/base/ConfigPackTemplate.java | 8 ++++- .../bukkit/listeners/SpigotListener.java | 32 +++++++++++++------ 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 8bb85e12f..1776a04ef 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -80,6 +80,7 @@ import java.util.zip.ZipFile; */ public class ConfigPack implements LoaderRegistrar { private final ConfigPackTemplate template = new ConfigPackTemplate(); + private final BiomeRegistry biomeRegistry = new BiomeRegistry(); private final BiomeGridRegistry biomeGridRegistry = new BiomeGridRegistry(biomeRegistry); private final StructureRegistry structureRegistry = new StructureRegistry(); diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java index 23aecf693..fe0500817 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java @@ -57,12 +57,14 @@ public class ConfigPackTemplate implements ValidatedConfigTemplate { @Default private int baseBlend = 4; + @Value("structures.locatable") + @Default + private Map locatable = new HashMap<>(); @Value("blend.terrain.elevation") @Default private int elevationBlend = 4; - @Value("erode.enable") @Default private boolean erode = false; @@ -263,6 +265,10 @@ public class ConfigPackTemplate implements ValidatedConfigTemplate { return elevationBlend; } + public Map getLocatable() { + return locatable; + } + @Override public boolean validate() throws ValidationException { if(gridType.equals(TerraBiomeGrid.Type.RADIAL) && internalGrid == null) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java index b35bc71a9..3c774e1b9 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java @@ -1,7 +1,21 @@ package com.dfsek.terra.bukkit.listeners; +import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.async.AsyncStructureFinder; +import com.dfsek.terra.bukkit.world.BukkitAdapter; +import com.dfsek.terra.debug.Debug; +import com.dfsek.terra.generation.items.TerraStructure; +import org.bukkit.entity.EnderSignal; +import org.bukkit.entity.Entity; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Villager; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntitySpawnEvent; +import org.bukkit.event.entity.VillagerAcquireTradeEvent; +import org.bukkit.event.entity.VillagerCareerChangeEvent; /** * Listener to load on Spigot servers, contains Villager crash prevention and hacky ender eye redirection. @@ -15,21 +29,21 @@ public class SpigotListener implements Listener { public SpigotListener(TerraPlugin main) { this.main = main; } - /* @EventHandler(priority = EventPriority.NORMAL) public void onEnderEye(EntitySpawnEvent e) { Entity entity = e.getEntity(); if(e.getEntityType().equals(EntityType.ENDER_SIGNAL)) { Debug.info("Detected Ender Signal..."); - if(!TerraWorld.isTerraWorld(e.getEntity().getWorld())) return; - TerraWorld tw = main.getWorld(e.getEntity().getWorld()); + if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getEntity().getWorld()))) return; + TerraWorld tw = main.getWorld(BukkitAdapter.adapt(e.getEntity().getWorld())); EnderSignal signal = (EnderSignal) entity; - TerraStructure config = tw.getConfig().getStructureLocatable(StructureTypeEnum.STRONGHOLD); + TerraStructure config = tw.getConfig().getStructure(tw.getConfig().getTemplate().getLocatable().get("STRONGHOLD")); 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())); + AsyncStructureFinder finder = new AsyncStructureFinder(tw.getGrid(), config, BukkitAdapter.adapt(e.getLocation()), 0, 500, location -> { + if(location != null) + signal.setTargetLocation(BukkitAdapter.adapt(location.toLocation(BukkitAdapter.adapt(signal.getWorld())))); Debug.info("Location: " + location); }, main); finder.run(); // Do this synchronously so eye doesn't change direction several ticks after spawning. @@ -40,7 +54,7 @@ public class SpigotListener implements Listener { @EventHandler public void onCartographerChange(VillagerAcquireTradeEvent e) { - if(!TerraWorld.isTerraWorld(e.getEntity().getWorld())) return; + if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getEntity().getWorld()))) return; 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. @@ -48,12 +62,10 @@ public class SpigotListener implements Listener { @EventHandler public void onCartographerLevel(VillagerCareerChangeEvent e) { - if(!TerraWorld.isTerraWorld(e.getEntity().getWorld())) return; + if(!TerraWorld.isTerraWorld(BukkitAdapter.adapt(e.getEntity().getWorld()))) return; if(e.getProfession().equals(Villager.Profession.CARTOGRAPHER)) { e.getEntity().setProfession(Villager.Profession.NITWIT); // Give villager new profession to prevent server crash. e.setCancelled(true); } } - - */ } From b67814d68a4cad7f08ed5fd6ef79c1392a8b7c76 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 5 Jan 2021 02:25:06 -0700 Subject: [PATCH 191/210] update to latest tectonic --- common/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 46bcce8d3..7134054f9 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -13,7 +13,7 @@ dependencies { "shadedApi"("commons-io:commons-io:2.4") "shadedApi"("com.scireum:parsii:1.2.1") - "shadedApi"("com.dfsek:Tectonic:1.0.3") + "shadedApi"("com.dfsek:Tectonic:1.1.0") "shadedApi"("net.jafama:jafama:2.3.2") "shadedApi"("org.yaml:snakeyaml:1.27") From 1cdf4478b8aecdb5fced62d01832bee06ea04063 Mon Sep 17 00:00:00 2001 From: DeltaRays <42403698+DeltaRays@users.noreply.github.com> Date: Tue, 5 Jan 2021 18:15:52 +0100 Subject: [PATCH 192/210] Italian translation (#44) * Created italian translation * Revert "Created italian translation" This reverts commit 74fe8ffe13fbb34895eb3b5105a6045bd9acc73b. * Created the italian translation file (and translated everything in it to italian) --- .../bukkit/src/main/resources/lang/it_it.yml | 121 ++++++++++++++++++ 1 file changed, 121 insertions(+) create mode 100644 platforms/bukkit/src/main/resources/lang/it_it.yml diff --git a/platforms/bukkit/src/main/resources/lang/it_it.yml b/platforms/bukkit/src/main/resources/lang/it_it.yml new file mode 100644 index 000000000..09237b315 --- /dev/null +++ b/platforms/bukkit/src/main/resources/lang/it_it.yml @@ -0,0 +1,121 @@ +enable: + - "Se ti piace Terra, per favore considera di sostenere il progetto su Patreon!" + - "Avrai accesso a funzionalità sperimentali prima che vengano rilasciate!" + - "Sostieni il progetto qui: https://www.patreon.com/dfsek" +disable: + - "Grazie per aver usato Terra!" +command: + debug-only: "Questo comando deve essere usato con la modalità debug attivata!" + player-only: "Solo i giocatori possono eseguire questo comando!" + invalid: "Comando invalido. (%1$s argomenti previsti, %2$s trovati)." + players-only: "Solo i giocatori possono eseguire questo comando!" + world: "Questo comando può solo essere eseguito in un mondo creato da Terra!" + reload: "Configurazione Terra ricaricata." + reload-error: "Si sono verificati errori durante il ricaricamento delle configurazioni Terra. Vedere i log per ulteriori informazioni." + version: "Questo server sta usando la versione \"%1$s\" Terra, sulla piattaforma \"%2$s\"" + main-menu: + - "--------------------Terra--------------------" + - "reload - Ricarica i dati di configurazione" + - "biome - Ottieni il bioma attuale" + - "ore - Genera una vena minerale davanti a te (per fare debug)" + - "save-data - Salva i dati sulla popolazione" + - "structure - Carica ed esporta strutture" + - "profile - Opzioni dell'analizzatore" + - "image - Opzioni immagine / menu" + biome: + biome-found: "Trovato un bioma alle coordinate (%1$s, %2$s)" + unable-to-locate: "Ricerca bioma fallita." + invalid-radius: "Raggio invalido: \"%s\"" + invalid: "ID bioma invalido: \"%s\"" + in: "Tu sei nel bioma \"%s\"" + packs: + main: "Pacchetti di configurazione installati:" + pack: " - %1$s v%3$s (autore: %2$s)" + none: "Nessun pacchetto di configurazione è installato." + ore: + main-menu: + - "---------------Terra/ore---------------" + - "Genera una vena di minerale nel blocco che stai guardando." + out-of-range: "Blocco fuori portata" + invalid-ore: "Ricerca minerale \"%s\" fallita!" + geometry: + main-menu: + - "---------------Terra/geometry----------------" + - "Vari comandi di debug della geometria voxel" + - "sphere - Genera una sfera" + - "deformsphere - Genera una sfera deformata" + - "tube - Genera un tubo" + deform: + invalid-radius: "Raggio non valido: \"%s\"" + invalid-deform: "Deformazione non valida: \"%s\"" + invalid-frequency: "Frequenza non valida: \"%s\"" + sphere: + invalid-radius: "Raggio non valido: \"%s\"" + tube: + invalid-radius: "Raggio non valido: \"%s\"" + image: + main-menu: + - "---------------Terra/image---------------" + - "render - Renderizza un'immagine con una data larghezza e altezza, che può essere successivamente importata come mondo." + - "gui - Apri il menu di debug (deve essere abilitato nella configurazione)" + gui: + main-menu: + - "-------------Terra/image/gui-------------" + - "raw - Apri il menu con dati grezzi sui biomi" + - "step - Riesegui il rendering dei dati per mostrare i bordi più chiaramente" + debug: "La modalità di debug deve essere abilitata per utilizzare la GUI di debug! La GUI di debug NON È SICURA PER LA PRODUZIONE!" + render: + save: "Immagine salvata come \"%s\"" + error: "Si è verificato un errore durante la generazione dell'immagine!" + profile: + main-menu: + - "---------------Terra/profile---------------" + - "start - Inizia il profiler" + - "stop - Ferma il profiler" + - "query - Recupera i dati del profiler" + - "reset - Resetta i dati del profiler" + reset: "Il profiler è stato resettato." + start: "Il profiler è stato avviato." + stop: "Il profiler è stato fermato." + structure: + main-menu: + - "---------------Terra/structure---------------" + - "export - Esporta la tua selezione attuale di WorldEdit come struttura Terra." + - "load - Carica una struttura Terra" + invalid-radius: "Raggio invalido: \"%s\"" + invalid-rotation: "Rotazione invalida: \"%s\"" + invalid: "ID struttura invalido: \"%s\"" + export: "Struttura salvata come \"%s\"" +world-config: + load: "Caricamento dei valori di configurazione per il mondo \"%s\"..." + not-found: "Configurazione per il mondo \"%s\" non trovata. La configurazione predefinita sarà utilizzata." + using-image: "Caricamento mondo da immagine." + error: "Impossibile caricare la configurazione per il mondo \"%s\"" + done: "Caricamento del mondo \"%1$s\" completato. Tempo trascorso: %2$sms" +config-pack: + loaded: "Pacchetto di configurazione %1$s v%4$s (autore: %3$s) caricato in %2$sms." +config: + loaded: "Caricato %1$s dal file %2$s" + loaded-all: "Caricato %1$s %2$s(s) in %3$sms." + error: + invalid-failover: "Tipo di failover non valido: \"%s\"" + duplicate: "ID duplicato trovato nel file: %s" + file: + - "Errore di configurazione Terra nel file: %1$s" + - "%2$s" + - "Correggilo prima di procedere!" + generic: + - "Si è verificato un errore durante il caricamento delle configurazioni." + - "Per favore, segnalatelo a Terra." +warning: + no-population: "Non sono stati caricati chunk preesistenti. Se è la prima volta che avvii il tuo server con Terra, o se stai creando un nuovo mondo, è normale." +error: + severe-config: "Un grave errore di configurazione ha impedito a Terra di generare correttamente il terreno alle coordinate: %1$s, %2$s. Controlla la tua configurazione per errori. Eventuali errori di configurazione saranno stati segnalati sopra." +debug: + data-save: "Dati sulla popolazione salvati per il mondo \"%s\"" +use-paper: + - "Sembra che tu stia usando Spigot/CraftBukkit." + - "Nonostante Terra &ofunzioni&r su Spigot, delle funzionalità verranno perse. (Terra non è testato su CraftBukkit; nessun supporto verrà dato per la piattaforma CraftBukkit)." + - "Inoltre, Paper offre enormi miglioramenti delle prestazioni rispetto a Spigot e tutti i plug-in di Spigot dovrebbero funzionare con Paper!" + - "Per avere la migliore esperienza con Terra e tutti i tuoi plugin, usa Paper." + - "Scopri di più sul sito web di Paper: https://papermc.io/" \ No newline at end of file From 24a5a9425e9ac90e97f2d81a1b0b495757a71cbc Mon Sep 17 00:00:00 2001 From: Roan-V <77012724+Roan-V@users.noreply.github.com> Date: Tue, 5 Jan 2021 19:20:13 +0100 Subject: [PATCH 193/210] Added dutch translation (#45) --- .../bukkit/src/main/resources/lang/nl_NL.yml | 122 ++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 platforms/bukkit/src/main/resources/lang/nl_NL.yml diff --git a/platforms/bukkit/src/main/resources/lang/nl_NL.yml b/platforms/bukkit/src/main/resources/lang/nl_NL.yml new file mode 100644 index 000000000..f34f8241e --- /dev/null +++ b/platforms/bukkit/src/main/resources/lang/nl_NL.yml @@ -0,0 +1,122 @@ +enable: + - "Als je Terra leuk vindt, overweeg dan om het project op Patreon te steunen!" + - "Je krijgt toegang tot experimentele functies voordat ze uitgebracht worden!" + - "Steun het project hier: https://www.patreon.com/dfsek" +disable: + - "Bedankt voor het gebruiken van Terra!" +command: + debug-only: "Dit commando moet worden gebruikt met debug-modus ingeschakeld!" + player-only: "Dit commando is alleen voor spelers!" + invalid: "Ongeldig commando. (Verwachte %1$s argumenten, vond er %2$s)." + players-only: "Dit commando is alleen voor spelers." + world: "Dit commando moet worden uitgevoerd in een Terra-wereld!" + reload: "Terra configuratie herladen." + reload-error: "Er zijn fouten opgetreden tijdens het herladen van de Terra-configuratie. Zie de logboeken voor meer informatie." + version: "Deze server draait Terra versie \"%1$s\", op platform \"%2$s\"" + main-menu: + - "--------------------Terra--------------------" + - "reload - Herlaad de configuratie gegevens" + - "biome - Find het huidige bioom (klimaatgebied)" + - "ore - Genereer een ertsader op de locatie waar je heen kijkt (voor debuggen)" + - "save-data - Sla populatie data op" + - "structure - Laad en exporteer constructies" + - "profile - Profiler opties" + - "image - Afbeelding/GUI opties" + biome: + biome-found: "bioom (klimaatgebied) gevonden op (%1$s, %2$s)" + unable-to-locate: "Geen bioom (klimaatgebied) kunnen vinden." + invalid-radius: "Ongeldige straal: \"%s\"" + invalid: "Ongeldig bioom ID: \"%s\"" + in: "Je bent in \"%s\"" + packs: + main: "Momenteel geïnstalleerde configuratiepakketten:" + pack: " - %1$s v%3$s door %2$s" + none: "Er zijn geen configuratiepakketten geïnstalleerd." + ore: + main-menu: + - "---------------Terra/erts---------------" + - "Genereer een ertsader bij het blok waar je naar kijkt." + out-of-range: "Blok buiten bereik" + invalid-ore: "Kan \"%s\" erts niet vinden" + geometry: + main-menu: + - "---------------Terra/geometrie----------------" + - "Diverse voxelgeometrie debug commando's" + - "sphere - Genereer een bol" + - "deformsphere - Genereer een vervormde bol" + - "tube - Genereer een tube" + deform: + invalid-radius: "Ongeldige straal: \"%s\"" + invalid-deform: "Ongeldige vervorming: \"%s\"" + invalid-frequency: "Ongeldige frequentie: \"%s\"" + sphere: + invalid-radius: "Ongeldige straal: \"%s\"" + tube: + invalid-radius: "Ongeldige straal: \"%s\"" + image: + main-menu: + - "---------------Terra/afbeelding---------------" + - "render - Genereer en beeld met een bepaalde breedte en hoogte, deze kan later als een wereld worden geïmporteerd." + - "gui - Open debug GUI (moet worden ingeschakeld in de configuratie)." + gui: + main-menu: + - "-------------Terra/afbeelding/gui-------------" + - "raw - Open GUI met ruwe bioom (klimaatgebied) gegevens" + - "step - Regenereer de gegevens om de grenzen duidelijker te laten zien"" + debug: "De debug-modus moet ingeschakeld zijn om de debug GUI te kunnen gebruiken! Gebruik de debug GUI alleen om te testen, HET IS NIET VEILIG OM TE GEBRUIKEN IN PRODUCTIE!" + render: + save: "Afbeelding opgeslagen als \"%s\"" + error: "Er is een fout opgetreden tijdens het genereren van het beeld!" + profile: + main-menu: + - "---------------Terra/profile---------------" + - "start - Start de profiler" + - "stop - Stop de profiler" + - "query - Haal profiler gegevens op" + - "reset - Resets profiler gegevens" + reset: "Profiler is gereset." + start: "Profiler is gestart." + stop: "Profiler is gestopt." + structure: + main-menu: + - "---------------Terra/constructies---------------" + - "export - Exporteer je huidige WorldEdit selectie als een Terra constructie." + - "load - Laad een Terra constructie" + invalid-radius: "Ongeldige straal: \"%s\"" + invalid-rotation: "Ongeldige rotatie: \"%s\"" + invalid: "Ongeldig constructie ID: \"%s\"" + export: "Constructie opgeslagen naar \"%s\"" +world-config: + load: "Laden van configuratiewaarden voor wereld \"%s\"..." + not-found: "Configuratie voor wereld \"%s\" niet gevonden. Standaard configuratie wordt gebruikt" + using-image: "Laden van wereld uit een afbeelding." + error: "Niet in staat om de configuratie voor wereld %s te laden" + done: "Laden van wereld \"%1$s\" compleet. Tijd verstreken: %2$sms" +config-pack: + loaded: "Configuratiepakket %1$s v%4$s door %3$s geladen in %2$sms." +config: + loaded: "%1$s geladen van bestand %2$s" + loaded-all: "%1$s %2$s(s) in %3$sms geladen." + error: + invalid-failover: "Ongeldig failover type: \"%s\"" + duplicate: "Duplicaat ID gevonden in bestand: %s" + file: + - "Configuratiefout voor Terra-object. Bestand: %1$s" + - "%2$s" + - "Corrigeer dit voordat je verder gaat!" + generic: + - "Er is een fout opgetreden tijdens het laden van de configuraties." + - "Rapporteer dit alsjeblieft aan Terra." +warning: + no-population: "Geen populatie chunks kunnen laden. Als dit de eerste keer is dat de server met Terra gestart wordt is er niks aan de hand." +error: + severe-config: "Een ernstige configuratiefout heeft ervoor gezorgd dat Terra geen terrein op de coördinaten %1$s, %2$s heeft kunnen genereren. Controleer je configuratie op fouten. Eventuele configuratiefouten zullen hierboven zijn gemeld." +debug: + data-save: "Populatie gegevens voor wereld \"%s\" opgeslagen" +use-paper: + - "Het lijkt erop dat je Spigot/CraftBukkit gebruikt." + - "Terra &owerkt&r op Spigot, maar sommige functionaliteit zal verloren gaan. (Terra is niet getest op CraftBukkit; er wordt dus ook geen ondersteuning voor gegeven)." + - "Om het meeste uit Terra te halen, schakel dan over op Paper." + - "Bovendien biedt Paper enorme prestatieverbeteringen ten opzichte van Spigot, en zelfs alle Spigot plugins zouden met Paper moeten werken!" + - "Om de beste ervaring met Terra, en al je andere plugins, te hebben, gebruik dan Paper." + - "Lees meer op de website van Paper: https://papermc.io/" From 4ad2db3ca8a6f1ef893f07b3588e5889961ce97f Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 5 Jan 2021 14:51:49 -0700 Subject: [PATCH 194/210] improve state function IDs --- .../terra/bukkit/world/block/state/BukkitMobSpawner.java | 6 +++--- .../dfsek/terra/bukkit/world/block/state/BukkitSign.java | 5 ++++- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java index b3a4e64aa..5f3141f09 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java @@ -108,16 +108,16 @@ public class BukkitMobSpawner extends BukkitBlockState implements MobSpawner { case "max_delay": setMaxSpawnDelay(Integer.parseInt(v)); return; - case "count": + case "spawn_count": setSpawnCount(Integer.parseInt(v)); return; - case "range": + case "spawn_range": setSpawnRange(Integer.parseInt(v)); return; case "max_nearby": setMaxNearbyEntities(Integer.parseInt(v)); return; - case "activate": + case "required_player_range": setRequiredPlayerRange(Integer.parseInt(v)); return; default: diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java index f14eacf1f..4de0278fe 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java @@ -27,6 +27,9 @@ public class BukkitSign extends BukkitBlockState implements Sign { @Override public void applyState(String state) { - SerialState.parse(state).forEach((k, v) -> setLine(Integer.parseInt(k), v)); + SerialState.parse(state).forEach((k, v) -> { + if(!v.startsWith("text")) throw new IllegalArgumentException("Invalid property: " + k); + setLine(Integer.parseInt(k), v.substring(4)); + }); } } From 47cad8a30b7cec3676f61be59a97cb9d63ee3202 Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 5 Jan 2021 19:21:42 -0700 Subject: [PATCH 195/210] refactor, cleanup, and perf improvements --- .../java/com/dfsek/terra/CommandHandler.java | 4 - .../java/com/dfsek/terra/TerraProfiler.java | 3 +- .../com/dfsek/terra/api/GenericLoaders.java | 16 ++-- .../api/{lang => language}/Language.java | 2 +- .../terra/api/{lang => language}/Message.java | 2 +- .../{lang => language}/MultiLineMessage.java | 2 +- .../{lang => language}/SingleLineMessage.java | 2 +- .../{procgen => api/math}/GridSpawn.java | 3 +- .../com/dfsek/terra/api/math/MathUtil.java | 23 +++++- .../terra/api/math/ProbabilityCollection.java | 1 + .../api/math/{ => noise}/FastNoiseLite.java | 14 ++-- .../math/noise}/NoiseFunction.java | 2 +- .../math/noise}/NoiseFunction2.java | 3 +- .../math/noise}/NoiseFunction3.java | 3 +- .../math/parsii}/BlankFunction.java | 2 +- .../math/parsii}/RandomFunction.java | 2 +- .../math}/pixel/Distribution.java | 2 +- .../{procgen => api/math}/pixel/Polygon.java | 2 +- .../math}/pixel/Rectangle.java | 2 +- .../dfsek/terra/api/math/vector/Location.java | 2 +- .../dfsek/terra/api/math/vector/Vector2.java | 7 +- .../dfsek/terra/api/math/vector/Vector3.java | 30 +++----- .../{procgen => api/math}/voxel/Cylinder.java | 2 +- .../math}/voxel/DeformedSphere.java | 4 +- .../{procgen => api/math}/voxel/Sphere.java | 2 +- .../{procgen => api/math}/voxel/Tube.java | 2 +- .../math}/voxel/VoxelGeometry.java | 2 +- .../dfsek/terra/api/platform/TerraPlugin.java | 2 +- .../terra/api/profiler/WorldProfiler.java | 5 +- .../structures/script/StructureScript.java | 21 ++--- .../terra/api/world/biome/BiomeGrid.java | 2 +- .../terra/api/world/palette/Palette.java | 2 +- .../api/world/palette/SimplexPalette.java | 2 +- .../terra/async/AsyncStructureFinder.java | 2 +- .../java/com/dfsek/terra/biome/BiomeZone.java | 2 +- .../postprocessing/CoordinatePerturb.java | 2 +- .../biome/postprocessing/ErosionNoise.java | 2 +- .../terra/carving/UserDefinedCarver.java | 2 +- .../java/com/dfsek/terra/command/Command.java | 5 -- .../dfsek/terra/config/base/ConfigPack.java | 4 +- .../terra/config/factories/FloraFactory.java | 2 +- .../terra/config/factories/OreFactory.java | 6 +- .../config/factories/PaletteFactory.java | 2 +- .../config/factories/StructureFactory.java | 5 +- .../terra/config/factories/TreeFactory.java | 5 +- .../com/dfsek/terra/config/lang/LangUtil.java | 2 +- .../config/loaders/MaterialSetLoader.java | 3 +- .../loaders/config/FloraLayerLoader.java | 4 +- .../loaders/config/GridSpawnLoader.java | 2 +- .../loaders/config/NoiseBuilderLoader.java | 2 +- .../loaders/config/OreConfigLoader.java | 5 +- .../loaders/config/OreHolderLoader.java | 6 +- .../loaders/config/TreeLayerLoader.java | 9 +-- .../terra/config/templates/BiomeTemplate.java | 10 +-- .../terra/config/templates/FloraTemplate.java | 2 +- .../terra/config/templates/OreTemplate.java | 2 +- .../config/templates/StructureTemplate.java | 2 +- .../generation/MasterChunkGenerator.java | 3 - .../terra/generation/config/NoiseBuilder.java | 2 +- .../generation/config/WorldGenerator.java | 6 +- .../dfsek/terra/generation/math/Sampler.java | 1 + .../ElevationInterpolator.java | 3 +- .../java/com/dfsek/terra/math/MathUtil.java | 20 ----- .../terra/population/FloraPopulator.java | 2 +- .../terra/population/StructurePopulator.java | 2 +- .../dfsek/terra/population/TreePopulator.java | 2 +- .../items/PlaceableLayer.java | 4 +- .../items/TerraStructure.java | 4 +- .../items/flora/BlockFlora.java | 2 +- .../items/flora/ConstantFlora.java | 2 +- .../items/flora/FloraLayer.java | 6 +- .../items/flora/TerraFlora.java | 2 +- .../items/ores/DeformedSphereOre.java | 4 +- .../items/ores/Ore.java | 2 +- .../items/ores/OreConfig.java | 2 +- .../items/ores/OreHolder.java | 2 +- .../items/ores/VanillaOre.java | 2 +- .../items/tree/TerraTree.java | 2 +- .../items/tree/TreeLayer.java | 6 +- .../dfsek/terra/registry/FloraRegistry.java | 2 +- .../com/dfsek/terra/registry/OreRegistry.java | 2 +- .../terra/registry/StructureRegistry.java | 2 +- .../com/dfsek/terra/util/MaterialSet.java | 4 - .../com/dfsek/terra/util/PaletteUtil.java | 2 +- .../com/dfsek/terra/util/StringUtils.java | 14 ---- .../java/com/dfsek/terra/util/TagUtil.java | 77 ------------------- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 5 +- .../command/biome/BiomeInfoCommand.java | 2 +- .../geometry/DeformedSphereCommand.java | 4 +- .../command/geometry/SphereCommand.java | 2 +- .../command/command/geometry/TubeCommand.java | 2 +- .../command/structure/LocateCommand.java | 4 +- .../bukkit/listeners/SpigotListener.java | 2 +- .../dfsek/terra/bukkit/world/BukkitWorld.java | 5 ++ .../world/block/state/BukkitMobSpawner.java | 2 +- .../bukkit/src/main/resources/config.yml | 2 +- .../dfsek/terra/fabric/TerraFabricPlugin.java | 4 +- .../com/dfsek/terra/StandalonePlugin.java | 2 +- 98 files changed, 178 insertions(+), 305 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/CommandHandler.java rename common/src/main/java/com/dfsek/terra/api/{lang => language}/Language.java (97%) rename common/src/main/java/com/dfsek/terra/api/{lang => language}/Message.java (88%) rename common/src/main/java/com/dfsek/terra/api/{lang => language}/MultiLineMessage.java (95%) rename common/src/main/java/com/dfsek/terra/api/{lang => language}/SingleLineMessage.java (95%) rename common/src/main/java/com/dfsek/terra/{procgen => api/math}/GridSpawn.java (96%) rename common/src/main/java/com/dfsek/terra/api/math/{ => noise}/FastNoiseLite.java (99%) rename common/src/main/java/com/dfsek/terra/{math => api/math/noise}/NoiseFunction.java (67%) rename common/src/main/java/com/dfsek/terra/{math => api/math/noise}/NoiseFunction2.java (95%) rename common/src/main/java/com/dfsek/terra/{math => api/math/noise}/NoiseFunction3.java (89%) rename common/src/main/java/com/dfsek/terra/{math => api/math/parsii}/BlankFunction.java (92%) rename common/src/main/java/com/dfsek/terra/{math => api/math/parsii}/RandomFunction.java (94%) rename common/src/main/java/com/dfsek/terra/{procgen => api/math}/pixel/Distribution.java (73%) rename common/src/main/java/com/dfsek/terra/{procgen => api/math}/pixel/Polygon.java (82%) rename common/src/main/java/com/dfsek/terra/{procgen => api/math}/pixel/Rectangle.java (96%) rename common/src/main/java/com/dfsek/terra/{procgen => api/math}/voxel/Cylinder.java (80%) rename common/src/main/java/com/dfsek/terra/{procgen => api/math}/voxel/DeformedSphere.java (86%) rename common/src/main/java/com/dfsek/terra/{procgen => api/math}/voxel/Sphere.java (92%) rename common/src/main/java/com/dfsek/terra/{procgen => api/math}/voxel/Tube.java (91%) rename common/src/main/java/com/dfsek/terra/{procgen => api/math}/voxel/VoxelGeometry.java (93%) delete mode 100644 common/src/main/java/com/dfsek/terra/command/Command.java rename common/src/main/java/com/dfsek/terra/generation/math/{ => interpolation}/ElevationInterpolator.java (97%) delete mode 100644 common/src/main/java/com/dfsek/terra/math/MathUtil.java rename common/src/main/java/com/dfsek/terra/{generation => population}/items/PlaceableLayer.java (91%) rename common/src/main/java/com/dfsek/terra/{generation => population}/items/TerraStructure.java (92%) rename common/src/main/java/com/dfsek/terra/{generation => population}/items/flora/BlockFlora.java (96%) rename common/src/main/java/com/dfsek/terra/{generation => population}/items/flora/ConstantFlora.java (97%) rename common/src/main/java/com/dfsek/terra/{generation => population}/items/flora/FloraLayer.java (85%) rename common/src/main/java/com/dfsek/terra/{generation => population}/items/flora/TerraFlora.java (99%) rename common/src/main/java/com/dfsek/terra/{generation => population}/items/ores/DeformedSphereOre.java (95%) rename common/src/main/java/com/dfsek/terra/{generation => population}/items/ores/Ore.java (95%) rename common/src/main/java/com/dfsek/terra/{generation => population}/items/ores/OreConfig.java (88%) rename common/src/main/java/com/dfsek/terra/{generation => population}/items/ores/OreHolder.java (95%) rename common/src/main/java/com/dfsek/terra/{generation => population}/items/ores/VanillaOre.java (98%) rename common/src/main/java/com/dfsek/terra/{generation => population}/items/tree/TerraTree.java (95%) rename common/src/main/java/com/dfsek/terra/{generation => population}/items/tree/TreeLayer.java (87%) delete mode 100644 common/src/main/java/com/dfsek/terra/util/StringUtils.java delete mode 100644 common/src/main/java/com/dfsek/terra/util/TagUtil.java diff --git a/common/src/main/java/com/dfsek/terra/CommandHandler.java b/common/src/main/java/com/dfsek/terra/CommandHandler.java deleted file mode 100644 index 17013fb30..000000000 --- a/common/src/main/java/com/dfsek/terra/CommandHandler.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.dfsek.terra; - -public interface CommandHandler { -} diff --git a/common/src/main/java/com/dfsek/terra/TerraProfiler.java b/common/src/main/java/com/dfsek/terra/TerraProfiler.java index 3f9e6d6ce..7633fdf0c 100644 --- a/common/src/main/java/com/dfsek/terra/TerraProfiler.java +++ b/common/src/main/java/com/dfsek/terra/TerraProfiler.java @@ -13,7 +13,6 @@ public class TerraProfiler extends WorldProfiler { .addMeasurement(new Measurement(10000000, DataType.PERIOD_MILLISECONDS), "TreeTime") .addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "OreTime") .addMeasurement(new Measurement(5000000, DataType.PERIOD_MILLISECONDS), "CaveTime") - .addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "StructureTime") - .addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "ElevationTime"); + .addMeasurement(new Measurement(1500000, DataType.PERIOD_MILLISECONDS), "StructureTime"); } } diff --git a/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java b/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java index 7d9e9b1c2..a3ec9ab35 100644 --- a/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java +++ b/common/src/main/java/com/dfsek/terra/api/GenericLoaders.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api; import com.dfsek.tectonic.loading.TypeRegistry; +import com.dfsek.terra.api.math.GridSpawn; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.TerraPlugin; @@ -22,14 +23,13 @@ import com.dfsek.terra.config.loaders.palette.CarverPaletteLoader; import com.dfsek.terra.config.loaders.palette.PaletteHolderLoader; import com.dfsek.terra.config.loaders.palette.PaletteLayerLoader; import com.dfsek.terra.generation.config.NoiseBuilder; -import com.dfsek.terra.generation.items.flora.FloraLayer; -import com.dfsek.terra.generation.items.flora.TerraFlora; -import com.dfsek.terra.generation.items.ores.Ore; -import com.dfsek.terra.generation.items.ores.OreConfig; -import com.dfsek.terra.generation.items.ores.OreHolder; -import com.dfsek.terra.generation.items.tree.TreeLayer; import com.dfsek.terra.image.ImageLoader; -import com.dfsek.terra.procgen.GridSpawn; +import com.dfsek.terra.population.items.flora.FloraLayer; +import com.dfsek.terra.population.items.flora.TerraFlora; +import com.dfsek.terra.population.items.ores.Ore; +import com.dfsek.terra.population.items.ores.OreConfig; +import com.dfsek.terra.population.items.ores.OreHolder; +import com.dfsek.terra.population.items.tree.TreeLayer; import com.dfsek.terra.util.MaterialSet; public class GenericLoaders implements LoaderRegistrar { @@ -51,7 +51,7 @@ public class GenericLoaders implements LoaderRegistrar { .registerLoader(Ore.Type.class, (t, o, l) -> Ore.Type.valueOf((String) o)) .registerLoader(OreConfig.class, new OreConfigLoader()) .registerLoader(NoiseBuilder.class, new NoiseBuilderLoader()) - .registerLoader(TreeLayer.class, new TreeLayerLoader(main)) + .registerLoader(TreeLayer.class, new TreeLayerLoader()) .registerLoader(MaterialSet.class, new MaterialSetLoader()) .registerLoader(OreHolder.class, new OreHolderLoader()) .registerLoader(ImageLoader.class, new ImageLoaderLoader()) diff --git a/common/src/main/java/com/dfsek/terra/api/lang/Language.java b/common/src/main/java/com/dfsek/terra/api/language/Language.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/api/lang/Language.java rename to common/src/main/java/com/dfsek/terra/api/language/Language.java index 79e8f04ad..d00066da7 100644 --- a/common/src/main/java/com/dfsek/terra/api/lang/Language.java +++ b/common/src/main/java/com/dfsek/terra/api/language/Language.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.lang; +package com.dfsek.terra.api.language; import com.dfsek.tectonic.config.Configuration; diff --git a/common/src/main/java/com/dfsek/terra/api/lang/Message.java b/common/src/main/java/com/dfsek/terra/api/language/Message.java similarity index 88% rename from common/src/main/java/com/dfsek/terra/api/lang/Message.java rename to common/src/main/java/com/dfsek/terra/api/language/Message.java index 8a7ffeadf..8a064132b 100644 --- a/common/src/main/java/com/dfsek/terra/api/lang/Message.java +++ b/common/src/main/java/com/dfsek/terra/api/language/Message.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.lang; +package com.dfsek.terra.api.language; import com.dfsek.terra.api.platform.CommandSender; diff --git a/common/src/main/java/com/dfsek/terra/api/lang/MultiLineMessage.java b/common/src/main/java/com/dfsek/terra/api/language/MultiLineMessage.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/api/lang/MultiLineMessage.java rename to common/src/main/java/com/dfsek/terra/api/language/MultiLineMessage.java index 01fe17faf..397ff629e 100644 --- a/common/src/main/java/com/dfsek/terra/api/lang/MultiLineMessage.java +++ b/common/src/main/java/com/dfsek/terra/api/language/MultiLineMessage.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.lang; +package com.dfsek.terra.api.language; import com.dfsek.terra.api.platform.CommandSender; diff --git a/common/src/main/java/com/dfsek/terra/api/lang/SingleLineMessage.java b/common/src/main/java/com/dfsek/terra/api/language/SingleLineMessage.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/api/lang/SingleLineMessage.java rename to common/src/main/java/com/dfsek/terra/api/language/SingleLineMessage.java index 5547f4a9d..e3f65411b 100644 --- a/common/src/main/java/com/dfsek/terra/api/lang/SingleLineMessage.java +++ b/common/src/main/java/com/dfsek/terra/api/language/SingleLineMessage.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.lang; +package com.dfsek.terra.api.language; import com.dfsek.terra.api.platform.CommandSender; diff --git a/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java b/common/src/main/java/com/dfsek/terra/api/math/GridSpawn.java similarity index 96% rename from common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java rename to common/src/main/java/com/dfsek/terra/api/math/GridSpawn.java index 14715a840..f25832de1 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/GridSpawn.java +++ b/common/src/main/java/com/dfsek/terra/api/math/GridSpawn.java @@ -1,6 +1,5 @@ -package com.dfsek.terra.procgen; +package com.dfsek.terra.api.math; -import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.api.util.GlueList; diff --git a/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java b/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java index ba762f18b..013fbf8cc 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java @@ -1,6 +1,7 @@ package com.dfsek.terra.api.math; import com.dfsek.terra.api.util.FastRandom; +import com.dfsek.terra.generation.math.Sampler; import net.jafama.FastMath; import java.util.Random; @@ -9,7 +10,14 @@ import java.util.Random; * Utility class for mathematical functions. */ public final class MathUtil { - private static final double EPSILON = 0.1E-5; + /** + * Epsilon for fuzzy floating point comparisons. + */ + public static final double EPSILON = 1.0E-5; + /** + * Derivative constant. + */ + private static final double DERIVATIVE_DIST = 0.55; /** * Gets the standard deviation of an array of doubles. @@ -68,4 +76,17 @@ public final class MathUtil { public static boolean equals(double a, double b) { return a == b || FastMath.abs(a - b) < EPSILON; } + + public static double derivative(Sampler sampler, double x, double y, double z) { + double baseSample = sampler.sample(x, y, z); + + double xVal1 = (sampler.sample(x + DERIVATIVE_DIST, y, z) - baseSample) / DERIVATIVE_DIST; + double xVal2 = (sampler.sample(x - DERIVATIVE_DIST, y, z) - baseSample) / DERIVATIVE_DIST; + double zVal1 = (sampler.sample(x, y, z + DERIVATIVE_DIST) - baseSample) / DERIVATIVE_DIST; + double zVal2 = (sampler.sample(x, y, z - DERIVATIVE_DIST) - baseSample) / DERIVATIVE_DIST; + double yVal1 = (sampler.sample(x, y + DERIVATIVE_DIST, z) - baseSample) / DERIVATIVE_DIST; + double yVal2 = (sampler.sample(x, y - DERIVATIVE_DIST, z) - baseSample) / DERIVATIVE_DIST; + + return Math.sqrt(((xVal2 - xVal1) * (xVal2 - xVal1)) + ((zVal2 - zVal1) * (zVal2 - zVal1)) + ((yVal2 - yVal1) * (yVal2 - yVal1))); + } } diff --git a/common/src/main/java/com/dfsek/terra/api/math/ProbabilityCollection.java b/common/src/main/java/com/dfsek/terra/api/math/ProbabilityCollection.java index 982c88438..2d5dff15d 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/ProbabilityCollection.java +++ b/common/src/main/java/com/dfsek/terra/api/math/ProbabilityCollection.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.math; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.api.world.biome.NormalizationUtil; import java.util.HashSet; diff --git a/common/src/main/java/com/dfsek/terra/api/math/FastNoiseLite.java b/common/src/main/java/com/dfsek/terra/api/math/noise/FastNoiseLite.java similarity index 99% rename from common/src/main/java/com/dfsek/terra/api/math/FastNoiseLite.java rename to common/src/main/java/com/dfsek/terra/api/math/noise/FastNoiseLite.java index ea40325c9..ccb23d63c 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/FastNoiseLite.java +++ b/common/src/main/java/com/dfsek/terra/api/math/noise/FastNoiseLite.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.api.math;// MIT License +package com.dfsek.terra.api.math.noise;// MIT License import net.jafama.FastMath; @@ -58,6 +58,7 @@ perform a file-wide replace on the following strings (including / * FNLdouble * / *FNLdouble* / double */ +@SuppressWarnings("ManualMinMaxCalculation") public class FastNoiseLite { private static final double[] Gradients2D = { 0.130526192220052f, 0.99144486137381f, 0.38268343236509f, 0.923879532511287f, 0.608761429008721f, 0.793353340291235f, @@ -328,14 +329,14 @@ public class FastNoiseLite { private TransformType3D mWarpTransformType3D = TransformType3D.DefaultOpenSimplex2; private double mDomainWarpAmp = 1.0f; - private static final com.dfsek.terra.api.math.FastNoiseLite CELLULAR_LOOKUP_DEFAULT = new com.dfsek.terra.api.math.FastNoiseLite(); - private com.dfsek.terra.api.math.FastNoiseLite cellularNoiseLookup = CELLULAR_LOOKUP_DEFAULT; + private static final FastNoiseLite CELLULAR_LOOKUP_DEFAULT = new FastNoiseLite(); + private FastNoiseLite cellularNoiseLookup = CELLULAR_LOOKUP_DEFAULT; - public com.dfsek.terra.api.math.FastNoiseLite getCellularNoiseLookup() { + public FastNoiseLite getCellularNoiseLookup() { return cellularNoiseLookup; } - public void setCellularNoiseLookup(com.dfsek.terra.api.math.FastNoiseLite cellularNoiseLookup) { + public void setCellularNoiseLookup(FastNoiseLite cellularNoiseLookup) { this.cellularNoiseLookup = cellularNoiseLookup; } @@ -1442,7 +1443,6 @@ public class FastNoiseLite { if (mCellularDistanceFunction == CellularDistanceFunction.Euclidean && mCellularReturnType != CellularReturnType.CellValue) { distance0 = FastSqrt(distance0); - //noinspection ConstantConditions if (mCellularReturnType != CellularReturnType.CellValue) { distance1 = FastSqrt(distance1); } @@ -1593,8 +1593,6 @@ public class FastNoiseLite { if (mCellularDistanceFunction == CellularDistanceFunction.Euclidean && mCellularReturnType != CellularReturnType.CellValue) { distance0 = FastSqrt(distance0); - - //noinspection ConstantConditions if (mCellularReturnType != CellularReturnType.CellValue) { distance1 = FastSqrt(distance1); } diff --git a/common/src/main/java/com/dfsek/terra/math/NoiseFunction.java b/common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction.java similarity index 67% rename from common/src/main/java/com/dfsek/terra/math/NoiseFunction.java rename to common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction.java index ccc604c9e..fee570689 100644 --- a/common/src/main/java/com/dfsek/terra/math/NoiseFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.math; +package com.dfsek.terra.api.math.noise; import parsii.eval.Function; diff --git a/common/src/main/java/com/dfsek/terra/math/NoiseFunction2.java b/common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction2.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/math/NoiseFunction2.java rename to common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction2.java index 31208cb9b..f0f1346ea 100644 --- a/common/src/main/java/com/dfsek/terra/math/NoiseFunction2.java +++ b/common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction2.java @@ -1,6 +1,5 @@ -package com.dfsek.terra.math; +package com.dfsek.terra.api.math.noise; -import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.generation.config.NoiseBuilder; import com.dfsek.terra.util.hash.HashMapDoubleDouble; import parsii.eval.Expression; diff --git a/common/src/main/java/com/dfsek/terra/math/NoiseFunction3.java b/common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction3.java similarity index 89% rename from common/src/main/java/com/dfsek/terra/math/NoiseFunction3.java rename to common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction3.java index ac5bfb3b4..007fc853a 100644 --- a/common/src/main/java/com/dfsek/terra/math/NoiseFunction3.java +++ b/common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction3.java @@ -1,6 +1,5 @@ -package com.dfsek.terra.math; +package com.dfsek.terra.api.math.noise; -import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.generation.config.NoiseBuilder; import parsii.eval.Expression; diff --git a/common/src/main/java/com/dfsek/terra/math/BlankFunction.java b/common/src/main/java/com/dfsek/terra/api/math/parsii/BlankFunction.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/math/BlankFunction.java rename to common/src/main/java/com/dfsek/terra/api/math/parsii/BlankFunction.java index def469f97..a95ebc971 100644 --- a/common/src/main/java/com/dfsek/terra/math/BlankFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/math/parsii/BlankFunction.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.math; +package com.dfsek.terra.api.math.parsii; import parsii.eval.Expression; import parsii.eval.Function; diff --git a/common/src/main/java/com/dfsek/terra/math/RandomFunction.java b/common/src/main/java/com/dfsek/terra/api/math/parsii/RandomFunction.java similarity index 94% rename from common/src/main/java/com/dfsek/terra/math/RandomFunction.java rename to common/src/main/java/com/dfsek/terra/api/math/parsii/RandomFunction.java index 775856c81..1804ef9fb 100644 --- a/common/src/main/java/com/dfsek/terra/math/RandomFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/math/parsii/RandomFunction.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.math; +package com.dfsek.terra.api.math.parsii; import com.dfsek.terra.api.util.FastRandom; import parsii.eval.Expression; diff --git a/common/src/main/java/com/dfsek/terra/procgen/pixel/Distribution.java b/common/src/main/java/com/dfsek/terra/api/math/pixel/Distribution.java similarity index 73% rename from common/src/main/java/com/dfsek/terra/procgen/pixel/Distribution.java rename to common/src/main/java/com/dfsek/terra/api/math/pixel/Distribution.java index d182cca82..a91f07028 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/pixel/Distribution.java +++ b/common/src/main/java/com/dfsek/terra/api/math/pixel/Distribution.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.procgen.pixel; +package com.dfsek.terra.api.math.pixel; public class Distribution { public Distribution(Rectangle bound, int numPoints, double minRad) { diff --git a/common/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java b/common/src/main/java/com/dfsek/terra/api/math/pixel/Polygon.java similarity index 82% rename from common/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java rename to common/src/main/java/com/dfsek/terra/api/math/pixel/Polygon.java index 65a72467d..00f996fd7 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/pixel/Polygon.java +++ b/common/src/main/java/com/dfsek/terra/api/math/pixel/Polygon.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.procgen.pixel; +package com.dfsek.terra.api.math.pixel; import com.dfsek.terra.api.math.vector.Vector2; diff --git a/common/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java b/common/src/main/java/com/dfsek/terra/api/math/pixel/Rectangle.java similarity index 96% rename from common/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java rename to common/src/main/java/com/dfsek/terra/api/math/pixel/Rectangle.java index 8dc79e0ed..0eecb2f40 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/pixel/Rectangle.java +++ b/common/src/main/java/com/dfsek/terra/api/math/pixel/Rectangle.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.procgen.pixel; +package com.dfsek.terra.api.math.pixel; import com.dfsek.terra.api.math.vector.Vector2; import net.jafama.FastMath; diff --git a/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java b/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java index 69443a7d7..4fb2435b5 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java +++ b/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java @@ -163,6 +163,6 @@ public class Location implements Cloneable { @Override public String toString() { - return "(" + getX() + ", " + getY() + ", " + getZ() + ")"; + return "[" + world + ": (" + getX() + ", " + getY() + ", " + getZ() + ")]"; } } diff --git a/common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java index d9d9bddba..7b6e66a39 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java +++ b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.math.vector; +import com.dfsek.terra.api.math.MathUtil; import net.jafama.FastMath; /** @@ -157,11 +158,9 @@ public class Vector2 implements Cloneable { @Override public boolean equals(Object obj) { - if(!(obj instanceof Vector2)) { - return false; - } + if(!(obj instanceof Vector2)) return false; Vector2 other = (Vector2) obj; - return other.x == this.x && other.z == this.z; + return MathUtil.equals(this.x, other.x) && MathUtil.equals(this.z, other.z); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java index e80616ee0..fff3f82ce 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java +++ b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java @@ -1,15 +1,12 @@ package com.dfsek.terra.api.math.vector; +import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.platform.world.World; import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; public class Vector3 implements Cloneable { - /** - * Threshold for fuzzy equals(). - */ - private static final double epsilon = 0.000001; private double x; private double y; @@ -21,15 +18,6 @@ public class Vector3 implements Cloneable { this.z = z; } - /** - * Get the threshold used for equals(). - * - * @return The epsilon. - */ - public static double getEpsilon() { - return epsilon; - } - public double getZ() { return z; } @@ -119,7 +107,7 @@ public class Vector3 implements Cloneable { * @return whether the vector is normalised */ public boolean isNormalized() { - return Math.abs(this.lengthSquared() - 1) < getEpsilon(); + return MathUtil.equals(this.lengthSquared(), 1); } /** @@ -333,12 +321,14 @@ public class Vector3 implements Cloneable { */ @Override public boolean equals(Object obj) { - if(!(obj instanceof Vector3)) { - return false; - } - + if(!(obj instanceof Vector3)) return false; Vector3 other = (Vector3) obj; - - return Math.abs(x - other.x) < epsilon && Math.abs(y - other.y) < epsilon && Math.abs(z - other.z) < epsilon && (this.getClass().equals(obj.getClass())); + return MathUtil.equals(x, other.x) && MathUtil.equals(y, other.y) && MathUtil.equals(x, other.z); } + + @Override + public String toString() { + return "(" + getX() + ", " + getY() + ", " + getZ() + ")"; + } + } diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java b/common/src/main/java/com/dfsek/terra/api/math/voxel/Cylinder.java similarity index 80% rename from common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java rename to common/src/main/java/com/dfsek/terra/api/math/voxel/Cylinder.java index 821613bab..44d5558c3 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/Cylinder.java +++ b/common/src/main/java/com/dfsek/terra/api/math/voxel/Cylinder.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.procgen.voxel; +package com.dfsek.terra.api.math.voxel; import com.dfsek.terra.api.math.vector.Vector3; diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java b/common/src/main/java/com/dfsek/terra/api/math/voxel/DeformedSphere.java similarity index 86% rename from common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java rename to common/src/main/java/com/dfsek/terra/api/math/voxel/DeformedSphere.java index 0e81444fb..b3b9cbf80 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/DeformedSphere.java +++ b/common/src/main/java/com/dfsek/terra/api/math/voxel/DeformedSphere.java @@ -1,6 +1,6 @@ -package com.dfsek.terra.procgen.voxel; +package com.dfsek.terra.api.math.voxel; -import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.api.math.vector.Vector3; public class DeformedSphere extends VoxelGeometry { diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java b/common/src/main/java/com/dfsek/terra/api/math/voxel/Sphere.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java rename to common/src/main/java/com/dfsek/terra/api/math/voxel/Sphere.java index 21dba2149..ced0cb3cd 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/Sphere.java +++ b/common/src/main/java/com/dfsek/terra/api/math/voxel/Sphere.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.procgen.voxel; +package com.dfsek.terra.api.math.voxel; import com.dfsek.terra.api.math.vector.Vector3; diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java b/common/src/main/java/com/dfsek/terra/api/math/voxel/Tube.java similarity index 91% rename from common/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java rename to common/src/main/java/com/dfsek/terra/api/math/voxel/Tube.java index 9b5128a99..7e0af69fc 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/Tube.java +++ b/common/src/main/java/com/dfsek/terra/api/math/voxel/Tube.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.procgen.voxel; +package com.dfsek.terra.api.math.voxel; import com.dfsek.terra.api.math.vector.Vector3; diff --git a/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java b/common/src/main/java/com/dfsek/terra/api/math/voxel/VoxelGeometry.java similarity index 93% rename from common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java rename to common/src/main/java/com/dfsek/terra/api/math/voxel/VoxelGeometry.java index 65453d4c0..dccbe3f1c 100644 --- a/common/src/main/java/com/dfsek/terra/procgen/voxel/VoxelGeometry.java +++ b/common/src/main/java/com/dfsek/terra/api/math/voxel/VoxelGeometry.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.procgen.voxel; +package com.dfsek.terra.api.math.voxel; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.util.GlueList; diff --git a/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java b/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java index 07afd428b..bb5be0618 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/TerraPlugin.java @@ -2,7 +2,7 @@ package com.dfsek.terra.api.platform; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.LoaderRegistrar; -import com.dfsek.terra.api.lang.Language; +import com.dfsek.terra.api.language.Language; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.World; diff --git a/common/src/main/java/com/dfsek/terra/api/profiler/WorldProfiler.java b/common/src/main/java/com/dfsek/terra/api/profiler/WorldProfiler.java index 74933b223..87697095a 100644 --- a/common/src/main/java/com/dfsek/terra/api/profiler/WorldProfiler.java +++ b/common/src/main/java/com/dfsek/terra/api/profiler/WorldProfiler.java @@ -15,10 +15,7 @@ public class WorldProfiler { public WorldProfiler(World w) { if(w.getGenerator().getTerraGenerator() == null) throw new IllegalArgumentException("Attempted to instantiate profiler on non-Gaea managed world!"); - this.addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "TotalChunkGenTime") - .addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "ChunkBaseGenTime") - .addMeasurement(new Measurement(2000000, DataType.PERIOD_MILLISECONDS), "BiomeApplyTime") - .addMeasurement(new Measurement(2000000, DataType.PERIOD_MILLISECONDS), "PopulationManagerTime"); + this.addMeasurement(new Measurement(2500000, DataType.PERIOD_MILLISECONDS), "TotalChunkGenTime"); isProfiling = false; this.world = w; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 8de232bb2..d72f441f9 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -34,6 +34,7 @@ import org.apache.commons.io.IOUtils; import java.io.IOException; import java.io.InputStream; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import java.util.Random; @@ -42,7 +43,7 @@ public class StructureScript { private final Block block; private final String id; String tempID; - private final LinkedHashMap cache; + private final Map cache; public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, LootRegistry lootRegistry, SamplerCache cache) throws ParseException { Parser parser; @@ -79,12 +80,12 @@ public class StructureScript { block = parser.parse(); this.id = parser.getID(); tempID = id; - this.cache = new LinkedHashMap() { + this.cache = Collections.synchronizedMap(new LinkedHashMap() { @Override protected boolean removeEldestEntry(Map.Entry eldest) { return this.size() > main.getTerraConfig().getStructureCache(); } - }; + }); } /** @@ -113,12 +114,14 @@ public class StructureScript { } private StructureBuffer computeBuffer(Location location, Random random, Rotation rotation) { - return cache.computeIfAbsent(location, loc -> { - StructureBuffer buf = new StructureBuffer(loc); - Block.ReturnInfo level = block.apply(new TerraImplementationArguments(buf, rotation, random, 0)); - buf.setSucceeded(!level.getLevel().equals(Block.ReturnLevel.FAIL)); - return buf; - }); + synchronized(cache) { + return cache.computeIfAbsent(location, loc -> { + StructureBuffer buf = new StructureBuffer(loc); + Block.ReturnInfo level = block.apply(new TerraImplementationArguments(buf, rotation, random, 0)); + buf.setSucceeded(!level.getLevel().equals(Block.ReturnLevel.FAIL)); + return buf; + }); + } } public boolean executeInBuffer(Buffer buffer, Random random, Rotation rotation, int recursions) { diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java b/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java index 9857369ea..993d18ad6 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.world.biome; -import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.world.generation.GenerationPhase; diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java index 5d6fda126..2305b9141 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.world.palette; -import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.math.ProbabilityCollection; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.api.util.GlueList; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java index c08b7843a..81b5aca40 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.world.palette; -import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java b/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java index 2c4b04b74..74fc0418a 100644 --- a/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java +++ b/common/src/main/java/com/dfsek/terra/async/AsyncStructureFinder.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import com.dfsek.terra.generation.items.TerraStructure; +import com.dfsek.terra.population.items.TerraStructure; import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; diff --git a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java index de9f0050b..05c7acb97 100644 --- a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java +++ b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome; -import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.api.world.biome.BiomeGrid; import com.dfsek.terra.api.world.biome.NormalizationUtil; import com.dfsek.terra.config.base.ConfigPack; diff --git a/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java b/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java index e7d488ca5..d3e69f103 100644 --- a/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java +++ b/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.postprocessing; -import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.api.math.vector.Vector2; /** diff --git a/common/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java b/common/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java index 09491ed5b..848c2bb48 100644 --- a/common/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java +++ b/common/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.postprocessing; -import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import net.jafama.FastMath; /** diff --git a/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java b/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java index a633e10cc..0f6e6c840 100644 --- a/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java +++ b/common/src/main/java/com/dfsek/terra/carving/UserDefinedCarver.java @@ -1,6 +1,7 @@ package com.dfsek.terra.carving; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.parsii.RandomFunction; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; @@ -11,7 +12,6 @@ import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.config.templates.CarverTemplate; -import com.dfsek.terra.math.RandomFunction; import net.jafama.FastMath; import parsii.eval.Expression; import parsii.eval.Parser; diff --git a/common/src/main/java/com/dfsek/terra/command/Command.java b/common/src/main/java/com/dfsek/terra/command/Command.java deleted file mode 100644 index fb752b793..000000000 --- a/common/src/main/java/com/dfsek/terra/command/Command.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.dfsek.terra.command; - -public class Command { - -} diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java index 1776a04ef..e7df3880f 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPack.java @@ -40,9 +40,9 @@ import com.dfsek.terra.config.templates.OreTemplate; import com.dfsek.terra.config.templates.PaletteTemplate; import com.dfsek.terra.config.templates.StructureTemplate; import com.dfsek.terra.config.templates.TreeTemplate; -import com.dfsek.terra.generation.items.TerraStructure; -import com.dfsek.terra.generation.items.ores.Ore; import com.dfsek.terra.generation.math.SamplerCache; +import com.dfsek.terra.population.items.TerraStructure; +import com.dfsek.terra.population.items.ores.Ore; import com.dfsek.terra.registry.BiomeGridRegistry; import com.dfsek.terra.registry.BiomeRegistry; import com.dfsek.terra.registry.CarverRegistry; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java index fbea4bce3..fbef851e5 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/FloraFactory.java @@ -8,7 +8,7 @@ import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.api.world.palette.RandomPalette; import com.dfsek.terra.biome.palette.PaletteLayer; import com.dfsek.terra.config.templates.FloraTemplate; -import com.dfsek.terra.generation.items.flora.TerraFlora; +import com.dfsek.terra.population.items.flora.TerraFlora; public class FloraFactory implements TerraFactory { @Override diff --git a/common/src/main/java/com/dfsek/terra/config/factories/OreFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/OreFactory.java index 766dee868..401074c52 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/OreFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/OreFactory.java @@ -3,9 +3,9 @@ package com.dfsek.terra.config.factories; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.config.templates.OreTemplate; -import com.dfsek.terra.generation.items.ores.DeformedSphereOre; -import com.dfsek.terra.generation.items.ores.Ore; -import com.dfsek.terra.generation.items.ores.VanillaOre; +import com.dfsek.terra.population.items.ores.DeformedSphereOre; +import com.dfsek.terra.population.items.ores.Ore; +import com.dfsek.terra.population.items.ores.VanillaOre; public class OreFactory implements TerraFactory { @Override diff --git a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java index a7a484a64..41dcebeb9 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java @@ -1,6 +1,6 @@ package com.dfsek.terra.config.factories; -import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.util.FastRandom; diff --git a/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java index 19c418c80..07ff0f902 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/StructureFactory.java @@ -1,13 +1,12 @@ package com.dfsek.terra.config.factories; -import com.dfsek.tectonic.exception.LoadException; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.config.templates.StructureTemplate; -import com.dfsek.terra.generation.items.TerraStructure; +import com.dfsek.terra.population.items.TerraStructure; public class StructureFactory implements TerraFactory { @Override - public TerraStructure build(StructureTemplate config, TerraPlugin main) throws LoadException { + public TerraStructure build(StructureTemplate config, TerraPlugin main) { return new TerraStructure(config.getStructures(), config.getY(), config.getSpawn(), config); } } diff --git a/common/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java index 3d1267036..d1bd32ede 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/TreeFactory.java @@ -1,14 +1,13 @@ package com.dfsek.terra.config.factories; -import com.dfsek.tectonic.exception.LoadException; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.config.templates.TreeTemplate; -import com.dfsek.terra.generation.items.tree.TerraTree; +import com.dfsek.terra.population.items.tree.TerraTree; public class TreeFactory implements TerraFactory { @Override - public Tree build(TreeTemplate config, TerraPlugin main) throws LoadException { + public Tree build(TreeTemplate config, TerraPlugin main) { return new TerraTree(config.getSpawnable(), config.getyOffset(), config.getStructures()); } } diff --git a/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java b/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java index 72daa5d9e..a7f24fc45 100644 --- a/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java +++ b/common/src/main/java/com/dfsek/terra/config/lang/LangUtil.java @@ -1,6 +1,6 @@ package com.dfsek.terra.config.lang; -import com.dfsek.terra.api.lang.Language; +import com.dfsek.terra.api.language.Language; import com.dfsek.terra.api.platform.CommandSender; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.debug.Debug; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java index 7fa6275a9..53ec78a2b 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/MaterialSetLoader.java @@ -18,8 +18,7 @@ public class MaterialSetLoader implements TypeLoader { for(String string : stringData) { try { - if(string.startsWith("#")) set.addTag(string.substring(1)); - else set.add((MaterialData) configLoader.loadType(MaterialData.class, string)); + set.add((MaterialData) configLoader.loadType(MaterialData.class, string)); } catch(NullPointerException e) { throw new LoadException("Invalid data identifier \"" + string + "\"", e); } diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java index b8875427b..b5664d403 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java @@ -3,12 +3,12 @@ package com.dfsek.terra.config.loaders.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.config.loaders.Types; -import com.dfsek.terra.generation.items.flora.FloraLayer; +import com.dfsek.terra.population.items.flora.FloraLayer; import java.lang.reflect.Type; import java.util.Map; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java index 1c753ecbc..493d0b0eb 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/GridSpawnLoader.java @@ -2,7 +2,7 @@ package com.dfsek.terra.config.loaders.config; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.procgen.GridSpawn; +import com.dfsek.terra.api.math.GridSpawn; import java.lang.reflect.Type; import java.util.Map; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java index e8bb0c922..f2a3dafb4 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java @@ -5,7 +5,7 @@ import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.generation.config.NoiseBuilder; import java.lang.reflect.Type; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java index 74c39d19a..595cf28de 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/OreConfigLoader.java @@ -1,10 +1,9 @@ package com.dfsek.terra.config.loaders.config; -import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.math.Range; -import com.dfsek.terra.generation.items.ores.OreConfig; +import com.dfsek.terra.population.items.ores.OreConfig; import java.lang.reflect.Type; import java.util.Map; @@ -12,7 +11,7 @@ import java.util.Map; @SuppressWarnings("unchecked") public class OreConfigLoader implements TypeLoader { @Override - public OreConfig load(Type type, Object o, ConfigLoader configLoader) throws LoadException { + public OreConfig load(Type type, Object o, ConfigLoader configLoader) { Map map = (Map) o; Range amount = new Range(map.get("min"), map.get("max")); Range height = new Range(map.get("min-height"), map.get("max-height")); diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java index 859d3c467..9986391c8 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/OreHolderLoader.java @@ -3,9 +3,9 @@ package com.dfsek.terra.config.loaders.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.generation.items.ores.Ore; -import com.dfsek.terra.generation.items.ores.OreConfig; -import com.dfsek.terra.generation.items.ores.OreHolder; +import com.dfsek.terra.population.items.ores.Ore; +import com.dfsek.terra.population.items.ores.OreConfig; +import com.dfsek.terra.population.items.ores.OreHolder; import java.lang.reflect.Type; import java.util.Map; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java index 57154ffa1..ba2584deb 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java @@ -3,23 +3,20 @@ package com.dfsek.terra.config.loaders.config; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; -import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.config.loaders.Types; -import com.dfsek.terra.generation.items.tree.TreeLayer; +import com.dfsek.terra.population.items.tree.TreeLayer; import java.lang.reflect.Type; import java.util.Map; @SuppressWarnings("unchecked") public class TreeLayerLoader implements TypeLoader { - private final TerraPlugin main; - public TreeLayerLoader(TerraPlugin main) { - this.main = main; + public TreeLayerLoader() { } @Override diff --git a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index a5cb98e6a..201d1ee89 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -5,6 +5,7 @@ import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ValidatedConfigTemplate; import com.dfsek.tectonic.exception.ValidationException; +import com.dfsek.terra.api.math.parsii.BlankFunction; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; @@ -15,11 +16,10 @@ import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.biome.palette.SinglePalette; import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.generation.items.TerraStructure; -import com.dfsek.terra.generation.items.flora.FloraLayer; -import com.dfsek.terra.generation.items.ores.OreHolder; -import com.dfsek.terra.generation.items.tree.TreeLayer; -import com.dfsek.terra.math.BlankFunction; +import com.dfsek.terra.population.items.TerraStructure; +import com.dfsek.terra.population.items.flora.FloraLayer; +import com.dfsek.terra.population.items.ores.OreHolder; +import com.dfsek.terra.population.items.tree.TreeLayer; import parsii.eval.Parser; import parsii.eval.Scope; import parsii.tokenizer.ParseException; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java index f6bdf1c8a..19d91544e 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/FloraTemplate.java @@ -4,7 +4,7 @@ import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.biome.palette.PaletteLayer; -import com.dfsek.terra.generation.items.flora.TerraFlora; +import com.dfsek.terra.population.items.flora.TerraFlora; import com.dfsek.terra.util.MaterialSet; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java index 4a54387ba..64465e5c7 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/OreTemplate.java @@ -5,7 +5,7 @@ import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.platform.block.BlockData; -import com.dfsek.terra.generation.items.ores.Ore; +import com.dfsek.terra.population.items.ores.Ore; import com.dfsek.terra.util.MaterialSet; @SuppressWarnings({"unused", "FieldMayBeFinal"}) diff --git a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java index 1130bb984..8da29ddf8 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/StructureTemplate.java @@ -4,11 +4,11 @@ import com.dfsek.tectonic.annotations.Abstractable; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; +import com.dfsek.terra.api.math.GridSpawn; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.api.util.GlueList; -import com.dfsek.terra.procgen.GridSpawn; import java.util.List; diff --git a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java index 272acfaf2..a2265b5a2 100644 --- a/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/MasterChunkGenerator.java @@ -90,7 +90,6 @@ public class MasterChunkGenerator implements TerraChunkGenerator { TerraWorld tw = main.getWorld(world); com.dfsek.terra.api.world.biome.BiomeGrid grid = tw.getGrid(); try(ProfileFuture ignore = tw.getProfiler().measure("TotalChunkGenTime")) { - try(ProfileFuture ignored = tw.getProfiler().measure("ChunkBaseGenTime")) { if(!tw.isSafe()) return chunk; int xOrig = (chunkX << 4); int zOrig = (chunkZ << 4); @@ -139,8 +138,6 @@ public class MasterChunkGenerator implements TerraChunkGenerator { } } } - } - return chunk; } } diff --git a/common/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java b/common/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java index 1423a2706..a04e64178 100644 --- a/common/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java +++ b/common/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java @@ -3,7 +3,7 @@ package com.dfsek.terra.generation.config; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.noise.FastNoiseLite; public class NoiseBuilder implements ConfigTemplate { @Value("type") diff --git a/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java index 8ac84a2c9..f3faef1e3 100644 --- a/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java +++ b/common/src/main/java/com/dfsek/terra/generation/config/WorldGenerator.java @@ -1,12 +1,12 @@ package com.dfsek.terra.generation.config; +import com.dfsek.terra.api.math.noise.NoiseFunction2; +import com.dfsek.terra.api.math.noise.NoiseFunction3; +import com.dfsek.terra.api.math.parsii.RandomFunction; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.biome.Generator; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; -import com.dfsek.terra.math.NoiseFunction2; -import com.dfsek.terra.math.NoiseFunction3; -import com.dfsek.terra.math.RandomFunction; import parsii.eval.Expression; import parsii.eval.Parser; import parsii.eval.Scope; diff --git a/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java b/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java index 51a3aeec0..7d1773008 100644 --- a/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/Sampler.java @@ -3,6 +3,7 @@ package com.dfsek.terra.generation.math; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.generation.math.interpolation.ChunkInterpolator; +import com.dfsek.terra.generation.math.interpolation.ElevationInterpolator; import net.jafama.FastMath; public class Sampler { diff --git a/common/src/main/java/com/dfsek/terra/generation/math/ElevationInterpolator.java b/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ElevationInterpolator.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/generation/math/ElevationInterpolator.java rename to common/src/main/java/com/dfsek/terra/generation/math/interpolation/ElevationInterpolator.java index fe4a02720..f037c7b94 100644 --- a/common/src/main/java/com/dfsek/terra/generation/math/ElevationInterpolator.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/interpolation/ElevationInterpolator.java @@ -1,10 +1,9 @@ -package com.dfsek.terra.generation.math; +package com.dfsek.terra.generation.math.interpolation; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.api.world.biome.BiomeGrid; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.generation.config.WorldGenerator; -import com.dfsek.terra.generation.math.interpolation.Interpolator; import net.jafama.FastMath; public class ElevationInterpolator { diff --git a/common/src/main/java/com/dfsek/terra/math/MathUtil.java b/common/src/main/java/com/dfsek/terra/math/MathUtil.java deleted file mode 100644 index 646996494..000000000 --- a/common/src/main/java/com/dfsek/terra/math/MathUtil.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.dfsek.terra.math; - -import com.dfsek.terra.generation.math.Sampler; - -public final class MathUtil { - private static final double CONST = 0.55; - - public static double derivative(Sampler sampler, double x, double y, double z) { - double baseSample = sampler.sample(x, y, z); - - double xVal1 = (sampler.sample(x + CONST, y, z) - baseSample) / CONST; - double xVal2 = (sampler.sample(x - CONST, y, z) - baseSample) / CONST; - double zVal1 = (sampler.sample(x, y, z + CONST) - baseSample) / CONST; - double zVal2 = (sampler.sample(x, y, z - CONST) - baseSample) / CONST; - double yVal1 = (sampler.sample(x, y + CONST, z) - baseSample) / CONST; - double yVal2 = (sampler.sample(x, y - CONST, z) - baseSample) / CONST; - - return Math.sqrt(((xVal2 - xVal1) * (xVal2 - xVal1)) + ((zVal2 - zVal1) * (zVal2 - zVal1)) + ((yVal2 - yVal1) * (yVal2 - yVal1))); - } -} diff --git a/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java index f88273d40..58e033428 100644 --- a/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -10,7 +10,7 @@ import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import com.dfsek.terra.generation.items.flora.FloraLayer; +import com.dfsek.terra.population.items.flora.FloraLayer; import org.jetbrains.annotations.NotNull; import java.util.HashMap; diff --git a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java index 90c594a67..f504878bc 100644 --- a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -13,7 +13,7 @@ import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.config.base.ConfigPack; -import com.dfsek.terra.generation.items.TerraStructure; +import com.dfsek.terra.population.items.TerraStructure; import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; diff --git a/common/src/main/java/com/dfsek/terra/population/TreePopulator.java b/common/src/main/java/com/dfsek/terra/population/TreePopulator.java index d69e635b5..6d32250ec 100644 --- a/common/src/main/java/com/dfsek/terra/population/TreePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/TreePopulator.java @@ -10,7 +10,7 @@ import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; -import com.dfsek.terra.generation.items.tree.TreeLayer; +import com.dfsek.terra.population.items.tree.TreeLayer; import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java b/common/src/main/java/com/dfsek/terra/population/items/PlaceableLayer.java similarity index 91% rename from common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java rename to common/src/main/java/com/dfsek/terra/population/items/PlaceableLayer.java index 646484e60..978915ecc 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/PlaceableLayer.java +++ b/common/src/main/java/com/dfsek/terra/population/items/PlaceableLayer.java @@ -1,8 +1,8 @@ -package com.dfsek.terra.generation.items; +package com.dfsek.terra.population.items; -import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.world.Chunk; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java b/common/src/main/java/com/dfsek/terra/population/items/TerraStructure.java similarity index 92% rename from common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java rename to common/src/main/java/com/dfsek/terra/population/items/TerraStructure.java index fa327c9d8..9e8e51a2a 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/TerraStructure.java +++ b/common/src/main/java/com/dfsek/terra/population/items/TerraStructure.java @@ -1,10 +1,10 @@ -package com.dfsek.terra.generation.items; +package com.dfsek.terra.population.items; +import com.dfsek.terra.api.math.GridSpawn; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.structures.script.StructureScript; import com.dfsek.terra.config.templates.StructureTemplate; -import com.dfsek.terra.procgen.GridSpawn; public class TerraStructure { private final ProbabilityCollection structure; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java b/common/src/main/java/com/dfsek/terra/population/items/flora/BlockFlora.java similarity index 96% rename from common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java rename to common/src/main/java/com/dfsek/terra/population/items/flora/BlockFlora.java index 39da6e3ce..75ae1431f 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/BlockFlora.java +++ b/common/src/main/java/com/dfsek/terra/population/items/flora/BlockFlora.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.generation.items.flora; +package com.dfsek.terra.population.items.flora; import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.math.vector.Location; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java b/common/src/main/java/com/dfsek/terra/population/items/flora/ConstantFlora.java similarity index 97% rename from common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java rename to common/src/main/java/com/dfsek/terra/population/items/flora/ConstantFlora.java index 8644cdbc9..0cdb224ba 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/ConstantFlora.java +++ b/common/src/main/java/com/dfsek/terra/population/items/flora/ConstantFlora.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.generation.items.flora; +package com.dfsek.terra.population.items.flora; import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.math.vector.Location; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java b/common/src/main/java/com/dfsek/terra/population/items/flora/FloraLayer.java similarity index 85% rename from common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java rename to common/src/main/java/com/dfsek/terra/population/items/flora/FloraLayer.java index 2459144ec..f32312fda 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/FloraLayer.java +++ b/common/src/main/java/com/dfsek/terra/population/items/flora/FloraLayer.java @@ -1,12 +1,12 @@ -package com.dfsek.terra.generation.items.flora; +package com.dfsek.terra.population.items.flora; -import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.world.flora.Flora; -import com.dfsek.terra.generation.items.PlaceableLayer; +import com.dfsek.terra.population.items.PlaceableLayer; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java b/common/src/main/java/com/dfsek/terra/population/items/flora/TerraFlora.java similarity index 99% rename from common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java rename to common/src/main/java/com/dfsek/terra/population/items/flora/TerraFlora.java index ce700c3e8..34b2b974a 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/flora/TerraFlora.java +++ b/common/src/main/java/com/dfsek/terra/population/items/flora/TerraFlora.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.generation.items.flora; +package com.dfsek.terra.population.items.flora; import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.math.vector.Location; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java b/common/src/main/java/com/dfsek/terra/population/items/ores/DeformedSphereOre.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java rename to common/src/main/java/com/dfsek/terra/population/items/ores/DeformedSphereOre.java index 94332344d..946ae4b6d 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/DeformedSphereOre.java +++ b/common/src/main/java/com/dfsek/terra/population/items/ores/DeformedSphereOre.java @@ -1,7 +1,7 @@ -package com.dfsek.terra.generation.items.ores; +package com.dfsek.terra.population.items.ores; -import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.Block; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java b/common/src/main/java/com/dfsek/terra/population/items/ores/Ore.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java rename to common/src/main/java/com/dfsek/terra/population/items/ores/Ore.java index a1a8cdd3f..2c60b97e4 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/Ore.java +++ b/common/src/main/java/com/dfsek/terra/population/items/ores/Ore.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.generation.items.ores; +package com.dfsek.terra.population.items.ores; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java b/common/src/main/java/com/dfsek/terra/population/items/ores/OreConfig.java similarity index 88% rename from common/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java rename to common/src/main/java/com/dfsek/terra/population/items/ores/OreConfig.java index a8bde759d..2c9bf9bc0 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/OreConfig.java +++ b/common/src/main/java/com/dfsek/terra/population/items/ores/OreConfig.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.generation.items.ores; +package com.dfsek.terra.population.items.ores; import com.dfsek.terra.api.math.Range; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java b/common/src/main/java/com/dfsek/terra/population/items/ores/OreHolder.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java rename to common/src/main/java/com/dfsek/terra/population/items/ores/OreHolder.java index a7d585b8f..d7668ba0f 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/OreHolder.java +++ b/common/src/main/java/com/dfsek/terra/population/items/ores/OreHolder.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.generation.items.ores; +package com.dfsek.terra.population.items.ores; import com.dfsek.terra.api.util.GlueList; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java b/common/src/main/java/com/dfsek/terra/population/items/ores/VanillaOre.java similarity index 98% rename from common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java rename to common/src/main/java/com/dfsek/terra/population/items/ores/VanillaOre.java index 4e1f5364c..39e27c4d4 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/ores/VanillaOre.java +++ b/common/src/main/java/com/dfsek/terra/population/items/ores/VanillaOre.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.generation.items.ores; +package com.dfsek.terra.population.items.ores; import com.dfsek.terra.api.math.Range; import com.dfsek.terra.api.math.vector.Vector3; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java b/common/src/main/java/com/dfsek/terra/population/items/tree/TerraTree.java similarity index 95% rename from common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java rename to common/src/main/java/com/dfsek/terra/population/items/tree/TerraTree.java index c01875d76..b50220f34 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/tree/TerraTree.java +++ b/common/src/main/java/com/dfsek/terra/population/items/tree/TerraTree.java @@ -1,4 +1,4 @@ -package com.dfsek.terra.generation.items.tree; +package com.dfsek.terra.population.items.tree; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.vector.Location; diff --git a/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java b/common/src/main/java/com/dfsek/terra/population/items/tree/TreeLayer.java similarity index 87% rename from common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java rename to common/src/main/java/com/dfsek/terra/population/items/tree/TreeLayer.java index 740163da6..655204a67 100644 --- a/common/src/main/java/com/dfsek/terra/generation/items/tree/TreeLayer.java +++ b/common/src/main/java/com/dfsek/terra/population/items/tree/TreeLayer.java @@ -1,14 +1,14 @@ -package com.dfsek.terra.generation.items.tree; +package com.dfsek.terra.population.items.tree; -import com.dfsek.terra.api.math.FastNoiseLite; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockFace; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.world.tree.Tree; -import com.dfsek.terra.generation.items.PlaceableLayer; +import com.dfsek.terra.population.items.PlaceableLayer; import java.util.Random; diff --git a/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java b/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java index ae31c6a09..e15e68fe1 100644 --- a/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java @@ -4,7 +4,7 @@ import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.world.flora.Flora; -import com.dfsek.terra.generation.items.flora.ConstantFlora; +import com.dfsek.terra.population.items.flora.ConstantFlora; import com.dfsek.terra.util.MaterialSet; import java.util.Arrays; diff --git a/common/src/main/java/com/dfsek/terra/registry/OreRegistry.java b/common/src/main/java/com/dfsek/terra/registry/OreRegistry.java index 69091898a..b5abf80d1 100644 --- a/common/src/main/java/com/dfsek/terra/registry/OreRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/OreRegistry.java @@ -1,6 +1,6 @@ package com.dfsek.terra.registry; -import com.dfsek.terra.generation.items.ores.Ore; +import com.dfsek.terra.population.items.ores.Ore; public class OreRegistry extends TerraRegistry { } diff --git a/common/src/main/java/com/dfsek/terra/registry/StructureRegistry.java b/common/src/main/java/com/dfsek/terra/registry/StructureRegistry.java index 70af101f2..a66878751 100644 --- a/common/src/main/java/com/dfsek/terra/registry/StructureRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/StructureRegistry.java @@ -1,6 +1,6 @@ package com.dfsek.terra.registry; -import com.dfsek.terra.generation.items.TerraStructure; +import com.dfsek.terra.population.items.TerraStructure; public class StructureRegistry extends TerraRegistry { } diff --git a/common/src/main/java/com/dfsek/terra/util/MaterialSet.java b/common/src/main/java/com/dfsek/terra/util/MaterialSet.java index ff13abbb2..455051d97 100644 --- a/common/src/main/java/com/dfsek/terra/util/MaterialSet.java +++ b/common/src/main/java/com/dfsek/terra/util/MaterialSet.java @@ -21,10 +21,6 @@ public class MaterialSet extends HashSet { return set; } - public void addTag(String tag) { - this.addAll(TagUtil.getTag(tag)); - } - private void add(BlockData data) { add(data.getMaterial()); } diff --git a/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java b/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java index bb2979f11..7a2b5fa93 100644 --- a/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java +++ b/common/src/main/java/com/dfsek/terra/util/PaletteUtil.java @@ -1,11 +1,11 @@ package com.dfsek.terra.util; +import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.world.palette.Palette; import com.dfsek.terra.biome.palette.PaletteHolder; import com.dfsek.terra.config.templates.BiomeTemplate; import com.dfsek.terra.generation.math.Sampler; -import com.dfsek.terra.math.MathUtil; public final class PaletteUtil { public static Palette getPalette(int x, int y, int z, BiomeTemplate c, Sampler sampler) { diff --git a/common/src/main/java/com/dfsek/terra/util/StringUtils.java b/common/src/main/java/com/dfsek/terra/util/StringUtils.java deleted file mode 100644 index 5c579e3f9..000000000 --- a/common/src/main/java/com/dfsek/terra/util/StringUtils.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.dfsek.terra.util; - -public final class StringUtils { - /** - * Strip Minecraft namespace from string - * - * @param in String to strip namespace of - * @return Stripped string/ - */ - public static String stripMinecraftNamespace(String in) { - if(!in.startsWith("minecraft:")) return in; - return in.substring(10); - } -} diff --git a/common/src/main/java/com/dfsek/terra/util/TagUtil.java b/common/src/main/java/com/dfsek/terra/util/TagUtil.java deleted file mode 100644 index 9755092e6..000000000 --- a/common/src/main/java/com/dfsek/terra/util/TagUtil.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.dfsek.terra.util; - -import com.dfsek.terra.api.platform.block.MaterialData; -import com.dfsek.terra.debug.Debug; -import org.jetbrains.annotations.NotNull; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; -import java.util.Set; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -@SuppressWarnings("unchecked") -public final class TagUtil { - private static final Map> tagMap; - - static { - Debug.info("Loading tags..."); - tagMap = new HashMap<>(); - - /* - Field[] tags = Tag.class.getFields(); // Add Bukkit tags - for(Field field : tags) { - if(Modifier.isStatic(field.getModifiers())) { - try { - Tag tag = (Tag) field.get(new Object()); - tagMap.put(tag.getKey().toString(), tag.getValues()); - } catch(IllegalAccessException e) { - e.printStackTrace(); - } catch(ClassCastException ignore) { - } - } - } - putCustomSet("minecraft:base_stone_nether", Material.NETHERRACK, Material.BASALT, Material.BLACKSTONE); - putCustomSet("minecraft:base_stone_overworld", Material.STONE, Material.GRANITE, Material.DIORITE, Material.ANDESITE); - - Set snow = new HashSet<>(); - Set solid = new HashSet<>(); - for(Material m : Material.values()) { - if(m.isSolid()) solid.add(m); - String name = m.toString().toLowerCase(); - if(name.contains("slab") - || name.contains("stair") - || name.contains("wall") - || name.contains("fence") - || name.contains("lantern") - || name.contains("chest") - || name.contains("door") - || name.contains("repeater") - || name.equals("lily_pad") - || name.equals("snow") - || name.equals("pane") - || !m.isSolid()) snow.add(m); - } - tagMap.put("com.dfsek.terra:snow_blacklist", snow); - tagMap.put("com.dfsek.terra:solid", solid); - Debug.info("Added " + snow.size() + " materials to snow blacklist"); - Debug.info("Added " + solid.size() + " materials to solid list"); - Debug.info("Loaded " + tagMap.size() + " tags."); - - */ - } - - private static Set getSet(MaterialData... materials) { - return Stream.of(materials).collect(Collectors.toSet()); - } - - private static void putCustomSet(String key, MaterialData... materials) { - tagMap.put(key, getSet(materials)); - } - - @NotNull - public static Set getTag(String tag) { - return Objects.requireNonNull(tagMap.get(tag)); - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 4ca20f319..120c6dc59 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -3,7 +3,7 @@ package com.dfsek.terra.bukkit; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.GenericLoaders; -import com.dfsek.terra.api.lang.Language; +import com.dfsek.terra.api.language.Language; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; @@ -30,7 +30,6 @@ import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.MasterChunkGenerator; import com.dfsek.terra.registry.ConfigRegistry; -import com.dfsek.terra.util.StringUtils; import org.bstats.bukkit.Metrics; import org.bukkit.Bukkit; import org.bukkit.TreeType; @@ -107,7 +106,7 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { .add("OAK", new BukkitTree(TreeType.TREE, this)) .add("MEGA_SPRUCE", new BukkitTree(TreeType.MEGA_REDWOOD, this)) .add("SWAMP_OAK", new BukkitTree(TreeType.SWAMP, this))) - .addTransform(id -> new BukkitTree(TreeType.valueOf(StringUtils.stripMinecraftNamespace(id)), this)) // Finally, try stripping minecraft namespace. + .addTransform(id -> new BukkitTree(TreeType.valueOf(id), this)) // Finally, try stripping minecraft namespace. .build()); saveDefaultConfig(); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java index 93029c56b..3d1c008f1 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/biome/BiomeInfoCommand.java @@ -9,7 +9,7 @@ import com.dfsek.terra.carving.UserDefinedCarver; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.lang.LangUtil; import com.dfsek.terra.config.templates.BiomeTemplate; -import com.dfsek.terra.generation.items.TerraStructure; +import com.dfsek.terra.population.items.TerraStructure; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java index 28c2faef7..2bea3e094 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java @@ -1,13 +1,13 @@ package com.dfsek.terra.bukkit.command.command.geometry; -import com.dfsek.terra.api.math.FastNoiseLite; +import com.dfsek.terra.api.math.noise.FastNoiseLite; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.math.voxel.DeformedSphere; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitPlayer; import com.dfsek.terra.bukkit.command.PlayerCommand; import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.procgen.voxel.DeformedSphere; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java index 0c7f51ab2..a726d7b02 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/SphereCommand.java @@ -1,12 +1,12 @@ package com.dfsek.terra.bukkit.command.command.geometry; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.math.voxel.Sphere; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.BukkitPlayer; import com.dfsek.terra.bukkit.command.PlayerCommand; import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.procgen.voxel.Sphere; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java index b4bc6c103..53fcbd7cc 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java @@ -1,13 +1,13 @@ package com.dfsek.terra.bukkit.command.command.geometry; import com.dfsek.terra.api.math.vector.Vector3; +import com.dfsek.terra.api.math.voxel.Tube; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.command.PlayerCommand; import com.dfsek.terra.bukkit.structure.WorldEditUtil; import com.dfsek.terra.bukkit.util.BukkitConversions; import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.procgen.voxel.Tube; import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java index 9503111e0..c884f97af 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/structure/LocateCommand.java @@ -7,7 +7,7 @@ import com.dfsek.terra.bukkit.TerraBukkitPlugin; import com.dfsek.terra.bukkit.command.WorldCommand; import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.config.lang.LangUtil; -import com.dfsek.terra.generation.items.TerraStructure; +import com.dfsek.terra.population.items.TerraStructure; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.ClickEvent; @@ -32,7 +32,7 @@ public class LocateCommand extends WorldCommand { super(parent); } - @SuppressWarnings("DuplicatedCode") + @SuppressWarnings({"DuplicatedCode", "deprecation"}) @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { String id = args[0]; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java index 3c774e1b9..9d4e52065 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/listeners/SpigotListener.java @@ -5,7 +5,7 @@ import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.async.AsyncStructureFinder; import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.debug.Debug; -import com.dfsek.terra.generation.items.TerraStructure; +import com.dfsek.terra.population.items.TerraStructure; import org.bukkit.entity.EnderSignal; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java index 16c19fd1c..4180de888 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitWorld.java @@ -99,4 +99,9 @@ public class BukkitWorld implements World { public int hashCode() { return delegate.hashCode(); } + + @Override + public String toString() { + return delegate.toString(); + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java index 5f3141f09..458c0ad71 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitMobSpawner.java @@ -97,7 +97,7 @@ public class BukkitMobSpawner extends BukkitBlockState implements MobSpawner { SerialState.parse(state).forEach((k, v) -> { switch(k) { case "type": - setSpawnedType(new BukkitEntityType(org.bukkit.entity.EntityType.valueOf(v))); + setSpawnedType(new BukkitEntityType(org.bukkit.entity.EntityType.valueOf(v.toUpperCase()))); return; case "delay": setDelay(Integer.parseInt(v)); diff --git a/platforms/bukkit/src/main/resources/config.yml b/platforms/bukkit/src/main/resources/config.yml index 9ad3c8b47..4d652784a 100644 --- a/platforms/bukkit/src/main/resources/config.yml +++ b/platforms/bukkit/src/main/resources/config.yml @@ -6,6 +6,6 @@ biome-search-resolution: 4 cache: carver: 512 structure: 32 - sampler: 512 + sampler: 128 master-disable: caves: false \ No newline at end of file diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 090beacb8..07a7b0499 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -3,7 +3,7 @@ package com.dfsek.terra.fabric; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.TerraWorld; import com.dfsek.terra.api.GenericLoaders; -import com.dfsek.terra.api.lang.Language; +import com.dfsek.terra.api.language.Language; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; @@ -25,7 +25,6 @@ import com.dfsek.terra.fabric.world.TerraBiomeSource; import com.dfsek.terra.fabric.world.features.PopulatorFeature; import com.dfsek.terra.fabric.world.generator.FabricChunkGeneratorWrapper; import com.dfsek.terra.registry.ConfigRegistry; -import com.dfsek.terra.util.StringUtils; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; @@ -82,7 +81,6 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private File config; private static final Transformer> TREE_TRANSFORMER = new Transformer.Builder>() .addTransform(TerraFabricPlugin::getFeature) - .addTransform(id -> getFeature(StringUtils.stripMinecraftNamespace(id))) .addTransform(new MapTransform>() .add("BROWN_MUSHROOM", ConfiguredFeatures.BROWN_MUSHROOM_GIANT) .add("RED_MUSHROOM", ConfiguredFeatures.RED_MUSHROOM_GIANT) diff --git a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java index 741c34674..394d1badf 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java +++ b/platforms/region/src/main/java/com/dfsek/terra/StandalonePlugin.java @@ -2,7 +2,7 @@ package com.dfsek.terra; import com.dfsek.tectonic.loading.TypeRegistry; import com.dfsek.terra.api.GenericLoaders; -import com.dfsek.terra.api.lang.Language; +import com.dfsek.terra.api.language.Language; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; From 44176f7ee6bd11ddce89bc40670c76a8ae84c3cc Mon Sep 17 00:00:00 2001 From: dfsek Date: Tue, 5 Jan 2021 22:14:40 -0700 Subject: [PATCH 196/210] fix Marks --- .../com/dfsek/terra/api/math/vector/Location.java | 5 +++++ .../api/structures/script/StructureScript.java | 4 ++-- .../script/builders/GetMarkFunctionBuilder.java | 3 +-- ...tionBuilder.java => SetMarkFunctionBuilder.java} | 10 +++++----- .../script/builders/UnaryStringFunctionBuilder.java | 2 +- .../structures/script/functions/BlockFunction.java | 6 ++++-- .../script/functions/CheckBlockFunction.java | 2 +- .../structures/script/functions/CheckFunction.java | 2 +- .../structures/script/functions/EntityFunction.java | 2 +- .../script/functions/GetMarkFunction.java | 7 +++---- .../structures/script/functions/LootFunction.java | 2 +- .../structures/script/functions/PullFunction.java | 2 +- .../{MarkFunction.java => SetMarkFunction.java} | 8 +++----- .../structures/script/functions/StateFunction.java | 2 +- .../script/functions/StructureFunction.java | 2 +- .../api/structures/structure/buffer/Buffer.java | 8 +++----- .../terra/api/structures/structure/buffer/Cell.java | 7 +++---- .../structure/buffer/IntermediateBuffer.java | 9 ++++----- .../structure/buffer/StructureBuffer.java | 10 ++++------ .../api/structures/structure/buffer/items/Mark.java | 13 ------------- 20 files changed, 45 insertions(+), 61 deletions(-) rename common/src/main/java/com/dfsek/terra/api/structures/script/builders/{MarkFunctionBuilder.java => SetMarkFunctionBuilder.java} (61%) rename common/src/main/java/com/dfsek/terra/api/structures/script/functions/{MarkFunction.java => SetMarkFunction.java} (71%) delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/Mark.java diff --git a/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java b/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java index 4fb2435b5..a030f9e49 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java +++ b/common/src/main/java/com/dfsek/terra/api/math/vector/Location.java @@ -106,6 +106,11 @@ public class Location implements Cloneable { return this; } + public Location add(Location add) { + vector.add(add.toVector()); + return this; + } + @Override public boolean equals(Object obj) { if(!(obj instanceof Location)) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index d72f441f9..79cb7e2e6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -14,10 +14,10 @@ import com.dfsek.terra.api.structures.script.builders.CheckFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.EntityFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.GetMarkFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.LootFunctionBuilder; -import com.dfsek.terra.api.structures.script.builders.MarkFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.PullFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RandomFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.RecursionsFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.SetMarkFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.StateFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.UnaryNumberFunctionBuilder; @@ -58,7 +58,7 @@ public class StructureScript { .registerFunction("structure", new StructureFunctionBuilder(registry, main)) .registerFunction("randomInt", new RandomFunctionBuilder()) .registerFunction("recursions", new RecursionsFunctionBuilder()) - .registerFunction("setMark", new MarkFunctionBuilder()) + .registerFunction("setMark", new SetMarkFunctionBuilder()) .registerFunction("getMark", new GetMarkFunctionBuilder()) .registerFunction("pull", new PullFunctionBuilder(main)) .registerFunction("loot", new LootFunctionBuilder(main, lootRegistry)) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/GetMarkFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/GetMarkFunctionBuilder.java index 5da2fa0e5..e93fbdc2b 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/GetMarkFunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/GetMarkFunctionBuilder.java @@ -1,6 +1,5 @@ package com.dfsek.terra.api.structures.script.builders; -import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; import com.dfsek.terra.api.structures.script.functions.GetMarkFunction; @@ -15,7 +14,7 @@ public class GetMarkFunctionBuilder implements FunctionBuilder @SuppressWarnings("unchecked") @Override - public GetMarkFunction build(List> argumentList, Position position) throws ParseException { + public GetMarkFunction build(List> argumentList, Position position) { return new GetMarkFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), position); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/MarkFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/SetMarkFunctionBuilder.java similarity index 61% rename from common/src/main/java/com/dfsek/terra/api/structures/script/builders/MarkFunctionBuilder.java rename to common/src/main/java/com/dfsek/terra/api/structures/script/builders/SetMarkFunctionBuilder.java index cf73e0948..76fc5ec39 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/MarkFunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/SetMarkFunctionBuilder.java @@ -3,20 +3,20 @@ package com.dfsek.terra.api.structures.script.builders; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; -import com.dfsek.terra.api.structures.script.functions.MarkFunction; +import com.dfsek.terra.api.structures.script.functions.SetMarkFunction; import com.dfsek.terra.api.structures.tokenizer.Position; import java.util.List; -public class MarkFunctionBuilder implements FunctionBuilder { +public class SetMarkFunctionBuilder implements FunctionBuilder { - public MarkFunctionBuilder() { + public SetMarkFunctionBuilder() { } @SuppressWarnings("unchecked") @Override - public MarkFunction build(List> argumentList, Position position) throws ParseException { - return new MarkFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), position); + public SetMarkFunction build(List> argumentList, Position position) throws ParseException { + return new SetMarkFunction((Returnable) argumentList.get(0), (Returnable) argumentList.get(1), (Returnable) argumentList.get(2), (Returnable) argumentList.get(3), position); } @Override diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/UnaryStringFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/UnaryStringFunctionBuilder.java index f3436899a..619326773 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/UnaryStringFunctionBuilder.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/UnaryStringFunctionBuilder.java @@ -45,7 +45,7 @@ public class UnaryStringFunctionBuilder implements FunctionBuilder { @Override public Void apply(ImplementationArguments implementationArguments) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; + BlockData rot = data.clone(); + Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); RotationUtil.rotateVector(xz, arguments.getRotation()); - BlockData rot = data.clone(); + RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse()); - arguments.getBuffer().addItem(new BufferedBlock(rot, overwrite.apply(implementationArguments)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); + arguments.getBuffer().addItem(new BufferedBlock(rot, overwrite.apply(implementationArguments)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).doubleValue(), FastMath.roundToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld())); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckBlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckBlockFunction.java index 2c238cc64..8582af9ba 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckBlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckBlockFunction.java @@ -30,7 +30,7 @@ public class CheckBlockFunction implements Function { RotationUtil.rotateVector(xz, arguments.getRotation()); - String data = arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))).getBlock().getBlockData().getAsString(); + String data = arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).doubleValue(), FastMath.roundToInt(xz.getZ()))).getBlock().getBlockData().getAsString(); if(data.contains("[")) return data.substring(0, data.indexOf('[')); // Strip properties else return data; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java index 05de2816b..0be6ac4a1 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/CheckFunction.java @@ -43,7 +43,7 @@ public class CheckFunction implements Function { RotationUtil.rotateVector(xz, arguments.getRotation()); - Location location = arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); + Location location = arguments.getBuffer().getOrigin().clone().add(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).doubleValue(), FastMath.roundToInt(xz.getZ()))); return apply(location, arguments.getBuffer().getOrigin().getWorld()); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java index 614603d09..e96d5c5d1 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/EntityFunction.java @@ -37,7 +37,7 @@ public class EntityFunction implements Function { RotationUtil.rotateVector(xz, arguments.getRotation()); - arguments.getBuffer().addItem(new BufferedEntity(data), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); + arguments.getBuffer().addItem(new BufferedEntity(data), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld())); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java index 797544529..b2610b9cd 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/GetMarkFunction.java @@ -7,7 +7,6 @@ import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; -import com.dfsek.terra.api.structures.structure.buffer.items.Mark; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; @@ -28,8 +27,8 @@ public class GetMarkFunction implements Function { Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); RotationUtil.rotateVector(xz, arguments.getRotation()); - Mark mark = arguments.getBuffer().getMark(new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); - return mark == null ? "" : mark.getContent(); + String mark = arguments.getBuffer().getMark(new Vector3(FastMath.floorToInt(xz.getX()), FastMath.floorToInt(y.apply(implementationArguments).doubleValue()), FastMath.floorToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld())); + return mark == null ? "" : mark; } @Override @@ -39,6 +38,6 @@ public class GetMarkFunction implements Function { @Override public ReturnType returnType() { - return ReturnType.VOID; + return ReturnType.STRING; } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java index d1f197e25..a8421f81c 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/LootFunction.java @@ -46,7 +46,7 @@ public class LootFunction implements Function { return null; } - arguments.getBuffer().addItem(new BufferedLootApplication(table, main), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); + arguments.getBuffer().addItem(new BufferedLootApplication(table, main), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld())); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java index 8f6e45a86..e3722dbc1 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/PullFunction.java @@ -38,7 +38,7 @@ public class PullFunction implements Function { RotationUtil.rotateVector(xz, arguments.getRotation()); BlockData rot = data.clone(); RotationUtil.rotateBlockData(rot, arguments.getRotation().inverse()); - arguments.getBuffer().addItem(new BufferedPulledBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); + arguments.getBuffer().addItem(new BufferedPulledBlock(rot), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld())); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/SetMarkFunction.java similarity index 71% rename from common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java rename to common/src/main/java/com/dfsek/terra/api/structures/script/functions/SetMarkFunction.java index 671973eb3..f439d5acc 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/MarkFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/SetMarkFunction.java @@ -2,22 +2,20 @@ package com.dfsek.terra.api.structures.script.functions; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.math.vector.Vector3; -import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.parser.lang.functions.Function; import com.dfsek.terra.api.structures.script.TerraImplementationArguments; import com.dfsek.terra.api.structures.structure.RotationUtil; -import com.dfsek.terra.api.structures.structure.buffer.items.Mark; import com.dfsek.terra.api.structures.tokenizer.Position; import net.jafama.FastMath; -public class MarkFunction implements Function { +public class SetMarkFunction implements Function { private final Returnable x, y, z; private final Position position; private final Returnable mark; - public MarkFunction(Returnable x, Returnable y, Returnable z, Returnable mark, Position position) throws ParseException { + public SetMarkFunction(Returnable x, Returnable y, Returnable z, Returnable mark, Position position) { this.position = position; this.mark = mark; this.x = x; @@ -32,7 +30,7 @@ public class MarkFunction implements Function { RotationUtil.rotateVector(xz, arguments.getRotation()); - arguments.getBuffer().setMark(new Mark(mark.apply(implementationArguments)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); + arguments.getBuffer().setMark(mark.apply(implementationArguments), new Vector3(FastMath.floorToInt(xz.getX()), FastMath.floorToInt(y.apply(implementationArguments).doubleValue()), FastMath.floorToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld())); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StateFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StateFunction.java index 54f40462e..341a34d2d 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StateFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StateFunction.java @@ -33,7 +33,7 @@ public class StateFunction implements Function { Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); RotationUtil.rotateVector(xz, arguments.getRotation()); - arguments.getBuffer().addItem(new BufferedStateManipulator(main, data.apply(implementationArguments)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ()))); + arguments.getBuffer().addItem(new BufferedStateManipulator(main, data.apply(implementationArguments)), new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ())).toLocation(arguments.getBuffer().getOrigin().getWorld())); return null; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index 7a4c41184..3a23e54aa 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -65,7 +65,7 @@ public class StructureFunction implements Function { return null; } - Vector3 offset = new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).intValue(), FastMath.roundToInt(xz.getZ())); + Vector3 offset = new Vector3(FastMath.roundToInt(xz.getX()), y.apply(implementationArguments).doubleValue(), FastMath.roundToInt(xz.getZ())); return script.executeInBuffer(new IntermediateBuffer(arguments.getBuffer(), offset), arguments.getRandom(), arguments.getRotation().rotate(rotation1), arguments.getRecursions() + 1); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java index 80a74afe5..319534b78 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Buffer.java @@ -1,16 +1,14 @@ package com.dfsek.terra.api.structures.structure.buffer; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; -import com.dfsek.terra.api.structures.structure.buffer.items.Mark; public interface Buffer { - Buffer addItem(BufferedItem item, Vector3 location); + Buffer addItem(BufferedItem item, Location location); Location getOrigin(); - Mark getMark(Vector3 location); + String getMark(Location location); - Buffer setMark(Mark mark, Vector3 location); + Buffer setMark(String mark, Location location); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Cell.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Cell.java index ab0b6742e..faf4860ab 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Cell.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/Cell.java @@ -2,14 +2,13 @@ package com.dfsek.terra.api.structures.structure.buffer; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; -import com.dfsek.terra.api.structures.structure.buffer.items.Mark; import com.dfsek.terra.api.util.GlueList; import java.util.List; public class Cell implements BufferedItem { private final List items = new GlueList<>(); - private Mark mark = null; + private String mark = null; @Override @@ -21,11 +20,11 @@ public class Cell implements BufferedItem { items.add(item); } - public Mark getMark() { + public String getMark() { return mark; } - public void setMark(Mark mark) { + public void setMark(String mark) { this.mark = mark; } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java index 4011760c1..34250571f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/IntermediateBuffer.java @@ -3,7 +3,6 @@ package com.dfsek.terra.api.structures.structure.buffer; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; -import com.dfsek.terra.api.structures.structure.buffer.items.Mark; public class IntermediateBuffer implements Buffer { private final Buffer original; @@ -11,11 +10,11 @@ public class IntermediateBuffer implements Buffer { public IntermediateBuffer(Buffer original, Vector3 offset) { this.original = original; - this.offset = offset; + this.offset = offset.clone(); } @Override - public Buffer addItem(BufferedItem item, Vector3 location) { + public Buffer addItem(BufferedItem item, Location location) { return original.addItem(item, location.add(offset)); } @@ -25,12 +24,12 @@ public class IntermediateBuffer implements Buffer { } @Override - public Mark getMark(Vector3 location) { + public String getMark(Location location) { return original.getMark(location.add(offset)); } @Override - public Buffer setMark(Mark mark, Vector3 location) { + public Buffer setMark(String mark, Location location) { original.setMark(mark, location.add(offset)); return this; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java index 62261bf64..6ff3029c6 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/StructureBuffer.java @@ -1,17 +1,15 @@ package com.dfsek.terra.api.structures.structure.buffer; import com.dfsek.terra.api.math.vector.Location; -import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; -import com.dfsek.terra.api.structures.structure.buffer.items.Mark; import net.jafama.FastMath; import java.util.LinkedHashMap; import java.util.Map; public class StructureBuffer implements Buffer { - private final Map bufferedItemMap = new LinkedHashMap<>(); + private final Map bufferedItemMap = new LinkedHashMap<>(); private final Location origin; private boolean succeeded; @@ -33,13 +31,13 @@ public class StructureBuffer implements Buffer { } @Override - public Buffer addItem(BufferedItem item, Vector3 location) { + public Buffer addItem(BufferedItem item, Location location) { bufferedItemMap.computeIfAbsent(location, l -> new Cell()).add(item); return this; } @Override - public Mark getMark(Vector3 location) { + public String getMark(Location location) { Cell cell = bufferedItemMap.get(location); if(cell != null) { return cell.getMark(); @@ -48,7 +46,7 @@ public class StructureBuffer implements Buffer { } @Override - public Buffer setMark(Mark mark, Vector3 location) { + public Buffer setMark(String mark, Location location) { bufferedItemMap.computeIfAbsent(location, l -> new Cell()).setMark(mark); return this; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/Mark.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/Mark.java deleted file mode 100644 index 532030b87..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/Mark.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.dfsek.terra.api.structures.structure.buffer.items; - -public class Mark { - private final String content; - - public Mark(String content) { - this.content = content; - } - - public String getContent() { - return content; - } -} From 25ae2b3c9b3cb0916ae60fdca706056599db8e29 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 6 Jan 2021 01:11:13 -0700 Subject: [PATCH 197/210] drastically increase script loading speed via optimised token pipeline --- .../terra/api/structures/parser/Parser.java | 53 +++++---------- .../api/structures/parser/TokenHolder.java | 59 ----------------- .../api/structures/tokenizer/Tokenizer.java | 65 +++++++++++++++++-- .../tokenizer/exceptions/EOFException.java | 18 ++--- .../tokenizer/exceptions/FormatException.java | 18 ++--- .../exceptions/TokenizerException.java | 22 +++---- .../test/java/structure/TokenizerTest.java | 26 -------- 7 files changed, 95 insertions(+), 166 deletions(-) delete mode 100644 common/src/main/java/com/dfsek/terra/api/structures/parser/TokenHolder.java delete mode 100644 common/src/test/java/structure/TokenizerTest.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java index 8b948bfee..885ad7f49 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/parser/Parser.java @@ -44,7 +44,6 @@ import com.dfsek.terra.api.structures.parser.lang.variables.Variable; import com.dfsek.terra.api.structures.tokenizer.Position; import com.dfsek.terra.api.structures.tokenizer.Token; import com.dfsek.terra.api.structures.tokenizer.Tokenizer; -import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; import com.dfsek.terra.api.util.GlueList; import java.util.Collections; @@ -79,18 +78,7 @@ public class Parser { * @throws ParseException If parsing fails. */ public Block parse() throws ParseException { - Tokenizer tokenizer = new Tokenizer(data); - - TokenHolder tokens = new TokenHolder(); - try { - Token t = tokenizer.fetch(); - while(t != null) { - tokens.add(t); - t = tokenizer.fetch(); - } - } catch(TokenizerException e) { - throw new ParseException("Failed to tokenize input", new Position(0, 0), e); - } + Tokenizer tokens = new Tokenizer(data); // Parse ID ParserUtil.checkType(tokens.consume(), Token.Type.ID); // First token must be ID @@ -99,21 +87,12 @@ public class Parser { ParserUtil.checkType(tokens.consume(), Token.Type.STATEMENT_END); this.id = idToken.getContent(); - // Check for dangling brackets - int blockLevel = 0; - for(Token t : tokens.getTokens()) { - if(t.getType().equals(Token.Type.BLOCK_BEGIN)) blockLevel++; - else if(t.getType().equals(Token.Type.BLOCK_END)) blockLevel--; - if(blockLevel < 0) throw new ParseException("Dangling closing brace", t.getPosition()); - } - if(blockLevel != 0) - throw new ParseException("Dangling opening brace", tokens.getTokens().get(tokens.getTokens().size() - 1).getPosition()); return parseBlock(tokens, new HashMap<>(), false); } - private Keyword parseLoopLike(TokenHolder tokens, Map> variableMap, boolean loop) throws ParseException { + private Keyword parseLoopLike(Tokenizer tokens, Map> variableMap, boolean loop) throws ParseException { Token identifier = tokens.consume(); ParserUtil.checkType(identifier, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP); @@ -132,7 +111,7 @@ public class Parser { } } - private WhileKeyword parseWhileLoop(TokenHolder tokens, Map> variableMap, Position start) throws ParseException { + private WhileKeyword parseWhileLoop(Tokenizer tokens, Map> variableMap, Position start) throws ParseException { Returnable first = parseExpression(tokens, true, variableMap); ParserUtil.checkReturnType(first, Returnable.ReturnType.BOOLEAN); @@ -141,7 +120,7 @@ public class Parser { return new WhileKeyword(parseStatementBlock(tokens, variableMap, true), (Returnable) first, start); // While loop } - private IfKeyword parseIfStatement(TokenHolder tokens, Map> variableMap, Position start, boolean loop) throws ParseException { + private IfKeyword parseIfStatement(Tokenizer tokens, Map> variableMap, Position start, boolean loop) throws ParseException { Returnable condition = parseExpression(tokens, true, variableMap); ParserUtil.checkReturnType(condition, Returnable.ReturnType.BOOLEAN); @@ -168,7 +147,7 @@ public class Parser { return new IfKeyword(statement, (Returnable) condition, elseIf, elseBlock, start); // If statement } - private Block parseStatementBlock(TokenHolder tokens, Map> variableMap, boolean loop) throws ParseException { + private Block parseStatementBlock(Tokenizer tokens, Map> variableMap, boolean loop) throws ParseException { if(tokens.get().getType().equals(Token.Type.BLOCK_BEGIN)) { ParserUtil.checkType(tokens.consume(), Token.Type.BLOCK_BEGIN); @@ -183,7 +162,7 @@ public class Parser { } } - private ForKeyword parseForLoop(TokenHolder tokens, Map> old, Position start) throws ParseException { + private ForKeyword parseForLoop(Tokenizer tokens, Map> old, Position start) throws ParseException { Map> variableMap = new HashMap<>(old); // New scope Token f = tokens.get(); ParserUtil.checkType(f, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.IDENTIFIER); @@ -216,7 +195,7 @@ public class Parser { return new ForKeyword(parseStatementBlock(tokens, variableMap, true), initializer, (Returnable) conditional, incrementer, start); } - private Returnable parseExpression(TokenHolder tokens, boolean full, Map> variableMap) throws ParseException { + private Returnable parseExpression(Tokenizer tokens, boolean full, Map> variableMap) throws ParseException { boolean booleanInverted = false; // Check for boolean not operator boolean negate = false; if(tokens.get().getType().equals(Token.Type.BOOLEAN_NOT)) { @@ -259,7 +238,7 @@ public class Parser { return expression; } - private ConstantExpression parseConstantExpression(TokenHolder tokens) throws ParseException { + private ConstantExpression parseConstantExpression(Tokenizer tokens) throws ParseException { Token constantToken = tokens.consume(); Position position = constantToken.getPosition(); switch(constantToken.getType()) { @@ -275,7 +254,7 @@ public class Parser { } } - private Returnable parseGroup(TokenHolder tokens, Map> variableMap) throws ParseException { + private Returnable parseGroup(Tokenizer tokens, Map> variableMap) throws ParseException { ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_BEGIN); Returnable expression = parseExpression(tokens, true, variableMap); // Parse inside of group as a separate expression ParserUtil.checkType(tokens.consume(), Token.Type.GROUP_END); @@ -283,7 +262,7 @@ public class Parser { } - private BinaryOperation parseBinaryOperation(Returnable left, TokenHolder tokens, Map> variableMap) throws ParseException { + private BinaryOperation parseBinaryOperation(Returnable left, Tokenizer tokens, Map> variableMap) throws ParseException { Token binaryOperator = tokens.consume(); ParserUtil.checkBinaryOperator(binaryOperator); @@ -337,7 +316,7 @@ public class Parser { } } - private Variable parseVariableDeclaration(TokenHolder tokens, Returnable.ReturnType type) throws ParseException { + private Variable parseVariableDeclaration(Tokenizer tokens, Returnable.ReturnType type) throws ParseException { ParserUtil.checkVarType(tokens.get(), type); // Check for type mismatch switch(type) { case NUMBER: @@ -350,7 +329,7 @@ public class Parser { throw new UnsupportedOperationException("Unsupported variable type: " + type); } - private Block parseBlock(TokenHolder tokens, Map> superVars, boolean loop) throws ParseException { + private Block parseBlock(Tokenizer tokens, Map> superVars, boolean loop) throws ParseException { List> parsedItems = new GlueList<>(); Map> parsedVariables = new HashMap<>(superVars); // New hashmap as to not mutate parent scope's declarations. @@ -366,7 +345,7 @@ public class Parser { return new Block(parsedItems, first.getPosition()); } - private Item parseItem(TokenHolder tokens, Map> variableMap, boolean loop) throws ParseException { + private Item parseItem(Tokenizer tokens, Map> variableMap, boolean loop) throws ParseException { Token token = tokens.get(); if(loop) ParserUtil.checkType(token, Token.Type.IDENTIFIER, Token.Type.IF_STATEMENT, Token.Type.WHILE_LOOP, Token.Type.FOR_LOOP, Token.Type.NUMBER_VARIABLE, Token.Type.STRING_VARIABLE, Token.Type.BOOLEAN_VARIABLE, Token.Type.RETURN, Token.Type.BREAK, Token.Type.CONTINUE, Token.Type.FAIL); @@ -401,7 +380,7 @@ public class Parser { else throw new UnsupportedOperationException("Unexpected token " + token.getType() + ": " + token.getPosition()); } - private Assignment parseAssignment(Variable variable, TokenHolder tokens, Map> variableMap) throws ParseException { + private Assignment parseAssignment(Variable variable, Tokenizer tokens, Map> variableMap) throws ParseException { Token name = tokens.get(); ParserUtil.checkType(tokens.consume(), Token.Type.IDENTIFIER); @@ -415,7 +394,7 @@ public class Parser { return new Assignment<>((Variable) variable, (Returnable) expression, name.getPosition()); } - private Function parseFunction(TokenHolder tokens, boolean fullStatement, Map> variableMap) throws ParseException { + private Function parseFunction(Tokenizer tokens, boolean fullStatement, Map> variableMap) throws ParseException { Token identifier = tokens.consume(); ParserUtil.checkType(identifier, Token.Type.IDENTIFIER); // First token must be identifier @@ -449,7 +428,7 @@ public class Parser { } - private List> getArgs(TokenHolder tokens, Map> variableMap) throws ParseException { + private List> getArgs(Tokenizer tokens, Map> variableMap) throws ParseException { List> args = new GlueList<>(); while(!tokens.get().getType().equals(Token.Type.GROUP_END)) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/parser/TokenHolder.java b/common/src/main/java/com/dfsek/terra/api/structures/parser/TokenHolder.java deleted file mode 100644 index b8bb90023..000000000 --- a/common/src/main/java/com/dfsek/terra/api/structures/parser/TokenHolder.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.dfsek.terra.api.structures.parser; - -import com.dfsek.terra.api.structures.parser.exceptions.ParseException; -import com.dfsek.terra.api.structures.tokenizer.Position; -import com.dfsek.terra.api.structures.tokenizer.Token; -import com.dfsek.terra.api.util.GlueList; - -import java.util.List; - -/** - * Data structure to hold tokens, where items are inserted at the top and removed from the bottom. - */ -public class TokenHolder { - private final List tokens = new GlueList<>(); - private Position last; - - /** - * Add a token to the top of the stack. - * - * @param token Token to add - */ - public void add(Token token) { - tokens.add(token); - } - - /** - * Get the token at the bottom of the stack. - * - * @return First token - * @throws ParseException If stack is empty - */ - public Token get() throws ParseException { - if(!hasNext()) throw new ParseException("Unexpected end of input", last); - Token token = tokens.get(0); - last = token.getPosition(); - return token; - } - - /** - * Consume (get and remove) the token at the bottom of the stack. - * - * @return First token - * @throws ParseException If stack is empty - */ - public Token consume() throws ParseException { - if(!hasNext()) throw new ParseException("Unexpected end of input", last); - Token token = tokens.remove(0); - last = token.getPosition(); - return token; - } - - public List getTokens() { - return tokens; - } - - public boolean hasNext() { - return tokens.size() > 0; - } -} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java index d856d4653..2fb3e4e1f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/Tokenizer.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.structures.tokenizer; +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.tokenizer.exceptions.EOFException; import com.dfsek.terra.api.structures.tokenizer.exceptions.FormatException; import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; @@ -7,18 +8,67 @@ import com.google.common.collect.Sets; import java.io.StringReader; import java.util.Set; +import java.util.Stack; public class Tokenizer { - private final Lookahead reader; - public static final Set syntaxSignificant = Sets.newHashSet(';', '(', ')', '"', ',', '\\', '=', '{', '}', '+', '-', '*', '/', '>', '<', '!'); // Reserved chars + private final Lookahead reader; + private final Stack brackets = new Stack<>(); + private Token current; - - public Tokenizer(String data) { + public Tokenizer(String data) throws ParseException { reader = new Lookahead(new StringReader(data + '\0')); + current = fetchCheck(); } - public Token fetch() throws TokenizerException { + /** + * Get the first token. + * + * @return First token + * @throws ParseException If token does not exist + */ + public Token get() throws ParseException { + if(!hasNext()) throw new ParseException("Unexpected end of input", current.getPosition()); + return current; + } + + /** + * Consume (get and remove) the first token. + * + * @return First token + * @throws ParseException If token does not exist + */ + public Token consume() throws ParseException { + if(!hasNext()) throw new ParseException("Unexpected end of input", current.getPosition()); + Token temp = current; + current = fetchCheck(); + return temp; + } + + /** + * Whether this {@code Tokenizer} contains additional tokens. + * + * @return {@code true} if more tokens are present, otherwise {@code false} + */ + public boolean hasNext() { + return !(current == null); + } + + private Token fetchCheck() throws ParseException { + Token fetch = fetch(); + if(fetch != null) { + if(fetch.getType().equals(Token.Type.BLOCK_BEGIN)) brackets.push(fetch); // Opening bracket + else if(fetch.getType().equals(Token.Type.BLOCK_END)) { + if(!brackets.isEmpty()) brackets.pop(); + else throw new ParseException("Dangling opening brace", new Position(0, 0)); + } + } else if(!brackets.isEmpty()) { + throw new ParseException("Dangling closing brace", brackets.peek().getPosition()); + } + return fetch; + } + + private Token fetch() throws TokenizerException { while(!reader.current().isEOF() && reader.current().isWhitespace()) reader.consume(); while(reader.matches("//", true)) skipLine(); // Skip line if comment @@ -66,7 +116,7 @@ public class Tokenizer { continue; } else ignoreNext = false; if(reader.current().isEOF()) - throw new FormatException("No end of string literal found. " + reader.getLine() + ":" + reader.getIndex()); + throw new FormatException("No end of string literal found. ", new Position(reader.getLine(), reader.getIndex())); string.append(reader.consume()); } reader.consume(); // Consume last quote @@ -166,6 +216,7 @@ public class Tokenizer { } private void skipTo(String s) throws EOFException { + Position begin = new Position(reader.getLine(), reader.getIndex()); while(!reader.current().isEOF()) { if(reader.matches(s, true)) { consumeWhitespace(); @@ -173,7 +224,7 @@ public class Tokenizer { } reader.consume(); } - throw new EOFException("No end of expression found."); + throw new EOFException("No end of expression found.", begin); } public boolean isSyntaxSignificant(char c) { diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/EOFException.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/EOFException.java index 2750b86f9..8602e6c2f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/EOFException.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/EOFException.java @@ -1,20 +1,14 @@ package com.dfsek.terra.api.structures.tokenizer.exceptions; +import com.dfsek.terra.api.structures.tokenizer.Position; + public class EOFException extends TokenizerException { - public EOFException(String s) { - super(s); + public EOFException(String message, Position position) { + super(message, position); } - public EOFException() { - super(); - } - - public EOFException(String message, Throwable cause) { - super(message, cause); - } - - public EOFException(Throwable cause) { - super(cause); + public EOFException(String message, Position position, Throwable cause) { + super(message, position, cause); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/FormatException.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/FormatException.java index c8b8414ca..039c8fe60 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/FormatException.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/FormatException.java @@ -1,20 +1,14 @@ package com.dfsek.terra.api.structures.tokenizer.exceptions; +import com.dfsek.terra.api.structures.tokenizer.Position; + public class FormatException extends TokenizerException { - public FormatException(String s) { - super(s); + public FormatException(String message, Position position) { + super(message, position); } - public FormatException() { - super(); - } - - public FormatException(String message, Throwable cause) { - super(message, cause); - } - - public FormatException(Throwable cause) { - super(cause); + public FormatException(String message, Position position, Throwable cause) { + super(message, position, cause); } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/TokenizerException.java b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/TokenizerException.java index 282eb4886..994a65361 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/TokenizerException.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/tokenizer/exceptions/TokenizerException.java @@ -1,19 +1,15 @@ package com.dfsek.terra.api.structures.tokenizer.exceptions; -public abstract class TokenizerException extends Exception { - public TokenizerException(String s) { - super(s); +import com.dfsek.terra.api.structures.parser.exceptions.ParseException; +import com.dfsek.terra.api.structures.tokenizer.Position; + +public abstract class TokenizerException extends ParseException { + + public TokenizerException(String message, Position position) { + super(message, position); } - public TokenizerException() { - super(); - } - - public TokenizerException(String message, Throwable cause) { - super(message, cause); - } - - public TokenizerException(Throwable cause) { - super(cause); + public TokenizerException(String message, Position position, Throwable cause) { + super(message, position, cause); } } diff --git a/common/src/test/java/structure/TokenizerTest.java b/common/src/test/java/structure/TokenizerTest.java deleted file mode 100644 index 994171733..000000000 --- a/common/src/test/java/structure/TokenizerTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package structure; - -import com.dfsek.terra.api.structures.tokenizer.Token; -import com.dfsek.terra.api.structures.tokenizer.Tokenizer; -import com.dfsek.terra.api.structures.tokenizer.exceptions.TokenizerException; -import org.apache.commons.io.IOUtils; -import org.junit.jupiter.api.Test; - -import java.io.IOException; - -public class TokenizerTest { - @Test - public void tokens() throws IOException, TokenizerException { - Tokenizer tokenizer = new Tokenizer(IOUtils.toString(getClass().getResourceAsStream("/test.tesf"))); - // Actual run - long l = System.nanoTime(); - - Token t = tokenizer.fetch(); - while(t != null) { - System.out.println(t); - t = tokenizer.fetch(); - } - - System.out.println((double) (System.nanoTime() - l) / 1000000); - } -} From 512edae9c69390c21c62ab85495cc8ad1aa1f87e Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 6 Jan 2021 10:57:34 -0700 Subject: [PATCH 198/210] Multi-version support for 1.13-1.16 --- .../script/functions/BlockFunction.java | 6 +- .../dfsek/terra/registry/FloraRegistry.java | 57 ++++++++++--------- .../dfsek/terra/bukkit/TerraBukkitPlugin.java | 44 ++++++++++++++ .../terra/bukkit/world/BukkitAdapter.java | 27 --------- .../world/block/data/BukkitBlockData.java | 5 +- .../bukkit/world/block/data/BukkitWall.java | 30 +++++++++- .../bukkit/src/main/resources/plugin.yml | 2 +- 7 files changed, 111 insertions(+), 60 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java index 5e0cf7543..d32e9e01f 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/BlockFunction.java @@ -25,7 +25,11 @@ public class BlockFunction implements Function { this.position = position; if(!(data instanceof ConstantExpression)) throw new ParseException("Block data must be constant", data.getPosition()); - this.data = main.getWorldHandle().createBlockData(((ConstantExpression) data).getConstant()); + try { + this.data = main.getWorldHandle().createBlockData(((ConstantExpression) data).getConstant()); + } catch(IllegalArgumentException e) { + throw new ParseException("Could not parse block data", data.getPosition(), e); + } this.x = x; this.y = y; this.z = z; diff --git a/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java b/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java index e15e68fe1..194948b45 100644 --- a/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java +++ b/common/src/main/java/com/dfsek/terra/registry/FloraRegistry.java @@ -9,6 +9,7 @@ import com.dfsek.terra.util.MaterialSet; import java.util.Arrays; import java.util.Collections; +import java.util.concurrent.Callable; public class FloraRegistry extends TerraRegistry { private final TerraPlugin main; @@ -16,48 +17,48 @@ public class FloraRegistry extends TerraRegistry { public FloraRegistry(TerraPlugin main) { this.main = main; MaterialSet grassy = MaterialSet.get(create("minecraft:grass_block"), create("minecraft:podzol")); - addItem("TALL_GRASS", new ConstantFlora(grassy, Arrays.asList(data("minecraft:tall_grass[half=lower]"), data("minecraft:tall_grass[half=upper]")))); - addItem("TALL_FERN", new ConstantFlora(grassy, Arrays.asList(data("minecraft:large_fern[half=lower]"), data("minecraft:large_fern[half=upper]")))); - addItem("SUNFLOWER", new ConstantFlora(grassy, Arrays.asList(data("minecraft:sunflower[half=lower]"), data("minecraft:sunflower[half=upper]")))); - addItem("ROSE_BUSH", new ConstantFlora(grassy, Arrays.asList(data("minecraft:rose_bush[half=lower]"), data("minecraft:rose_bush[half=upper]")))); - addItem("LILAC", new ConstantFlora(grassy, Arrays.asList(data("minecraft:lilac[half=lower]"), data("minecraft:lilac[half=upper]")))); - addItem("PEONY", new ConstantFlora(grassy, Arrays.asList(data("minecraft:peony[half=lower]"), data("minecraft:peony[half=upper]")))); - addItem("GRASS", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:grass")))); - addItem("FERN", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:fern")))); - addItem("AZURE_BLUET", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:azure_bluet")))); - addItem("LILY_OF_THE_VALLEY", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:lily_of_the_valley")))); - addItem("BLUE_ORCHID", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:blue_orchid")))); - addItem("POPPY", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:poppy")))); - addItem("DANDELION", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:dandelion")))); - addItem("WITHER_ROSE", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:wither_rose")))); - addItem("DEAD_BUSH", new ConstantFlora(MaterialSet.get(create("minecraft:terracotta"), create("minecraft:black_terracotta"), + addItem("TALL_GRASS", () -> new ConstantFlora(grassy, Arrays.asList(data("minecraft:tall_grass[half=lower]"), data("minecraft:tall_grass[half=upper]")))); + addItem("TALL_FERN", () -> new ConstantFlora(grassy, Arrays.asList(data("minecraft:large_fern[half=lower]"), data("minecraft:large_fern[half=upper]")))); + addItem("SUNFLOWER", () -> new ConstantFlora(grassy, Arrays.asList(data("minecraft:sunflower[half=lower]"), data("minecraft:sunflower[half=upper]")))); + addItem("ROSE_BUSH", () -> new ConstantFlora(grassy, Arrays.asList(data("minecraft:rose_bush[half=lower]"), data("minecraft:rose_bush[half=upper]")))); + addItem("LILAC", () -> new ConstantFlora(grassy, Arrays.asList(data("minecraft:lilac[half=lower]"), data("minecraft:lilac[half=upper]")))); + addItem("PEONY", () -> new ConstantFlora(grassy, Arrays.asList(data("minecraft:peony[half=lower]"), data("minecraft:peony[half=upper]")))); + addItem("GRASS", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:grass")))); + addItem("FERN", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:fern")))); + addItem("AZURE_BLUET", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:azure_bluet")))); + addItem("LILY_OF_THE_VALLEY", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:lily_of_the_valley")))); + addItem("BLUE_ORCHID", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:blue_orchid")))); + addItem("POPPY", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:poppy")))); + addItem("DANDELION", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:dandelion")))); + addItem("WITHER_ROSE", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:wither_rose")))); + addItem("DEAD_BUSH", () -> new ConstantFlora(MaterialSet.get(create("minecraft:terracotta"), create("minecraft:black_terracotta"), create("minecraft:blue_terracotta"), create("minecraft:brown_terracotta"), create("minecraft:cyan_terracotta"), create("minecraft:gray_terracotta"), create("minecraft:green_terracotta"), create("minecraft:light_blue_terracotta"), create("minecraft:light_gray_terracotta"), create("minecraft:lime_terracotta"), create("minecraft:magenta_terracotta"), create("minecraft:orange_terracotta"), create("minecraft:pink_terracotta"), create("minecraft:purple_terracotta"), create("minecraft:red_terracotta"), create("minecraft:white_terracotta"), create("minecraft:yellow_terracotta"), create("minecraft:red_sand"), create("minecraft:sand")), Collections.singletonList(data("minecraft:dead_bush")))); - addItem("RED_TULIP", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:red_tulip")))); - addItem("ORANGE_TULIP", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:orange_tulip")))); - addItem("WHITE_TULIP", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:white_tulip")))); - addItem("PINK_TULIP", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:pink_tulip")))); - addItem("OXEYE_DAISY", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:oxeye_daisy")))); - addItem("ALLIUM", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:allium")))); - addItem("CORNFLOWER", new ConstantFlora(grassy, Collections.singletonList(data("minecraft:cornflower")))); - addItem("LILY_PAD", new ConstantFlora(MaterialSet.get(create("minecraft:water")), Collections.singletonList(data("minecraft:lily_pad")))); + addItem("RED_TULIP", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:red_tulip")))); + addItem("ORANGE_TULIP", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:orange_tulip")))); + addItem("WHITE_TULIP", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:white_tulip")))); + addItem("PINK_TULIP", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:pink_tulip")))); + addItem("OXEYE_DAISY", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:oxeye_daisy")))); + addItem("ALLIUM", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:allium")))); + addItem("CORNFLOWER", () -> new ConstantFlora(grassy, Collections.singletonList(data("minecraft:cornflower")))); + addItem("LILY_PAD", () -> new ConstantFlora(MaterialSet.get(create("minecraft:water")), Collections.singletonList(data("minecraft:lily_pad")))); MaterialSet mushroom = MaterialSet.get(create("minecraft:grass_block"), create("minecraft:stone"), create("minecraft:podzol"), create("minecraft:netherrack"), create("minecraft:mycelium")); - addItem("RED_MUSHROOM", new ConstantFlora(mushroom, Collections.singletonList(data("minecraft:red_mushroom")))); - addItem("BROWN_MUSHROOM", new ConstantFlora(mushroom, Collections.singletonList(data("minecraft:brown_mushroom")))); + addItem("RED_MUSHROOM", () -> new ConstantFlora(mushroom, Collections.singletonList(data("minecraft:red_mushroom")))); + addItem("BROWN_MUSHROOM", () -> new ConstantFlora(mushroom, Collections.singletonList(data("minecraft:brown_mushroom")))); } private MaterialData create(String s) { return main.getWorldHandle().createMaterialData(s); } - private void addItem(String id, ConstantFlora flora) { + private void addItem(String id, Callable flora) { try { - add(id, flora); - } catch(IllegalArgumentException e) { + add(id, flora.call()); + } catch(Exception e) { main.getLogger().warning("Failed to load Flora item: " + id + ": " + e.getMessage()); } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java index 120c6dc59..d39ff661c 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/TerraBukkitPlugin.java @@ -55,6 +55,17 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { private WorldHandle handle = new BukkitWorldHandle(this); private final GenericLoaders genericLoaders = new GenericLoaders(this); + public static final Version BUKKIT_VERSION; + + static { + String ver = Bukkit.getServer().getClass().getPackage().getName(); + if(ver.contains("1_16")) BUKKIT_VERSION = Version.V1_16; + else if(ver.contains("1_15")) BUKKIT_VERSION = Version.V1_15; + else if(ver.contains("1_14")) BUKKIT_VERSION = Version.V1_14; + else if(ver.contains("1_13")) BUKKIT_VERSION = Version.V1_13; + else BUKKIT_VERSION = Version.UNKNOWN; + } + public void reload() { Map newMap = new HashMap<>(); @@ -96,6 +107,11 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { public void onEnable() { Debug.setLogger(getLogger()); // Set debug logger. + getLogger().info("Running on version " + BUKKIT_VERSION); + if(BUKKIT_VERSION.equals(Version.UNKNOWN)) { + getLogger().warning("Terra is running on an unknown Bukkit version. Proceed with caution."); + } + ((BukkitWorldHandle) handle).setTreeTransformer(new Transformer.Builder() .addTransform(id -> new BukkitTree(TreeType.valueOf(id), this)) // First try getting directly from enum .addTransform(new MapTransform() // Then try map of less stupid names @@ -196,4 +212,32 @@ public class TerraBukkitPlugin extends JavaPlugin implements TerraPlugin { .registerLoader(EntityType.class, (t, o, l) -> EntityType.valueOf((String) o)); genericLoaders.register(registry); } + + public enum Version { + V1_13(13), + + V1_14(14), + + V1_15(15), + + V1_16(16), + + UNKNOWN(Integer.MAX_VALUE); // Assume unknown version is latest. + + private final int index; + + Version(int index) { + this.index = index; + } + + /** + * Gets if this version is above or equal to another. + * + * @param other Other version + * @return Whether this version is equal to or later than other. + */ + public boolean above(Version other) { + return this.index >= other.index; + } + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java index 7e522a62a..b7ba7da2f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java @@ -14,7 +14,6 @@ import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.bukkit.BukkitCommandSender; import org.bukkit.Location; -import org.bukkit.block.data.type.Wall; import org.bukkit.util.Vector; /** @@ -300,32 +299,6 @@ public final class BukkitAdapter { } } - public static Wall.Height adapt(com.dfsek.terra.api.platform.block.data.Wall.Height height) { - switch(height) { - case NONE: - return Wall.Height.NONE; - case LOW: - return Wall.Height.LOW; - case TALL: - return Wall.Height.TALL; - default: - throw new IllegalStateException(); - } - } - - public static com.dfsek.terra.api.platform.block.data.Wall.Height adapt(Wall.Height height) { - switch(height) { - case TALL: - return com.dfsek.terra.api.platform.block.data.Wall.Height.TALL; - case LOW: - return com.dfsek.terra.api.platform.block.data.Wall.Height.LOW; - case NONE: - return com.dfsek.terra.api.platform.block.data.Wall.Height.NONE; - default: - throw new IllegalStateException(); - } - } - public static Location adapt(com.dfsek.terra.api.math.vector.Location location) { return new Location(((BukkitWorld) location.getWorld()).getHandle(), location.getX(), location.getY(), location.getZ()); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java index 0b8b2aa13..dc3295f73 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitBlockData.java @@ -2,6 +2,7 @@ package com.dfsek.terra.bukkit.world.block.data; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.platform.block.MaterialData; +import com.dfsek.terra.bukkit.TerraBukkitPlugin; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; import org.bukkit.block.data.AnaloguePowerable; import org.bukkit.block.data.Directional; @@ -27,7 +28,9 @@ public class BukkitBlockData implements BlockData { if(bukkitData instanceof Rail) return new BukkitRail((Rail) bukkitData); if(bukkitData instanceof Stairs) return new BukkitStairs((Stairs) bukkitData); if(bukkitData instanceof Slab) return new BukkitSlab((Slab) bukkitData); - if(bukkitData instanceof Wall) return new BukkitWall((Wall) bukkitData); + if(TerraBukkitPlugin.BUKKIT_VERSION.above(TerraBukkitPlugin.Version.V1_16) && bukkitData instanceof Wall) { // Wall only exists on 1.16 and up. + return new BukkitWall((Wall) bukkitData); + } if(bukkitData instanceof RedstoneWire) return new BukkitRedstoneWire((RedstoneWire) bukkitData); if(bukkitData instanceof AnaloguePowerable) return new BukkitAnaloguePowerable((AnaloguePowerable) bukkitData); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWall.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWall.java index 5fffd7802..2addb83b7 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWall.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/data/BukkitWall.java @@ -19,13 +19,39 @@ public class BukkitWall extends BukkitWaterlogged implements Wall { ((org.bukkit.block.data.type.Wall) getHandle()).setUp(up); } + public static org.bukkit.block.data.type.Wall.Height adapt(com.dfsek.terra.api.platform.block.data.Wall.Height height) { + switch(height) { + case NONE: + return org.bukkit.block.data.type.Wall.Height.NONE; + case LOW: + return org.bukkit.block.data.type.Wall.Height.LOW; + case TALL: + return org.bukkit.block.data.type.Wall.Height.TALL; + default: + throw new IllegalStateException(); + } + } + + public static com.dfsek.terra.api.platform.block.data.Wall.Height adapt(org.bukkit.block.data.type.Wall.Height height) { + switch(height) { + case TALL: + return com.dfsek.terra.api.platform.block.data.Wall.Height.TALL; + case LOW: + return com.dfsek.terra.api.platform.block.data.Wall.Height.LOW; + case NONE: + return com.dfsek.terra.api.platform.block.data.Wall.Height.NONE; + default: + throw new IllegalStateException(); + } + } + @Override public void setHeight(BlockFace face, Height height) { - ((org.bukkit.block.data.type.Wall) getHandle()).setHeight(BukkitAdapter.adapt(face), BukkitAdapter.adapt(height)); + ((org.bukkit.block.data.type.Wall) getHandle()).setHeight(BukkitAdapter.adapt(face), adapt(height)); } @Override public Height getHeight(BlockFace face) { - return BukkitAdapter.adapt(((org.bukkit.block.data.type.Wall) getHandle()).getHeight(BukkitAdapter.adapt(face))); + return adapt(((org.bukkit.block.data.type.Wall) getHandle()).getHeight(BukkitAdapter.adapt(face))); } } diff --git a/platforms/bukkit/src/main/resources/plugin.yml b/platforms/bukkit/src/main/resources/plugin.yml index 985ddc05f..0b0a1fafc 100644 --- a/platforms/bukkit/src/main/resources/plugin.yml +++ b/platforms/bukkit/src/main/resources/plugin.yml @@ -3,7 +3,7 @@ main: "com.dfsek.terra.bukkit.TerraBukkitPlugin" version: "@VERSION@" load: "STARTUP" author: dfsek -api-version: "1.16" +api-version: "1.13" description: "An insanely powerful free & open-source data-driven world generator." softdepend: [ "WorldEdit" ] commands: From 23d8a0aeebbe2fb69477b9e62ead32d6d87ce8a9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 6 Jan 2021 11:56:17 -0700 Subject: [PATCH 199/210] skip over buffer when pasting trees --- .../structures/script/StructureScript.java | 6 +++ .../structure/buffer/DirectBuffer.java | 41 +++++++++++++++++++ .../population/items/tree/TerraTree.java | 2 +- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/DirectBuffer.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 79cb7e2e6..e50d9e835 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -24,6 +24,7 @@ import com.dfsek.terra.api.structures.script.builders.UnaryNumberFunctionBuilder import com.dfsek.terra.api.structures.script.builders.UnaryStringFunctionBuilder; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; +import com.dfsek.terra.api.structures.structure.buffer.DirectBuffer; import com.dfsek.terra.api.structures.structure.buffer.StructureBuffer; import com.dfsek.terra.debug.Debug; import com.dfsek.terra.generation.math.SamplerCache; @@ -128,6 +129,11 @@ public class StructureScript { return !block.apply(new TerraImplementationArguments(buffer, rotation, random, recursions)).getLevel().equals(Block.ReturnLevel.FAIL); } + public boolean executeDirect(Location location, Random random, Rotation rotation) { + DirectBuffer buffer = new DirectBuffer(location); + return !block.apply(new TerraImplementationArguments(buffer, rotation, random, 0)).getLevel().equals(Block.ReturnLevel.FAIL); + } + public String getId() { return id; } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/DirectBuffer.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/DirectBuffer.java new file mode 100644 index 000000000..40881ec0c --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/DirectBuffer.java @@ -0,0 +1,41 @@ +package com.dfsek.terra.api.structures.structure.buffer; + +import com.dfsek.terra.api.math.vector.Location; +import com.dfsek.terra.api.structures.structure.buffer.items.BufferedItem; + +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Buffer implementation that directly pastes to the world. + */ +public class DirectBuffer implements Buffer { + private final Location origin; + private final Map marks = new LinkedHashMap<>(); + + public DirectBuffer(Location origin) { + this.origin = origin; + } + + @Override + public Buffer addItem(BufferedItem item, Location location) { + item.paste(origin.clone().add(location)); + return this; + } + + @Override + public Location getOrigin() { + return origin; + } + + @Override + public String getMark(Location location) { + return marks.get(location); + } + + @Override + public Buffer setMark(String mark, Location location) { + marks.put(location, mark); + return this; + } +} diff --git a/common/src/main/java/com/dfsek/terra/population/items/tree/TerraTree.java b/common/src/main/java/com/dfsek/terra/population/items/tree/TerraTree.java index b50220f34..1bfa207af 100644 --- a/common/src/main/java/com/dfsek/terra/population/items/tree/TerraTree.java +++ b/common/src/main/java/com/dfsek/terra/population/items/tree/TerraTree.java @@ -22,7 +22,7 @@ public class TerraTree implements Tree { @Override public synchronized boolean plant(Location location, Random random) { - return structure.get(random).execute(location.clone().add(0, yOffset, 0), random, Rotation.fromDegrees(90 * random.nextInt(4))); + return structure.get(random).executeDirect(location.clone().add(0, yOffset, 0), random, Rotation.fromDegrees(90 * random.nextInt(4))); } @Override From e9d0c14eeea009550a0d8cf17e9d140dd7079726 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 6 Jan 2021 13:32:46 -0700 Subject: [PATCH 200/210] cleanup biomegrids --- .../terra/biome/grid/master/TerraBiomeGrid.java | 8 ++++---- .../biome/grid/master/TerraRadialBiomeGrid.java | 4 ++-- .../grid/master/TerraStandardBiomeGrid.java | 4 ++-- .../terra/config/base/ConfigPackTemplate.java | 16 ---------------- .../config/templates/BiomeGridTemplate.java | 14 +++++++++++--- .../terra/config/templates/BiomeTemplate.java | 1 - 6 files changed, 19 insertions(+), 28 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java index 322cf6e17..a0fec53ec 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraBiomeGrid.java @@ -12,8 +12,8 @@ import com.dfsek.terra.debug.Debug; public abstract class TerraBiomeGrid extends BiomeGrid { protected final BiomeZone zone; - public TerraBiomeGrid(long seed, double freq1, double freq2, int sizeX, int sizeZ, BiomeZone zone) { - super(seed, freq1, freq2, sizeX, sizeZ); + public TerraBiomeGrid(long seed, int sizeX, int sizeZ, BiomeZone zone) { + super(seed, 0, 0, sizeX, sizeZ); this.zone = zone; } @@ -64,8 +64,8 @@ public abstract class TerraBiomeGrid extends BiomeGrid { if(template.getGridType().equals(TerraBiomeGrid.Type.RADIAL)) { BiomeGrid internal = config.getBiomeGrid(template.getRadialInternalGrid()).build(seed, config); - return new TerraRadialBiomeGrid(seed, template.getGridFreqX(), template.getGridFreqZ(), zone, config, template.getRadialGridRadius(), internal); - } else return new TerraStandardBiomeGrid(seed, template.getGridFreqX(), template.getGridFreqZ(), zone, config); + return new TerraRadialBiomeGrid(seed, zone, config, template.getRadialGridRadius(), internal); + } else return new TerraStandardBiomeGrid(seed, zone, config); } } } diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java index 753d8b8b5..4bd66f86b 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraRadialBiomeGrid.java @@ -20,8 +20,8 @@ public class TerraRadialBiomeGrid extends TerraBiomeGrid { private CoordinatePerturb perturb; private ErosionNoise erode; - public TerraRadialBiomeGrid(long seed, double freq1, double freq2, BiomeZone zone, ConfigPack c, double radius, BiomeGrid internal) { - super(seed, freq1, freq2, 0, 0, zone); + public TerraRadialBiomeGrid(long seed, BiomeZone zone, ConfigPack c, double radius, BiomeGrid internal) { + super(seed, 0, 0, zone); ConfigPackTemplate t = c.getTemplate(); if(c.getTemplate().isBlend()) { perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), seed); diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java index 8e5548f88..e17e88fbb 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/master/TerraStandardBiomeGrid.java @@ -16,8 +16,8 @@ public class TerraStandardBiomeGrid extends TerraBiomeGrid { private CoordinatePerturb perturb; private ErosionNoise erode; - public TerraStandardBiomeGrid(long seed, double freq1, double freq2, BiomeZone zone, ConfigPack c) { - super(seed, freq1, freq2, 0, 0, zone); + public TerraStandardBiomeGrid(long seed, BiomeZone zone, ConfigPack c) { + super(seed, 0, 0, zone); ConfigPackTemplate t = c.getTemplate(); if(c.getTemplate().isBlend()) { perturb = new CoordinatePerturb(t.getBlendFreq(), t.getBlendAmp(), seed); diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java index fe0500817..b3afdd471 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java @@ -29,14 +29,6 @@ public class ConfigPackTemplate implements ValidatedConfigTemplate { @Value("grids") private List grids; - @Value("frequencies.grid-x") - @Default - private int gridFreqX = 4096; - - @Value("frequencies.grid-z") - @Default - private int gridFreqZ = 4096; - @Value("frequencies.zone") @Default private int zoneFreq = 2048; @@ -185,14 +177,6 @@ public class ConfigPackTemplate implements ValidatedConfigTemplate { return grids; } - public int getGridFreqX() { - return gridFreqX; - } - - public int getGridFreqZ() { - return gridFreqZ; - } - public int getZoneFreq() { return zoneFreq; } diff --git a/common/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java index 885885c3e..b508f9c9f 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/BiomeGridTemplate.java @@ -8,18 +8,26 @@ import java.util.List; @SuppressWarnings("unused") public class BiomeGridTemplate extends AbstractableTemplate { + @Value("id") + private String id; + /** + * A 2D array of {@link Biome} IDs that make up this grid. + */ @Value("grid") @Abstractable private List> grid; - @Value("id") - private String id; - + /** + * X frequency of noise function + */ @Value("frequency.x") @Abstractable private double xFreq; + /** + * Z frequency of noise function + */ @Value("frequency.z") @Abstractable private double zFreq; diff --git a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java index 201d1ee89..61bc18964 100644 --- a/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/templates/BiomeTemplate.java @@ -33,7 +33,6 @@ public class BiomeTemplate extends AbstractableTemplate implements ValidatedConf private final ConfigPack pack; - @Value("id") private String id; From c6ff808cce05c71d315924995be4cfe079dd85b9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 6 Jan 2021 21:07:57 -0700 Subject: [PATCH 201/210] fix //regen and cleanup --- .../terra/config/factories/BiomeGridFactory.java | 5 +++-- .../com/dfsek/terra/bukkit/TerraBukkitPlugin.java | 2 +- .../command/command/image/RenderCommand.java | 14 +++++++------- .../terra/bukkit/world/block/state/BukkitSign.java | 2 +- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java index 3f514269e..c76c023e4 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java @@ -16,12 +16,13 @@ public class BiomeGridFactory implements TerraFactory new TerraWorld(w, worlds.get(w.getName()), this)); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/RenderCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/RenderCommand.java index 8ca2d6ab6..7e4355d3d 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/RenderCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/RenderCommand.java @@ -1,12 +1,16 @@ package com.dfsek.terra.bukkit.command.command.image; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.world.BukkitAdapter; +import com.dfsek.terra.config.lang.LangUtil; +import com.dfsek.terra.image.WorldImageGenerator; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import java.io.File; import java.util.Collections; import java.util.List; @@ -17,9 +21,8 @@ public class RenderCommand extends WorldCommand { @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - /* try { - WorldImageGenerator g = new WorldImageGenerator(world, Integer.parseInt(args[0]), Integer.parseInt(args[1]), (TerraBukkitPlugin) getMain()); + WorldImageGenerator g = new WorldImageGenerator(BukkitAdapter.adapt(world), Integer.parseInt(args[0]), Integer.parseInt(args[1]), getMain()); g.drawWorld(sender.getLocation().getBlockX(), sender.getLocation().getBlockZ()); File file = new File(getMain().getDataFolder() + File.separator + "export" + File.separator + "map" + File.separator + "map_" + System.currentTimeMillis() + ".png"); //noinspection ResultOfMethodCallIgnored @@ -27,16 +30,13 @@ public class RenderCommand extends WorldCommand { //noinspection ResultOfMethodCallIgnored file.createNewFile(); g.save(file); - LangUtil.send("command.image.render.save", sender, file.getAbsolutePath()); + LangUtil.send("command.image.render.save", BukkitAdapter.adapt(sender), file.getAbsolutePath()); return true; } catch(Exception e) { e.printStackTrace(); - LangUtil.send("command.image.render.error", sender); + LangUtil.send("command.image.render.error", BukkitAdapter.adapt(sender)); return true; } - - */ - return true; } @Override diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java index 4de0278fe..6b90ec18f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/block/state/BukkitSign.java @@ -29,7 +29,7 @@ public class BukkitSign extends BukkitBlockState implements Sign { public void applyState(String state) { SerialState.parse(state).forEach((k, v) -> { if(!v.startsWith("text")) throw new IllegalArgumentException("Invalid property: " + k); - setLine(Integer.parseInt(k), v.substring(4)); + setLine(Integer.parseInt(k) + 1, v.substring(4)); }); } } From e47b3f0397ad4c85b8ecffe0556ee8f6ff4c8db9 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 7 Jan 2021 09:45:40 -0700 Subject: [PATCH 202/210] add message to export command, more cleanup --- .../java/com/dfsek/terra/biome/BiomeZone.java | 2 +- .../terra/config/base/ConfigPackTemplate.java | 2 +- .../config/factories/BiomeGridFactory.java | 4 ++-- .../command/structure/ExportCommand.java | 22 +------------------ .../terra/bukkit/listeners/EventListener.java | 2 -- 5 files changed, 5 insertions(+), 27 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java index 05c7acb97..c4b7983f2 100644 --- a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java +++ b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java @@ -27,7 +27,7 @@ public class BiomeZone { this.noise.setFractalType(FastNoiseLite.FractalType.FBm); this.noise.setFractalOctaves(4); ConfigPackTemplate t = wc.getTemplate(); - this.noise.setFrequency(1D / t.getZoneFreq()); + this.noise.setFrequency(1D / (t.getZoneFreq() * grids.length)); this.grids = grids; imageLoader = t.getImageLoader(); useImage = t.isFromImage(); diff --git a/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java b/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java index b3afdd471..5ce37ec73 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java +++ b/common/src/main/java/com/dfsek/terra/config/base/ConfigPackTemplate.java @@ -31,7 +31,7 @@ public class ConfigPackTemplate implements ValidatedConfigTemplate { @Value("frequencies.zone") @Default - private int zoneFreq = 2048; + private int zoneFreq = 256; @Value("blend.enable") @Default diff --git a/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java index c76c023e4..0e5e8808c 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/BiomeGridFactory.java @@ -20,8 +20,8 @@ public class BiomeGridFactory implements TerraFactory Date: Thu, 7 Jan 2021 10:33:23 -0700 Subject: [PATCH 203/210] remove unused random parameter from populators --- .../terra/api/platform/generator/ChunkGenerator.java | 4 +--- .../api/world/generation/TerraBlockPopulator.java | 4 +--- .../generation/population/PopulationManager.java | 8 ++++---- .../com/dfsek/terra/population/CavePopulator.java | 2 +- .../com/dfsek/terra/population/FloraPopulator.java | 6 +++++- .../com/dfsek/terra/population/OrePopulator.java | 2 +- .../dfsek/terra/population/StructurePopulator.java | 2 +- .../com/dfsek/terra/population/TreePopulator.java | 4 +++- .../bukkit/generator/BukkitPopulatorWrapper.java | 2 +- .../fabric/world/features/PopulatorFeature.java | 10 +++++----- .../main/java/com/dfsek/terra/region/Generator.java | 12 +++++------- 11 files changed, 28 insertions(+), 28 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/platform/generator/ChunkGenerator.java b/common/src/main/java/com/dfsek/terra/api/platform/generator/ChunkGenerator.java index 7f85e9c15..266ce760b 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/generator/ChunkGenerator.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/generator/ChunkGenerator.java @@ -30,9 +30,7 @@ public interface ChunkGenerator extends Handle { @Nullable TerraChunkGenerator getTerraGenerator(); - interface ChunkData { - Object getHandle(); - + interface ChunkData extends Handle { /** * Get the maximum height for the chunk. *

diff --git a/common/src/main/java/com/dfsek/terra/api/world/generation/TerraBlockPopulator.java b/common/src/main/java/com/dfsek/terra/api/world/generation/TerraBlockPopulator.java index 8797c924e..1d0e47577 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/generation/TerraBlockPopulator.java +++ b/common/src/main/java/com/dfsek/terra/api/world/generation/TerraBlockPopulator.java @@ -3,8 +3,6 @@ package com.dfsek.terra.api.world.generation; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; -import java.util.Random; - public interface TerraBlockPopulator { - void populate(World world, Random random, Chunk chunk); + void populate(World world, Chunk chunk); } diff --git a/common/src/main/java/com/dfsek/terra/api/world/generation/population/PopulationManager.java b/common/src/main/java/com/dfsek/terra/api/world/generation/population/PopulationManager.java index dba3643a2..6c7bab57c 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/generation/population/PopulationManager.java +++ b/common/src/main/java/com/dfsek/terra/api/world/generation/population/PopulationManager.java @@ -34,14 +34,14 @@ public class PopulationManager implements TerraBlockPopulator { @Override @SuppressWarnings("try") - public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) { + public void populate(@NotNull World world, @NotNull Chunk chunk) { try(ProfileFuture ignored = measure()) { needsPop.add(new ChunkCoordinate(chunk)); int x = chunk.getX(); int z = chunk.getZ(); if(main.isEnabled()) { - for(int xi = - 1; xi <= 1; xi++) { - for(int zi = - 1; zi <= 1; zi++) { + for(int xi = -1; xi <= 1; xi++) { + for(int zi = -1; zi <= 1; zi++) { if(xi == 0 && zi == 0) continue; if(world.isChunkGenerated(xi + x, zi + z)) checkNeighbors(xi + x, zi + z, world); } @@ -86,7 +86,7 @@ public class PopulationManager implements TerraBlockPopulator { random.setSeed((long) x * xRand + (long) z * zRand ^ w.getSeed()); Chunk currentChunk = w.getChunkAt(x, z); for(TerraBlockPopulator r : attachedPopulators) { - r.populate(w, random, currentChunk); + r.populate(w, currentChunk); } needsPop.remove(c); } diff --git a/common/src/main/java/com/dfsek/terra/population/CavePopulator.java b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java index 208211b07..b256a37f0 100644 --- a/common/src/main/java/com/dfsek/terra/population/CavePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/CavePopulator.java @@ -33,7 +33,7 @@ public class CavePopulator implements TerraBlockPopulator { @SuppressWarnings("try") @Override - public void populate(@NotNull World world, @NotNull Random r, @NotNull Chunk chunk) { + public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); WorldHandle handle = main.getWorldHandle(); BlockData AIR = handle.createBlockData("minecraft:air"); diff --git a/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java b/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java index 58e033428..09aeca00e 100644 --- a/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/FloraPopulator.java @@ -11,6 +11,7 @@ import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.population.items.flora.FloraLayer; +import com.dfsek.terra.util.PopulationUtil; import org.jetbrains.annotations.NotNull; import java.util.HashMap; @@ -30,7 +31,7 @@ public class FloraPopulator implements TerraBlockPopulator { @SuppressWarnings("try") @Override - public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) { + public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("FloraTime")) { if(!tw.isSafe()) return; @@ -43,6 +44,9 @@ public class FloraPopulator implements TerraBlockPopulator { layers.put(l, biome.getConfig().getFlora()); } } + + Random random = PopulationUtil.getRandom(chunk); + int iter = 0; boolean finished = false; while(!finished) { diff --git a/common/src/main/java/com/dfsek/terra/population/OrePopulator.java b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java index 6a766f534..6f22eeb64 100644 --- a/common/src/main/java/com/dfsek/terra/population/OrePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/OrePopulator.java @@ -26,7 +26,7 @@ public class OrePopulator implements TerraBlockPopulator { @SuppressWarnings("try") @Override - public void populate(@NotNull World world, @NotNull Random r, @NotNull Chunk chunk) { + public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("OreTime")) { if(!tw.isSafe()) return; diff --git a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java index f504878bc..9bf55e86d 100644 --- a/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/StructurePopulator.java @@ -28,7 +28,7 @@ public class StructurePopulator implements TerraBlockPopulator { @SuppressWarnings("try") @Override - public void populate(@NotNull World world, @NotNull Random r, @NotNull Chunk chunk) { + public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("StructureTime")) { int cx = (chunk.getX() << 4); diff --git a/common/src/main/java/com/dfsek/terra/population/TreePopulator.java b/common/src/main/java/com/dfsek/terra/population/TreePopulator.java index 6d32250ec..2d3c4d212 100644 --- a/common/src/main/java/com/dfsek/terra/population/TreePopulator.java +++ b/common/src/main/java/com/dfsek/terra/population/TreePopulator.java @@ -11,6 +11,7 @@ import com.dfsek.terra.api.world.generation.TerraBlockPopulator; import com.dfsek.terra.biome.UserDefinedBiome; import com.dfsek.terra.biome.grid.master.TerraBiomeGrid; import com.dfsek.terra.population.items.tree.TreeLayer; +import com.dfsek.terra.util.PopulationUtil; import net.jafama.FastMath; import org.jetbrains.annotations.NotNull; @@ -30,11 +31,12 @@ public class TreePopulator implements TerraBlockPopulator { @Override @SuppressWarnings("try") - public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk chunk) { + public void populate(@NotNull World world, @NotNull Chunk chunk) { TerraWorld tw = main.getWorld(world); try(ProfileFuture ignored = tw.getProfiler().measure("TreeTime")) { if(!tw.isSafe()) return; TerraBiomeGrid grid = tw.getGrid(); + Random random = PopulationUtil.getRandom(chunk); for(int x = 0; x < 16; x += 2) { for(int z = 0; z < 16; z += 2) { UserDefinedBiome biome = (UserDefinedBiome) grid.getBiome((chunk.getX() << 4) + x, (chunk.getZ() << 4) + z, GenerationPhase.POPULATE); diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java index 83d9fb891..22b1a2a53 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/generator/BukkitPopulatorWrapper.java @@ -18,6 +18,6 @@ public class BukkitPopulatorWrapper extends BlockPopulator { @Override public void populate(@NotNull World world, @NotNull Random random, @NotNull Chunk source) { - delegate.populate(BukkitAdapter.adapt(world), random, BukkitAdapter.adapt(source)); + delegate.populate(BukkitAdapter.adapt(world), BukkitAdapter.adapt(source)); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java index ca16ccd1f..0e2d741a7 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/world/features/PopulatorFeature.java @@ -27,11 +27,11 @@ public class PopulatorFeature extends Feature { FabricChunkGeneratorWrapper gen = (FabricChunkGeneratorWrapper) chunkGenerator; FabricChunkWorldAccess chunk = new FabricChunkWorldAccess(world, pos.getX() >> 4, pos.getZ() >> 4); FabricWorld world1 = new FabricWorld(world.toServerWorld(), new FabricChunkGenerator(chunkGenerator)); - gen.getCavePopulator().populate(world1, random, chunk); - gen.getStructurePopulator().populate(new FabricSeededWorldAccess(world, world.getSeed(), chunkGenerator), random, chunk); - gen.getOrePopulator().populate(world1, random, chunk); - gen.getTreePopulator().populate(world1, random, chunk); - gen.getFloraPopulator().populate(world1, random, chunk); + gen.getCavePopulator().populate(world1, chunk); + gen.getStructurePopulator().populate(new FabricSeededWorldAccess(world, world.getSeed(), chunkGenerator), chunk); + gen.getOrePopulator().populate(world1, chunk); + gen.getTreePopulator().populate(world1, chunk); + gen.getFloraPopulator().populate(world1, chunk); return true; } } diff --git a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java index 0ce54bbf3..1fc48fe3f 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java +++ b/platforms/region/src/main/java/com/dfsek/terra/region/Generator.java @@ -1,8 +1,6 @@ package com.dfsek.terra.region; import com.dfsek.terra.StandalonePlugin; -import com.dfsek.terra.api.math.MathUtil; -import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.generation.MasterChunkGenerator; import com.dfsek.terra.generation.math.SamplerCache; import com.dfsek.terra.platform.DirectChunkData; @@ -57,11 +55,11 @@ public class Generator { DirectChunkData chunkData = (DirectChunkData) world.getChunkAt(cx, cz); generator.generateChunkData(world, null, cx, cz, chunkData); - cavePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); - structurePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); - orePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); - floraPopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); - treePopulator.populate(world, new FastRandom(MathUtil.getCarverChunkSeed(cx, cz, world.getSeed())), chunkData); + cavePopulator.populate(world, chunkData); + structurePopulator.populate(world, chunkData); + orePopulator.populate(world, chunkData); + floraPopulator.populate(world, chunkData); + treePopulator.populate(world, chunkData); count++; if(count % 200 == 0) { From d2a1901f44e86b8b3307fe1f93f251193c879096 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 7 Jan 2021 16:38:07 -0700 Subject: [PATCH 204/210] add max structure recursion depth --- .../structures/script/StructureScript.java | 22 ++++++++++++++----- .../script/functions/StructureFunction.java | 3 +++ .../buffer/items/BufferedLootApplication.java | 2 +- .../dfsek/terra/config/base/PluginConfig.java | 8 +++++++ .../bukkit/src/main/resources/config.yml | 4 +++- 5 files changed, 31 insertions(+), 8 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index e50d9e835..5aa7d3734 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -45,6 +45,7 @@ public class StructureScript { private final String id; String tempID; private final Map cache; + private final TerraPlugin main; public StructureScript(InputStream inputStream, TerraPlugin main, ScriptRegistry registry, LootRegistry lootRegistry, SamplerCache cache) throws ParseException { Parser parser; @@ -81,6 +82,7 @@ public class StructureScript { block = parser.parse(); this.id = parser.getID(); tempID = id; + this.main = main; this.cache = Collections.synchronizedMap(new LinkedHashMap() { @Override protected boolean removeEldestEntry(Map.Entry eldest) { @@ -98,9 +100,9 @@ public class StructureScript { */ public boolean execute(Location location, Random random, Rotation rotation) { StructureBuffer buffer = new StructureBuffer(location); - Block.ReturnInfo level = block.apply(new TerraImplementationArguments(buffer, rotation, random, 0)); + boolean level = applyBlock(new TerraImplementationArguments(buffer, rotation, random, 0)); buffer.paste(); - return !level.getLevel().equals(Block.ReturnLevel.FAIL); + return level; } public boolean execute(Location location, Chunk chunk, Random random, Rotation rotation) { @@ -118,23 +120,31 @@ public class StructureScript { synchronized(cache) { return cache.computeIfAbsent(location, loc -> { StructureBuffer buf = new StructureBuffer(loc); - Block.ReturnInfo level = block.apply(new TerraImplementationArguments(buf, rotation, random, 0)); - buf.setSucceeded(!level.getLevel().equals(Block.ReturnLevel.FAIL)); + buf.setSucceeded(applyBlock(new TerraImplementationArguments(buf, rotation, random, 0))); return buf; }); } } public boolean executeInBuffer(Buffer buffer, Random random, Rotation rotation, int recursions) { - return !block.apply(new TerraImplementationArguments(buffer, rotation, random, recursions)).getLevel().equals(Block.ReturnLevel.FAIL); + return applyBlock(new TerraImplementationArguments(buffer, rotation, random, recursions)); } public boolean executeDirect(Location location, Random random, Rotation rotation) { DirectBuffer buffer = new DirectBuffer(location); - return !block.apply(new TerraImplementationArguments(buffer, rotation, random, 0)).getLevel().equals(Block.ReturnLevel.FAIL); + return applyBlock(new TerraImplementationArguments(buffer, rotation, random, 0)); } public String getId() { return id; } + + private boolean applyBlock(TerraImplementationArguments arguments) { + try { + return !block.apply(arguments).getLevel().equals(Block.ReturnLevel.FAIL); + } catch(RuntimeException e) { + main.getLogger().severe("Failed to generate structure at " + arguments.getBuffer().getOrigin() + ": " + e.getMessage()); + return false; + } + } } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java index 3a23e54aa..313290d95 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/functions/StructureFunction.java @@ -45,6 +45,9 @@ public class StructureFunction implements Function { public Boolean apply(ImplementationArguments implementationArguments) { TerraImplementationArguments arguments = (TerraImplementationArguments) implementationArguments; + if(arguments.getRecursions() > main.getTerraConfig().getMaxRecursion()) + throw new RuntimeException("Structure recursion too deep: " + arguments.getRecursions()); + Vector2 xz = new Vector2(x.apply(implementationArguments).doubleValue(), z.apply(implementationArguments).doubleValue()); RotationUtil.rotateVector(xz, arguments.getRotation()); diff --git a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java index bf2d2c2f6..87d475a26 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/structure/buffer/items/BufferedLootApplication.java @@ -20,7 +20,7 @@ public class BufferedLootApplication implements BufferedItem { public void paste(Location origin) { BlockState data = origin.getBlock().getState(); if(!(data instanceof Container)) { - main.getLogger().severe("Failed to place loot at " + origin + "; block " + data.toString() + " is not container."); + main.getLogger().severe("Failed to place loot at " + origin + "; block " + data + " is not container."); return; } Container container = (Container) data; diff --git a/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java b/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java index b61d8291a..9b7691f73 100644 --- a/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java +++ b/common/src/main/java/com/dfsek/terra/config/base/PluginConfig.java @@ -51,6 +51,10 @@ public class PluginConfig implements ConfigTemplate { @Default private boolean dumpDefaultConfig = true; + @Value("script.max-recursion") + @Default + private int maxRecursion = 1000; + public void load(TerraPlugin main) { Logger logger = main.getLogger(); logger.info("Loading config values"); @@ -99,4 +103,8 @@ public class PluginConfig implements ConfigTemplate { public int getSamplerCache() { return samplerCache; } + + public int getMaxRecursion() { + return maxRecursion; + } } diff --git a/platforms/bukkit/src/main/resources/config.yml b/platforms/bukkit/src/main/resources/config.yml index 4d652784a..adb7d8522 100644 --- a/platforms/bukkit/src/main/resources/config.yml +++ b/platforms/bukkit/src/main/resources/config.yml @@ -8,4 +8,6 @@ cache: structure: 32 sampler: 128 master-disable: - caves: false \ No newline at end of file + caves: false +script: + max-recursion: 1000 \ No newline at end of file From 308ba887a3c76aba279dbbe3541bad0502c851bb Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 7 Jan 2021 17:18:38 -0700 Subject: [PATCH 205/210] add getOrigin functions --- .../structures/script/StructureScript.java | 5 ++ .../builders/ZeroArgFunctionBuilder.java | 51 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/script/builders/ZeroArgFunctionBuilder.java diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java index 5aa7d3734..70826823a 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/StructureScript.java @@ -6,6 +6,7 @@ import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.structures.parser.Parser; import com.dfsek.terra.api.structures.parser.exceptions.ParseException; import com.dfsek.terra.api.structures.parser.lang.Block; +import com.dfsek.terra.api.structures.parser.lang.Returnable; import com.dfsek.terra.api.structures.script.builders.BinaryNumberFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BiomeFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.BlockFunctionBuilder; @@ -22,6 +23,7 @@ import com.dfsek.terra.api.structures.script.builders.StateFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.StructureFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.UnaryNumberFunctionBuilder; import com.dfsek.terra.api.structures.script.builders.UnaryStringFunctionBuilder; +import com.dfsek.terra.api.structures.script.builders.ZeroArgFunctionBuilder; import com.dfsek.terra.api.structures.structure.Rotation; import com.dfsek.terra.api.structures.structure.buffer.Buffer; import com.dfsek.terra.api.structures.structure.buffer.DirectBuffer; @@ -68,6 +70,9 @@ public class StructureScript { .registerFunction("getBiome", new BiomeFunctionBuilder(main)) .registerFunction("getBlock", new CheckBlockFunctionBuilder()) .registerFunction("state", new StateFunctionBuilder(main)) + .registerFunction("originX", new ZeroArgFunctionBuilder(arguments -> arguments.getBuffer().getOrigin().getX(), Returnable.ReturnType.NUMBER)) + .registerFunction("originY", new ZeroArgFunctionBuilder(arguments -> arguments.getBuffer().getOrigin().getY(), Returnable.ReturnType.NUMBER)) + .registerFunction("originZ", new ZeroArgFunctionBuilder(arguments -> arguments.getBuffer().getOrigin().getZ(), Returnable.ReturnType.NUMBER)) .registerFunction("print", new UnaryStringFunctionBuilder(string -> Debug.info("[" + tempID + "] " + string))) .registerFunction("abs", new UnaryNumberFunctionBuilder(number -> FastMath.abs(number.doubleValue()))) .registerFunction("pow", new BinaryNumberFunctionBuilder((number, number2) -> FastMath.pow(number.doubleValue(), number2.doubleValue()))) diff --git a/common/src/main/java/com/dfsek/terra/api/structures/script/builders/ZeroArgFunctionBuilder.java b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/ZeroArgFunctionBuilder.java new file mode 100644 index 000000000..ef96b451b --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/script/builders/ZeroArgFunctionBuilder.java @@ -0,0 +1,51 @@ +package com.dfsek.terra.api.structures.script.builders; + +import com.dfsek.terra.api.structures.parser.lang.ImplementationArguments; +import com.dfsek.terra.api.structures.parser.lang.Returnable; +import com.dfsek.terra.api.structures.parser.lang.functions.Function; +import com.dfsek.terra.api.structures.parser.lang.functions.FunctionBuilder; +import com.dfsek.terra.api.structures.script.TerraImplementationArguments; +import com.dfsek.terra.api.structures.tokenizer.Position; + +import java.util.List; + +public class ZeroArgFunctionBuilder implements FunctionBuilder> { + private final java.util.function.Function function; + private final Returnable.ReturnType type; + + public ZeroArgFunctionBuilder(java.util.function.Function function, Returnable.ReturnType type) { + this.function = function; + this.type = type; + } + + @Override + public Function build(List> argumentList, Position position) { + return new Function() { + @Override + public ReturnType returnType() { + return type; + } + + @Override + public T apply(ImplementationArguments implementationArguments) { + return function.apply((TerraImplementationArguments) implementationArguments); + } + + @Override + public Position getPosition() { + return position; + } + }; + } + + @Override + public int argNumber() { + return 1; + } + + @Override + public Returnable.ReturnType getArgument(int position) { + if(position == 0) return type; + return null; + } +} From 28b6fe49bb871fdf0f402daef39ff7129b2c0427 Mon Sep 17 00:00:00 2001 From: dfsek Date: Thu, 7 Jan 2021 22:04:35 -0700 Subject: [PATCH 206/210] rework image stuff --- .../terra/api/math/ProbabilityCollection.java | 4 +- .../terra/api/math/noise/NoiseFunction2.java | 5 +- .../terra/api/math/noise/NoiseFunction3.java | 3 +- .../noise/{ => samplers}/FastNoiseLite.java | 1866 ++++++++--------- .../api/math/noise/samplers/NoiseSampler.java | 28 + .../api/math/noise/samplers/Normalizer.java | 21 + .../dfsek/terra/api/math/vector/Vector2.java | 6 + .../terra/api/math/voxel/DeformedSphere.java | 4 +- .../terra/api/world/biome/BiomeGrid.java | 2 +- .../terra/api/world/palette/Palette.java | 4 +- .../api/world/palette/SimplexPalette.java | 6 +- .../java/com/dfsek/terra/biome/BiomeZone.java | 8 +- .../terra/biome/grid/UserDefinedGrid.java | 7 +- .../postprocessing/CoordinatePerturb.java | 2 +- .../biome/postprocessing/ErosionNoise.java | 5 +- .../config/factories/PaletteFactory.java | 2 +- .../loaders/config/FloraLayerLoader.java | 2 +- .../loaders/config/NoiseBuilderLoader.java | 2 +- .../loaders/config/TreeLayerLoader.java | 2 +- .../terra/generation/config/NoiseBuilder.java | 5 +- .../com/dfsek/terra/image/ImageLoader.java | 13 +- .../population/items/PlaceableLayer.java | 8 +- .../population/items/flora/FloraLayer.java | 4 +- .../items/ores/DeformedSphereOre.java | 2 +- .../population/items/tree/TreeLayer.java | 4 +- .../geometry/DeformedSphereCommand.java | 2 +- .../command/image/gui/RawGUICommand.java | 18 +- .../command/image/gui/StepGUICommand.java | 18 +- 28 files changed, 1025 insertions(+), 1028 deletions(-) rename common/src/main/java/com/dfsek/terra/api/math/noise/{ => samplers}/FastNoiseLite.java (58%) create mode 100644 common/src/main/java/com/dfsek/terra/api/math/noise/samplers/NoiseSampler.java create mode 100644 common/src/main/java/com/dfsek/terra/api/math/noise/samplers/Normalizer.java diff --git a/common/src/main/java/com/dfsek/terra/api/math/ProbabilityCollection.java b/common/src/main/java/com/dfsek/terra/api/math/ProbabilityCollection.java index 2d5dff15d..829acf7d6 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/ProbabilityCollection.java +++ b/common/src/main/java/com/dfsek/terra/api/math/ProbabilityCollection.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.math; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import com.dfsek.terra.api.world.biome.NormalizationUtil; import java.util.HashSet; @@ -35,7 +35,7 @@ public class ProbabilityCollection { return (E) array[r.nextInt(array.length)]; } - public E get(FastNoiseLite n, double x, double z) { + public E get(NoiseSampler n, double x, double z) { if(array.length == 0) return null; return (E) array[NormalizationUtil.normalize(n.getNoise(x, z), array.length, 1)]; } diff --git a/common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction2.java b/common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction2.java index f0f1346ea..a1f490c3d 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction2.java +++ b/common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction2.java @@ -1,5 +1,6 @@ package com.dfsek.terra.api.math.noise; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import com.dfsek.terra.generation.config.NoiseBuilder; import com.dfsek.terra.util.hash.HashMapDoubleDouble; import parsii.eval.Expression; @@ -7,7 +8,7 @@ import parsii.eval.Expression; import java.util.List; public class NoiseFunction2 implements NoiseFunction { - private final FastNoiseLite gen; + private final NoiseSampler gen; private final Cache cache = new Cache(); public NoiseFunction2(long seed, NoiseBuilder builder) { @@ -43,7 +44,7 @@ public class NoiseFunction2 implements NoiseFunction { private static final long serialVersionUID = 8915092734723467010L; private static final int cacheSize = 384; - public double get(FastNoiseLite noise, double x, double z) { + public double get(NoiseSampler noise, double x, double z) { double xx = x >= 0 ? x * 2 : x * -2 - 1; double zz = z >= 0 ? z * 2 : z * -2 - 1; double key = (xx >= zz) ? (xx * xx + xx + zz) : (zz * zz + xx); diff --git a/common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction3.java b/common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction3.java index 007fc853a..4915e1c68 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction3.java +++ b/common/src/main/java/com/dfsek/terra/api/math/noise/NoiseFunction3.java @@ -1,12 +1,13 @@ package com.dfsek.terra.api.math.noise; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import com.dfsek.terra.generation.config.NoiseBuilder; import parsii.eval.Expression; import java.util.List; public class NoiseFunction3 implements NoiseFunction { - private final FastNoiseLite gen; + private final NoiseSampler gen; public NoiseFunction3(long seed, NoiseBuilder builder) { this.gen = builder.build((int) seed); diff --git a/common/src/main/java/com/dfsek/terra/api/math/noise/FastNoiseLite.java b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java similarity index 58% rename from common/src/main/java/com/dfsek/terra/api/math/noise/FastNoiseLite.java rename to common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java index ccb23d63c..be3ef0197 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/noise/FastNoiseLite.java +++ b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java @@ -1,5 +1,7 @@ -package com.dfsek.terra.api.math.noise;// MIT License +package com.dfsek.terra.api.math.noise.samplers;// MIT License +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector3; import net.jafama.FastMath; /* @@ -25,42 +27,12 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -.'',;:cldxkO00KKXXNNWWWNNXKOkxdollcc::::::;:::ccllloooolllllllllooollc:,'... ...........',;cldxkO000Okxdlc::;;;,,;;;::cclllllll -..',;:ldxO0KXXNNNNNNNNXXK0kxdolcc::::::;;;,,,,,,;;;;;;;;;;:::cclllllc:;'.... ...........',;:ldxO0KXXXK0Okxdolc::;;;;::cllodddddo -...',:loxO0KXNNNNNXXKK0Okxdolc::;::::::::;;;,,'''''.....''',;:clllllc:;,'............''''''''',;:loxO0KXNNNNNXK0Okxdollccccllodxxxxxxd -....';:ldkO0KXXXKK00Okxdolcc:;;;;;::cclllcc:;;,''..... ....',;clooddolcc:;;;;,,;;;;;::::;;;;;;:cloxk0KXNWWWWWWNXKK0Okxddoooddxxkkkkkxx -.....';:ldxkOOOOOkxxdolcc:;;;,,,;;:cllooooolcc:;'... ..,:codxkkkxddooollloooooooollcc:::::clodkO0KXNWWWWWWNNXK00Okxxxxxxxxkkkkxxx -. ....';:cloddddo___________,,,,;;:clooddddoolc:,... ..,:ldx__00OOOkkk___kkkkkkxxdollc::::cclodkO0KXXNNNNNNXXK0OOkxxxxxxxxxxxxddd -.......',;:cccc:| |,,,;;:cclooddddoll:;'.. ..';cox| \KKK000| |KK00OOkxdocc___;::clldxxkO0KKKKK00Okkxdddddddddddddddoo -.......'',,,,,''| ________|',,;;::cclloooooolc:;'......___:ldk| \KK000| |XKKK0Okxolc| |;;::cclodxxkkkkxxdoolllcclllooodddooooo -''......''''....| | ....'',,,,;;;::cclloooollc:;,''.'| |oxk| \OOO0| |KKK00Oxdoll|___|;;;;;::ccllllllcc::;;,,;;;:cclloooooooo -;;,''.......... | |_____',,;;;____:___cllo________.___| |___| \xkk| |KK_______ool___:::;________;;;_______...'',;;:ccclllloo -c:;,''......... | |:::/ ' |lo/ | | \dx| |0/ \d| |cc/ |'/ \......',,;;:ccllo -ol:;,'..........| _____|ll/ __ |o/ ______|____ ___| | \o| |/ ___ \| |o/ ______|/ ___ \ .......'',;:clo -dlc;,...........| |::clooo| / | |x\___ \KXKKK0| |dol| |\ \| | | | | |d\___ \..| | / / ....',:cl -xoc;'... .....'| |llodddd| \__| |_____\ \KKK0O| |lc:| |'\ | |___| | |_____\ \.| |_/___/... ...',;:c -dlc;'... ....',;| |oddddddo\ | |Okkx| |::;| |..\ |\ /| | | \ |... ....',;:c -ol:,'.......',:c|___|xxxddollc\_____,___|_________/ddoll|___|,,,|___|...\_____|:\ ______/l|___|_________/...\________|'........',;::cc -c:;'.......';:codxxkkkkxxolc::;::clodxkOO0OOkkxdollc::;;,,''''',,,,''''''''''',,'''''',;:loxkkOOkxol:;,'''',,;:ccllcc:;,'''''',;::ccll -;,'.......',:codxkOO0OOkxdlc:;,,;;:cldxxkkxxdolc:;;,,''.....'',;;:::;;,,,'''''........,;cldkO0KK0Okdoc::;;::cloodddoolc:;;;;;::ccllooo -.........',;:lodxOO0000Okdoc:,,',,;:clloddoolc:;,''.......'',;:clooollc:;;,,''.......',:ldkOKXNNXX0Oxdolllloddxxxxxxdolccccccllooodddd -. .....';:cldxkO0000Okxol:;,''',,;::cccc:;,,'.......'',;:cldxxkkxxdolc:;;,'.......';coxOKXNWWWNXKOkxddddxxkkkkkkxdoollllooddxxxxkkk - ....',;:codxkO000OOxdoc:;,''',,,;;;;,''.......',,;:clodkO00000Okxolc::;,,''..',;:ldxOKXNWWWNNK0OkkkkkkkkkkkxxddooooodxxkOOOOO000 - ....',;;clodxkkOOOkkdolc:;,,,,,,,,'..........,;:clodxkO0KKXKK0Okxdolcc::;;,,,;;:codkO0XXNNNNXKK0OOOOOkkkkxxdoollloodxkO0KKKXXXXX - VERSION: 1.0.1 https://github.com/Auburn/FastNoise -*/ -/* -To switch between using doubles or doubles for input position, -perform a file-wide replace on the following strings (including / * FNLdouble * /) -/ *FNLdouble* / double -/ *FNLdouble* / double - -*/ -@SuppressWarnings("ManualMinMaxCalculation") -public class FastNoiseLite { - private static final double[] Gradients2D = { + */ +@SuppressWarnings({"ManualMinMaxCalculation", "unused"}) +public class FastNoiseLite implements NoiseSampler { + private static final double[] GRADIENTS_2_D = { 0.130526192220052f, 0.99144486137381f, 0.38268343236509f, 0.923879532511287f, 0.608761429008721f, 0.793353340291235f, 0.793353340291235f, 0.608761429008721f, 0.923879532511287f, 0.38268343236509f, 0.99144486137381f, 0.130526192220051f, 0.99144486137381f, -0.130526192220051f, 0.923879532511287f, -0.38268343236509f, 0.793353340291235f, -0.60876142900872f, @@ -106,7 +78,7 @@ public class FastNoiseLite { -0.923879532511287f, 0.38268343236509f, -0.38268343236509f, 0.923879532511287f, }; - private static final double[] RandVecs2D = { + private static final double[] RAND_VECS_2D = { -0.2700222198f, -0.9628540911f, 0.3863092627f, -0.9223693152f, 0.04444859006f, -0.999011673f, -0.5992523158f, -0.8005602176f, -0.7819280288f, 0.6233687174f, 0.9464672271f, 0.3227999196f, -0.6514146797f, -0.7587218957f, 0.9378472289f, 0.347048376f, -0.8497875957f, -0.5271252623f, -0.879042592f, 0.4767432447f, -0.892300288f, -0.4514423508f, -0.379844434f, -0.9250503802f, @@ -173,7 +145,7 @@ public class FastNoiseLite { -0.146637214f, -0.9891903394f, -0.782318098f, 0.6228791163f, -0.5039610839f, -0.8637263605f, -0.7743120191f, -0.6328039957f, }; - private static final double[] Gradients3D = { + private static final double[] GRADIENTS_3D = { 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 1, 0, 1, 0, -1, 0, 1, 0, 1, 0, -1, 0, -1, 0, -1, 0, 1, 1, 0, 0, -1, 1, 0, 0, 1, -1, 0, 0, -1, -1, 0, 0, @@ -192,7 +164,7 @@ public class FastNoiseLite { 1, 1, 0, 0, 0, -1, 1, 0, -1, 1, 0, 0, 0, -1, -1, 0 }; - private static final double[] RandVecs3D = { + private static final double[] RAND_VECS_3D = { -0.7292736885f, -0.6618439697f, 0.1735581948f, 0, 0.790292081f, -0.5480887466f, -0.2739291014f, 0, 0.7217578935f, 0.6226212466f, -0.3023380997f, 0, 0.565683137f, -0.8208298145f, -0.0790000257f, 0, 0.760049034f, -0.5555979497f, -0.3370999617f, 0, 0.3713945616f, 0.5011264475f, 0.7816254623f, 0, -0.1277062463f, -0.4254438999f, -0.8959289049f, 0, -0.2881560924f, @@ -302,43 +274,29 @@ public class FastNoiseLite { }; // Hashing - private static final int PrimeX = 501125321; - private static final int PrimeY = 1136930381; - private static final int PrimeZ = 1720413743; - - private int mSeed = 1337; - private double mFrequency = 0.01f; - private NoiseType mNoiseType = NoiseType.OpenSimplex2; - private RotationType3D mRotationType3D = RotationType3D.None; + private static final int PRIME_X = 501125321; + private static final int PRIME_Y = 1136930381; + private static final int PRIME_Z = 1720413743; + private static final NoiseSampler CELLULAR_LOOKUP_DEFAULT = new FastNoiseLite(); + private int mSeed = 1337; + private double mFrequency = 0.01f; + private NoiseType mNoiseType = NoiseType.OpenSimplex2; + private RotationType3D mRotationType3D = RotationType3D.None; private TransformType3D mTransformType3D = TransformType3D.DefaultOpenSimplex2; - - private FractalType mFractalType = FractalType.None; - private int mOctaves = 3; - private double mLacunarity = 2.0f; - private double mGain = 0.5f; - private double mWeightedStrength = 0.0f; - private double mPingPongStength = 2.0f; - + private FractalType mFractalType = FractalType.None; + private int mOctaves = 3; + private double mLacunarity = 2.0f; + private double mGain = 0.5f; + private double mWeightedStrength = 0.0f; + private double mPingPongStength = 2.0f; private double mFractalBounding = 1 / 1.75f; - private CellularDistanceFunction mCellularDistanceFunction = CellularDistanceFunction.EuclideanSq; private CellularReturnType mCellularReturnType = CellularReturnType.Distance; private double mCellularJitterModifier = 1.0f; - private DomainWarpType mDomainWarpType = DomainWarpType.OpenSimplex2; private TransformType3D mWarpTransformType3D = TransformType3D.DefaultOpenSimplex2; private double mDomainWarpAmp = 1.0f; - - private static final FastNoiseLite CELLULAR_LOOKUP_DEFAULT = new FastNoiseLite(); - private FastNoiseLite cellularNoiseLookup = CELLULAR_LOOKUP_DEFAULT; - - public FastNoiseLite getCellularNoiseLookup() { - return cellularNoiseLookup; - } - - public void setCellularNoiseLookup(FastNoiseLite cellularNoiseLookup) { - this.cellularNoiseLookup = cellularNoiseLookup; - } + private NoiseSampler cellularNoiseLookup = CELLULAR_LOOKUP_DEFAULT; /** * Create new FastNoise object with default seed @@ -354,6 +312,113 @@ public class FastNoiseLite { setSeed(seed); } + private static double fastMin(double a, double b) { + return a < b ? a : b; + } + + private static double fastMax(double a, double b) { + return a > b ? a : b; + } + + private static double fastSqrt(double f) { + return FastMath.sqrt(f); + } + + private static int fastFloor(double f) { + return f >= 0 ? (int) f : (int) f - 1; + } + + private static int fastRound(double f) { + return f >= 0 ? (int) (f + 0.5f) : (int) (f - 0.5f); + } + + private static double lerp(double a, double b, double t) { + return a + t * (b - a); + } + + private static double interpHermite(double t) { + return t * t * (3 - 2 * t); + } + + private static double interpQuintic(double t) { + return t * t * t * (t * (t * 6 - 15) + 10); + } + + private static double cubicLerp(double a, double b, double c, double d, double t) { + double p = (d - c) - (a - b); + return t * t * t * p + t * t * ((a - b) - p) + t * (c - a) + b; + } + + private static double pingPong(double t) { + t -= (int) (t * 0.5f) << 1; + return t < 1 ? t : 2 - t; + } + + private static int hash(int seed, int xPrimed, int yPrimed) { + int hash = seed ^ xPrimed ^ yPrimed; + + hash *= 0x27d4eb2d; + return hash; + } + + private static int hash(int seed, int xPrimed, int yPrimed, int zPrimed) { + int hash = seed ^ xPrimed ^ yPrimed ^ zPrimed; + + hash *= 0x27d4eb2d; + return hash; + } + + private static double valCoord(int seed, int xPrimed, int yPrimed) { + int hash = hash(seed, xPrimed, yPrimed); + + hash *= hash; + hash ^= hash << 19; + return hash * (1 / 2147483648.0f); + } + + private static double valCoord(int seed, int xPrimed, int yPrimed, int zPrimed) { + int hash = hash(seed, xPrimed, yPrimed, zPrimed); + + hash *= hash; + hash ^= hash << 19; + return hash * (1 / 2147483648.0f); + } + + private static double gradCoord(int seed, int xPrimed, int yPrimed, double xd, double yd) { + int hash = hash(seed, xPrimed, yPrimed); + hash ^= hash >> 15; + hash &= 127 << 1; + + double xg = GRADIENTS_2_D[hash]; + double yg = GRADIENTS_2_D[hash | 1]; + + return xd * xg + yd * yg; + } + + private static double gradCoord(int seed, int xPrimed, int yPrimed, int zPrimed, double xd, double yd, double zd) { + int hash = hash(seed, xPrimed, yPrimed, zPrimed); + hash ^= hash >> 15; + hash &= 63 << 2; + + double xg = GRADIENTS_3D[hash]; + double yg = GRADIENTS_3D[hash | 1]; + double zg = GRADIENTS_3D[hash | 2]; + + return xd * xg + yd * yg + zd * zg; + } + + private static double fastAbs(double f) { + return f < 0 ? -f : f; + } + + public NoiseSampler getCellularNoiseLookup() { + return cellularNoiseLookup; + } + + public void setCellularNoiseLookup(NoiseSampler cellularNoiseLookup) { + this.cellularNoiseLookup = cellularNoiseLookup; + } + /** * Sets seed used for all noise types *

@@ -363,101 +428,6 @@ public class FastNoiseLite { mSeed = seed; } - private static double FastMin(double a, double b) { - return a < b ? a : b; - } - - private static double FastMax(double a, double b) { - return a > b ? a : b; - } - - private static double FastSqrt(double f) { - return FastMath.sqrt(f); - } - - private static int FastFloor(/*FNLdouble*/ double f) { - return f >= 0 ? (int) f : (int) f - 1; - } - - private static int FastRound(/*FNLdouble*/ double f) { - return f >= 0 ? (int) (f + 0.5f) : (int) (f - 0.5f); - } - - private static double Lerp(double a, double b, double t) { - return a + t * (b - a); - } - - private static double InterpHermite(double t) { - return t * t * (3 - 2 * t); - } - - private static double InterpQuintic(double t) { - return t * t * t * (t * (t * 6 - 15) + 10); - } - - private static double CubicLerp(double a, double b, double c, double d, double t) { - double p = (d - c) - (a - b); - return t * t * t * p + t * t * ((a - b) - p) + t * (c - a) + b; - } - - private static double PingPong(double t) { - t -= (int) (t * 0.5f) << 1; - return t < 1 ? t : 2 - t; - } - - private static int Hash(int seed, int xPrimed, int yPrimed) { - int hash = seed ^ xPrimed ^ yPrimed; - - hash *= 0x27d4eb2d; - return hash; - } - - private static int Hash(int seed, int xPrimed, int yPrimed, int zPrimed) { - int hash = seed ^ xPrimed ^ yPrimed ^ zPrimed; - - hash *= 0x27d4eb2d; - return hash; - } - - private static double ValCoord(int seed, int xPrimed, int yPrimed) { - int hash = Hash(seed, xPrimed, yPrimed); - - hash *= hash; - hash ^= hash << 19; - return hash * (1 / 2147483648.0f); - } - - private static double ValCoord(int seed, int xPrimed, int yPrimed, int zPrimed) { - int hash = Hash(seed, xPrimed, yPrimed, zPrimed); - - hash *= hash; - hash ^= hash << 19; - return hash * (1 / 2147483648.0f); - } - - private static double GradCoord(int seed, int xPrimed, int yPrimed, double xd, double yd) { - int hash = Hash(seed, xPrimed, yPrimed); - hash ^= hash >> 15; - hash &= 127 << 1; - - double xg = Gradients2D[hash]; - double yg = Gradients2D[hash | 1]; - - return xd * xg + yd * yg; - } - - private static double GradCoord(int seed, int xPrimed, int yPrimed, int zPrimed, double xd, double yd, double zd) { - int hash = Hash(seed, xPrimed, yPrimed, zPrimed); - hash ^= hash >> 15; - hash &= 63 << 2; - - double xg = Gradients3D[hash]; - double yg = Gradients3D[hash | 1]; - double zg = Gradients3D[hash | 2]; - - return xd * xg + yd * yg + zd * zg; - } - /** * Sets frequency for all noise types *

@@ -478,7 +448,7 @@ public class FastNoiseLite { } private void UpdateTransformType3D() { - switch (mRotationType3D) { + switch(mRotationType3D) { case ImproveXYPlanes: mTransformType3D = TransformType3D.ImproveXYPlanes; break; @@ -486,7 +456,7 @@ public class FastNoiseLite { mTransformType3D = TransformType3D.ImproveXZPlanes; break; default: - switch (mNoiseType) { + switch(mNoiseType) { case OpenSimplex2: case OpenSimplex2S: mTransformType3D = TransformType3D.DefaultOpenSimplex2; @@ -508,11 +478,11 @@ public class FastNoiseLite { public void setRotationType3D(RotationType3D rotationType3D) { mRotationType3D = rotationType3D; UpdateTransformType3D(); - UpdateWarpTransformType3D(); + updateWarpTransformType3D(); } - private void UpdateWarpTransformType3D() { - switch (mRotationType3D) { + private void updateWarpTransformType3D() { + switch(mRotationType3D) { case ImproveXYPlanes: mWarpTransformType3D = TransformType3D.ImproveXYPlanes; break; @@ -520,7 +490,7 @@ public class FastNoiseLite { mWarpTransformType3D = TransformType3D.ImproveXZPlanes; break; default: - switch (mDomainWarpType) { + switch(mDomainWarpType) { case OpenSimplex2: case OpenSimplex2Reduced: mWarpTransformType3D = TransformType3D.DefaultOpenSimplex2; @@ -550,24 +520,20 @@ public class FastNoiseLite { */ public void setFractalOctaves(int octaves) { mOctaves = octaves; - CalculateFractalBounding(); + calculateFractalBounding(); } - private void CalculateFractalBounding() { - double gain = FastAbs(mGain); - double amp = gain; + private void calculateFractalBounding() { + double gain = fastAbs(mGain); + double amp = gain; double ampFractal = 1.0f; - for (int i = 1; i < mOctaves; i++) { + for(int i = 1; i < mOctaves; i++) { ampFractal += amp; amp *= gain; } mFractalBounding = 1 / ampFractal; } - private static double FastAbs(double f) { - return f < 0 ? -f : f; - } - /** * Sets octave lacunarity for all fractal noise types *

@@ -584,7 +550,7 @@ public class FastNoiseLite { */ public void setFractalGain(double gain) { mGain = gain; - CalculateFractalBounding(); + calculateFractalBounding(); } /** @@ -641,7 +607,7 @@ public class FastNoiseLite { */ public void setDomainWarpType(DomainWarpType domainWarpType) { mDomainWarpType = domainWarpType; - UpdateWarpTransformType3D(); + updateWarpTransformType3D(); } /** @@ -658,17 +624,18 @@ public class FastNoiseLite { *

* Noise output bounded between -1...1 */ - public double getNoise(/*FNLdouble*/ double x, /*FNLdouble*/ double y) { + @Override + public double getNoise(double x, double y) { x *= mFrequency; y *= mFrequency; - switch (mNoiseType) { + switch(mNoiseType) { case OpenSimplex2: case OpenSimplex2S: { - /*FNLdouble*/ - final /*FNLdouble*/ double SQRT3 = 1.7320508075688772935274463415059; - final /*FNLdouble*/ double F2 = 0.5f * (SQRT3 - 1); - /*FNLdouble*/ + + final double SQRT3 = 1.7320508075688772935274463415059; + final double F2 = 0.5f * (SQRT3 - 1); + double t = (x + y) * F2; x += t; y += t; @@ -678,15 +645,15 @@ public class FastNoiseLite { break; } - switch (mFractalType) { + switch(mFractalType) { default: - return GenNoiseSingle(mSeed, x, y); + return genNoiseSingle(mSeed, x, y); case FBm: - return GenFractalFBm(x, y); + return genFractalFBm(x, y); case Ridged: - return GenFractalRidged(x, y); + return genFractalRidged(x, y); case PingPong: - return GenFractalPingPong(x, y); + return genFractalPingPong(x, y); } } @@ -695,42 +662,43 @@ public class FastNoiseLite { *

* Noise output bounded between -1...1 */ - public double getNoise(/*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + @Override + public double getNoise(double x, double y, double z) { x *= mFrequency; y *= mFrequency; z *= mFrequency; - switch (mTransformType3D) { + switch(mTransformType3D) { case ImproveXYPlanes: { - /*FNLdouble*/ + double xy = x + y; - /*FNLdouble*/ + double s2 = xy * -0.211324865405187D; - /*FNLdouble*/ + z *= 0.577350269189626; x += s2 - z; y = y + s2 - z; - /*FNLdouble*/ + z += xy * 0.577350269189626; } break; case ImproveXZPlanes: { - /*FNLdouble*/ + double xz = x + z; - /*FNLdouble*/ + double s2 = xz * -0.211324865405187D; - /*FNLdouble*/ + y *= 0.577350269189626; x += s2 - y; z += s2 - y; - /*FNLdouble*/ + y += xz * 0.577350269189626; } break; case DefaultOpenSimplex2: { - /*FNLdouble*/ - final /*FNLdouble*/ double R3 = 2.0 / 3.0; - /*FNLdouble*/ + + final double R3 = 2.0 / 3.0; + double r = (x + y + z) * R3; // Rotation, not skew x = r - x; y = r - y; @@ -741,15 +709,15 @@ public class FastNoiseLite { break; } - switch (mFractalType) { + switch(mFractalType) { default: - return GenNoiseSingle(mSeed, x, y, z); + return genNoiseSingle(mSeed, x, y, z); case FBm: - return GenFractalFBm(x, y, z); + return genFractalFBm(x, y, z); case Ridged: - return GenFractalRidged(x, y, z); + return genFractalRidged(x, y, z); case PingPong: - return GenFractalPingPong(x, y, z); + return genFractalPingPong(x, y, z); } } @@ -761,15 +729,15 @@ public class FastNoiseLite { * noise = GetNoise(x, y) */ public void domainWarp(Vector2 coord) { - switch (mFractalType) { + switch(mFractalType) { default: - DomainWarpSingle(coord); + domainWarpSingle(coord); break; case DomainWarpProgressive: - DomainWarpFractalProgressive(coord); + domainWarpFractalProgressive(coord); break; case DomainWarpIndependent: - DomainWarpFractalIndependent(coord); + domainWarpFractalIndependent(coord); break; } } @@ -782,66 +750,66 @@ public class FastNoiseLite { * noise = GetNoise(x, y, z) */ public void domainWarp(Vector3 coord) { - switch (mFractalType) { + switch(mFractalType) { default: - DomainWarpSingle(coord); + domainWarpSingle(coord); break; case DomainWarpProgressive: - DomainWarpFractalProgressive(coord); + domainWarpFractalProgressive(coord); break; case DomainWarpIndependent: - DomainWarpFractalIndependent(coord); + domainWarpFractalIndependent(coord); break; } } - private double GenNoiseSingle(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y) { - switch (mNoiseType) { + private double genNoiseSingle(int seed, double x, double y) { + switch(mNoiseType) { case OpenSimplex2: - return SingleSimplex(seed, x, y); + return singleSimplex(seed, x, y); case OpenSimplex2S: - return SingleOpenSimplex2S(seed, x, y); + return singleOpenSimplex2S(seed, x, y); case Cellular: - return SingleCellular(seed, x, y); + return singleCellular(seed, x, y); case Perlin: - return SinglePerlin(seed, x, y); + return singlePerlin(seed, x, y); case ValueCubic: - return SingleValueCubic(seed, x, y); + return singleValueCubic(seed, x, y); case Value: - return SingleValue(seed, x, y); + return singleValue(seed, x, y); default: return 0; } } - private double GenNoiseSingle(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { - switch (mNoiseType) { + private double genNoiseSingle(int seed, double x, double y, double z) { + switch(mNoiseType) { case OpenSimplex2: - return SingleOpenSimplex2(seed, x, y, z); + return singleOpenSimplex2(seed, x, y, z); case OpenSimplex2S: - return SingleOpenSimplex2S(seed, x, y, z); + return singleOpenSimplex2S(seed, x, y, z); case Cellular: - return SingleCellular(seed, x, y, z); + return singleCellular(seed, x, y, z); case Perlin: - return SinglePerlin(seed, x, y, z); + return singlePerlin(seed, x, y, z); case ValueCubic: - return SingleValueCubic(seed, x, y, z); + return singleValueCubic(seed, x, y, z); case Value: - return SingleValue(seed, x, y, z); + return singleValue(seed, x, y, z); default: return 0; } } - private double GenFractalFBm(/*FNLdouble*/ double x, /*FNLdouble*/ double y) { - int seed = mSeed; - double sum = 0; - double amp = mFractalBounding; + private double genFractalFBm(double x, double y) { + int seed = mSeed; + double sum = 0; + double amp = mFractalBounding; - for (int i = 0; i < mOctaves; i++) { - double noise = GenNoiseSingle(seed++, x, y); + for(int i = 0; i < mOctaves; i++) { + double noise = genNoiseSingle(seed++, x, y); sum += noise * amp; - amp *= Lerp(1.0f, FastMin(noise + 1, 2) * 0.5f, mWeightedStrength); + amp *= lerp(1.0f, fastMin(noise + 1, 2) * 0.5f, mWeightedStrength); x *= mLacunarity; y *= mLacunarity; @@ -851,15 +819,15 @@ public class FastNoiseLite { return sum; } - private double GenFractalFBm(/*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { - int seed = mSeed; - double sum = 0; - double amp = mFractalBounding; + private double genFractalFBm(double x, double y, double z) { + int seed = mSeed; + double sum = 0; + double amp = mFractalBounding; - for (int i = 0; i < mOctaves; i++) { - double noise = GenNoiseSingle(seed++, x, y, z); + for(int i = 0; i < mOctaves; i++) { + double noise = genNoiseSingle(seed++, x, y, z); sum += noise * amp; - amp *= Lerp(1.0f, (noise + 1) * 0.5f, mWeightedStrength); + amp *= lerp(1.0f, (noise + 1) * 0.5f, mWeightedStrength); x *= mLacunarity; y *= mLacunarity; @@ -870,15 +838,15 @@ public class FastNoiseLite { return sum; } - private double GenFractalRidged(/*FNLdouble*/ double x, /*FNLdouble*/ double y) { - int seed = mSeed; - double sum = 0; - double amp = mFractalBounding; + private double genFractalRidged(double x, double y) { + int seed = mSeed; + double sum = 0; + double amp = mFractalBounding; - for (int i = 0; i < mOctaves; i++) { - double noise = FastAbs(GenNoiseSingle(seed++, x, y)); + for(int i = 0; i < mOctaves; i++) { + double noise = fastAbs(genNoiseSingle(seed++, x, y)); sum += (noise * -2 + 1) * amp; - amp *= Lerp(1.0f, 1 - noise, mWeightedStrength); + amp *= lerp(1.0f, 1 - noise, mWeightedStrength); x *= mLacunarity; y *= mLacunarity; @@ -889,15 +857,15 @@ public class FastNoiseLite { } // Generic noise gen - private double GenFractalRidged(/*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { - int seed = mSeed; - double sum = 0; - double amp = mFractalBounding; + private double genFractalRidged(double x, double y, double z) { + int seed = mSeed; + double sum = 0; + double amp = mFractalBounding; - for (int i = 0; i < mOctaves; i++) { - double noise = FastAbs(GenNoiseSingle(seed++, x, y, z)); + for(int i = 0; i < mOctaves; i++) { + double noise = fastAbs(genNoiseSingle(seed++, x, y, z)); sum += (noise * -2 + 1) * amp; - amp *= Lerp(1.0f, 1 - noise, mWeightedStrength); + amp *= lerp(1.0f, 1 - noise, mWeightedStrength); x *= mLacunarity; y *= mLacunarity; @@ -908,15 +876,15 @@ public class FastNoiseLite { return sum; } - private double GenFractalPingPong(/*FNLdouble*/ double x, /*FNLdouble*/ double y) { - int seed = mSeed; - double sum = 0; - double amp = mFractalBounding; + private double genFractalPingPong(double x, double y) { + int seed = mSeed; + double sum = 0; + double amp = mFractalBounding; - for (int i = 0; i < mOctaves; i++) { - double noise = PingPong((GenNoiseSingle(seed++, x, y) + 1) * mPingPongStength); + for(int i = 0; i < mOctaves; i++) { + double noise = pingPong((genNoiseSingle(seed++, x, y) + 1) * mPingPongStength); sum += (noise - 0.5f) * 2 * amp; - amp *= Lerp(1.0f, noise, mWeightedStrength); + amp *= lerp(1.0f, noise, mWeightedStrength); x *= mLacunarity; y *= mLacunarity; @@ -927,15 +895,15 @@ public class FastNoiseLite { } // Noise Coordinate Transforms (frequency, and possible skew or rotation) - private double GenFractalPingPong(/*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { - int seed = mSeed; - double sum = 0; - double amp = mFractalBounding; + private double genFractalPingPong(double x, double y, double z) { + int seed = mSeed; + double sum = 0; + double amp = mFractalBounding; - for (int i = 0; i < mOctaves; i++) { - double noise = PingPong((GenNoiseSingle(seed++, x, y, z) + 1) * mPingPongStength); + for(int i = 0; i < mOctaves; i++) { + double noise = pingPong((genNoiseSingle(seed++, x, y, z) + 1) * mPingPongStength); sum += (noise - 0.5f) * 2 * amp; - amp *= Lerp(1.0f, noise, mWeightedStrength); + amp *= lerp(1.0f, noise, mWeightedStrength); x *= mLacunarity; y *= mLacunarity; @@ -946,10 +914,10 @@ public class FastNoiseLite { return sum; } - private double SingleSimplex(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y) { + private double singleSimplex(int seed, double x, double y) { // 2D OpenSimplex2 case uses the same algorithm as ordinary Simplex. final double SQRT3 = 1.7320508075688772935274463415059f; - final double G2 = (3 - SQRT3) / 6; + final double G2 = (3 - SQRT3) / 6; /* * --- Skew moved to switch statements before fractal evaluation --- @@ -958,49 +926,49 @@ public class FastNoiseLite { * x += s; y += s; */ - int i = FastFloor(x); - int j = FastFloor(y); + int i = fastFloor(x); + int j = fastFloor(y); double xi = x - i; double yi = y - j; - double t = (xi + yi) * G2; + double t = (xi + yi) * G2; double x0 = xi - t; double y0 = yi - t; - i *= PrimeX; - j *= PrimeY; + i *= PRIME_X; + j *= PRIME_Y; double n0, n1, n2; double a = 0.5f - x0 * x0 - y0 * y0; - if (a <= 0) n0 = 0; + if(a <= 0) n0 = 0; else { - n0 = (a * a) * (a * a) * GradCoord(seed, i, j, x0, y0); + n0 = (a * a) * (a * a) * gradCoord(seed, i, j, x0, y0); } double c = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); - if (c <= 0) n2 = 0; + if(c <= 0) n2 = 0; else { double x2 = x0 + (2 * G2 - 1); double y2 = y0 + (2 * G2 - 1); - n2 = (c * c) * (c * c) * GradCoord(seed, i + PrimeX, j + PrimeY, x2, y2); + n2 = (c * c) * (c * c) * gradCoord(seed, i + PRIME_X, j + PRIME_Y, x2, y2); } - if (y0 > x0) { + if(y0 > x0) { double x1 = x0 + G2; double y1 = y0 + (G2 - 1); - double b = 0.5f - x1 * x1 - y1 * y1; - if (b <= 0) n1 = 0; + double b = 0.5f - x1 * x1 - y1 * y1; + if(b <= 0) n1 = 0; else { - n1 = (b * b) * (b * b) * GradCoord(seed, i, j + PrimeY, x1, y1); + n1 = (b * b) * (b * b) * gradCoord(seed, i, j + PRIME_Y, x1, y1); } } else { double x1 = x0 + (G2 - 1); double y1 = y0 + G2; - double b = 0.5f - x1 * x1 - y1 * y1; - if (b <= 0) n1 = 0; + double b = 0.5f - x1 * x1 - y1 * y1; + if(b <= 0) n1 = 0; else { - n1 = (b * b) * (b * b) * GradCoord(seed, i + PrimeX, j, x1, y1); + n1 = (b * b) * (b * b) * gradCoord(seed, i + PRIME_X, j, x1, y1); } } @@ -1008,7 +976,7 @@ public class FastNoiseLite { } // Fractal FBm - private double SingleOpenSimplex2(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + private double singleOpenSimplex2(int seed, double x, double y, double z) { // 3D OpenSimplex2 case uses two offset rotated cube grids. /* * --- Rotation moved to switch statements before fractal evaluation --- @@ -1017,9 +985,9 @@ public class FastNoiseLite { * x = r - x; y = r - y; z = r - z; */ - int i = FastRound(x); - int j = FastRound(y); - int k = FastRound(z); + int i = fastRound(x); + int j = fastRound(y); + int k = fastRound(z); double x0 = x - i; double y0 = y - j; double z0 = z - k; @@ -1032,39 +1000,39 @@ public class FastNoiseLite { double ay0 = yNSign * -y0; double az0 = zNSign * -z0; - i *= PrimeX; - j *= PrimeY; - k *= PrimeZ; + i *= PRIME_X; + j *= PRIME_Y; + k *= PRIME_Z; double value = 0; - double a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); + double a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); - for (int l = 0; ; l++) { - if (a > 0) { - value += (a * a) * (a * a) * GradCoord(seed, i, j, k, x0, y0, z0); + for(int l = 0; ; l++) { + if(a > 0) { + value += (a * a) * (a * a) * gradCoord(seed, i, j, k, x0, y0, z0); } - if (ax0 >= ay0 && ax0 >= az0) { + if(ax0 >= ay0 && ax0 >= az0) { double b = a + ax0 + ax0; - if (b > 1) { + if(b > 1) { b -= 1; - value += (b * b) * (b * b) * GradCoord(seed, i - xNSign * PrimeX, j, k, x0 + xNSign, y0, z0); + value += (b * b) * (b * b) * gradCoord(seed, i - xNSign * PRIME_X, j, k, x0 + xNSign, y0, z0); } - } else if (ay0 > ax0 && ay0 >= az0) { + } else if(ay0 > ax0 && ay0 >= az0) { double b = a + ay0 + ay0; - if (b > 1) { + if(b > 1) { b -= 1; - value += (b * b) * (b * b) * GradCoord(seed, i, j - yNSign * PrimeY, k, x0, y0 + yNSign, z0); + value += (b * b) * (b * b) * gradCoord(seed, i, j - yNSign * PRIME_Y, k, x0, y0 + yNSign, z0); } } else { double b = a + az0 + az0; - if (b > 1) { + if(b > 1) { b -= 1; - value += (b * b) * (b * b) * GradCoord(seed, i, j, k - zNSign * PrimeZ, x0, y0, z0 + zNSign); + value += (b * b) * (b * b) * gradCoord(seed, i, j, k - zNSign * PRIME_Z, x0, y0, z0 + zNSign); } } - if (l == 1) break; + if(l == 1) break; ax0 = 0.5f - ax0; ay0 = 0.5f - ay0; @@ -1076,9 +1044,9 @@ public class FastNoiseLite { a += (0.75f - ax0) - (ay0 + az0); - i += (xNSign >> 1) & PrimeX; - j += (yNSign >> 1) & PrimeY; - k += (zNSign >> 1) & PrimeZ; + i += (xNSign >> 1) & PRIME_X; + j += (yNSign >> 1) & PRIME_Y; + k += (zNSign >> 1) & PRIME_Z; xNSign = -xNSign; yNSign = -yNSign; @@ -1091,11 +1059,11 @@ public class FastNoiseLite { } @SuppressWarnings("NumericOverflow") - private double SingleOpenSimplex2S(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y) { + private double singleOpenSimplex2S(int seed, double x, double y) { // 2D OpenSimplex2S case is a modified 2D simplex noise. - /*FNLdouble*/ - final /*FNLdouble*/ double SQRT3 = 1.7320508075688772935274463415059; - final /*FNLdouble*/ double G2 = (3 - SQRT3) / 6; + + final double SQRT3 = 1.7320508075688772935274463415059; + final double G2 = (3 - SQRT3) / 6; /* * --- Skew moved to TransformNoiseCoordinate method --- @@ -1104,92 +1072,92 @@ public class FastNoiseLite { * x += s; y += s; */ - int i = FastFloor(x); - int j = FastFloor(y); + int i = fastFloor(x); + int j = fastFloor(y); double xi = x - i; double yi = y - j; - i *= PrimeX; - j *= PrimeY; - int i1 = i + PrimeX; - int j1 = j + PrimeY; + i *= PRIME_X; + j *= PRIME_Y; + int i1 = i + PRIME_X; + int j1 = j + PRIME_Y; - double t = (xi + yi) * G2; + double t = (xi + yi) * G2; double x0 = xi - t; double y0 = yi - t; - double a0 = (2.0f / 3.0f) - x0 * x0 - y0 * y0; - double value = (a0 * a0) * (a0 * a0) * GradCoord(seed, i, j, x0, y0); + double a0 = (2.0f / 3.0f) - x0 * x0 - y0 * y0; + double value = (a0 * a0) * (a0 * a0) * gradCoord(seed, i, j, x0, y0); double a1 = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a0); double x1 = x0 - (1 - 2 * G2); double y1 = y0 - (1 - 2 * G2); - value += (a1 * a1) * (a1 * a1) * GradCoord(seed, i1, j1, x1, y1); + value += (a1 * a1) * (a1 * a1) * gradCoord(seed, i1, j1, x1, y1); // Nested conditionals were faster than compact bit logic/arithmetic. double xmyi = xi - yi; - if (t > G2) { - if (xi + xmyi > 1) { + if(t > G2) { + if(xi + xmyi > 1) { double x2 = x0 + (3 * G2 - 2); double y2 = y0 + (3 * G2 - 1); double a2 = (2.0f / 3.0f) - x2 * x2 - y2 * y2; - if (a2 > 0) { - value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i + (PrimeX << 1), j + PrimeY, x2, y2); + if(a2 > 0) { + value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i + (PRIME_X << 1), j + PRIME_Y, x2, y2); } } else { double x2 = x0 + G2; double y2 = y0 + (G2 - 1); double a2 = (2.0f / 3.0f) - x2 * x2 - y2 * y2; - if (a2 > 0) { - value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i, j + PrimeY, x2, y2); + if(a2 > 0) { + value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i, j + PRIME_Y, x2, y2); } } - if (yi - xmyi > 1) { + if(yi - xmyi > 1) { double x3 = x0 + (3 * G2 - 1); double y3 = y0 + (3 * G2 - 2); double a3 = (2.0f / 3.0f) - x3 * x3 - y3 * y3; - if (a3 > 0) { - value += (a3 * a3) * (a3 * a3) * GradCoord(seed, i + PrimeX, j + (PrimeY << 1), x3, y3); + if(a3 > 0) { + value += (a3 * a3) * (a3 * a3) * gradCoord(seed, i + PRIME_X, j + (PRIME_Y << 1), x3, y3); } } else { double x3 = x0 + (G2 - 1); double y3 = y0 + G2; double a3 = (2.0f / 3.0f) - x3 * x3 - y3 * y3; - if (a3 > 0) { - value += (a3 * a3) * (a3 * a3) * GradCoord(seed, i + PrimeX, j, x3, y3); + if(a3 > 0) { + value += (a3 * a3) * (a3 * a3) * gradCoord(seed, i + PRIME_X, j, x3, y3); } } } else { - if (xi + xmyi < 0) { + if(xi + xmyi < 0) { double x2 = x0 + (1 - G2); double y2 = y0 - G2; double a2 = (2.0f / 3.0f) - x2 * x2 - y2 * y2; - if (a2 > 0) { - value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i - PrimeX, j, x2, y2); + if(a2 > 0) { + value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i - PRIME_X, j, x2, y2); } } else { double x2 = x0 + (G2 - 1); double y2 = y0 + G2; double a2 = (2.0f / 3.0f) - x2 * x2 - y2 * y2; - if (a2 > 0) { - value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i + PrimeX, j, x2, y2); + if(a2 > 0) { + value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i + PRIME_X, j, x2, y2); } } - if (yi < xmyi) { + if(yi < xmyi) { double x2 = x0 - G2; double y2 = y0 - (G2 - 1); double a2 = (2.0f / 3.0f) - x2 * x2 - y2 * y2; - if (a2 > 0) { - value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i, j - PrimeY, x2, y2); + if(a2 > 0) { + value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i, j - PRIME_Y, x2, y2); } } else { double x2 = x0 + G2; double y2 = y0 + (G2 - 1); double a2 = (2.0f / 3.0f) - x2 * x2 - y2 * y2; - if (a2 > 0) { - value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i, j + PrimeY, x2, y2); + if(a2 > 0) { + value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i, j + PRIME_Y, x2, y2); } } } @@ -1199,7 +1167,7 @@ public class FastNoiseLite { // Fractal Ridged @SuppressWarnings("NumericOverflow") - private double SingleOpenSimplex2S(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { + private double singleOpenSimplex2S(int seed, double x, double y, double z) { // 3D OpenSimplex2S case uses two offset rotated cube grids. /* * --- Rotation moved to TransformNoiseCoordinate method --- @@ -1208,16 +1176,16 @@ public class FastNoiseLite { * x = r - x; y = r - y; z = r - z; */ - int i = FastFloor(x); - int j = FastFloor(y); - int k = FastFloor(z); + int i = fastFloor(x); + int j = fastFloor(y); + int k = fastFloor(z); double xi = x - i; double yi = y - j; double zi = z - k; - i *= PrimeX; - j *= PrimeY; - k *= PrimeZ; + i *= PRIME_X; + j *= PRIME_Y; + k *= PRIME_Z; int seed2 = seed + 1293373; int xNMask = (int) (-0.5f - xi); @@ -1228,14 +1196,14 @@ public class FastNoiseLite { double y0 = yi + yNMask; double z0 = zi + zNMask; double a0 = 0.75f - x0 * x0 - y0 * y0 - z0 * z0; - double value = (a0 * a0) * (a0 * a0) * GradCoord(seed, i + (xNMask & PrimeX), j + (yNMask & PrimeY), k + (zNMask & PrimeZ), x0, y0, + double value = (a0 * a0) * (a0 * a0) * gradCoord(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x0, y0, z0); double x1 = xi - 0.5f; double y1 = yi - 0.5f; double z1 = zi - 0.5f; double a1 = 0.75f - x1 * x1 - y1 * y1 - z1 * z1; - value += (a1 * a1) * (a1 * a1) * GradCoord(seed2, i + PrimeX, j + PrimeY, k + PrimeZ, x1, y1, z1); + value += (a1 * a1) * (a1 * a1) * gradCoord(seed2, i + PRIME_X, j + PRIME_Y, k + PRIME_Z, x1, y1, z1); double xAFlipMask0 = ((xNMask | 1) << 1) * x1; double yAFlipMask0 = ((yNMask | 1) << 1) * y1; @@ -1245,100 +1213,100 @@ public class FastNoiseLite { double zAFlipMask1 = (-2 - (zNMask << 2)) * z1 - 1.0f; boolean skip5 = false; - double a2 = xAFlipMask0 + a0; - if (a2 > 0) { + double a2 = xAFlipMask0 + a0; + if(a2 > 0) { double x2 = x0 - (xNMask | 1); - value += (a2 * a2) * (a2 * a2) * GradCoord(seed, i + (~xNMask & PrimeX), j + (yNMask & PrimeY), k + (zNMask & PrimeZ), x2, y0, + value += (a2 * a2) * (a2 * a2) * gradCoord(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x2, y0, z0); } else { double a3 = yAFlipMask0 + zAFlipMask0 + a0; - if (a3 > 0) { + if(a3 > 0) { double y3 = y0 - (yNMask | 1); double z3 = z0 - (zNMask | 1); - value += (a3 * a3) * (a3 * a3) * GradCoord(seed, i + (xNMask & PrimeX), j + (~yNMask & PrimeY), k + (~zNMask & PrimeZ), x0, + value += (a3 * a3) * (a3 * a3) * gradCoord(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), x0, y3, z3); } double a4 = xAFlipMask1 + a1; - if (a4 > 0) { + if(a4 > 0) { double x4 = (xNMask | 1) + x1; - value += (a4 * a4) * (a4 * a4) * GradCoord(seed2, i + (xNMask & (PrimeX << 1)), j + PrimeY, k + PrimeZ, x4, y1, z1); + value += (a4 * a4) * (a4 * a4) * gradCoord(seed2, i + (xNMask & (PRIME_X << 1)), j + PRIME_Y, k + PRIME_Z, x4, y1, z1); skip5 = true; } } boolean skip9 = false; - double a6 = yAFlipMask0 + a0; - if (a6 > 0) { + double a6 = yAFlipMask0 + a0; + if(a6 > 0) { double y6 = y0 - (yNMask | 1); - value += (a6 * a6) * (a6 * a6) * GradCoord(seed, i + (xNMask & PrimeX), j + (~yNMask & PrimeY), k + (zNMask & PrimeZ), x0, y6, + value += (a6 * a6) * (a6 * a6) * gradCoord(seed, i + (xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z), x0, y6, z0); } else { double a7 = xAFlipMask0 + zAFlipMask0 + a0; - if (a7 > 0) { + if(a7 > 0) { double x7 = x0 - (xNMask | 1); double z7 = z0 - (zNMask | 1); - value += (a7 * a7) * (a7 * a7) * GradCoord(seed, i + (~xNMask & PrimeX), j + (yNMask & PrimeY), k + (~zNMask & PrimeZ), x7, + value += (a7 * a7) * (a7 * a7) * gradCoord(seed, i + (~xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), x7, y0, z7); } double a8 = yAFlipMask1 + a1; - if (a8 > 0) { + if(a8 > 0) { double y8 = (yNMask | 1) + y1; - value += (a8 * a8) * (a8 * a8) * GradCoord(seed2, i + PrimeX, j + (yNMask & (PrimeY << 1)), k + PrimeZ, x1, y8, z1); + value += (a8 * a8) * (a8 * a8) * gradCoord(seed2, i + PRIME_X, j + (yNMask & (PRIME_Y << 1)), k + PRIME_Z, x1, y8, z1); skip9 = true; } } boolean skipD = false; - double aA = zAFlipMask0 + a0; - if (aA > 0) { + double aA = zAFlipMask0 + a0; + if(aA > 0) { double zA = z0 - (zNMask | 1); - value += (aA * aA) * (aA * aA) * GradCoord(seed, i + (xNMask & PrimeX), j + (yNMask & PrimeY), k + (~zNMask & PrimeZ), x0, y0, + value += (aA * aA) * (aA * aA) * gradCoord(seed, i + (xNMask & PRIME_X), j + (yNMask & PRIME_Y), k + (~zNMask & PRIME_Z), x0, y0, zA); } else { double aB = xAFlipMask0 + yAFlipMask0 + a0; - if (aB > 0) { + if(aB > 0) { double xB = x0 - (xNMask | 1); double yB = y0 - (yNMask | 1); - value += (aB * aB) * (aB * aB) * GradCoord(seed, i + (~xNMask & PrimeX), j + (~yNMask & PrimeY), k + (zNMask & PrimeZ), xB, + value += (aB * aB) * (aB * aB) * gradCoord(seed, i + (~xNMask & PRIME_X), j + (~yNMask & PRIME_Y), k + (zNMask & PRIME_Z), xB, yB, z0); } double aC = zAFlipMask1 + a1; - if (aC > 0) { + if(aC > 0) { double zC = (zNMask | 1) + z1; - value += (aC * aC) * (aC * aC) * GradCoord(seed2, i + PrimeX, j + PrimeY, k + (zNMask & (PrimeZ << 1)), x1, y1, zC); + value += (aC * aC) * (aC * aC) * gradCoord(seed2, i + PRIME_X, j + PRIME_Y, k + (zNMask & (PRIME_Z << 1)), x1, y1, zC); skipD = true; } } - if (!skip5) { + if(!skip5) { double a5 = yAFlipMask1 + zAFlipMask1 + a1; - if (a5 > 0) { + if(a5 > 0) { double y5 = (yNMask | 1) + y1; double z5 = (zNMask | 1) + z1; - value += (a5 * a5) * (a5 * a5) * GradCoord(seed2, i + PrimeX, j + (yNMask & (PrimeY << 1)), k + (zNMask & (PrimeZ << 1)), + value += (a5 * a5) * (a5 * a5) * gradCoord(seed2, i + PRIME_X, j + (yNMask & (PRIME_Y << 1)), k + (zNMask & (PRIME_Z << 1)), x1, y5, z5); } } - if (!skip9) { + if(!skip9) { double a9 = xAFlipMask1 + zAFlipMask1 + a1; - if (a9 > 0) { + if(a9 > 0) { double x9 = (xNMask | 1) + x1; double z9 = (zNMask | 1) + z1; - value += (a9 * a9) * (a9 * a9) * GradCoord(seed2, i + (xNMask & (PrimeX << 1)), j + PrimeY, k + (zNMask & (PrimeZ << 1)), x9, + value += (a9 * a9) * (a9 * a9) * gradCoord(seed2, i + (xNMask & (PRIME_X << 1)), j + PRIME_Y, k + (zNMask & (PRIME_Z << 1)), x9, y1, z9); } } - if (!skipD) { + if(!skipD) { double aD = xAFlipMask1 + yAFlipMask1 + a1; - if (aD > 0) { + if(aD > 0) { double xD = (xNMask | 1) + x1; double yD = (yNMask | 1) + y1; - value += (aD * aD) * (aD * aD) * GradCoord(seed2, i + (xNMask & (PrimeX << 1)), j + (yNMask & (PrimeY << 1)), k + PrimeZ, + value += (aD * aD) * (aD * aD) * gradCoord(seed2, i + (xNMask & (PRIME_X << 1)), j + (yNMask & (PRIME_Y << 1)), k + PRIME_Z, xD, yD, z1); } } @@ -1346,9 +1314,9 @@ public class FastNoiseLite { return value * 9.046026385208288f; } - private double SingleCellular(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y) { - int xr = FastRound(x); - int yr = FastRound(y); + private double singleCellular(int seed, double x, double y) { + int xr = fastRound(x); + int yr = fastRound(y); double distance0 = Double.MAX_VALUE; double distance1 = Double.MAX_VALUE; @@ -1356,8 +1324,8 @@ public class FastNoiseLite { double cellularJitter = 0.43701595f * mCellularJitterModifier; - int xPrimed = (xr - 1) * PrimeX; - int yPrimedBase = (yr - 1) * PrimeY; + int xPrimed = (xr - 1) * PRIME_X; + int yPrimedBase = (yr - 1) * PRIME_Y; Vector2 center = new Vector2(x, y); @@ -1369,86 +1337,86 @@ public class FastNoiseLite { int yPrimed = yPrimedBase; for(int yi = yr - 1; yi <= yr + 1; yi++) { - int hash = Hash(seed, xPrimed, yPrimed); - int idx = hash & (255 << 1); + int hash = hash(seed, xPrimed, yPrimed); + int idx = hash & (255 << 1); - double vecX = (xi - x) + RandVecs2D[idx] * cellularJitter; - double vecY = (yi - y) + RandVecs2D[idx | 1] * cellularJitter; + double vecX = (xi - x) + RAND_VECS_2D[idx] * cellularJitter; + double vecY = (yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter; double newDistance = vecX * vecX + vecY * vecY; - distance1 = FastMax(FastMin(distance1, newDistance), distance0); - if (newDistance < distance0) { + distance1 = fastMax(fastMin(distance1, newDistance), distance0); + if(newDistance < distance0) { distance0 = newDistance; closestHash = hash; - center.x = (xi + RandVecs2D[idx] * cellularJitter) / mFrequency; - center.y = (yi + RandVecs2D[idx | 1] * cellularJitter) / mFrequency; + center.setX((xi + RAND_VECS_2D[idx] * cellularJitter) / mFrequency); + center.setZ((yi + RAND_VECS_2D[idx | 1] * cellularJitter) / mFrequency); } - yPrimed += PrimeY; + yPrimed += PRIME_Y; } - xPrimed += PrimeX; + xPrimed += PRIME_X; } break; case Manhattan: - for (int xi = xr - 1; xi <= xr + 1; xi++) { + for(int xi = xr - 1; xi <= xr + 1; xi++) { int yPrimed = yPrimedBase; - for (int yi = yr - 1; yi <= yr + 1; yi++) { - int hash = Hash(seed, xPrimed, yPrimed); - int idx = hash & (255 << 1); + for(int yi = yr - 1; yi <= yr + 1; yi++) { + int hash = hash(seed, xPrimed, yPrimed); + int idx = hash & (255 << 1); - double vecX = (xi - x) + RandVecs2D[idx] * cellularJitter; - double vecY = (yi - y) + RandVecs2D[idx | 1] * cellularJitter; + double vecX = (xi - x) + RAND_VECS_2D[idx] * cellularJitter; + double vecY = (yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter; - double newDistance = FastAbs(vecX) + FastAbs(vecY); + double newDistance = fastAbs(vecX) + fastAbs(vecY); - distance1 = FastMax(FastMin(distance1, newDistance), distance0); - if (newDistance < distance0) { + distance1 = fastMax(fastMin(distance1, newDistance), distance0); + if(newDistance < distance0) { distance0 = newDistance; closestHash = hash; - center.x = (xi + RandVecs2D[idx] * cellularJitter) / mFrequency; - center.y = (yi + RandVecs2D[idx | 1] * cellularJitter) / mFrequency; + center.setX((xi + RAND_VECS_2D[idx] * cellularJitter) / mFrequency); + center.setZ((yi + RAND_VECS_2D[idx | 1] * cellularJitter) / mFrequency); } - yPrimed += PrimeY; + yPrimed += PRIME_Y; } - xPrimed += PrimeX; + xPrimed += PRIME_X; } break; case Hybrid: - for (int xi = xr - 1; xi <= xr + 1; xi++) { + for(int xi = xr - 1; xi <= xr + 1; xi++) { int yPrimed = yPrimedBase; - for (int yi = yr - 1; yi <= yr + 1; yi++) { - int hash = Hash(seed, xPrimed, yPrimed); - int idx = hash & (255 << 1); + for(int yi = yr - 1; yi <= yr + 1; yi++) { + int hash = hash(seed, xPrimed, yPrimed); + int idx = hash & (255 << 1); - double vecX = (xi - x) + RandVecs2D[idx] * cellularJitter; - double vecY = (yi - y) + RandVecs2D[idx | 1] * cellularJitter; + double vecX = (xi - x) + RAND_VECS_2D[idx] * cellularJitter; + double vecY = (yi - y) + RAND_VECS_2D[idx | 1] * cellularJitter; - double newDistance = (FastAbs(vecX) + FastAbs(vecY)) + (vecX * vecX + vecY * vecY); + double newDistance = (fastAbs(vecX) + fastAbs(vecY)) + (vecX * vecX + vecY * vecY); - distance1 = FastMax(FastMin(distance1, newDistance), distance0); - if (newDistance < distance0) { + distance1 = fastMax(fastMin(distance1, newDistance), distance0); + if(newDistance < distance0) { distance0 = newDistance; closestHash = hash; - center.x = (xi + RandVecs2D[idx] * cellularJitter) / mFrequency; - center.y = (yi + RandVecs2D[idx | 1] * cellularJitter) / mFrequency; + center.setX((xi + RAND_VECS_2D[idx] * cellularJitter) / mFrequency); + center.setZ((yi + RAND_VECS_2D[idx | 1] * cellularJitter) / mFrequency); } - yPrimed += PrimeY; + yPrimed += PRIME_Y; } - xPrimed += PrimeX; + xPrimed += PRIME_X; } break; } - if (mCellularDistanceFunction == CellularDistanceFunction.Euclidean && mCellularReturnType != CellularReturnType.CellValue) { - distance0 = FastSqrt(distance0); - if (mCellularReturnType != CellularReturnType.CellValue) { - distance1 = FastSqrt(distance1); + if(mCellularDistanceFunction == CellularDistanceFunction.Euclidean && mCellularReturnType != CellularReturnType.CellValue) { + distance0 = fastSqrt(distance0); + if(mCellularReturnType != CellularReturnType.CellValue) { + distance1 = fastSqrt(distance1); } } - switch (mCellularReturnType) { + switch(mCellularReturnType) { case CellValue: return closestHash * (1 / 2147483648.0f); case Distance: @@ -1464,17 +1432,17 @@ public class FastNoiseLite { case Distance2Div: return distance0 / distance1 - 1; case NoiseLookup: - return cellularNoiseLookup.getNoise(center.x, center.y); + return cellularNoiseLookup.getNoise(center.getX(), center.getZ()); default: return 0; } } - // Fractal PingPong - private double SingleCellular(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { - int xr = FastRound(x); - int yr = FastRound(y); - int zr = FastRound(z); + // Fractal pingPong + private double singleCellular(int seed, double x, double y, double z) { + int xr = fastRound(x); + int yr = fastRound(y); + int zr = fastRound(z); double distance0 = Double.MAX_VALUE; double distance1 = Double.MAX_VALUE; @@ -1482,9 +1450,9 @@ public class FastNoiseLite { double cellularJitter = 0.39614353f * mCellularJitterModifier; - int xPrimed = (xr - 1) * PrimeX; - int yPrimedBase = (yr - 1) * PrimeY; - int zPrimedBase = (zr - 1) * PrimeZ; + int xPrimed = (xr - 1) * PRIME_X; + int yPrimedBase = (yr - 1) * PRIME_Y; + int zPrimedBase = (zr - 1) * PRIME_Z; Vector3 center = new Vector3(x, y, z); @@ -1497,108 +1465,108 @@ public class FastNoiseLite { for(int yi = yr - 1; yi <= yr + 1; yi++) { int zPrimed = zPrimedBase; - for (int zi = zr - 1; zi <= zr + 1; zi++) { - int hash = Hash(seed, xPrimed, yPrimed, zPrimed); - int idx = hash & (255 << 2); + for(int zi = zr - 1; zi <= zr + 1; zi++) { + int hash = hash(seed, xPrimed, yPrimed, zPrimed); + int idx = hash & (255 << 2); - double vecX = (xi - x) + RandVecs3D[idx] * cellularJitter; - double vecY = (yi - y) + RandVecs3D[idx | 1] * cellularJitter; - double vecZ = (zi - z) + RandVecs3D[idx | 2] * cellularJitter; + double vecX = (xi - x) + RAND_VECS_3D[idx] * cellularJitter; + double vecY = (yi - y) + RAND_VECS_3D[idx | 1] * cellularJitter; + double vecZ = (zi - z) + RAND_VECS_3D[idx | 2] * cellularJitter; double newDistance = vecX * vecX + vecY * vecY + vecZ * vecZ; - distance1 = FastMax(FastMin(distance1, newDistance), distance0); - if (newDistance < distance0) { + distance1 = fastMax(fastMin(distance1, newDistance), distance0); + if(newDistance < distance0) { distance0 = newDistance; closestHash = hash; - center.x = (xi + RandVecs3D[idx] * cellularJitter) / mFrequency; - center.y = (yi + RandVecs3D[idx | 1] * cellularJitter) / mFrequency; - center.z = (zi + RandVecs3D[idx | 2] * cellularJitter) / mFrequency; + center.setX((xi + RAND_VECS_3D[idx] * cellularJitter) / mFrequency); + center.setY((yi + RAND_VECS_3D[idx | 1] * cellularJitter) / mFrequency); + center.setZ((zi + RAND_VECS_3D[idx | 2] * cellularJitter) / mFrequency); } - zPrimed += PrimeZ; + zPrimed += PRIME_Z; } - yPrimed += PrimeY; + yPrimed += PRIME_Y; } - xPrimed += PrimeX; + xPrimed += PRIME_X; } break; case Manhattan: - for (int xi = xr - 1; xi <= xr + 1; xi++) { + for(int xi = xr - 1; xi <= xr + 1; xi++) { int yPrimed = yPrimedBase; - for (int yi = yr - 1; yi <= yr + 1; yi++) { + for(int yi = yr - 1; yi <= yr + 1; yi++) { int zPrimed = zPrimedBase; - for (int zi = zr - 1; zi <= zr + 1; zi++) { - int hash = Hash(seed, xPrimed, yPrimed, zPrimed); - int idx = hash & (255 << 2); + for(int zi = zr - 1; zi <= zr + 1; zi++) { + int hash = hash(seed, xPrimed, yPrimed, zPrimed); + int idx = hash & (255 << 2); - double vecX = (xi - x) + RandVecs3D[idx] * cellularJitter; - double vecY = (yi - y) + RandVecs3D[idx | 1] * cellularJitter; - double vecZ = (zi - z) + RandVecs3D[idx | 2] * cellularJitter; + double vecX = (xi - x) + RAND_VECS_3D[idx] * cellularJitter; + double vecY = (yi - y) + RAND_VECS_3D[idx | 1] * cellularJitter; + double vecZ = (zi - z) + RAND_VECS_3D[idx | 2] * cellularJitter; - double newDistance = FastAbs(vecX) + FastAbs(vecY) + FastAbs(vecZ); + double newDistance = fastAbs(vecX) + fastAbs(vecY) + fastAbs(vecZ); - distance1 = FastMax(FastMin(distance1, newDistance), distance0); - if (newDistance < distance0) { + distance1 = fastMax(fastMin(distance1, newDistance), distance0); + if(newDistance < distance0) { distance0 = newDistance; closestHash = hash; - center.x = (xi + RandVecs3D[idx] * cellularJitter) / mFrequency; - center.y = (yi + RandVecs3D[idx | 1] * cellularJitter) / mFrequency; - center.z = (zi + RandVecs3D[idx | 2] * cellularJitter) / mFrequency; + center.setX((xi + RAND_VECS_3D[idx] * cellularJitter) / mFrequency); + center.setY((yi + RAND_VECS_3D[idx | 1] * cellularJitter) / mFrequency); + center.setZ((zi + RAND_VECS_3D[idx | 2] * cellularJitter) / mFrequency); } - zPrimed += PrimeZ; + zPrimed += PRIME_Z; } - yPrimed += PrimeY; + yPrimed += PRIME_Y; } - xPrimed += PrimeX; + xPrimed += PRIME_X; } break; case Hybrid: - for (int xi = xr - 1; xi <= xr + 1; xi++) { + for(int xi = xr - 1; xi <= xr + 1; xi++) { int yPrimed = yPrimedBase; - for (int yi = yr - 1; yi <= yr + 1; yi++) { + for(int yi = yr - 1; yi <= yr + 1; yi++) { int zPrimed = zPrimedBase; - for (int zi = zr - 1; zi <= zr + 1; zi++) { - int hash = Hash(seed, xPrimed, yPrimed, zPrimed); - int idx = hash & (255 << 2); + for(int zi = zr - 1; zi <= zr + 1; zi++) { + int hash = hash(seed, xPrimed, yPrimed, zPrimed); + int idx = hash & (255 << 2); - double vecX = (xi - x) + RandVecs3D[idx] * cellularJitter; - double vecY = (yi - y) + RandVecs3D[idx | 1] * cellularJitter; - double vecZ = (zi - z) + RandVecs3D[idx | 2] * cellularJitter; + double vecX = (xi - x) + RAND_VECS_3D[idx] * cellularJitter; + double vecY = (yi - y) + RAND_VECS_3D[idx | 1] * cellularJitter; + double vecZ = (zi - z) + RAND_VECS_3D[idx | 2] * cellularJitter; - double newDistance = (FastAbs(vecX) + FastAbs(vecY) + FastAbs(vecZ)) + + double newDistance = (fastAbs(vecX) + fastAbs(vecY) + fastAbs(vecZ)) + (vecX * vecX + vecY * vecY + vecZ * vecZ); - distance1 = FastMax(FastMin(distance1, newDistance), distance0); - if (newDistance < distance0) { + distance1 = fastMax(fastMin(distance1, newDistance), distance0); + if(newDistance < distance0) { distance0 = newDistance; closestHash = hash; - center.x = (xi + RandVecs3D[idx] * cellularJitter) / mFrequency; - center.y = (yi + RandVecs3D[idx | 1] * cellularJitter) / mFrequency; - center.z = (zi + RandVecs3D[idx | 2] * cellularJitter) / mFrequency; + center.setX((xi + RAND_VECS_3D[idx] * cellularJitter) / mFrequency); + center.setY((yi + RAND_VECS_3D[idx | 1] * cellularJitter) / mFrequency); + center.setZ((zi + RAND_VECS_3D[idx | 2] * cellularJitter) / mFrequency); } - zPrimed += PrimeZ; + zPrimed += PRIME_Z; } - yPrimed += PrimeY; + yPrimed += PRIME_Y; } - xPrimed += PrimeX; + xPrimed += PRIME_X; } break; default: break; } - if (mCellularDistanceFunction == CellularDistanceFunction.Euclidean && mCellularReturnType != CellularReturnType.CellValue) { - distance0 = FastSqrt(distance0); - if (mCellularReturnType != CellularReturnType.CellValue) { - distance1 = FastSqrt(distance1); + if(mCellularDistanceFunction == CellularDistanceFunction.Euclidean && mCellularReturnType != CellularReturnType.CellValue) { + distance0 = fastSqrt(distance0); + if(mCellularReturnType != CellularReturnType.CellValue) { + distance1 = fastSqrt(distance1); } } - switch (mCellularReturnType) { + switch(mCellularReturnType) { case CellValue: return closestHash * (1 / 2147483648.0f); case Distance: @@ -1614,40 +1582,40 @@ public class FastNoiseLite { case Distance2Div: return distance0 / distance1 - 1; case NoiseLookup: - return cellularNoiseLookup.getNoise(center.x, center.y, center.z); + return cellularNoiseLookup.getNoise(center.getX(), center.getY(), center.getZ()); default: return 0; } } - private double SinglePerlin(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y) { - int x0 = FastFloor(x); - int y0 = FastFloor(y); + private double singlePerlin(int seed, double x, double y) { + int x0 = fastFloor(x); + int y0 = fastFloor(y); double xd0 = x - x0; double yd0 = y - y0; double xd1 = xd0 - 1; double yd1 = yd0 - 1; - double xs = InterpQuintic(xd0); - double ys = InterpQuintic(yd0); + double xs = interpQuintic(xd0); + double ys = interpQuintic(yd0); - x0 *= PrimeX; - y0 *= PrimeY; - int x1 = x0 + PrimeX; - int y1 = y0 + PrimeY; + x0 *= PRIME_X; + y0 *= PRIME_Y; + int x1 = x0 + PRIME_X; + int y1 = y0 + PRIME_Y; - double xf0 = Lerp(GradCoord(seed, x0, y0, xd0, yd0), GradCoord(seed, x1, y0, xd1, yd0), xs); - double xf1 = Lerp(GradCoord(seed, x0, y1, xd0, yd1), GradCoord(seed, x1, y1, xd1, yd1), xs); + double xf0 = lerp(gradCoord(seed, x0, y0, xd0, yd0), gradCoord(seed, x1, y0, xd1, yd0), xs); + double xf1 = lerp(gradCoord(seed, x0, y1, xd0, yd1), gradCoord(seed, x1, y1, xd1, yd1), xs); - return Lerp(xf0, xf1, ys) * 1.4247691104677813f; + return lerp(xf0, xf1, ys) * 1.4247691104677813f; } // Simplex/OpenSimplex2 Noise - private double SinglePerlin(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { - int x0 = FastFloor(x); - int y0 = FastFloor(y); - int z0 = FastFloor(z); + private double singlePerlin(int seed, double x, double y, double z) { + int x0 = fastFloor(x); + int y0 = fastFloor(y); + int z0 = fastFloor(z); double xd0 = x - x0; double yd0 = y - y0; @@ -1656,217 +1624,217 @@ public class FastNoiseLite { double yd1 = yd0 - 1; double zd1 = zd0 - 1; - double xs = InterpQuintic(xd0); - double ys = InterpQuintic(yd0); - double zs = InterpQuintic(zd0); + double xs = interpQuintic(xd0); + double ys = interpQuintic(yd0); + double zs = interpQuintic(zd0); - x0 *= PrimeX; - y0 *= PrimeY; - z0 *= PrimeZ; - int x1 = x0 + PrimeX; - int y1 = y0 + PrimeY; - int z1 = z0 + PrimeZ; + x0 *= PRIME_X; + y0 *= PRIME_Y; + z0 *= PRIME_Z; + int x1 = x0 + PRIME_X; + int y1 = y0 + PRIME_Y; + int z1 = z0 + PRIME_Z; - double xf00 = Lerp(GradCoord(seed, x0, y0, z0, xd0, yd0, zd0), GradCoord(seed, x1, y0, z0, xd1, yd0, zd0), xs); - double xf10 = Lerp(GradCoord(seed, x0, y1, z0, xd0, yd1, zd0), GradCoord(seed, x1, y1, z0, xd1, yd1, zd0), xs); - double xf01 = Lerp(GradCoord(seed, x0, y0, z1, xd0, yd0, zd1), GradCoord(seed, x1, y0, z1, xd1, yd0, zd1), xs); - double xf11 = Lerp(GradCoord(seed, x0, y1, z1, xd0, yd1, zd1), GradCoord(seed, x1, y1, z1, xd1, yd1, zd1), xs); + double xf00 = lerp(gradCoord(seed, x0, y0, z0, xd0, yd0, zd0), gradCoord(seed, x1, y0, z0, xd1, yd0, zd0), xs); + double xf10 = lerp(gradCoord(seed, x0, y1, z0, xd0, yd1, zd0), gradCoord(seed, x1, y1, z0, xd1, yd1, zd0), xs); + double xf01 = lerp(gradCoord(seed, x0, y0, z1, xd0, yd0, zd1), gradCoord(seed, x1, y0, z1, xd1, yd0, zd1), xs); + double xf11 = lerp(gradCoord(seed, x0, y1, z1, xd0, yd1, zd1), gradCoord(seed, x1, y1, z1, xd1, yd1, zd1), xs); - double yf0 = Lerp(xf00, xf10, ys); - double yf1 = Lerp(xf01, xf11, ys); + double yf0 = lerp(xf00, xf10, ys); + double yf1 = lerp(xf01, xf11, ys); - return Lerp(yf0, yf1, zs) * 0.964921414852142333984375f; + return lerp(yf0, yf1, zs) * 0.964921414852142333984375f; } - private double SingleValueCubic(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y) { - int x1 = FastFloor(x); - int y1 = FastFloor(y); + private double singleValueCubic(int seed, double x, double y) { + int x1 = fastFloor(x); + int y1 = fastFloor(y); double xs = x - x1; double ys = y - y1; - x1 *= PrimeX; - y1 *= PrimeY; - int x0 = x1 - PrimeX; - int y0 = y1 - PrimeY; - int x2 = x1 + PrimeX; - int y2 = y1 + PrimeY; - int x3 = x1 + (PrimeX << 1); - int y3 = y1 + (PrimeY << 1); + x1 *= PRIME_X; + y1 *= PRIME_Y; + int x0 = x1 - PRIME_X; + int y0 = y1 - PRIME_Y; + int x2 = x1 + PRIME_X; + int y2 = y1 + PRIME_Y; + int x3 = x1 + (PRIME_X << 1); + int y3 = y1 + (PRIME_Y << 1); - return CubicLerp( - CubicLerp(ValCoord(seed, x0, y0), ValCoord(seed, x1, y0), ValCoord(seed, x2, y0), ValCoord(seed, x3, y0), + return cubicLerp( + cubicLerp(valCoord(seed, x0, y0), valCoord(seed, x1, y0), valCoord(seed, x2, y0), valCoord(seed, x3, y0), xs), - CubicLerp(ValCoord(seed, x0, y1), ValCoord(seed, x1, y1), ValCoord(seed, x2, y1), ValCoord(seed, x3, y1), + cubicLerp(valCoord(seed, x0, y1), valCoord(seed, x1, y1), valCoord(seed, x2, y1), valCoord(seed, x3, y1), xs), - CubicLerp(ValCoord(seed, x0, y2), ValCoord(seed, x1, y2), ValCoord(seed, x2, y2), ValCoord(seed, x3, y2), + cubicLerp(valCoord(seed, x0, y2), valCoord(seed, x1, y2), valCoord(seed, x2, y2), valCoord(seed, x3, y2), xs), - CubicLerp(ValCoord(seed, x0, y3), ValCoord(seed, x1, y3), ValCoord(seed, x2, y3), ValCoord(seed, x3, y3), + cubicLerp(valCoord(seed, x0, y3), valCoord(seed, x1, y3), valCoord(seed, x2, y3), valCoord(seed, x3, y3), xs), ys) * (1 / (1.5f * 1.5f)); } // OpenSimplex2S Noise - private double SingleValueCubic(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { - int x1 = FastFloor(x); - int y1 = FastFloor(y); - int z1 = FastFloor(z); + private double singleValueCubic(int seed, double x, double y, double z) { + int x1 = fastFloor(x); + int y1 = fastFloor(y); + int z1 = fastFloor(z); double xs = x - x1; double ys = y - y1; double zs = z - z1; - x1 *= PrimeX; - y1 *= PrimeY; - z1 *= PrimeZ; + x1 *= PRIME_X; + y1 *= PRIME_Y; + z1 *= PRIME_Z; - int x0 = x1 - PrimeX; - int y0 = y1 - PrimeY; - int z0 = z1 - PrimeZ; - int x2 = x1 + PrimeX; - int y2 = y1 + PrimeY; - int z2 = z1 + PrimeZ; - int x3 = x1 + (PrimeX << 1); - int y3 = y1 + (PrimeY << 1); - int z3 = z1 + (PrimeZ << 1); + int x0 = x1 - PRIME_X; + int y0 = y1 - PRIME_Y; + int z0 = z1 - PRIME_Z; + int x2 = x1 + PRIME_X; + int y2 = y1 + PRIME_Y; + int z2 = z1 + PRIME_Z; + int x3 = x1 + (PRIME_X << 1); + int y3 = y1 + (PRIME_Y << 1); + int z3 = z1 + (PRIME_Z << 1); - return CubicLerp( - CubicLerp( - CubicLerp(ValCoord(seed, x0, y0, z0), ValCoord(seed, x1, y0, z0), ValCoord(seed, x2, y0, z0), - ValCoord(seed, x3, y0, z0), xs), - CubicLerp(ValCoord(seed, x0, y1, z0), ValCoord(seed, x1, y1, z0), ValCoord(seed, x2, y1, z0), - ValCoord(seed, x3, y1, z0), xs), - CubicLerp(ValCoord(seed, x0, y2, z0), ValCoord(seed, x1, y2, z0), ValCoord(seed, x2, y2, z0), - ValCoord(seed, x3, y2, z0), xs), - CubicLerp(ValCoord(seed, x0, y3, z0), ValCoord(seed, x1, y3, z0), ValCoord(seed, x2, y3, z0), - ValCoord(seed, x3, y3, z0), xs), + return cubicLerp( + cubicLerp( + cubicLerp(valCoord(seed, x0, y0, z0), valCoord(seed, x1, y0, z0), valCoord(seed, x2, y0, z0), + valCoord(seed, x3, y0, z0), xs), + cubicLerp(valCoord(seed, x0, y1, z0), valCoord(seed, x1, y1, z0), valCoord(seed, x2, y1, z0), + valCoord(seed, x3, y1, z0), xs), + cubicLerp(valCoord(seed, x0, y2, z0), valCoord(seed, x1, y2, z0), valCoord(seed, x2, y2, z0), + valCoord(seed, x3, y2, z0), xs), + cubicLerp(valCoord(seed, x0, y3, z0), valCoord(seed, x1, y3, z0), valCoord(seed, x2, y3, z0), + valCoord(seed, x3, y3, z0), xs), ys), - CubicLerp( - CubicLerp(ValCoord(seed, x0, y0, z1), ValCoord(seed, x1, y0, z1), ValCoord(seed, x2, y0, z1), - ValCoord(seed, x3, y0, z1), xs), - CubicLerp(ValCoord(seed, x0, y1, z1), ValCoord(seed, x1, y1, z1), ValCoord(seed, x2, y1, z1), - ValCoord(seed, x3, y1, z1), xs), - CubicLerp(ValCoord(seed, x0, y2, z1), ValCoord(seed, x1, y2, z1), ValCoord(seed, x2, y2, z1), - ValCoord(seed, x3, y2, z1), xs), - CubicLerp(ValCoord(seed, x0, y3, z1), ValCoord(seed, x1, y3, z1), ValCoord(seed, x2, y3, z1), - ValCoord(seed, x3, y3, z1), xs), + cubicLerp( + cubicLerp(valCoord(seed, x0, y0, z1), valCoord(seed, x1, y0, z1), valCoord(seed, x2, y0, z1), + valCoord(seed, x3, y0, z1), xs), + cubicLerp(valCoord(seed, x0, y1, z1), valCoord(seed, x1, y1, z1), valCoord(seed, x2, y1, z1), + valCoord(seed, x3, y1, z1), xs), + cubicLerp(valCoord(seed, x0, y2, z1), valCoord(seed, x1, y2, z1), valCoord(seed, x2, y2, z1), + valCoord(seed, x3, y2, z1), xs), + cubicLerp(valCoord(seed, x0, y3, z1), valCoord(seed, x1, y3, z1), valCoord(seed, x2, y3, z1), + valCoord(seed, x3, y3, z1), xs), ys), - CubicLerp( - CubicLerp(ValCoord(seed, x0, y0, z2), ValCoord(seed, x1, y0, z2), ValCoord(seed, x2, y0, z2), - ValCoord(seed, x3, y0, z2), xs), - CubicLerp(ValCoord(seed, x0, y1, z2), ValCoord(seed, x1, y1, z2), ValCoord(seed, x2, y1, z2), - ValCoord(seed, x3, y1, z2), xs), - CubicLerp(ValCoord(seed, x0, y2, z2), ValCoord(seed, x1, y2, z2), ValCoord(seed, x2, y2, z2), - ValCoord(seed, x3, y2, z2), xs), - CubicLerp(ValCoord(seed, x0, y3, z2), ValCoord(seed, x1, y3, z2), ValCoord(seed, x2, y3, z2), - ValCoord(seed, x3, y3, z2), xs), + cubicLerp( + cubicLerp(valCoord(seed, x0, y0, z2), valCoord(seed, x1, y0, z2), valCoord(seed, x2, y0, z2), + valCoord(seed, x3, y0, z2), xs), + cubicLerp(valCoord(seed, x0, y1, z2), valCoord(seed, x1, y1, z2), valCoord(seed, x2, y1, z2), + valCoord(seed, x3, y1, z2), xs), + cubicLerp(valCoord(seed, x0, y2, z2), valCoord(seed, x1, y2, z2), valCoord(seed, x2, y2, z2), + valCoord(seed, x3, y2, z2), xs), + cubicLerp(valCoord(seed, x0, y3, z2), valCoord(seed, x1, y3, z2), valCoord(seed, x2, y3, z2), + valCoord(seed, x3, y3, z2), xs), ys), - CubicLerp( - CubicLerp(ValCoord(seed, x0, y0, z3), ValCoord(seed, x1, y0, z3), ValCoord(seed, x2, y0, z3), - ValCoord(seed, x3, y0, z3), xs), - CubicLerp(ValCoord(seed, x0, y1, z3), ValCoord(seed, x1, y1, z3), ValCoord(seed, x2, y1, z3), - ValCoord(seed, x3, y1, z3), xs), - CubicLerp(ValCoord(seed, x0, y2, z3), ValCoord(seed, x1, y2, z3), ValCoord(seed, x2, y2, z3), - ValCoord(seed, x3, y2, z3), xs), - CubicLerp(ValCoord(seed, x0, y3, z3), ValCoord(seed, x1, y3, z3), ValCoord(seed, x2, y3, z3), - ValCoord(seed, x3, y3, z3), xs), + cubicLerp( + cubicLerp(valCoord(seed, x0, y0, z3), valCoord(seed, x1, y0, z3), valCoord(seed, x2, y0, z3), + valCoord(seed, x3, y0, z3), xs), + cubicLerp(valCoord(seed, x0, y1, z3), valCoord(seed, x1, y1, z3), valCoord(seed, x2, y1, z3), + valCoord(seed, x3, y1, z3), xs), + cubicLerp(valCoord(seed, x0, y2, z3), valCoord(seed, x1, y2, z3), valCoord(seed, x2, y2, z3), + valCoord(seed, x3, y2, z3), xs), + cubicLerp(valCoord(seed, x0, y3, z3), valCoord(seed, x1, y3, z3), valCoord(seed, x2, y3, z3), + valCoord(seed, x3, y3, z3), xs), ys), zs) * (1 / (1.5f * 1.5f * 1.5f)); } - private double SingleValue(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y) { - int x0 = FastFloor(x); - int y0 = FastFloor(y); + private double singleValue(int seed, double x, double y) { + int x0 = fastFloor(x); + int y0 = fastFloor(y); - double xs = InterpHermite(x - x0); - double ys = InterpHermite(y - y0); + double xs = interpHermite(x - x0); + double ys = interpHermite(y - y0); - x0 *= PrimeX; - y0 *= PrimeY; - int x1 = x0 + PrimeX; - int y1 = y0 + PrimeY; + x0 *= PRIME_X; + y0 *= PRIME_Y; + int x1 = x0 + PRIME_X; + int y1 = y0 + PRIME_Y; - double xf0 = Lerp(ValCoord(seed, x0, y0), ValCoord(seed, x1, y0), xs); - double xf1 = Lerp(ValCoord(seed, x0, y1), ValCoord(seed, x1, y1), xs); + double xf0 = lerp(valCoord(seed, x0, y0), valCoord(seed, x1, y0), xs); + double xf1 = lerp(valCoord(seed, x0, y1), valCoord(seed, x1, y1), xs); - return Lerp(xf0, xf1, ys); + return lerp(xf0, xf1, ys); } // Cellular Noise - private double SingleValue(int seed, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { - int x0 = FastFloor(x); - int y0 = FastFloor(y); - int z0 = FastFloor(z); + private double singleValue(int seed, double x, double y, double z) { + int x0 = fastFloor(x); + int y0 = fastFloor(y); + int z0 = fastFloor(z); - double xs = InterpHermite(x - x0); - double ys = InterpHermite(y - y0); - double zs = InterpHermite(z - z0); + double xs = interpHermite(x - x0); + double ys = interpHermite(y - y0); + double zs = interpHermite(z - z0); - x0 *= PrimeX; - y0 *= PrimeY; - z0 *= PrimeZ; - int x1 = x0 + PrimeX; - int y1 = y0 + PrimeY; - int z1 = z0 + PrimeZ; + x0 *= PRIME_X; + y0 *= PRIME_Y; + z0 *= PRIME_Z; + int x1 = x0 + PRIME_X; + int y1 = y0 + PRIME_Y; + int z1 = z0 + PRIME_Z; - double xf00 = Lerp(ValCoord(seed, x0, y0, z0), ValCoord(seed, x1, y0, z0), xs); - double xf10 = Lerp(ValCoord(seed, x0, y1, z0), ValCoord(seed, x1, y1, z0), xs); - double xf01 = Lerp(ValCoord(seed, x0, y0, z1), ValCoord(seed, x1, y0, z1), xs); - double xf11 = Lerp(ValCoord(seed, x0, y1, z1), ValCoord(seed, x1, y1, z1), xs); + double xf00 = lerp(valCoord(seed, x0, y0, z0), valCoord(seed, x1, y0, z0), xs); + double xf10 = lerp(valCoord(seed, x0, y1, z0), valCoord(seed, x1, y1, z0), xs); + double xf01 = lerp(valCoord(seed, x0, y0, z1), valCoord(seed, x1, y0, z1), xs); + double xf11 = lerp(valCoord(seed, x0, y1, z1), valCoord(seed, x1, y1, z1), xs); - double yf0 = Lerp(xf00, xf10, ys); - double yf1 = Lerp(xf01, xf11, ys); + double yf0 = lerp(xf00, xf10, ys); + double yf1 = lerp(xf01, xf11, ys); - return Lerp(yf0, yf1, zs); + return lerp(yf0, yf1, zs); } - private void DoSingleDomainWarp(int seed, double amp, double freq, /*FNLdouble*/ double x, /*FNLdouble*/ double y, Vector2 coord) { - switch (mDomainWarpType) { + private void doSingleDomainWarp(int seed, double amp, double freq, double x, double y, Vector2 coord) { + switch(mDomainWarpType) { case OpenSimplex2: - SingleDomainWarpSimplexGradient(seed, amp * 38.283687591552734375f, freq, x, y, coord, false); + singleDomainWarpSimplexGradient(seed, amp * 38.283687591552734375f, freq, x, y, coord, false); break; case OpenSimplex2Reduced: - SingleDomainWarpSimplexGradient(seed, amp * 16.0f, freq, x, y, coord, true); + singleDomainWarpSimplexGradient(seed, amp * 16.0f, freq, x, y, coord, true); break; case BasicGrid: - SingleDomainWarpBasicGrid(seed, amp, freq, x, y, coord); + singleDomainWarpBasicGrid(seed, amp, freq, x, y, coord); break; } } // Perlin Noise - private void DoSingleDomainWarp(int seed, double amp, double freq, /*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ + private void doSingleDomainWarp(int seed, double amp, double freq, double x, double y, double z, Vector3 coord) { - switch (mDomainWarpType) { + switch(mDomainWarpType) { case OpenSimplex2: - SingleDomainWarpOpenSimplex2Gradient(seed, amp * 32.69428253173828125f, freq, x, y, z, coord, false); + singleDomainWarpOpenSimplex2Gradient(seed, amp * 32.69428253173828125f, freq, x, y, z, coord, false); break; case OpenSimplex2Reduced: - SingleDomainWarpOpenSimplex2Gradient(seed, amp * 7.71604938271605f, freq, x, y, z, coord, true); + singleDomainWarpOpenSimplex2Gradient(seed, amp * 7.71604938271605f, freq, x, y, z, coord, true); break; case BasicGrid: - SingleDomainWarpBasicGrid(seed, amp, freq, x, y, z, coord); + singleDomainWarpBasicGrid(seed, amp, freq, x, y, z, coord); break; } } - private void DomainWarpSingle(Vector2 coord) { - int seed = mSeed; - double amp = mDomainWarpAmp * mFractalBounding; + private void domainWarpSingle(Vector2 coord) { + int seed = mSeed; + double amp = mDomainWarpAmp * mFractalBounding; double freq = mFrequency; - /*FNLdouble*/ - double xs = coord.x; - /*FNLdouble*/ - double ys = coord.y; - switch (mDomainWarpType) { + + double xs = coord.getX(); + + double ys = coord.getZ(); + switch(mDomainWarpType) { case OpenSimplex2: case OpenSimplex2Reduced: { - /*FNLdouble*/ - final /*FNLdouble*/ double SQRT3 = 1.7320508075688772935274463415059; - final /*FNLdouble*/ double F2 = 0.5f * (SQRT3 - 1); - /*FNLdouble*/ + + final double SQRT3 = 1.7320508075688772935274463415059; + final double F2 = 0.5f * (SQRT3 - 1); + double t = (xs + ys) * F2; xs += t; ys += t; @@ -1876,52 +1844,52 @@ public class FastNoiseLite { break; } - DoSingleDomainWarp(seed, amp, freq, xs, ys, coord); + doSingleDomainWarp(seed, amp, freq, xs, ys, coord); } // Value Cubic Noise - private void DomainWarpSingle(Vector3 coord) { - int seed = mSeed; - double amp = mDomainWarpAmp * mFractalBounding; + private void domainWarpSingle(Vector3 coord) { + int seed = mSeed; + double amp = mDomainWarpAmp * mFractalBounding; double freq = mFrequency; - /*FNLdouble*/ - double xs = coord.x; - /*FNLdouble*/ - double ys = coord.y; - /*FNLdouble*/ - double zs = coord.z; - switch (mWarpTransformType3D) { + + double xs = coord.getX(); + + double ys = coord.getY(); + + double zs = coord.getZ(); + switch(mWarpTransformType3D) { case ImproveXYPlanes: { - /*FNLdouble*/ + double xy = xs + ys; - /*FNLdouble*/ + double s2 = xy * -0.211324865405187D; - /*FNLdouble*/ + zs *= 0.577350269189626; xs += s2 - zs; ys = ys + s2 - zs; - /*FNLdouble*/ + zs += xy * 0.577350269189626; } break; case ImproveXZPlanes: { - /*FNLdouble*/ + double xz = xs + zs; - /*FNLdouble*/ + double s2 = xz * -0.211324865405187D; - /*FNLdouble*/ + ys *= 0.577350269189626; xs += s2 - ys; zs += s2 - ys; - /*FNLdouble*/ + ys += xz * 0.577350269189626; } break; case DefaultOpenSimplex2: { - /*FNLdouble*/ - final /*FNLdouble*/ double R3 = 2.0 / 3.0; - /*FNLdouble*/ + + final double R3 = 2.0 / 3.0; + double r = (xs + ys + zs) * R3; // Rotation, not skew xs = r - xs; ys = r - ys; @@ -1932,26 +1900,26 @@ public class FastNoiseLite { break; } - DoSingleDomainWarp(seed, amp, freq, xs, ys, zs, coord); + doSingleDomainWarp(seed, amp, freq, xs, ys, zs, coord); } - private void DomainWarpFractalProgressive(Vector2 coord) { - int seed = mSeed; - double amp = mDomainWarpAmp * mFractalBounding; + private void domainWarpFractalProgressive(Vector2 coord) { + int seed = mSeed; + double amp = mDomainWarpAmp * mFractalBounding; double freq = mFrequency; - for (int i = 0; i < mOctaves; i++) { - /*FNLdouble*/ - double xs = coord.x; - /*FNLdouble*/ - double ys = coord.y; - switch (mDomainWarpType) { + for(int i = 0; i < mOctaves; i++) { + + double xs = coord.getX(); + + double ys = coord.getZ(); + switch(mDomainWarpType) { case OpenSimplex2: case OpenSimplex2Reduced: { - /*FNLdouble*/ - final /*FNLdouble*/ double SQRT3 = 1.7320508075688772935274463415059; - final /*FNLdouble*/ double F2 = 0.5f * (SQRT3 - 1); - /*FNLdouble*/ + + final double SQRT3 = 1.7320508075688772935274463415059; + final double F2 = 0.5f * (SQRT3 - 1); + double t = (xs + ys) * F2; xs += t; ys += t; @@ -1961,7 +1929,7 @@ public class FastNoiseLite { break; } - DoSingleDomainWarp(seed, amp, freq, xs, ys, coord); + doSingleDomainWarp(seed, amp, freq, xs, ys, coord); seed++; amp *= mGain; @@ -1970,49 +1938,49 @@ public class FastNoiseLite { } // Value Noise - private void DomainWarpFractalProgressive(Vector3 coord) { - int seed = mSeed; - double amp = mDomainWarpAmp * mFractalBounding; + private void domainWarpFractalProgressive(Vector3 coord) { + int seed = mSeed; + double amp = mDomainWarpAmp * mFractalBounding; double freq = mFrequency; - for (int i = 0; i < mOctaves; i++) { - /*FNLdouble*/ - double xs = coord.x; - /*FNLdouble*/ - double ys = coord.y; - /*FNLdouble*/ - double zs = coord.z; - switch (mWarpTransformType3D) { + for(int i = 0; i < mOctaves; i++) { + + double xs = coord.getX(); + + double ys = coord.getY(); + + double zs = coord.getZ(); + switch(mWarpTransformType3D) { case ImproveXYPlanes: { - /*FNLdouble*/ + double xy = xs + ys; - /*FNLdouble*/ + double s2 = xy * -0.211324865405187D; - /*FNLdouble*/ + zs *= 0.577350269189626; xs += s2 - zs; ys = ys + s2 - zs; - /*FNLdouble*/ + zs += xy * 0.577350269189626; } break; case ImproveXZPlanes: { - /*FNLdouble*/ + double xz = xs + zs; - /*FNLdouble*/ + double s2 = xz * -0.211324865405187D; - /*FNLdouble*/ + ys *= 0.577350269189626; xs += s2 - ys; zs += s2 - ys; - /*FNLdouble*/ + ys += xz * 0.577350269189626; } break; case DefaultOpenSimplex2: { - /*FNLdouble*/ - final /*FNLdouble*/ double R3 = 2.0 / 3.0; - /*FNLdouble*/ + + final double R3 = 2.0 / 3.0; + double r = (xs + ys + zs) * R3; // Rotation, not skew xs = r - xs; ys = r - ys; @@ -2023,7 +1991,7 @@ public class FastNoiseLite { break; } - DoSingleDomainWarp(seed, amp, freq, xs, ys, zs, coord); + doSingleDomainWarp(seed, amp, freq, xs, ys, zs, coord); seed++; amp *= mGain; @@ -2032,18 +2000,18 @@ public class FastNoiseLite { } // Domain Warp Fractal Independant - private void DomainWarpFractalIndependent(Vector2 coord) { - /*FNLdouble*/ - double xs = coord.x; - /*FNLdouble*/ - double ys = coord.y; - switch (mDomainWarpType) { + private void domainWarpFractalIndependent(Vector2 coord) { + + double xs = coord.getX(); + + double ys = coord.getZ(); + switch(mDomainWarpType) { case OpenSimplex2: case OpenSimplex2Reduced: { - /*FNLdouble*/ - final /*FNLdouble*/ double SQRT3 = 1.7320508075688772935274463415059; - final /*FNLdouble*/ double F2 = 0.5f * (SQRT3 - 1); - /*FNLdouble*/ + + final double SQRT3 = 1.7320508075688772935274463415059; + final double F2 = 0.5f * (SQRT3 - 1); + double t = (xs + ys) * F2; xs += t; ys += t; @@ -2053,12 +2021,12 @@ public class FastNoiseLite { break; } - int seed = mSeed; - double amp = mDomainWarpAmp * mFractalBounding; + int seed = mSeed; + double amp = mDomainWarpAmp * mFractalBounding; double freq = mFrequency; - for (int i = 0; i < mOctaves; i++) { - DoSingleDomainWarp(seed, amp, freq, xs, ys, coord); + for(int i = 0; i < mOctaves; i++) { + doSingleDomainWarp(seed, amp, freq, xs, ys, coord); seed++; amp *= mGain; @@ -2067,44 +2035,44 @@ public class FastNoiseLite { } // Domain Warp - private void DomainWarpFractalIndependent(Vector3 coord) { - /*FNLdouble*/ - double xs = coord.x; - /*FNLdouble*/ - double ys = coord.y; - /*FNLdouble*/ - double zs = coord.z; - switch (mWarpTransformType3D) { + private void domainWarpFractalIndependent(Vector3 coord) { + + double xs = coord.getX(); + + double ys = coord.getY(); + + double zs = coord.getZ(); + switch(mWarpTransformType3D) { case ImproveXYPlanes: { - /*FNLdouble*/ + double xy = xs + ys; - /*FNLdouble*/ + double s2 = xy * -0.211324865405187D; - /*FNLdouble*/ + zs *= 0.577350269189626; xs += s2 - zs; ys = ys + s2 - zs; - /*FNLdouble*/ + zs += xy * 0.577350269189626; } break; case ImproveXZPlanes: { - /*FNLdouble*/ + double xz = xs + zs; - /*FNLdouble*/ + double s2 = xz * -0.211324865405187D; - /*FNLdouble*/ + ys *= 0.577350269189626; xs += s2 - ys; zs += s2 - ys; - /*FNLdouble*/ + ys += xz * 0.577350269189626; } break; case DefaultOpenSimplex2: { - /*FNLdouble*/ - final /*FNLdouble*/ double R3 = 2.0 / 3.0; - /*FNLdouble*/ + + final double R3 = 2.0 / 3.0; + double r = (xs + ys + zs) * R3; // Rotation, not skew xs = r - xs; ys = r - ys; @@ -2115,12 +2083,12 @@ public class FastNoiseLite { break; } - int seed = mSeed; - double amp = mDomainWarpAmp * mFractalBounding; + int seed = mSeed; + double amp = mDomainWarpAmp * mFractalBounding; double freq = mFrequency; - for (int i = 0; i < mOctaves; i++) { - DoSingleDomainWarp(seed, amp, freq, xs, ys, zs, coord); + for(int i = 0; i < mOctaves; i++) { + doSingleDomainWarp(seed, amp, freq, xs, ys, zs, coord); seed++; amp *= mGain; @@ -2128,107 +2096,107 @@ public class FastNoiseLite { } } - private void SingleDomainWarpBasicGrid(int seed, double warpAmp, double frequency, /*FNLdouble*/ double x, /*FNLdouble*/ double y, + private void singleDomainWarpBasicGrid(int seed, double warpAmp, double frequency, double x, double y, Vector2 coord) { - /*FNLdouble*/ + double xf = x * frequency; - /*FNLdouble*/ + double yf = y * frequency; - int x0 = FastFloor(xf); - int y0 = FastFloor(yf); + int x0 = fastFloor(xf); + int y0 = fastFloor(yf); - double xs = InterpHermite(xf - x0); - double ys = InterpHermite(yf - y0); + double xs = interpHermite(xf - x0); + double ys = interpHermite(yf - y0); - x0 *= PrimeX; - y0 *= PrimeY; - int x1 = x0 + PrimeX; - int y1 = y0 + PrimeY; + x0 *= PRIME_X; + y0 *= PRIME_Y; + int x1 = x0 + PRIME_X; + int y1 = y0 + PRIME_Y; - int hash0 = Hash(seed, x0, y0) & (255 << 1); - int hash1 = Hash(seed, x1, y0) & (255 << 1); + int hash0 = hash(seed, x0, y0) & (255 << 1); + int hash1 = hash(seed, x1, y0) & (255 << 1); - double lx0x = Lerp(RandVecs2D[hash0], RandVecs2D[hash1], xs); - double ly0x = Lerp(RandVecs2D[hash0 | 1], RandVecs2D[hash1 | 1], xs); + double lx0x = lerp(RAND_VECS_2D[hash0], RAND_VECS_2D[hash1], xs); + double ly0x = lerp(RAND_VECS_2D[hash0 | 1], RAND_VECS_2D[hash1 | 1], xs); - hash0 = Hash(seed, x0, y1) & (255 << 1); - hash1 = Hash(seed, x1, y1) & (255 << 1); + hash0 = hash(seed, x0, y1) & (255 << 1); + hash1 = hash(seed, x1, y1) & (255 << 1); - double lx1x = Lerp(RandVecs2D[hash0], RandVecs2D[hash1], xs); - double ly1x = Lerp(RandVecs2D[hash0 | 1], RandVecs2D[hash1 | 1], xs); + double lx1x = lerp(RAND_VECS_2D[hash0], RAND_VECS_2D[hash1], xs); + double ly1x = lerp(RAND_VECS_2D[hash0 | 1], RAND_VECS_2D[hash1 | 1], xs); - coord.x += Lerp(lx0x, lx1x, ys) * warpAmp; - coord.y += Lerp(ly0x, ly1x, ys) * warpAmp; + coord.add(lerp(lx0x, lx1x, ys) * warpAmp, + lerp(ly0x, ly1x, ys) * warpAmp); } // Domain Warp Single Wrapper - private void SingleDomainWarpBasicGrid(int seed, double warpAmp, double frequency, /*FNLdouble*/ double x, /*FNLdouble*/ - double y, /*FNLdouble*/ double z, Vector3 coord) { - /*FNLdouble*/ + private void singleDomainWarpBasicGrid(int seed, double warpAmp, double frequency, double x, + double y, double z, Vector3 coord) { + double xf = x * frequency; - /*FNLdouble*/ + double yf = y * frequency; - /*FNLdouble*/ + double zf = z * frequency; - int x0 = FastFloor(xf); - int y0 = FastFloor(yf); - int z0 = FastFloor(zf); + int x0 = fastFloor(xf); + int y0 = fastFloor(yf); + int z0 = fastFloor(zf); - double xs = InterpHermite(xf - x0); - double ys = InterpHermite(yf - y0); - double zs = InterpHermite(zf - z0); + double xs = interpHermite(xf - x0); + double ys = interpHermite(yf - y0); + double zs = interpHermite(zf - z0); - x0 *= PrimeX; - y0 *= PrimeY; - z0 *= PrimeZ; - int x1 = x0 + PrimeX; - int y1 = y0 + PrimeY; - int z1 = z0 + PrimeZ; + x0 *= PRIME_X; + y0 *= PRIME_Y; + z0 *= PRIME_Z; + int x1 = x0 + PRIME_X; + int y1 = y0 + PRIME_Y; + int z1 = z0 + PRIME_Z; - int hash0 = Hash(seed, x0, y0, z0) & (255 << 2); - int hash1 = Hash(seed, x1, y0, z0) & (255 << 2); + int hash0 = hash(seed, x0, y0, z0) & (255 << 2); + int hash1 = hash(seed, x1, y0, z0) & (255 << 2); - double lx0x = Lerp(RandVecs3D[hash0], RandVecs3D[hash1], xs); - double ly0x = Lerp(RandVecs3D[hash0 | 1], RandVecs3D[hash1 | 1], xs); - double lz0x = Lerp(RandVecs3D[hash0 | 2], RandVecs3D[hash1 | 2], xs); + double lx0x = lerp(RAND_VECS_3D[hash0], RAND_VECS_3D[hash1], xs); + double ly0x = lerp(RAND_VECS_3D[hash0 | 1], RAND_VECS_3D[hash1 | 1], xs); + double lz0x = lerp(RAND_VECS_3D[hash0 | 2], RAND_VECS_3D[hash1 | 2], xs); - hash0 = Hash(seed, x0, y1, z0) & (255 << 2); - hash1 = Hash(seed, x1, y1, z0) & (255 << 2); + hash0 = hash(seed, x0, y1, z0) & (255 << 2); + hash1 = hash(seed, x1, y1, z0) & (255 << 2); - double lx1x = Lerp(RandVecs3D[hash0], RandVecs3D[hash1], xs); - double ly1x = Lerp(RandVecs3D[hash0 | 1], RandVecs3D[hash1 | 1], xs); - double lz1x = Lerp(RandVecs3D[hash0 | 2], RandVecs3D[hash1 | 2], xs); + double lx1x = lerp(RAND_VECS_3D[hash0], RAND_VECS_3D[hash1], xs); + double ly1x = lerp(RAND_VECS_3D[hash0 | 1], RAND_VECS_3D[hash1 | 1], xs); + double lz1x = lerp(RAND_VECS_3D[hash0 | 2], RAND_VECS_3D[hash1 | 2], xs); - double lx0y = Lerp(lx0x, lx1x, ys); - double ly0y = Lerp(ly0x, ly1x, ys); - double lz0y = Lerp(lz0x, lz1x, ys); + double lx0y = lerp(lx0x, lx1x, ys); + double ly0y = lerp(ly0x, ly1x, ys); + double lz0y = lerp(lz0x, lz1x, ys); - hash0 = Hash(seed, x0, y0, z1) & (255 << 2); - hash1 = Hash(seed, x1, y0, z1) & (255 << 2); + hash0 = hash(seed, x0, y0, z1) & (255 << 2); + hash1 = hash(seed, x1, y0, z1) & (255 << 2); - lx0x = Lerp(RandVecs3D[hash0], RandVecs3D[hash1], xs); - ly0x = Lerp(RandVecs3D[hash0 | 1], RandVecs3D[hash1 | 1], xs); - lz0x = Lerp(RandVecs3D[hash0 | 2], RandVecs3D[hash1 | 2], xs); + lx0x = lerp(RAND_VECS_3D[hash0], RAND_VECS_3D[hash1], xs); + ly0x = lerp(RAND_VECS_3D[hash0 | 1], RAND_VECS_3D[hash1 | 1], xs); + lz0x = lerp(RAND_VECS_3D[hash0 | 2], RAND_VECS_3D[hash1 | 2], xs); - hash0 = Hash(seed, x0, y1, z1) & (255 << 2); - hash1 = Hash(seed, x1, y1, z1) & (255 << 2); + hash0 = hash(seed, x0, y1, z1) & (255 << 2); + hash1 = hash(seed, x1, y1, z1) & (255 << 2); - lx1x = Lerp(RandVecs3D[hash0], RandVecs3D[hash1], xs); - ly1x = Lerp(RandVecs3D[hash0 | 1], RandVecs3D[hash1 | 1], xs); - lz1x = Lerp(RandVecs3D[hash0 | 2], RandVecs3D[hash1 | 2], xs); + lx1x = lerp(RAND_VECS_3D[hash0], RAND_VECS_3D[hash1], xs); + ly1x = lerp(RAND_VECS_3D[hash0 | 1], RAND_VECS_3D[hash1 | 1], xs); + lz1x = lerp(RAND_VECS_3D[hash0 | 2], RAND_VECS_3D[hash1 | 2], xs); - coord.x += Lerp(lx0y, Lerp(lx0x, lx1x, ys), zs) * warpAmp; - coord.y += Lerp(ly0y, Lerp(ly0x, ly1x, ys), zs) * warpAmp; - coord.z += Lerp(lz0y, Lerp(lz0x, lz1x, ys), zs) * warpAmp; + coord.add(lerp(lx0y, lerp(lx0x, lx1x, ys), zs) * warpAmp, + lerp(ly0y, lerp(ly0x, ly1x, ys), zs) * warpAmp, + lerp(lz0y, lerp(lz0x, lz1x, ys), zs) * warpAmp); } // Domain Warp Simplex/OpenSimplex2 - private void SingleDomainWarpSimplexGradient(int seed, double warpAmp, double frequency, /*FNLdouble*/ double x, /*FNLdouble*/ double y, + private void singleDomainWarpSimplexGradient(int seed, double warpAmp, double frequency, double x, double y, Vector2 coord, boolean outGradOnly) { final double SQRT3 = 1.7320508075688772935274463415059f; - final double G2 = (3 - SQRT3) / 6; + final double G2 = (3 - SQRT3) / 6; x *= frequency; y *= frequency; @@ -2240,38 +2208,38 @@ public class FastNoiseLite { * x += s; y += s; */ - int i = FastFloor(x); - int j = FastFloor(y); + int i = fastFloor(x); + int j = fastFloor(y); double xi = x - i; double yi = y - j; - double t = (xi + yi) * G2; + double t = (xi + yi) * G2; double x0 = xi - t; double y0 = yi - t; - i *= PrimeX; - j *= PrimeY; + i *= PRIME_X; + j *= PRIME_Y; double vx, vy; vx = vy = 0; double a = 0.5f - x0 * x0 - y0 * y0; - if (a > 0) { + if(a > 0) { double aaaa = (a * a) * (a * a); double xo, yo; - if (outGradOnly) { - int hash = Hash(seed, i, j) & (255 << 1); - xo = RandVecs2D[hash]; - yo = RandVecs2D[hash | 1]; + if(outGradOnly) { + int hash = hash(seed, i, j) & (255 << 1); + xo = RAND_VECS_2D[hash]; + yo = RAND_VECS_2D[hash | 1]; } else { - int hash = Hash(seed, i, j); - int index1 = hash & (127 << 1); - int index2 = (hash >> 7) & (255 << 1); - double xg = Gradients2D[index1]; - double yg = Gradients2D[index1 | 1]; - double value = x0 * xg + y0 * yg; - double xgo = RandVecs2D[index2]; - double ygo = RandVecs2D[index2 | 1]; + int hash = hash(seed, i, j); + int index1 = hash & (127 << 1); + int index2 = (hash >> 7) & (255 << 1); + double xg = GRADIENTS_2_D[index1]; + double yg = GRADIENTS_2_D[index1 | 1]; + double value = x0 * xg + y0 * yg; + double xgo = RAND_VECS_2D[index2]; + double ygo = RAND_VECS_2D[index2 | 1]; xo = value * xgo; yo = value * ygo; } @@ -2280,24 +2248,24 @@ public class FastNoiseLite { } double c = 2 * (1 - 2 * G2) * (1 / G2 - 2) * t + ((-2 * (1 - 2 * G2) * (1 - 2 * G2)) + a); - if (c > 0) { - double x2 = x0 + (2 * G2 - 1); - double y2 = y0 + (2 * G2 - 1); + if(c > 0) { + double x2 = x0 + (2 * G2 - 1); + double y2 = y0 + (2 * G2 - 1); double cccc = (c * c) * (c * c); double xo, yo; - if (outGradOnly) { - int hash = Hash(seed, i + PrimeX, j + PrimeY) & (255 << 1); - xo = RandVecs2D[hash]; - yo = RandVecs2D[hash | 1]; + if(outGradOnly) { + int hash = hash(seed, i + PRIME_X, j + PRIME_Y) & (255 << 1); + xo = RAND_VECS_2D[hash]; + yo = RAND_VECS_2D[hash | 1]; } else { - int hash = Hash(seed, i + PrimeX, j + PrimeY); - int index1 = hash & (127 << 1); - int index2 = (hash >> 7) & (255 << 1); - double xg = Gradients2D[index1]; - double yg = Gradients2D[index1 | 1]; - double value = x2 * xg + y2 * yg; - double xgo = RandVecs2D[index2]; - double ygo = RandVecs2D[index2 | 1]; + int hash = hash(seed, i + PRIME_X, j + PRIME_Y); + int index1 = hash & (127 << 1); + int index2 = (hash >> 7) & (255 << 1); + double xg = GRADIENTS_2_D[index1]; + double yg = GRADIENTS_2_D[index1 | 1]; + double value = x2 * xg + y2 * yg; + double xgo = RAND_VECS_2D[index2]; + double ygo = RAND_VECS_2D[index2 | 1]; xo = value * xgo; yo = value * ygo; } @@ -2305,26 +2273,26 @@ public class FastNoiseLite { vy += cccc * yo; } - if (y0 > x0) { + if(y0 > x0) { double x1 = x0 + G2; double y1 = y0 + (G2 - 1); - double b = 0.5f - x1 * x1 - y1 * y1; - if (b > 0) { + double b = 0.5f - x1 * x1 - y1 * y1; + if(b > 0) { double bbbb = (b * b) * (b * b); double xo, yo; - if (outGradOnly) { - int hash = Hash(seed, i, j + PrimeY) & (255 << 1); - xo = RandVecs2D[hash]; - yo = RandVecs2D[hash | 1]; + if(outGradOnly) { + int hash = hash(seed, i, j + PRIME_Y) & (255 << 1); + xo = RAND_VECS_2D[hash]; + yo = RAND_VECS_2D[hash | 1]; } else { - int hash = Hash(seed, i, j + PrimeY); - int index1 = hash & (127 << 1); - int index2 = (hash >> 7) & (255 << 1); - double xg = Gradients2D[index1]; - double yg = Gradients2D[index1 | 1]; - double value = x1 * xg + y1 * yg; - double xgo = RandVecs2D[index2]; - double ygo = RandVecs2D[index2 | 1]; + int hash = hash(seed, i, j + PRIME_Y); + int index1 = hash & (127 << 1); + int index2 = (hash >> 7) & (255 << 1); + double xg = GRADIENTS_2_D[index1]; + double yg = GRADIENTS_2_D[index1 | 1]; + double value = x1 * xg + y1 * yg; + double xgo = RAND_VECS_2D[index2]; + double ygo = RAND_VECS_2D[index2 | 1]; xo = value * xgo; yo = value * ygo; } @@ -2334,23 +2302,23 @@ public class FastNoiseLite { } else { double x1 = x0 + (G2 - 1); double y1 = y0 + G2; - double b = 0.5f - x1 * x1 - y1 * y1; - if (b > 0) { + double b = 0.5f - x1 * x1 - y1 * y1; + if(b > 0) { double bbbb = (b * b) * (b * b); double xo, yo; - if (outGradOnly) { - int hash = Hash(seed, i + PrimeX, j) & (255 << 1); - xo = RandVecs2D[hash]; - yo = RandVecs2D[hash | 1]; + if(outGradOnly) { + int hash = hash(seed, i + PRIME_X, j) & (255 << 1); + xo = RAND_VECS_2D[hash]; + yo = RAND_VECS_2D[hash | 1]; } else { - int hash = Hash(seed, i + PrimeX, j); - int index1 = hash & (127 << 1); - int index2 = (hash >> 7) & (255 << 1); - double xg = Gradients2D[index1]; - double yg = Gradients2D[index1 | 1]; - double value = x1 * xg + y1 * yg; - double xgo = RandVecs2D[index2]; - double ygo = RandVecs2D[index2 | 1]; + int hash = hash(seed, i + PRIME_X, j); + int index1 = hash & (127 << 1); + int index2 = (hash >> 7) & (255 << 1); + double xg = GRADIENTS_2_D[index1]; + double yg = GRADIENTS_2_D[index1 | 1]; + double value = x1 * xg + y1 * yg; + double xgo = RAND_VECS_2D[index2]; + double ygo = RAND_VECS_2D[index2 | 1]; xo = value * xgo; yo = value * ygo; } @@ -2359,13 +2327,13 @@ public class FastNoiseLite { } } - coord.x += vx * warpAmp; - coord.y += vy * warpAmp; + coord.add(vx * warpAmp, + vy * warpAmp); } // Domain Warp Fractal Progressive - private void SingleDomainWarpOpenSimplex2Gradient(int seed, double warpAmp, double frequency, /*FNLdouble*/ double x, /*FNLdouble*/ - double y, /*FNLdouble*/ double z, Vector3 coord, boolean outGradOnly) { + private void singleDomainWarpOpenSimplex2Gradient(int seed, double warpAmp, double frequency, double x, + double y, double z, Vector3 coord, boolean outGradOnly) { x *= frequency; y *= frequency; z *= frequency; @@ -2377,9 +2345,9 @@ public class FastNoiseLite { * x = r - x; y = r - y; z = r - z; */ - int i = FastRound(x); - int j = FastRound(y); - int k = FastRound(z); + int i = fastRound(x); + int j = fastRound(y); + int k = fastRound(z); double x0 = x - i; double y0 = y - j; double z0 = z - k; @@ -2392,34 +2360,34 @@ public class FastNoiseLite { double ay0 = yNSign * -y0; double az0 = zNSign * -z0; - i *= PrimeX; - j *= PrimeY; - k *= PrimeZ; + i *= PRIME_X; + j *= PRIME_Y; + k *= PRIME_Z; double vx, vy, vz; vx = vy = vz = 0; double a = (0.6f - x0 * x0) - (y0 * y0 + z0 * z0); - for (int l = 0; ; l++) { - if (a > 0) { + for(int l = 0; ; l++) { + if(a > 0) { double aaaa = (a * a) * (a * a); double xo, yo, zo; - if (outGradOnly) { - int hash = Hash(seed, i, j, k) & (255 << 2); - xo = RandVecs3D[hash]; - yo = RandVecs3D[hash | 1]; - zo = RandVecs3D[hash | 2]; + if(outGradOnly) { + int hash = hash(seed, i, j, k) & (255 << 2); + xo = RAND_VECS_3D[hash]; + yo = RAND_VECS_3D[hash | 1]; + zo = RAND_VECS_3D[hash | 2]; } else { - int hash = Hash(seed, i, j, k); - int index1 = hash & (63 << 2); - int index2 = (hash >> 6) & (255 << 2); - double xg = Gradients3D[index1]; - double yg = Gradients3D[index1 | 1]; - double zg = Gradients3D[index1 | 2]; - double value = x0 * xg + y0 * yg + z0 * zg; - double xgo = RandVecs3D[index2]; - double ygo = RandVecs3D[index2 | 1]; - double zgo = RandVecs3D[index2 | 2]; + int hash = hash(seed, i, j, k); + int index1 = hash & (63 << 2); + int index2 = (hash >> 6) & (255 << 2); + double xg = GRADIENTS_3D[index1]; + double yg = GRADIENTS_3D[index1 | 1]; + double zg = GRADIENTS_3D[index1 | 2]; + double value = x0 * xg + y0 * yg + z0 * zg; + double xgo = RAND_VECS_3D[index2]; + double ygo = RAND_VECS_3D[index2 | 1]; + double zgo = RAND_VECS_3D[index2 | 2]; xo = value * xgo; yo = value * ygo; zo = value * zgo; @@ -2429,48 +2397,48 @@ public class FastNoiseLite { vz += aaaa * zo; } - double b = a; - int i1 = i; - int j1 = j; - int k1 = k; + double b = a; + int i1 = i; + int j1 = j; + int k1 = k; double x1 = x0; double y1 = y0; double z1 = z0; - if (ax0 >= ay0 && ax0 >= az0) { + if(ax0 >= ay0 && ax0 >= az0) { x1 += xNSign; b = b + ax0 + ax0; - i1 -= xNSign * PrimeX; - } else if (ay0 > ax0 && ay0 >= az0) { + i1 -= xNSign * PRIME_X; + } else if(ay0 > ax0 && ay0 >= az0) { y1 += yNSign; b = b + ay0 + ay0; - j1 -= yNSign * PrimeY; + j1 -= yNSign * PRIME_Y; } else { z1 += zNSign; b = b + az0 + az0; - k1 -= zNSign * PrimeZ; + k1 -= zNSign * PRIME_Z; } - if (b > 1) { + if(b > 1) { b -= 1; double bbbb = (b * b) * (b * b); double xo, yo, zo; - if (outGradOnly) { - int hash = Hash(seed, i1, j1, k1) & (255 << 2); - xo = RandVecs3D[hash]; - yo = RandVecs3D[hash | 1]; - zo = RandVecs3D[hash | 2]; + if(outGradOnly) { + int hash = hash(seed, i1, j1, k1) & (255 << 2); + xo = RAND_VECS_3D[hash]; + yo = RAND_VECS_3D[hash | 1]; + zo = RAND_VECS_3D[hash | 2]; } else { - int hash = Hash(seed, i1, j1, k1); - int index1 = hash & (63 << 2); - int index2 = (hash >> 6) & (255 << 2); - double xg = Gradients3D[index1]; - double yg = Gradients3D[index1 | 1]; - double zg = Gradients3D[index1 | 2]; - double value = x1 * xg + y1 * yg + z1 * zg; - double xgo = RandVecs3D[index2]; - double ygo = RandVecs3D[index2 | 1]; - double zgo = RandVecs3D[index2 | 2]; + int hash = hash(seed, i1, j1, k1); + int index1 = hash & (63 << 2); + int index2 = (hash >> 6) & (255 << 2); + double xg = GRADIENTS_3D[index1]; + double yg = GRADIENTS_3D[index1 | 1]; + double zg = GRADIENTS_3D[index1 | 2]; + double value = x1 * xg + y1 * yg + z1 * zg; + double xgo = RAND_VECS_3D[index2]; + double ygo = RAND_VECS_3D[index2 | 1]; + double zgo = RAND_VECS_3D[index2 | 2]; xo = value * xgo; yo = value * ygo; zo = value * zgo; @@ -2480,7 +2448,7 @@ public class FastNoiseLite { vz += bbbb * zo; } - if (l == 1) break; + if(l == 1) break; ax0 = 0.5f - ax0; ay0 = 0.5f - ay0; @@ -2492,9 +2460,9 @@ public class FastNoiseLite { a += (0.75f - ax0) - (ay0 + az0); - i += (xNSign >> 1) & PrimeX; - j += (yNSign >> 1) & PrimeY; - k += (zNSign >> 1) & PrimeZ; + i += (xNSign >> 1) & PRIME_X; + j += (yNSign >> 1) & PRIME_Y; + k += (zNSign >> 1) & PRIME_Z; xNSign = -xNSign; yNSign = -yNSign; @@ -2503,9 +2471,9 @@ public class FastNoiseLite { seed += 1293373; } - coord.x += vx * warpAmp; - coord.y += vy * warpAmp; - coord.z += vz * warpAmp; + coord.add(vx * warpAmp, + vy * warpAmp, + vz * warpAmp); } public enum NoiseType { @@ -2570,28 +2538,4 @@ public class FastNoiseLite { ImproveXZPlanes, DefaultOpenSimplex2 } - - - public static class Vector2 { - public /*FNLdouble*/ double x; - public /*FNLdouble*/ double y; - - public Vector2(/*FNLdouble*/ double x, /*FNLdouble*/ double y) { - this.x = x; - this.y = y; - } - } - - - public static class Vector3 { - public /*FNLdouble*/ double x; - public /*FNLdouble*/ double y; - public /*FNLdouble*/ double z; - - public Vector3(/*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z) { - this.x = x; - this.y = y; - this.z = z; - } - } } \ No newline at end of file diff --git a/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/NoiseSampler.java b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/NoiseSampler.java new file mode 100644 index 000000000..55ce7cb38 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/NoiseSampler.java @@ -0,0 +1,28 @@ +package com.dfsek.terra.api.math.noise.samplers; + +import com.dfsek.terra.api.math.vector.Vector2; +import com.dfsek.terra.api.math.vector.Vector3; + +public interface NoiseSampler { + /** + * 2D noise at given position using current settings + *

+ * Noise output bounded between -1...1 + */ + double getNoise(/*FNLdouble*/ double x, /*FNLdouble*/ double y); + + /** + * 3D noise at given position using current settings + *

+ * Noise output bounded between -1...1 + */ + double getNoise(/*FNLdouble*/ double x, /*FNLdouble*/ double y, /*FNLdouble*/ double z); + + default double getNoise(Vector3 vector3) { + return getNoise(vector3.getX(), vector3.getY(), vector3.getZ()); + } + + default double getNoise(Vector2 vector2) { + return getNoise(vector2.getX(), vector2.getZ()); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/Normalizer.java b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/Normalizer.java new file mode 100644 index 000000000..2d24939c7 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/Normalizer.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.api.math.noise.samplers; + +public abstract class Normalizer implements NoiseSampler { + private final NoiseSampler sampler; + + protected Normalizer(NoiseSampler sampler) { + this.sampler = sampler; + } + + public abstract double normalize(double in); + + @Override + public double getNoise(double x, double y) { + return normalize(sampler.getNoise(x, y)); + } + + @Override + public double getNoise(double x, double y, double z) { + return normalize(sampler.getNoise(x, y, z)); + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java index 7b6e66a39..d78b0acc0 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java +++ b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector2.java @@ -172,6 +172,12 @@ public class Vector2 implements Cloneable { } } + public Vector2 add(double x, double z) { + this.x += x; + this.z += z; + return this; + } + @Override public String toString() { return "(" + x + ", " + z + ")"; diff --git a/common/src/main/java/com/dfsek/terra/api/math/voxel/DeformedSphere.java b/common/src/main/java/com/dfsek/terra/api/math/voxel/DeformedSphere.java index b3b9cbf80..325f74753 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/voxel/DeformedSphere.java +++ b/common/src/main/java/com/dfsek/terra/api/math/voxel/DeformedSphere.java @@ -1,10 +1,10 @@ package com.dfsek.terra.api.math.voxel; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import com.dfsek.terra.api.math.vector.Vector3; public class DeformedSphere extends VoxelGeometry { - public DeformedSphere(Vector3 start, int rad, double deform, FastNoiseLite noise) { + public DeformedSphere(Vector3 start, int rad, double deform, NoiseSampler noise) { for(int x = -rad; x <= rad; x++) { for(int y = -rad; y <= rad; y++) { for(int z = -rad; z <= rad; z++) { diff --git a/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java b/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java index 993d18ad6..87685a6a1 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java +++ b/common/src/main/java/com/dfsek/terra/api/world/biome/BiomeGrid.java @@ -1,6 +1,6 @@ package com.dfsek.terra.api.world.biome; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.world.generation.GenerationPhase; diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java index 2305b9141..f10ecfbf8 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/Palette.java @@ -1,7 +1,7 @@ package com.dfsek.terra.api.world.palette; import com.dfsek.terra.api.math.ProbabilityCollection; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import com.dfsek.terra.api.util.GlueList; import java.util.List; @@ -104,7 +104,7 @@ public abstract class Palette { return m; } - public E get(FastNoiseLite random, int x, int z) { + public E get(NoiseSampler random, int x, int z) { if(col) return this.collection.get(random, x, z); return m; } diff --git a/common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java b/common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java index 81b5aca40..6ac97f88b 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java +++ b/common/src/main/java/com/dfsek/terra/api/world/palette/SimplexPalette.java @@ -1,13 +1,13 @@ package com.dfsek.terra.api.world.palette; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import java.util.List; public class SimplexPalette extends Palette { - private final FastNoiseLite r; + private final NoiseSampler r; - public SimplexPalette(FastNoiseLite r) { + public SimplexPalette(NoiseSampler r) { this.r = r; } diff --git a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java index c4b7983f2..294dc0b66 100644 --- a/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java +++ b/common/src/main/java/com/dfsek/terra/biome/BiomeZone.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; import com.dfsek.terra.api.world.biome.BiomeGrid; import com.dfsek.terra.api.world.biome.NormalizationUtil; import com.dfsek.terra.config.base.ConfigPack; @@ -42,7 +42,7 @@ public class BiomeZone { * @return BiomeGrid at coordinates. */ public BiomeGrid getGrid(int x, int z) { - return grids[NormalizationUtil.normalize(useImage ? Objects.requireNonNull(imageLoader).getNoiseVal(x, z, channel) : noise.getNoise(x, z), grids.length, 4)]; + return grids[getNoise(x, z)]; } /** @@ -62,7 +62,7 @@ public class BiomeZone { * @return Normalized noise at coordinates */ public int getNoise(int x, int z) { - return NormalizationUtil.normalize(useImage ? Objects.requireNonNull(imageLoader).getNoiseVal(x, z, channel) : noise.getNoise(x, z), grids.length, 4); + return useImage ? Objects.requireNonNull(imageLoader).getNoiseVal(x, z, getSize() - 1, channel) : NormalizationUtil.normalize(noise.getNoise(x, z), grids.length, 4); } /** @@ -73,6 +73,6 @@ public class BiomeZone { * @return Raw noise at coordinates */ public double getRawNoise(int x, int z) { - return useImage ? Objects.requireNonNull(imageLoader).getNoiseVal(x, z, channel) : noise.getNoise(x, z); + return useImage ? Objects.requireNonNull(imageLoader).getNoiseVal(x, z, getSize() - 1, channel) : noise.getNoise(x, z); } } diff --git a/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java b/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java index 520ae5809..e51996e70 100644 --- a/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java +++ b/common/src/main/java/com/dfsek/terra/biome/grid/UserDefinedGrid.java @@ -3,7 +3,6 @@ package com.dfsek.terra.biome.grid; import com.dfsek.terra.api.math.vector.Location; import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.api.world.biome.BiomeGrid; -import com.dfsek.terra.api.world.biome.NormalizationUtil; import com.dfsek.terra.api.world.generation.GenerationPhase; import com.dfsek.terra.config.base.ConfigPack; import com.dfsek.terra.config.base.ConfigPackTemplate; @@ -28,9 +27,9 @@ public class UserDefinedGrid extends BiomeGrid { @Override public Biome getBiome(int x, int z, GenerationPhase phase) { if(fromImage) { - double xi = imageLoader.getNoiseVal(x, z, channelX); - double zi = imageLoader.getNoiseVal(x, z, channelZ); - return super.getGrid()[NormalizationUtil.normalize(xi, getSizeX(), 4)][NormalizationUtil.normalize(zi, getSizeZ(), 4)]; + int xi = imageLoader.getNoiseVal(x, z, getSizeX() - 1, channelX); + int zi = imageLoader.getNoiseVal(x, z, getSizeZ() - 1, channelZ); + return super.getGrid()[xi][zi]; } return super.getBiome(x, z, phase); } diff --git a/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java b/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java index d3e69f103..2dfb066ed 100644 --- a/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java +++ b/common/src/main/java/com/dfsek/terra/biome/postprocessing/CoordinatePerturb.java @@ -1,6 +1,6 @@ package com.dfsek.terra.biome.postprocessing; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; import com.dfsek.terra.api.math.vector.Vector2; /** diff --git a/common/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java b/common/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java index 848c2bb48..fce056c9f 100644 --- a/common/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java +++ b/common/src/main/java/com/dfsek/terra/biome/postprocessing/ErosionNoise.java @@ -1,6 +1,7 @@ package com.dfsek.terra.biome.postprocessing; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import net.jafama.FastMath; /** @@ -8,7 +9,7 @@ import net.jafama.FastMath; */ public class ErosionNoise { private final double thresh; - private final FastNoiseLite noise; + private final NoiseSampler noise; public ErosionNoise(double freq1, double thresh, int octaves, long seed) { FastNoiseLite main = new FastNoiseLite((int) (seed + 1)); diff --git a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java index 41dcebeb9..137ab4dbd 100644 --- a/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java +++ b/common/src/main/java/com/dfsek/terra/config/factories/PaletteFactory.java @@ -1,6 +1,6 @@ package com.dfsek.terra.config.factories; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.BlockData; import com.dfsek.terra.api.util.FastRandom; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java index b5664d403..72990fd61 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/FloraLayerLoader.java @@ -5,7 +5,7 @@ import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; import com.dfsek.terra.api.world.flora.Flora; import com.dfsek.terra.config.loaders.Types; import com.dfsek.terra.population.items.flora.FloraLayer; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java index f2a3dafb4..e83a8dd8a 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/NoiseBuilderLoader.java @@ -5,7 +5,7 @@ import com.dfsek.tectonic.exception.ConfigException; import com.dfsek.tectonic.exception.LoadException; import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; import com.dfsek.terra.generation.config.NoiseBuilder; import java.lang.reflect.Type; diff --git a/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java b/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java index ba2584deb..123718bf0 100644 --- a/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java +++ b/common/src/main/java/com/dfsek/terra/config/loaders/config/TreeLayerLoader.java @@ -5,7 +5,7 @@ import com.dfsek.tectonic.loading.ConfigLoader; import com.dfsek.tectonic.loading.TypeLoader; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; import com.dfsek.terra.api.world.tree.Tree; import com.dfsek.terra.config.loaders.Types; import com.dfsek.terra.population.items.tree.TreeLayer; diff --git a/common/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java b/common/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java index a04e64178..b86a6d764 100644 --- a/common/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java +++ b/common/src/main/java/com/dfsek/terra/generation/config/NoiseBuilder.java @@ -3,7 +3,8 @@ package com.dfsek.terra.generation.config; import com.dfsek.tectonic.annotations.Default; import com.dfsek.tectonic.annotations.Value; import com.dfsek.tectonic.config.ConfigTemplate; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; public class NoiseBuilder implements ConfigTemplate { @Value("type") @@ -70,7 +71,7 @@ public class NoiseBuilder implements ConfigTemplate { @Default private int dimensions = 2; - public FastNoiseLite build(int seed) { + public NoiseSampler build(int seed) { FastNoiseLite noise = new FastNoiseLite(seed + seedOffset); if(!fractalType.equals(FastNoiseLite.FractalType.None)) { noise.setFractalType(fractalType); diff --git a/common/src/main/java/com/dfsek/terra/image/ImageLoader.java b/common/src/main/java/com/dfsek/terra/image/ImageLoader.java index 4b0836672..1b2aec944 100644 --- a/common/src/main/java/com/dfsek/terra/image/ImageLoader.java +++ b/common/src/main/java/com/dfsek/terra/image/ImageLoader.java @@ -15,7 +15,6 @@ import java.io.File; import java.io.IOException; public class ImageLoader { - private static final double INVERSE_ROOT_2 = 0.7071067811865475; private final BufferedImage image; private final Align align; @@ -35,7 +34,7 @@ public class ImageLoader { private static BufferedImage redrawStepped(BufferedImage original, World w, Align align, TerraPlugin main) { BufferedImage newImg = copyImage(original); TerraBiomeGrid tb = main.getWorld(w).getGrid(); - BiomeZone z = main.getWorld(w).getZone(); + BiomeZone zone = main.getWorld(w).getZone(); for(int x = 0; x < newImg.getWidth(); x++) { for(int y = 0; y < newImg.getHeight(); y++) { double[] noise; @@ -44,13 +43,17 @@ public class ImageLoader { 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())), - (int) (NormalizationUtil.normalize(z.getNoise(x, y), z.getSize(), 4) * ((double) 255 / z.getSize()))) + (int) (NormalizationUtil.normalize(zone.getNoise(x, y), zone.getSize(), 4) * ((double) 255 / zone.getSize()))) .getRGB()); } } return newImg; } + private static int normal(double val) { + return FastMath.floorToInt(FastMath.min(FastMath.max(val, 255), 0)); + } + private static BufferedImage copyImage(BufferedImage source) { BufferedImage b = new BufferedImage(source.getWidth(), source.getHeight(), source.getType()); Graphics g = b.getGraphics(); @@ -69,8 +72,8 @@ public class ImageLoader { debugGUI.start(); } - public double getNoiseVal(int x, int y, Channel channel) { - return ((double) (getChannel(x, y, channel) - 128) / 128) * INVERSE_ROOT_2; + public int getNoiseVal(int x, int y, int size, Channel channel) { + return (size * getChannel(x, y, channel)) / 255; } public int getChannel(int x, int y, Channel channel) { diff --git a/common/src/main/java/com/dfsek/terra/population/items/PlaceableLayer.java b/common/src/main/java/com/dfsek/terra/population/items/PlaceableLayer.java index 978915ecc..1f68c579a 100644 --- a/common/src/main/java/com/dfsek/terra/population/items/PlaceableLayer.java +++ b/common/src/main/java/com/dfsek/terra/population/items/PlaceableLayer.java @@ -2,7 +2,7 @@ package com.dfsek.terra.population.items; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.world.Chunk; @@ -12,16 +12,16 @@ public abstract class PlaceableLayer { protected final double density; protected final Range level; protected final ProbabilityCollection layer; - protected final FastNoiseLite noise; + protected final NoiseSampler noise; - public PlaceableLayer(double density, Range level, ProbabilityCollection layer, FastNoiseLite noise) { + public PlaceableLayer(double density, Range level, ProbabilityCollection layer, NoiseSampler noise) { this.density = density; this.level = level; this.layer = layer; this.noise = noise; } - public FastNoiseLite getNoise() { + public NoiseSampler getNoise() { return noise; } diff --git a/common/src/main/java/com/dfsek/terra/population/items/flora/FloraLayer.java b/common/src/main/java/com/dfsek/terra/population/items/flora/FloraLayer.java index f32312fda..66799f357 100644 --- a/common/src/main/java/com/dfsek/terra/population/items/flora/FloraLayer.java +++ b/common/src/main/java/com/dfsek/terra/population/items/flora/FloraLayer.java @@ -2,7 +2,7 @@ package com.dfsek.terra.population.items.flora; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.world.flora.Flora; @@ -12,7 +12,7 @@ import java.util.Random; public class FloraLayer extends PlaceableLayer { - public FloraLayer(double density, Range level, ProbabilityCollection layer, FastNoiseLite noise) { + public FloraLayer(double density, Range level, ProbabilityCollection layer, NoiseSampler noise) { super(density, level, layer, noise); } diff --git a/common/src/main/java/com/dfsek/terra/population/items/ores/DeformedSphereOre.java b/common/src/main/java/com/dfsek/terra/population/items/ores/DeformedSphereOre.java index 946ae4b6d..de53fcf08 100644 --- a/common/src/main/java/com/dfsek/terra/population/items/ores/DeformedSphereOre.java +++ b/common/src/main/java/com/dfsek/terra/population/items/ores/DeformedSphereOre.java @@ -1,7 +1,7 @@ package com.dfsek.terra.population.items.ores; import com.dfsek.terra.api.math.Range; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.Block; diff --git a/common/src/main/java/com/dfsek/terra/population/items/tree/TreeLayer.java b/common/src/main/java/com/dfsek/terra/population/items/tree/TreeLayer.java index 655204a67..c30ecda71 100644 --- a/common/src/main/java/com/dfsek/terra/population/items/tree/TreeLayer.java +++ b/common/src/main/java/com/dfsek/terra/population/items/tree/TreeLayer.java @@ -2,7 +2,7 @@ package com.dfsek.terra.population.items.tree; import com.dfsek.terra.api.math.ProbabilityCollection; import com.dfsek.terra.api.math.Range; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.NoiseSampler; import com.dfsek.terra.api.math.vector.Vector2; import com.dfsek.terra.api.platform.block.Block; import com.dfsek.terra.api.platform.block.BlockFace; @@ -14,7 +14,7 @@ import java.util.Random; public class TreeLayer extends PlaceableLayer { - public TreeLayer(double density, Range level, ProbabilityCollection layer, FastNoiseLite noise) { + public TreeLayer(double density, Range level, ProbabilityCollection layer, NoiseSampler noise) { super(density, level, layer, noise); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java index 2bea3e094..9fcce970f 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/DeformedSphereCommand.java @@ -1,6 +1,6 @@ package com.dfsek.terra.bukkit.command.command.geometry; -import com.dfsek.terra.api.math.noise.FastNoiseLite; +import com.dfsek.terra.api.math.noise.samplers.FastNoiseLite; import com.dfsek.terra.api.math.vector.Vector3; import com.dfsek.terra.api.math.voxel.DeformedSphere; import com.dfsek.terra.bukkit.BukkitCommandSender; diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/RawGUICommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/RawGUICommand.java index f4b8d388b..c52e56ca6 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/RawGUICommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/RawGUICommand.java @@ -1,6 +1,9 @@ package com.dfsek.terra.bukkit.command.command.image.gui; +import com.dfsek.terra.bukkit.command.DebugCommand; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.world.BukkitAdapter; +import com.dfsek.terra.image.ImageLoader; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -10,23 +13,16 @@ import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; -public class RawGUICommand extends WorldCommand { +public class RawGUICommand extends WorldCommand implements DebugCommand { public RawGUICommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - /* - if(!getMain().isDebug()) { - LangUtil.send("command.image.gui.debug", sender); - return true; - } - ImageLoader loader = ((TerraBukkitPlugin) getMain()).getWorld(world).getConfig().getTemplate().getImageLoader(); - if(loader != null) loader.debug(false, sender.getWorld(), (TerraBukkitPlugin) getMain()); - else ImageLoader.debugWorld(false, world, (TerraBukkitPlugin) getMain()); - - */ + ImageLoader loader = getMain().getWorld(BukkitAdapter.adapt(world)).getConfig().getTemplate().getImageLoader(); + if(loader != null) loader.debug(false, BukkitAdapter.adapt(sender.getWorld()), getMain()); + else ImageLoader.debugWorld(false, BukkitAdapter.adapt(world), getMain()); return true; } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/StepGUICommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/StepGUICommand.java index 9c4be327e..ae082d7d2 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/StepGUICommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/image/gui/StepGUICommand.java @@ -1,6 +1,9 @@ package com.dfsek.terra.bukkit.command.command.image.gui; +import com.dfsek.terra.bukkit.command.DebugCommand; import com.dfsek.terra.bukkit.command.WorldCommand; +import com.dfsek.terra.bukkit.world.BukkitAdapter; +import com.dfsek.terra.image.ImageLoader; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; @@ -10,23 +13,16 @@ import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.List; -public class StepGUICommand extends WorldCommand { +public class StepGUICommand extends WorldCommand implements DebugCommand { public StepGUICommand(com.dfsek.terra.bukkit.command.Command parent) { super(parent); } @Override public boolean execute(@NotNull Player sender, @NotNull Command command, @NotNull String label, @NotNull String[] args, World world) { - /* - if(!getMain().isDebug()) { - LangUtil.send("command.image.gui.debug", sender); - return true; - } - ImageLoader loader = ((TerraBukkitPlugin) getMain()).getWorld(world).getConfig().getTemplate().getImageLoader(); - if(loader != null) loader.debug(true, sender.getWorld(), (TerraBukkitPlugin) getMain()); - else ImageLoader.debugWorld(true, world, (TerraBukkitPlugin) getMain()); - - */ + ImageLoader loader = (getMain()).getWorld(BukkitAdapter.adapt(world)).getConfig().getTemplate().getImageLoader(); + if(loader != null) loader.debug(true, BukkitAdapter.adapt(sender.getWorld()), getMain()); + else ImageLoader.debugWorld(true, BukkitAdapter.adapt(world), getMain()); return true; } From 9a94485c9189508f4fb1fac52158b1970486519c Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 8 Jan 2021 11:51:07 -0700 Subject: [PATCH 207/210] add white noise to FastNoiseLite --- .../math/noise/samplers/FastNoiseLite.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java index be3ef0197..3b125cf05 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java +++ b/common/src/main/java/com/dfsek/terra/api/math/noise/samplers/FastNoiseLite.java @@ -777,6 +777,8 @@ public class FastNoiseLite implements NoiseSampler { return singleValueCubic(seed, x, y); case Value: return singleValue(seed, x, y); + case WhiteNoise: + return singleWhiteNoise(seed, x, y); default: return 0; } @@ -796,6 +798,8 @@ public class FastNoiseLite implements NoiseSampler { return singleValueCubic(seed, x, y, z); case Value: return singleValue(seed, x, y, z); + case WhiteNoise: + return singleWhiteNoise(seed, x, y, z); default: return 0; } @@ -1611,6 +1615,27 @@ public class FastNoiseLite implements NoiseSampler { return lerp(xf0, xf1, ys) * 1.4247691104677813f; } + private int doubleCast2Int(double f) { + int i = Float.floatToRawIntBits((float) f); + + return i ^ (i >> 16); + } + + private double singleWhiteNoise(int seed, double x, double y, double z) { + int xi = doubleCast2Int(x); + int yi = doubleCast2Int(y); + int zi = doubleCast2Int(z); + + return valCoord(seed, xi, yi, zi); + } + + private double singleWhiteNoise(int seed, double x, double y) { + int xi = doubleCast2Int(x); + int yi = doubleCast2Int(y); + + return valCoord(seed, xi, yi); + } + // Simplex/OpenSimplex2 Noise private double singlePerlin(int seed, double x, double y, double z) { int x0 = fastFloor(x); @@ -2482,7 +2507,8 @@ public class FastNoiseLite implements NoiseSampler { Cellular, Perlin, ValueCubic, - Value + Value, + WhiteNoise } From 67ffd916412d44c763c85da69736ed1bd6abac79 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 9 Jan 2021 02:25:36 -0700 Subject: [PATCH 208/210] add enchantment to loot tables --- .../terra/api/platform/handle/ItemHandle.java | 7 ++ .../platform/inventory/item/Enchantment.java | 14 ++++ .../api/platform/inventory/item/ItemMeta.java | 5 ++ .../terra/api/structures/loot/Entry.java | 16 ++++- .../loot/functions/AmountFunction.java | 4 +- .../loot/functions/DamageFunction.java | 4 +- .../loot/functions/EnchantFunction.java | 64 +++++++++++++++++++ .../{Function.java => LootFunction.java} | 2 +- .../bukkit/handles/BukkitItemHandle.java | 18 ++++++ .../terra/bukkit/util/BukkitConversions.java | 16 ----- .../terra/bukkit/util/MinecraftUtils.java | 8 +++ .../terra/bukkit/world/BukkitAdapter.java | 10 +++ .../world/inventory/BukkitItemMeta.java | 18 ++++++ .../inventory/meta/BukkitEnchantment.java | 38 +++++++++++ .../fabric/inventory/FabricItemHandle.java | 6 ++ 15 files changed, 206 insertions(+), 24 deletions(-) create mode 100644 common/src/main/java/com/dfsek/terra/api/platform/inventory/item/Enchantment.java create mode 100644 common/src/main/java/com/dfsek/terra/api/structures/loot/functions/EnchantFunction.java rename common/src/main/java/com/dfsek/terra/api/structures/loot/functions/{Function.java => LootFunction.java} (93%) delete mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/MinecraftUtils.java create mode 100644 platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitEnchantment.java diff --git a/common/src/main/java/com/dfsek/terra/api/platform/handle/ItemHandle.java b/common/src/main/java/com/dfsek/terra/api/platform/handle/ItemHandle.java index ce26fa2ac..fe2fe39d0 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/handle/ItemHandle.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/handle/ItemHandle.java @@ -2,7 +2,14 @@ package com.dfsek.terra.api.platform.handle; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.platform.inventory.item.Enchantment; + +import java.util.Set; public interface ItemHandle { ItemStack newItemStack(MaterialData material, int amount); + + Enchantment getEnchantment(String id); + + Set getEnchantments(); } diff --git a/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/Enchantment.java b/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/Enchantment.java new file mode 100644 index 000000000..e8f404f34 --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/Enchantment.java @@ -0,0 +1,14 @@ +package com.dfsek.terra.api.platform.inventory.item; + +import com.dfsek.terra.api.platform.Handle; +import com.dfsek.terra.api.platform.inventory.ItemStack; + +public interface Enchantment extends Handle { + boolean canEnchantItem(ItemStack itemStack); + + String getID(); + + boolean conflictsWith(Enchantment other); + + int getMaxLevel(); +} diff --git a/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/ItemMeta.java b/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/ItemMeta.java index 6c20f2a4b..0189c5755 100644 --- a/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/ItemMeta.java +++ b/common/src/main/java/com/dfsek/terra/api/platform/inventory/item/ItemMeta.java @@ -2,5 +2,10 @@ package com.dfsek.terra.api.platform.inventory.item; import com.dfsek.terra.api.platform.Handle; +import java.util.Map; + public interface ItemMeta extends Handle { + Map getEnchantments(); + + void addEnchantment(Enchantment enchantment, int level); } diff --git a/common/src/main/java/com/dfsek/terra/api/structures/loot/Entry.java b/common/src/main/java/com/dfsek/terra/api/structures/loot/Entry.java index 66a819baf..d676a1b25 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/loot/Entry.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/loot/Entry.java @@ -5,7 +5,8 @@ import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.inventory.ItemStack; import com.dfsek.terra.api.structures.loot.functions.AmountFunction; import com.dfsek.terra.api.structures.loot.functions.DamageFunction; -import com.dfsek.terra.api.structures.loot.functions.Function; +import com.dfsek.terra.api.structures.loot.functions.EnchantFunction; +import com.dfsek.terra.api.structures.loot.functions.LootFunction; import com.dfsek.terra.api.util.GlueList; import net.jafama.FastMath; import org.json.simple.JSONArray; @@ -20,7 +21,7 @@ import java.util.Random; public class Entry { private final MaterialData item; private final long weight; - private final List functions = new GlueList<>(); + private final List functions = new GlueList<>(); private final TerraPlugin main; /** @@ -63,6 +64,15 @@ public class Entry { long minDamage = (long) ((JSONObject) ((JSONObject) function).get("damage")).get("min"); functions.add(new DamageFunction(FastMath.toIntExact(minDamage), FastMath.toIntExact(maxDamage))); break; + case "minecraft:enchant_with_levels": + case "enchant_with_levels": + long maxEnchant = (long) ((JSONObject) ((JSONObject) function).get("levels")).get("max"); + long minEnchant = (long) ((JSONObject) ((JSONObject) function).get("levels")).get("min"); + JSONArray disabled = null; + if(((JSONObject) function).containsKey("disabled_enchants")) + disabled = (JSONArray) ((JSONObject) function).get("disabled_enchants"); + functions.add(new EnchantFunction(FastMath.toIntExact(minEnchant), FastMath.toIntExact(maxEnchant), disabled, main)); + break; } } } @@ -76,7 +86,7 @@ public class Entry { */ public ItemStack getItem(Random r) { ItemStack item = main.getItemHandle().newItemStack(this.item, 1); - for(Function f : functions) { + for(LootFunction f : functions) { item = f.apply(item, r); } return item; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/AmountFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/AmountFunction.java index b268fb637..f83498fec 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/AmountFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/AmountFunction.java @@ -6,9 +6,9 @@ import com.dfsek.terra.api.platform.inventory.ItemStack; import java.util.Random; /** - * Loot Function fot setting the amount of an item. + * Loot LootFunction fot setting the amount of an item. */ -public class AmountFunction implements Function { +public class AmountFunction implements LootFunction { private final int max; private final int min; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/DamageFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/DamageFunction.java index 3afb8ecdb..704fdcfa8 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/DamageFunction.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/DamageFunction.java @@ -7,9 +7,9 @@ import com.dfsek.terra.api.platform.inventory.item.ItemMeta; import java.util.Random; /** - * Loot Function for setting the damage on items in Loot Tables + * Loot LootFunction for setting the damage on items in Loot Tables */ -public class DamageFunction implements Function { +public class DamageFunction implements LootFunction { private final int max; private final int min; diff --git a/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/EnchantFunction.java b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/EnchantFunction.java new file mode 100644 index 000000000..0debec4ee --- /dev/null +++ b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/EnchantFunction.java @@ -0,0 +1,64 @@ +package com.dfsek.terra.api.structures.loot.functions; + +import com.dfsek.terra.api.platform.TerraPlugin; +import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.platform.inventory.item.Enchantment; +import com.dfsek.terra.api.platform.inventory.item.ItemMeta; +import com.dfsek.terra.api.util.GlueList; +import net.jafama.FastMath; +import org.json.simple.JSONArray; + +import java.util.Collections; +import java.util.List; +import java.util.Random; + +public class EnchantFunction implements LootFunction { + private final int min; + private final int max; + private final JSONArray disabled; + private final TerraPlugin main; + + + public EnchantFunction(int min, int max, JSONArray disabled, TerraPlugin main) { + this.max = max; + this.min = min; + this.disabled = disabled; + this.main = main; + } + + /** + * Applies the function to an ItemStack. + * + * @param original The ItemStack on which to apply the function. + * @param r The Random instance to use. + * @return - ItemStack - The mutated ItemStack. + */ + @Override + public ItemStack apply(ItemStack original, Random r) { + double enchant = (r.nextDouble() * (max - min)) + min; + List possible = new GlueList<>(); + for(Enchantment ench : main.getItemHandle().getEnchantments()) { + if(ench.canEnchantItem(original) && (disabled == null || !this.disabled.contains(ench.getID()))) { + possible.add(ench); + } + } + int numEnchant = (r.nextInt((int) FastMath.abs(enchant)) / 10 + 1); + Collections.shuffle(possible); + ItemMeta meta = original.getItemMeta(); + iter: + for(int i = 0; i < numEnchant && i < possible.size(); i++) { + Enchantment chosen = possible.get(i); + for(Enchantment ench : meta.getEnchantments().keySet()) { + if(chosen.conflictsWith(ench)) continue iter; + } + int lvl = r.nextInt(1 + (int) (((enchant / 40 > 1) ? 1 : enchant / 40) * (chosen.getMaxLevel()))); + try { + meta.addEnchantment(chosen, FastMath.max(lvl, 1)); + } catch(IllegalArgumentException e) { + main.getLogger().warning("Attempted to enchant " + original.getType() + " with " + chosen + " at level " + FastMath.max(lvl, 1) + ", but an unexpected exception occurred! Usually this is caused by a misbehaving enchantment plugin."); + } + } + original.setItemMeta(meta); + return original; + } +} diff --git a/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/Function.java b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/LootFunction.java similarity index 93% rename from common/src/main/java/com/dfsek/terra/api/structures/loot/functions/Function.java rename to common/src/main/java/com/dfsek/terra/api/structures/loot/functions/LootFunction.java index b3993abe6..5b882c830 100644 --- a/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/Function.java +++ b/common/src/main/java/com/dfsek/terra/api/structures/loot/functions/LootFunction.java @@ -8,7 +8,7 @@ import java.util.Random; /** * Interface for mutating items in Loot Tables. */ -public interface Function { +public interface LootFunction { /** * Applies the function to an ItemStack. * diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitItemHandle.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitItemHandle.java index 8116e2f80..aa8531e67 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitItemHandle.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/handles/BukkitItemHandle.java @@ -3,12 +3,30 @@ package com.dfsek.terra.bukkit.handles; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.platform.inventory.item.Enchantment; +import com.dfsek.terra.bukkit.util.MinecraftUtils; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.block.BukkitMaterialData; import com.dfsek.terra.bukkit.world.inventory.BukkitItemStack; +import org.bukkit.NamespacedKey; + +import java.util.Arrays; +import java.util.Set; +import java.util.stream.Collectors; public class BukkitItemHandle implements ItemHandle { @Override public ItemStack newItemStack(MaterialData material, int amount) { return new BukkitItemStack(new org.bukkit.inventory.ItemStack(((BukkitMaterialData) material).getHandle(), amount)); } + + @Override + public Enchantment getEnchantment(String id) { + return BukkitAdapter.adapt(org.bukkit.enchantments.Enchantment.getByKey(NamespacedKey.minecraft(MinecraftUtils.stripMinecraftNamespace(id)))); + } + + @Override + public Set getEnchantments() { + return Arrays.stream(org.bukkit.enchantments.Enchantment.values()).map(BukkitAdapter::adapt).collect(Collectors.toSet()); + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java deleted file mode 100644 index 9d0673950..000000000 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/BukkitConversions.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.dfsek.terra.bukkit.util; - -import com.dfsek.terra.api.math.vector.Vector3; -import com.dfsek.terra.bukkit.world.BukkitWorld; -import org.bukkit.Location; -import org.bukkit.util.Vector; - -public final class BukkitConversions { - public static Vector3 toTerraVector(Vector bukkit) { - return new Vector3(bukkit.getX(), bukkit.getY(), bukkit.getZ()); - } - - public static Location toBukkitLocation(com.dfsek.terra.api.math.vector.Location terra) { - return new Location(((BukkitWorld) terra.getWorld()).getHandle(), terra.getX(), terra.getY(), terra.getZ()); - } -} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/MinecraftUtils.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/MinecraftUtils.java new file mode 100644 index 000000000..0c36bc946 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/util/MinecraftUtils.java @@ -0,0 +1,8 @@ +package com.dfsek.terra.bukkit.util; + +public final class MinecraftUtils { + public static String stripMinecraftNamespace(String in) { + if(in.startsWith("minecraft:")) return in.substring("minecraft:".length()); + return in; + } +} diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java index b7ba7da2f..462474a4e 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitAdapter.java @@ -10,9 +10,11 @@ import com.dfsek.terra.api.platform.block.data.Rail; import com.dfsek.terra.api.platform.block.data.RedstoneWire; import com.dfsek.terra.api.platform.block.data.Slab; import com.dfsek.terra.api.platform.block.data.Stairs; +import com.dfsek.terra.api.platform.inventory.item.Enchantment; import com.dfsek.terra.api.platform.world.Chunk; import com.dfsek.terra.api.platform.world.World; import com.dfsek.terra.bukkit.BukkitCommandSender; +import com.dfsek.terra.bukkit.world.inventory.meta.BukkitEnchantment; import org.bukkit.Location; import org.bukkit.util.Vector; @@ -338,4 +340,12 @@ public final class BukkitAdapter { public static org.bukkit.Chunk adapt(Chunk chunk) { return (org.bukkit.Chunk) chunk.getHandle(); } + + public static Enchantment adapt(org.bukkit.enchantments.Enchantment enchantment) { + return new BukkitEnchantment(enchantment); + } + + public static org.bukkit.enchantments.Enchantment adapt(Enchantment enchantment) { + return ((BukkitEnchantment) enchantment).getHandle(); + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemMeta.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemMeta.java index 3e9e4299f..a8bc30131 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemMeta.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/BukkitItemMeta.java @@ -1,9 +1,15 @@ package com.dfsek.terra.bukkit.world.inventory; +import com.dfsek.terra.api.platform.inventory.item.Enchantment; import com.dfsek.terra.api.platform.inventory.item.ItemMeta; +import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.bukkit.world.inventory.meta.BukkitDamageable; +import com.dfsek.terra.bukkit.world.inventory.meta.BukkitEnchantment; import org.bukkit.inventory.meta.Damageable; +import java.util.HashMap; +import java.util.Map; + public class BukkitItemMeta implements ItemMeta { private final org.bukkit.inventory.meta.ItemMeta delegate; @@ -20,4 +26,16 @@ public class BukkitItemMeta implements ItemMeta { public org.bukkit.inventory.meta.ItemMeta getHandle() { return delegate; } + + @Override + public Map getEnchantments() { + Map map = new HashMap<>(); + delegate.getEnchants().forEach((enchantment, integer) -> map.put(BukkitAdapter.adapt(enchantment), integer)); + return map; + } + + @Override + public void addEnchantment(Enchantment enchantment, int level) { + delegate.addEnchant(((BukkitEnchantment) enchantment).getHandle(), level, true); + } } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitEnchantment.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitEnchantment.java new file mode 100644 index 000000000..577414c28 --- /dev/null +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/inventory/meta/BukkitEnchantment.java @@ -0,0 +1,38 @@ +package com.dfsek.terra.bukkit.world.inventory.meta; + +import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.platform.inventory.item.Enchantment; +import com.dfsek.terra.bukkit.world.inventory.BukkitItemStack; + +public class BukkitEnchantment implements Enchantment { + private final org.bukkit.enchantments.Enchantment delegate; + + public BukkitEnchantment(org.bukkit.enchantments.Enchantment delegate) { + this.delegate = delegate; + } + + @Override + public org.bukkit.enchantments.Enchantment getHandle() { + return delegate; + } + + @Override + public boolean canEnchantItem(ItemStack itemStack) { + return delegate.canEnchantItem(((BukkitItemStack) itemStack).getHandle()); + } + + @Override + public String getID() { + return delegate.getKey().toString(); + } + + @Override + public boolean conflictsWith(Enchantment other) { + return delegate.conflictsWith(((BukkitEnchantment) other).getHandle()); + } + + @Override + public int getMaxLevel() { + return delegate.getMaxLevel(); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java index 203be849b..afe191821 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/inventory/FabricItemHandle.java @@ -3,10 +3,16 @@ package com.dfsek.terra.fabric.inventory; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.handle.ItemHandle; import com.dfsek.terra.api.platform.inventory.ItemStack; +import com.dfsek.terra.api.platform.inventory.item.Enchantment; public class FabricItemHandle implements ItemHandle { @Override public ItemStack newItemStack(MaterialData material, int amount) { return null; } + + @Override + public Enchantment getEnchantment(String id) { + return null; + } } From 141b4f86ae7898aa106a652c9225ce8ba127cf95 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 9 Jan 2021 02:25:48 -0700 Subject: [PATCH 209/210] cleanup --- .../java/com/dfsek/terra/api/math/MathUtil.java | 13 +++++++------ .../com/dfsek/terra/api/math/vector/Vector3.java | 6 +++++- .../com/dfsek/terra/api/profiler/Measurement.java | 13 ++++--------- .../command/command/geometry/TubeCommand.java | 3 +-- .../com/dfsek/terra/bukkit/world/BukkitTree.java | 3 +-- 5 files changed, 18 insertions(+), 20 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java b/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java index 013fbf8cc..8d39207ab 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java @@ -4,6 +4,7 @@ import com.dfsek.terra.api.util.FastRandom; import com.dfsek.terra.generation.math.Sampler; import net.jafama.FastMath; +import java.util.List; import java.util.Random; /** @@ -25,18 +26,18 @@ public final class MathUtil { * @param numArray The array of numbers to calculate the standard deviation of. * @return double - The standard deviation. */ - public static double standardDeviation(double[] numArray) { + public static double standardDeviation(List numArray) { double sum = 0.0, standardDeviation = 0.0; - int length = numArray.length; + int length = numArray.size(); - for(double num : numArray) { - sum += num; + for(Number num : numArray) { + sum += num.doubleValue(); } double mean = sum / length; - for(double num : numArray) { - standardDeviation += FastMath.pow(num - mean, 2); + for(Number num : numArray) { + standardDeviation += FastMath.pow2(num.doubleValue() - mean); } return FastMath.sqrt(standardDeviation / length); diff --git a/common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java index fff3f82ce..cafff1ea7 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java +++ b/common/src/main/java/com/dfsek/terra/api/math/vector/Vector3.java @@ -101,6 +101,10 @@ public class Vector3 implements Cloneable { return FastMath.sqrt(lengthSquared()); } + public double inverseLength() { + return FastMath.invSqrtQuick(lengthSquared()); + } + /** * Returns if a vector is normalized * @@ -280,7 +284,7 @@ public class Vector3 implements Cloneable { } public Vector3 normalize() { - return this.multiply(1D / this.length()); + return this.multiply(this.inverseLength()); } public Vector3 subtract(int x, int y, int z) { diff --git a/common/src/main/java/com/dfsek/terra/api/profiler/Measurement.java b/common/src/main/java/com/dfsek/terra/api/profiler/Measurement.java index a212215e0..d90fe8bfd 100644 --- a/common/src/main/java/com/dfsek/terra/api/profiler/Measurement.java +++ b/common/src/main/java/com/dfsek/terra/api/profiler/Measurement.java @@ -5,13 +5,14 @@ import com.dfsek.terra.api.util.GlueList; import net.jafama.FastMath; import java.math.BigInteger; +import java.util.LinkedList; import java.util.List; /** * Class to record and hold all data for a single type of measurement performed by the profiler. */ public class Measurement { - private final List measurements; + private final List measurements = new LinkedList<>(); private final long desirable; private final DataType type; private long min = Long.MAX_VALUE; @@ -26,7 +27,6 @@ public class Measurement { public Measurement(long desirable, DataType type) { this.desirable = desirable; this.type = type; - measurements = new GlueList<>(); } public void record(long value) { @@ -67,7 +67,7 @@ public class Measurement { } public long average() { - BigInteger running = new BigInteger("0"); + BigInteger running = BigInteger.valueOf(0); List mTemp = new GlueList<>(measurements); for(Long l : mTemp) { running = running.add(BigInteger.valueOf(l)); @@ -77,12 +77,7 @@ public class Measurement { } public double getStdDev() { - List mTemp = new GlueList<>(measurements); - double[] vals = new double[mTemp.size()]; - for(int i = 0; i < mTemp.size(); i++) { - vals[i] = mTemp.get(i); - } - return MathUtil.standardDeviation(vals); + return MathUtil.standardDeviation(new GlueList<>(measurements)); } public int entries() { diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java index 53fcbd7cc..33bd17ad5 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/command/command/geometry/TubeCommand.java @@ -5,7 +5,6 @@ import com.dfsek.terra.api.math.voxel.Tube; import com.dfsek.terra.bukkit.BukkitCommandSender; import com.dfsek.terra.bukkit.command.PlayerCommand; import com.dfsek.terra.bukkit.structure.WorldEditUtil; -import com.dfsek.terra.bukkit.util.BukkitConversions; import com.dfsek.terra.bukkit.world.BukkitAdapter; import com.dfsek.terra.config.lang.LangUtil; import org.bukkit.Location; @@ -33,7 +32,7 @@ public class TubeCommand extends PlayerCommand { LangUtil.send("command.geometry.tube.invalid-radius", new BukkitCommandSender(sender), args[0]); return true; } - Tube tube = new Tube(BukkitConversions.toTerraVector(l[0].toVector()), BukkitConversions.toTerraVector(l[1].toVector()), radius); + Tube tube = new Tube(BukkitAdapter.adapt(l[0].toVector()), BukkitAdapter.adapt(l[1].toVector()), radius); for(Vector3 v : tube.getGeometry()) { v.toLocation(BukkitAdapter.adapt(sender.getWorld())).getBlock().setBlockData(getMain().getWorldHandle().createBlockData("minecraft:stone"), false); } diff --git a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java index cef57c41f..b8de9bbbc 100644 --- a/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java +++ b/platforms/bukkit/src/main/java/com/dfsek/terra/bukkit/world/BukkitTree.java @@ -5,7 +5,6 @@ import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.block.MaterialData; import com.dfsek.terra.api.platform.handle.WorldHandle; import com.dfsek.terra.api.platform.world.Tree; -import com.dfsek.terra.bukkit.util.BukkitConversions; import com.dfsek.terra.util.MaterialSet; import org.bukkit.TreeType; @@ -49,7 +48,7 @@ public class BukkitTree implements Tree { @Override public boolean plant(Location l, Random r) { - return ((BukkitWorld) l.getWorld()).getHandle().generateTree(BukkitConversions.toBukkitLocation(l), delegate); + return ((BukkitWorld) l.getWorld()).getHandle().generateTree(BukkitAdapter.adapt(l), delegate); } @Override From 9310114c0e8685bdd77abf4fe3519631294bc963 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 9 Jan 2021 02:58:02 -0700 Subject: [PATCH 210/210] cleanup --- common/src/main/java/com/dfsek/terra/api/math/MathUtil.java | 4 ++++ .../api/world/generation/population/ChunkCoordinate.java | 2 +- common/src/main/java/com/dfsek/terra/carving/CarverCache.java | 2 +- .../java/com/dfsek/terra/generation/math/SamplerCache.java | 3 ++- .../region/src/main/java/com/dfsek/terra/DirectUtils.java | 3 ++- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java b/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java index 8d39207ab..a16981af3 100644 --- a/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java +++ b/common/src/main/java/com/dfsek/terra/api/math/MathUtil.java @@ -90,4 +90,8 @@ public final class MathUtil { return Math.sqrt(((xVal2 - xVal1) * (xVal2 - xVal1)) + ((zVal2 - zVal1) * (zVal2 - zVal1)) + ((yVal2 - yVal1) * (yVal2 - yVal1))); } + + public static long squash(int first, int last) { + return (((long) first) << 32) | (last & 0xffffffffL); + } } diff --git a/common/src/main/java/com/dfsek/terra/api/world/generation/population/ChunkCoordinate.java b/common/src/main/java/com/dfsek/terra/api/world/generation/population/ChunkCoordinate.java index bffc444e5..befa179d5 100644 --- a/common/src/main/java/com/dfsek/terra/api/world/generation/population/ChunkCoordinate.java +++ b/common/src/main/java/com/dfsek/terra/api/world/generation/population/ChunkCoordinate.java @@ -43,7 +43,7 @@ public class ChunkCoordinate implements Serializable { @Override public boolean equals(Object obj) { - if(!(obj instanceof com.dfsek.terra.api.world.generation.population.ChunkCoordinate)) return false; + if(!(obj instanceof ChunkCoordinate)) return false; com.dfsek.terra.api.world.generation.population.ChunkCoordinate other = (com.dfsek.terra.api.world.generation.population.ChunkCoordinate) obj; return other.getX() == x && other.getZ() == z; } diff --git a/common/src/main/java/com/dfsek/terra/carving/CarverCache.java b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java index c6ce44956..e48fc08f7 100644 --- a/common/src/main/java/com/dfsek/terra/carving/CarverCache.java +++ b/common/src/main/java/com/dfsek/terra/carving/CarverCache.java @@ -37,7 +37,7 @@ public class CarverCache { public List getPoints(int chunkX, int chunkZ, UserDefinedCarver carver) { synchronized(carvers) { - return carvers.computeIfAbsent((((long) chunkX) << 32) | (chunkZ & 0xffffffffL), key -> { + return carvers.computeIfAbsent(MathUtil.squash(chunkX, chunkZ), key -> { TerraBiomeGrid grid = main.getWorld(w).getGrid(); if(carver.isChunkCarved(w, chunkX, chunkZ, new FastRandom(MathUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed() + carver.hashCode())))) { long seed = MathUtil.getCarverChunkSeed(chunkX, chunkZ, w.getSeed()); diff --git a/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java b/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java index 36399fc57..421a7d2e9 100644 --- a/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java +++ b/common/src/main/java/com/dfsek/terra/generation/math/SamplerCache.java @@ -1,6 +1,7 @@ package com.dfsek.terra.generation.math; import com.dfsek.terra.TerraWorld; +import com.dfsek.terra.api.math.MathUtil; import com.dfsek.terra.api.platform.TerraPlugin; import com.dfsek.terra.api.platform.world.World; import net.jafama.FastMath; @@ -53,7 +54,7 @@ public class SamplerCache { } public Sampler getChunk(int cx, int cz) { - long key = (((long) cx) << 32) | (cz & 0xffffffffL); + long key = MathUtil.squash(cx, cz); synchronized(cache) { return cache.computeIfAbsent(key, k -> new Sampler(cx, cz, terraWorld.getGrid(), world, terraWorld.getConfig().getTemplate().getBaseBlend(), terraWorld.getConfig().getTemplate().getElevationBlend())); } diff --git a/platforms/region/src/main/java/com/dfsek/terra/DirectUtils.java b/platforms/region/src/main/java/com/dfsek/terra/DirectUtils.java index f5beb0bbd..2be2ebf6e 100644 --- a/platforms/region/src/main/java/com/dfsek/terra/DirectUtils.java +++ b/platforms/region/src/main/java/com/dfsek/terra/DirectUtils.java @@ -1,5 +1,6 @@ package com.dfsek.terra; +import com.dfsek.terra.api.math.MathUtil; import net.querz.mca.MCAUtil; public final class DirectUtils { @@ -12,6 +13,6 @@ public final class DirectUtils { * @return Region IS */ public static long regionID(int x, int z) { - return (((long) MCAUtil.chunkToRegion(x)) << 32) | (MCAUtil.chunkToRegion(z) & 0xffffffffL); + return MathUtil.squash(MCAUtil.chunkToRegion(x), MCAUtil.chunkToRegion(z)); } }