From 50decb6a4ada5218461de8551ea800b343dc917f Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sat, 13 Mar 2021 14:43:39 +0100 Subject: [PATCH 1/6] Add variable reference support to internal commands Add arithmetic commands Add auto_trace constant --- .../bausystem/commands/CommandScript.java | 8 +- .../bausystem/tracer/record/RecordStatus.java | 16 ++- .../bausystem/world/ScriptListener.java | 106 +++++++++++++----- 3 files changed, 92 insertions(+), 38 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java index e8d0811..12188de 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java @@ -39,7 +39,7 @@ public class CommandScript implements CommandExecutor { static { List pages = new ArrayList<>(); - pages.add("§6Script System§8\n\n- Commands\n- Kommentare\n- Scriptausführung\n- Sleep\n- Variablen\n- Konstanten\n- Abfragen\n- Schleifen\n- \"echo\""); + pages.add("§6Script System§8\n\n- Commands\n- Kommentare\n- Scriptausführung\n- Sleep\n- Variablen\n- Konstanten\n- Abfragen\n- Schleifen\n- \"echo\"\n- Arithmetik"); pages.add("§6Commands§8\n\nEin minecraft Befehl wird im Scriptbuch so hingeschrieben. Dabei kann man ein '/' weglassen. Um Befehle zu trennen kommen diese in neue Zeilen.\n\nStatt\n/tnt -> tnt\n//pos1 -> /pos1"); pages.add("§6Kommentare§8\n\nFür ein Kommentar fängt die Zeile mit einem '#' an. Diese Zeilen werden bei dem Ausführen dann ignoriert.\n\nBeispiel:\n§9# TNT an/aus\ntnt§8"); pages.add("§6Scriptausführung§8\n\nWenn du mit dem Buch in der Hand links klickst wird dieses ausgeführt."); @@ -47,12 +47,16 @@ public class CommandScript implements CommandExecutor { pages.add("§6Variablen§8\n\nMit Variablen kann man sich Zahlen speichern. Man definiert diese mit 'var '.\n\nBeispiel:\n§9# Setze i zu 0\nvar i 0§8\n\nEs gibt einige spezial values. Dazu zählen"); pages.add("§8'true', 'yes', 'false' und 'no', welche für 1, 1, 0 und 0 stehen.\n\nMan kann eine Variable auch um einen erhöhen oder verkleinern. Hierfür schreibt man statt einer Zahl '++', 'inc' oder '--', 'dec'.\n\nBeispiel:\n§9var i ++§8"); pages.add("§8Variablen kann man referenzieren\ndurch '$' vor dem Variablennamen. Diese kann man in jedem Befehl verwenden.\n\nBeispiel:\n§9# Stacked um 10\nvar stacks 10\n/stack $stacks§8"); - pages.add("§6Konstanten§8\n\nNeben den variablen gibt es noch 4 Konstante Werte, welche nicht mit dem 'var' Befehl verändert werden können.\n\nDiese sind:\n- trace\n- tnt\n- freeze\n- fire"); + pages.add("§6Konstanten§8\n\nNeben den variablen gibt es noch 4 Konstante Werte, welche nicht mit dem 'var' Befehl verändert werden können.\n\nDiese sind:\n- trace/auto_trace\n- tnt\n- freeze\n- fire"); pages.add("§6Abfragen§8\n\nMit Abfragen kann man nur Gleichheit von 2 Werten überprüft werden. Hierfür verwendet man\n'if '.\nNach den zwei Werten kann man ein oder 2 Jump-Points schreiben\n'if [...] (JP)'."); pages.add("§8Ein Jump-Point ist eine Zeile Script, wohin man springen kann. Dieser wird mit einem '.' am Anfang der Zeile beschrieben und direkt danach der Jump-Point Namen ohne Leerzeichen.\n\nBeispiel:\n§9# Jump-Point X\n.X§8"); pages.add("§8Um zu einem Jump-Point ohne Abfrage zu springen kann man den\n'jump ' Befehl verwenden."); pages.add("§6Schleifen§8\n\nSchleifen werden mit Jump-Points, if Abfragen und Jumps gebaut.\n\nBeispiel:\n§9var i 0\n.JUMP\nvar i ++\nif i 10 END JUMP\n.END§8"); pages.add("§6\"echo\"§8\n\nDer echo Befehl ist gut um Ausgaben zu tätigen. Hier drin kann man sowohl Variablen ausgeben, als auch Farbcodes verwenden. Es wird alles nach dem Befehl ausgegeben.\n\nBeispiel:\n§9echo &eSteam&8war &7war hier!§8"); + pages.add("§6Arithmetik§8\n\nEs gibt 4 Arithmetische Befehle:\n- add\n- sub\n- mul\n- div\n\nDer erste Parameter ist die Variable welche den ausgerechneten Wert halten soll. Hiernach muss ein"); + pages.add("§8Wert oder Variable kommen welcher verrechnet wird. Hierbei wird das erste Argument als ersten Operand genommen.\n\nBeispiel:\n§9var i 2\nvar j 3\nadd i j\necho $i§8"); + pages.add("§8Man kann auch 3 Argumente angeben. Dann wird die arithmetische Operation zwischen den letzten beiden Argumenten berechnet und als Variable des ersten Arguments abgespeichert. \n\nBeispiel auf der nächsten Seite -->"); + pages.add("§8Beispiel:\n§9var i 2\nvar j 2\nadd k i j\necho $k"); BookMeta bookMeta = (BookMeta) BOOK.getItemMeta(); bookMeta.setGeneration(BookMeta.Generation.ORIGINAL); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/RecordStatus.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/RecordStatus.java index e9f69e7..b3d0a94 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/RecordStatus.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/RecordStatus.java @@ -21,18 +21,20 @@ package de.steamwar.bausystem.tracer.record; public enum RecordStatus { - RECORD("§aan", true,"§cTNT-Tracer muss gestoppt werden"), - RECORD_AUTO("§aan", true, "§cTNT-Tracer darf nicht aufnehmen"), - IDLE("§caus", false, "§cAuto-Tracer gestoppt"), - IDLE_AUTO("§eauto", false, "§aAuto-Tracer gestartet"); + RECORD("§aan", true,false, "§cTNT-Tracer muss gestoppt werden"), + RECORD_AUTO("§aan", true, true, "§cTNT-Tracer darf nicht aufnehmen"), + IDLE("§caus", false, false, "§cAuto-Tracer gestoppt"), + IDLE_AUTO("§eauto", false, true, "§aAuto-Tracer gestartet"); String name; boolean tracing; + boolean autoTrace; String autoMessage; - RecordStatus(String value, boolean tracing, String autoMessage) { + RecordStatus(String value, boolean tracing, boolean autoTrace, String autoMessage) { this.name = value; this.tracing = tracing; + this.autoTrace = autoTrace; this.autoMessage = autoMessage; } @@ -44,6 +46,10 @@ public enum RecordStatus { return tracing; } + public boolean isAutoTrace() { + return autoTrace; + } + public String getAutoMessage() { return autoMessage; } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java b/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java index 07cffe3..af29687 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java @@ -37,6 +37,8 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BookMeta; import java.util.*; +import java.util.function.Function; +import java.util.function.IntBinaryOperator; import java.util.logging.Level; public class ScriptListener implements Listener { @@ -122,12 +124,12 @@ public class ScriptListener implements Listener { } switch (firstArg.toLowerCase()) { case "sleep": - ScriptListener.sleepCommand(this, generateArgumentArray("sleep", command)); + ScriptListener.sleepCommand(this, generateArgumentArray("sleep", this, command)); return; case "exit": return; case "jump": - int jumpIndex = ScriptListener.jumpCommand(this, generateArgumentArray("jump", command)); + int jumpIndex = ScriptListener.jumpCommand(this, generateArgumentArray("jump", this, command)); if (jumpIndex != -1) { index = jumpIndex; } else { @@ -135,13 +137,25 @@ public class ScriptListener implements Listener { } continue; case "echo": - ScriptListener.echoCommand(this, generateArgumentArray("echo", command)); + ScriptListener.echoCommand(this, generateArgumentArray("echo", this, command)); continue; case "var": - ScriptListener.variableCommand(this, generateArgumentArray("var", command)); + ScriptListener.variableCommand(this, generateArgumentArray("var", this, command)); + continue; + case "add": + ScriptListener.arithmeticCommand(this, generateArgumentArray("add", this, command), (left, right) -> left + right); + continue; + case "sub": + ScriptListener.arithmeticCommand(this, generateArgumentArray("sub", this, command), (left, right) -> left - right); + continue; + case "mul": + ScriptListener.arithmeticCommand(this, generateArgumentArray("mul", this, command), (left, right) -> left * right); + continue; + case "div": + ScriptListener.arithmeticCommand(this, generateArgumentArray("div", this, command), (left, right) -> left / right); continue; case "if": - int ifJumpIndex = ScriptListener.ifCommand(this, generateArgumentArray("if", command)); + int ifJumpIndex = ScriptListener.ifCommand(this, generateArgumentArray("if", this, command)); if (ifJumpIndex != -1) { index = ifJumpIndex; } @@ -157,10 +171,7 @@ public class ScriptListener implements Listener { } // Variable Replaces in commands. - String[] commandArgs = command.split(" "); - String[] args = Arrays.copyOfRange(commandArgs, 1, commandArgs.length); - replaceVariables(this, args); - command = commandArgs[0] + " " + String.join(" ", args); + command = String.join(" ", generateArgumentArray("", this, command)); Bukkit.getLogger().log(Level.INFO, player.getName() + " dispatched command: " + command); Bukkit.getServer().dispatchCommand(player, command); @@ -169,8 +180,15 @@ public class ScriptListener implements Listener { } - private static String[] generateArgumentArray(String command, String fullCommand) { - return fullCommand.substring(command.length()).trim().split(" "); + private static String[] generateArgumentArray(String command, ScriptExecutor scriptExecutor, String fullCommand) { + String[] strings; + if (command.isEmpty()) { + strings = fullCommand.split(" "); + } else { + strings = fullCommand.substring(command.length()).trim().split(" "); + } + replaceVariables(scriptExecutor, strings); + return strings; } private static void sleepCommand(ScriptExecutor scriptExecutor, String[] args) { @@ -233,31 +251,20 @@ public class ScriptListener implements Listener { default: break; } - setValue(scriptExecutor, args[0], args[1]); + setValue(scriptExecutor, args[0], parseValue(args[1])); } private static int ifCommand(ScriptExecutor scriptExecutor, String[] args) { if (args.length < 2) { - scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cDie ersten beiden Argumente sind Zahlen/Boolsche Wertde oder Variablen."); + scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cDie ersten beiden Argumente sind Zahlen/Boolsche Werte oder Variablen."); return -1; } int jumpTruePoint = scriptExecutor.jumpPoints.getOrDefault(args[2], -1); int jumpFalsePoint = args.length > 3 ? scriptExecutor.jumpPoints.getOrDefault(args[3], -1) : -1; - int firstValue; - int secondValue; - if (isVariable(scriptExecutor, args[0])) { - firstValue = getValue(scriptExecutor, args[0]); - } else { - firstValue = parseValue(args[0]); - } - if (isVariable(scriptExecutor, args[1])) { - secondValue = getValue(scriptExecutor, args[1]); - } else { - secondValue = parseValue(args[1]); - } - + int firstValue = getValueOrParse(scriptExecutor, args[0]); + int secondValue = getValueOrParse(scriptExecutor, args[1]); if (firstValue == secondValue) { return jumpTruePoint; } else { @@ -265,8 +272,34 @@ public class ScriptListener implements Listener { } } - private static void setValue(ScriptExecutor scriptExecutor, String key, String value) { - scriptExecutor.variables.put(key, parseValue(value)); + private static void arithmeticCommand(ScriptExecutor scriptExecutor, String[] args, IntBinaryOperator operation) { + if (args.length < 1) { + scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cDas erste Argument ist eine Variable"); + return; + } + if (args.length < 2) { + scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cDas zweite Argument ist eine Zahl oder Variable"); + return; + } + + int firstValue; + int secondValue; + if (args.length < 3) { + if (!isVariable(scriptExecutor, args[0])) { + scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cDas erste Argument muss eine Variable sein"); + return; + } + firstValue = getValue(scriptExecutor, args[0]); + secondValue = getValueOrParse(scriptExecutor, args[1]); + } else { + firstValue = getValue(scriptExecutor, args[1]); + secondValue = getValueOrParse(scriptExecutor, args[2]); + } + setValue(scriptExecutor, args[0], operation.applyAsInt(firstValue, secondValue)); + } + + private static void setValue(ScriptExecutor scriptExecutor, String key, int value) { + scriptExecutor.variables.put(key, value); } private static void add(ScriptExecutor scriptExecutor, String key, int value) { @@ -276,17 +309,27 @@ public class ScriptListener implements Listener { scriptExecutor.variables.put(key, scriptExecutor.variables.get(key) + value); } + private static int getValueOrParse(ScriptExecutor scriptExecutor, String key) { + if (isVariable(scriptExecutor, key)) { + return getValue(scriptExecutor, key); + } else { + return parseValue(key); + } + } + private static int getValue(ScriptExecutor scriptExecutor, String key) { Region region = Region.getRegion(scriptExecutor.player.getLocation()); switch (key) { case "trace": return RecordStateMachine.getRecordStatus().isTracing() ? 1 : 0; + case "auto_trace": + return RecordStateMachine.getRecordStatus().isAutoTrace() ? 1 : 0; case "tnt": - return region == null || region.getTntMode() == CommandTNT.TNTMode.OFF ? 0 : 1; + return region.getTntMode() == CommandTNT.TNTMode.OFF ? 0 : 1; case "freeze": - return region == null || !region.isFreeze() ? 0 : 1; + return !region.isFreeze() ? 0 : 1; case "fire": - return region == null || !region.isFire() ? 0 : 1; + return !region.isFire() ? 0 : 1; default: return scriptExecutor.variables.getOrDefault(key, 0); } @@ -295,6 +338,7 @@ public class ScriptListener implements Listener { private static boolean isVariable(ScriptExecutor scriptExecutor, String key) { switch (key) { case "trace": + case "auto_trace": case "tnt": case "freeze": case "fire": From a7e45111f57e6b923ac9dfcef165b999b2b3e064 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sat, 13 Mar 2021 15:06:42 +0100 Subject: [PATCH 2/6] Add variable reference support to internal commands Add arithmetic commands Add auto_trace constant --- .../src/de/steamwar/bausystem/commands/CommandScript.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java index 12188de..9bae4d5 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java @@ -47,7 +47,7 @@ public class CommandScript implements CommandExecutor { pages.add("§6Variablen§8\n\nMit Variablen kann man sich Zahlen speichern. Man definiert diese mit 'var '.\n\nBeispiel:\n§9# Setze i zu 0\nvar i 0§8\n\nEs gibt einige spezial values. Dazu zählen"); pages.add("§8'true', 'yes', 'false' und 'no', welche für 1, 1, 0 und 0 stehen.\n\nMan kann eine Variable auch um einen erhöhen oder verkleinern. Hierfür schreibt man statt einer Zahl '++', 'inc' oder '--', 'dec'.\n\nBeispiel:\n§9var i ++§8"); pages.add("§8Variablen kann man referenzieren\ndurch '$' vor dem Variablennamen. Diese kann man in jedem Befehl verwenden.\n\nBeispiel:\n§9# Stacked um 10\nvar stacks 10\n/stack $stacks§8"); - pages.add("§6Konstanten§8\n\nNeben den variablen gibt es noch 4 Konstante Werte, welche nicht mit dem 'var' Befehl verändert werden können.\n\nDiese sind:\n- trace/auto_trace\n- tnt\n- freeze\n- fire"); + pages.add("§6Konstanten§8\n\nNeben den variablen gibt es noch 5 Konstante Werte, welche nicht mit dem 'var' Befehl verändert werden können.\n\nDiese sind:\n- trace/auto_trace\n- tnt\n- freeze\n- fire"); pages.add("§6Abfragen§8\n\nMit Abfragen kann man nur Gleichheit von 2 Werten überprüft werden. Hierfür verwendet man\n'if '.\nNach den zwei Werten kann man ein oder 2 Jump-Points schreiben\n'if [...] (JP)'."); pages.add("§8Ein Jump-Point ist eine Zeile Script, wohin man springen kann. Dieser wird mit einem '.' am Anfang der Zeile beschrieben und direkt danach der Jump-Point Namen ohne Leerzeichen.\n\nBeispiel:\n§9# Jump-Point X\n.X§8"); pages.add("§8Um zu einem Jump-Point ohne Abfrage zu springen kann man den\n'jump ' Befehl verwenden."); From c4564e313a58b31f226a18c185a93f81c55e7802 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 19 Mar 2021 22:27:57 +0100 Subject: [PATCH 3/6] Fix ScriptListener Fix RecordStatus --- .../bausystem/tracer/record/RecordStatus.java | 14 ++++++-------- .../steamwar/bausystem/world/ScriptListener.java | 9 ++++----- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/RecordStatus.java b/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/RecordStatus.java index b3d0a94..b87e740 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/RecordStatus.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/tracer/record/RecordStatus.java @@ -21,20 +21,18 @@ package de.steamwar.bausystem.tracer.record; public enum RecordStatus { - RECORD("§aan", true,false, "§cTNT-Tracer muss gestoppt werden"), - RECORD_AUTO("§aan", true, true, "§cTNT-Tracer darf nicht aufnehmen"), - IDLE("§caus", false, false, "§cAuto-Tracer gestoppt"), - IDLE_AUTO("§eauto", false, true, "§aAuto-Tracer gestartet"); + RECORD("§aan", true, "§cTNT-Tracer muss gestoppt werden"), + RECORD_AUTO("§aan", true, "§cTNT-Tracer darf nicht aufnehmen"), + IDLE("§caus", false, "§cAuto-Tracer gestoppt"), + IDLE_AUTO("§eauto", false, "§aAuto-Tracer gestartet"); String name; boolean tracing; - boolean autoTrace; String autoMessage; - RecordStatus(String value, boolean tracing, boolean autoTrace, String autoMessage) { + RecordStatus(String value, boolean tracing, String autoMessage) { this.name = value; this.tracing = tracing; - this.autoTrace = autoTrace; this.autoMessage = autoMessage; } @@ -47,7 +45,7 @@ public enum RecordStatus { } public boolean isAutoTrace() { - return autoTrace; + return this == RECORD_AUTO || this == IDLE_AUTO; } public String getAutoMessage() { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java b/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java index af29687..31a361b 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java @@ -37,7 +37,6 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.BookMeta; import java.util.*; -import java.util.function.Function; import java.util.function.IntBinaryOperator; import java.util.logging.Level; @@ -274,11 +273,11 @@ public class ScriptListener implements Listener { private static void arithmeticCommand(ScriptExecutor scriptExecutor, String[] args, IntBinaryOperator operation) { if (args.length < 1) { - scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cDas erste Argument ist eine Variable"); + scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cAls erstes Argument fehlt eine Variable"); return; } if (args.length < 2) { - scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cDas zweite Argument ist eine Zahl oder Variable"); + scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cAls zweites Argument fehlt eine Zahl oder Variable"); return; } @@ -322,7 +321,7 @@ public class ScriptListener implements Listener { switch (key) { case "trace": return RecordStateMachine.getRecordStatus().isTracing() ? 1 : 0; - case "auto_trace": + case "autotrace": return RecordStateMachine.getRecordStatus().isAutoTrace() ? 1 : 0; case "tnt": return region.getTntMode() == CommandTNT.TNTMode.OFF ? 0 : 1; @@ -338,7 +337,7 @@ public class ScriptListener implements Listener { private static boolean isVariable(ScriptExecutor scriptExecutor, String key) { switch (key) { case "trace": - case "auto_trace": + case "autotrace": case "tnt": case "freeze": case "fire": From de68dc00f1f3f4a0eb9942104cded8bee77ffdde Mon Sep 17 00:00:00 2001 From: yoyosource Date: Fri, 19 Mar 2021 22:41:30 +0100 Subject: [PATCH 4/6] Fix CommandScript --- .../src/de/steamwar/bausystem/commands/CommandScript.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java index 9bae4d5..e2d0bfa 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java @@ -47,7 +47,7 @@ public class CommandScript implements CommandExecutor { pages.add("§6Variablen§8\n\nMit Variablen kann man sich Zahlen speichern. Man definiert diese mit 'var '.\n\nBeispiel:\n§9# Setze i zu 0\nvar i 0§8\n\nEs gibt einige spezial values. Dazu zählen"); pages.add("§8'true', 'yes', 'false' und 'no', welche für 1, 1, 0 und 0 stehen.\n\nMan kann eine Variable auch um einen erhöhen oder verkleinern. Hierfür schreibt man statt einer Zahl '++', 'inc' oder '--', 'dec'.\n\nBeispiel:\n§9var i ++§8"); pages.add("§8Variablen kann man referenzieren\ndurch '$' vor dem Variablennamen. Diese kann man in jedem Befehl verwenden.\n\nBeispiel:\n§9# Stacked um 10\nvar stacks 10\n/stack $stacks§8"); - pages.add("§6Konstanten§8\n\nNeben den variablen gibt es noch 5 Konstante Werte, welche nicht mit dem 'var' Befehl verändert werden können.\n\nDiese sind:\n- trace/auto_trace\n- tnt\n- freeze\n- fire"); + pages.add("§6Konstanten§8\n\nNeben den variablen gibt es noch 5 Konstante Werte, welche nicht mit dem 'var' Befehl verändert werden können.\n\nDiese sind:\n- trace/autotrace\n- tnt\n- freeze\n- fire"); pages.add("§6Abfragen§8\n\nMit Abfragen kann man nur Gleichheit von 2 Werten überprüft werden. Hierfür verwendet man\n'if '.\nNach den zwei Werten kann man ein oder 2 Jump-Points schreiben\n'if [...] (JP)'."); pages.add("§8Ein Jump-Point ist eine Zeile Script, wohin man springen kann. Dieser wird mit einem '.' am Anfang der Zeile beschrieben und direkt danach der Jump-Point Namen ohne Leerzeichen.\n\nBeispiel:\n§9# Jump-Point X\n.X§8"); pages.add("§8Um zu einem Jump-Point ohne Abfrage zu springen kann man den\n'jump ' Befehl verwenden."); From 48a60e19b3b4e415722c6190fced952b6e79070a Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sat, 20 Mar 2021 12:31:17 +0100 Subject: [PATCH 5/6] Add Logic to ScriptListener Add Input to ScriptListener --- .../bausystem/commands/CommandScript.java | 21 +++-- .../bausystem/world/ScriptListener.java | 82 +++++++++++++++++-- 2 files changed, 91 insertions(+), 12 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java index e2d0bfa..95ddb92 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandScript.java @@ -39,24 +39,31 @@ public class CommandScript implements CommandExecutor { static { List pages = new ArrayList<>(); - pages.add("§6Script System§8\n\n- Commands\n- Kommentare\n- Scriptausführung\n- Sleep\n- Variablen\n- Konstanten\n- Abfragen\n- Schleifen\n- \"echo\"\n- Arithmetik"); + pages.add("§6Script System§8\n\n- Commands\n- Kommentare\n- Scriptausführung\n- Sleep\n- Variablen\n- Konstanten\n- Abfragen\n- Schleifen\n- \"echo\"\n- \"input\"\n- Arithmetik\n- Logik"); pages.add("§6Commands§8\n\nEin minecraft Befehl wird im Scriptbuch so hingeschrieben. Dabei kann man ein '/' weglassen. Um Befehle zu trennen kommen diese in neue Zeilen.\n\nStatt\n/tnt -> tnt\n//pos1 -> /pos1"); - pages.add("§6Kommentare§8\n\nFür ein Kommentar fängt die Zeile mit einem '#' an. Diese Zeilen werden bei dem Ausführen dann ignoriert.\n\nBeispiel:\n§9# TNT an/aus\ntnt§8"); + pages.add("§6Kommentare§8\n\nFür ein Kommentar fängt die Zeile mit einem '#' an. Diese Zeilen werden bei dem Ausführen dann ignoriert.\n\nBeispiel:\n§9# TNT an/aus\ntnt"); pages.add("§6Scriptausführung§8\n\nWenn du mit dem Buch in der Hand links klickst wird dieses ausgeführt."); - pages.add("§6Sleep§8\n\nUm Sachen langsamer zu machen kann man ein 'sleep' in sein Script schreiben. Danach kommt eine Zahl mit der Anzahl der GameTicks die zu schlafen sind.\n\nBeispiel:\n§9# 1 Sekunde schlafen\nsleep 20§8"); + pages.add("§6Sleep§8\n\nUm Sachen langsamer zu machen kann man ein 'sleep' in sein Script schreiben. Danach kommt eine Zahl mit der Anzahl der GameTicks die zu schlafen sind.\n\nBeispiel:\n§9# 1 Sekunde schlafen\nsleep 20"); pages.add("§6Variablen§8\n\nMit Variablen kann man sich Zahlen speichern. Man definiert diese mit 'var '.\n\nBeispiel:\n§9# Setze i zu 0\nvar i 0§8\n\nEs gibt einige spezial values. Dazu zählen"); - pages.add("§8'true', 'yes', 'false' und 'no', welche für 1, 1, 0 und 0 stehen.\n\nMan kann eine Variable auch um einen erhöhen oder verkleinern. Hierfür schreibt man statt einer Zahl '++', 'inc' oder '--', 'dec'.\n\nBeispiel:\n§9var i ++§8"); - pages.add("§8Variablen kann man referenzieren\ndurch '$' vor dem Variablennamen. Diese kann man in jedem Befehl verwenden.\n\nBeispiel:\n§9# Stacked um 10\nvar stacks 10\n/stack $stacks§8"); + pages.add("§8'true', 'yes', 'false' und 'no', welche für 1, 1, 0 und 0 stehen.\n\nMan kann eine Variable auch um einen erhöhen oder verkleinern. Hierfür schreibt man statt einer Zahl '++', 'inc' oder '--', 'dec'.\n\nBeispiel:\n§9var i ++"); + pages.add("§8Variablen kann man referenzieren\ndurch '<' vor dem Variablennamen und '>' nach diesem. Diese kann man in jedem Befehl verwenden.\n\nBeispiel:\n§9# Stacked um 10\nvar stacks 10\n/stack "); pages.add("§6Konstanten§8\n\nNeben den variablen gibt es noch 5 Konstante Werte, welche nicht mit dem 'var' Befehl verändert werden können.\n\nDiese sind:\n- trace/autotrace\n- tnt\n- freeze\n- fire"); pages.add("§6Abfragen§8\n\nMit Abfragen kann man nur Gleichheit von 2 Werten überprüft werden. Hierfür verwendet man\n'if '.\nNach den zwei Werten kann man ein oder 2 Jump-Points schreiben\n'if [...] (JP)'."); pages.add("§8Ein Jump-Point ist eine Zeile Script, wohin man springen kann. Dieser wird mit einem '.' am Anfang der Zeile beschrieben und direkt danach der Jump-Point Namen ohne Leerzeichen.\n\nBeispiel:\n§9# Jump-Point X\n.X§8"); pages.add("§8Um zu einem Jump-Point ohne Abfrage zu springen kann man den\n'jump ' Befehl verwenden."); pages.add("§6Schleifen§8\n\nSchleifen werden mit Jump-Points, if Abfragen und Jumps gebaut.\n\nBeispiel:\n§9var i 0\n.JUMP\nvar i ++\nif i 10 END JUMP\n.END§8"); - pages.add("§6\"echo\"§8\n\nDer echo Befehl ist gut um Ausgaben zu tätigen. Hier drin kann man sowohl Variablen ausgeben, als auch Farbcodes verwenden. Es wird alles nach dem Befehl ausgegeben.\n\nBeispiel:\n§9echo &eSteam&8war &7war hier!§8"); + pages.add("§6\"echo\"§8\n\nDer echo Befehl ist da um Ausgaben zu tätigen. Hier drin kann man sowohl Variablen ausgeben, als auch Farbcodes verwenden. Es wird alles nach dem Befehl ausgegeben.\n\nBeispiel:\n§9echo &eSteam&8war &7war hier!"); + pages.add("§6\"input\"§8\n\nDer input Befehl ist eine Aufforderung einer Eingabe des Users. Die Argumente sind eine Variable und ein Text als Nachricht.\n\nBeispiel:\n§9input age &eDein Alter?"); pages.add("§6Arithmetik§8\n\nEs gibt 4 Arithmetische Befehle:\n- add\n- sub\n- mul\n- div\n\nDer erste Parameter ist die Variable welche den ausgerechneten Wert halten soll. Hiernach muss ein"); - pages.add("§8Wert oder Variable kommen welcher verrechnet wird. Hierbei wird das erste Argument als ersten Operand genommen.\n\nBeispiel:\n§9var i 2\nvar j 3\nadd i j\necho $i§8"); + pages.add("§8Wert oder Variable kommen welcher verrechnet wird. Hierbei wird das erste Argument als ersten Operand genommen.\n\nBeispiel:\n§9var i 2\nvar j 3\nadd i j\necho $i"); pages.add("§8Man kann auch 3 Argumente angeben. Dann wird die arithmetische Operation zwischen den letzten beiden Argumenten berechnet und als Variable des ersten Arguments abgespeichert. \n\nBeispiel auf der nächsten Seite -->"); pages.add("§8Beispiel:\n§9var i 2\nvar j 2\nadd k i j\necho $k"); + pages.add("§6Logik§8\n\nEs gibt 3 Vergleichs Befehle:\n- equal\n- less\n- greater\n\nUnd 3 Logik Befehle:\n- and\n- or\n- not"); + pages.add("§8Der erste Parameter ist die Variable welche den ausgerechneten Wert halten soll. Hiernach muss ein Wert oder Variable kommen welcher verrechnet wird. Hierbei wird das erste Argument als ersten Operand genommen. Dies gilt nicht für den 'not' Befehl, welcher"); + pages.add("§8nur 2 Parameter nimmt. Der erste die Variable und der zweite eine optionale Variable oder ein Wert. Equal vergleicht 2 Werte, less gibt zurück ob der erste kleiner als der zweite Wert ist, greater gibt zurück ob der erste größer als der zweite Wert ist."); + pages.add("§8And vergleicht ob 2 Werte true (1) sind. Or vergleicht ob 1 Wert oder 2 Werte true (1) ist/sind. Not invertiert den Wert von true (1) auf false und anders rum."); + pages.add("§8Beispiel:\n§9var i 1\nvar j 1\n#Ist i und j gleich\nequal k i j\nvar j 0\n#Ist i kleiner j\nless k i j\n#Ist i größer j\ngreater k i j\n#Ist i und j true\nand k i j\n#Beispiel weiter auf nächster Seite"); + pages.add("§9#Ist i oder j true\nor k i j\n#Invertiere i\nnot k i"); BookMeta bookMeta = (BookMeta) BOOK.getItemMeta(); bookMeta.setGeneration(BookMeta.Generation.ORIGINAL); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java b/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java index 31a361b..d341db9 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java @@ -24,6 +24,7 @@ import de.steamwar.bausystem.commands.CommandScript; import de.steamwar.bausystem.commands.CommandTNT; import de.steamwar.bausystem.tracer.record.RecordStateMachine; import de.steamwar.core.VersionedCallable; +import de.steamwar.inventory.SWAnvilInv; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.entity.Player; @@ -38,6 +39,7 @@ import org.bukkit.inventory.meta.BookMeta; import java.util.*; import java.util.function.IntBinaryOperator; +import java.util.function.IntUnaryOperator; import java.util.logging.Level; public class ScriptListener implements Listener { @@ -138,6 +140,9 @@ public class ScriptListener implements Listener { case "echo": ScriptListener.echoCommand(this, generateArgumentArray("echo", this, command)); continue; + case "input": + ScriptListener.inputCommand(this, generateArgumentArray("input", this, command)); + return; case "var": ScriptListener.variableCommand(this, generateArgumentArray("var", this, command)); continue; @@ -153,6 +158,24 @@ public class ScriptListener implements Listener { case "div": ScriptListener.arithmeticCommand(this, generateArgumentArray("div", this, command), (left, right) -> left / right); continue; + case "equal": + ScriptListener.arithmeticCommand(this, generateArgumentArray("equal", this, command), (left, right) -> left == right ? 1 : 0); + continue; + case "less": + ScriptListener.arithmeticCommand(this, generateArgumentArray("less", this, command), (left, right) -> left < right ? 1 : 0); + continue; + case "greater": + ScriptListener.arithmeticCommand(this, generateArgumentArray("greater", this, command), (left, right) -> left > right ? 1 : 0); + continue; + case "not": + ScriptListener.arithmeticInfixCommand(this, generateArgumentArray("not", this, command), (left) -> left == 1 ? 0 : 1); + continue; + case "and": + ScriptListener.arithmeticCommand(this, generateArgumentArray("and", this, command), (left, right) -> left == 1 && right == 1 ? 1 : 0); + continue; + case "or": + ScriptListener.arithmeticCommand(this, generateArgumentArray("or", this, command), (left, right) -> left == 1 || right == 1 ? 1 : 0); + continue; case "if": int ifJumpIndex = ScriptListener.ifCommand(this, generateArgumentArray("if", this, command)); if (ifJumpIndex != -1) { @@ -186,8 +209,7 @@ public class ScriptListener implements Listener { } else { strings = fullCommand.substring(command.length()).trim().split(" "); } - replaceVariables(scriptExecutor, strings); - return strings; + return replaceVariables(scriptExecutor, strings); } private static void sleepCommand(ScriptExecutor scriptExecutor, String[] args) { @@ -214,17 +236,25 @@ public class ScriptListener implements Listener { return scriptExecutor.jumpPoints.getOrDefault(args[0], -1); } - private static void replaceVariables(ScriptExecutor scriptExecutor, String[] args) { + private static String[] replaceVariables(ScriptExecutor scriptExecutor, String[] args) { + // Legacy '$' notation for variable reference, could be removed later on. for (int i = 0; i < args.length; i++) { if (args[i].startsWith("$") && isVariable(scriptExecutor, args[i].substring(1))) { args[i] = getValue(scriptExecutor, args[i].substring(1)) + ""; } } + + String s = String.join(" ", args); + Set variables = new HashSet<>(scriptExecutor.variables.keySet()); + variables.addAll(Arrays.asList("trace", "autotrace", "tnt", "freeze", "fire")); + for (String variable : variables) { + s = s.replace("<" + variable + ">", getValue(scriptExecutor, variable) + ""); + } + return s.split(" "); } private static void echoCommand(ScriptExecutor scriptExecutor, String[] args) { - replaceVariables(scriptExecutor, args); - scriptExecutor.player.sendMessage("§eInfo§8» §7" + ChatColor.translateAlternateColorCodes('&', String.join(" ", args))); + scriptExecutor.player.sendMessage("§eInfo§8» §7" + ChatColor.translateAlternateColorCodes('&', String.join(" ", replaceVariables(scriptExecutor, args)))); } private static void variableCommand(ScriptExecutor scriptExecutor, String[] args) { @@ -297,6 +327,48 @@ public class ScriptListener implements Listener { setValue(scriptExecutor, args[0], operation.applyAsInt(firstValue, secondValue)); } + private static void arithmeticInfixCommand(ScriptExecutor scriptExecutor, String[] args, IntUnaryOperator operation) { + if (args.length < 1) { + scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cAls erstes Argument fehlt eine Variable"); + return; + } + + int firstValue; + if (args.length < 2) { + if (!isVariable(scriptExecutor, args[0])) { + scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cDas erste Argument muss eine Variable sein"); + return; + } + firstValue = getValue(scriptExecutor, args[0]); + } else { + firstValue = getValue(scriptExecutor, args[1]); + } + setValue(scriptExecutor, args[0], operation.applyAsInt(firstValue)); + } + + private static void inputCommand(ScriptExecutor scriptExecutor, String[] args) { + if (args.length < 1) { + scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cAls erstes Argument fehlt eine Variable"); + return; + } + String varName = args[0]; + StringBuilder st = new StringBuilder(); + for (int i = 1; i < args.length; i++) { + if (i != 1) { + st.append(" "); + } + st.append(args[i]); + } + + SWAnvilInv swAnvilInv = new SWAnvilInv(scriptExecutor.player, ChatColor.translateAlternateColorCodes('&', st.toString())); + swAnvilInv.setCallback(s -> { + int value = parseValue(s); + setValue(scriptExecutor, varName, value); + scriptExecutor.resume(); + }); + swAnvilInv.open(); + } + private static void setValue(ScriptExecutor scriptExecutor, String key, int value) { scriptExecutor.variables.put(key, value); } From 704a50b9b65f7c9ed18b57588e8105f09f42c634 Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sat, 20 Mar 2021 12:45:24 +0100 Subject: [PATCH 6/6] Fix ScriptListener --- .../src/de/steamwar/bausystem/world/ScriptListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java b/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java index 341f341..f20994a 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java @@ -288,7 +288,7 @@ public class ScriptListener implements Listener { scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cDie ersten beiden Argumente sind Zahlen/Boolsche Werte oder Variablen."); return -1; } - + int jumpTruePoint = scriptExecutor.jumpPoints.getOrDefault(args[2], -1); int jumpFalsePoint = args.length > 3 ? scriptExecutor.jumpPoints.getOrDefault(args[3], -1) : -1;