Skocz do zawartości
  • 0

Zaokrąglanie liczb


MrWinex66

Pytanie

Witam,

mam skrypt, którego zadanie jest zmienić czas na dzień, jeśli położy się 50% lub więcej graczy serwera. Skrypt jest pisany na serwer, na którym raczej najczęściej liczba graczy nie przekracza 9, i tutaj pojawia się problem, ponieważ przy np. 5 czy 3 graczach online skrypt wariuje. Na chacie pojawiają się komunikaty takie, jak "potrzeba jeszcze 8 graczy (mimo, że na serwerze grają 4 osoby) aby zmienić dzień", albo "potrzeba jeszcze -2 graczy, aby zmienić dzień". Sama zmiana dnia również nie zawsze wydaje się następować "poprawnie". 

Próbowałem użyć kilku funkcji zaokrąglających liczby, ale niestety niezbyt to pomogło.

W jaki sposób to poprawić (a także zapobiec wyświetlaniu się kolejnej wiadomości, gdy wszyscy potrzebni do zmiany dnia gracze się położą - jeśli skrypt działał normalnie, przy ostatniej osobie wyświetla się "potrzeba jeszcze 0 osób..."?

Dziękuję za pomoc :)

 

Edytowane przez MrWinex66
Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/
Udostępnij na innych stronach

Rekomendowane odpowiedzi

  • 0
9 minut temu, MrWinex66 napisał:

Witam,

mam skrypt, którego zadanie jest zmienić czas na dzień, jeśli położy się 50% lub więcej graczy serwera. Skrypt jest pisany na serwer, na którym raczej najczęściej liczba graczy nie przekracza 9, i tutaj pojawia się problem, ponieważ przy np. 5 czy 3 graczach online skrypt wariuje. Na chacie pojawiają się komunikaty takie, jak "potrzeba jeszcze 8 graczy (mimo, że na serwerze grają 4 osoby) aby zmienić dzień", albo "potrzeba jeszcze -2 graczy, aby zmienić dzień". Sama zmiana dnia również nie zawsze wydaje się następować "poprawnie". 

Próbowałem użyć kilku funkcji zaokrąglających liczby, ale niestety niezbyt to pomogło.

W jaki sposób to poprawić (a także zapobiec wyświetlaniu się kolejnej wiadomości, gdy wszyscy potrzebni do zmiany dnia gracze się położą? Gdy skrypt działa normalnie, przy ostatniej osobie wyświetla się "potrzeba jeszcze 0 osób..."?

Dziękuję za pomoc :)

 

Nie wiem po co w ogóle sprawdzasz drugi warunek, skoro pierwszy już sprawdza czy wartość jest wyższa bądź równa. Świat gracza sprawdzaj poprzez 'if player is in world "world"'.

Spróbuj z tym kodem:

on load:
	set {sleepnumber} to 0
	
on bed enter:
	if number of all players is greater than 1:
		if player is in world "world":
			add 1 to {sleepnumber}
			set {_wymagani} to (number of all players / 2) - {sleepnumber}
			broadcast "&4%player%&c położył się spać. Potrzeba jeszcze &4%{_wymagani}% &cgraczy, by nastał dzień."
			set {_num} to (number of all players / 2)
			if {sleepnumber} is greater than or equal to {_num}:
				wait 1 seconds
				set time in world to 06:00
				set {sleepnumber} to 0

EDIT:

Przy okazji przydałoby się, abyś dodał do tego kodu 'on bed leave:', gdyż tylko dodaje, a jak ktoś wyjdzie z łóżka to nie odejmuje.

Edytowane przez Kormic
Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258500
Udostępnij na innych stronach

  • 0
10 minut temu, Kormic napisał:

Przy okazji przydałoby się, abyś dodał do tego kodu 'on bed leave:'.

Wiem wiem, już dopisałem. Tutaj wkleiłem po prostu ten fragment skryptu, z którym mam problem.

11 minut temu, Kormic napisał:

Spróbuj z tym kodem:


on load:
	set {sleepnumber} to 0
	
on bed enter:
	if number of all players is greater than 1:
		if player is in world "world":
			add 1 to {sleepnumber}
			set {_wymagani} to (number of all players / 2) - {sleepnumber}
			broadcast "&4%player%&c położył się spać. Potrzeba jeszcze &4%{_wymagani}% &cgraczy, by nastał dzień."
			set {_num} to (number of all players / 2)
			if {sleepnumber} is greater than or equal to {_num}:
				wait 1 seconds
				set time in world to 06:00
				set {sleepnumber} to 0

 

Okej, tutaj dzień zmienia się już poprawnie, ale niestety dalej pojawiają się liczby "potrzeba jeszcze 0.5 gracza, aby zmienić dzień", albo "-0.5 gracza". Tutaj właśnie wcześniej testowałem z funkcjami zaokrąglającymi, ale wciąż niezbyt to pomagało. Chodzi mi o wyświetlanie się "pełnych" liczb, czyli np. przy 5 osobach online pierwsza się kładzie, to (jako, że połowa z 5 wynosi 2.5, zaokrąglamy do 3, bo skrypt wykona się dopiero, gdy położy się 3 graczy - 2.5 gracza raczej się nie położy ;) ) wyświetla się komunikat, że potrzeba jeszcze dwóch, aby zmienić dzień. Kładzie się druga - wyświetla się komunikat, że potrzebna jest jeszcze jedna, by zmienić dzień. Kładzie się i ta ostatnia - nie wyświetla się już nic (a przynajmniej żeby nie wyświetlało się, że potrzeba jeszcze 0 graczy).

Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258502
Udostępnij na innych stronach

  • 0
15 minut temu, MrWinex66 napisał:

Wiem wiem, już dopisałem. Tutaj wkleiłem po prostu ten fragment skryptu, z którym mam problem.

Okej, tutaj dzień zmienia się już poprawnie, ale niestety dalej pojawiają się liczby "potrzeba jeszcze 0.5 gracza, aby zmienić dzień", albo "-0.5 gracza". Tutaj właśnie wcześniej testowałem z funkcjami zaokrąglającymi, ale wciąż niezbyt to pomagało. Chodzi mi o wyświetlanie się "pełnych" liczb, czyli np. przy 5 osobach online pierwsza się kładzie, to (jako, że połowa z 5 wynosi 2.5, zaokrąglamy do 3, bo skrypt wykona się dopiero, gdy położy się 3 graczy - 2.5 gracza raczej się nie położy ;) ) wyświetla się komunikat, że potrzeba jeszcze dwóch, aby zmienić dzień. Kładzie się druga - wyświetla się komunikat, że potrzebna jest jeszcze jedna, by zmienić dzień. Kładzie się i ta ostatnia - nie wyświetla się już nic (a przynajmniej żeby nie wyświetlało się, że potrzeba jeszcze 0 graczy).

Aaa... dobra, wiem. Daj number of all players / 2 jako argument do funkcji ceil().

EDIT:

Postanowiłem pobawić się twoim kodem i coś takiego zmajstrowałem. Sprawdź czy wszystko poprawnie działa:

on load:
	set {sleepnumber} to 0
	
on bed enter:
	if number of all players is less than or equal to 1:
		stop
	if player isn't in world "world":
		stop
	add 1 to {sleepnumber}
	set {_num} to (number of all players / 2)
	set {_cnum} to ceil({_num})
	set {_wymagani} to {_cnum} - {sleepnumber}
	if {sleepnumber} is less than {_cnum}:
		broadcast "&4%player%&c położył się spać. Potrzeba jeszcze &4%{_wymagani}% &cgraczy, by nastał dzień."
	else:
		broadcast "&aWystarczająco dużo graczy położyło się do łóżek. Lada chwila nastanie dzień!"
		wait 1 seconds
		set time in world to 06:00
		set {sleepnumber} to 0
				
on bed leave:
	if number of all players is less than or equal to 1:
		stop
	if player isn't in world "world":
		stop
	remove 1 from {sleepnumber}

 

Edytowane przez Kormic
Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258503
Udostępnij na innych stronach

  • 0
27 minut temu, Kormic napisał:

Aaa... dobra, wiem. Daj number of all players / 2 jako argument do funkcji ceil().

EDIT:

Postanowiłem pobawić się twoim kodem i coś takiego zmajstrowałem. Sprawdź czy wszystko poprawnie działa:


on load:
	set {sleepnumber} to 0
	
on bed enter:
	if number of all players is less than or equal to 1:
		stop
	if player isn't in world "world":
		stop
	add 1 to {sleepnumber}
	set {_num} to (number of all players / 2)
	set {_cnum} to ceil({_num})
	set {_wymagani} to {_cnum} - {sleepnumber}
	if {sleepnumber} is less than {_cnum}:
		broadcast "&4%player%&c położył się spać. Potrzeba jeszcze &4%{_wymagani}% &cgraczy, by nastał dzień."
	else:
		broadcast "&aWystarczająco dużo graczy położyło się do łóżek. Lada chwila nastanie dzień!"
		wait 1 seconds
		set time in world to 06:00
		set {sleepnumber} to 0
				
on bed leave:
	if number of all players is less than or equal to 1:
		stop
	if player isn't in world "world":
		stop
	remove 1 from {sleepnumber}

 

Dziękuję :) Niestety, ale do ideału brakuje jeszcze jednego, ponieważ pojawił się dziwny błąd
Przy np. 3 graczach online, wszystko działa jak należy - musi położyć się dwóch graczy, wszystko wyświetla się na chacie tak jak trzeba.
Gdy jeden gracz wyjdzie, nagle (przy 2 graczach online) wyświetla się wiadomość, że do zmiany dnia potrzeba 3 (a po wejściu tamtego gracza, który wcześniej wyszedł, 4) graczy. I niestety, ale dzień również się nie zmienia.

Edytowane przez MrWinex66
Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258504
Udostępnij na innych stronach

  • 0
1 minutę temu, MrWinex66 napisał:

Dziękuję :) Niestety, ale do ideału brakuje jeszcze jednego, ponieważ pojawił się dziwny błąd
Przy np. 3 graczach online, wszystko działa jak należy - musi położyć się dwóch graczy, wszystko wyświetla się na chacie tak jak trzeba.
Gdy jeden gracz wyjdzie, nagle (przy 2 graczach online) wyświetla się wiadomość, że do zmiany dnia potrzeba 3 (a po wejściu tamtego gracza, który wcześniej wyszedł, 4) graczy. I niestety, ale dzień również się nie zmienia.

Wyjdzie będąc w łóżku czy gdy po prostu wyjdzie z serwera?

Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258505
Udostępnij na innych stronach

  • 0
Teraz, MrWinex66 napisał:

Po prostu wyjdzie z serwera, już po zmianie czasu na dzień

Podejrzewam, że błąd leży w funkcji ceil(). Spróbuj zamienić na round() i zobaczymy.

Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258507
Udostępnij na innych stronach

  • 0

Niestety, to samo

Tylko tym razem, gdy trzeci gracz się położy, rzeczywiście czas się zmieni. Na chacie dalej pojawia się, że wciąż potrzeba więcej graczy, niż w ogóle jest na serwerze

Edytowane przez MrWinex66
Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258508
Udostępnij na innych stronach

  • 0
11 minut temu, MrWinex66 napisał:

Niestety, to samo

Tylko tym razem, gdy trzeci gracz się położy, rzeczywiście czas się zmieni. Na chacie dalej pojawia się, że wciąż potrzeba więcej graczy, niż w ogóle jest na serwerze

Przeglądałem linijka po linijce i na moje oko nie ma błędu... Nie wiem, robiłem w głowie symulacje na przykładach i wszystko powinno być dobrze, a tutaj klops. Być może rano będę znał przyczynę chociaż szczerze w to wątpię. Jeśli nie będę wiedział, to mam nadzieję, że ktoś inny dostrzeże ewentualny błąd.

Jesteś pewien, że wszystko ładnie przeładowałeś i nikt nie spał w momencie przeładowania skryptu?

Edytowane przez Kormic
Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258509
Udostępnij na innych stronach

  • 0
11 godzin temu, MrWinex66 napisał:

Niestety, to samo

Tylko tym razem, gdy trzeci gracz się położy, rzeczywiście czas się zmieni. Na chacie dalej pojawia się, że wciąż potrzeba więcej graczy, niż w ogóle jest na serwerze

Poprawiłem skrypt, zobacz czy tym razem nic się nie będzie bugowało:

on load:
	set {sleepnumber} to 0
	
on bed enter:
	if number of all players is less than or equal to 1:
		stop
	if player isn't in world "world":
		stop
	add 1 to {sleepnumber}
	set {_num} to (number of all players / 2)
	set {_cnum} to round({_num})
	set {_wymagani} to {_cnum} - {sleepnumber}
	if {sleepnumber} is less than {_cnum}:
		broadcast "&4%player%&c położył się spać. Potrzeba jeszcze &4%{_wymagani}% &cgraczy, by nastał dzień."
	else:
		broadcast "&aWystarczająco dużo graczy położyło się do łóżek. Lada chwila nastanie dzień!"
		wait 1 seconds
		set time in world to 06:00
		set {sleepnumber} to 0
				
on bed leave:
	if number of all players is less than or equal to 1:
		stop
	if player isn't in world "world":
		stop
	remove 1 from {sleepnumber}

on disconnect:
	if player is not sleeping:
		stop
	remove 1 from {sleepnumber}

on join:
	if player is not sleeping:
		stop
	add 1 to {sleepnumber}

 

Edytowane przez Kormic
Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258567
Udostępnij na innych stronach

  • 0
on bed enter:
	set {_online} to number of all players
	loop all players:
		if loop-playe is sleeping:
			add 1 to {_sleeping}
	set {_proc} to ({_sleeping}/{_online})*100
	send "&7Gracz &6%player% &7polozyl sie spac &8(&6%{_proc}%%%&7/&650%%&8)"
	if {_proc} >= 50:
		set time in world to 06:00

 

Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258568
Udostępnij na innych stronach

  • 0
10 godzin temu, Kormic napisał:

Poprawiłem skrypt, zobacz czy tym razem nic się nie będzie bugowało:


on load:
	set {sleepnumber} to 0
	
on bed enter:
	if number of all players is less than or equal to 1:
		stop
	if player isn't in world "world":
		stop
	add 1 to {sleepnumber}
	set {_num} to (number of all players / 2)
	set {_cnum} to round({_num})
	set {_wymagani} to {_cnum} - {sleepnumber}
	if {sleepnumber} is less than {_cnum}:
		broadcast "&4%player%&c położył się spać. Potrzeba jeszcze &4%{_wymagani}% &cgraczy, by nastał dzień."
	else:
		broadcast "&aWystarczająco dużo graczy położyło się do łóżek. Lada chwila nastanie dzień!"
		wait 1 seconds
		set time in world to 06:00
		set {sleepnumber} to 0
				
on bed leave:
	if number of all players is less than or equal to 1:
		stop
	if player isn't in world "world":
		stop
	remove 1 from {sleepnumber}

on disconnect:
	if player is not sleeping:
		stop
	remove 1 from {sleepnumber}

on join:
	if player is not sleeping:
		stop
	add 1 to {sleepnumber}

 

Niestety, dalej to samo. Pomyslalem o dodaniu "execute console command "/skript reload <nazwa>", bo po reloadzie skrypt wraca "do działania", ale niestety -  magicznie ta komenda naprawi działanie tylko, jeśli zostanie wpisana przez gracza, a nie z konsoli :kappalul:

Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258689
Udostępnij na innych stronach

  • 0
1 minutę temu, MrWinex66 napisał:

Niestety, dalej to samo. Pomyslalem o dodaniu "execute console command "/skript reload <nazwa>", bo po reloadzie skrypt wraca "do działania", ale niestety -  magicznie ta komenda naprawi działanie tylko, jeśli zostanie wpisana przez gracza, a nie z konsoli :kappalul:

W takim wypadku wypróbuj jeszcze metody Axee'a, tylko nie zapomnij poprawić u niego błędu w linijce nr 4, mianowicie mam na myśli 'loop-playe'. Mimo wszystko myślę, że jego metoda zadziała, gdyż za każdym razem sprawdza ilość graczy.

Edytowane przez Kormic
Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258690
Udostępnij na innych stronach

  • 0
10 godzin temu, xAxee napisał:

on bed enter:
	set {_online} to number of all players
	loop all players:
		if loop-playe is sleeping:
			add 1 to {_sleeping}
	set {_proc} to ({_sleeping}/{_online})*100
	send "&7Gracz &6%player% &7polozyl sie spac &8(&6%{_proc}%%%&7/&650%%&8)"
	if {_proc} >= 50:
		set time in world to 06:00

 

Tutaj w sumie działa zmiana dnia, ale wciąż - po wyjściu gracza jakoś dziwnie zmieniają się te procenty, przy 3 graczach jest 33,3%, później 66,7%, ale przy czterech dwa razy powtarza się 50% :F Magia

Edytowane przez MrWinex66
Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258691
Udostępnij na innych stronach

  • 0
3 minuty temu, MrWinex66 napisał:

Tutaj w sumie działa zmiana dnia, ale wciąż - po wyjściu gracza jakoś dziwnie zmieniają się te procenty :

Masz na myśli, że są z przecinkiem? Zawsze możesz dać zamiast:

send "&7Gracz &6%player% &7polozyl sie spac &8(&6%{_proc}%%%&7/&650%%&8)"

to:

send "&7Gracz &6%player% &7polozyl sie spac &8(&6%round({_proc})%%%&7/&650%%&8)"

 

Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258692
Udostępnij na innych stronach

  • 0
3 minuty temu, Kormic napisał:

Masz na myśli, że są z przecinkiem? Zawsze możesz dać zamiast:


send "&7Gracz &6%player% &7polozyl sie spac &8(&6%{_proc}%%%&7/&650%%&8)"

to:


send "&7Gracz &6%player% &7polozyl sie spac &8(&6%round({_proc})%%%&7/&650%%&8)"

 

Nie nie, o takie szczegóły bym się nie czepiał :D Chodzi mi o to że powtarza się sytuacja co wcześniej - przy jakiejś liczbie graczy skrypt działa normalnie, ale gdy ktoś wyjdzie z serwera nagle się okazuje, że 2 na 4 graczy to nie jest 50% :F

Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258694
Udostępnij na innych stronach

  • 0
4 minuty temu, MrWinex66 napisał:

Nie nie, o takie szczegóły bym się nie czepiał :D Chodzi mi o to że powtarza się sytuacja co wcześniej - przy jakiejś liczbie graczy skrypt działa normalnie, ale gdy ktoś wyjdzie z serwera nagle się okazuje, że 2 na 4 graczy to nie jest 50% :F

:thinkfish: Szczerze nie jestem sobie w stanie wyobrazić tej sytuacji. Gdybyś przesłał jakieś krótkie nagranie, nawet kilka screenów to byłoby o wiele łatwiej.

Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258696
Udostępnij na innych stronach

  • 0
24 minuty temu, MrWinex66 napisał:

Nie nie, o takie szczegóły bym się nie czepiał :D Chodzi mi o to że powtarza się sytuacja co wcześniej - przy jakiejś liczbie graczy skrypt działa normalnie, ale gdy ktoś wyjdzie z serwera nagle się okazuje, że 2 na 4 graczy to nie jest 50% :F

Jestes pewien zemowisz o tym skrypcie Ode mnie? :thonk: wszystko powinno byc dobrze

Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258699
Udostępnij na innych stronach

  • 0
Teraz, xAxee napisał:

Jestes pewien zemowisz o tym skrypcie Ode mnie? :thonk: wszystko powinno byc dobrze

Również się zastanawiam w czym leży problem. Przeglądałem linijka po linijce i nic, toteż poprosiłem o choćby kilka screenów.

Odnośnik do komentarza
https://skript.pl/temat/41335-zaokr%C4%85glanie-liczb/#findComment-258701
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ę...