From 5dc47c495e55e06d134732ea967c2a1388f926ec Mon Sep 17 00:00:00 2001 From: yoyosource Date: Tue, 20 Apr 2021 14:20:24 +0200 Subject: [PATCH] Add ScriptCommand Add ScriptListener --- .../features/script/ScriptListener_15.java | 14 ++++ .../bausystem/features/script/.gitkeep | 0 .../features/script/ScriptCommand.java | 76 +++++++++++++++++++ .../features/script/ScriptExecutor.java | 12 +++ .../features/script/ScriptListener.java | 51 +++++++++++++ .../script/variables/ConstantContext.java | 30 ++++++++ .../script/variables/GlobalContext.java | 4 + .../script/variables/LocalContext.java | 4 + .../script/variables/VariableReplacement.java | 9 +++ 9 files changed, 200 insertions(+) create mode 100644 BauSystem_15/src/de/steamwar/bausystem/features/script/ScriptListener_15.java delete mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/script/.gitkeep create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptCommand.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptExecutor.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptListener.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/ConstantContext.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/GlobalContext.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/LocalContext.java create mode 100644 BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/VariableReplacement.java diff --git a/BauSystem_15/src/de/steamwar/bausystem/features/script/ScriptListener_15.java b/BauSystem_15/src/de/steamwar/bausystem/features/script/ScriptListener_15.java new file mode 100644 index 00000000..ab952039 --- /dev/null +++ b/BauSystem_15/src/de/steamwar/bausystem/features/script/ScriptListener_15.java @@ -0,0 +1,14 @@ +package de.steamwar.bausystem.features.script; + +import lombok.experimental.UtilityClass; +import org.bukkit.Material; +import org.bukkit.inventory.ItemStack; + +@UtilityClass +public class ScriptListener_15 { + + static boolean isNoBook(ItemStack item) { + return item.getType() != Material.WRITABLE_BOOK && item.getType() != Material.WRITTEN_BOOK; + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/script/.gitkeep b/BauSystem_Main/src/de/steamwar/bausystem/features/script/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptCommand.java new file mode 100644 index 00000000..9d5ed54e --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptCommand.java @@ -0,0 +1,76 @@ +package de.steamwar.bausystem.features.script; + +import de.steamwar.bausystem.SWUtils; +import de.steamwar.bausystem.linkage.LinkageType; +import de.steamwar.bausystem.linkage.Linked; +import de.steamwar.command.SWCommand; +import org.bukkit.Material; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BookMeta; + +import java.util.ArrayList; +import java.util.List; + +@Linked(LinkageType.COMMAND) +public class ScriptCommand extends SWCommand { + + public ScriptCommand() { + super("script"); + } + + public static final ItemStack BOOK = new ItemStack(Material.WRITTEN_BOOK, 1); + + 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- \"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"); + 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"); + 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 ++"); + 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("§8Man kann auch explizit eine globale, locale, oder konstante variable referenzieren, indem 'global.', 'local.' oder 'const.' vor den Namen in die Klammern zu schreiben."); + pages.add("§8Um Variablen über das Script ausführen zu speichern gibt es 'global' und 'unglobal' als Befehle. Der erste speichert eine locale Variable global und das zweite löscht eine globale wieder."); + pages.add("§8Des weiteren kann man Lokale Variablen mit 'unvar' löschen. Nach dem verlassen einer Welt werden alle Globalen Variablen gelöscht. Globale Variablen kann man mit '/scriptvars' einsehen."); + 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("§8Des weiteren gibt es 3 weitere Variablen, welche explizit Spieler gebunden sind\n\nDiese sind:\n- x\n- y\n- z"); + 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("§8Des weiteren kann man überprüfen, ob eine Variable existiert mit 'if exists' wonach dann wieder 1 oder 2 Jump-Points sein müssen."); + 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 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"); + 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); + bookMeta.setAuthor("§eSteam§8war"); + bookMeta.setTitle("§7Script Buch"); + bookMeta.setDisplayName("§7Script Buch"); + bookMeta.setPages(pages); + BOOK.setItemMeta(bookMeta); + } + + @Register(help = true) + public void genericHelp(Player p, String... args) { + p.sendMessage("§8/§escript §8- §7Gibt das Script Buch"); + } + + @Register + public void giveCommand(Player p) { + SWUtils.giveItemToPlayer(p, BOOK); + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptExecutor.java b/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptExecutor.java new file mode 100644 index 00000000..eecfcbbf --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptExecutor.java @@ -0,0 +1,12 @@ +package de.steamwar.bausystem.features.script; + +import org.bukkit.entity.Player; +import org.bukkit.inventory.meta.BookMeta; + +public final class ScriptExecutor { + + public ScriptExecutor(BookMeta bookMeta, Player player) { + + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptListener.java b/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptListener.java new file mode 100644 index 00000000..10b085cd --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptListener.java @@ -0,0 +1,51 @@ +package de.steamwar.bausystem.features.script; + +import de.steamwar.bausystem.linkage.LinkageType; +import de.steamwar.bausystem.linkage.Linked; +import de.steamwar.core.VersionedCallable; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.block.Action; +import org.bukkit.event.player.PlayerInteractEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.BookMeta; + +import java.util.HashSet; +import java.util.Set; + +@Linked(LinkageType.LISTENER) +public class ScriptListener implements Listener { + + private Set playerSet = new HashSet<>(); + + @EventHandler(priority = EventPriority.HIGH) + public void onLeftClick(PlayerInteractEvent event) { + ItemStack item = event.getItem(); + if (item == null || isNoBook(item) || item.getItemMeta() == null) + return; + + if (ScriptCommand.BOOK.getItemMeta() != null && item.getItemMeta().hasDisplayName() && item.getItemMeta().getDisplayName().equals(ScriptCommand.BOOK.getItemMeta().getDisplayName())) { + return; + } + + if (event.getAction() != Action.LEFT_CLICK_AIR && event.getAction() != Action.LEFT_CLICK_BLOCK) { + if (event.getAction() == Action.RIGHT_CLICK_AIR) { + playerSet.add(event.getPlayer()); + } + return; + } + if (playerSet.remove(event.getPlayer())) { + return; + } + + event.setCancelled(true); + new ScriptExecutor((BookMeta) item.getItemMeta(), event.getPlayer()); + } + + private boolean isNoBook(ItemStack item) { + return VersionedCallable.call(new VersionedCallable<>(() -> ScriptListener_15.isNoBook(item), 15)); + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/ConstantContext.java b/BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/ConstantContext.java new file mode 100644 index 00000000..bbf9d39e --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/ConstantContext.java @@ -0,0 +1,30 @@ +package de.steamwar.bausystem.features.script.variables; + +import de.steamwar.bausystem.features.tracer.record.RecordStateMachine; +import de.steamwar.bausystem.region.Region; +import de.steamwar.bausystem.region.flags.Flag; +import de.steamwar.bausystem.region.flags.flagvalues.FireMode; +import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode; +import de.steamwar.bausystem.region.flags.flagvalues.TNTMode; +import org.bukkit.entity.Player; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +public class ConstantContext { + + private static final Map> CONSTANTS = new HashMap<>(); + + static { + CONSTANTS.put("trace", player -> RecordStateMachine.getRecordStatus().isTracing() ? 1 : 0); + CONSTANTS.put("autotrace", player -> RecordStateMachine.getRecordStatus().isAutoTrace() ? 1 : 0); + CONSTANTS.put("tnt", player -> Region.getRegion(player.getLocation()).getPlain(Flag.TNT, TNTMode.class) != TNTMode.DENY ? 1 : 0); + CONSTANTS.put("freeze", player -> Region.getRegion(player.getLocation()).getPlain(Flag.FREEZE, FreezeMode.class) == FreezeMode.ACTIVE ? 1 : 0); + CONSTANTS.put("fire", player -> Region.getRegion(player.getLocation()).getPlain(Flag.FIRE, FireMode.class) == FireMode.ALLOW ? 1 : 0); + CONSTANTS.put("x", player -> player.getLocation().getBlockX()); + CONSTANTS.put("y", player -> player.getLocation().getBlockY()); + CONSTANTS.put("z", player -> player.getLocation().getBlockZ()); + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/GlobalContext.java b/BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/GlobalContext.java new file mode 100644 index 00000000..4ad4e85e --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/GlobalContext.java @@ -0,0 +1,4 @@ +package de.steamwar.bausystem.features.script.variables; + +public class GlobalContext { +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/LocalContext.java b/BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/LocalContext.java new file mode 100644 index 00000000..832ed849 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/LocalContext.java @@ -0,0 +1,4 @@ +package de.steamwar.bausystem.features.script.variables; + +public class LocalContext { +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/VariableReplacement.java b/BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/VariableReplacement.java new file mode 100644 index 00000000..96f606a7 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/script/variables/VariableReplacement.java @@ -0,0 +1,9 @@ +package de.steamwar.bausystem.features.script.variables; + +public class VariableReplacement { + + public static String variableReplace(String command) { + return command; + } + +}