Plugin Skript- vlastní skilly

Návody pro 02, 2020

Předchozí lekce- "Příkazy a speciální předměty"

Už jsme si ukázali detekci kliknutí s předmětem určitého typu, se speciálním jménem, popisem a dokonce jsme si i ukázali editování proměnných. Měli byste umět i detekovat zničení bloku a pokud jste i hledali sami, určitě jste našli nějaké další užitečné eventy a výrazy. Co takhle se podívat na využití všech těchto věcí, spojit je a vytvořit něco, jako MCMMO (pokud vám tenhle plugin nic neříká, tak je to prakticky grindovací prvek pro servery, který umožňuje vylepšování dovedností, jako máte třeba ve WoWku). Připravte se ale, že teď bude potřeba trochu používat i hlavu a využít i matematiku.

V novém skriptu si na začátku deklarujeme dvě proměnné. Jedna bude sloužit pro ukládání úrovní, druhá pro ukládání zkušeností. Pro test řekněme, že chceme vytvořit hornickou dovednost. Tak si je rovnou pojmenujme {hornik_lvl.%player%} a {hornik_xp.%player%}. (Anebo {%player%::hornik_lvl} a {%player%::hornik_xp}, pokud používáte ten druhý způsob.)

Myslím, že k tomu nemusím nic říkat. Každý by touhle dobou měl vědět, co tohle dělá. Pojďme tedy hned na další krok. Deklarujeme si skupinu Options (Snad si ji pamatujete z první lekce. Je to ta, co většinou nenese dosazené hodnoty, jako obvyklá proměnná. Tohle je ale zrovna jedna z těch výjimek). Options nám bude sloužit pro rozčlenění zkušeností k dosažení další úrovně. Doporučuji si vybrat nějaký prvek, který bude udávat rozdíl mezi úrovněmi. Já mám třeba v oblibě dát první číslo 500 a pak každé další zvyšovat o 50 + 25 za každou úroveň. (550 pro úroveň 3, 625 pro úroveň 4, 725 pro úroveň 5 a tak dále)

Vypsal jsem prvních 10 úrovní k získání. V options musíte vždy každý prvek oddělit čárkou a poslední prvek oddělit pomocí "and". V některých verzích stačilo každý oddělit čárkou, jindy mi je to ignorovalo, tak radši používám ten "and" na konci. Tuhle speciální proměnnou teď můžeme zavolat pomocí {@xp} a můžeme s ní dělat plno věcí. Dá se použít jako seznam nebo můžeme určovat pořadí prvků, jako v tabulce.

Ale k čemu nám to bude, když hráč nebude vědět, jak na tom se svými skilly je, že? Pojďme si vytvořit příkaz, který mu vypíše stav jeho dovedností.

Vytvoření příkazu pro ovládání:

Pojďme si to malinko rozebrat, protože to může být trošičku matoucí. Nastavení příkazu už znáte i uvedení argumentu, k tomu nemusím nic dodávat. Vysvětlím ale důvod k přidání toho argumentu a následné kontroly, jestli něco obsahuje. Přemýšlím totiž dopředu. Pokud bych v budoucnu chtěl nastavit, že hráč může napsat /skill <skill> a vypíše mu to podrobnější informace, tak už to mám připraveno a nemusím nic upravovat. Stejně tak i <player> tam mámpro případné další využití. Stylizaci ale nechám na vás, nebudu ani ukazovat to bližší rozepsání. To byste měli umět sami.
Mám ve zvyku používat oddělení textu pro přehlednost, proto jsou tam ty dvě zprávy, co obsahují jen "&7-". Napíše to prostě pomlčku a odřádkuje.
První část komplikovanějšího kódu je čtvrtá zpráva. Prakticky jsem jen obarvil zprávu Horník (<level>): a použil jsem %% k tomu, abych vložil do té závorky úroveň skillu hráče.
Ta pátá zpráva pro většinu smrtelníků vypadá asi jako japonské písmo... (本当に? "Opravdu?") Pojďme si to rozebrat, tady máte pro jistotu celou tu zprávu, kdybyste s tím měli problémy- "       &b%{hornik_xp.%player%}%&f/&c%{hornik_lvl.%player%}th element of {@xp}%&f XP". Doporučuji se soustředit hlavně na %%, protože ta vám oddělují ty hlavní části. Zbytek ignorujte. V první části %{hornik_xp.%player%}% to napíše aktuální stav zkušeností, nic zvláštního. poté to napíše oddělení  "/" a %{hornik_lvl.%player%}th element of {@xp}%. Tahle šikovná část kódu prakticky říká "prvek na pozici <hráčův level> v options {@xp}". (Stejné, jako anglicky "čtvrtý"- "4th", jen tady se to řídí levelem)

Dobře, výpis bychom měli. Teď potřebujeme něco, čím budeme zvedat hráčův level při dosažení potřebného počtu zkušeností. Normálně bych k tomu použil funkce, ale ty zatím ještě necháme být, uděláme si pro to raději příkaz (ten totiž můžete případně použít i vy přímo ve hře. U funkcí to nejde. A víte vy co? Rovnou pro to použijeme ten náš už přichystaný příkaz, jen mu přidáme novou podmínku.

Myslím, že tohle nebude zas tak moc nutné rozebírat. První řádek musí být na stejné úrovni, jako ten arg 1 is not set na minulém obrázku, na to si dejte pozor (Já to musím ořezat, aby se to tu vůbec vešlo)! Druhý řádek zkontroluje, jestli má hráč více zkušeností, než je potřeba pro úroveň. Pokud ano, pošle ho dál.
Třetí řádek nastaví dočasnou proměnnou, která je prakticky přebytek zkušeností z levelu (aby se nám žádné neztratily...), které hned na čtvrtém řádku využijeme k tomu, abychom je nastavili jako aktuální stav zkušeností. (Tohle jde zjednodušit a tyto dva řádky jde sloučit do sebe. Pro přehlednost jsem je ale rozdělil.)
Předposlední řádek zvýší úroveň dovednosti horníka a poslední mu oznámí, že získal nový level. Nic víc v tom není. Snadné, že? Všimněte si toho, že jsem použil "arg-player"! Zaměřuji totiž hráče, který je napsaný v tom příkazu.

Ok, tak jdeme dál. Tenhle příkaz pro update úrovně pak můžeme zavolat pomocí /skill levelup <hráč>, což hned využijeme. Pojďme si nastavit zisk XP.

Zisk zkušeností:

Tady všechno už znáte. Vždy detekuju vytěžení nějakého prvku (kámen, uhlí, železo) a podle toho uděluji body zkušeností. Zároveň pokaždé nechám provést příkaz pro update levelu. Pokud hráč něco vykope a bude mít dostatečný počet zkušeností pro nový level, tak se mu automaticky updatuje.

Doporučení: Hráči mají tendenci tyhle systémy obcházet, proto je dobré přidat podmínku u rud, které dropují přímo předměty (uhlí, diamanty, redstone)! Podmínka je jednoduchá- "pokud má hráč na itemu silktouch, tak mu to nepřidá zkušenosti". Zároveň osobně používám souborovou databázi pro železo a zlato, aby ho nemohli opakovaně pokládat a ničit, ale to by pro vás bylo zatím dost složité. Musíte si vystačit s "if tool of player is not enchanted with silk touch:", sorry.

Bonusy skillů:

Nebudu se vám tu vypisovat s 50 různými bonusy a příklady... Tyhle jsou ale docela fajn na ukázku. Mám tu jednoduchou detekci zničení kamene.
Pokud má hráč úroveň hornictví větší, než 2, má 10% šanci na drop kamene navíc. A pokud má úroveň vyšší, než 5, tak má šanci 1% + 0,1% za každou úroveň, že dostane na 10 vteřin bonus k rychlosti kopání... V obou případech mám tu šanci napsánu jinak, abyste viděli obě možnosti. Obvykle je lepší použít ten druhý způsob a odřádkovat to, abyste mohli přidat více bonusů pro stejnou úroveň.

To všechno ale už nechám na vás... Vymyslete haldu dalších bonusů a skillů. Stačí zapojit představivost. Já mám aktuálně na svém serveru tyhle skilly- horník, dřevorubec, farmář, sběrač, rybář a kovář, které jsou každý vlastnoručně nastavené, blbuvzdorné a krásně modifikovatelné, přičemž chci přidat ještě další. Nepotřebuju žádný plugin, který mi bude dávat to, co nechci (navíc kovářství u mě přidává možnost vykovat si speciální nástroje). Kombinace a možnosti jsou obrovské (dejte šanci na drop nugetu při vykopání zlata nebo železa; šanci na drop speciálních rud a předmětů, které uděláte podle minulé lekce... všechno je možné).

Příště si ukážeme nějaké ty základy k funkcím, protože jsou neskutečně praktické.

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.