3. diel - Skript - Cykly
Cykly - o tom dnes budeme hovoriť. Vo Skriptu je to vlastne časť kódu, ktorá opakuje nejakú akciu pre nejaké hodnoty. Typický štýl kódu vyzerá takto:
loop <výraz>: <podmínky> <účinek>
Takže si to rozoberieme:
- Prvá časť kódu (
loop <výraz>
) musí mať v mieste pre výraz taký výraz, ktorý vráti viac hodnôt (napr. All players - všetci hráči). - Druhá časť, tá ktorá využije cyklu, hodnota z cyklu sa značí
premennou
%loop-value%
Ale kde sa takéto cykly dajú využiť? Prakticky je to pomerne častá časť skriptov. Dá sa využiť v mnohých prípadoch, napríklad pri výpise všetkých hráčov, nejaké premenné typu zoznam (list variable) a ďalších hodnôt.
My si teraz skúsime vytvoriť jednoduchý skript na vypísanie online hráčov.
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
Rovnakým spôsobom napríklad môžeme rozoslať správu všetkým hráčom
- loopneme je a potom necháme konať príkaz
send "zpráva" to loop-player
. Ako príklad môže poslúžiť
ukážka 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 by sme miesto takéhoto cyklu mohli jednoducho použiť príkaz
"broadcast", však chcel som predviesť ako by to šlo len pomocou príkazu
send
a cyklu. Verzia s broadcast
by bola:
broadcast "zpráva"
Prechádzanie premenných
Pomocou cyklov môžeme prechádzať prvky premennej, ktorá je typu zoznam a obsahuje viac ako jednu hodnotu - takým premenlivým vo Skriptu hovoríme list variable.
Môžeme si teda napríklad do jednej list variable zaskladovat hráčov, ktorí dostali ban, členmi adminteamu alebo zakázané itemy. My si urobíme skripty na zakázané itemy.
Najprv si musíme pripraviť príkaz, ktorý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 ďalej teda vytvoríme samotný systém na detekciu zakázaných itemov - prejdeme všetkých hráčov, potom ich inventára a zakázané itemy vymastíme 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ýsledok v hre:
Výsledok v logu:
Pozor - logy sa musí zobrazovať v PSPad-u, Notepad ++ - u alebo iných programoch, pri zobrazení v poznámkovom bloku sa všetko zobrazí v jednom riadku a nejde to prečítať!
No dobre, toto je zaujímavé. Ale čo potom vlastné warpsystém? Alebo
/killall
príkaz? Trebárs aj kompletné bansystem, každopádne
toto všetko (a ešte oveľa viac) ide pomocou cyklov vytvoriť.
V budúcej lekcii už by sme mohli začať pracovať s prvými addony, predstaviť si ich funkcie a využitie.
Všetky kódy ukázané v tomto skriptu nájdete tu: https://pastebin.com/T79hUasg