Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Problem z dodaniem 1 opcji do hud`a


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
9 odpowiedzi w tym temacie

#1 NEQU#

    Wszechpomocny

  • Użytkownik

Reputacja: 54
Pomocny

  • Postów:363
  • GG:
Offline

Napisano 28.10.2016 16:22

Witam, wiem jak sprawdzić czy gracz posiada daną funkcję, jednak jak sprawdzić czy kto kolwiek na serwerze ją posiada, a następnie pobrać jego nick?

 

Próbowałem w taki sposób, jednak jedyny efekt jaki udało mi się osiągnąć to - brak huda/nazwa serwera zamiast nicku gracza(w hud)

	new name[32]
	for(new i = 1; i <= 32; i ++)
	{
	if(zp_get_user_first_zombie(i))
	{
	get_user_name(i, name, charsmax(name))
	}
}

Użytkownik NEQU# edytował ten post 28.10.2016 16:24

  • +
  • -
  • 0

#2 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 28.10.2016 17:13

Wychodzi na to, że wszystko w powyższej funkcji zależy od natywu w warunku.
Istnieje bowiem przypadek, że zwróci on 0 dla każdego gracza i zmienna nick pozostaje pusta, co może odnieść skutek przy wypisywaniu jej na ekran.
Zależnie od przeznaczenia, jeżeli ma być wyświetlany hud, gdy żaden grać, nie spełnia warunku (czyt. nie posiada tej 'funkcji') to możesz dodać warunek po pętli:

If(equal(nazwa,"")) nazwa="Brak";

2) Jak się domyślam natyw zwraca 1 tylko dla jednego gracza na mapie, także zaraz za pobraniem jego nazwy wypadałoby wstawić break; (ze względów optymalizacyjnych).

Z tego wycinka nie wynika, dlaczego zmienna wypełnia się nazwą serwera. Pokaż dodatkowo 'otoczkę' Twojego kodu (chodzi szczególnie o kod do momentu wypisania nazwy gracza na ekran włącznie.
  • +
  • -
  • 0

#3 NEQU#

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 54
Pomocny

  • Postów:363
  • GG:
Offline

Napisano 28.10.2016 17:31

W hud ma byc wyswietlany gracz, ktory jest 1 zombie w daneh rundzie(i to tez sprawdza natyw) sprawdzalem tez co sie stanie, jezeli uzyje natywu na graczu ktoremu wyswietla sie hud, jezeli odpowiedz to 0 w gudzie nie pojawial sie jego nick(hud dzialal jednk w miejscu nicku pozostawalo puste pole) jezeli zwracalo 1 nick gracza sie wyswietlal. Nazwa serwera wyswietlala sie przy troche innej wersji kodu, wiec to jest raczej nie istotne.
  • +
  • -
  • 0

#4 rzeznik9871

    Wszechwidzący

  • Użytkownik

Reputacja: 80
Zaawansowany

  • Postów:260
Offline

Napisano 28.10.2016 21:13

public zp_user_infected_post(id, infector, nemesis)
{
	new name[32]
	if(zp_get_user_first_zombie(id))
	{
		get_user_name(id,name,31)
		set_hudmessage(255, 0, 0, -1.0, 0.35)
		show_hudmessage(id, "!!! Warning !!!^n %s is first zombie",name)
	}
}

coś w ten desen nie znam sie na zp


Użytkownik rzeznik9871 edytował ten post 28.10.2016 21:25

  • +
  • -
  • 0

Cześć


#5 _McHappy

    Wszechwiedzący

  • Support Team

Reputacja: 243
Wszechwidzący

  • Postów:501
  • GG:
  • Imię:Radek
  • Lokalizacja:Tak
Offline

Napisano 28.10.2016 22:25

W hud ma byc wyswietlany gracz, ktory jest 1 zombie w daneh rundzie(i to tez sprawdza natyw) sprawdzalem tez co sie stanie, jezeli uzyje natywu na graczu ktoremu wyswietla sie hud, jezeli odpowiedz to 0 w gudzie nie pojawial sie jego nick(hud dzialal jednk w miejscu nicku pozostawalo puste pole) jezeli zwracalo 1 nick gracza sie wyswietlal. Nazwa serwera wyswietlala sie przy troche innej wersji kodu, wiec to jest raczej nie istotne.

W takim razie pozostaje ten kod:

new name[32]
for(new i = 1; i <= 32; i ++)
{
if(zp_get_user_first_zombie(i))
{
get_user_name(i, name, charsmax(name))
}
}

Wykonać jakiś czas po starcie rundy (lub zwyczajnie po momencie wylosowania owego pierwszego zombiaka rundy) i wyświetlić pobrany nick (skoro Ci wyświetla nick gracza, który spełnia warunek, to znaczy, że nick został pobrany prawidłowo) wszystkim graczom. Zrobisz to podając jako pierwszy parametr funkcji show_hudmessage() 0, czyli show_hudmessage(0, "Pierwszym zombiakiem zostal: %s", name).
Analogicznie, gdy używasz SyncHudMessage.

Użytkownik _McHappy edytował ten post 28.10.2016 22:27

  • +
  • -
  • 0

#6 NEQU#

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 54
Pomocny

  • Postów:363
  • GG:
Offline

Napisano 29.10.2016 11:51

 

W hud ma byc wyswietlany gracz, ktory jest 1 zombie w daneh rundzie(i to tez sprawdza natyw) sprawdzalem tez co sie stanie, jezeli uzyje natywu na graczu ktoremu wyswietla sie hud, jezeli odpowiedz to 0 w gudzie nie pojawial sie jego nick(hud dzialal jednk w miejscu nicku pozostawalo puste pole) jezeli zwracalo 1 nick gracza sie wyswietlal. Nazwa serwera wyswietlala sie przy troche innej wersji kodu, wiec to jest raczej nie istotne.

W takim razie pozostaje ten kod:

new name[32]
for(new i = 1; i <= 32; i ++)
{
if(zp_get_user_first_zombie(i))
{
get_user_name(i, name, charsmax(name))
}
}

Wykonać jakiś czas po starcie rundy (lub zwyczajnie po momencie wylosowania owego pierwszego zombiaka rundy) i wyświetlić pobrany nick (skoro Ci wyświetla nick gracza, który spełnia warunek, to znaczy, że nick został pobrany prawidłowo) wszystkim graczom. Zrobisz to podając jako pierwszy parametr funkcji show_hudmessage() 0, czyli show_hudmessage(0, "Pierwszym zombiakiem zostal: %s", name).
Analogicznie, gdy używasz SyncHudMessage.

 

źle to trochę napisałem z telefonu, przy tym kodzie nie wyświetla się nic(hud całkowicie znika) przy wersji z id(zamiast i) pokazuje nick gracza któremu wyświetla się hud, jeżeli jest on 1 zombie, jeżeli nie - pole z miejscem w którym powinien się ten nick pokazać, jest puste.

 

Co do wyświetlania informacji, są raczej sprawdzane na bieżąco ponieważ informacja ma się pokazywać w zwykłym hudzie od exp moda.

 

	new name[32]
	for(new i = 1; i <= 32; i ++)
	{
	if(zp_get_user_first_zombie(i))
	{
	get_user_name(i, name, charsmax(name))
	}
}

	set_hudmessage(255, 0, 0, 0.02, 0.22, 0, 0.0, 1.1, 0.0, 0.0, 1);
	ShowSyncHudMsg(id, g_msgHudSync1 , "%L", LANG_SERVER, "LEVEL_HUD_TEXT", PlayerLevel[id], PlayerXp[id], LEVELS[PlayerLevel[id]], RANK[PlayerLevel[id]], RANKLEVELS[PlayerLevel[id]], class_name, zp_ammopacks_get(id), get_user_health(id), name)
	return PLUGIN_CONTINUE;
}


zakładam, że sam kod jest w porządku, dziwi mnie jednak fakt że przy sprawdzaniu wszystkich graczy pole nie zostaje puste, tak jak w przypadku sprawdzania każdego gracza który widzi hud z osobna.

 


Użytkownik NEQU# edytował ten post 29.10.2016 11:53

  • +
  • -
  • 0

#7 Sniper Elite

    Master

  • Power User

Reputacja: 176
Profesjonalista

  • Postów:981
  • GG:
  • Imię:Konrad
  • Lokalizacja:Skryptolandia
Offline

Napisano 30.10.2016 13:51

Dawno z tego nie korzystałem, ale najlepiej jest podłączyć się pod forward.

new name[32];
public zp_round_started(gamemode, id) {
  for(new i = 1; i <= 32; i ++)
  {
    if(zp_get_user_first_zombie(i)){
      get_user_name(i, name, charsmax(name));
      break;
    }
  } 
}
 

Zapisujesz nick gracza do zmiennej globalnej, po zakończeniu rundy ją resetujesz.

Sama pętla wygląda ok, możesz tylko dodać break po znalezieniu matki.

 

Moim zdaniem bez sensu szukać gracza co sekundę dla 32 graczy 32 razy iterując po każdym graczu (w sumie 1024 iteracje).

O samym forwardzie w dokumentacji:

/**
 * Called when the ZP round starts, i.e. first zombie
 * is chosen or a game mode begins.
 *
 * @param gamemode Mode which has started.
 * @param id Affected player's index (if applicable).
 */
forward zp_round_started(gamemode, id)

 

 

 


  • +
  • -
  • 1

Kontakt:

Steam: CSnajper

GG: 4394855

 

Na steam i GG pomagam wyłącznie odpłatnie.


#8 NEQU#

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 54
Pomocny

  • Postów:363
  • GG:
Offline

Napisano 30.10.2016 16:30

Niby działa, ale wciąż nie do końca.

 

Przy czyszczeniu zapisanego nicku,nie kasuje go całkowicie = czasami w kolejnej rundzie wyświetli się nowy nick, czasami nie(częściej nie)

public zp_round_started(gamemode, id) 
{
  for(new i = 1; i <= 32; i++)
  {
    if(zp_core_is_first_zombie(i) && is_user_connected(i))
{
      get_user_name(i, mname, charsmax(mname));
      break;
    }
  } 
}
public EventRoundEnd()
{
	for (new id=0; id < 33; id++)
	{
		mname[id] = 0
		if(!is_user_connected(id) || !is_user_alive(id)/* || ilosc_graczy < min_licz_graczy*/)
			continue;
		
		set_task(1.0,"czy_wygral_runde",id);
	}

}

Próbowałem też wyczyścić informację na początku rundy, jednak wychodziło na to samo. Przeszukałem trochę dokumentacji i poradników, jednak nigdzie nie znalazłem nic o resetowaniu zmiennej, więc za pewne zrobiłem to źle.


Użytkownik NEQU# edytował ten post 30.10.2016 16:47

  • +
  • -
  • 0

#9 Sniper Elite

    Master

  • Power User

Reputacja: 176
Profesjonalista

  • Postów:981
  • GG:
  • Imię:Konrad
  • Lokalizacja:Skryptolandia
Offline

Napisano 30.10.2016 17:41

Niby działa, ale wciąż nie do końca.

 

Przy czyszczeniu zapisanego nicku,nie kasuje go całkowicie = czasami w kolejnej rundzie wyświetli się nowy nick, czasami nie(częściej nie)

public zp_round_started(gamemode, id) 
{
  for(new i = 1; i <= 32; i++)
  {
    if(zp_core_is_first_zombie(i) && is_user_connected(i))
{
      get_user_name(i, mname, charsmax(mname));
      break;
    }
  } 
}
public EventRoundEnd()
{
	for (new id=0; id < 33; id++)
	{
		mname[id] = 0
		if(!is_user_connected(id) || !is_user_alive(id)/* || ilosc_graczy < min_licz_graczy*/)
			continue;
		
		set_task(1.0,"czy_wygral_runde",id);
	}

}

Próbowałem też wyczyścić informację na początku rundy, jednak wychodziło na to samo. Przeszukałem trochę dokumentacji i poradników, jednak nigdzie nie znalazłem nic o resetowaniu zmiennej, więc za pewne zrobiłem to źle.

Czekaj czekaj, ty chcesz mieć nick matki zombie w jakimś tam hudzie i chcesz pokazywać to wszystkim graczom, tak?

Resetowanie tej zmiennej będzie wyglądało mniej więcej tak:

nmane[0] = 0 lub formatex(name, 0, "");

 

Co do resetowania zmiennej możesz użyć forwardu z zp:

public zp_round_ended(winteam){
  nmane[0] = 0
}

  • +
  • -
  • 1

Kontakt:

Steam: CSnajper

GG: 4394855

 

Na steam i GG pomagam wyłącznie odpłatnie.


#10 NEQU#

    Wszechpomocny

  • Autor tematu
  • Użytkownik

Reputacja: 54
Pomocny

  • Postów:363
  • GG:
Offline

Napisano 30.10.2016 19:12

Dobra, już działa jak powinno.

 

/close


  • +
  • -
  • 0




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych