Skocz do zawartości

Czas z dokładnością do 1/1000 sekundy. Top 10 czasów na scoreboard!


Rekomendowane odpowiedzi

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.

Spoiler

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}
	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::*}
	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%":
		if {_n.1} is "%player%":
			send "&6Ustanowiles swoj najlepszy personalny rekord"
			broadcast "&3%player% &6ustanowil nowy rekord z czasem &3%({_time} / 1000)% sekund&6!"
		display board named "&3TOP10" to player
		if {_v.1} is set:
			set {_v.1} to {_v.1} parsed as number				
			make score "%({_v.1} / 1000)% &e%{skrypt::nick::%{_n.1}%}%" in board of player to -1
		if {_v.2} is set:
			set {_v.2} to {_v.2} parsed as number
			make score "%({_v.2} / 1000)% &7%{skrypt::nick::%{_n.2}%}%" in board of player to -2
		if {_v.3} is set:
			set {_v.3} to {_v.3} parsed as number
			make score "%({_v.3} / 1000)% &6%{skrypt::nick::%{_n.3}%}%" in board of player to -3
		if {_v.4} is set:
			set {_v.4} to {_v.4} parsed as number
			make score "%({_v.4} / 1000)% %{skrypt::nick::%{_n.4}%}%" in board of player to -4
		if {_v.5} is set:
			set {_v.5} to {_v.5} parsed as number
			make score "%({_v.5} / 1000)% %{skrypt::nick::%{_n.5}%}%" in board of player to -5
		if {_v.6} is set:
			set {_v.6} to {_v.6} parsed as number
			make score "%({_v.6} / 1000)% %{skrypt::nick::%{_n.6}%}%" in board of player to -6
		if {_v.7} is set:	
			set {_v.7} to {_v.7} parsed as number
			make score "%({_v.7} / 1000)% %{skrypt::nick::%{_n.7}%}%" in board of player to -7
		if {_v.8} is set:
			set {_v.8} to {_v.8} parsed as number
			make score "%({_v.8} / 1000)% %{skrypt::nick::%{_n.8}%}%" in board of player to -8
		if {_v.9} is set:
			set {_v.9} to {_v.9} parsed as number
			make score "%({_v.9} / 1000)% %{skrypt::nick::%{_n.9}%}%" in board of player to -9
		if {_v.10} is set:
			set {_v.10} to {_v.10} parsed as number
			make score "%({_v.10} / 1000)% %{skrypt::nick::%{_n.10}%}%" in board of player to -10
		move display of player to sidebar
		wait 1 tick
	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%}

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.

Spoiler

	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%":
		if {_n.1} is "%player%":
			send "&6Ustanowiles swoj najlepszy personalny rekord"
			broadcast "&3%player% &6ustanowil nowy rekord z czasem &3%({_time} / 1000)% sekund&6!"
		display board named "&3TOP10" to player
		if {_v.1} is set:
			set {_v.1} to {_v.1} parsed as number				
			make score "%({_v.1} / 1000)% &e%{skrypt::nick::%{_n.1}%}%" in board of player to -1
		if {_v.2} is set:
			set {_v.2} to {_v.2} parsed as number
			make score "%({_v.2} / 1000)% &7%{skrypt::nick::%{_n.2}%}%" in board of player to -2
		if {_v.3} is set:
			set {_v.3} to {_v.3} parsed as number
			make score "%({_v.3} / 1000)% &6%{skrypt::nick::%{_n.3}%}%" in board of player to -3
		if {_v.4} is set:
			set {_v.4} to {_v.4} parsed as number
			make score "%({_v.4} / 1000)% %{skrypt::nick::%{_n.4}%}%" in board of player to -4
		if {_v.5} is set:
			set {_v.5} to {_v.5} parsed as number
			make score "%({_v.5} / 1000)% %{skrypt::nick::%{_n.5}%}%" in board of player to -5
		if {_v.6} is set:
			set {_v.6} to {_v.6} parsed as number
			make score "%({_v.6} / 1000)% %{skrypt::nick::%{_n.6}%}%" in board of player to -6
		if {_v.7} is set:	
			set {_v.7} to {_v.7} parsed as number
			make score "%({_v.7} / 1000)% %{skrypt::nick::%{_n.7}%}%" in board of player to -7
		if {_v.8} is set:
			set {_v.8} to {_v.8} parsed as number
			make score "%({_v.8} / 1000)% %{skrypt::nick::%{_n.8}%}%" in board of player to -8
		if {_v.9} is set:
			set {_v.9} to {_v.9} parsed as number
			make score "%({_v.9} / 1000)% %{skrypt::nick::%{_n.9}%}%" in board of player to -9
		if {_v.10} is set:
			set {_v.10} to {_v.10} parsed as number
			make score "%({_v.10} / 1000)% %{skrypt::nick::%{_n.10}%}%" in board of player to -10
		move display of player to sidebar
		wait 1 tick
	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%}

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

Spoiler

		display board named "&3TOP10" to player
		if {_v.1} is set:
			set {_v.1} to {_v.1} parsed as number				
			make score "%({_v.1} / 1000)% &e%{skrypt::nick::%{_n.1}%}%" in board of player to -1
		if {_v.2} is set:
			set {_v.2} to {_v.2} parsed as number
			make score "%({_v.2} / 1000)% &7%{skrypt::nick::%{_n.2}%}%" in board of player to -2
		if {_v.3} is set:
			set {_v.3} to {_v.3} parsed as number
			make score "%({_v.3} / 1000)% &6%{skrypt::nick::%{_n.3}%}%" in board of player to -3
		if {_v.4} is set:
			set {_v.4} to {_v.4} parsed as number
			make score "%({_v.4} / 1000)% %{skrypt::nick::%{_n.4}%}%" in board of player to -4
		if {_v.5} is set:
			set {_v.5} to {_v.5} parsed as number
			make score "%({_v.5} / 1000)% %{skrypt::nick::%{_n.5}%}%" in board of player to -5
		if {_v.6} is set:
			set {_v.6} to {_v.6} parsed as number
			make score "%({_v.6} / 1000)% %{skrypt::nick::%{_n.6}%}%" in board of player to -6
		if {_v.7} is set:	
			set {_v.7} to {_v.7} parsed as number
			make score "%({_v.7} / 1000)% %{skrypt::nick::%{_n.7}%}%" in board of player to -7
		if {_v.8} is set:
			set {_v.8} to {_v.8} parsed as number
			make score "%({_v.8} / 1000)% %{skrypt::nick::%{_n.8}%}%" in board of player to -8
		if {_v.9} is set:
			set {_v.9} to {_v.9} parsed as number
			make score "%({_v.9} / 1000)% %{skrypt::nick::%{_n.9}%}%" in board of player to -9
		if {_v.10} is set:
			set {_v.10} to {_v.10} parsed as number
			make score "%({_v.10} / 1000)% %{skrypt::nick::%{_n.10}%}%" in board of player to -10
		move display of player to sidebar

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:

maxresdefault.jpg

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

Odnośnik do komentarza
https://skript.pl/temat/11650-czas-z-dok%C5%82adno%C5%9Bci%C4%85-do-11000-sekundy-top-10-czas%C3%B3w-na-scoreboard/
Udostępnij na innych stronach

  • 1 miesiąc temu...
  • Norbi zmienił(a) tytuł na Czas z dokładnością do 1/1000 sekundy. Top 10 czasów na scoreboard!
  • Szifter zablokował(a) ten temat
Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...