Skocz do zawartości
  • 0

Zaokrąglanie liczb


MrWinex66
Przejdź do rozwiązania Rozwiązane przez xAxee,

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 odpowiedzi
Udostępnij na innych stronach

Rekomendowane odpowiedzi

  • 0
  • Rozwiązanie
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 odpowiedzi
Udostępnij na innych stronach
  • 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 odpowiedzi
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 odpowiedzi
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 odpowiedzi
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 odpowiedzi
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 odpowiedzi
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 odpowiedzi
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 odpowiedzi
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 odpowiedzi
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 odpowiedzi
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 odpowiedzi
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 odpowiedzi
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 odpowiedzi
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 odpowiedzi
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 odpowiedzi
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ę...