diff --git a/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java b/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java index f12e516d2..24d966a8f 100644 --- a/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java +++ b/common/addons/structure-sponge-loader/src/main/java/com/dfsek/terra/addons/sponge/SpongeSchematicAddon.java @@ -12,6 +12,8 @@ import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.structure.Structure; +import com.dfsek.terra.api.util.StringUtil; + import net.querz.nbt.io.NBTDeserializer; import net.querz.nbt.tag.ByteArrayTag; import net.querz.nbt.tag.CompoundTag; @@ -42,7 +44,7 @@ public class SpongeSchematicAddon extends TerraAddon { CheckedRegistry structureRegistry = event.getPack().getOrCreateRegistry(Structure.class); event.getPack().getLoader().open("", ".schem").thenEntries(entries -> { for(Map.Entry entry : entries) { - String id = entry.getKey().substring(0, entry.getKey().length() - ".schem".length()); + String id = StringUtil.fileName(entry.getKey()); structureRegistry.register(id, convert(entry.getValue(), id)); } }).close(); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java index dcf77e4a7..3e84f218f 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/TerraScriptAddon.java @@ -18,6 +18,7 @@ import com.dfsek.terra.api.inject.annotations.Inject; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.api.structure.LootTable; import com.dfsek.terra.api.structure.Structure; +import com.dfsek.terra.api.util.StringUtil; @Addon("structure-terrascript-loader") @@ -33,20 +34,22 @@ public class TerraScriptAddon extends TerraAddon { .getHandler(FunctionalEventHandler.class) .register(this, ConfigPackPreLoadEvent.class) .then(event -> { - CheckedRegistry structureRegistry = event.getPack().getOrCreateRegistry(Structure.class); - CheckedRegistry lootRegistry = event.getPack().getOrCreateRegistry(LootTable.class); - event.getPack().getLoader().open("", ".tesf").thenEntries(entries -> { - for(Map.Entry entry : entries) { - try { - StructureScript structureScript = new StructureScript(entry.getValue(), platform, structureRegistry, lootRegistry, - event.getPack().getRegistryFactory().create()); - structureRegistry.register(structureScript.getID(), structureScript); - } catch(ParseException e) { - throw new LoadException("Failed to load script: ", e); + CheckedRegistry structureRegistry = event.getPack().getOrCreateRegistry(Structure.class); + CheckedRegistry lootRegistry = event.getPack().getOrCreateRegistry(LootTable.class); + event.getPack().getLoader().open("", ".tesf").thenEntries(entries -> { + for(Map.Entry entry : entries) { + try { + String id = StringUtil.fileName(entry.getKey()); + StructureScript structureScript = new StructureScript(entry.getValue(), id, platform, structureRegistry, + lootRegistry, + event.getPack().getRegistryFactory().create()); + structureRegistry.register(structureScript.getID(), structureScript); + } catch(ParseException e) { + throw new LoadException("Failed to load script: ", e); + } } - } - }).close(); - }) + }).close(); + }) .failThrough(); } } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java index 814d88886..f043737b1 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/parser/Parser.java @@ -55,8 +55,6 @@ public class Parser { private final Map>> functions = new HashMap<>(); private final List ignoredFunctions = new ArrayList<>(); - private String id; - public Parser(String data) { this.data = data; } @@ -79,17 +77,7 @@ public class Parser { * @throws ParseException If parsing fails. */ public Block parse() { - Tokenizer tokens = new Tokenizer(data); - - // Parse ID - 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(); - - - return parseBlock(tokens, new HashMap<>(), false); + return parseBlock(new Tokenizer(data), new HashMap<>(), false); } private Keyword parseLoopLike(Tokenizer tokens, Map variableMap, boolean loop) throws ParseException { @@ -429,10 +417,6 @@ public class Parser { throw new UnsupportedOperationException("Unsupported function: " + identifier.getContent()); } - public String getID() { - return id; - } - private List> getArgs(Tokenizer tokens, Map variableMap) { List> args = new ArrayList<>(); diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java index 28589d587..b260bc8f3 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/script/StructureScript.java @@ -52,9 +52,8 @@ public class StructureScript implements Structure { private final String id; private final Cache cache; private final Platform platform; - private String tempID; - public StructureScript(InputStream inputStream, Platform platform, Registry registry, Registry lootRegistry, + public StructureScript(InputStream inputStream, String id, Platform platform, Registry registry, Registry lootRegistry, Registry> functionRegistry) { Parser parser; try { @@ -62,6 +61,7 @@ public class StructureScript implements Structure { } catch(IOException e) { throw new RuntimeException(e); } + this.id = id; functionRegistry.forEach(parser::registerFunction); // Register registry functions. @@ -92,7 +92,7 @@ public class StructureScript implements Structure { .registerFunction("rotationDegrees", new ZeroArgFunctionBuilder<>(arguments -> arguments.getRotation().getDegrees(), Returnable.ReturnType.NUMBER)) .registerFunction("print", - new UnaryStringFunctionBuilder(string -> platform.getDebugLogger().info("[" + tempID + "] " + string))) + new UnaryStringFunctionBuilder(string -> platform.getDebugLogger().info("[" + id + "] " + string))) .registerFunction("abs", new UnaryNumberFunctionBuilder(number -> FastMath.abs(number.doubleValue()))) .registerFunction("pow", new BinaryNumberFunctionBuilder( (number, number2) -> FastMath.pow(number.doubleValue(), number2.doubleValue()))) @@ -117,8 +117,6 @@ public class StructureScript implements Structure { } block = parser.parse(); - this.id = parser.getID(); - tempID = id; this.platform = platform; this.cache = CacheBuilder.newBuilder().maximumSize(platform.getTerraConfig().getStructureCache()).build(); } diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java index 252e69aeb..578dc65b4 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Token.java @@ -218,10 +218,6 @@ public class Token { * Fail statement. Like return keyword, but specifies that generation has failed. */ FAIL, - /** - * ID declaration - */ - ID, /** * For loop initializer token */ diff --git a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java index 566adc012..5c82f1b81 100644 --- a/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java +++ b/common/addons/structure-terrascript-loader/src/main/java/com/dfsek/terra/addons/terrascript/tokenizer/Tokenizer.java @@ -190,9 +190,6 @@ public class Tokenizer { 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())); - return new Token(tokenString, Token.Type.IDENTIFIER, new Position(reader.getLine(), reader.getIndex())); } diff --git a/common/addons/structure-terrascript-loader/src/test/resources/test.tesf b/common/addons/structure-terrascript-loader/src/test/resources/test.tesf index 93fe11eda..8bcce7177 100644 --- a/common/addons/structure-terrascript-loader/src/test/resources/test.tesf +++ b/common/addons/structure-terrascript-loader/src/test/resources/test.tesf @@ -1,5 +1,3 @@ -id "testScript"; - bool thing1 = 2 > (2+2) || false; if(2 > 2 || 3 + 4 <= 2 && 4 + 5 > 2 / 3) { diff --git a/common/api/util/src/main/java/com/dfsek/terra/api/util/StringUtil.java b/common/api/util/src/main/java/com/dfsek/terra/api/util/StringUtil.java new file mode 100644 index 000000000..2886c0d19 --- /dev/null +++ b/common/api/util/src/main/java/com/dfsek/terra/api/util/StringUtil.java @@ -0,0 +1,16 @@ +package com.dfsek.terra.api.util; + +import java.io.File; + + +public class StringUtil { + public static String fileName(String path) { + if(path.contains(File.separator)) { + return path.substring(path.lastIndexOf(File.separatorChar) + 1, path.lastIndexOf('.')); + } else if(path.contains(".")) { + return path.substring(0, path.lastIndexOf('.')); + } else { + return path; + } + } +}