Makra 2.0

Klasický systém maker je sice robustní, ale zároveň nekonzistentní, těžkopádný a obtížný na ovládnutí. Nový systém maker se snaží tyto nedostatky vyřešit a zároveň přinést mnohé nové funkce.

Nový systém maker bude (alespoň prozatím) koexistovat s tím starým a bude možno mezi nimi libovolně přepínat při psaní příkazů. Nicméně doporučuji držet se jen jednoho stylu psaní maker pro jeden příkaz.

Základní příkazy a proměnné fungují stejně jako ve starém systému, takže napřed doporučuji přečíst si článek uvedený výše.

Syntaxe pro proměnné je rozšířena o specifikátor přesnosti, který lze uvést za názvem, např $vel#3 odpovídá rychlosti s přesností na 3 desetinné číslice.

Základní příkazy

Nový příkaz je jen jeden - /run. Tento příkaz spustí příkazový skript (makro), který samotný má nějaký účinek. Nový systém maker je aktivní pouze pro tento příkaz, v ostatních případech je použit starý systém. Je doporučeno starý systém explicitně vypnout pomocí /!run, a pokud mohou mít v příkazu speciální význam zpětná lomítka či mezery, použít též přímý vstup: /!run:.

Spojování příkazů

Klasický způsob spojení příkazů je pomocí příkazu /cmd prikaz1&prikaz2&prikaz3. Nevýhoda je, že to je jednak příkaz navíc pro každé spojení příkazů, který sám o sobě nic nedělá, další příkazová úroveň a znak & je použit zároveň i pro entity. Naprosto přirozeně lze provést spojení příkazů pomocí příkazu /run s víceméně podobnou syntaxí: /!run prikaz1;prikaz2;prikaz3. Mezery před každým příkazem jsou přeskočeny (ale ne za příkazem).

Jednotlivé příkazy či skupiny příkazů mohou být též obaleny závorkami, pokud je potřeba lépe naznačit, kde příkaz začíná a končí. /!run (prikaz1);(prikaz2);(prikaz3) lze proto také použít pro vykonání tří příkazů, případně lze do závorek seskupit i dva či všechny příkazy. Pokud je uvnitř jednotlivých příkazů obsažen jiný pár závorek, znak středníku takový příkaz nerozdělí: /!run (print (A;B)) je jeden příkaz, který vypíše text "(A;B)", zatímco /!run print (A;B) jsou dva příkazy: /print (A a /B) (jenž neexistuje). Závorky uvnitř příkazu musí odpovídat vnějším závorkám, aby byly rozpoznány, tedy /!run (print [A;B]) jsou stále dva příkazy (/print [A a /B]).

Funkce

Klasický systém maker měl tři funkce - $/ (příkazová substituce), $t (textová substituce) a $e (výrazová substituce). První provedla příkaz a nahradila jeho výsledek, druhá nahradila v textu barvy a entity a třetí spočítala hodnotu číselného výrazu. Nový systém má z hlediska syntaxe pouze jednu substituci, a to příkazovou.

Nejlepší bude ilustrovat na příkladu. Postaru /rainbow $/ball$ (vytvoření míčku a změnění textury) se nově napíše /!run rainbow $(ball). Jak je vidět z příkladu, není potřeba žádné lomítko (ale není zakázané) a příkaz se místo do dolarů obalí do závorek. Ty navíc mohou být jakékoliv, tudíž stejně funguje i /!run rainbow $[ball], /!run rainbow ${ball} a /!run rainbow $⟨ball⟩. Server kontroluje úroveň závorek v substituci, takže se nestane, aby pochopil špatně třeba $(print $name ($me)). Do chatu se vypíše správně jméno hráče a do závorek jeho ID. V substituci se kontroluje úroveň pouze toho typu závorek, které ji otevřely, takže $[print ))) ] nepředstavuje chybu, zatímco $[print ]]] ] ano.

Pravidla příkazové substituce jsou stejná jako při obalování příkazů závorkami, až na to, že je lze použít i uvnitř příkazu. Otevírací závorka příkazové substituce stanoví pevný typ otevírací závorky i pro všechny vnitřní příkazy a jiné závorky nebudou mít speciální význam. Příkaz /run print $(dvehicle $(car)) vytvoří vozidlo, hned jej smaže a poté vypíše ID smazaného vozidla, ale pokud by byl zapsán /run print $(dvehicle $[car]), pokusí se vykonat příkaz /dvehicle $[car], ale ten selže, neboť $[car] se už nenahradí. Důvod této změny je ten, aby se příkazy beroucí jiné příkazy daly lépe zapsat, např. /run print $(run return $(e 1+1) $[e 1+1]). Tento příkaz vypíše text "2 2", ale první dvojka se spočítá ve vnějším příkazu /run, zatímco druhá ve vnitřním.

Příkazy

Pomocí příkazové substituce lze vykonat jakýkoliv příkaz, stejně jako ve starém systému. Zároveň jsou přidané speciální příkazy bez externích účinků, které lze použít navíc i v příkazech jako /textfilter. Tyto příkazy je nutno zadávat bez lomítka a je též doporučeno použít dvojtečku za příkazem (aby byl text argumentu použit doslovně).

Název Význam Příklad
t, fmt Nahrazení entit a speciálních znaků. t (FF0000)&percent;
arg Escapování mezer pro nefinální argument příkazu. text 1 $(arg:a b c)
str Escapování uvozovek ve složitějších výrazech. print:$(e:"$(str: " ")")
e, eval Vyhodnocení výrazu. print $(e 1+1)
p, plr Jméno hráče. p 1

Opakované vyhodnocení

Starý systém maker prováděl opakované vyhodnocení hodnoty proměnné či funkce, dokud v ní bylo co dalšího vyhodnocovat. Byl-li například do proměnné $return uložen text "$pos" pomocí příkazu /!return $pos, příkaz /print $return zobrazí pozici hráče a nikoliv text "$pos". Aby se toho docílilo, je potřeba použít nový způsob: /!run !print $return. Oba vykřičníky jsou potřeba, neboť jinak by se makra nahrazovala standardním způsobem pro příkaz /run i pro příkaz /print.

Vložení doslovného textu

Doslovného použití textu lze docílit několika způsoby. Buď lze, jak již bylo uvedeno výše, makra zcela vypnout pomocí znaku vykřičníku, nebo lze v případě proměnné či substituce úvodní dolar zdvojit: $$. Příkaz /!run !print $$name vypíše text "$name".

Alternativní možnost je použití apostrofů. Chcete-li vyznačit součást příkazu, která má být interpretována pouze jako text, lze ji obalit znakem apostrofu. Příkaz /!run !print '$name' vypíše opět pouze text "$name". Zdvojením apostrofu se do textu vloží pouze jeden tento znak a bez speciálního významu.

Úrovně

Příkazové úrovně značí časovou posloupnost dílčích příkazů, které se vykonají v rámci jednoho makra, vzhledem k počátečnímu příkazu. V příkazu /!run !timer 1 mobjectz $(rainbow $(ball)) 2;!timer 2 !dobject $return, nepočítám-li úvodní /!run, se jako první vykoná příkaz /ball, následně /rainbow, které mají vyšší úrovneň, a poté oba příkazy /timer, jež jsou na základní úrovni. Příkaz /mobjectz je na úrovni nižší a /dobject ještě nižší.

Nový systém maker jednak zmenšuje počet úrovní příkazů (není potřeba /cmd, takže to jednu úroveň odstraní) a dále nová syntaxe usnadní tvoření a čtení podobných příkazů, stejně jako rozlišování jednotlivých úrovní. Stejný příkaz by se dal zapsat ve starém systému následovně: /cmd timer 1 mobjectz $/rainbow $$/ball$$$ 2&timer 2 dobject $return. Rozdíl není v tomto případě zase tolik patrný, ale objeví-li se více úrovní a více substitucí, začne to dělat rozdíl.

Příklad:

/!timer 1 !run attachobject 1000 $(!timer 2 !dobject $(ball));!timer 1 dobject $return

Tento příkaz po jedné sekundě vytvoří míček, na něj připojí objekt s modelem 1000, po další sekundě ten objekt smaže a za další sekundu smaže samotný míček.

Pomocné příkazy

/bindx je pomocný příkaz, alternativní k příkazu /bind, který použije nový systém maker namísto starého. Je to zkratka za zápis /bind n !run příkaz. Příkaz /wait lze také použít k čekání uvnitř posloupnosti příkazů, přičemž pozastaví vyhodnocování celého příkazu /run.

Čekání na příkaz

Vykonání některých příkazů není instantní. Příkazy jako /bomb či /npcload mají logicky delší účinky než samotné zpracování příkazu, ale uvnitř /run se na ně nečeká. Čekat na příkaz lze přidáním + před jeho název. /run +bomb 1; bomb 1 díky tomu vytvoří dvě bomby po sobě.

Podmínky

Jednotlivé příkazy mohou být spuštěny podmíněně, pokud odpovídají speciálnímu tvaru. Jedná se o tento tvar:

if(podmínka)(pokud platí)(pokud neplatí)

Lze použít jakýkoliv typ závorek (i různý pro všechny tři páry) a mezi závorkami mohou být mezery. Podmínka je výraz (ve stejném tvaru jako e), jehož hodnotou musí být logická hodnota. Pokud podmínka platí, vykoná se první příkaz, pokud neplatí, vykoná se druhý. Oba příkazy mohou být prázdné, pokud se v dané situaci nemá nic vykonat.

Je potřeba brát v potaz to, že tento speciální příkaz se vyhodnotí až po nahrazení všech proměnných a substitucí, i když se nacházejí v jednom z jeho podpříkazů. Pokud to představuje problém, je potřeba přistupovat k tomuto příkazu jako ke každému jinému: přidat vnitřní run a vyznačit sekce pomocí apostrofů:

if(podmínka)(!run:'pokud platí')(!run:'pokud neplatí')

Vnitřní run lze symbolizovat stejně jako u podobných příkazů, pomocí ifx:

ifx(podmínka)('pokud platí')('pokud neplatí')


Vytvořte si webové stránky zdarma! Webnode