←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

dhud znika po jakimś czasie gdy wyswietlam...


Najlepsza odpowiedź _McHappy 09.04.2018 22:48

Logika działania wiadomości typu DHUD wygląda następująco:

strncpy( m_HUDMessageText[m_lastHudMessage], READ_STRING(), 128 );
m_HUDMessageText[m_lastHudMessage][127]=0;	// text

msg->pMessage = m_HUDMessageText[m_lastHudMessage];
msg->pName	  = "HUD_MESSAGE";

gHUD.m_Message.MessageAdd( msg );

m_lastHudMessage++;
m_lastHudMessage %= MAX_SPEC_HUD_MESSAGES;

Gdzie MAX_SPEC_HUD_MESSAGES = 8

 

Wysyłając kolejne wiadomości DHUD, można zaobserwować zjawisko rotacji przy zapisywaniu nowego tekstu wiadomości do tablicy-pola klasy.

Innymi słowy: wysyłając wiadomość o czasie przetrzymania 15s, jej tekst zapisuje się <powiedzmy> w m_HUDMessageText[0]. Kolejne wiadomości (z czasem przetrzymania równym 1s) zapisują się w kolejnych polach tablicy - 1, 2, 3 ... aż do 7. Jako że cały algorytm jest zapętlony, a maks. ilość wiadomości wynosi 8, zmienna wskazująca na kolejne pole tablicy jest zerowana, przez co następna w kolejności wiadomość nadpisze tą początkową - z czasem przetrzymania równym 15s.

Przejdź do postu

  • +
  • -
Rivit - zdjęcie Rivit 08.04.2018

Witam. Mam taki problem. Wyświetlam sobie dhud trwający 15s. Wszystko okej. Ale jak podczas tego wyświetlania będę wyświetlał jeszcze jeden dhud, który odświeża sie co 1s i trwa 1s, to po chwili tamten znika (tak po około 6-10s). Czym to moze byc spowodowane?

 

Kod pluginu:

Spoiler
Odpowiedz

  • +
  • -
FireMachine - zdjęcie FireMachine 08.04.2018

Z tego co widzę jeden i drugi dhud może na siebie nachodzić. Sam w sobie ma ograniczenia do 8 wyświetlonych wiadomości naraz.

Wiadomości zapewne blokują wyświetlanie ale są dalej w tle.

Przy jednosekundowych ustaw działanie  - Float:fxtime na długość wyświetlania -  tak samo zrób też z dłuższą wiadomością.

Odpowiedz

  • +
  • -
Najlepsza odpowiedź _McHappy - zdjęcie _McHappy 09.04.2018

Logika działania wiadomości typu DHUD wygląda następująco:

strncpy( m_HUDMessageText[m_lastHudMessage], READ_STRING(), 128 );
m_HUDMessageText[m_lastHudMessage][127]=0;	// text

msg->pMessage = m_HUDMessageText[m_lastHudMessage];
msg->pName	  = "HUD_MESSAGE";

gHUD.m_Message.MessageAdd( msg );

m_lastHudMessage++;
m_lastHudMessage %= MAX_SPEC_HUD_MESSAGES;

Gdzie MAX_SPEC_HUD_MESSAGES = 8

 

Wysyłając kolejne wiadomości DHUD, można zaobserwować zjawisko rotacji przy zapisywaniu nowego tekstu wiadomości do tablicy-pola klasy.

Innymi słowy: wysyłając wiadomość o czasie przetrzymania 15s, jej tekst zapisuje się <powiedzmy> w m_HUDMessageText[0]. Kolejne wiadomości (z czasem przetrzymania równym 1s) zapisują się w kolejnych polach tablicy - 1, 2, 3 ... aż do 7. Jako że cały algorytm jest zapętlony, a maks. ilość wiadomości wynosi 8, zmienna wskazująca na kolejne pole tablicy jest zerowana, przez co następna w kolejności wiadomość nadpisze tą początkową - z czasem przetrzymania równym 15s.


Użytkownik _McHappy edytował ten post 09.04.2018 22:50
Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 10.04.2018

Tak teraz patrze na ten kod, to trzeba bedzie to obejść jakoś

Odpowiedz

  • +
  • -
_McHappy - zdjęcie _McHappy 10.04.2018

Zawsze można dołączyć wiadomość o czasie przetrzymania 15s do pętli (skracając owy czas do czasu zapętlenia).

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 10.04.2018

Chodzi Ci o to żeby jedną wiadomość wyświetlić 5 razy ale co 3s?
Odpowiedz

  • +
  • -
_McHappy - zdjęcie _McHappy 10.04.2018

Raczej, żeby to:

        //duration 15s
	set_dhudmessage(255, 255, 255, -1.0, 0.78, 0, 6.0, 1.0, 1.0, 0.1, false) // zamiana 15s->1s
	show_dhudmessage(0, "dluga message")

umieścić tu:

public msg()
{
	for(new id = 1; id <= g_MaxPlayers; id++)
	{	
		if(is_user_connected(id))
		{
			//duration 1s
			set_dhudmessage(0, 255, 0, 0.02, 0.78, 0, 6.0, 1.0, 0.1, 0.1, false)
			show_dhudmessage(0, "%0.0f", get_gametime())
		}
	}
}

~>

public msg()
{
	for(new id = 1; id <= g_MaxPlayers; id++)
	{	
		if(is_user_connected(id))
		{
			//duration 1s
			set_dhudmessage(0, 255, 0, 0.02, 0.78, 0, 6.0, 1.0, 0.1, 0.1, false)
			show_dhudmessage(0, "%0.0f", get_gametime())

                        //duration 15s->1s
                        set_dhudmessage(255, 255, 255, -1.0, 0.78, 0, 6.0, 1.0, 1.0, 0.1, false) // zamiana 15s->1s
                        show_dhudmessage(0, "dluga message")
		}
	}
}

Nie jest to optymalne rozwiązanie, ale tylko tym sposobem możesz mieć pewność, że oba DHUD'y pozostaną na ekranie niezakryte.

To tylko podpowiedź, pokombinuj trochę, a dojdziesz do rozwiązania problemu ;)

Odpowiedz

  • +
  • -
Rivit - zdjęcie Rivit 11.04.2018

No już wiem jak to. Mam dwa osobne pluginy także będę musiał zrobić refreshing. Dzięki
Odpowiedz