Ten poradnik powinien powstać już dawno temu, gdyż forum było zalewane tego typu pytaniami (odnośnie skryptów na parkour), ale przedstawię go teraz . Zaznaczam, że poradnik jest dla średnio-zaawansowanych skrypterów i nie wyjaśniam większości rzeczy, które powinien owy skrypter rozumieć.
MIERZENIE CZASU
Na samym początku musimy wiedzieć, że liczenie czasu w Skript z dokładnością do jednej tysięcznej sekundy można zrobić, lecz będzie to bardzo, ale to bardzo lagujące a do tego potrzebna będzie dodatkowa zmienną, która nic nie zmieni ale dużo osób ceni w skryptach jak najmniejszą ilość owych zmiennych
while {zmienna} is true:
wait 0.001 seconds
add 0.001 to {zmienna od czasu %player%}
W kodzie tym widzimy po prostu śmietnik, lagujący śmietnik
Dlatego też wraz z moim (byłym) przyjacielem przygotowałem specjalny addon mojego autorstwa - ,"Nawo" który liczy czas. Jak to działa? W skrypcie dajemy kod, który powoduje, że addon zapisze czas w jakim zostanie on wywołany do zmiennej - wygląda to tak:
set {skrypt::%player%::time::start} to now in millis
Musimy też zapisać do zmiennej czas w jakim chcemy przestać go liczyć, a robi się to tak:
set {skrypt::%player%::time::end} to now in millis
Dodatek do tych zmiennych zapisuje czas w liczbach naturalnych, później trzeba go obliczyć co się robi w ten sposób:
set {_time} to converted time {skrypt::%player%::time::start} and {skrypt::%player%::time::end}
Zwróćcie uwagę na zmienne w powyższym kodzie,
Teraz natomiast zapisujemy ten czas jako numer co nie jest konieczne lecz czemu nie
set {_time} to {_time} parsed as number
Takim sposobem mamy już nasz czas wyrażony w liczbie naturalnej (bez przecinka) i wystarczy go podzielić przez 1000, lecz Skript nie zaakceptuje 3 miejsc po przecinku więc musimy wejść do konfiguracji
Wchodzimy w config skripta i szukamy number accuracy: 1 w moim przypadku jest to linia 122.
Teraz zmieniamy tą wartość na number accuracy: 3
Wszystko gotowe!
TWORZENIE TOP 10 NA SCOREBOARD
Koniec zabawy, czas na prawdziwy hardkor! Zobaczycie teraz gotowy kod a poniżej objaśnienie.
Zacznijmy od pierwszych linii kodu, a dokładnie od 1 do 4. Służą one kolejno do sprawdzania czy zmienna przechowująca najlepszy czas gracza ma wartość, a jeżeli nie to nadaje mu tą wartość jak największą (musimy pamiętać, że wszystkie zmienne mają wartości w milisekundach, czyli nie mają przecinka), kolejne dwie linie sprawdzają czy obliczony czas z pierwszej części tego poradnika jest mniejszy od aktualnie najlepszego (najmniejszego) czasu gracza ze zmiennej {skrypt::top::%player%}
if {skrypt::top::%player%} is not set:
set {skrypt::top::%player%} to 9999999
if {_time} is less than {skrypt::top::%player%}:
set {skrypt::top::%player%} to {_time}
Kolejne linie (od 5 do 14) to zwykłe sortowanie zmiennych z poradnika @piratjsk z tym, że kod jest uproszczony a zamiast sortować od najmniejszego do największego - robi to na odwrót.
set {_num} to size of {skrypt::top::*}
loop {_num} times:
loop {skrypt::top::*}:
if {_v.%loop-number%} is not set:
set {_v.%loop-number%} to loop-value
set {_n.%loop-number%} to loop-index
if loop-value is less than {_v.%loop-number%}:
set {_v.%loop-number%} to loop-value
set {_n.%loop-number%} to loop-index
remove {_v.%loop-number%} from {skrypt::top::*}
Teraz zaczyna się część odpowiedzialna za wyświetlanie czasu.
zmienne wartości (np {_v.1} to najmniejsza wartość a {_v.10} to największa, oczywiście w top10) są odpowiedzialne za przechowywanie czasów, natomiast zmienne od nick'ów graczy to {_n.1} do {_n.10}
W takim razie co robi zmienna {skrypt::nick::%{_n.4}%} ? A no przechowuje nazwy graczy z wyświetlaniem też dużych liter. Aby to działało należy w swoim skrypcie umieścić następujący kod:
on join:
set {skrypt::nick::%player%} to uncolored nickname of player
Zmienne mamy już omówione, czas na omówienie mechaniki
if {_n.1} or {_n.2} or {_n.3} or {_n.4} or {_n.5} or {_n.6} or {_n.7} or {_n.8} or {_n.9} or {_n.10} is "%player%":
sprawdza, czy gracz kwalifikuje się do top 10 (czy pobił kogoś kto był w topce)
if {_n.1} is "%player%":
send "&6Ustanowiles swoj najlepszy personalny rekord"
broadcast "&3%player% &6ustanowil nowy rekord z czasem &3%({_time} / 1000)% sekund&6!"
sprawdza, czy gracz ustanowił najlepszy czas - a jeżeli tak to wysyła wiadomości rodem z serwera XamJump
Wyświetla scoreboard, omówmy sobie to trochę:
Kod ten po kolei wyświetla kolejne linie top, jeżeli są one dostępne if {_v.1} is set itp, a jeżeli tak to zapisuje te zmienne wartości jako numer set {_v.1} to {_v.1} parsed as number (na wszelki wypadek) a następnie wyświetla wynik dzieląc go przez 1000 (trzeba stosować dzielenie czasu przez 1000 przy każdym wyświetlaniu go w wiadomości czy na bossbarze etc)
else:
send "&6Ustanowiles swoj najlepszy rekord z czasem &3%({_time} / 1000)% sekund&6!"
loop {_num} times:
set {skrypt::top::%{_n.%loop-number%}%} to {_v.%loop-number%}
Na końcu kod, który wyświetla wiadomość o pobiciu swojego rekordu gdy czas gracza nie kwalifikuje się do top10 a także przywracanie każdemu graczowi zmiennych najlepszego czasu, które zostały usunięte podczas sortowania zmiennych
Gotowa topka wygląda tak:
To tyle, po prostu trzeba to zrozumieć, możliwości są nieograniczone, ja podałem tylko przykładowe zmienne, przykładowe wiadomości i wszystko inne... Możemy zrobić top20, top15, wyświetlać poszczególne wiadomości dla zajęcia poszczególnego miejsca, całkowicie zmienić wygląd tego scoreboardu etc... Wystarczy tylko zrozumieć mój sposób i pokombinować
DODATEK "NAWO"
LINK DO DODATKU SKAN