←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

[ROZWIĄZANE] Losowanie gracza


Najlepsza odpowiedź grankee 05.11.2014 05:02

i nie można tak było 15 postów wyżej?

new obecny_wylosowany=-1
#define TASK3_ID 666
set_task(1.0, "sprawdz", TASK3_ID, _, _, "b");//nie wiem gdzie to dałeś, ale jeśli działa to daj to tam


stock LosowyGracz(){
	new i, j, graczeTT[32];
	for(i=1; i<=g_maxplayers; ++i) {
		if(is_user_connected(i) && get_user_team(i) == 1) {
			graczeTT[j++] = i;
		}
	}
	if(j == 1) return graczeTT[0];
	if(j > 0) return graczeTT[random(j)];
	return -1;
}
jakas_funkcja_w_ktorej_losujesz
{
	obecny_wylosowany=LosowyGracz()
	//dalej w tej funkcji używasz tylko zmiennej obecny_wylosowany, nie wolno Ci znowu powtórzyć funkcji LosowyGracz()!
}
public sprawdz()
{
	if(obecny_wylosowany == -1)
	{
		client_print(0, print_chat, "Brak wylosowanego gracza");
 		return;
	}	
	new NazwaGracza[32];

	get_user_name(obecny_wylosowany, NazwaGracza, charsmax(NazwaGracza));
	client_print(0, print_chat, "%s", NazwaGracza);
}
Przejdź do postu
Zablokowany

  • +
  • -
Petpat - zdjęcie Petpat 29.10.2014

Mam taki stock
stock LosowyGracz(){
	new i, j, graczeTT[32];
	for(i=1; i<=g_maxplayers; ++i) {
		if(is_user_connected(i) && get_user_team(i) == 1) {
			graczeTT[j++] = i;
		}
	}
	if(j == 1) return graczeTT[0];
	if(j > 0) return graczeTT[random(j)];
	return -1;
}
Czy istnieje możliwość ,że co zmiana mapy = nowy gracz, otóż stworzyłem sobie settaska który ma mi sprawdzać czy dalej jest ten sam losowy gracz, a niestety jest tak ,ze co jedno sprawdzenie = losowanie innego gracza.

Z góry dzięki za pomoc ;)
Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 30.10.2014

czyli ze raz wylosowany gracz ma nie byc zmieniany do konca mapy/do kiedy nie opusci serwera?

 

jesli tak to wystarczy zapisywac w zmiennej globalnej wylosowanego gracza i uzywac jego id co runda zamiast losowac, a jezeli ów gracz opusci serwer to na funkcji client_disconnect do tej zmiennej zapisywac wartosc -1 aby wiadomo bylo, ze tym razem trzeba wylosowac nowego.

Odpowiedz

  • +
  • -
Petpat - zdjęcie Petpat 30.10.2014

Mi chodzi o to aby gracz zmieniał się co rundę, ale nie cały czas, bo chce sprawdzać w set_tasku, inna funkcja mnie nie interesuje :) Proszę o pomoc :)
Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 31.10.2014

No to jak wywołujesz funkcję ponownie to losuje ponownie-tak to ma działać. Jeśli chcesz tylko sprawdzać id wylosowanego gracza to musisz je sobie zapisać do jakiejś zmiennej globalnej. Jeśli chodzi o coś innego to albo opiszesz to dokładnie jak chcesz żeby to działało albo raczej pomocy nie otrzymasz, bo nikt nie będzie się domyślał o co Ci chodzi.

Odpowiedz

  • +
  • -
Petpat - zdjęcie Petpat 31.10.2014

grankee, dokładnie o to co Ty napisałeś, możesz mi to pokazać ? W sensie ,że w kodzie ?: )
Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 03.11.2014

new obecny_wylosowany

robisz taką zmienną globalną i podczas wywołania funkcji LosowyGracz() dajesz

obecny_wylosowany=LosowyGracz()

i dalej gdzie potrzebujesz tego id czytasz ze zmiennej globalnej obecny_wylosowany

Odpowiedz

  • +
  • -
Petpat - zdjęcie Petpat 03.11.2014

No ale dalej mimo wszystko nie sprawdzę tego w set_tasku, cały czas się zmienia osoba, jakieś inne pomysły ? :) Bo chce aby nowa osoba się losowała dopiero gdy rozpoczyna się nowa runda :)
Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 04.11.2014

Sprawdzisz to wszędzie w każdym miejscu w pluginie, bo jest to zmienna globalna, która jest widoczna wszędzie (o ile nie jest przykryta zmienną o tej samej nazwie wewnątrz klamerek, ale pewnie nie jest tak w Twoim przypadku więc nie mieszaj sobie).

Jeśli w tasku nie wywołujesz ponownie tej funkcji a jedynie porównujesz/sprawdzasz zmienną globalną obecny_wylosowany to nie ma możliwości żeby gracz się losował ponownie.

Generalnie topic się ciągnie już parę chwil, parę postów tu padło, a nadal nie ma całości kodu potrzebnej do oceny co jest źle. Daj kod, opisz jak działa a jak powinien, ale tak dokładnie i z ładem i składem i będziemy dalej działać.


Użytkownik grankee edytował ten post 04.11.2014 04:00
Odpowiedz

  • +
  • -
Petpat - zdjęcie Petpat 04.11.2014

#define TASK3_ID 666
set_task(1.0, "sprawdz", TASK3_ID, _, _, "b");
Coś w tym stylu, co jedna sekunda następuje zmiana gracza.

public sprawdz(){
	new obecny_wylosowany = LosowyGracz();
	if(obecny_wylosowany < 1) return;
	new NazwaGracza[32];

	get_user_name(obecny_wylosowany, NazwaGracza, charsmax(NazwaGracza));
	client_print(0, print_chat, "%s", NazwaGracza);
}
Próbowałem również dać
new obecny_wylosowany = LosowyGracz();
na początku, ale był błąd "warning 203: symbol is never used: "obecny_wylosowany"" wiadomo ,że trzeba gdzieś to wykorzystać, ale gdy wpisałem
get_user_name(obecny_wylosowany, NazwaGracza, charsmax(NazwaGracza));
tutaj takie coś wtedy był taki błąd "error 008: must be a constant expression; assumed zero", nie wiem co już mam robić .. ;(
Odpowiedz

  • +
  • -
grankee - zdjęcie grankee 04.11.2014

Chłopie

new obecny_wylosowany = LosowyGracz();

w ten sposób wywołujesz funkcję co jeden tast czyli co sekundę. Losować musisz raz w konkretnym przypadku gdzieś w kodzie, nie wiem w czym to robisz czy w evencie nowej rundy czy kiedy, ale na pewno nie w tym tasku. w tasku jedynie sprawdzasz wartosc zmiennej obecny_wylosowany, a 

new obecny_wylosowany

dajesz gdzies nad plugin_init() bo to ma byc zmienna globalna. Jeśli potrzebujesz go losować w tasku, to usisz dac jakis warunek. Opisz dokladnie jak to ma dzialac, ile razy mam prosic...

Odpowiedz

  • +
  • -
Petpat - zdjęcie Petpat 04.11.2014

Działać ma to na takiej zasadzie , cały czas ma pokazywać tego samego wylosowanego gracza, do czasu gdy rozpocznie się nowa runda, wtedy natomiast ma wylosować kolejnego nowego gracza i dalej ma pokazywać przez całą rundę tego wylosowanego itd. Teraz jest bardziej zrozumiale ? :)
Odpowiedz

  • +
  • -
Najlepsza odpowiedź grankee - zdjęcie grankee 05.11.2014

i nie można tak było 15 postów wyżej?

new obecny_wylosowany=-1
#define TASK3_ID 666
set_task(1.0, "sprawdz", TASK3_ID, _, _, "b");//nie wiem gdzie to dałeś, ale jeśli działa to daj to tam


stock LosowyGracz(){
	new i, j, graczeTT[32];
	for(i=1; i<=g_maxplayers; ++i) {
		if(is_user_connected(i) && get_user_team(i) == 1) {
			graczeTT[j++] = i;
		}
	}
	if(j == 1) return graczeTT[0];
	if(j > 0) return graczeTT[random(j)];
	return -1;
}
jakas_funkcja_w_ktorej_losujesz
{
	obecny_wylosowany=LosowyGracz()
	//dalej w tej funkcji używasz tylko zmiennej obecny_wylosowany, nie wolno Ci znowu powtórzyć funkcji LosowyGracz()!
}
public sprawdz()
{
	if(obecny_wylosowany == -1)
	{
		client_print(0, print_chat, "Brak wylosowanego gracza");
 		return;
	}	
	new NazwaGracza[32];

	get_user_name(obecny_wylosowany, NazwaGracza, charsmax(NazwaGracza));
	client_print(0, print_chat, "%s", NazwaGracza);
}
Odpowiedz
Zablokowany