Script Turing Completeness #152
Keine Reviewer
Label
Kein Label
Bug
Codeverbesserung
Einsteiger Freundlich
Idee
In Arbeit
Neues Feature
Prio A
Security Breach
Überprüfung notwendig
Verbesserung
Zu Beobachten
Kein Meilenstein
Niemand zuständig
3 Beteiligte
Fällig am
Kein Fälligkeitsdatum gesetzt.
Abhängigkeiten
Keine Abhängigkeiten gesetzt.
Referenz: SteamWar/BauSystem#152
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren
Keine Beschreibung angegeben.
Branch "ScriptBranches" löschen
Das Löschen eines Branches ist permanent. Obwohl der Branch für eine kurze Zeit weiter existieren könnte, kann diese Aktion in den meisten Fällen NICHT rückgängig gemacht werden. Fortfahren?
Closes: #134
Script Touring Completenesszu Script Turing CompletenessKomplett fehlend: Eine Ingame-Erklärung für den Nutzer, was das Skriptsystem so alles kann.
@ -83,0 +85,4 @@
private final Map<String, Integer> jumpPoints = new HashMap<>();
private final VariableHolder variableHolder = new VariableHolder();
private boolean lastCommandWasSleep = false;
Mach das System nicht komplexer als nötig.
@ -83,1 +87,4 @@
private boolean lastCommandWasSleep = false;
private int index = 0;
private int executionPoints = 0;
Wenn jemand mehr als 200 Befehle in ein Skriptbuch packt, dann werden eben mehr als 200 Befehle ausgeführt. Du kannst damit nicht Serverabstürze verhindern.
Ich will damit auch verhindern, dass du unendlich schleifen machst. Aber ich habe es nun rausgenommen.
@ -108,2 +132,4 @@
if (command.toLowerCase().startsWith("exit")) {
return;
}
if (command.toLowerCase().startsWith("jump")) {
Wenn du hier mit so vielen Extracommands anfängst: Mach ein switch case draus.
@ -144,0 +205,4 @@
return scriptExecutor.jumpPoints.getOrDefault(args[0], -1);
}
private static void infoCommand(ScriptExecutor scriptExecutor, String[] args) {
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.
@ -144,0 +214,4 @@
scriptExecutor.player.sendMessage("§eInfo§8» §7" + ChatColor.translateAlternateColorCodes('&', String.join(" ", args)));
}
private static void variableCommand(ScriptExecutor scriptExecutor, String[] args) {
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.
Du kannst mit variablen schleifenabbrüche und sonstige Sachen machen. Ich glaube das das doch sinnvoll wäre.
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.
Jedoch ist es einfacher, wenn man diese als Schleife darstellen kann. Außerdem welche Output/Input Systeme kann man noch einbauen?
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.
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?
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
Achso. Ich glaube das lässt sich einrichten.
@ -144,0 +267,4 @@
}
}
private static class VariableHolder {
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().
Lixfel wie würdest du den eine solche Ingame Dokumentation aufziehen. Ich hätte hier an ein Buch gedacht, wo jedes Feature drin steht und beschrieben wird. Was hälst du davon?
Das Buch sehe ich hier nirgends.
Dies war eine Frage und keine Aussage, das dies schon fertig sei? Kann man auf eine solche Frage denn auch eine Antwort bekommen?
Einfach implementieren?
Soll es eigentlich noch eine möglichkeit geben, wenn man versehentlich unendliche schleifen gebaut hat, dass ein Script auch abbrechbar ist?
Und wie stellst du dir das vor? (technische Sicht)
Ich haue irgendwo ein Boolschen wert hin, und der ist true solange das script laufen soll. und wenn abgebrochen werden soll wird dieser False gesetzt und damit ich speichern kann welche Scripte laufen. Haue ich die in eine
HashMap<Player, Set<ScriptExecutor>>
rein. Dann kann man einfach über alle ScriptExecutor gehen und diese Canceln. Ich glaube das wäre das eleganteste.Während das Skript läuft (solange kein Sleep kommt) macht der Server nichts anderes. Äußere Eingaben werden nicht abgefragt.
Gut aber dann kann ich mit 2 zeilen jeden server immer hunder prozentig zum abschmieren bringen. Ich will einfach nur verhindern, dass dies so einfach ist.
Dafür war auch die execution points sache
JEDER, der sich auf einem Bauserver befindet, kann /stop ausführen. Das ist ein Einzeiler.
mit meinem würde der server jedoch laggen und laggen und laggen und dann vllt auch nicht clean runterfahren. Bei deinem /stop ist das wenigstens clean!
Ne, er würde nicht laggen, er würde einfach nicht mehr reagieren. Anschließend fährt er nach 60s dann runter.
Das ist halt das werte Problem der Turingvollständigkeit, auch Halteproblem genannt.
Die Documenation ist nun fertig und mit dem '/script' Befehl verfügbar.
@ -0,0 +60,4 @@
}
Player player = (Player) sender;
ItemStack itemStack = new ItemStack(Material.WRITTEN_BOOK, 1);
Kann man den Itemstack nicht in einer private static final Variable haben?
@ -52,6 +54,10 @@ public class ScriptListener implements Listener {
if(item == null || isNoBook(item) || item.getItemMeta() == null)
return;
if (item.getItemMeta().getDisplayName().equals("§8Script Buch")) {
Kann man dann
CommandScript.BOOK.getItemstack().getName()
machen?