Lekce 3 - Skript - Cykly
V předchozí lekci, Skript - podmínky a argumenty, jsme se naučili něco málo ohledně argumentů v příkazech.
Cykly - o tom dnes budeme mluvit. Ve Skriptu je to vlastně část kódu, která opakuje nějakou akci pro nějaké hodnoty. Typický styl kódu vypadá takto:
loop <výraz>: <podmínky> <účinek>
Takže si to rozebereme:
- První část kódu (
loop <výraz>
) musí mít v místě pro výraz takový výraz, který vrátí více hodnot (např. all players - všichni hráči). - Druhá část, ta která využije cyklu, hodnota z cyklu se značí
proměnnou
%loop-value%
Ale kde se takovéto cykly dají využít? Prakticky je to poměrně častá část skriptů. Dá se využít v mnoha případech, například při výpisu všech hráčů, nějaké proměnné typu seznam (list variable) a dalších hodnot.
My si nyní zkusíme vytvořit jednoduchý skript na vypsání online hráčů.
command /list: #Deklarace příkazu list trigger: send "&e&lList online hráčů:" to player loop all players: #Do cyklu vložíme hodnotu "all players" (všichni hráči) send "&7%loop-value%" to player #Vypsání hodnoty z cyklu

Stejným způsobem například můžeme rozeslat zprávu všem hráčům -
loopneme je a potom necháme konat příkaz
send "zpráva" to loop-player
. Jako příklad může posloužit
ukázka z AlertSK (zjednodušená):
command /alert [<text>]: trigger: if player has permission "alertsk.alert": loop all players: set {alertmsg} to colored arg-1 #Pro správné kódování zprávy send "&4&lAlert: &7%{alertmsg}%" to loop-player delete {alertmsg} else: send "&cNope."
V praxi bychom místo takového cyklu mohli jednoduše použít příkaz
"broadcast", nicméně chtěl jsem předvést jak by to šlo jen pomocí
příkazu send
a cyklu. Verze s broadcast
by byla:
broadcast "zpráva"
Procházení proměnných
Pomocí cyklů můžeme procházet prvky proměnné, která je typu seznam a obsahuje více než jednu hodnotu - takovým proměnným ve Skriptu říkáme list variable.
Můžeme si tedy třeba do jedné list variable zaskladovat hráče, kteří dostali ban, členy adminteamu nebo zakázané itemy. My si uděláme skripty na zakázané itemy.
Napřed si musíme připravit příkaz, kterým zakázaný item vložíme do listu:
command /zakazat: trigger: if {zakazane::*} is player's tool: #Jestliže již item je na seznamu... send "&e%player's tool% &abyl odebrán ze seznamu zakázaných itemů" # tak jej z něj odebereme remove player's tool from {zakazane::*} else: set {zakazane::*} to player's tool #Přidání itemu v hráčově ruce do zakázaných send "&e%player's tool% &abyl přidán do seznamu zakázaných itemů" to player
A dále tedy vytvoříme samotný systém na detekci zakázaných itemů - projdeme všechny hráče, poté jejich inventáře a zakázané itemy vymažeme a zalogujeme:
command /list: #Deklarace příkazu trigger: send "&e&lList online hráčů:" to player loop all players: #Do cyklu vložíme hodnotu "all players" (všichni hráči) send "&7%loop-value%" to player #Vypsání hodnoty z cyklu command /zakazat: trigger: if {zakazane::*} is player's tool: #Jestliže již item je na seznamu... send "&e%player's tool% &abyl odebrán ze seznamu zakázaných itemů" # tak jej z něj odebereme remove player's tool from {zakazane::*} else: set {zakazane::*} to player's tool #Přidání itemu v hráčově ruce do zakázaných send "&e%player's tool% &abyl přidán do seznamu zakázaných itemů" to player every 1 seconds in "world": #Každou jednu sekundu loop all players: #Zacyklíme všechny hráče loop items in loop-player's inventory: #Zacyklíme inventář hráče z předchozího cyklu if loop-item is {zakazane::*}: # Kontrola jestli zacyklený item není zakázaný if loop-player has permission "zakazaneitemy.ignore": #Důležité - vhodné pro adminy, ať jim to nemaže zakázané itemy stop else: log "ZAKAZANY ITEM | HRAC: %loop-player% | ITEM: %loop-item% | DATUM: %now%" to file "zakazaneitemy.log" # a zaloguje se to do souboru zakazaneitemy.log remove loop-item from the loop-player #Jestliže je, tak se smaže... send "&cVe tvém inventáři byl objeven item &e%loop-item%&c, který je na seznamu zakázaných itemů!" to loop-player #Hráčovi se pošle zpráva..
Výsledek ve hře:

Výsledek v logu:

Pozor - logy se musí zobrazovat v PSPad-u, Notepad++-u nebo jiných programech, při zobrazení v poznámkovém bloku se vše zobrazí v jednom řádku a nejde to přečíst!
No dobře, tohle je zajímavé. Ale co teprve vlastní warpsystém? Nebo
/killall
příkaz? Třeba i kompletní bansystem, každopádně
toto všechno (a ještě mnohem více) jde pomocí cyklů vytvořit.
Všechny kódy ukázané v tomto skriptu najdete zde: https://pastebin.com/T79hUasg
V příští lekci, Skript - SkAddony - SkQuery, už bychom mohli začít pracovat s prvními addony, představit si jejich funkce a využití.