Script Turing Completeness #152
@ -20,6 +20,12 @@
|
||||
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;
|
||||
import org.bukkit.ChatColor;
|
||||
@ -182,7 +188,43 @@ public class ScriptListener implements Listener {
|
||||
}
|
||||
|
||||
private static void infoCommand(ScriptExecutor scriptExecutor, String[] args) {
|
||||
scriptExecutor.player.sendMessage(BauSystem.PREFIX + ChatColor.translateAlternateColorCodes('&', String.join(" ", args)));
|
||||
scriptExecutor.player.sendMessage("§eInfo§8» §7" + ChatColor.translateAlternateColorCodes('&', String.join(" ", args)));
|
||||
}
|
||||
|
||||
private class VariableHolder {
|
||||
|
||||
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, internalValue);
|
||||
}
|
||||
|
||||
public int getValue(String key) {
|
||||
switch (key) {
|
||||
case "trace":
|
||||
return RecordManager.getStatus().isTracing() ? 1 : 0;
|
||||
Lixfel
hat
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.
YoyoNow
hat
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.
Lixfel
hat
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.
YoyoNow
hat
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?
Lixfel
hat
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.
YoyoNow
hat
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?
Lixfel
hat
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
YoyoNow
hat
Achso. Ich glaube das lässt sich einrichten. Achso. Ich glaube das lässt sich einrichten.
|
||||
case "tnt":
|
||||
return CommandTNT.getInstance().isOn() ? 1 : 0;
|
||||
case "freeze":
|
||||
return CommandFreeze.getInstance().isOn() ? 1 : 0;
|
||||
case "fire":
|
||||
return CommandFire.getInstance().isOn() ? 1 : 0;
|
||||
}
|
||||
return variables.getOrDefault(key, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
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.
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.