diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptRunner.java b/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptRunner.java index 18dcbb45..44b3b50b 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptRunner.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptRunner.java @@ -29,10 +29,7 @@ import lombok.experimental.UtilityClass; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; -import org.luaj.vm2.Globals; -import org.luaj.vm2.LuaError; -import org.luaj.vm2.LuaFunction; -import org.luaj.vm2.LuaValue; +import org.luaj.vm2.*; import org.luaj.vm2.lib.OneArgFunction; import java.util.*; @@ -136,12 +133,65 @@ public class ScriptRunner { } } - public static boolean callCommand(Player player, String command, LuaValue args) { + public static boolean callCommand(Player player, String command, String[] argsArray) { CommandRegister commandRegister = COMMAND_MAP.getOrDefault(player, Collections.emptyMap()).get(command); if (commandRegister == null) { return false; } + LuaValue[] values = new LuaValue[argsArray.length - 1]; + for (int i = 1; i < argsArray.length; i++) { + values[i - 1] = LuaValue.valueOf(argsArray[i]); + } + + LuaTable args = LuaValue.listOf(values); + args.set("alias", command); + + args.set("hasShortFlag", new OneArgFunction() { + @Override + public LuaValue call(LuaValue arg) { + String s = arg.checkjstring(); + if (!s.matches("-?[a-zA-Z]")) { + throw new LuaError("Short Flag must be one character"); + } + String flag = s.charAt(s.length() - 1) + ""; + boolean hasFlag = false; + for (String arg1 : argsArray) { + if (arg1.startsWith("-") && arg1.contains(flag)) { + hasFlag = true; + break; + } + } + return valueOf(hasFlag); + } + }); + + args.set("removeShortFlag", new OneArgFunction() { + @Override + public LuaValue call(LuaValue arg) { + String s = arg.checkjstring(); + if (!s.matches("-?[a-zA-Z]")) { + throw new LuaError("Short Flag must be one character"); + } + String flag = s.charAt(s.length() - 1) + ""; + boolean hasFlag = false; + for (int i = 0; i < argsArray.length; i++) { + String arg1 = argsArray[i]; + if (arg1.startsWith("-") && arg1.contains(flag)) { + String newArg = arg1.replace(flag, ""); + if (newArg.equals("-")) { + args.remove(i); + } else { + args.set(i, newArg); + } + hasFlag = true; + break; + } + } + return valueOf(hasFlag); + } + }); + try { commandRegister.getFunction().call(args); } catch (Exception e) { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/script/event/CommandListener.java b/BauSystem_Main/src/de/steamwar/bausystem/features/script/event/CommandListener.java index ae9fb7d2..77bd991e 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/script/event/CommandListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/script/event/CommandListener.java @@ -46,13 +46,8 @@ public class CommandListener implements Listener { return; } - LuaValue[] values = new LuaValue[split.length - 1]; - for (int i = 1; i < split.length; i++) { - values[i - 1] = LuaValue.valueOf(split[i]); - } - calledCommands.getOrDefault(event.getPlayer(), new HashSet<>()).add(split[0]); - event.setCancelled(ScriptRunner.callCommand(event.getPlayer(), split[0].substring(1), LuaValue.listOf(values))); + event.setCancelled(ScriptRunner.callCommand(event.getPlayer(), split[0].substring(1), split)); calledCommands.getOrDefault(event.getPlayer(), new HashSet<>()).remove(split[0]); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/SteamWarLuaPlugin.java b/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/SteamWarLuaPlugin.java index 99041520..d8670c86 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/SteamWarLuaPlugin.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/SteamWarLuaPlugin.java @@ -141,6 +141,20 @@ public class SteamWarLuaPlugin extends TwoArgFunction { return arg.len(); } }); + env.set("join", new TwoArgFunction() { + @Override + public LuaValue call(LuaValue arg1, LuaValue arg2) { + String separator = arg1.checkjstring(); + LuaTable table = arg2.checktable(); + + StringBuilder builder = new StringBuilder(); + for (int i = 1; i <= table.length(); i++) { + if (builder.length() != 0) builder.append(separator); + builder.append(table.get(i).tojstring()); + } + return valueOf(builder.toString()); + } + }); env.set("collectgarbage", NIL); env.set("dofile", NIL); diff --git a/SCRIPT.md b/SCRIPT.md index 2ba80cde..03c7cba2 100644 --- a/SCRIPT.md +++ b/SCRIPT.md @@ -7,6 +7,7 @@ * [Basis-Apis](#basis-apis) * [SteamWar.de-Api](#steamwarde-api) * [player](#player) + * [random](#random) * [region](#region) * [tnt](#tnt) * [trace](#trace) @@ -14,6 +15,7 @@ * [tps](#tps) * [storage](#storage) * [SteamWar.de-Global-Api](#steamwarde-global-api) + * [Commands](#commands) * [Hotkeys](#hotkeys) * [Eventtypen](#eventtypen) * [BlockEvent](#blockevent) @@ -60,14 +62,15 @@ In den Scripten gibt es dazu noch folgende globale Variablen: Ohne eine Kategorie sind folgende Funktionen verfügbar, die nicht allgemein sind: -| Name | Signature | Beschreibung | -|-----------|----------------------------------|-------------------------------------------------------------------------------------------------------------------| -| `print` | print(String...) | @see chat(String...) | -| `input` | input(String, Function\) | Fragt den User nach einer Eingabe mit der Nachricht und called die zugehörige Funktion nach dieser | -| `delayed` | delayed(Number, Function\) | Wartet die angegebene Anzahl an Ticks und führt danach die zugehörige Funktion aus | -| `pos` | pos(Number, Number, Number) | Erstellt aus drei Zahlen eine Position-Table. Die Koordinaten sind unter den Namen `x`, `y` und `z` abgespeichert | -| `exec` | exec(String...) | Führt den angegebenen Befehl als Spieler aus | -| `length` | length(Any) | Gibt die Länge des Objekts zurück | +| Name | Signature | Beschreibung | +|-----------|-----------------------------------|-------------------------------------------------------------------------------------------------------------------| +| `print` | print(String...) | @see chat(String...) | +| `input` | input(String, Function\) | Fragt den User nach einer Eingabe mit der Nachricht und called die zugehörige Funktion nach dieser | +| `delayed` | delayed(Number, Function\) | Wartet die angegebene Anzahl an Ticks und führt danach die zugehörige Funktion aus | +| `pos` | pos(Number, Number, Number) | Erstellt aus drei Zahlen eine Position-Table. Die Koordinaten sind unter den Namen `x`, `y` und `z` abgespeichert | +| `exec` | exec(String...) | Führt den angegebenen Befehl als Spieler aus | +| `length` | length(Any): Int | Gibt die Länge des Objekts zurück | +| `join` | length(String, String...): String | Füge die Texte mit den ersten Parameter zusammen | ### player Das `player`-Modul stellt Funktionen zur Verfügung, die den Spieler betreffen. @@ -212,6 +215,10 @@ Es gibt folgende Variablen: |----------|----------------------------------| | `events` | Siehe: [Event Type](#eventtypen) | +## Commands +Der Command Handler kriegt eine Liste aller angegeben argumenten. Die Argumente sind vom Typ `String`. Mit dem Wert gespeichert unter `args.alias` oder `args["alias"]` erhältst du, welcher command eingegeben wurde. Wenn ein handler für mehrere Befehle registriert wurde kannst du es hiermit erkennen. +Du kannst `args.hasShortFlag(String)` um herauszufinden ob eine Flag angegeben wurde wie zum Beispiel `-f`. Mit `args.removeShortFlag(String)` kannst du die Flag entfernen und erhältst ob sie angegeben wurde. + ## Hotkeys Hotkeys werden im folgenden Format angegeben: `MODIFIER+KEY`. Bei den Hotkey erstellung ist die Großschreibung egal. Es gibt folgende Modifier: