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í

X

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.