[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
Petpat
29.10.2014
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
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.
Petpat
30.10.2014
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.
Petpat
31.10.2014
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
Petpat
03.11.2014
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
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ć .. ;(
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...
Petpat
04.11.2014
Najlepsza odpowiedź
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); }