Skript - Udělejte si vlastní plugin snadno a rychle!
Napsal: 10 črc 2013, 15:41
Obsah:
Úvod
Skript je plugin, pomocí kterého si můžete udělat vlastní jednoduchý (ale i složitý) plugin bez znalosti Javy. Ptáte se, že takové pluginy tu již jsou, jako například MyCommand. Máte pravdu, ale tyto pluginy jsou oproti Skriptu nuly. Ve Skriptu si totiž můžete nadefinovat nejen vlastní příkazy, ale i můžete ovládat, co se stane při určitých událostech (eventech). Skriptem můžete nahradit spoustu funkcí jiných pluginů, jako např. home, jail, mute, ban, kick... Můžete také udělat spoustu jiných věcí, jako např. automaticky měnící se cedule a mnoho dalších.
Instalace a konfigurace, co je to kTools
Instalace i konfigurace tohoto pluginu je lehká jako u ostatních. Nejdříve si stáhneme tento plugin ze stránky http://dev.bukkit.org/bukkit-plugins/skript/. Doporučuji stahovat nejnovější Beta build, protože jsou v něm většinou opraveny chyby a přidány další nové a užitečné věci. Stažený soubor Skript.jar přesuneme do složky plugins, co máme na našem serveru a server restartujeme nebo použijeme plugin typu PluginManager (http://dev.bukkit.org/bukkit-plugins/pm-pluginmanager/) pro načtení Skriptu. Ve složce plugins se nám vytořila složka Skript. V této složce stojí za pozornost složka scripts (tam se ukládají skripty) a soubor aliases-english.sk (zde se definují vlastní aliasy itemů). Soubory .sk jsou obyčejné .yml, takže si nastavte váš oblíbený editor, aby otevíral tyto soubory. Ze složky scripts vše vymažte, nebudete to potřebovat. Cokoliv ve složce scripts začíná znakem - Skript ignoruje.
Dobré je si do Skriptu stáhnout kTools, to je knihovna do Skriptu, která pomáhá udělat věci, jaké Skript sám o sobě neumí nebo by se dělaly velmi těžko. Je to například přetypovávání dat a získání bloku/chunku pomocí souřadnic x, y a z. KTools stáhnete z topicu na adrese http://dev.bukkit.org/bukkit-plugins/sk ... t-library/. Odkaz ke stažení je na konci prvního topicu, stáhněte verzi 1.1. Pak jděte do hry, napište /skript reload all a /setorigin. /skript reload all znovu načte všechny skripty co najde ve složce scripts a /setorigin nastaví nulové souřadnice pro kTools. /setorigin se používá pouze jednou, a to po instalaci kTools. Tento přikaz se musí napsat ze hry.
První plugin - Hello world
Skript a kTools už máme nainstalovány, a tak se můžeme vrhnout do našeho prvního pluginu. Tento plugin přidá příkaz /helloworld a po jeho napsání hráči, který ho napsal napíše Hello World!
Ve složce scripts vytvořte nový soubor hello-world.sk (jméno může být libovolné). Jak jsem již zmiňoval, soubory .sk jsou obyčejné textové .yml. Cokoliv za znakem # Skript ignoruje. Do tohoto souboru napište:
Tak tohle by byl náš první příkaz. Jděte do hry, napište /skript reload all a zkuste to. Jestli vám vše funguje, gratuluji! :-)
Vylepšení Hello world! (argumenty příkazů)
V minulé sekci jste se dozvěděli, jak vytvořit příkaz a napsat zprávu hráči. Mimochodem, pokud máte plugin na barvy (Esseentials) tak můžete všude, kde něco někomu posíláte, používat barvy pomocí znaku & a čísla/písmena barvy. Teď si ukážeme, jak udělat příkaz, který pošle určitý text určitému hráči a napíše mu, kdo mu zprávu napsal. Můžete to použít třeba jako /msg.
Tak máme náš druhý příkaz. Uložte to, ve hře napište /skript reload all a můžete zkoušet. Zde vám napíšu část dlouhého seznamu typů argumetů:
Tak a teď se přesuneme k něčemu těžšímu.
Eventy, relativní a absolutní pozice pomocí kTools
Nyní už jakž-takž umíme udělat příkazy. Teď si ukážeme, jak udělat eventy. Dejme tomu, že chceme, že když někdo vykope diamant, že mu to napíše, že má štěstí a všem hráčům to napíše, že našel dia. To provedeme následovně:
Tak uděláme jednoduchý event. Můžeme si třeba také udělat plugin proti dešti. Je to tak jednoduché:
Teď si ukážeme, jak udělat to, že když položíme diamantový blok, tak se na něj položí cedule s textem.
Absolutní pozice je ta, kterou definujeme pomocí x,y a z. Použijeme to k tomu, abysme změnili informační ceduli na text, který chceme.
Tak to by bylo podle mě vše. Relativní pozici (pozici vzhledem k bloku) můžeme zapsat takto:
Počítadlo hráčů (proměnné a konstanty)
Proměnné mohou být buď lokální nebo globální. Lokální jsou dostupné pouze pro trigger, ve kterém byly vytvořeny. Napříkad v příkazu /nastavpromennou vytvoříme lokální proměnnou, ale v /prectipromennou jí nemůžeme přečíst. Globální proměnné jsou pravý opak lokální. Proměnné ve Skriptu jsou ohraničeny znaky {}. Funguje to podobně, jako třeba ve VIP SMSkách tady na FH. Lokální proměnné začínají znakem _. Třeba {_fuj} je lokální proměnná fuj. {bla} je globální proměnná bla. Nechápete to? Ukážeme si to na příkladu:
Když to zkusíte, nevím jestli to Skript vůbec vezme, protože zjistí, že ve druhém případě proměnná {_lokalni} neexistuje. Ale když budeme předpokládat, že to Skript načte bez chyby, tak když napíšeme /nastav tak se nám vypíše obsah proměnné. Pak ale když napíšeme /precti tak se nám nevypíše nic, protože /precti nemá přístup k proměnné z /nastav.
Kdybychom příklad upravili takto:
Tak nám to už Skript určitě načte bez problému. Když napíšeme /nastav tak se nám vypíše :-D. Když pak napíšeme /precti, tak se nám znova vypíše :-D. Obsah proměnných se ukládá do souboru, to znamená, že přežije restart serveru.
Nyní si uděláme jednoduchý skript s pomocí proměnných a eventů, který nám ukáže počet hráčů online. Skript totiž nemá žádnou možnost, jak zjistit aktuální počet hráčů. Vytvoříme toto:
Tak to bychom měli jednoduché počítadlo hráčů online. Budete muset restartovat server, aby se hráči začali počítat od 0.
EDIT:
Přišel jsem na to, jak spočítat hráče snadněji. O tomto způsobu jsem nevěděl a myslel jsem si, že výše uvedený příklad je jediná možnost, jak počítat hráče. Upravený příklad:
Zablokování griefování knihoven na Spawnu pomocí hůlek z Thaumcraftu (definice vlastních itemů, zakázání eventu, určení vzdálenosti od Spawnu)
Jistě jste se všichni, kteří máte na severu mod ThaumCraft museli vypořádat s griefováním knihoven (přeměnou na Thaumonomicony) na Spawnu pomocí jakékoliv hůlky. Teď je tomu konec! Skript, který teď naprogramujeme zabrání tomuto griefování. Nejdříve si ale budeme muset nadefinovat ID hůlek, protože Skript nemá rád, když se rovnou do něj píšou IDčka itemů. Definování itemů se provádí v souboru aliases-english.sk. Já tam mám třeba tohle:
Hned nahoře je kategorie Custom aliases, tam se píšou aliasy. Napíšeme
tam tohle:
Pak vytvoříme nový skript ve složce scripts a napíšeme do něj:
Pole a proměnné s proměnným jménem :-D
Tak už víte, jak se dělají základní proměnné. Věděli jste ale, že můžete dávat kousky kódu vyhodnocované Skriptem i do názvu proměnných? Například takto?
Toto je zcela validní zápis. Podrobněji si ho ukážeme na příkladu pluginu pro /home.
Dejme tomu, že hráč Steve napíše /sethome. Protože nenapsal první argument příkazu, nastaví se na hodnotu "vychozi". Skript si tak řádek
přeloží na tohle:
Vlastně to tak úplně není pravda, protože %player% neznamená nick hráče, ale i další jeho vlastnosti. Takto by se to přeložilo, kdybychom místo %player% použili %name of player%. K tomu se ale dostaneme možná později.
Proměnná se nastaví na umístění hráče. Jako umístění hráče se kromě souřadnic bere i směr, jakým se dívá a naklonění hlavy. Pak když náš Steve napíše /home, tak se zkontroluje, zda taková proměnná už byla někdy nastavena. Pokud byla, tak teleportuje hráče zpět na pozici, která je v této proměnné uložena. Pokud taková proměnná neexistuje, napíše to hráči chybovou zprávu.
Teď přejdeme k polím. Jestli ještě vše po tento řádek, chápete, je dost možné, že se to teď změní. Pole si můžete představit jako proměnnou, která dokáže uložit více hodnot. Aby pak bylo možné s hodnotami pracovat, každé hodnotě se přidělí nějaký klíč, podle kterého se dá hodnota znova najít. Můžeme si to představit jako tabulku:
Tato celá tabulka se nám uloží do jediné proměnné. Klíč bývá většinou číslo, ale nic nám nebrání, aby to byl i text. Pole se ve Skriptu zapíše jako {jméno pole::*}. Nyní si ukážeme, jak zapsat hodnotu do pole.
Teď už umíme přidat do pole hodnotu. Ale jak jí přečteme? Můžeme na ní odkázat jejím klíčem:
Teď už umíme přečíst pole pomocí klíče. Málem bych zapomněl zmínit, že Skript má už nějaká pole v sobě. Tyto pole neobalujeme do složených závorek. Konkrétně pole:
A možná ještě další. Zase vás ale odkážu na oficiální dokumentaci, protože vše z hlavy nevím. Nyní si ukážeme, jak procházet pole pomocí funkce loop.
Na třetím řádku jste si mohli všimnout, že používáme loop-player. Toto znamená, že to má brát hráče, u kterého právě jsme. Teď si ukážeme, jak procházet vlastní pole.
Toto po provedení vypíše:
Klíče začínají od 0. Funkci loop můžeme používat také pro opakování bloku kódu x-krát.
Samozřejmě můžeme používat i proměnné:
Tak to by bylo asi všechno k polím a funkci loop. Ještě nějaký bonusy:
Závěr
Tak to by bylo asi všechno o Skriptu, co byste měli vědět. Samozřejmě to není vůbec nic z toho, co Skript umí. Všechno o Skriptu najdete na jeho oficiální dokumentaci tady: http://njol.ch/projects/skript/doc/. Doufám, že jsem vám zmírnil trable s hledáním někoho, kdo umí v javě. Já jsem zatím ve Skriptu udělal třeba jail, který není na čas, ale hráč musí dát do truhly určitý počet cobblestonu, který vytěží dřevěným krumpáčem z pomalého cobble generátoru, který je na tlačítko, aby hráč nemohl AFKovat se zatíženou myší. Jestli jste to dočetli až sem, máte u mě malé bezvýznamné + :-D Samozřejmě, že kdybyste zde našli nějakou chybu (příklad nefunguje, pravopis...) nebo jste měli nějaký dotaz, tak vám rád odpovím, a také doufám, že nejento nebo někdo jiný ze supportu toto vloží do seznamu návodů.
Seznam skriptů v Návodech:
// EDIT: Přišel jsem na to, jak počítat hráče, a proto jsem upravil příklad.
// EDIT: Přidána sekce pole a nějaké bonusy
// EDIT: Přidal jsem seznam skriptů tady na fóru //nejento
- Úvod - K čemu a pro koho to je
- Instalace a konfigurace, co je to kTools.
- Hello world! (první skript, základy vytváření příkazů)
- Vylepšení Hello world! (argumenty příkazů)
- Eventy, relativní a absolutní pozice pomocí kTools
- Počítadlo hráčů (proměnné a konstanty)
- Zablokování griefování knihoven na Spawnu pomocí hůlek z Thaumcraftu (definice vlastních itemů, zakázání eventu, určení vzdálenosti od Spawnu)
- Pole a proměnné s proměnným jménem :-D
- Závěr
Úvod
Skript je plugin, pomocí kterého si můžete udělat vlastní jednoduchý (ale i složitý) plugin bez znalosti Javy. Ptáte se, že takové pluginy tu již jsou, jako například MyCommand. Máte pravdu, ale tyto pluginy jsou oproti Skriptu nuly. Ve Skriptu si totiž můžete nadefinovat nejen vlastní příkazy, ale i můžete ovládat, co se stane při určitých událostech (eventech). Skriptem můžete nahradit spoustu funkcí jiných pluginů, jako např. home, jail, mute, ban, kick... Můžete také udělat spoustu jiných věcí, jako např. automaticky měnící se cedule a mnoho dalších.
Instalace a konfigurace, co je to kTools
Instalace i konfigurace tohoto pluginu je lehká jako u ostatních. Nejdříve si stáhneme tento plugin ze stránky http://dev.bukkit.org/bukkit-plugins/skript/. Doporučuji stahovat nejnovější Beta build, protože jsou v něm většinou opraveny chyby a přidány další nové a užitečné věci. Stažený soubor Skript.jar přesuneme do složky plugins, co máme na našem serveru a server restartujeme nebo použijeme plugin typu PluginManager (http://dev.bukkit.org/bukkit-plugins/pm-pluginmanager/) pro načtení Skriptu. Ve složce plugins se nám vytořila složka Skript. V této složce stojí za pozornost složka scripts (tam se ukládají skripty) a soubor aliases-english.sk (zde se definují vlastní aliasy itemů). Soubory .sk jsou obyčejné .yml, takže si nastavte váš oblíbený editor, aby otevíral tyto soubory. Ze složky scripts vše vymažte, nebudete to potřebovat. Cokoliv ve složce scripts začíná znakem - Skript ignoruje.
Dobré je si do Skriptu stáhnout kTools, to je knihovna do Skriptu, která pomáhá udělat věci, jaké Skript sám o sobě neumí nebo by se dělaly velmi těžko. Je to například přetypovávání dat a získání bloku/chunku pomocí souřadnic x, y a z. KTools stáhnete z topicu na adrese http://dev.bukkit.org/bukkit-plugins/sk ... t-library/. Odkaz ke stažení je na konci prvního topicu, stáhněte verzi 1.1. Pak jděte do hry, napište /skript reload all a /setorigin. /skript reload all znovu načte všechny skripty co najde ve složce scripts a /setorigin nastaví nulové souřadnice pro kTools. /setorigin se používá pouze jednou, a to po instalaci kTools. Tento přikaz se musí napsat ze hry.
První plugin - Hello world
Skript a kTools už máme nainstalovány, a tak se můžeme vrhnout do našeho prvního pluginu. Tento plugin přidá příkaz /helloworld a po jeho napsání hráči, který ho napsal napíše Hello World!
Ve složce scripts vytvořte nový soubor hello-world.sk (jméno může být libovolné). Jak jsem již zmiňoval, soubory .sk jsou obyčejné textové .yml. Cokoliv za znakem # Skript ignoruje. Do tohoto souboru napište:
Kód: Vybrat vše
command /helloworld: # Definujeme příkaz /helloworld
description: Hello World! # Popis příkazu (myslím si, že se napíše v /help)
usage: /helloworld # Nepovinný parametr, vypíše se hráči, když napíše špatný tvar příkazu.
executable by: players and console # Nepovinný parametr, určuje, jestli příkaz mohou vykonávat jen hráči (players), konzole a commandblocky (console) a nebo obojí (players and console). Pokud neuvedeme, je to jakoby jsme napsali players and console
permission: hello.world # Permission, který musí hráč mít, aby mohl příkaz vykonat
permission message: Nemas prava na provedeni tohoto prikazu # Nepovinný parametr, určuje, co se hráči napíše, když nemá práva na tento příkaz. Když neuvedeme, objeví se nějaká výchozí hláška typu You don't have permissions to access that command.
trigger: # Co se stane po napsání příkazu, tady začínají kouzla :-)
send "Hello World!" to the player # Pošli "Hello World!" hráči, který tento příkaz napsal. The můžeme vynechat. Můžeme taky místo tohoto použít message "Hello World!" a nemusíme zde uvádět hráče.
exit trigger # Nemusíme uvádět, ukončí příkaz
Tak tohle by byl náš první příkaz. Jděte do hry, napište /skript reload all a zkuste to. Jestli vám vše funguje, gratuluji! :-)
Vylepšení Hello world! (argumenty příkazů)
V minulé sekci jste se dozvěděli, jak vytvořit příkaz a napsat zprávu hráči. Mimochodem, pokud máte plugin na barvy (Esseentials) tak můžete všude, kde něco někomu posíláte, používat barvy pomocí znaku & a čísla/písmena barvy. Teď si ukážeme, jak udělat příkaz, který pošle určitý text určitému hráči a napíše mu, kdo mu zprávu napsal. Můžete to použít třeba jako /msg.
Kód: Vybrat vše
command /msg <player> <text="Hello World!">: # Definujeme příkaz, který má povinný parametr jméno hráče (musí být online, pokud je online třeba Steve, stačí napsat Ste a Skript si jeho nick doplní) a druhý parametr je typu text. Jestliže tento parametr neuvedeme, nastaví se na "Hello World!". Pokud chcete víc slov, je to potřeba dát do uvozovek. Třeba /msg Steve "Ahoj, jak se mas?"
description: Vylepsene Hello World
permission: test.msg # Opravdu může být cokoliv
trigger:
send "&c%player% ti napsal: &f%argument 2%" to argument 1 # %% v textu značí strukturu, kterou má vyhodnotit Skript. Argumenty se číslují od 1 a místo dlouhého argument stačí použít arg. Místo čísla argumentu můžeme použít i typ argumentu, např. arg-player, arg-text...
Tak máme náš druhý příkaz. Uložte to, ve hře napište /skript reload all a můžete zkoušet. Zde vám napíšu část dlouhého seznamu typů argumetů:
- Player - Hráč, jeho nick si Skript dokáže doplnit
- Offline player - Hráč, může být offline i online, ale Skript si jeho nick nedoplní. Nevím, jestli u tohoto záleží na velikosti písmen v nicku hráče, ale myslím si, že ano
- Item (Material) - Item, který je definovaný v alises-english.sk. Například Stone, Dirt, Grass...
- Integer (Number) - Číslo (1,2,3...)
- Text - Text
Tak a teď se přesuneme k něčemu těžšímu.
Eventy, relativní a absolutní pozice pomocí kTools
Nyní už jakž-takž umíme udělat příkazy. Teď si ukážeme, jak udělat eventy. Dejme tomu, že chceme, že když někdo vykope diamant, že mu to napíše, že má štěstí a všem hráčům to napíše, že našel dia. To provedeme následovně:
Kód: Vybrat vše
on mine of diamond: # Po vykopání diamantu
send "&bTy máš ale štěstí! :-)" to the player # Pošleme zprávu
broadcast "&6Hráč %player% právě našel &bdiamanty&6!" # Pošlem zprávu všem hráčům
Tak uděláme jednoduchý event. Můžeme si třeba také udělat plugin proti dešti. Je to tak jednoduché:
Kód: Vybrat vše
on weather change: # Při změně počasí
set weather to sunny # Nastav počasí na slunečno
Teď si ukážeme, jak udělat to, že když položíme diamantový blok, tak se na něj položí cedule s textem.
Kód: Vybrat vše
on place of diamond block:
set block above the block to sign # Po položení diamantového bloku se nad ním položí cedule
set line 1 of block above the block to "Kuk :-D" # Nastavíme řádek 1 cedule na "Kuk :-D"
Absolutní pozice je ta, kterou definujeme pomocí x,y a z. Použijeme to k tomu, abysme změnili informační ceduli na text, který chceme.
Kód: Vybrat vše
command /zmenceduli <text=""> <text=""> <text=""> <text="">:
permission: zmen.ceduli
description: Zmenit informacni ceduli na spawnu
usage: /zmenceduli [radek1] [radek2] [radek3] [radek4]
trigger:
make console execute command "/getlocation 10 80 100 world" # Načteme pomocí kTools blok na souřadnicích x: 10, y: 80, z: 100 ve světě world.
set line 1 of {ktools.location} to arg 1# Blok z předchozího řádku se nám uloží do proměnné {ktools.location}. O proměnných si řekneme za chvíli.
set line 1 of {ktools.location} to arg 2
set line 1 of {ktools.location} to arg 3
set line 1 of {ktools.location} to arg 4
message "Cedule byla zmenena!" # Pošleme zprávu hráči co napsal príkaz
Tak to by bylo podle mě vše. Relativní pozici (pozici vzhledem k bloku) můžeme zapsat takto:
- the block above/below/right/left the block
- the block n north/south/east/west of the block - n nahradíme za vzdálenost. Třeba 5 bloků severně od bloku - the block 5 north of the block
Počítadlo hráčů (proměnné a konstanty)
Proměnné mohou být buď lokální nebo globální. Lokální jsou dostupné pouze pro trigger, ve kterém byly vytvořeny. Napříkad v příkazu /nastavpromennou vytvoříme lokální proměnnou, ale v /prectipromennou jí nemůžeme přečíst. Globální proměnné jsou pravý opak lokální. Proměnné ve Skriptu jsou ohraničeny znaky {}. Funguje to podobně, jako třeba ve VIP SMSkách tady na FH. Lokální proměnné začínají znakem _. Třeba {_fuj} je lokální proměnná fuj. {bla} je globální proměnná bla. Nechápete to? Ukážeme si to na příkladu:
Kód: Vybrat vše
command /nastav:
description: Popis
permission: skript.nastav
trigger:
set {_lokalni} to ":-D" # Nastavíme lokální proměnnou lokalni na text ":-D".
message "Obsah promenne lokalni: %{_lokalni}%" # Do textu vložíme proměnnou lokalni
command /precti:
description: Popis
permission: skript.precti
trigger:
message "Obsah promenne lokalni: %{_lokalni}%" # Vypíšeme
Když to zkusíte, nevím jestli to Skript vůbec vezme, protože zjistí, že ve druhém případě proměnná {_lokalni} neexistuje. Ale když budeme předpokládat, že to Skript načte bez chyby, tak když napíšeme /nastav tak se nám vypíše obsah proměnné. Pak ale když napíšeme /precti tak se nám nevypíše nic, protože /precti nemá přístup k proměnné z /nastav.
Kdybychom příklad upravili takto:
Kód: Vybrat vše
command /nastav:
description: Popis
permission: skript.nastav
trigger:
set {lokalni} to ":-D"
message "Obsah promenne lokalni: %{lokalni}%" # Do textu vložíme proměnnou lokalni
command /precti:
description: Popis
permission: skript.precti
trigger:
message "Obsah promenne lokalni: %{lokalni}%" # Vypíšeme
Tak nám to už Skript určitě načte bez problému. Když napíšeme /nastav tak se nám vypíše :-D. Když pak napíšeme /precti, tak se nám znova vypíše :-D. Obsah proměnných se ukládá do souboru, to znamená, že přežije restart serveru.
Nyní si uděláme jednoduchý skript s pomocí proměnných a eventů, který nám ukáže počet hráčů online. Skript totiž nemá žádnou možnost, jak zjistit aktuální počet hráčů. Vytvoříme toto:
Kód: Vybrat vše
on join: # Když se někdo připojí do hry
add 1 to {pocethracu} # Přičti 1 do proměnné pocethracu
on leave: # Když někdo opustí hru
remove 1 from {pocethracu} # Odečti 1 z proměnné pocethracu
command /pocethracu:
permission: pocet.hracu
description: Vypíše počet hráčů
trigger:
message "&6Prave je online&a %{pocethracu}%&6 hracu." # Napíšeme obsah proměnné pocethracu tomu, kdo napsal příkaz
Tak to bychom měli jednoduché počítadlo hráčů online. Budete muset restartovat server, aby se hráči začali počítat od 0.
EDIT:
Přišel jsem na to, jak spočítat hráče snadněji. O tomto způsobu jsem nevěděl a myslel jsem si, že výše uvedený příklad je jediná možnost, jak počítat hráče. Upravený příklad:
Kód: Vybrat vše
command /pocethracu:
permission: pocet.hracu
description: Vypíše počet hráčů
trigger:
message "&6Prave je online&a %size of all players%&6 hracu." # All players je pole všech hráčů. O polích si přečtěte v dodatku dole. Pomocí size of spočítáme, kolik prvků je v tomto poli.
Zablokování griefování knihoven na Spawnu pomocí hůlek z Thaumcraftu (definice vlastních itemů, zakázání eventu, určení vzdálenosti od Spawnu)
Jistě jste se všichni, kteří máte na severu mod ThaumCraft museli vypořádat s griefováním knihoven (přeměnou na Thaumonomicony) na Spawnu pomocí jakékoliv hůlky. Teď je tomu konec! Skript, který teď naprogramujeme zabrání tomuto griefování. Nejdříve si ale budeme muset nadefinovat ID hůlek, protože Skript nemá rád, když se rovnou do něj píšou IDčka itemů. Definování itemů se provádí v souboru aliases-english.sk. Já tam mám třeba tohle:
Spoiler: zobrazit
Hned nahoře je kategorie Custom aliases, tam se píšou aliasy. Napíšeme
tam tohle:
Kód: Vybrat vše
wand¦s = 25256, 25257, 25258 # Za = napíšeme IDčka hůlek (ne těch barevných). Já to mám třeba takhle. wand¦s znamená, že ve Skriptu můžeme používat buď wand nebo wands.
Pak vytvoříme nový skript ve složce scripts a napíšeme do něj:
Kód: Vybrat vše
on right click on a bookshelf with wand: # Po pravokliknutím s hůlkou (definovali jsme jí výše) na knihovnu
set {_loc} to location of block # Nastav lokální proměnnou loc na pozici knihovny
set {_spawnloc} to location of spawn point of player's world # Nastav lokální proměnnou spawnloc na pozici spawnu světa, ve kterém je hráč
if distance between {_loc} and {_spawnloc} is less than 250: # Vzdálenost mezi těmi pozicemi je menší než 250 kostek
cancel the event # Zruš ten event. Zrušení eventu znamená to, že se neprovedou akce pro tento event. Třeba že se nepoloží nebo nezničí blok, tnt nevybouchne...
Pole a proměnné s proměnným jménem :-D
Tak už víte, jak se dělají základní proměnné. Věděli jste ale, že můžete dávat kousky kódu vyhodnocované Skriptem i do názvu proměnných? Například takto?
Kód: Vybrat vše
{domovy.%player%}
Toto je zcela validní zápis. Podrobněji si ho ukážeme na příkladu pluginu pro /home.
Kód: Vybrat vše
command /sethome <text="vychozi">:
description: Nastavi domov hrace
usage: /sethome [jmenodomova]
permission: home.set
trigger:
set {domovy.%player%.%arg 1%} to location of the player # Nastav proměnnou na pozici hráče.
message "&aTvuj domov byl nastaven."
command /home <text="vychozi">:
description: Teleportuje hrace domu
usage: /home [jmenodomova]
permission: home.tp
trigger:
if {domovy.%player%.%arg 1%} is set: # Promenna je nastavena - hrac uz pouzil /sethome
teleport the player to {domovy.%player%.%arg 1%}
else: # Promenna neni nastavena
message "&cDomov s timto jmenem neexistuje."
Dejme tomu, že hráč Steve napíše /sethome. Protože nenapsal první argument příkazu, nastaví se na hodnotu "vychozi". Skript si tak řádek
Kód: Vybrat vše
set {domovy.%player%.%arg 1%} to location of the player
přeloží na tohle:
Kód: Vybrat vše
set {domovy.Steve.vychozi} to location of the player
Vlastně to tak úplně není pravda, protože %player% neznamená nick hráče, ale i další jeho vlastnosti. Takto by se to přeložilo, kdybychom místo %player% použili %name of player%. K tomu se ale dostaneme možná později.
Proměnná se nastaví na umístění hráče. Jako umístění hráče se kromě souřadnic bere i směr, jakým se dívá a naklonění hlavy. Pak když náš Steve napíše /home, tak se zkontroluje, zda taková proměnná už byla někdy nastavena. Pokud byla, tak teleportuje hráče zpět na pozici, která je v této proměnné uložena. Pokud taková proměnná neexistuje, napíše to hráči chybovou zprávu.
Teď přejdeme k polím. Jestli ještě vše po tento řádek, chápete, je dost možné, že se to teď změní. Pole si můžete představit jako proměnnou, která dokáže uložit více hodnot. Aby pak bylo možné s hodnotami pracovat, každé hodnotě se přidělí nějaký klíč, podle kterého se dá hodnota znova najít. Můžeme si to představit jako tabulku:
Kód: Vybrat vše
=== Struktura pole ===
+---+--------------------+
| 0 | Hodnota pro klíč 0 |
| 1 | Hodnota pro klíč 1 |
| 2 | Hodnota pro klíč 2 |
| 3 | Hodnota pro klíč 3 |
| 4 | Hodnota pro klíč 4 |
+---+--------------------+
Tato celá tabulka se nám uloží do jediné proměnné. Klíč bývá většinou číslo, ale nic nám nebrání, aby to byl i text. Pole se ve Skriptu zapíše jako {jméno pole::*}. Nyní si ukážeme, jak zapsat hodnotu do pole.
Kód: Vybrat vše
add hodnota to {jméno pole::*} # Přidá hodnotu na konec pole a přiřadí jí číselný klíč o jednu větší, než je klíč předchozí hodnoty. Hodnota může být cokoliv.
set {jméno pole::1} to hodnota # Přidá hodnotu do pole a přiřadí jí klíč 1. Pokud už nějaká hodnota s klíčem 1 existuje, tak jí přepíše.
set {jméno pole::bla} to hodnota # Jak jsem již zmiňoval, klíče nemusí být číselné, ale mohou být i textové.
Teď už umíme přidat do pole hodnotu. Ale jak jí přečteme? Můžeme na ní odkázat jejím klíčem:
Kód: Vybrat vše
broadcast "%{jméno pole::1}%" # Vypíše hodnotu z pole, která má klíč 1
Teď už umíme přečíst pole pomocí klíče. Málem bych zapomněl zmínit, že Skript má už nějaká pole v sobě. Tyto pole neobalujeme do složených závorek. Konkrétně pole:
Kód: Vybrat vše
all players # Obsahuje všechny hráče
blocks around [blok] in radius [radius] # Všechny bloky v kruhu okolo určitého bloku
A možná ještě další. Zase vás ale odkážu na oficiální dokumentaci, protože vše z hlavy nevím. Nyní si ukážeme, jak procházet pole pomocí funkce loop.
Kód: Vybrat vše
set {_online} to "" # Nastavíme si proměnnou
loop all players: # Procházíme všechny hráče na serveru
set {_online} to "%{_online}% %name of loop-player% # Přidáme k proměnné jméno aktuálního hráče
broadcast "&6Online hráči: &a%{_online}%" # Vypíšeme
Na třetím řádku jste si mohli všimnout, že používáme loop-player. Toto znamená, že to má brát hráče, u kterého právě jsme. Teď si ukážeme, jak procházet vlastní pole.
Kód: Vybrat vše
add "prvni" to {pole::*}
add "druhy" to {pole::*}
add "treti" to {pole::*} # Naplníme pole
loop {pole::*}: # Procházíme všechny hodnoty v poli. Aktuální hodnota je uložena do loop-value a aktuální klíč do loop-index.
message "%loop-index%: %loop-value%"
Toto po provedení vypíše:
Kód: Vybrat vše
0: prvni
1: druhy
2: treti
Klíče začínají od 0. Funkci loop můžeme používat také pro opakování bloku kódu x-krát.
Kód: Vybrat vše
loop 5 times:
message "Ahoj"
Samozřejmě můžeme používat i proměnné:
Kód: Vybrat vše
set {_pocet} to 5
loop {_pocet} times:
message "Ahoj"
Tak to by bylo asi všechno k polím a funkci loop. Ještě nějaký bonusy:
Kód: Vybrat vše
add 1 to {_pocet} # Načte obsah proměnné počet, přičte k tomu 1 a uloží to zpět do proměnné počet. To samé funguje s remove, multiply a divide. (odečte,vynásobí,vydělí)
wait [x] seconds # Čeká určitý počet sekund
Závěr
Tak to by bylo asi všechno o Skriptu, co byste měli vědět. Samozřejmě to není vůbec nic z toho, co Skript umí. Všechno o Skriptu najdete na jeho oficiální dokumentaci tady: http://njol.ch/projects/skript/doc/. Doufám, že jsem vám zmírnil trable s hledáním někoho, kdo umí v javě. Já jsem zatím ve Skriptu udělal třeba jail, který není na čas, ale hráč musí dát do truhly určitý počet cobblestonu, který vytěží dřevěným krumpáčem z pomalého cobble generátoru, který je na tlačítko, aby hráč nemohl AFKovat se zatíženou myší. Jestli jste to dočetli až sem, máte u mě malé bezvýznamné + :-D Samozřejmě, že kdybyste zde našli nějakou chybu (příklad nefunguje, pravopis...) nebo jste měli nějaký dotaz, tak vám rád odpovím, a také doufám, že nejento nebo někdo jiný ze supportu toto vloží do seznamu návodů.
Seznam skriptů v Návodech:
- Statistiky – viewtopic.php?f=85&t=20038
// EDIT: Přišel jsem na to, jak počítat hráče, a proto jsem upravil příklad.
// EDIT: Přidána sekce pole a nějaké bonusy
// EDIT: Přidal jsem seznam skriptů tady na fóru //nejento