Add variable reference support to internal commands
Add arithmetic commands Add auto_trace constant
Dieser Commit ist enthalten in:
Ursprung
83a97944bf
Commit
50decb6a4a
@ -39,7 +39,7 @@ public class CommandScript implements CommandExecutor {
|
|||||||
|
|
||||||
static {
|
static {
|
||||||
List<String> pages = new ArrayList<>();
|
List<String> 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("§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§8");
|
||||||
pages.add("§6Scriptausführung§8\n\nWenn du mit dem Buch in der Hand links klickst wird dieses ausgeführt.");
|
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 <NAME> <VALUE>'.\n\nBeispiel:\n§9# Setze i zu 0\nvar i 0§8\n\nEs gibt einige spezial values. Dazu zählen");
|
pages.add("§6Variablen§8\n\nMit Variablen kann man sich Zahlen speichern. Man definiert diese mit 'var <NAME> <VALUE>'.\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("§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("§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 <VAL> <VAL>'.\nNach den zwei Werten kann man ein oder 2 Jump-Points schreiben\n'if [...] <JP> (JP)'.");
|
pages.add("§6Abfragen§8\n\nMit Abfragen kann man nur Gleichheit von 2 Werten überprüft werden. Hierfür verwendet man\n'if <VAL> <VAL>'.\nNach den zwei Werten kann man ein oder 2 Jump-Points schreiben\n'if [...] <JP> (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("§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 <JP>' Befehl verwenden.");
|
pages.add("§8Um zu einem Jump-Point ohne Abfrage zu springen kann man den\n'jump <JP>' 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("§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 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 bookMeta = (BookMeta) BOOK.getItemMeta();
|
||||||
bookMeta.setGeneration(BookMeta.Generation.ORIGINAL);
|
bookMeta.setGeneration(BookMeta.Generation.ORIGINAL);
|
||||||
|
@ -21,18 +21,20 @@ package de.steamwar.bausystem.tracer.record;
|
|||||||
|
|
||||||
public enum RecordStatus {
|
public enum RecordStatus {
|
||||||
|
|
||||||
RECORD("§aan", true,"§cTNT-Tracer muss gestoppt werden"),
|
RECORD("§aan", true,false, "§cTNT-Tracer muss gestoppt werden"),
|
||||||
RECORD_AUTO("§aan", true, "§cTNT-Tracer darf nicht aufnehmen"),
|
RECORD_AUTO("§aan", true, true, "§cTNT-Tracer darf nicht aufnehmen"),
|
||||||
IDLE("§caus", false, "§cAuto-Tracer gestoppt"),
|
IDLE("§caus", false, false, "§cAuto-Tracer gestoppt"),
|
||||||
IDLE_AUTO("§eauto", false, "§aAuto-Tracer gestartet");
|
IDLE_AUTO("§eauto", false, true, "§aAuto-Tracer gestartet");
|
||||||
|
|
||||||
String name;
|
String name;
|
||||||
boolean tracing;
|
boolean tracing;
|
||||||
|
boolean autoTrace;
|
||||||
String autoMessage;
|
String autoMessage;
|
||||||
|
|
||||||
RecordStatus(String value, boolean tracing, String autoMessage) {
|
RecordStatus(String value, boolean tracing, boolean autoTrace, String autoMessage) {
|
||||||
this.name = value;
|
this.name = value;
|
||||||
this.tracing = tracing;
|
this.tracing = tracing;
|
||||||
|
this.autoTrace = autoTrace;
|
||||||
this.autoMessage = autoMessage;
|
this.autoMessage = autoMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,6 +46,10 @@ public enum RecordStatus {
|
|||||||
return tracing;
|
return tracing;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isAutoTrace() {
|
||||||
|
return autoTrace;
|
||||||
|
}
|
||||||
|
|
||||||
public String getAutoMessage() {
|
public String getAutoMessage() {
|
||||||
return autoMessage;
|
return autoMessage;
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,8 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import org.bukkit.inventory.meta.BookMeta;
|
import org.bukkit.inventory.meta.BookMeta;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
import java.util.function.Function;
|
||||||
|
import java.util.function.IntBinaryOperator;
|
||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
public class ScriptListener implements Listener {
|
public class ScriptListener implements Listener {
|
||||||
@ -122,12 +124,12 @@ public class ScriptListener implements Listener {
|
|||||||
}
|
}
|
||||||
switch (firstArg.toLowerCase()) {
|
switch (firstArg.toLowerCase()) {
|
||||||
case "sleep":
|
case "sleep":
|
||||||
ScriptListener.sleepCommand(this, generateArgumentArray("sleep", command));
|
ScriptListener.sleepCommand(this, generateArgumentArray("sleep", this, command));
|
||||||
return;
|
return;
|
||||||
case "exit":
|
case "exit":
|
||||||
return;
|
return;
|
||||||
case "jump":
|
case "jump":
|
||||||
int jumpIndex = ScriptListener.jumpCommand(this, generateArgumentArray("jump", command));
|
int jumpIndex = ScriptListener.jumpCommand(this, generateArgumentArray("jump", this, command));
|
||||||
if (jumpIndex != -1) {
|
if (jumpIndex != -1) {
|
||||||
index = jumpIndex;
|
index = jumpIndex;
|
||||||
} else {
|
} else {
|
||||||
@ -135,13 +137,25 @@ public class ScriptListener implements Listener {
|
|||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
case "echo":
|
case "echo":
|
||||||
ScriptListener.echoCommand(this, generateArgumentArray("echo", command));
|
ScriptListener.echoCommand(this, generateArgumentArray("echo", this, command));
|
||||||
continue;
|
continue;
|
||||||
case "var":
|
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;
|
continue;
|
||||||
case "if":
|
case "if":
|
||||||
int ifJumpIndex = ScriptListener.ifCommand(this, generateArgumentArray("if", command));
|
int ifJumpIndex = ScriptListener.ifCommand(this, generateArgumentArray("if", this, command));
|
||||||
if (ifJumpIndex != -1) {
|
if (ifJumpIndex != -1) {
|
||||||
index = ifJumpIndex;
|
index = ifJumpIndex;
|
||||||
}
|
}
|
||||||
@ -157,10 +171,7 @@ public class ScriptListener implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Variable Replaces in commands.
|
// Variable Replaces in commands.
|
||||||
String[] commandArgs = command.split(" ");
|
command = String.join(" ", generateArgumentArray("", this, command));
|
||||||
String[] args = Arrays.copyOfRange(commandArgs, 1, commandArgs.length);
|
|
||||||
replaceVariables(this, args);
|
|
||||||
command = commandArgs[0] + " " + String.join(" ", args);
|
|
||||||
|
|
||||||
Bukkit.getLogger().log(Level.INFO, player.getName() + " dispatched command: " + command);
|
Bukkit.getLogger().log(Level.INFO, player.getName() + " dispatched command: " + command);
|
||||||
Bukkit.getServer().dispatchCommand(player, command);
|
Bukkit.getServer().dispatchCommand(player, command);
|
||||||
@ -169,8 +180,15 @@ public class ScriptListener implements Listener {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String[] generateArgumentArray(String command, String fullCommand) {
|
private static String[] generateArgumentArray(String command, ScriptExecutor scriptExecutor, String fullCommand) {
|
||||||
return fullCommand.substring(command.length()).trim().split(" ");
|
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) {
|
private static void sleepCommand(ScriptExecutor scriptExecutor, String[] args) {
|
||||||
@ -233,31 +251,20 @@ public class ScriptListener implements Listener {
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
setValue(scriptExecutor, args[0], args[1]);
|
setValue(scriptExecutor, args[0], parseValue(args[1]));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int ifCommand(ScriptExecutor scriptExecutor, String[] args) {
|
private static int ifCommand(ScriptExecutor scriptExecutor, String[] args) {
|
||||||
if (args.length < 2) {
|
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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int jumpTruePoint = scriptExecutor.jumpPoints.getOrDefault(args[2], -1);
|
int jumpTruePoint = scriptExecutor.jumpPoints.getOrDefault(args[2], -1);
|
||||||
int jumpFalsePoint = args.length > 3 ? scriptExecutor.jumpPoints.getOrDefault(args[3], -1) : -1;
|
int jumpFalsePoint = args.length > 3 ? scriptExecutor.jumpPoints.getOrDefault(args[3], -1) : -1;
|
||||||
|
|
||||||
int firstValue;
|
int firstValue = getValueOrParse(scriptExecutor, args[0]);
|
||||||
int secondValue;
|
int secondValue = getValueOrParse(scriptExecutor, args[1]);
|
||||||
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]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (firstValue == secondValue) {
|
if (firstValue == secondValue) {
|
||||||
return jumpTruePoint;
|
return jumpTruePoint;
|
||||||
} else {
|
} else {
|
||||||
@ -265,8 +272,34 @@ public class ScriptListener implements Listener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setValue(ScriptExecutor scriptExecutor, String key, String value) {
|
private static void arithmeticCommand(ScriptExecutor scriptExecutor, String[] args, IntBinaryOperator operation) {
|
||||||
scriptExecutor.variables.put(key, parseValue(value));
|
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) {
|
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);
|
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) {
|
private static int getValue(ScriptExecutor scriptExecutor, String key) {
|
||||||
Region region = Region.getRegion(scriptExecutor.player.getLocation());
|
Region region = Region.getRegion(scriptExecutor.player.getLocation());
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case "trace":
|
case "trace":
|
||||||
return RecordStateMachine.getRecordStatus().isTracing() ? 1 : 0;
|
return RecordStateMachine.getRecordStatus().isTracing() ? 1 : 0;
|
||||||
|
case "auto_trace":
|
||||||
|
return RecordStateMachine.getRecordStatus().isAutoTrace() ? 1 : 0;
|
||||||
case "tnt":
|
case "tnt":
|
||||||
return region == null || region.getTntMode() == CommandTNT.TNTMode.OFF ? 0 : 1;
|
return region.getTntMode() == CommandTNT.TNTMode.OFF ? 0 : 1;
|
||||||
case "freeze":
|
case "freeze":
|
||||||
return region == null || !region.isFreeze() ? 0 : 1;
|
return !region.isFreeze() ? 0 : 1;
|
||||||
case "fire":
|
case "fire":
|
||||||
return region == null || !region.isFire() ? 0 : 1;
|
return !region.isFire() ? 0 : 1;
|
||||||
default:
|
default:
|
||||||
return scriptExecutor.variables.getOrDefault(key, 0);
|
return scriptExecutor.variables.getOrDefault(key, 0);
|
||||||
}
|
}
|
||||||
@ -295,6 +338,7 @@ public class ScriptListener implements Listener {
|
|||||||
private static boolean isVariable(ScriptExecutor scriptExecutor, String key) {
|
private static boolean isVariable(ScriptExecutor scriptExecutor, String key) {
|
||||||
switch (key) {
|
switch (key) {
|
||||||
case "trace":
|
case "trace":
|
||||||
|
case "auto_trace":
|
||||||
case "tnt":
|
case "tnt":
|
||||||
case "freeze":
|
case "freeze":
|
||||||
case "fire":
|
case "fire":
|
||||||
|
In neuem Issue referenzieren
Einen Benutzer sperren