Script System Lua #178
Keine Reviewer
Label
Kein Label
1.15
1.19
1.20
Script-API
Bug
Codeverbesserung
Einsteiger Freundlich
Idee
In Arbeit
Neues Feature
Prio A
Security Breach
Überprüfung notwendig
Verbesserung
Zu Beobachten
Kein Meilenstein
Kein Projekt
Niemand zuständig
3 Beteiligte
Fällig am
Kein Fälligkeitsdatum gesetzt.
Blockiert
#176 YeetAPION
SteamWar/BauSystem2.0
Referenz: SteamWar/BauSystem2.0#178
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren
Keine Beschreibung angegeben.
Branch "lua" 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?
To do:
WIP: Script System Luazu Script System LuaPerfekt wäre, wenn die Dokumentation ingame passend übersetzt als Buch vorliegen würde. Das sehe ich jetzt in der ersten Iteration aber erstmal als optional an.
Hast du mal eine Sicherheitsüberprüfung gemacht, welche Methoden und Module so alles verfügbar sind, indem man sich einfach mal alle Module etc. ausgeben hat lassen? (So in etwa wie rekursive
__dict__
-Aufrufe in Python).Man hätte echt nochmal über die Dokumentation einfach mal drüberlesen können, dann hätte ich hier deutlich weniger anmerken müssen.
@ -65,2 +65,4 @@
compileOnly swdep('FastAsyncWorldEdit-1.18')
implementation 'org.luaj:luaj-jse:3.0.1'
Aktuelle Fassung von LuaJ scheint 3.0.2 zu sein. Warum 3.0.1?
@ -361,1 +233,3 @@
SCRIPT_COMMAND_ITEM_NAME = §7Command§8: §e{0}
SCRIPT_HOTKEY_ITEM_NAME = §7Hotkey§8: §e{0}
SCRIPT_EVENT_ITEM_NAME = §7Event§8: §e{0}
SCRIPT_COMMAND_ITEM_NAME = §7Command§8: §e/{0}
Befehl
@ -365,2 +239,3 @@
SCRIPT_MENU_GUI_ITEM_LORE_2 = §7Shift Klicke zum kopieren
SCRIPT_MENU_GUI_NAME = §eScript Commands {0}{1}§7%
SCRIPT_MENU_GUI_ITEM_LORE_3 = §7Rechts Klicke zum editieren
SCRIPT_MENU_GUI_ITEM_LORE_4 = §7Mittel Klicke zum anschauen
Uaah! Deutsch! Rechtsklick, Mittelklick, Shiftklick. Nach "zum" werden Verben großgeschrieben: Editieren, Anschauen, Kopieren, Rausnehmen. Rausnehmen => Entnehmen. Evtl. statt zum ein :. Also so in etwa: §7Linksklick§8: §8Entnahme ...
@ -366,1 +240,3 @@
SCRIPT_MENU_GUI_NAME = §eScript Commands {0}{1}§7%
SCRIPT_MENU_GUI_ITEM_LORE_3 = §7Rechts Klicke zum editieren
SCRIPT_MENU_GUI_ITEM_LORE_4 = §7Mittel Klicke zum anschauen
SCRIPT_MENU_GUI_NAME = §eScript-Menü
Ist noch die Überlegung, ob Skript oder Script.
@ -368,3 +244,3 @@
SCRIPT_MENU_GUI_ITEM_ADD_LORE = §7Klicke mit einem Buch zum hinzufügen
SCRIPT_MENU_GUI_DUPLICATE_COMMAND = §cCommand '{0}' bereits definiert
SCRIPT_MENU_GUI_DUPLICATE_SCRIPT = §cCommand '{0}' bereits definiert
Skript?
@ -0,0 +55,4 @@
{
Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> {
LAST_FS.entrySet().removeIf(entry -> System.currentTimeMillis() - entry.getValue() > 200);
Nur ein Aufruf von System.currentTimeMillis() pro Tick. Zeit abzufragen kann (relativ) teuer sein.
FunFact: Das hab ich aus dem Live-Code kopiert
kann man aber noch fixen
@ -0,0 +85,4 @@
table.set("y", event.getBlock().getY());
table.set("z", event.getBlock().getZ());
table.set("type", event.getBlock().getType().name());
event.setCancelled(ScriptRunner.callEvent(event.getPlayer(), SteamWarGlobalLuaPlugin.EventType.PlaceBlock, table));
Könnte unerwünschte Nebeneffekte haben, da bei dem Event ja nicht IgnoredCancelled ist und es in zufälliger Reihenfolge mit den meisten anderen Listenern aufgerufen wird, welche ja auch das (Bukkit)-Event canceln könnten.
@ -0,0 +118,4 @@
env.set("rawlen", NIL);
env.set("rawset", NIL);
env.set("setmetatable", NIL);
env.set("xpcall", NIL);
Das hier so zu entfernen scheint mir etwas unsicher. Wäre es nicht möglich, das Environment andersherum aufzubauen, d.h. komplett leer anzufangen und dann das nötige/sichere hinzuzufügen?
Habe die Packages schon selectiv hinzugefügt, das sind nur ein Paar Überbleibsel aus dem BasePackage.
@ -0,0 +39,4 @@
public static Globals createClickGlobals(Player player) {
Globals globals = new Globals();
globals.load(new JseBaseLib());
globals.load(new PackageLib());
JseBase und Package sind nicht in der Dokumentation enthalten. (Weiß jetzt nicht, was diese Libs genau machen)
JseBase: Sind die "Standard" Lua-Funktionen wie in den Lua-Doc beschrieben.
PackageLib: Sind meines Ermessens nach ein Table an den geladenen Libraries
@ -0,0 +94,4 @@
} else if (luaValue instanceof LuaString) {
consumer.accept(luaValue.toString());
} else {
throw new LuaError("Invalid lua type: " + luaValue.typename());
Diese LuaErrors treten aber nicht auf, wenn der Spieler einen Fehler gemacht hat, oder? Werden diese LuaErrors irgendwo eingefangen und dem Nutzer angezeigt (Fehler im Skript?)? Oder landen die bei uns in der Datenbank?
Die Skript Runtime wird komplett ge-catch und wird dem Spieler dann in der Zeile als fehler angestrichen.
@ -0,0 +51,4 @@
table.set("sprinting", getter(player::isSprinting));
table.set("slot", getterAndSetter(player.getInventory()::getHeldItemSlot, player.getInventory()::setHeldItemSlot));
table.set("item", getter(player.getInventory().getItemInMainHand().getType()::name));
table.set("offHandItem", getter(player.getInventory().getItemInOffHand().getType()::name));
Ich weiß nicht, ob das so richtig ist, aber durch diesen Befehlsaufruf wird immer das Material (auch die anderen getter betroffen) ausgegeben, der zum Zeitpunkt der Tableerstellung zurückgegeben.
Sollte so richtig sein, geht aber halt nicht überall mit ner method reference. Muss man mal im decompilat anschauen vllt.
@ -0,0 +47,4 @@
public LuaTable get(Player player) {
LuaTable table = LuaValue.tableOf();
table.set("name", getter(() -> Region.getRegion(player.getLocation()).getName()));
Hier ist es dagegen anders gemacht (als in der PlayerLib). Am besten auf eine (korrekte) Variante entscheiden.
@ -0,0 +32,4 @@
public class WorldEditLib implements LuaLib {
@Override
public String name() {
return "_worldedit";
Trotz dass diese Lib noch im Prototypenstadium ist, wäre es schön für die Spieler, wenn sie auch kurz in der Dokumentation beschrieben wird. Schließlich haben die Spieler keinen anderen Anhaltspunkt und keine IDE, wo sie die Funktionalität nachschlagen können.
@ -0,0 +1,100 @@
/*
Das hat hier nichts verloren. Bitte auch einmal die Änderungen, welche ich am CommonCore-Script-Branch vorgenommen habe, reviewen und diesen Branch hier ggf. darauf anpassen.
@ -0,0 +41,4 @@
- [`math`](https://www.lua.org/manual/5.4/manual.html#6.7)
- [`string`](https://www.lua.org/manual/5.4/manual.html#6.4)
- [`table`](https://www.lua.org/manual/5.4/manual.html#6.6)
- `bit32`
Warum hier kein Link?
@ -0,0 +55,4 @@
- `_worldedit`
### global
Die `global`-Api stellt Funktionen zur Verfügung, QOL sind.
Grammatik.
@ -0,0 +56,4 @@
### global
Die `global`-Api stellt Funktionen zur Verfügung, QOL sind.
Es gibt folgende Funktionen:
Diese beiden Headerzeilen finde ich irgendwie nicht so ganz pralle von der Formulierung her (auch bei den folgenden Instanzen). Funktionen würde ich einfach ähnlich wie eine Überschrift handhaben, und die Beschreibungszeile würde ich kürzer Formulieren a'la: global stellt QOL Funktionen zur Verfügung.
@ -0,0 +62,4 @@
|-----------|----------------------------------|----------------------------------------------------------------------------------------------------|
| `print` | print(String...) | @see message(String...) |
| `input` | input(String, Function\<String>) | Fragt den User nach einer Eingabe mit der Nachricht und called die zugehörige Funktion nach dieser |
| `timeout` | timeout(Number, Function\<Void>) | Wartet die angegebene Anzahl an Ticks und führt danach die zugehörige Funktion aus |
wäre sleep() nicht ein angemessenerer typischer Name?
weil bei einem sleep erwarte ich persönlich nicht, dass man noch eine funktion reinreichen muss
Die Implementierung von Sleep ist mit LuaJ in unserem Falle nicht möglich.
Da ein Sleep eine Pausierung der Ausführung von dem Main-Thread veranlassen würde.
@ -0,0 +63,4 @@
| `print` | print(String...) | @see message(String...) |
| `input` | input(String, Function\<String>) | Fragt den User nach einer Eingabe mit der Nachricht und called die zugehörige Funktion nach dieser |
| `timeout` | timeout(Number, Function\<Void>) | 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, sind unter den Namen `x`, `y` und `z` abgespeichert |
Die Beschreibung ist grammatikalischer nonsens.
@ -0,0 +73,4 @@
| Name | Signature | Beschreibung |
|---------------|--------------------------------|-------------------------------------------------------------|
| `name` | name(): String | Gibt den `displayName` des Spielers zurück |
| `message` | message(String...) | Sendet den Text in den Chat des Spielers |
chat() statt message()? Macht es etwas klarer, was die Methode macht.
als alias?
Als alias auf keinen Fall. Wir brauchen in einer brandneuen API keine Varianten anzubieten...
@ -0,0 +79,4 @@
| `y` | y(Number), y(): Number | Setzt oder gibt die Y-Koordinate des Spielers |
| `z` | z(Number), z(): Number | Setzt oder gibt die Z-Koordinate des Spielers |
| `yaw` | yaw(Number), yaw(): Number | Setzt oder gibt den Yaw des Spielers |
| `pitch` | pitch(Number), pitch(): Number | Setzt oder gibt den Pitch des Spielers |
Yaw und Pitch in der Beschreibung einmal übersetzen.
@ -0,0 +80,4 @@
| `z` | z(Number), z(): Number | Setzt oder gibt die Z-Koordinate des Spielers |
| `yaw` | yaw(Number), yaw(): Number | Setzt oder gibt den Yaw des Spielers |
| `pitch` | pitch(Number), pitch(): Number | Setzt oder gibt den Pitch des Spielers |
| `sneaking` | sneaking(): Boolean | Wahr, wenn der Spieler am Sneaken ist |
Kann man auch übersetzen.
tut aber so gut wie niemand, oder würdest du es geduckt nennen?
schleichen
@ -0,0 +82,4 @@
| `pitch` | pitch(Number), pitch(): Number | Setzt oder gibt den Pitch des Spielers |
| `sneaking` | sneaking(): Boolean | Wahr, wenn der Spieler am Sneaken ist |
| `sprinting` | sprinting(): Boolean | Wahr, wenn der Spieler am Sprinten ist |
| `slot` | slot(Number), slot(): Number | Setzt oder gibt den Slot des gehaltenden Items des Spielers |
Hier am besten einmal die Slotnummerntabelle aus dem Minecraft-Wiki verlinken.
@ -0,0 +84,4 @@
| `sprinting` | sprinting(): Boolean | Wahr, wenn der Spieler am Sprinten ist |
| `slot` | slot(Number), slot(): Number | Setzt oder gibt den Slot des gehaltenden Items des Spielers |
| `item` | item(): String | Gibt den Item Type der Main-Hand zurück |
| `offHandItem` | offHandItem(): String | Gibt den Item Type der Off-Hand zurück |
Itemtyp
@ -0,0 +94,4 @@
| Name | Signature | Beschreibung |
|-----------|--------------------|------------------------------------------------------------------------------------------------------------|
| `name` | name(): String | Gibt den Namen der Region zurück |
| `type` | type(): String | Gibt den Namen des Typen der Region zurück |
den Namen des Typen der Region. Regionsnamen. Regionstyp.
@ -0,0 +97,4 @@
| `type` | type(): String | Gibt den Namen des Typen der Region zurück |
| `fire` | fire(): Boolean | Gibt den Fire-Mode der Region zurück |
| `freeze` | freeze(): Boolean | Gibt den Freeze-Mode der Region zurück |
| `protect` | protect(): Boolean | Gibt den Protect-Mode der Region zurück |
Modus.
@ -0,0 +98,4 @@
| `fire` | fire(): Boolean | Gibt den Fire-Mode der Region zurück |
| `freeze` | freeze(): Boolean | Gibt den Freeze-Mode der Region zurück |
| `protect` | protect(): Boolean | Gibt den Protect-Mode der Region zurück |
| `loader` | pvp(): String | Gibt den Status des Loaders des Spielers zurück, die werte sind: `OFF`, `SETUP`, `RUNNING`, `PAUSE`, `END` |
Werte. Und warum zum Henker heißt die Methode pvp?!?
@ -0,0 +101,4 @@
| `loader` | pvp(): String | Gibt den Status des Loaders des Spielers zurück, die werte sind: `OFF`, `SETUP`, `RUNNING`, `PAUSE`, `END` |
Es gibt folgende Variablen:
Warum gibt es hier extra Variablen und nicht wie sonst überall stattdessen getter und setter?
Gute frage, aber hatte glaube mal einen grund, xd
@ -0,0 +114,4 @@
| Name | Signature | Beschreibung |
|-----------|--------------------|-------------------------------------------------------------------------------------|
| `mode` | mode(): String | Gibt den Aktuellen TNT-Modus zurück, die werte sind: `ALLOW`, `DENY` oder `ONLY_TB` |
aktuellen. Werte.
@ -0,0 +116,4 @@
|-----------|--------------------|-------------------------------------------------------------------------------------|
| `mode` | mode(): String | Gibt den Aktuellen TNT-Modus zurück, die werte sind: `ALLOW`, `DENY` oder `ONLY_TB` |
| `enabled` | enabled(): Boolean | Gibt zurück, ob der TNT-Modus in der Region des Spielers aktiviert ist oder nicht |
| `onlyTb` | onlyTb(): Boolean | Gibt zurück, ob der TNT-Modus auf Only-Tb ist |
Warum gibt es diese beiden separaten Methoden noch, wenn diese Informationen alle auch in der mode()-Methode enthalten sind?
das sind shortcuts
wie viel kürzer ist es denn im Lua-Code mit den Shortcuts?
@ -0,0 +126,4 @@
| Name | Signature | Beschreibung |
|----------|-------------------|--------------------------------------------------------------------------------|
| `active` | active(): Boolean | Gibt zurück, ob der Tracer in der Region des Spielers aktiviert ist oder nicht |
| `auto` | auto(): Boolean | Gibt zurück, ob der Tracer in der Region ein Auto-Tracer ist. |
Du hast sonst immer keinen Punkt am Satzende.
@ -0,0 +136,4 @@
| Name | Signature | Beschreibung |
|--------------|-------------------------|----------------------------------------------------|
| `time` | time(): String | Gibt die aktuelle Zeit im format `HH:mm:ss` zurück |
Format
@ -0,0 +137,4 @@
| Name | Signature | Beschreibung |
|--------------|-------------------------|----------------------------------------------------|
| `time` | time(): String | Gibt die aktuelle Zeit im format `HH:mm:ss` zurück |
| `ticks` | ticks(): Number | Gibt die Ticks seit start des Server zurück |
Serverstart
@ -0,0 +139,4 @@
| `time` | time(): String | Gibt die aktuelle Zeit im format `HH:mm:ss` zurück |
| `ticks` | ticks(): Number | Gibt die Ticks seit start des Server zurück |
| `getBlockAt` | getBlockAt(Pos): String | Gibt das Material an der Position zurück |
| `setBlockAt` | setBlockAt(Pos, String) | Setzt das Material an der angegebenen Stelle |
Es sollte evtl. auch einmal aufgeführt sein, wie Itemtypen und Materialien formatiert sein müssen bzw. welche Werte dort erwartet werden (können). Ist das "1", "stone" oder "STONE"?
@ -0,0 +145,4 @@
| Name | Beschreibung |
|-------|--------------|
| `tps` | [tps](#tps) |
Warum hier wieder Variablen? Und warum gibt es diese API im Server, wo es noch die TPS-Api gibt?
@ -0,0 +148,4 @@
| `tps` | [tps](#tps) |
#### tps
Die `tps`-Api stellt Funktionen zur Verfügung, die die TPS des Servers betreffen.
Betrifft auch vorige und spätere Vorkommnisse: Nicht Api, sondern API. Und wäre es in dem Kontext nicht eigentlich eher ein "Modul" oder "Package"? (K.a. was der typische Begriff im Lua-Umfeld dafür ist, aber ich bezweifle, dass dieser Api lautet).
@ -0,0 +153,4 @@
| Name | Signature | Beschreibung |
|--------------|----------------------|-------------------------------------------------------------------|
| `current` | current(): Number | Gibt die aktuelle TPS zurück |
Es gibt kein "aktuell". Welchem Wert entsprechen diese TPS?
@ -0,0 +159,4 @@
| `oneMinute` | oneMinute(): Number | Gibt die durchschnittliche TPS über die letzte Minute zurück |
| `fiveMinute` | fiveMinute(): Number | Gibt die durchschnittliche TPS über die letzte 5 Minuten zurück |
| `tenMinute` | tenMinute(): Number | Gibt die durchschnittliche TPS über die letzte 10 Minuten zurück |
| `limit` | limit(): Number | Gibt den TPS-Limit zurück |
ich glaube eher das Limit statt der Limit?
@ -0,0 +161,4 @@
| `tenMinute` | tenMinute(): Number | Gibt die durchschnittliche TPS über die letzte 10 Minuten zurück |
| `limit` | limit(): Number | Gibt den TPS-Limit zurück |
# SteamWar.de-Global-Api
Was unterscheidet diese Global-API von der obengenannten global-API? Absolut verwirrend, muss mindestens unbenannt werden.
@ -0,0 +169,4 @@
| Name | Signature | Beschreibung |
|-----------|-----------------------------------|-----------------------------------------------------------------------------|
| `event` | event(EventType, Function(Any)) | Registriere einen Event Handler |
Eher Listener statt Handler? (Bukkitkontext, es sei denn, Handler ist ein Lua-Typischer Begriff)
@ -0,0 +170,4 @@
| Name | Signature | Beschreibung |
|-----------|-----------------------------------|-----------------------------------------------------------------------------|
| `event` | event(EventType, Function(Any)) | Registriere einen Event Handler |
| `command` | command(String, Function(Args)) | Registriere einen Command |
Befehl
@ -0,0 +182,4 @@
## Hotkeys
Hotkeys werden im folgenden Format angegeben: `MODIFIER+KEY`. Es gibt folgende Modifier:
- `ctrl`
Jetzt großgeschrieben oder kleingeschrieben? Unklar.
@ -0,0 +189,4 @@
Es können auch mehrere Modifier angegeben werden, z.B. `ctrl+shift+alt+c`. Die Reihenfolge der Modifier und des Keys ist egal.
## Event Type
Eventtypen
@ -0,0 +190,4 @@
Es können auch mehrere Modifier angegeben werden, z.B. `ctrl+shift+alt+c`. Die Reihenfolge der Modifier und des Keys ist egal.
## Event Type
Einige Events sind auch cancelbar, dazu muss die Funktion `setCanceled()` aufgerufen werden.
Abbrechbar. Diesen Satz am besten unter die Tabelle.
@ -0,0 +191,4 @@
## Event Type
Einige Events sind auch cancelbar, dazu muss die Funktion `setCanceled()` aufgerufen werden.
Es gibt folgende Event-Typen:
Dopplung mit Überschrift.
@ -0,0 +195,4 @@
| Name | Wenn | Parameter | Cancelbar |
|---------------------|-----------------------------------------------------|---------------------------------|-----------|
| `FF` | Beim Doppelten Drücken der Swap-Hands taste | NIL | false |
Lieber DoubleSwap statt FF nennen.
Würde ich nicht machen, weil wir es so schon eingeführt hatten vorher.
Das macht es dennoch nicht klarer verständlich für neue, und wenn man das sowieso einmal komplett neu macht, sollte man es richtig machen.
@ -0,0 +198,4 @@
| `FF` | Beim Doppelten Drücken der Swap-Hands taste | NIL | false |
| `PlaceBlock` | Beim Platzieren von Blöcken | [BlockEvent](#blockevent) | true |
| `BreakBlock` | Beim Zerstören von Blöcken | [BlockEvent](#blockevent) | true |
| `RightClick` | Beim Rechts klicken | [InteractEvent](#interactevent) | true |
Rechtsklick
@ -0,0 +199,4 @@
| `PlaceBlock` | Beim Platzieren von Blöcken | [BlockEvent](#blockevent) | true |
| `BreakBlock` | Beim Zerstören von Blöcken | [BlockEvent](#blockevent) | true |
| `RightClick` | Beim Rechts klicken | [InteractEvent](#interactevent) | true |
| `LeftClick` | Beim Links Klicken | [InteractEvent](#interactevent) | true |
Linksklick
@ -0,0 +205,4 @@
| `TNTExplodeInBuild` | Wenn ein TNT in der aktuellen Bau Region explodiert | [Position](#position) | true |
| `SelfJoin` | Wenn man selbst den Server betritt | NIL | false |
| `SelfLeave` | Wenn man den Server verlässt | NIL | false |
| `DropItem` | Wenn man ein item Droppt | (type: Material) | true |
Item droppt
@ -0,0 +206,4 @@
| `SelfJoin` | Wenn man selbst den Server betritt | NIL | false |
| `SelfLeave` | Wenn man den Server verlässt | NIL | false |
| `DropItem` | Wenn man ein item Droppt | (type: Material) | true |
| `EntityDeath` | Wenn ein Entity Stirbt | (type: Entity Type) | false |
stirbt
@ -0,0 +263,4 @@
Hello, World!
```
## BauGUI on FF
DoubleSwap
@ -0,0 +264,4 @@
```
## BauGUI on FF
Das default Script für das Öffnen des BauGUIs
Standardskript
@ -0,0 +288,4 @@
```
## Paste Hotkey
Ein Hotkey zum pasten des Clipboard-Inhalts.
Pasten