Plugin Skript- funkce

Návody pro 26, 2020

Předchozí lekce- "Skilly"

Jak funkce fungují

Minule jsem ukazoval jednoduché nastavení vlastních skillů/dovedností, podobně, jako jsou třeba ve WoWku nebo v pluginu MCMMO. Dneska si ukážeme, jak se dají takové kódy vylepšit pomocí funkcí, které vám mohou suplovat používání příkazů a umí dost zajímavých věcí (navíc se dají používat ve všech skriptech, ne jen v tom, ve kterém je napíšete).

Prvně si řekneme něco o tom jak funkce vypadají a jak se používají. Každou funkci definujete pomocí function <jméno>(<argument1>: <typ argumentu>, <argument2>: <typ argumentu2> ....) :: <návratná hodnota>:. Použití je pak snadné, stejné jako v C# nebo Javě- <jméno funkce>(<argumenty>).

Pojďme si to teď názorně ukázat. Vytvoříme si funkci giveItem(), která bude mít za úkol hráči dát nějaký předmět. Jasně, taková funkce v Minecraftu už dávno je, ale pro příklad to bude naprosto ideální :)

Pojďme si říct něco o tom, co jsem zrovna napsal. Vytvořil jsem funkci, která se jmenuje giveItem (V programování je zvykem psát první písmeno malým. U například funkcí v C# se ale první písmeno píše vždy velkým.). Tato funkce obsahuje 3 argumenty- {_p}, {_item} a {_amount}. Všimněte si, že každý argument má podobu dočasné proměnné. Skript totiž při použití funkce automaticky vytvoří tuto dočasnou proměnnou, do které dosadí hodnotu argumentu, a po dokončení kódu ji smaže.
{_p} nese hodnotu hráče. Obecně se jedná o hráčské jméno (I když po debatě s lidmi z komunity jsme se shodli, že je lepší použít UUID číslo, kdyby si hráč jméno změnil, ale to nám pro tutorial není zapotřebí. Více k UUID najdete ZDE). Hráče, na kterého se má kód zaměřit, odesíláme v příkazu, co jsme si vytvořili. Můžete to znát z minulé lekce.
{_item} nese hodnotu předmětu, respektive Minecraft ID předmětu (to znamená že na starších verzích Minecraftu byste mohli použít číslo, v novějších je to slovní název). Dejte si pozor na ID, které předmětu dáváte! Skript využívá Minecraft ID, ale v kódech používá své vlastní. Takže dřevěné schody by byly oak stairs namísto oak_stairs. Vidíte ten rozdíl?
{_amount} je hodnota číselná, v našem případě integer, neboli celé číslo. To nám poté určuje počet itemů, které hráč dostane.
give {_amount} of {_item} to {_p} je přesně definovaný kód. Pokud byste vynechali některou ze spojek nebo předložek (of / to), tak by vám vyskakovala chyba. Na rozdíl od give 5 stone to player v tomhle případě Skript neví, co přesně chcete udělat. On vidí jen kupu proměnných vedle sebe, takže použitím of mu pomáháme, aby chápal, že se snažíme dát určitý počet něčeho.

Jak funguje příkaz asi chápete, to nebudu rozebírat. Tím máme vytvořenou jednoduchou funkci, ale zůstává otázka- Jak takovou funkci využít? Obecně zrovna tuhle nijak. Je prostě lepší použít přímo příkaz /give nebo použít obecný kód Skriptu. Ale v případě komplikovanějších funkcí se vyplatí prostě napsat na jeden řádek zavolání té funkce namísto přepisování 10 řádků pořád dokola.

Vzpomínáte si na tuhle část z minulé lekce? Pojďme si ušetřit pár řádků tím, že jednoduše smícháme ty efekty do jedné funkce.

Praktické využití funkcí

Vidíte tu změnu? Namísto vypisování odměny a použití příkazu v každém bonusu, co skill poskytuje, v něm pouze zavoláme funkci, která udělá vše za nás. Dokonce jsem ještě přidal dva řádky, které v případě, že má hráč VIP, přidají 1/5 XP navíc. (Tohle bude fungovat pouze v případě, že máte VIP jako proměnnou. Pokud ho máte jako permissi, použijte if {_p} has permission "vip".)
Nezapomeňte vyměnit každé místo s "player" za "{_p}"! Jinak vám ten kód bude vyhazovat chyby.
Malinká změna navíc, kterou jsem udělal, je použití textu pro rozlišení skillu. Skript je schopný převést {_skill} na text, takže když to bude nést hodnotu "hornik", v proměnné {%{_skill}%_xp.%{_p}%} se to zobrazí jako {hornik_xp.%player%}.

Funkce s návratovou hodnotou

Tohle bude pro dnešek poslední věc. Každá funkce může mít návratovou hodnotu. taková hodnota se píše odděleně na konci definování funkce. Může mít podobu čísla, textu, itemu, pravdy/nepravdy... prakticky čehokoliv, co umí Skript zpracovat. Pojďme si to ukázat:

Opět- takováto funkce vám z praktického hlediska bude nejspíš k ničemu. Je mnohem snazší napsat if player has <item>, ale berme to znovu pouze jako příklad...
Tentokrát jsem funkci přidal návratovou hodnotu boolean, což je "pravda/nepravda". V takovém případě už funkce ztrácí schopnost dělat určité věci. Nyní funguje jako taková "maxi podmínka". Prakticky je to jako kdybyste kontrolovali proměnnou, která ale obsahuje i desítky řádků kódu, což normální variable nemůže. Nemůžete už ale funkci použít pouze pomocí hasItem()! Musí být vždy součástí podmínky. Kdybyste jí dali návratovou hodnotu čísla, musí být součástí kódu, kde číslo použijete (give, přidání hodnoty do proměnné, podmínka...), jinak nebude mít efekt.
Tahle funkce jednoduše uloží všechny itemy v inventáři hráče do seznamu a pak seznam projede, jestli tam není požadovaný předmět. Pokud ano, vrátí nám "pravdu".

Můžete ale pomocí ní kontrolovat i inventáře jiných hráčů:

Změnil jsem pouze vzhled příkazu, nic víc. Namísto hráče, který příkaz napsal, teď kontrolujeme hráče, kterého zvolíte.

Já myslím, že to je asi vše, co se dá k funkcím říct. Můžete si je samozřejmě nakombinovat a upravit podle sebe, stačí zapojit představivost :) Já osobně třeba funkce využívám k tomu, abych zjistil, jestli v souboru s achievementy hráčů je obsažen určitý achievement. Kdybych to měl pokaždé znovu přepisovat, zabíralo by to stovky řádků kódu... Zkuste funkce ze začátku použít jen na to, abyste si zkrátili kódy, které vám zabírají hodně místa :) Pomůže vám to v rychlosti zpracování dat, takže použití příkazu nebo reload skriptu vám nezabere tolik času ;)

Příště bych mohl říct něco k cyklům, protože to je další velmi praktická věc.

Tagy

Darkry

Jsem junior v oblasti programování. Věnuju se C# a pluginu Skript pro Minecraft. Baví mě tvorba her a aplikací, stavění a vedení serverů, psaní příběhů a dělání videí na YouTube :)

Bomba! Úspěsně jste se přihlásil do odběru novinek.
Výborně! Dokončete postup pro plný přístup.
Vítejte zpět! Byl/a jste úspěšně přihlášen/a!
Úspěch! Nyní máte přístup k veškerému obsahu.