Lua
Kromě klasického i vylepšeného systému maker existuje ještě třetí způsob, jak v módu skriptovat, a to pomocí skriptů v jazyce Lua 5.3. V tomto návodu budou popsány jen věci týkající se interakce mezi prostředím Luy a serverem, ne však obecné těci týkající se jazyka Lua jako takového.
Prostředí
Každý hráč má k dispozici instanci Luy, v níž lze spustit skript příkazem /lua [skript]. Stejně jako u příkazu /run je doporučeno používat režim přímého vstupu a vypnout substituci maker, tedy přes /!lua:[skript]. V opačném případě může hrozit, že nějaká část kódu bude vyhodnocena neočekávaným způsobem.
Lua je do serveru zakomponovaná přes YALP, tedy jsou v globálním prostředí dostupné některé další funkce ve srovnání se základní Luou. Mimo to jsou dostupné tabulky jen table, string a math a některé globální funkce byly odstraněny, např. load nebo setmetatable. Instance má omezené množstsví paměti i času, který může využívat. Funkce print vypisuje přímo do chatu stejně jako příkaz /print.
Globální prostředí je po každém připojení hráče vytvořeno nanovo; jeho stav není ukládán a není ani sdílen. Globální proměnné je možno libovolně vytvářet i měnit.
Vyhodnocení skriptu
Po zadání je skript načten a spuštěn. Pokud při nějaké z těchto fází dojde k chybě, je chyba vypsána do chatu. Lua má oddělené parsování a vyhodnocování, takže dojde-li při parsování k chybě (a kód tedy není validní), nebude vykonána ani nějaká jeho úvodní část, pokud je validní sama o sobě.
Pokud je chyba způsobena neukončeným kódem, a tedy ji lze opravit dopsáním pokračování, je původní kód zapamatován a použit při dalším vyvolání příkazu, podobně jako fungují příkazy na pokračování. V tomto případě ovšem není délka skriptu nijak omezena (kromě paměti samotného stroje) a každé použití příkazu představuje samostatný řádek kódu. Díky tomu lze psát kód mezi příkazy /lua do a /lua end a až do ukončení kódu nedojde k jeho spuštění.
Spuštěnému skriptu nejsou předány žádné argumenty. Po skončení skriptu jsou všechny jeho návratové hodnoty (vrácené přes return) spojeny a vráceny jako text samotným příkazem /lua stejným způsobem jako argumenty při volání příkazů (viz níže).
Zadávání skriptu podporuje též dvě zkratky pro lepší interakci s makry nebo pro ladění. Zápis /!lua:?výraz vyhodnotí výraz a jeho výsledek vypíše, jako by byl vykonán příkaz /!lua:print(výraz). Obdobně /!lua:=výraz je zkratka za /!lua:return výraz. Zápis /!lua:!výraz očekává výraz složený z několika hodnot (oddělených čárkou), přičemž první hodnotu, pokud se jedná o funkci, zavolá s parametry z dalších hodnot.
Volání příkazů
K serverovým příkazům lze přistupovat jako k funkcím přes tabulku cmd, tedy např. cmd.ball(). Jelikož jsou normálně příkazy brány jako text a jejich návratová hodnota je taky text, narozdíl od oddělených argumentů i návratových hodnot v Lue, musí dojít k formátování a parsování okolo příkazu.
Při formátování argumentů jsou aplikována tato pravidla:
- Hodnota typu nil je převedena na prázdný řetězec.
- Hodnota typu boolean je převedena na 1 nebo 0 (je-li true resp. false).
- Ostatní hodnoty jiného typu než string jsou napřed převedeny funkcí tostring.
- Pokud je argument jediný, příkaz je zavolán jako /!příkaz:text (toto pravidlo se ignoruje při vracení hodnot ze skriptu).
- Jinak jsou všechny argumenty (včetně posledních hodnot nil) escapovány (před mezeru a \ se přidá \), spojeny mezerou a příkaz se zavolá jako /!příkaz argumenty.
Opačný proces (ale ne zcela inverzní) je použit při parsování návratové hodnoty příkazu:
- Text je rozdělen podle jediné mezery jako oddělovače. Několik mezer po sobě je bráno jako několik oddělovačů.
- Každý kus textu je parsován jednotlivě.
- Pokud je řetězec prázdný, převede se na hodnotu nil.
- Pokud lze řetězec chápat jako číslo, převede se na něj.
- Jinak je řetězec brán tak, jak je.
- Posloupnost převedených hodnot je vrácena z funkce.
Při rozdělování textu není bráno escapování v potaz.
Proměnné
Příkazové proměnné jsou dostupné přes objekt var, podobně jako příkazy. Například proměnná $pos se dá získat zápisem var.pos(). Hodnota proměnné je parsována stejně jako návratová hodnota z příkazů, tedy var.pos() vrátí 3 čísla. Argumentem funkce může být přesnost, tedy zápis var.pos(3) odpovídá $vel#3 v makrech.