IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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
Skript - Minecraft modding bez Javy

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:

Skript - Minecraft modding bez Javy

Výsledek v logu:

Skript - Minecraft modding bez Javy

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í.


 

Předchozí článek
Skript - podmínky a argumenty
Všechny články v sekci
Skript - Minecraft modding bez Javy
Přeskočit článek
(nedoporučujeme)
Skript - SkAddony - SkQuery
Článek pro vás napsal 205nd
Avatar
Uživatelské hodnocení:
Ještě nikdo nehodnotil, buď první!
Autor se věnuje primárně Skriptu, z menší části umí i HTML a naprosté základy PHP.
Aktivity