Skocz do zawartości
MPspot
TheSrebrny80pl

Poradnik jak pisać skrypty !!!

Recommended Posts

NAJWAŻNIEJSZE za nim zaczniesz przygodę ze skryptami :D

  • Skript - nazwa własna pluginu, w którym pisze się SKRYPTY
  • skrypt - kod zapisany w języku pluginu Skript
  • script - angielskie słowo, odpowiednik słowa skrypt w języku polskim

Co to jest Skript?

Wtyczka Skript pozwala nam na bardzo proste tworzenie dodatków na swój serwer minecraft. Nie musimy znać żadnego języku programowania, lecz jakakolwiek wcześniejsza wiedza na temat C++/ Javy nam nie zaszkodzi, a wręcz pomoże zrozumieć funkcje pluginu. Przyda nam się także dobra znajomość języka angielskiego/ niemieckiego, ponieważ wszystkie zdarzenia, efekty, warunki opierają się na tych językach.

O co chodzi?
SSCC "Standard Skript Code Conventions" jest zestawem reguł pisania skryptów stworzonym przez destroyer'a4017.
Określa on styl kodowania, który zapewnia kompatybilność z innymi skryptami, łatwość utrzymania/modyfikowania kodu oraz sprawia, że skrypt jest prosty do odczytania.

Nazwy plików
Nazwy plików kończących się na ".sk" nie powinny zawierać następujących znaków:

  • #
  • `
  • $
  • %
  • {
  • }
  • (spacji)


     
  •  

Jeśli w nazwie chcesz zawrzeć wersję skryptu powinna ona znaleźć się na końcu, za nazwą skryptu: skrewards-v1.2.3.sk

Nazwy zmiennych
Poniższe zasady odnoszą się tylko do zmiennych globalnych, nie do lokalnych (zaczynających się od _).

Nazwy zmiennych powinny być zapisane według konwencji camelCase, gdzie nie występują spacje oraz pierwsza litera każdego słowa (wyłączając pierwsze) zaczyna się z wielkiej litery.

Zmienne tworzone przez skrypt powinny być definiowane w sposób {<nazwa skryptu>::<nazwa zmiennej>}, co ułatwia usuwanie danych danego skryptu albo aktualizowanie zmiennych z wcześniejszej wersji skryptu, na przykład:

# Zamiast takiej zmiennej
{current.reward}
# Użyj następującego wzoru
{skrewards::currentReward}

Zmienne dynamiczne oraz listy powinny być stopniowane, co jest bardziej obiektowym podejściem i umożliwia zapętlanie danych.

# Zamiast takich zmiennych
{reward.level.modifier.1}
{reward.level.modifier.2}
{reward.level.modifier.3}
{rewardstatus.%player%}
{info.%player%.mined.diamonds}
{info.%player%.mined.emeralds}
# Użyj następujących wzorów
{skrewards::rewardLevelModifier::1}
{skrewards::rewardLevelModifier::2}
{skrewards::rewardLevelModifier:: 3}
{skrewards::rewardStatus::%player%}

{skrewards::info::%player%::minedDiamonds}
{skrewards::info::%player%::minedEmeralds}
# Lub
{skrewards::info::%player%::mined::diamonds}
{skrewards::info::%player%::mined::emeralds}

Jeśli piszesz API,  powinieneś wpisać dane do zarezerwowanych nazw zmiennych {<nazwa skryptu>::api::<output ID>}. Jeśli używasz skQuery, możesz zapisywać dane do tych zmiennych gdy podprogram/funkcja jest wykonywany/a. W zwykłym Skript powinieneś zdeklarować komendy możliwe do użycia tylko z konsoli, które wpisują dane do tych zmiennych. Schemat ten pozwala twórcom skryptów tworząc własny skrypt pozyskiwać informacje z innych. Jeśli Twój skrypt jest BIBLIOTEKĄ, której jedynym celem jest udostępnienie funkcji, należy wtedy pominąć fragment ::api i używać {<nazwa skryptu>::<output ID>}. Zmienne API powinny być usunięte zawsze gdy serwer jest wyłączany.

Porządkowanie kodu
Stworzony kod musi być uporządkowany w określony sposób. Nie powinieneś wpisywać zdarzeń i komend w losowej kolejności; muszą być czytelnie oddzielone. Każdy z elementów może być pominięty, o ile są one w odpowiedniej kolejności.

  • script options (jeśli używasz skQuery)
  • aliasy [aliases:]
  • zmienne  [variables:]
  • opcje  [options:]
  • podprogramy/funkcje (jeśli używasz skQuery)
  • nowe komendy  [command /komenda:]
  • on script load:
  • on script unload:
  • okresowe zdarzenia (np. every 10 seconds, at 10:00)
  • inne zdarzenia


     
  •  

Zdarzenia i Warunki
Zdarzenia zawsze powinny zaczynać się od słówka "on", mimo, że będą działać bez niego. Kiedy tylko to możliwe, powinieneś unikać używania selektorów w linii definiującej zdarzenie, np.:
 

on right click with porkchop:
on left click on tnt:
on damage of cow:

Należy uogólnić takie zdarzenia i skorzystać z warunków:

on right click:
    if tool of player is porkchop:
# dalszy kod
on left click:
    if clicked block is tnt:
# dalszy kod
on damage:
    if victim is a cow:
# dalszy kod

Stosując warunki, NIGDY nie powtórzysz tego samego zdarzenia kilka razy w jednym skrypcie.
 
Warunki powinny ZAWSZE zaczynać się od słówka "if" i kończyć dwukropkiem. NIGDY nie używaj warunków bez wprowadzenia dalszego kodu do ich wnętrza. To pozwoli twórcom skryptów w łatwy sposób dodać kod przed i po warunku albo dodać "else:".

# Zamiast
on damage:
    if victim is a player:
        {skrewards::info::%victim%::isInvincible} is true
        cancel event
        set {skrewards::info::%victim%::isInvincible} to false
# Użyj takich warunków
on damage:
    if victim is a player:
        if {skrewards::info::%victim%::isInvincible} is true:
            cancel event
            set {skrewards::info::%victim%::isInvincible} to false

Specyfikacja Lambdy
Lambdy są nową funkcją skQuery i mogą być używane we wszystkich wersjach powyżej 1.17.0. Pozwalają sporą ilość kodu skompresować do kilku linii. 
Lambdy, tak długo jak długo będą używane rozsądnie, będą spełniać wymagania SSCC. Lambdy mogą być brane pod uwagę jeśli:

  • [*]Użyte są zamiast funkcji do wykonania POJEDYNCZEGO zadania [*]Użyte są do zaciemnienia kodu przez stworzenie bardzo skompresowanego kodu [*]Lepiej opisują ciąg zadań

Nie wystarczające wiadomości?

Funkcje

Możliwość tworzenia własnych funkcji w skryptach do tej pory oferowały tylko dodatki (WS i skQ).

Od momentu wydania developerskiej wersji Skript 2.2 można z nich korzystać bez żadnych dodatkowych pluginów.

Skąd wziąć Skript w wersji 2.2?

Najnowszą wersję Skript można pobrać stąd, warto też rozważyć skorzystanie z wersji zawierającej poprawki autorstwa Mirreducki'ego.

Składnia

Istnieją dwa podstawowe typy funkcji:

  • taka, która coś zwraca, jakąś wartość,
  • oraz taka, która tylko wykonuje kod i nie zwraca żadnej wartości.
# Funkcja, która zwraca wartość
function nazwa_funkcji(nazwa_argumentu: %typ_argumentu%, ...) :: %typ_zwracanej_wartości%:
	# kod_funkcji
	return %coś%

# Funkcja, która tylko wykonuje swój kod i nie zwraca żadnej wartości
function nazwa_funkcji(nazwa_argumentu: %typ_argumentu%, ...):
	# kod_funkcji

Argumenty są opcjonalne, można ich użyć ale nie trzeba.

Definiowanie obydwu rodzaji funkcji zaczynamy od słowa kluczowego function, następnie po spacji podajemy nazwę, z której bedziemy później korzystać aby wywołać naszą funkcję. Po tym w nawiasach podajemy argumenty, jeśli nasza funkcja nie będzie z nich korzystać należy wstawić tylko nawiasy (). Argumenty podajemy według wzoru: nazwa: %typ%, np. gracz: player albo p: player, w: world. W przypadku funkcji zwracającej jakąś wartość trzeba w tym momencie podać typ tej wartości (np. number, text, player, location). Na końcu linijki definniującej funkcję należy umieścić dwukropek, a następne linijki (kod funkcji) wciąć o jedną jednostkę.

Podając liczbę mnogą typu argumentu (np. players, entities, worlds) umożliwimy sobie podawanie wielu wartości (o podanmy typie). Tak samo sprawa ma się w przypadku typu zwracanej wartości, gdy podamy jego liczbę mnogą będziemy mogli zwracać listy wartości. Np. function podpal(g: players): function ktoWygral(mecz: text) :: players:.

Argumenty

Wiesz już jak zdefiniować argumenty, teraz czas nauczyć się z nich korzystac. Jest to naprawdę proste. W kodzie naszej funkcji odwołujemy się poprostu do zmiennych lokalnych (zaczynających się od znaku _) o takich nazwach jak podane argumenty.

# np.
function dajDiamenta(gracz: player):
	give 1 diamond to {_gracz}

Korzystanie z funkcji

Gdy już zdefiniowaliśmy naszą funkcję przyszedł czas aby ją wykorzystać.

# np.
command /daj:
	trigger:
		dajDiamenta(player)
		send "Oto twój diament :)"

Jeśli nasza funkcja zwraca jakąś wartość to możemy ją np. zapisać do zmiennej.

command /punkty:
	trigger:
		set {_punkty} to ileMaPunktow(player)
		send "&eMasz &6%{_punkty}% &epunktow."

Definicja funkcji nie musi być w pliku, w którym z niej korzystamy. Funkcje zdefiniowane w jednym skrypcie będziemy mogli używać w każdym innym.

Jak znajdę chwilę czasu to dodam tu jeszcze kilka przykładowych funkcji.

function dodajWarpa(nazwa: text, lokacja: location) :: boolean:
	if {warpy::%{_nazwa}%} is set:
		return false
	else:
		set {warpy::%{_nazwa}%} to {_lokacja}
		return true

ZAPISYWANIE I USUWANIE:

1) Pojedyncza wartość:

Kod wygląda tak:

set yaml value "nazwa" from file "plik.yml" to "wartosc"

Sk sam stworzy dany plik, jednak stanie się to w folderze scripts.

A co jeśli chcemy zrobić to w "plugins" ? Musimy dodać do ścieżki pliku "../" spowoduje to "przejście" o folder wyżej, czyli:

set yaml value "nazwa" from file "../../plik.yml" to "wartosc"

Powyższy kod stworzy plik "plik.yml" w folderze "plugins". Wyglądał on będzie tak: 

nazwa: wartosc

Czasami potrzebujemy jednak zrobić coś w stylu:

nazwa:
  nazwa1:
    nazwa2: wartosc

Czyli takie "drzewko". Wtedy dodajemy "." pomiędzy nazwami czyli:

set yaml value "nazwa.nazwa1.nazwa2" from file "../../plik.yml" to "wartosc"

Aby usunąć:

delete yaml value "wartosc" from file "plik.yml"

2) Lista:

Kod do stworzenia listy:

add "wartosc1" to yaml list "nazwalisty" from file "../../plik.yml"

Stworzy to nam takie coś:

nazwalisty:
- wartosc1

Jeśli chcemy dodać klika wartości po prostu robimy to samo, tylko zmieniamy wartość.

Więc kod:

add "wartosc1" to yaml list "nazwalisty" from file "../../plik.yml"
add "wartosc2" to yaml list "nazwalisty" from file "../../plik.yml"
add "wartosc3" to yaml list "nazwalisty" from file "../../plik.yml"
add "wartosc4" to yaml list "nazwalisty" from file "../../plik.yml"

Stworzy nam:

nazwalisty:
- wartosc1
- wartosc2
- wartosc3
- wartosc4

Oczywiście jeśli chcemy zrobić "drzewko", tak samo jak na początku, dodajemy ",".

Aby usunąć:

remove "wartosc" from yaml list "lista" from file "plik.yml"

ODCZYTYWANIE:

1) Pojedyncza wartość:

Odczytujemy to kodem:

set {zmienna} to yaml value "nazwa" from file "../../plik.yml"

Zmienną tą możemy potem dowolnie użyć:

send "%{zmienna}%"

Możemy używać też bez zmiennych:

send "%yaml value ""nazwa"" from file ""../../plik.yml""%"

2) Lista:

Listy odczytujemy kodem:

set {lista::*} to yaml list "nazwalisty" from file "../../plik.yml"

Również listy możemy użyć bez zmiennych:

send "%yaml list ""nazwalisty"" from file ""../../plik.yml""%"

I to jest już koniec tego poradnika :D

Pomogłem? daj repke !

- Pozdrawiam Srebrny80pl

Udostępnij tego posta


Odnośnik do posta
Udostępnij na stronach

Żeby dodać komentarz, musisz założyć konto lub zalogować się

Tylko zarejestrowani użytkownicy mogą dodawać komentarze

Dodaj konto

Załóż nowe konto. To bardzo proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz już konto? Zaloguj się tutaj.

Zaloguj się teraz

×