Makra

Makra představují způsob, jak propojit více příkazů do sekvencí. Jejich základem je několik speciálních příkazů, proměnné a funkce.

Základní příkazy

/cmd umožní spojit více příkazů dohromady a postupně je vykonat. Podporuje spojení až 5 příkazů. /cmd ball explosion (nebo /cmd /ball /explosion) napřed vykoná příkaz /ball a vzápětí /explosion. Obsahuje-li vykonaný příkaz mezery, je nutné oddělit všechny příkazy znakem &, např. /cmd object 1000 & die. Okolo příkazů mohou být i mezery.

/msg napíše zprávu do chatu stejně, jako by nebyl příkaz vůbec použit. Výhodou je nahrazení proměnných a funkcí (viz níže), které se pro běžné zprávy nenahrazují. /msg ahoj zobrazí v chatu zprávu ahoj.

/bind nastaví příkaz, který se vykoná, zmáčkne-li hráč určitou klávesu (/keys). Na každé klávese může být nastaven jeden příkaz. Příkaz se odstraní příkazem /dbind. Např. /bind 2 move nastaví na klávesu skrčení příkaz /move.

/timer vykoná určitý příkaz po nastavitelné době. /timer 5 explosion 0 po pěti sekundách vytvoří explozi.

Proměnné

Proměnné jsou speciální slova, která se v příkazu nahradí za určitou hodnotu. Lze je zobrazit příkazem /variables. Příkaz /msg $name vypíše do chatu zprávu obsahující jméno hráče, který jej zadal. Proměnná $return je nastavitelná ruznými příkazy, které mají výstup, např. /object a její hodnotu přímo lze nastavit příkazem /return. Příkaz /cmd object 1000 & print $$return vytvoří objekt a poté vypíše řádek obsahující ID vytvořeného objektu. Proč $$? Inu, kdyby tam bylo pouze $return, nahrazení by se provedlo dřív než vykonání samotného příkazu, protože kód zpracovávající příkazy napřed nahradí proměnné a potom zpracuje příkaz. Proto když nalezne dvakrát za sebou znak dolaru (po němž následuje proměnná nebo funkce), jeden odstraní a nechá ten druhý, takže z celého příkazu se potom stane /object 1000 a /print $return, takže nahrazení proběhne až po vykonání prvního příkazu.

Funkce

Krom proměnných se v příkazech nahrazují ještě tzv. funkce, které se chovají podobně jako proměnné, pouze potřebují nějaký vstup. Jediná funkce dostupná v tomto systému maker je příkazová funkce $/ (v minulosti bývalo funkcí více, ale byly přesunuty do nového systému maker a příkazu /run).

$/ je zkrácené použití kombinace příkazu /cmd a proměnné $return. Výše uvedený příkaz /cmd object 1000 & print $$return se dá zapsat zkráceně jako /print $/object 1000$. Napřed se provede příkaz /object 1000, server se pak podívá do proměnné $return a jejím obsahem nahradí zápis funkce. Použije-li se příkaz, který nemá výstup, proměnná $return se nezmění. Příkaz /timer 1 dobject $/mobject $$/ball$$$ (související části jsou zvýrazněny) napřed vykoná příkaz /ball, z nějž získá např. číslo 2, poté provede příkaz /mobject 2, a protože tento příkaz nic nevrací, opět nahradí číslem 2 a vykoná příkaz /timer 1 dobject 2, který objekt po sekundě smaže. Tento příkaz je zároveň ukázkou rozdílu mezi $ a $$, protože pokud by se použil podobný příkaz /timer 1 dobject $$/mobject $$$/ball$$$, vykonal by se příkaz /ball až po 1 sekundě a vzápětí by se objekt smazal.

Rozbor pořadí zpracovávání proměnných a funkcí na příkladech

/timer 1 timer 1 print $$$pos

Server nalezne proměnnou $pos, ale protože je před ní $, odstraní jej a proměnnou nenahradí. Následuje volání /timer 1 print $$pos, kde se opět nachází $pos po $, tudíž se nahradí až v /print $pos a vypíše se pozice hráče.

/timer 1 dobject $/mobject $$/ball$$$

Server najde $/ a prochází text, přeskakuje $$ (protože ignoruje dva znaky $ po sobě), až narazí na $$$, což pochopí jako $$ následované $. Všechny nalezené $$ v textu /mobject $$/ball$$ nahradí za $ a vykoná příkaz $/ball$, z nějž získá číslo, které se nakonec dostane do příkazu /dobject.

/timer 1 dobject $$/mobject $$$/ball$$$

V tomto případě server nalezne dvakrát $/, ale obojí je předcházeno $, tudíž příkaz nevykoná a $ odstraní, přičemž poslední $$$ nechá, neboť po nich nic nenásleduje. Po sekundě vykoná příkaz /dobject $/mobject $$/ball$$$, ve kterém rozpozná $/mobject $$/ball$$$ a podobně jako v předchozím příkladu z něj udělá /mobject $/ball$, pak už jen vykoná /ball a /mobject a /dobject s ID vytvořeného objektu.