From cccb706ad5ed1485b0df074f088dbb3a37553a2a Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 25 Dec 2020 20:22:19 -0700 Subject: [PATCH] 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; }