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 przerzucaniem gracza


Najlepsza odpowiedź Petpat, 28.10.2014 13:22

grankee, to już wiem :)

Cóż tyle dni, aż w końcu udało mi się samemu dojść gdzie był błąd :) Zrobiłem takie coś

public GanianyRunda(){
	new WylosowanyGracz = LosowyGracz();
	if(WylosowanyGracz < 1) return;
	new NazwaGracza[32];
	get_user_name(WylosowanyGracz, NazwaGracza, charsmax(NazwaGracza));
	ColorChat(0, RED, "^x03[4FUN(GANIANY)]^x04 %s teraz Was goni, uciekajcie!!", NazwaGracza);
	cs_set_user_team (WylosowanyGracz, cs_get_user_team(WylosowanyGracz) == CS_TEAM_T?CS_TEAM_CT:CS_TEAM_CT, CS_CT_GSG9);
	if(druzyna(1) == WylosowanyGracz){
		ExecuteHamB(Ham_CS_RoundRespawn, WylosowanyGracz)
	}
}
Chodzi bez zarzutu, dzięki za zaangażowanie Przejdź do postu


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

#1 Petpat

    Wszechwidzący

  • Użytkownik

Reputacja: 64
Pomocny

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

Napisano 21.10.2014 14:48

Tutaj są 2 stocki
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;
}

stock druzyna(team){

	new maxPlayers=get_maxplayers(), aliveplayers;
	for(new i=1; i<=maxPlayers; ++i){
		if(is_user_alive(i) && (!team || get_user_team(i)==team)){
			++aliveplayers;
		}
	}
	return aliveplayers;
}
Teraz tak zrobiłem sprawdzanie jeśli jest jeden gracz w CT to nie przerzuca go do TT, jeśli natomiast jest więcej graczy to go przerzuca, teraz jest tak, nie działa to jak należy, otóż co jakiś czas dochodzi 2 osoba, i zostaje nie przerzuca ją do TT, jak zrobic aby wylosowana osoba była w CT ?
public sprawdz(){
	new WylosowanyGracz = LosowyGracz();
	if(WylosowanyGracz < 0) return;
	client_print(0, print_chat, "CT teraz liczy :%i graczy a TT liczy %i graczy", druzyna(2), druzyna(1));
	if(druzyna(2) == 1){
	}
	if(druzyna(2) > 1){
		cs_set_user_team (druzyna(2), cs_get_user_team(druzyna(2)) == CS_TEAM_CT?CS_TEAM_T:CS_TEAM_T, CS_T_ARCTIC)
	}
}
Tutaj co rundę przerzuca jedna losową osobę do CT
public NowaRundaPrzerzuc(){
	new WylosowanyGracz = LosowyGracz();
	if(WylosowanyGracz < 0) return;
	new NazwaGracza[32];
	get_user_name(WylosowanyGracz, NazwaGracza, charsmax(NazwaGracza));
	ColorChat(0, RED, "%s", NazwaGracza);
	cs_set_user_team (WylosowanyGracz, cs_get_user_team(WylosowanyGracz) == CS_TEAM_T?CS_TEAM_CT:CS_TEAM_CT, CS_CT_URBAN)
}

  • +
  • -
  • 0

#2 Wielkie Jol

    REPREZENTUJE SIEBIE I CAŁĄ GALAKTYKĘ

  • Support Team

Reputacja: 683
Wszechmogący

  • Postów:1 258
  • GG:
  • Lokalizacja:AMXX
Offline

Napisano 21.10.2014 14:51

Wykorzystaj event by sprawdzić, czy ktoś dołączył do CT.

 register_event("TeamInfo","team_assign","a")

  • +
  • -
  • 1

"Żaden etyczny inżynier oprogramowania nie zgodzi się napisać procedury zniszczBagdad. Jego poczucie etyki domaga się, aby napisał procedurę zniszczMiasto, a Bagdad przekazał jako parametr" - Nathaniel Borenstein.


#3 Petpat

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 64
Pomocny

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

Napisano 21.10.2014 17:46

To teraz tak, użyłem tego eventu działa naprawdę świetnie, ale jest jeden -(minus) otóż, gdy wchodzę na serwer wyświetla się ,że ma być ktoś inny a jest osoba ta która weszła pierwsza na serwer, od kolejnej rundy kolejka działa jak należy. Jakieś propozycje ? smile.png)
 
public team_sprawdz(){        
	new id = read_data(1);
	new WylosowanyGracz = LosowyGracz();
	if(WylosowanyGracz < 0) return PLUGIN_CONTINUE;

	if(cs_get_user_team(id) == CS_TEAM_CT){
		if(druzyna(2) == 1 && WylosowanyGracz){}
		if(druzyna(2) > 1){
			cs_set_user_team(id, CS_TEAM_T);
		}
		return PLUGIN_CONTINUE
	}
	return PLUGIN_CONTINUE
}

Użytkownik Petpat edytował ten post 21.10.2014 17:49

  • +
  • -
  • 0

#4 Wielkie Jol

    REPREZENTUJE SIEBIE I CAŁĄ GALAKTYKĘ

  • Support Team

Reputacja: 683
Wszechmogący

  • Postów:1 258
  • GG:
  • Lokalizacja:AMXX
Offline

Napisano 21.10.2014 17:57

Nie do końca zrozumiałem to, o czym mówisz, ale może wystarczy zresetować rundę, gdy ktoś dołączy?


  • +
  • -
  • 1

"Żaden etyczny inżynier oprogramowania nie zgodzi się napisać procedury zniszczBagdad. Jego poczucie etyki domaga się, aby napisał procedurę zniszczMiasto, a Bagdad przekazał jako parametr" - Nathaniel Borenstein.


#5 Petpat

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 64
Pomocny

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

Napisano 21.10.2014 17:59

Hmmm, jak tego dokonać ? Bo fakt raczej to wystarczy :))
  • +
  • -
  • 0

#6 Petpat

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 64
Pomocny

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

Napisano 21.10.2014 18:39

Dobra, zrobiłem :)
	for(new i = 2; i <= g_maxplayers; i++){
		if(!restart[i]){
			server_cmd("sv_restart 1");
			restart[i] = true;
		}
	}

  • +
  • -
  • 0

#7 Petpat

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 64
Pomocny

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

Napisano 21.10.2014 20:33

if(druzyna(2) == 1){ Coś chyba z tym jest nie tak, bo gdy wszystkich zabiłem, to wtedy jest tak samo, jak wejdzie pierwsza osoba na serwer to zostaje w tym teamie, jeśli natomiast ktoś z przeciwnej drużyny mnie zabije, to wtedy kolejka idzie prawidłowo, co jest błędem ?
  • +
  • -
  • 0

#8 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 22.10.2014 01:23

g_maxplayers

to jakaś zmienna/stała czy pobierana aktualna liczba graczy? jeśli pierwsze to jaką ma wartość?


  • +
  • -
  • 1

#9 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 22.10.2014 06:23

A po co Ci warunki z "druzyna(2) == 1" skoro w środku tych warunków nic nie wykonujesz?
  • +
  • -
  • 1

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#10 Petpat

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 64
Pomocny

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

Napisano 22.10.2014 13:49

grankee, g_maxplayers = get_maxplayers();
sebul, fakt to jest nie potrzebne smile.png Ale i tak nie przerzuca.. wchodzisz pierwszy na serwer, gdy rozpoczyna się runda piszę ,że ma byc ktoś inny a jest ta osoba która weszła pierwsza, gdy osoba zostanie zabita z CT to wtedy kolejka działa prawidłowo

Użytkownik Petpat edytował ten post 22.10.2014 13:50

  • +
  • -
  • 0

#11 Petpat

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 64
Pomocny

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

Napisano 22.10.2014 17:33

@UP nie mogę edytować posta, dla tego chciałbym się dowiedzieć, jak zrobić aby żywy gracz został przeniesiony do innej drużyny, bez jego zabijania.
  • +
  • -
  • 0

#12 Petpat

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 64
Pomocny

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

Napisano 24.10.2014 21:58

Zrobiłem coś takiego
public NowaRundaPrzerzuc(){
	new WylosowanyGracz = LosowyGracz();
	if(WylosowanyGracz < 0) return;
	new NazwaGracza[32];
	if(WylosowanyGracz && is_user_connected(WylosowanyGracz)){
		get_user_name(WylosowanyGracz, NazwaGracza, charsmax(NazwaGracza));
		ColorChat(0, RED, "%s", NazwaGracza);
		cs_set_user_team (WylosowanyGracz, cs_get_user_team(WylosowanyGracz) == CS_TEAM_T?CS_TEAM_CT:CS_TEAM_CT, CS_CT_GSG9)
		spawn(WylosowanyGracz)
	}
}
Otóż gdy wywołuje spawn(WylosowanyGracz), to przenosi wszystkich a nie jedną osobę, co tu zrobić ? Proszę o pomoc, gdyż jest mi ona bardzo potrzebna

Użytkownik Petpat edytował ten post 24.10.2014 22:00

  • +
  • -
  • 0

#13 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 24.10.2014 22:37

Jak wygląda funkcja "spawn"?
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#14 Petpat

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 64
Pomocny

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

Napisano 24.10.2014 22:43

sebul, ja używam funkcji spawn ta która jest w dokumentacji http://amxx.pl/dokumentacja/f978/spawn
  • +
  • -
  • 0

#15 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 24.10.2014 23:04

Do spawnu lepiej używaj "kanapki", czyli
ExecuteHamB(Ham_CS_RoundRespawn, WylosowanyGracz)
bo tamta funkcja jest niedopracowana.
  • +
  • -
  • 1

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#16 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 25.10.2014 03:40

random(j)

a co jeśli wylosuje 0?

Użyj 

stock LosowyGracz(){
    new i, j, graczeTT[g_maxplayers];
    for(i=1; i<=g_maxplayers; ++i) {
        if(is_user_connected(i) && get_user_team(i) == 1) {
            graczeTT[j++] = i;
        }
    }
    if(j > 0) return graczeTT[random(1,j)];
    return 0;
}

  • +
  • -
  • 0

#17 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 25.10.2014 08:39

random(j)
a co jeśli wylosuje 0?
Użyj 
stock LosowyGracz(){
    new i, j, graczeTT[g_maxplayers];
    for(i=1; i<=g_maxplayers; ++i) {
        if(is_user_connected(i) && get_user_team(i) == 1) {
            graczeTT[j++] = i;
        }
    }
    if(j > 0) return graczeTT[random(1,j)];
    return 0;
}

Nie wprowadzaj w błąd, ta funkcja jest ok, jak wylosuje zero, to po prostu zwróciło by id gracza z tablicy "graczeTT" z indeksem 0. Dodatkowo nie ma czegoś takiego jak "random(1,j)".

Jedynie trzeba zmienić warunek
if(WylosowanyGracz < 0) return;
na
if(WylosowanyGracz < 1) return;

  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#18 Petpat

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 64
Pomocny

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

Napisano 25.10.2014 22:16

public GanianyRunda(){
	new WylosowanyGracz = LosowyGracz();
	if(WylosowanyGracz < 0) return;
	new NazwaGracza[32];
	get_user_name(WylosowanyGracz, NazwaGracza, charsmax(NazwaGracza));
	ColorChat(0, RED, "^x03[4FUN(GANIANY)]^x04 %s teraz Was goni, uciekajcie!!", NazwaGracza);
	cs_set_user_team (WylosowanyGracz, cs_get_user_team(WylosowanyGracz) == CS_TEAM_T?CS_TEAM_CT:CS_TEAM_CT, CS_CT_GSG9);
	ExecuteHamB(Ham_CS_RoundRespawn, WylosowanyGracz)
}
Zrobiłem tak, teraz dzieje się dokładnie tak samo, przenosi wszystkich zamiast jednej osoby. Gdy nie bylo funkcji "ExecuteHamB(Ham_CS_RoundRespawn, WylosowanyGracz)" czy też "spawn(WylosowanyGracz)" Wszystko działało ale nie tak jak mi chodzi, co zrobić aby respawn był na jedną osobę co rudnę, oczywiscie ta wylosowana ..

Użytkownik Petpat edytował ten post 25.10.2014 22:16

  • +
  • -
  • 0

#19 grankee

    Godlike

  • Support Team

Reputacja: 517
Wszechwiedzący

  • Postów:1 500
  • Lokalizacja:Radom
Offline

Napisano 27.10.2014 02:34

miało być

 random_num(1,j)

ale faktycznie, porąbało mi się, sorka

 

 

Napisz proszę krok po kroku najlepiej w punktach co się dzieje, a niżej co chcesz żeby się działo. Nie jestem do końca pewny o co Ci chodzi.

 

 

Jestem teraz zmęczony, ale wydaje mi się, że tu jest błąd bo:

za każdym razem kiedy znajdzie gracza w terro

graczeTT[j++] = i;

więc zakładamy sytuację, że w terro jest 2 graczy, funkcja znajduje pierwszego, teraz j=1, znajduje drugiego, teraz j=2, następnie losuje

graczeTT[random(1,j)];

zakładamy, że wylosowało liczbę 2, a więc odwołuje się do elementu tablicy graczeTT[2], który jest pusty, ponieważ id dwóch graczy zostało zapisane w elementach graczeTT[0] oraz graczeTT[1]. 

 

No, ale jeśli znowu wprowadzam w błąd to z góry przepraszam :P


Użytkownik grankee edytował ten post 27.10.2014 02:52

  • +
  • -
  • 0

#20 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 27.10.2014 07:17

random(j)
To losuje wartości z przedziału od 0 do j-1, więc to co napisałeś, nigdy się nie zdarzy, bo mając dwóch graczy, random wylosuje 0 lub 1.
A to
random_num(1,j)
będzie losować z przedziału od 1 do j, nigdy nie wylosuje 0, więc pierwszy gracz z tablicy nigdy nie będzie wylosowany.
Tak jak już pisałem, trzeba tylko zamienić warunek
if(WylosowanyGracz < 0) return;
na
if(WylosowanyGracz < 1) return;
bo o ile obydwa są poprawne, bo funkcja losująca nigdy nie zwróci 0 (tam jest -1 na końcu), to jednak id graczy zaczyna się od 1, więc lepiej/czytelniej będzie dać ten drugi warunek.

Kiedy wykonuje się funkcja "GanianyRunda"?
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo





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

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