Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

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

[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


  • Zamknięty Temat jest zamknięty
11 odpowiedzi w tym temacie

#1 Petpat

    Wszechwidzący

  • Użytkownik

Reputacja: 64
Pomocny

  • Postów:245
  • Imię:Łukasz
  • Lokalizacja:Rzeszów
Offline

Napisano 29.10.2014 22:44

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 ;)
  • +
  • -
  • 0

#2 grankee

    Godlike

  • Support Team

Reputacja: 507
Wszechwiedzący

  • Postów:1500
  • Lokalizacja:Radom
Offline

Napisano 30.10.2014 03:41

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.


  • +
  • -
  • 0

#3 Petpat

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 64
Pomocny

  • Postów:245
  • Imię:Łukasz
  • Lokalizacja:Rzeszów
Offline

Napisano 30.10.2014 14:52

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 :)
  • +
  • -
  • 0

#4 grankee

    Godlike

  • Support Team

Reputacja: 507
Wszechwiedzący

  • Postów:1500
  • Lokalizacja:Radom
Offline

Napisano 31.10.2014 02:14

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.


  • +
  • -
  • 0

#5 Petpat

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 64
Pomocny

  • Postów:245
  • Imię:Łukasz
  • Lokalizacja:Rzeszów
Offline

Napisano 31.10.2014 17:08

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

#6 grankee

    Godlike

  • Support Team

Reputacja: 507
Wszechwiedzący

  • Postów:1500
  • Lokalizacja:Radom
Offline

Napisano 03.11.2014 01:52

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


  • +
  • -
  • 0

#7 Petpat

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 64
Pomocny

  • Postów:245
  • Imię:Łukasz
  • Lokalizacja:Rzeszów
Offline

Napisano 03.11.2014 17:59

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 :)
  • +
  • -
  • 0

#8 grankee

    Godlike

  • Support Team

Reputacja: 507
Wszechwiedzący

  • Postów:1500
  • Lokalizacja:Radom
Offline

Napisano 04.11.2014 03:58

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

  • +
  • -
  • 0

#9 Petpat

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 64
Pomocny

  • Postów:245
  • Imię:Łukasz
  • Lokalizacja:Rzeszów
Offline

Napisano 04.11.2014 14:03

#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ć .. ;(
  • +
  • -
  • 0

#10 grankee

    Godlike

  • Support Team

Reputacja: 507
Wszechwiedzący

  • Postów:1500
  • Lokalizacja:Radom
Offline

Napisano 04.11.2014 15:45

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...


  • +
  • -
  • 0

#11 Petpat

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 64
Pomocny

  • Postów:245
  • Imię:Łukasz
  • Lokalizacja:Rzeszów
Offline

Napisano 04.11.2014 18:35

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 ? :)
  • +
  • -
  • 0

#12 grankee

    Godlike

  • Support Team

Reputacja: 507
Wszechwiedzący

  • Postów:1500
  • Lokalizacja:Radom
Offline

Napisano 05.11.2014 05:02   Najlepsza odpowiedź

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);
}

  • +
  • -
  • 1




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

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