Přidej si svou IT školu do profilu a najdi spolužáky zde na síti :)

3. díl - Skript - Cykly

Java Minecraft Modding Skript Skript - Cykly

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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 příští lekci už bychom mohli začít pracovat s prvními addony, představit si jejich funkce a využití.

Všechny kódy ukázané v tomto skriptu najdete zde: https://pastebin.com/T79hUasg


 

 

Článek pro vás napsal 205nd
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Autor se věnuje primárně Skriptu, z menší části umí i HTML a naprosté základy PHP.
Miniatura
Předchozí článek
Skript - podmínky a argumenty
Miniatura
Všechny články v sekci
Skript - Minecraft modding bez Javy
Aktivity (2)

 

 

Komentáře

Avatar
Marek Bednář:12. listopadu 19:36

Super, díky

  • IwDyCZE
 
Odpovědět 12. listopadu 19:36
Avatar
205nd
Redaktor
Avatar
205nd:13. listopadu 19:54

Není zač IwDy :D

Odpovědět 13. listopadu 19:54
Když to nejde, je tam málo izolepy.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.