SteamWar/BauSystem
Archiviert
13
0

Script Turing Completeness #152

Manuell gemergt
YoyoNow hat 14 Commits von ScriptBranches nach master 2021-01-09 20:40:17 +01:00 zusammengeführt
Nur Änderungen aus Commit 5022da13a8 werden angezeigt - Alle Commits anzeigen

Datei anzeigen

@ -22,9 +22,7 @@ package de.steamwar.bausystem.world;
import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.commands.CommandFire;
import de.steamwar.bausystem.commands.CommandFreeze;
import de.steamwar.bausystem.commands.CommandNV;
import de.steamwar.bausystem.commands.CommandTNT;
import de.steamwar.bausystem.tracer.TraceManager;
import de.steamwar.bausystem.tracer.recorder.RecordManager;
import de.steamwar.core.Core;
import org.bukkit.Bukkit;
@ -85,6 +83,7 @@ public class ScriptListener implements Listener {
private final Player player;
private final List<String> commands = new ArrayList<>();
private final Map<String, Integer> jumpPoints = new HashMap<>();
private final VariableHolder variableHolder = new VariableHolder();
private boolean lastCommandWasSleep = false;
Veraltet
Review

Mach das System nicht komplexer als nötig.

Mach das System nicht komplexer als nötig.
private int index = 0;
@ -120,13 +119,13 @@ public class ScriptListener implements Listener {
player.sendMessage(BauSystem.PREFIX + "§cBitte füge ein sleep in dein Script ein.");
return;
}
if (executionPoints < 0) {
executionPoints = 0;
}
if (command.toLowerCase().startsWith("sleep")) {
if (!lastCommandWasSleep) {
executionPoints -= 2;
}
lastCommandWasSleep = true;
ScriptListener.sleepCommand(this, generateArgumentArray("sleep", command));
lastCommandWasSleep = true;
return;
}
lastCommandWasSleep = false;
@ -134,10 +133,12 @@ public class ScriptListener implements Listener {
return;
}
if (command.toLowerCase().startsWith("jump")) {
Veraltet
Review

Wenn du hier mit so vielen Extracommands anfängst: Mach ein switch case draus.

Wenn du hier mit so vielen Extracommands anfängst: Mach ein switch case draus.
executionPoints += 2;
int jumpIndex = ScriptListener.jumpCommand(this, generateArgumentArray("jump", command));
if (jumpIndex != -1) {
executionPoints += 2;
index = jumpIndex;
} else {
player.sendMessage(BauSystem.PREFIX + "§cUnbekannter Jump Punkt: " + command);
}
continue;
}
@ -146,6 +147,19 @@ public class ScriptListener implements Listener {
ScriptListener.infoCommand(this, generateArgumentArray("info", command));
continue;
}
if (command.toLowerCase().startsWith("var")) {
executionPoints -= 1;
ScriptListener.variableCommand(this, generateArgumentArray("var", command));
continue;
}
if (command.toLowerCase().startsWith("if")) {
int jumpIndex = ScriptListener.ifCommand(this, generateArgumentArray("if", command));
if (jumpIndex != -1) {
executionPoints += 2;
index = jumpIndex;
}
continue;
}
PlayerCommandPreprocessEvent preprocessEvent = new PlayerCommandPreprocessEvent(player, "/" + command);
Bukkit.getServer().getPluginManager().callEvent(preprocessEvent);
@ -177,38 +191,95 @@ public class ScriptListener implements Listener {
scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cDie Zeit darf nur aus Zahlen bestehen.");
}
}
if (!scriptExecutor.lastCommandWasSleep) {
scriptExecutor.executionPoints -= sleepTime - 1;
}
Bukkit.getScheduler().runTaskLater(BauSystem.getPlugin(), scriptExecutor::resume, sleepTime);
}
private static int jumpCommand(ScriptExecutor scriptExecutor, String[] args) {
if (args.length < 1) {
scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cEin Jump Punkt muss angegeben sein.");
return -1;
}
return scriptExecutor.jumpPoints.getOrDefault(args[0], -1);
}
private static void infoCommand(ScriptExecutor scriptExecutor, String[] args) {
Veraltet
Review

Den Info-Befehl finde ich etwas unnötig, sicherlich wird er interessant zum Debuggen sein, aber wir wollen die Leute nicht dazu ermuntern, horrend aufwändige Skripte zu schreiben, und wenn, dann soll es eine Herausforderung sein. Der Info-Command bläst das System nur ohne nennenswerten Mehrwert auf.

Den Info-Befehl finde ich etwas unnötig, sicherlich wird er interessant zum Debuggen sein, aber wir wollen die Leute nicht dazu ermuntern, horrend aufwändige Skripte zu schreiben, und wenn, dann soll es eine Herausforderung sein. Der Info-Command bläst das System nur ohne nennenswerten Mehrwert auf.
Veraltet
Review

Mit diesem Command soll man, besonders, wenn man einem anderen sein eigenes Skript gibt, So dass er weiß wie man diesen verwendet? Bzw auch um user Rückgaben zu machen.

Mit diesem Command soll man, besonders, wenn man einem anderen sein eigenes Skript gibt, So dass er weiß wie man diesen verwendet? Bzw auch um user Rückgaben zu machen.
for (int i = 0; i < args.length; i++) {
if (args[i].startsWith("$") && scriptExecutor.variableHolder.isVariable(args[i].substring(1))) {
args[i] = scriptExecutor.variableHolder.getValue(args[i].substring(1)) + "";
}
}
scriptExecutor.player.sendMessage("§eInfo§8» §7" + ChatColor.translateAlternateColorCodes('&', String.join(" ", args)));
}
private class VariableHolder {
private static void variableCommand(ScriptExecutor scriptExecutor, String[] args) {
Veraltet
Review

Bislang sind keine freien Variablen außer den 4 Konstanten fire, tnt, trace & freeze nötig. Das Programm hat so wenige Input- und Outputmöglichkeiten (Man kann Variablen schließlich nur in ifs verwenden), dass man es daher immer auf die Konstanten zurückgreifen kann und einfach keine freien Variablen benötigt. Entweder das System wird mächtiger, oder Variablen sind sinnlos.

Bislang sind keine freien Variablen außer den 4 Konstanten fire, tnt, trace & freeze nötig. Das Programm hat so wenige Input- und Outputmöglichkeiten (Man kann Variablen schließlich nur in ifs verwenden), dass man es daher immer auf die Konstanten zurückgreifen kann und einfach keine freien Variablen benötigt. Entweder das System wird mächtiger, oder Variablen sind sinnlos.
Veraltet
Review

Du kannst mit variablen schleifenabbrüche und sonstige Sachen machen. Ich glaube das das doch sinnvoll wäre.

Du kannst mit variablen schleifenabbrüche und sonstige Sachen machen. Ich glaube das das doch sinnvoll wäre.
Veraltet
Review

Du hast aber nix, wofür Schleifen sinnvoll wären. Variablen kannst du letztendlich nur für ifs verwenden. Und eine "Schleife" kannst du ohne variablen Input auch einfach entrollen, da die Länge schon während des Schreibens des Skriptes bekannt ist, d.h besteht dafür keine Notwendigkeit.

Du hast aber nix, wofür Schleifen sinnvoll wären. Variablen kannst du letztendlich nur für ifs verwenden. Und eine "Schleife" kannst du ohne variablen Input auch einfach entrollen, da die Länge schon während des Schreibens des Skriptes bekannt ist, d.h besteht dafür keine Notwendigkeit.
Veraltet
Review

Jedoch ist es einfacher, wenn man diese als Schleife darstellen kann. Außerdem welche Output/Input Systeme kann man noch einbauen?

Jedoch ist es einfacher, wenn man diese als Schleife darstellen kann. Außerdem welche Output/Input Systeme kann man noch einbauen?
Veraltet
Review

Nein, das ist nicht mal einfacher. Die Variablen fügen dem Skriptsystem derzeit nix hinzu.

Anders würde es aussehen, wenn man die Befehle auch für andere Befehle als für info verwenden könnte...., dann würde ich allerdings info umbenennen in echo und in einen normalen Befehl umwandeln.

Nein, das ist nicht mal einfacher. Die Variablen fügen dem Skriptsystem derzeit nix hinzu. Anders würde es aussehen, wenn man die Befehle auch für andere Befehle als für info verwenden könnte...., dann würde ich allerdings info umbenennen in echo und in einen normalen Befehl umwandeln.
Veraltet
Review

Welche Befehle soll man für andere Befehle verwenden? Meinst du variablen soll man für andere Befehle verwenden können sollen. Und das umwandeln könnte ich. Ich weiß halt nicht wie man das mit den Variablen dann sinnvoll machen sollte. Weil es dann ja scheinbar globale und nicht globale variablen geben sollte?

Welche Befehle soll man für andere Befehle verwenden? Meinst du variablen soll man für andere Befehle verwenden können sollen. Und das umwandeln könnte ich. Ich weiß halt nicht wie man das mit den Variablen dann sinnvoll machen sollte. Weil es dann ja scheinbar globale und nicht globale variablen geben sollte?
Veraltet
Review

Nein, ich habe nix von globalen und nicht globalen Variablen geschrieben. Ich habe etwas von der Einsetzbarkeit von Variablen geschrieben. Ich möchte die Variablen innerhalb eines Skripts für nahezu jeden Befehl verwenden können, z.B. für ein //pos1 X,Y,Z

Nein, ich habe nix von globalen und nicht globalen Variablen geschrieben. Ich habe etwas von der Einsetzbarkeit von Variablen geschrieben. Ich möchte die Variablen innerhalb eines Skripts für nahezu jeden Befehl verwenden können, z.B. für ein //pos1 X,Y,Z
Veraltet
Review

Achso. Ich glaube das lässt sich einrichten.

Achso. Ich glaube das lässt sich einrichten.
if (args.length < 1) {
scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cVariablen Namen und Zahlen/Boolsche Wert fehlt.");
return;
}
if (args.length < 2) {
scriptExecutor.player.sendMessage(BauSystem.PREFIX + "§cZahlen/Boolsche Wert fehlt.");
return;
}
switch (args[1]) {
case "inc":
case "increment":
case "++":
scriptExecutor.variableHolder.add(args[0], 1);
return;
case "dec":
case "decrement":
case "--":
scriptExecutor.variableHolder.add(args[0], -1);
return;
}
scriptExecutor.variableHolder.setValue(args[0], 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.");
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 (scriptExecutor.variableHolder.isVariable(args[0])) {
firstValue = scriptExecutor.variableHolder.getValue(args[0]);
} else {
firstValue = scriptExecutor.variableHolder.parseValue(args[0]);
}
if (scriptExecutor.variableHolder.isVariable(args[1])) {
secondValue = scriptExecutor.variableHolder.getValue(args[1]);
} else {
secondValue = scriptExecutor.variableHolder.parseValue(args[1]);
}
if (firstValue == secondValue) {
return jumpTruePoint;
} else {
return jumpFalsePoint;
}
}
private static class VariableHolder {
Veraltet
Review

Das System ist viel zu aufwändig für das wenige, dass es kann. Einfach eine Map<String, Integer> statt einem "VariableHolder". Es gibt nur Integer, keine Boolean. Alles außer 0 wird true bewertet. Die Konstanten "trace", "tnt", "freeze" und "fire" kannst du als solche extra behandeln wie hier in getValue().

Das System ist viel zu aufwändig für das wenige, dass es kann. Einfach eine Map<String, Integer> statt einem "VariableHolder". Es gibt nur Integer, keine Boolean. Alles außer 0 wird true bewertet. Die Konstanten "trace", "tnt", "freeze" und "fire" kannst du als solche extra behandeln wie hier in getValue().
private Map<String, Integer> variables = new HashMap<>();
public void setValue(String key, String value) {
int internalValue = 0;
if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("yes")) {
internalValue = 1;
} else if (value.equalsIgnoreCase("false") || value.equalsIgnoreCase("no")) {
internalValue = 0;
} else {
try {
internalValue = Integer.parseInt(value);
} catch (NumberFormatException e) {
internalValue = 0;
variables.put(key, parseValue(value));
}
public void add(String key, int value) {
if (!isVariable(key)) {
variables.put(key, 0);
}
variables.put(key, internalValue);
variables.put(key, variables.get(key) + value);
}
public int getValue(String key) {
@ -225,6 +296,31 @@ public class ScriptListener implements Listener {
return variables.getOrDefault(key, 0);
}
public boolean isVariable(String key) {
switch (key) {
case "trace":
case "tnt":
case "freeze":
case "fire":
return true;
default:
return variables.containsKey(key);
}
}
public int parseValue(String value) {
if (value.equalsIgnoreCase("true") || value.equalsIgnoreCase("yes")) {
return 1;
} else if (value.equalsIgnoreCase("false") || value.equalsIgnoreCase("no")) {
return 0;
}
try {
return Integer.parseInt(value);
} catch (NumberFormatException e) {
return 0;
}
}
}
}