Skocz do zawartości
  • 0

Zmienna/Lista na czas ?


DirtyHeroine

Pytanie

Witam, nie mam kompletnie pojęcia jak opiąć swój kod w czasówkę. Czyli .. tworzy mi się coś co po na przykład 30 minutach znika.


Moje:

command /naznacz <player>:
  trigger:
  	if player is arg-1:
  		send "nie możesz siebie naznaczyć"
  	else:
  		send "naznaczony gracz %arg-1%"
  		set {naznaczeni::%arg-1%} to 1
  		stop
  

Mam po "SET" dopisać wait X tick?

Odnośnik do komentarza
https://skript.pl/temat/44516-zmiennalista-na-czas/
Udostępnij na innych stronach

13 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0
3 godziny temu, DirtyHeroine napisał:

Witam, nie mam kompletnie pojęcia jak opiąć swój kod w czasówkę. Czyli .. tworzy mi się coś co po na przykład 30 minutach znika.

Oczywiście możesz użyć delayu w postaci 'wait 30 minutes' i będzie to najprostsze rozwiązanie, ale jednocześnie będzie najgorsze z kilku powodów:

  • jeżeli serwer zostanie wyłączony w ciągu tych 30 minut, ten delay zostanie wyczyszczony, co spowoduje, że kod po tym delayu nigdy się nie wydarzy
  • jeżeli ktoś wykona kilkukrotnie tę komendę, zostanie utworzone kilka delayów 30-minutowych, a przypominam, że delayu NIE DA się zatrzymać/wyczyścić bez wyłączenia serwera; tak więc jeżeli 6 razy wpiszesz komendę w 5-minutowych odstępach czasowych, Skript będzie próbował wykonać 6 razy ten kod po delayu w 5-minutowych odstępach

Jaka jest moja propozycja rozwiązania? Użyć zmiennej globalnej (z zagnieżdżonym playerem w jej nazwie (%player%)), w której przykładowo zapisujemy ilość minut (prostą liczbę 30) i następnie zmniejszamy jej wartość co minutę w jakimś periodicalu. Dzięki temu nawet jeżeli serwer zostanie wyłączony, nie musisz martwić się o to, że twój kod po ustawianiu zmiennej szlag trafi.

Odnośnik do komentarza
https://skript.pl/temat/44516-zmiennalista-na-czas/#findComment-279273
Udostępnij na innych stronach

  • 0

Mam inny pomysł.
Dodałbym jeszcze jedną zmienną do tabelki :

 

{naznaczeni::%arg-1%::zmienna2}

i przypisywałbym do niej coś na zasadzie time stampla. Tylko powiedzcie mi  jak to zrobić :D na przykład podczas wykonywania mam coś na zasadzie {_zmienna2} == czas z teraz(nie wiem jak to zapisać). {_zmienna2} + 30minut. Zapisz (powyższa tabelka) .
a potem dodaje tylko coś na kształt every 5 min : loop {naznaczeni::zmienna2} if czas teraz > zmienna 2 : usuń. 

Zrozumiale napisałem ? :D

Moim zdaniem to jest najoptymalniejsze dla serwera

Edytowane przez xNightPower_
Nieaktywny

Umieszczam kod w code, naprawiam formatowanie na ciemnym stylu.

Odnośnik do komentarza
https://skript.pl/temat/44516-zmiennalista-na-czas/#findComment-279816
Udostępnij na innych stronach

  • 0

Do zmiennych czasu możesz robić to tak:

set {_zmienna} to now #ustawia zmienną na teraz (np. data i 18:14)
add 30 minutes do {_zmienna} #dodaje 30 minut do zmiennej (np. data i 18:44)

Jeśli chcesz to możesz dodać sprawdzanie, czy różnica między czasem wykonania komendy (w tym przypadku {_zmienna}) a czasem aktualnym jest większa od 30 minut

if {_zmienna} is set:
	if difference between now and {_zmienna} >= 30 minutes: #gdy ta różnica jest większa lub równa 30 minut
		#kod	

 

Tutaj nie nada się zmienna tymczasowa (ta z _ w nazwie), bo usuwa się ona po zakończeniu wykonywania eventu/komendy. Użyj innej i przypisz do niej czas i potem co np. minutę (jeśli ten czas 30 minut nie jest bardzo ważny i może wynosić np. 33 minuty) to możesz sprawdzać co np. 3 lub 5 minut. Potem (jeśli warunek się sprawdzi) nie zapomnij wyczyścić zmiennej, żeby nie wykonywać ciągle tego. 

delete {zmienna} #usuwa zmienną

 

Edytowane przez CoFFeIN04
Odnośnik do komentarza
https://skript.pl/temat/44516-zmiennalista-na-czas/#findComment-279820
Udostępnij na innych stronach

  • 0

Dobra, stworzyłbym przykładową komendę:

evry 5 minutes:
	loop {listaczasu::*}:
		if difference between now and loop-value >= 30 minutes:
			delete {listaczasu::loop-index}
		
command /ustawmnie:
	set {_zmienna} to now
	set {listaczasu::%player%} to {_zmienna}

O coś takiego mi chodzi, będzie działać?

Odnośnik do komentarza
https://skript.pl/temat/44516-zmiennalista-na-czas/#findComment-284930
Udostępnij na innych stronach

  • 0
5 minut temu, DirtyHeroine napisał:

Dobra, stworzyłbym przykładową komendę:



evry 5 minutes:
	loop {listaczasu::*}:
		if difference between now and loop-value >= 30 minutes:
			delete {listaczasu::loop-index}
		
command /ustawmnie:
	set {_zmienna} to now
	set {listaczasu::%player%} to {_zmienna}

O coś takiego mi chodzi, będzie działać?

Nie zadziała z kilku powodów: 

  • Nie dałeś 'loop-index' w procenty.
  • Masz literówkę w 'evry 5 minutes'.

Poza tym dlaczego od razu nie ustawisz zmiennej jako 'now'?

Edytowane przez Kormic
Odnośnik do komentarza
https://skript.pl/temat/44516-zmiennalista-na-czas/#findComment-284932
Udostępnij na innych stronach

  • 0
3 minuty temu, Kormic napisał:

Nie zadziała z kilku powodów: 

  • Nie dałeś 'loop-index' w procenty.
  • Masz literówkę w 'evry 5 minutes'.

Poza tym dlaczego od razu nie ustawisz zmiennej jako 'now'?

1. procenty?
2. literówkę już poprawiłem w kodzie, nie przyczepiajmy się do takich rzeczy tylko do logiki kodu proszę.

W sumie racja , dobra optymalizacja :D po co w ogóle tworzyć zmienną :D

Odnośnik do komentarza
https://skript.pl/temat/44516-zmiennalista-na-czas/#findComment-284935
Udostępnij na innych stronach

  • 0
1 minutę temu, DirtyHeroine napisał:

1. procenty?
2. literówkę już poprawiłem w kodzie, nie przyczepiajmy się do takich rzeczy tylko do logiki kodu proszę.

W sumie racja , dobra optymalizacja :D po co w ogóle tworzyć zmienną :D

1. Musisz zagnieździć wartość 'loop-index' w zmiennej, dlatego też musisz użyć procentów. Mówię o 4. linijce.

2. Pytałeś czy to zadziała, więc odpowiedziałem dlaczego nie zadziała. Proste.

Odnośnik do komentarza
https://skript.pl/temat/44516-zmiennalista-na-czas/#findComment-284937
Udostępnij na innych stronach

  • 0

Kombinuję i dalej mi to nie działa :(
            

every 10 seconds:
	send "Sprawdzenie co 10 sekund" to all players
	if {listaczasu::*} is greater than 0:
		loop {listaczasu::*}:
			send loop-index to all players
			send loop-value to all players
			# set {_z} to loop-value
			# send loop-index to all players
			# if difference between now and {_z} >= 1 minute:
				# delete {listaczasu::%loop-index%}
		
command /ustawmnie:
	trigger:
		set {listaczasu::%player%} to now
command /tajm:
	trigger:
		loop {listaczasu::*}:
			send loop-index to player
			

 

HELP! :( ... od ifa w "co 10 sekund" nie działa.. komendy działają

Odnośnik do komentarza
https://skript.pl/temat/44516-zmiennalista-na-czas/#findComment-285136
Udostępnij na innych stronach

  • 0
10 minut temu, DirtyHeroine napisał:

Kombinuję i dalej mi to nie działa :(
            



every 10 seconds:
	send "Sprawdzenie co 10 sekund" to all players
	if {listaczasu::*} is greater than 0:
		loop {listaczasu::*}:
			send loop-index to all players
			send loop-value to all players
			# set {_z} to loop-value
			# send loop-index to all players
			# if difference between now and {_z} >= 1 minute:
				# delete {listaczasu::%loop-index%}
		
command /ustawmnie:
	trigger:
		set {listaczasu::%player%} to now
command /tajm:
	trigger:
		loop {listaczasu::*}:
			send loop-index to player
			

 

HELP! :( ... od ifa w "co 10 sekund" nie działa.. komendy działają

A co ten warunek ma sprawdzać? Jak na razie nie ma on najmniejszego sensu.

EDIT:

Jeżeli ma sprawdzać rozmiar listy, użyj 'size of {listaczasu::*}'.

Edytowane przez Kormic
Odnośnik do komentarza
https://skript.pl/temat/44516-zmiennalista-na-czas/#findComment-285140
Udostępnij na innych stronach

  • 0

Nie pomagasz 🤣 

Okej wymyśliłem sobie coś takiego:

every 10 seconds:
	send "[dev] OUT>> Sprawdzenie co 10 sekund" to all players
	loop {listaczasu::*}:
		send "[dev] IN>> Sprawdzenie co 10 sekund" to all players
		send "%loop-index% + %loop-value%" to all players
		set {_z} to loop-value
		if difference between now and {_z} >= 1 minute:
			delete {listaczasu::%loop-index%}
			
# [DEV-COMMANDS]		
command /ustawmnie:
	trigger:
		set {listaczasu::%player%} to now
command /tajm:
	trigger:
		loop {listaczasu::*}:
			send "kto:  %loop-index% czas: %loop-value%" to player

Działa :D sprawdzone :D teraz tylko idee przenieść do głównego większego kodu i git :D

A warunek miał pomijać pętlę jeśli nie ma listy, i tam miałem jeszcze senda jednego na sprawdzenie czy mi kod idzie dalej. Ogólnie to co tu piszę to bardziej developerski kod, ulega zmianie cały czas dlatego czasem są rzeczy niepotrzebne lub chaotyczne. Aczkolwiek idea i funkcjonalność jest zachowana. Robiłem też odwrotnie z loop all players ale to wychodziło bez sensu etc. a tu mogę odwołać się teraz do czasu w zmiennej i jeszcze pokombinuje nad operacjami na niej by wyświetlać tekst typu ZOSTAŁO 20 SEKUND DO WYGAŚNIĘCIA

Okej zamykam :D Rozwiązane :D

Odnośnik do komentarza
https://skript.pl/temat/44516-zmiennalista-na-czas/#findComment-285154
Udostępnij na innych stronach

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